Проблема с инвертированием тега WinCC7.5

SCADA-система / Человеко-машинный интерфейс
Ответить
_Zx_
Дилетант
Сообщения: 6
Зарегистрирован: 26 май 2021, 17:19

Проблема с инвертированием тега WinCC7.5

Сообщение _Zx_ »

Здравствуйте. В инвертировании тега по кнопке любым простейшим скриптом (ввиду отсутствия элементарного нескриптового варианта) иногда происходит "тройное" переключение тега, то есть 1-0-1, и наоборот. Бит в контроллере при этом инвертируется правильно. Все эталонные варианты скрипта и на С, и на vbs работают одинаково. Тэг нигде более не используется, бит в программе контроллера не меняется. В channel diagnostic вроде ничего необычного, очередь записи в нуле. Все последние патчи стоят. WinCC 7.5, plc318. Проблема на пустом месте, но очень неприятная для технологов. Присутствует на любом включении-выключении механизма по элементу с соотв. скриптом. Базовый вариант скрипта - "SetTagBit(MyTag, !GetTagBit(MyTag))". Буду рад услышать какие-нибудь мысли по этому поводу, спасибо.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Проблема с инвертированием тега WinCC7.5

Сообщение Михайло »

Причина этого явления понятна?
1. Скрипт должен запускаться только по фронту сигнала нажатия кнопки (кнопка не нажата -> кнопка нажата), а не по уровню (кнопка нажата).
2. Либо самоблокироваться таймером: скрипт запустился, бит инвертировал, одновременно запустил таймер самоблокировки на 0.7-1.0 сек. Если таймер активен, то скрипт не выполняет действия.

Первый вариант лучше.

Какое событие кнопки выбрали для запуска скрипта? И какие другие события доступны?

_Zx_
Дилетант
Сообщения: 6
Зарегистрирован: 26 май 2021, 17:19

Re: Проблема с инвертированием тега WinCC7.5

Сообщение _Zx_ »

Михайло писал(а):
27 май 2021, 19:02
Причина этого явления понятна?
1. Скрипт должен запускаться только по фронту сигнала нажатия кнопки (кнопка не нажата -> кнопка нажата), а не по уровню (кнопка нажата).
2. Либо самоблокироваться таймером: скрипт запустился, бит инвертировал, одновременно запустил таймер самоблокировки на 0.7-1.0 сек. Если таймер активен, то скрипт не выполняет действия.

Первый вариант лучше.

Какое событие кнопки выбрали для запуска скрипта? И какие другие события доступны?
Причина этого явления непонятна. Скрипт работает одинаково на всех возможных ивентах всех кнопок. Как вы себе представляете реализацию второго пункта в реалиях винсс? Скрипт запускается один раз на нажатие кнопки и тут же завершается, это видно в диагностике, код простейший. Никаких зависимостей не обнаружено, может изредка проявляться. Причем "моргушка" эта видна и на другом сервере по нажатию на первом, что вообще загадка, ибо контроллер все обрабатывает без проблем. Неясно.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Проблема с инвертированием тега WinCC7.5

Сообщение Михайло »

_Zx_ писал(а):
28 май 2021, 16:54
Причина этого явления непонятна.
Я сам сначала не понял. :)
Теперь понял. Есть такой подводный камень: если вы меняете значение тега в памяти ПЛК, то вы делаете это напрямую в его памяти. Контроллер может считать значение тега, затем вы подменяете значение тега, затем контроллер выполняет какие-то вычисления и снова считывает этот тег, но там уже другое значение, хотя программист ПЛК предполагал, что в пределах скана программы ПЛК этот тег неизменный. Нет, этот тег изменяется в пределах скана программы ПЛК.
Решение: в программе ПЛК записать значение тега во временную переменную типа TEMP и далее оперировать с копией тега, а не с самим тегом, значение которого ненадежно.

Но эта проблема касается не всех тегов подряд, а только тех, где ПЛК в пределах одного скана манипулирует тегом несколько раз. Подумайте и сообразите.

_Zx_
Дилетант
Сообщения: 6
Зарегистрирован: 26 май 2021, 17:19

Re: Проблема с инвертированием тега WinCC7.5

Сообщение _Zx_ »

