Ну и для полноты картинки на ST:
Owen.jpg
Код:
function_block garland
var_input
Mode1, Mode2, Up, Dn : bool; // Кнопки
end_var
var_output
Q1, Q2, Q3, Q4 : bool; // Лампы
end_var
var
State : udint; // Состояние
Mode : bool; // Режим
TMR : SYS.TON; // Таймер импульсов переключения
TL : udint := 1000; // Период между импульсами
Mode1Set, Mode2Set : SYS.RTRIG;
UpSet, DnSet : SYS.RTRIG;
end_var
// Фиксируем переключение режима
Mode1Set(I := Mode1); Mode2Set(I := Mode2);
if Mode1Set.Q then State := 0; Mode := false; TMR(I := false); Q1 := true; end_if
if Mode2Set.Q then State := 0; Mode := true; TMR(I := false); Q1 := true; Q3 := true; end_if
// Фиксируем увеличение/уменьшение периодв с ограничением
UpSet(I := Up); DnSet(I := Dn);
if UpSet.Q and TL < 100000 then TL := TL + 1000; end_if
if DnSet.Q and TL > 2000 then TL := TL - 1000; end_if
// Фиксируем смену состояния
TMR(I := true, T := udint_to_time(TL));
if TMR.Q then // Пришло время переключиться
TMR(I := false); // Перезапуск таймера
if Not Mode then
case State of
0: Q1 := true; Q2 := false; Q3 := false; Q4 := false; State := 1;
1: Q1 := false; Q2 := true; Q3 := false; Q4 := false; State := 2;
2: Q1 := false; Q2 := false; Q3 := true; Q4 := false; State := 3;
3: Q1 := false; Q2 := false; Q3 := false; Q4 := true; State := 0;
end_case
else
case State of
0: Q1 := true; Q2 := false; Q3 := true; Q4 := false; State := 1;
1: Q1 := false; Q2 := true; Q3 := false; Q4 := true; State := 0;
end_case
end_if
end_if
end_function_block