_eMode THEN // Only allow mode switch in stopped state // or in aborted state when target mode ist manual mode IF (_eState = E_PackMLState.STOPPED) OR (_eState = E_PackMLState.ABORTED AND eMode = E_PackMLUnitMode.MANUAL) THEN _eMode := eMode; END_IF END_IF REPEAT _xRerunSM := FALSE; // Base state machine CASE _eState OF E_PackMLState.STOPPING: IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.STOPPED: IF eCmd = E_PackMLCmd.RESET THEN IF (NOT stConfig.xResettingDisabled)THEN _eState := E_PackMLState.RESETTING; ELSE _eState := E_PackMLState.IDLE; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.RESETTING: IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.IDLE: IF eCmd = E_PackMLCmd.START THEN IF (NOT stConfig.xStartingDisabled) THEN _eState := E_PackMLState.STARTING; ELSE _eState := E_PackMLState.EXECUTE; END_IF END_IF IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.STARTING: IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.EXECUTE: IF eCmd = E_PackMLCmd.SUSPEND AND (NOT stConfig.xSuspededDisabled) THEN IF (NOT stConfig.xSuspendingDisabled) THEN _eState := E_PackMLState.SUSPENDING; ELSE _eState := E_PackMLState.SUSPENDED; END_IF END_IF IF eCmd = E_PackMLCmd.HOLD AND (NOT stConfig.xHeldDisabled) THEN IF (NOT stConfig.xHoldingDisabled) THEN _eState := E_PackMLState.HOLDING; ELSE _eState := E_PackMLState.HELD; END_IF END_IF IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF IF eCmd = E_PackMLCmd.COMPLETE THEN IF (NOT stConfig.xCompletedDisabled)THEN IF (NOT stConfig.xCompletingDisabled) THEN _eState := E_PackMLState.COMPLETING; ELSE _eState := E_PackMLState.COMPLETED; END_IF ELSE IF (NOT stConfig.xResettingDisabled) THEN _eState := E_PackMLState.RESETTING; ELSE _eState := E_PackMLState.IDLE; END_IF END_IF END_IF E_PackMLState.SUSPENDING: IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.SUSPENDED: IF eCmd = E_PackMLCmd.UNSUSPEND THEN IF (NOT stConfig.xUnsuspendingDisabled) THEN _eState := E_PackMLState.UNSUSPENDING; ELSE _eState := E_PackMLState.EXECUTE; END_IF END_IF IF eCmd = E_PackMLCmd.HOLD AND (NOT stConfig.xHeldDisabled) THEN IF (NOT stConfig.xHoldingDisabled) THEN _eState := E_PackMLState.HOLDING; ELSE _eState := E_PackMLState.HELD; END_IF END_IF IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.UNSUSPENDING: IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.HOLDING: IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.HELD: IF eCmd = E_PackMLCmd.UNHOLD THEN IF (NOT stConfig.xUnholdingDisabled) THEN _eState := E_PackMLState.UNHOLDING; ELSE _eState := E_PackMLState.EXECUTE; END_IF END_IF IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.UNHOLDING: IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.COMPLETING: IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.COMPLETED: IF eCmd = E_PackMLCmd.RESET THEN IF (NOT stConfig.xResettingDisabled)THEN _eState := E_PackMLState.RESETTING; ELSE _eState := E_PackMLState.IDLE; END_IF END_IF IF eCmd = E_PackMLCmd.STOP THEN IF (NOT stConfig.xStoppingDisabled) THEN _eState := E_PackMLState.STOPPING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF E_PackMLState.ABORTED: IF eCmd = E_PackMLCmd.CLEAR THEN IF (NOT stConfig.xClearingDisabled) THEN _eState := E_PackMLState.CLEARING; ELSE _eState := E_PackMLState.STOPPED; END_IF END_IF E_PackMLState.CLEARING: IF eCmd = E_PackMLCmd.ABORT THEN IF (NOT stConfig.xAbortingDisabled) THEN _eState := E_PackMLState.ABORTING; ELSE _eState := E_PackMLState.ABORTED; END_IF END_IF ELSE ; END_CASE UNTIL (NOT _xRerunSM) END_REPEAT // Copy internal state value to fb output eState := _eState; eCurrentMode := _eMode;]]>