_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 // Base state machine CASE _eState OF E_PackMLState.STOPPING: IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.STOPPED: IF eCmd = E_PackMLCmd.RESET THEN _eState := E_PackMLState.RESETTING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.RESETTING: IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.IDLE: IF eCmd = E_PackMLCmd.START THEN _eState := E_PackMLState.STARTING; END_IF IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.STARTING: IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.EXECUTE: IF eCmd = E_PackMLCmd.SUSPEND THEN _eState := E_PackMLState.SUSPENDING; END_IF IF eCmd = E_PackMLCmd.HOLD THEN _eState := E_PackMLState.HOLDING; END_IF IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.SUSPENDING: IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.SUSPENDED: IF eCmd = E_PackMLCmd.UNSUSPEND THEN _eState := E_PackMLState.UNSUSPENDING; END_IF IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.UNSUSPENDING: IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.HOLDING: IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.HELD: IF eCmd = E_PackMLCmd.UNHOLD THEN _eState := E_PackMLState.UNHOLDING; END_IF IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.UNHOLDING: IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.COMPLETING: IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.COMPLETE: IF eCmd = E_PackMLCmd.RESET THEN _eState := E_PackMLState.RESETTING; END_IF IF eCmd = E_PackMLCmd.STOP THEN _eState := E_PackMLState.STOPPING; END_IF IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF E_PackMLState.ABORTED: IF eCmd = E_PackMLCmd.CLEAR THEN _eState := E_PackMLState.CLEARING; END_IF E_PackMLState.CLEARING: IF eCmd = E_PackMLCmd.ABORT THEN _eState := E_PackMLState.ABORTING; END_IF ELSE ; END_CASE // Copy internal state value to fb output eState := _eState; eCurrentMode := _eMode;]]>