Мой вариант:
Код:
VAR
btnFTrig: F_TRIG;
btnTimer: TON := (PT := T#500ms);
cancelSwitch: BOOL;
END_VAR
VAR CONSTANT
scenes: ARRAY[0..3] OF WORD := 2#10101, 2#11001, 2#01010, 2#11011;
END_VAR
VAR RETAIN
sceneIndex: BYTE := 0;
END_VAR
btnTimer(IN := btn AND NOT btnTimer.Q);
sceneIndex := (sceneIndex + BOOL_TO_BYTE(btnTimer.Q)) MOD 4;
IF btnTimer.Q THEN
lights := scenes[sceneIndex];
cancelSwitch := TRUE;
END_IF
btnFTrig(clk := btn);
IF btnFTrig.Q THEN
IF NOT cancelSwitch THEN
lights := lights XOR scenes[sceneIndex];
END_IF
cancelSwitch := FALSE;
END_IF
В визуализации vis побаловаться можно. Вроде правильно работает.
Как это писать на SFC я даже думать не хочу))