PS_UnitModeManager
Packaging machines have different unit modes and not only the "automatic" mode. Each unit mode is defined by its own state model. A "Mode Manager" must be defined for transitions between the modes. The "Mode Manager" determines how and in which state a machine can change unit modes; i.e. built-in barriers prevent the machine from changing to unsuitable states.
See figure below as an example.
| |
Adhere to proper mode changes The logic for transitions between modes depends on the application, especially for transitions between manual, semi-automatic and automatic modes. In addition, hardware barriers or safety equipment may be necessary for such mode changes. The responsibility for proper mode changes lies with whoever implements them. |

Inputs
VAR_INPUT
Execute : BOOL;
eModeCommand : E_PMLUnitMode;
ePMLState : E_PMLState;
END_VAR
Name | Type | Description |
---|---|---|
Execute | BOOL | Mode change on rising edge. |
eModeCommand | E_PMLUnitMode | Requested unit mode (E_PMLUnitMode) |
ePMLState | E_PMLState | Current PML state of the current mode (E_PMLState) |
Inputs/Outputs
VAR_IN_OUT
Machine_ID : MACHINE_REF; (* Identifies the axis which position shall be latched at the trigger event *)
END_VAR
Name | Type | Description |
---|---|---|
Machine_ID | MACHINE_REF | Identification of the machine executed by the state model |
Outputs
VAR_OUTPUT
eModeStatus : E_PMLUnitMode;
Done : BOOL;
Error : BOOL;
ErrorID : UDINT;
END_VAR
Name | Type | Description |
---|---|---|
eModeStatus | E_PMLUnitMode | Current unit mode (E_PMLUnitMode) |
Done | BOOL | True if mode change was successful. |
Error | BOOL | Signals an error in the function block, e.g. "Mode change not permitted". |
ErrorID | UDINT | If the error output is set, this parameter returns the error number. |
Implementation
Mode change is limited to certain modes, see implementation below.
![]() | Not all modes are implemented yet. |
rTrig(CLK:= Execute);
IF rTrig.Q THEN
Done := FALSE;
Error := FALSE;
ErrorID := 0;
CASE eModeStatus OF
ePMLUnitMode_AUTOMATIC:
IF (ePMLState = ePMLState_STOPPED) OR (ePMLState = ePMLState_ABORTED) OR (ePMLState = ePMLState_IDLE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSIF ((ePMLState = ePMLState_SUSPENDED) OR (ePMLState = ePMLState_HELD) OR (ePMLState = ePMLState_COMPLETE))
AND (eModeCommand = ePMLUnitMode_SEMIAUTOMATIC) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSIF (ePMLState = ePMLState_HELD) AND (eModeCommand = ePMLUnitMode_MAINTENANCE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSE
Error := TRUE;
ErrorID := 1;
END_IF
ePMLUnitMode_MAINTENANCE:
IF (ePMLState = ePMLState_STOPPED) OR (ePMLState = ePMLState_ABORTED) OR (ePMLState = ePMLState_IDLE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSIF (ePMLState = ePMLState_HELD) AND ((eModeCommand = ePMLUnitMode_AUTOMATIC) OR (eModeCommand = ePMLUnitMode_SEMIAUTOMATIC)) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSE
Error := TRUE;
ErrorID := 1;
END_IF
ePMLUnitMode_MANUAL:
IF (ePMLState = ePMLState_STOPPED) OR (ePMLState = ePMLState_ABORTED) OR (ePMLState = ePMLState_IDLE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSE
Error := TRUE;
ErrorID := 1;
END_IF
ePMLUnitMode_SEMIAUTOMATIC:
IF (ePMLState = ePMLState_STOPPED) OR (ePMLState = ePMLState_ABORTED) OR (ePMLState = ePMLState_IDLE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSIF ((ePMLState = ePMLState_SUSPENDED) OR (ePMLState = ePMLState_HELD) OR (ePMLState = ePMLState_COMPLETE))
AND (eModeCommand = ePMLUnitMode_AUTOMATIC) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSIF (ePMLState = ePMLState_HELD) AND (eModeCommand = ePMLUnitMode_MAINTENANCE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSE
Error := TRUE;
ErrorID := 1;
END_IF
ePMLUnitMode_IDLE:
IF (ePMLState = ePMLState_STOPPED) OR (ePMLState = ePMLState_ABORTED) OR (ePMLState = ePMLState_IDLE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSE
Error := TRUE;
ErrorID := 1;
END_IF
ePMLUnitMode_ESTOP:
IF (ePMLState = ePMLState_STOPPED) OR (ePMLState = ePMLState_ABORTED) OR (ePMLState = ePMLState_IDLE) THEN
eModeStatus := eModeCommand;
Done := TRUE;
ELSE
Error := TRUE;
ErrorID := 1;
END_IF
ELSE
eModeStatus := eModeCommand;
Done := TRUE;
END_CASE
END_IF
Requirements
Development environment |
Target system type |
PLC libraries to be linked |
---|---|---|
TwinCAT v3.1, build 4018 onwards |
PC (i386) |
Tc3_PackML |