Описанный процесс - долгий и последовательный. Ничего лучшего кроме
автомата для этого нет. Он же наиболее наглядный и легко модифицируемый.
Код:
program/function_block
var_input //входы свободно меняются в любой момент
tmOn,
tmOff : time; //время в откр/закр состоянии
CountSwitch : int; //кол-во клацаний
end_var
var_output
CurrentSwith : int; //на посмотреть
Q : bool; //соббсно на клапан[ы]
end_var
var
Step : (WAIT, ON, OFF); //собсно автомат
t : time;
OnPress : r_trig; //событие нажатия на кнопу (63/73 - старт/стоп ?)
end_var
***************************
OnPress(CLK := _KEY = ..); //_KEY - в конфигурации 63/73
case Step of
WAIT:
CurrentSwith := 0;
if OnPress.Q then //есть есть у революции принуд. начало ...
CurrentSwitch := 1;
t := time();
Step := ON;
end_if
ON:
if OnPress.Q then // .. и конец тоже может быть, коли "СТАРТ/СТОП"
Step := WAIT;
elsif (time() - t) > tmOn then
t := time();
CurrentSwitch := CurrentSwitch + 1;
Step := sel(CurrentSwitch > CountSwitch, OFF, WAIT);
end_if
OFF:
if OnPress.Q then // ..
Step := WAIT;
elsif (time() - t) > tmOff then
t := time();
Step := ON;
end_if
end_case
Q := Step = ON;
Наверно второй раз в жизни так комментировал код. Он же сам себя комментит.