Эмм... Понял что ничего не понял. Плк отрабатывает все как часы, про какие "ненадежные" биты в памяти плк идет речь я вообще без понятия. Есть цикл, состоящий из чтения входов в область процесса, обработки программы и записи выходов из области процесса. И есть винсс со своим синхронным\асинхронным доступом к вводу-выводу, он же кэш\прямой доступ к AS. Как именно драйвер винсс реализует запись изменённого тега в программу контроллера я нигде инфы не нашел, но очевидно что в рабочем цикле. Запись выполняется один раз, что легко проверяется в программе, в случае синхронной - из кеша винс всей пачкой, или в случае асинхронной - напрямую минуя кеш в программу контроллера. Временная переменная - это переменная из локальной области данных, которая выделяется каждому программному блоку в каждом цикле, и я не понимаю что это даст. Флаг работы-останова механизма, записываемый скадой, читается контроллером в 1 месте программы, обрабатывается корректно и никаких вопросов к нему нет.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Проблема с инвертированием тега WinCC7.5

Сообщение Михайло »

Вы можете показать выдержки из программы ПЛК с "моргающим" битом? Покажите все участки кода, которые считывают и записывают в этот бит. А еще сделайте скриншоты, по которым будет понятно, как WinCC работает с этим битом (события, скрипт). Будем по конкретному примеру объясняться.

_Zx_
Дилетант
Сообщения: 6
Зарегистрирован: 26 май 2021, 17:19

Re: Проблема с инвертированием тега WinCC7.5

Сообщение _Zx_ »

Кросс-референс - на newpdl* не смотрите, они не используются, там просто хлам элементов на будущее, все остальное думаю понятно. 2 точки использования - скрипт нажатия и закраска прямоугольника по триггеру "апон чейндж". Также в гифе и видео зафиксирован сам проблемный момент.
https://drive.google.com/drive/folders/ ... sp=sharing

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Проблема с инвертированием тега WinCC7.5

Сообщение Михайло »

В VBS не силен.

Вот нашел другой подход к изменению тега в скрипте:

Код: Выделить всё

Dim w
w = SmartTags("var1")
w = w + 10
SmartTags("var1") = w
Может не надо каждый раз запускать команду Set Tag...?

Я не знаю, но и вы наверное тоже, как работает последовательность чтения-записи в этих командах скрипта. Но я подобные фокусы ловил при работе ПЛК с панелью оператора. Суть: на обновление данных на удаленном устройстве требуется время, но при этом вы можете успеть прочитать данные даже если сделали это чуть позже, чем изменили тег. И начинаются тут путешествия во времени... Короче ваш код должен быть устойчив к тому, что несмотря на то, что операции записи-чтения заведомо произошли в определенном порядке, то на удаленном устройстве эти операции могут поменяться местами. Это применимо к двум соседним событиям Onclick. У вас два события Onclick и четыре операции: две операции чтения и две операции записи. Представьте, что чтение-запись-чтение-запись на удаленном устройстве сменили порядок на чтение-чтение-запись-запись.

_Zx_
Дилетант
Сообщения: 6
Зарегистрирован: 26 май 2021, 17:19

Re: Проблема с инвертированием тега WinCC7.5

Сообщение _Zx_ »

У меня одно событие на кнопке и одно инвертирование на чтении-записи, если вы предложите реализацию инвертирования бита контроллера более простым способом - буду благодарен. В вашем примере скрипта - работа с объектом вбс смарттэг, которого у меня в проекте нет.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Проблема с инвертированием тега WinCC7.5

Сообщение Михайло »

Я так понимаю: у вас графический элемент связан с тегом в ПЛК, и параллельно в скрипте по событию читается этот тег и потом производится его перезапись.
Попробуйте читать не тег в ПЛК, а состояние графического элемента в скрипте, а запись в тег оставьте как есть. Тогда должны синхронизироваться операции чтения, они будут производиться по факту только в графическом элементе, скрипт будет паразитировать на графическом элементе.

_Zx_
Дилетант
Сообщения: 6
Зарегистрирован: 26 май 2021, 17:19

Re: Проблема с инвертированием тега WinCC7.5

Сообщение _Zx_ »

Ладно, спасибо за помощь.

Ответить