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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | FUNCTION_BLOCK HatchStateMachine VAR_IN_OUT Client : IOClient; END_VAR VAR f_trig: F_TRIG; _open : BOOL; messageQueue : MessageQueue; 647 {8e575c5b-1d37-49c6-941b-5c0ec7874787} ChildObjectGuids AddAttributeSubsequent 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 _open := TRUE; 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, PACK_ML.State.Idle, PACK_ML.State.Complete : ; PACK_ML.State.Resetting : DO_Lock_Stair := FALSE; Client.Message:='Waiting for hatch to be closed.'; f_trig(CLK:= DI_HatchTrigger); IF f_trig.Q THEN DO_Lock_Stair := TRUE; StateComplete(); END_IF PACK_ML.State.Starting : IF DO_Lock_Stair = FALSE THEN UM.Stop(); ELSE PACK_ML.State.Execute : CASE Client.ActualStep OF 0: Client.ActualStep := 300; 300: IF _close THEN Client.ActualStep := 310; _close := FALSE; ELSIF _open THEN Client.ActualStep := 320; _open := FALSE; 310: DO_Lock_Stair := FALSE; f_trig(CLK:= DI_HatchTrigger); Client.Message:='Closing the hatch.'; IF f_trig.Q THEN Client.Message:='Hatch closed.'; DO_Lock_Stair := TRUE; Client.ActualStep := 300; 320: Client.Message:='Opening the hatch'; Client.ActualStep := 300; Client.Message:='Hatch opened.'; END_CASE; PACK_ML.State.Completing : StateComplete(); PACK_ML.State.Aborting : DO_Lock_Stair := FALSE; PACK_ML.State.Stopping: PACK_ML.State.Clearing : END_CASE IF NOT (DI_EmergencyGF AND NOT DI_EmergencyFF) THEN Abort(); END_IF Client.ActualState := UM.CurrentState; messageQueue(Client := Client); |