В продолжении мармезонского балета, еще один макрос на 32 аварии. Аварии разбиты на 4 группы по 8 бит
Код:
function_block AlarmFlash_2
var_input
bmAlarm : udint; //битовая маска аварий
end_var
var_output
Q : bool;
Code : udint;
end_var
var
bitAlarm : bool;
numGr : udint;
numAl : udint := 0;
codeAl : SYS.BLINK;
cGroup, cAlarm : SYS.CTU;
pGroup : SYS.TON;
pAlarm : SYS.TP;
faseGr, faseAl : bool;
flashAl :udint;
next : SYS.RTRIG;
res : bool;
end_var
codeAl(Th := t#300ms, Tl := t#300ms); //период моргания
pGroup(T := t#500ms); //пауза между группа - код
pAlarm(T := t#2700ms); // пауза между авариями
//Поиск аварий
bitAlarm := shr(bmAlarm, numAl) mod 2 > 0;
if not bitAlarm or next.Q then
res := true;
numAl := numAl + 1;
if numAl > 31 then
numAl := 0;
end_if
else
res := false;
end_if
if not pAlarm.Q then
flashAl := 1 + (numAl mod 8);
if numAl > 23 then numGr := 5;
elsif numAl > 15 then numGr := 4;
elsif numAl > 7 then numGr := 3;
else numGr := 2;
end_if;
end_if
cGroup(C := not Q and faseGr, N := numGr, R := res);
cAlarm(C := not Q and faseAl, N := flashAl, R := res);
next(I := cAlarm.Q);
pGroup(I := cGroup.Q);
pAlarm(I := cAlarm.Q);
faseGr := bitAlarm and not (cGroup.Q or pAlarm.Q);
faseAl := pGroup.Q and not cAlarm.Q;
codeAl(I := (faseGr or faseAl), Q => Q);
if faseGr or faseAl then
Code := numAl + 1;
elsif bmAlarm = 0 then
Code := 0;
end_if
end_function_block