// LICENSE : GPLv2+ BEGIN // Run the main state machine CALL "FC_statemachine" ( STATE := "MW_statemachine", T := "T_state", PERIOD := S5T#500ms, T_STATE := "M_statemachine", Z := "Z_state", ) L "MW_statemachine" SPL def SPA _0 // "STATE_LIGHTCHASER" SPA _1 // "STATE_A" SPA _2 // "STATE_W" SPA _3 // "STATE_L" SPA _4 // "STATE_55" SPA _5 // "STATE_AA" def: SPA end // "STATE_LIGHTCHASER" _0: CALL "FC_lightchaser" ( PERIOD := S5T#100ms, T := "T_lightchaser", MINVAL := DW#16#01000000, MAXVAL := DW#16#80000000, REG := "MD_lightchaser", STATE := "M_lightchaser_state", DIR := "M_lightchaser_dir", ) L "MD_lightchaser" SRD 24 T "AB_raspi_GPIO" SPA end // "STATE_A" _1: L 'A' T "AB_raspi_GPIO" SPA end // "STATE_W" _2: L 'W' T "AB_raspi_GPIO" SPA end // "STATE_L" _3: L 'L' T "AB_raspi_GPIO" SPA end // "STATE_55" _4: L B#16#55 T "AB_raspi_GPIO" SPA end // "STATE_AA" _5: L B#16#AA T "AB_raspi_GPIO" SPA end end: BE END_ORGANIZATION_BLOCK ]]> // LICENSE : GPLv2+ VAR_INPUT PERIOD : S5TIME; END_VAR VAR_IN_OUT STATE : INT; T : TIMER; T_STATE : BOOL; Z : COUNTER; END_VAR BEGIN // Self re-arming timer U #T_STATE L #PERIOD SV #T UN #T = #T_STATE // State counter U #T_STATE ZV #Z // Check if we are in simple "light chaser only" mode L "STATE_LIGHTCHASER" T #STATE U "E_simple_mode" SPB rst // Complex mode. Decide by state counter. L "STATE_LIGHTCHASER" T #STATE L #Z L 16 // LICENSE : GPLv2+ VAR_INPUT PERIOD : S5TIME; // Timer period T : TIMER; // Timer cell MINVAL : DWORD; // Minimal #REG value MAXVAL : DWORD; // Maximal #REG value END_VAR VAR_IN_OUT REG : DWORD; // Shift register STATE : BOOL; // Timer state DIR : BOOL; // Shift direction END_VAR BEGIN // Self re-arming timer U #STATE L #PERIOD SV #T UN #T = #STATE // Select sweep direction L #MINVAL L #REG ==D // #MINVAL reached? S #DIR // reverse direction L #MAXVAL ==D // #MAXVAL reached? R #DIR // reverse direction // Shift #REG, if required L #REG UD L#-1 L #MINVAL // Initial #REG value SPZ _001 // #REG is uninitialized? TAK U #STATE // Next state? SPBN _001 U #DIR // Left or right? SPBN _000 RLD 2 // Next state (left) _000: RRD 1 // Next state (right) _001: T #REG BE END_FUNCTION ]]>