Started kuka robot integration with hardware

- 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
This commit is contained in:
2026-01-30 09:09:30 +01:00
parent 3946e45c65
commit 67ba80893f
44 changed files with 2006 additions and 1366 deletions

View File

@@ -0,0 +1,428 @@
<?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>