Имеется ПЛК Siemens 1513F-1 PN, сейфти режим отключен, имеется тиа 16. Одна из задач программы (и НСУ) - реакция на нажатия оператором кнопок в HMI.
Суть вопроса следующая: есть FB1 с DB1, в FB1 есть тэг recoveryFlag (bool), он привязан к кнопке в HMI, при нажатии кнопки срабатывает скрипт invertBit (setBit тоже пробовал). Конкретный тег отвечает за отправку сообщения разблокировки НСУ. Сообщение уже готово и тупо пишется из хранилища в буфер НСУ.
Нажимаем кнопку, надеваем "очки" - тег изменился.
Пишем в том же FB1 код на SCL
Код: Выделить всё
IF #recoveryFlag = TRUE THEN
FOR #i := 0 TO 5 DO
#readyToSendMsg[#i] := #sndCode.recoveryArr[#i];
END_FOR;
#recoveryFlag := FALSE;
END_IF;
Добавляем для проверки булевый тег check с условием стать ТРУ, если тег recoveryFlag стал ТРУ.
Нажимаем кнопку - массив не записывается, тег recoveryFlag - ФОЛС, но check висит ТРУ.
При истеричном нажатии на кнопку в HMI, раза с 3-10-27.. проскакивает одно срабатывание и массив пишется.
Вот ломаю голову, в чем причина... То есть тег трушится и фолсится раньше, чем выполнилось действие, после которого тег должен фолситься.
Вместо цикла FOR на пробу просто поэлементно присваивал один массив к другому в 6 строк - ни чего. Пробовал блокировку делать через тот же check и дальше работать с ним - ни чего.
Есть прямая связь с присутствием любого тега, связанного с HMI, в коде SCL, потому как стоит убрать его из кода - он начинает стабильно инвертироваться, а сам код, как видно, простой и как-то навредить работе тега не в состоянии.
ЗЫ: с такой-же проблемой еще 2 оставшиеся кнопки (тега) в HMI. Одна из них идентична по работе с описанной выше, вторая отличается, но простота логики та же.
Буду признателен за помощь!