Если вам нужно записать ошибки от разных блоков в одну переменную, то можно сделать так. В одну целочисленную переменную можно записать до 32 ошибок
Вложение 88784
Вид для печати
Если вам нужно записать ошибки от разных блоков в одну переменную, то можно сделать так. В одну целочисленную переменную можно записать до 32 ошибок
Вложение 88784
Если будет остановка по событию, то Вам нужно фиксировать какой ФБ вызвал остановку и по какой ошибке.
Примерно так:
Код:function_block FixError
var_input
ErrorFromFB1, ErrorFromFB2, ErrorFromFB3, ErrorFromFB4 : udint; // Состояние ФБ
end_var
var_output
ErrorFB, ErrorCode : udint; // Кто? Чего?
end_var
if ErrorFromFB1 > 0 then
ErrorCode := ErrorFromFB1; ErrorFb := 1;
elsif ErrorFromFB2 > 0 then
ErrorCode := ErrorFromFB2; ErrorFb := 2;
elsif ErrorFromFB3 > 0 then
ErrorCode := ErrorFromFB3; ErrorFb := 3;
elsif ErrorFromFB4 > 0 then
ErrorCode := ErrorFromFB4; ErrorFb := 4;
else
ErrorCode := 0; ErrorFb := 0;
end_if
end_function_block
У меня другой метод, который я использую в разных контроллерах.
"Выходные данные из блоков - это число" - это принцип программиста "С", "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