_stStatus.eStateCurrent, eCurrentMode => _stStatus.eUnitModeCurrent, xError=> ); // Reset state state machine IF _eLastState <> _stStatus.eStateCurrent THEN _iSSM := 0; _eLastState := _stStatus.eStateCurrent; END_IF // Set release manual mode flag when we are in manual mode _xReleaseManualMode := (_stStatus.eUnitModeCurrent = E_PackMLUnitMode.MANUAL); // Call state method according to current state CASE _stStatus.eStateCurrent OF E_PackMLState.CLEARING: M_Clearing(); E_PackMLState.STOPPED: M_Stopped(); E_PackMLState.STARTING: M_Starting(); E_PackMLState.IDLE: M_Idle(); E_PackMLState.SUSPENDED: M_Suspended(); E_PackMLState.EXECUTE: M_Execute(); E_PackMLState.STOPPING: M_Stopping(); E_PackMLState.ABORTING: M_Aborting(); E_PackMLState.ABORTED: M_Aborted(); E_PackMLState.HOLDING: M_Holding(); E_PackMLState.HELD: M_Held(); E_PackMLState.UNHOLDING: M_Unholding(); E_PackMLState.SUSPENDING: M_Suspending(); E_PackMLState.UNSUSPENDING: M_Unsuspending(); E_PackMLState.RESETTING: M_Resetting(); E_PackMLState.COMPLETING: M_Completing(); E_PackMLState.COMPLETED: M_Completed(); ELSE ; END_CASE A_HandleHMIOutput(); // Copy ouput buffers stStatus := _stStatus;]]> E_PackMLState.ABORTED) AND (_stStatus.eStateCurrent <> E_PackMLState.ABORTING); IF _stStatus.eStateCurrent = E_PackMLState.ABORTING THEN stPackMLHMIInterface.stBtnAbort.eFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; ELSE stPackMLHMIInterface.stBtnAbort.eFeedback := E_HMI_BUTTON_FEEDBACK.NONE; END_IF // Handle hold button stPackMLHMIInterface.stBtnHold.xRelease := (_stStatus.eStateCurrent = E_PackMLState.EXECUTE) OR (_stStatus.eStateCurrent = E_PackMLState.SUSPENDED); IF _stStatus.eStateCurrent = E_PackMLState.HOLDING THEN stPackMLHMIInterface.stBtnHold.eFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; ELSE stPackMLHMIInterface.stBtnHold.eFeedback := E_HMI_BUTTON_FEEDBACK.NONE; END_IF // Handle stop button stPackMLHMIInterface.stBtnStop.xRelease := (_stStatus.eStateCurrent <> E_PackMLState.ABORTED) AND (_stStatus.eStateCurrent <> E_PackMLState.ABORTING) AND (_stStatus.eStateCurrent <> E_PackMLState.CLEARING) AND (_stStatus.eStateCurrent <> E_PackMLState.STOPPING) AND (_stStatus.eStateCurrent <> E_PackMLState.STOPPED); IF _stStatus.eStateCurrent = E_PackMLState.STOPPING THEN stPackMLHMIInterface.stBtnStop.eFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; ELSE stPackMLHMIInterface.stBtnStop.eFeedback := E_HMI_BUTTON_FEEDBACK.NONE; END_IF // Handle suspend button stPackMLHMIInterface.stBtnSuspend.xRelease := (_stStatus.eStateCurrent = E_PackMLState.EXECUTE); IF _stStatus.eStateCurrent = E_PackMLState.SUSPENDING THEN stPackMLHMIInterface.stBtnSuspend.eFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; ELSE stPackMLHMIInterface.stBtnSuspend.eFeedback := E_HMI_BUTTON_FEEDBACK.NONE; END_IF // Handle unhold button stPackMLHMIInterface.stBtnUnhold.xRelease := (_stStatus.eStateCurrent = E_PackMLState.HELD); IF _stStatus.eStateCurrent = E_PackMLState.UNHOLDING THEN stPackMLHMIInterface.stBtnUnhold.eFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; ELSE stPackMLHMIInterface.stBtnUnhold.eFeedback := E_HMI_BUTTON_FEEDBACK.NONE; END_IF // Handle unsuspend button stPackMLHMIInterface.stBtnUnsuspend.xRelease := (_stStatus.eStateCurrent = E_PackMLState.SUSPENDED); IF _stStatus.eStateCurrent = E_PackMLState.UNSUSPENDING THEN stPackMLHMIInterface.stBtnUnsuspend.eFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; ELSE stPackMLHMIInterface.stBtnUnsuspend.eFeedback := E_HMI_BUTTON_FEEDBACK.NONE; END_IF // Handle complete button stPackMLHMIInterface.stBtnComplete.xRelease := (_stStatus.eStateCurrent = E_PackMLState.EXECUTE) OR (_stStatus.eStateCurrent = E_PackMLState.HELD) OR (_stStatus.eStateCurrent = E_PackMLState.SUSPENDED); IF _stStatus.eStateCurrent = E_PackMLState.UNSUSPENDING THEN stPackMLHMIInterface.stBtnComplete.eFeedback := E_HMI_BUTTON_FEEDBACK.ACTIVE; ELSE stPackMLHMIInterface.stBtnComplete.eFeedback := E_HMI_BUTTON_FEEDBACK.NONE; END_IF // Copy mode and state stPackMLHMIInterface.eCurrentMode := _eMode; stPackMLHMIInterface.eCurrentState := _stStatus.eStateCurrent;]]> E_PackMLState.ABORTED) AND (_stStatus.eStateCurrent <> E_PackMLState.ABORTING) THEN _eCmd := E_PackMLCmd.ABORT; M_CmdAbort := TRUE; ELSE M_CmdAbort := FALSE; END_IF]]> E_PackMLState.ABORTED) AND (_stStatus.eStateCurrent <> E_PackMLState.ABORTING) AND (_stStatus.eStateCurrent <> E_PackMLState.CLEARING) AND (_stStatus.eStateCurrent <> E_PackMLState.STOPPING) AND (_stStatus.eStateCurrent <> E_PackMLState.STOPPED) THEN _eCmd := E_PackMLCmd.STOP; M_CmdStop := TRUE; ELSE M_CmdStop := FALSE; END_IF]]>