У меня другой метод, который я использую в разных контроллерах.
"Выходные данные из блоков - это число" - это принцип программиста "С", "Pascal".
В FBD/ST - могут возникать несколько ошибок одновременно.
Поэтому, я использую для каждой ошибки - свой бит. Если у макроса FDB/ST блока - 3-4 ошибки - для каждой использую свой Out. Если больше- упаковываю в Word - но все равно - один бит - одна ошибка.
Если есть вложение макросов - переупаковываю слова ошибок от каждого вложенного макроса, формируя выходные переменные Errors1, Errors2...
ЗЫ. В итоге, на панели оператора, при нажатии на кнопку, например пуска транспортера выводится цепочка ошибок:
"Транспортер 12: Ошибка - Запрет пуска, принимающий транспортер не включился"
"Транспортер 11: Ошибка - Нет вращения"
"Транспортер 11: Ошибка - Нет сигнала с датчика вращения SQ122, модуль А2 DI 131"
ЗЫЫ. Такое управление аварийными ситуациями удобно и в самой программе. Например
i - Input, j- Job, e - Error, o - Output, ton - TON, v - local Variable. btn, sw - BuTtoN, SWitch - не всегда использую, но иногда полезно в большом проекте, сократить имена переменных (бывает и iOn и btnOn и swOn в одном макросе).Код:function_block vEnable:= jEnable AND jPrevRun AND NOT( eOnTimeout OR eConcurrence); oOn:= vEnable AND ((jAuto AND jAutoON) OR (NOT jAuto AND btnManuOn)); tonOnTimeout(IN: oOn AND NOT iOn, PT:= 500ms); eOnTimeout:= tonOnTimeout.Q OR (eOnTimeout AND NOT jResetErr); end_function_block





Ответить с цитированием