- Modified PackML state machine to be able to disable unused states - Added PackTag datatypes for recipe handling - Started recipe parameter description in json file - Added schema file for recipe json - Added state machine drawing for packml
428 lines
10 KiB
XML
428 lines
10 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<TcPlcObject Version="1.1.0.1">
|
|
<POU Name="FB_PackMLStateMachine" Id="{784ceb84-1721-424f-89d1-422a24198e57}" SpecialFunc="None">
|
|
<Declaration><![CDATA[FUNCTION_BLOCK FB_PackMLStateMachine
|
|
VAR_INPUT
|
|
eMode : E_PackMLUnitMode;
|
|
eCmd : E_PackMLCmd;
|
|
|
|
stConfig : ST_PackMLStateMachineConfig;
|
|
END_VAR
|
|
VAR_OUTPUT
|
|
eState : E_PackMLState;
|
|
eCurrentMode : E_PackMLUnitMode;
|
|
xError : BOOL;
|
|
END_VAR
|
|
VAR
|
|
// Internal mode
|
|
_eMode : E_PackMLUnitMode;
|
|
|
|
// Internal state
|
|
_eState : E_PackMLState;
|
|
|
|
// Rerun state machine
|
|
_xRerunSM : BOOL;
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[// Check for mode switch
|
|
IF eMode <> _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;]]></ST>
|
|
</Implementation>
|
|
<Method Name="M_StateComplete" Id="{e2f1bae5-5059-4baa-8ba2-8dfa58d439e5}">
|
|
<Declaration><![CDATA[METHOD M_StateComplete
|
|
VAR_INPUT
|
|
END_VAR
|
|
]]></Declaration>
|
|
<Implementation>
|
|
<ST><![CDATA[CASE _eState OF
|
|
E_PackMLState.STOPPING:
|
|
_eState := E_PackMLState.STOPPED;
|
|
|
|
E_PackMLState.RESETTING:
|
|
_eState := E_PackMLState.IDLE;
|
|
|
|
E_PackMLState.STARTING:
|
|
_eState := E_PackMLState.EXECUTE;
|
|
|
|
E_PackMLState.SUSPENDING:
|
|
_eState := E_PackMLState.SUSPENDED;
|
|
|
|
E_PackMLState.UNSUSPENDING:
|
|
_eState := E_PackMLState.EXECUTE;
|
|
|
|
E_PackMLState.HOLDING:
|
|
_eState := E_PackMLState.HELD;
|
|
|
|
E_PackMLState.UNHOLDING:
|
|
_eState := E_PackMLState.EXECUTE;
|
|
|
|
E_PackMLState.COMPLETING:
|
|
IF (NOT stConfig.xCompletedDisabled)THEN
|
|
_eState := E_PackMLState.COMPLETED;
|
|
ELSE
|
|
IF (NOT stConfig.xResettingDisabled) THEN
|
|
_eState := E_PackMLState.RESETTING;
|
|
ELSE
|
|
_eState := E_PackMLState.IDLE;
|
|
END_IF
|
|
END_IF
|
|
|
|
E_PackMLState.ABORTING:
|
|
_eState := E_PackMLState.ABORTED;
|
|
|
|
E_PackMLState.CLEARING:
|
|
_eState := E_PackMLState.STOPPED;
|
|
END_CASE
|
|
|
|
eState := _eState;]]></ST>
|
|
</Implementation>
|
|
</Method>
|
|
</POU>
|
|
</TcPlcObject> |