1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | FUNCTION_BLOCK LightStateMachine VAR_IN_OUT Client : IOClient; END_VAR VAR UM : PACK_ML.UnitMode; xInit : BOOL := FALSE; // Flag for initialization bl : blink; messageQueue : MessageQueue; IF NOT xInit THEN UM ( sName := 'Normal Operation', dwAllowsLeavingFromStates := PACK_ML.State.Stopped OR PACK_ML.State.Aborted OR PACK_ML.State.Idle, IF SysStrCmp(Client.sCommandToPLC, Client.LockCommands[0]) = 0 THEN Client.Message:='Turn on the status.'; TurnOnStatusLight(); ELSIF SysStrCmp(Client.sCommandToPLC, 'UnSuspend') = 0 THEN UnSuspend(); END_CASE Client.iCommandToPLC := 0; Client.sCommandToPLC := ''; Client.bReadyToPLC := FALSE; CASE UM.CurrentState OF PACK_ML.State.Stopped: ; PACK_ML.State.Aborted: DO_First_Floor_Red_Light_Outdoor := bl.OUT; PACK_ML.State.Idle: PACK_ML.State.Complete : PACK_ML.State.Execute : PACK_ML.State.Resetting : DO_Laser_ON := FALSE; DO_First_Floor_Red_Light_Outdoor := FALSE; UM.ActingStateCompleted(); PACK_ML.State.Starting : PACK_ML.State.Completing : PACK_ML.State.Aborting : PACK_ML.State.Stopping: PACK_ML.State.Clearing : DO_First_Floor_Red_Light_Outdoor := FALSE; END_CASE IF NOT (DI_EmergencyGF AND NOT DI_EmergencyFF) THEN // Emergency Abort. Abort(); END_IF Client.ActualState := UM.CurrentState; messageQueue(Client := Client); bl(ENABLE := TRUE,TIMELOW := T#250MS,TIMEHIGH:= T#500MS); |