(* Traffic light junction: reference solution in IEC 61131-3 Structured Text. *) VAR_GLOBAL NS_Red AT %QX0.0 : BOOL; (* North-south red lamp *) NS_Amber AT %QX0.1 : BOOL; (* North-south amber lamp *) NS_Green AT %QX0.2 : BOOL; (* North-south green lamp *) EW_Red AT %QX0.3 : BOOL; (* East-west red lamp *) EW_Amber AT %QX0.4 : BOOL; (* East-west amber lamp *) EW_Green AT %QX0.5 : BOOL; (* East-west green lamp *) END_VAR TYPE Stage : (NS_GO, NS_WAIT, EW_GO, EW_WAIT); END_TYPE PROGRAM Main VAR stage : Stage := NS_GO; timer : TON; hold : TIME; END_VAR (* How long each phase lasts. *) CASE stage OF NS_GO, EW_GO: hold := T#5s; NS_WAIT, EW_WAIT: hold := T#2s; END_CASE; timer(IN := TRUE, PT := hold); IF timer.Q THEN timer(IN := FALSE); CASE stage OF NS_GO: stage := NS_WAIT; NS_WAIT: stage := EW_GO; EW_GO: stage := EW_WAIT; EW_WAIT: stage := NS_GO; END_CASE; END_IF; (* One lamp per head, decided only by the stage, so two greens cannot happen. *) NS_Green := stage = NS_GO; NS_Amber := stage = NS_WAIT; NS_Red := stage = EW_GO OR stage = EW_WAIT; EW_Green := stage = EW_GO; EW_Amber := stage = EW_WAIT; EW_Red := stage = NS_GO OR stage = NS_WAIT; END_PROGRAM