да, таймеры внутри условий
Код:
function_block PhaseLoadControl
var_input
Current : REAL;
Hight_level : REAL;
Low_level : REAL;
end_var
var_output
Auto1Cmd, Auto2Cmd : BOOL := TRUE; (* Команды управления автоматами *)
end_var
var
TimerOn1, TimerOn2, TimerOff1, TimerOff2 : sys.TON;
T_On, T_Off : TIME := T#5S;
end_var
(* Отключение автоматов, если ток выше Hight_level *)
IF Current > Hight_level THEN
TimerOff1(I := Auto1Cmd, T := T_Off);
IF TimerOff1.Q THEN Auto1Cmd := FALSE; END_IF;
TimerOff2(I := (NOT Auto1Cmd) AND Auto2Cmd AND (Current > Hight_level), T := T_Off);
IF TimerOff2.Q THEN Auto2Cmd := FALSE; END_IF;
END_IF;
(* Включение автоматов, если ток ниже Low_level *)
IF Current < Low_level THEN
TimerOn1(I := NOT Auto1Cmd, T := T_On);
IF TimerOn1.Q THEN Auto1Cmd := TRUE; END_IF;
TimerOn2(I := Auto1Cmd AND NOT Auto2Cmd, T := T_On);
IF TimerOn2.Q THEN Auto2Cmd := TRUE; END_IF;
END_IF;
(* Удержание состояния в диапазоне Low_level-Hight_level *)
IF (Current >= Low_level) AND (Current <= Hight_level) THEN
(* Ничего не делаем, автоматы остаются в текущем состоянии *)
END_IF;
end_function_block