Здравствуйте!
При использовании кнопки с фиксацией, если на контроллере происходит немедленный сброс бита после получения, ее анимация подвисает в состоянии ожидания обратной связи.
В следующем обновлении добавим опцию, которая позволит отключить анимацию контроля записи.
В настоящее время тестирую скорость и различные сценарии использования, но в реальном проекте столкнусь с данной проблемой в следующих условиях:
1. Есть бит ManualStart у объекта Motor.
2. В нормальных условиях: кнопку нажали –запустился, отжали – остановился.
3. При определенных условиях, например, включен режим Авто или следующий в цепочке механизм запрещает работу, команда не отработает и бит будет сразу сброшен контроллером. Что приведет к зависанию анимации.
Обычно, если имеется ручной/автоматический режим работы механизма, то кнопки ручного управления не должны работать в автоматическом режиме. Это можно реализовать при помощи скриптов, используя свойство кнопки Enabled (https://simple-scada.com/help/script/enabled.html). Например, для блокировки кнопки в автоматическом режиме можно указать в доп. переменной кнопки переменную автоматического режима и написать скрипт на событие OnDataChangeEx кнопки:
begin
if Sender is TM_Button then // проверяем, что Sender это кнопка
with Sender as TM_Button do // приводим Sender к типу "TM_Button"
if VariableEx.AsInt = 1 then // если значение доп. переменной кнопки = 1
Enabled := False // отключаем доступ к кнопке
else // иначе
Enabled := True; // включаем доступ к кнопке
end.
Этот скрипт универсальный и подойдет для любой кнопки. Таким образом, в автоматическом режиме кнопка будет недоступна и ее нельзя будет нажать. В Вашей задаче помимо автоматического режима имеются дополнительные блокировки, поэтому можно добавить переменную блокировки, которая будет принимать значение 1 при наличии любой блокировки или переключении механизма в автоматический режим. Затем, эту переменную блокировки указать в качестве доп. переменной кнопки и использовать скрипт приведенный выше, тогда кнопка будет недоступна при наличии любой блокировки и в автоматическом режиме.
Здравствуйте!
Непрерывно записывать 0 - нормальная ситуация, любая импульсная команда по сути это делает:
IF #cmdClear THEN
FOR #i := 0 TO #maxI BY 1 DO
#data[#i] := 0;
END_FOR;
#cmdClear := FALSE;
END_IF;
Т.е. команда clear проживет всего несколько мс (в моем случае меньше 8мс) и сбросится.
Разумеется, на OPC серверах (в моем случае их 2 – встроенный OPC UA Server на S7-1500 и OPC DA KepServerEx 6) за это время не будет сгенерировано событий, и формально пункты 5 и 6 не происходят.
Могу перефразировать пункты:
5. OPC сервер не считал новое значение, потому что оно уже такое же как старое.
6. SCADA не получила новое значение, потому что у нее уже есть фактическое.
Ситуация все равно штатная. Нештатная ситуация, когда на контроллере одно значение, а на Scada другое, или, когда потеряна связь и состояние тега Bad.
По умолчанию, KepServerEx OPC UA Client работает в режиме Subscribe, но переключение в режим Poll и игра с частотой обновления глобально не решает проблему.
Проверил сейчас привязку KepServer напрямую через стандартный протокол Siemens.
"IEC_Timer_0_DB".TON(IN:=#cmdTest,
PT:=#timeReset, // #timeReset = 50ms
Q=> #TestQ);
#cmdTest := #cmdTest AND (NOT #TestQ);
Да, ситуация улучшается, и 50мс тоже отрабатываются, как и у вас на Schneider (в отличии даже от 500мс через OPC UA).
Возможно переключу протокол на этапе запуска, если будет заметна разница. В процессе разработки UA очень удобен для импорта тегов.
Версия Scada 2.2.7.1