Files
infineon_plc/PLC/LibraryCandidates/PackML/FB_PackMLStateMachine.TcPOU
Matthias Heisig 3946e45c65 Changed from ISA88 to PackML
- Added PackML Base FB's
- Added Unit Tests for PackML Base State Machine
- Added Robot job numbers according to new interface
- Added PLC job number for robot to call according to new interface
- Change Robot to PackML interface
2026-01-23 22:55:49 +01:00

244 lines
5.3 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;
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;
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
// 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;]]></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.EXECUTE:
_eState := E_PackMLState.COMPLETING;
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:
_eState := E_PackMLState.COMPLETE;
E_PackMLState.ABORTING:
_eState := E_PackMLState.ABORTED;
E_PackMLState.CLEARING:
_eState := E_PackMLState.STOPPED;
END_CASE
eState := _eState;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>