Added first hmi interface implementation

This commit is contained in:
2026-02-19 00:20:05 +01:00
parent 0c40092d8f
commit a3ad956f0d
29 changed files with 591 additions and 240 deletions

View File

@@ -11,6 +11,9 @@ END_VAR
VAR_OUTPUT
xVacuumEnabled : BOOL;
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_Aligner;
END_VAR
VAR
xActivateVacuum AT %Q* : BOOL := FALSE;
xDeactivateVacuum AT %Q* : BOOL := TRUE;
@@ -22,9 +25,6 @@ VAR
_fbXAxis : FB_AxisPTP;
_fbYAxis : FB_AxisPTP;
_rXPosToGo : REAL;
_rYPosToGo : REAL;
_rtExecute : R_TRIG;
_xStartAlign : BOOL;
END_VAR
@@ -56,22 +56,10 @@ _fbYAxis(
// =============================
// Call isa88 base state machine
// =============================
SUPER^(stPackMLHMIInterface := THIS^.stPackMLHMIInterface);
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);
_rtExecute(CLK:= xExecute, Q=> _xStartAlign);
// Drei mal ausführen damit die Position genau ist
IF _xStartAlign THEN
_rXPosToGo := DINT_TO_REAL(diXOffset) * -0.001;
_rYPosToGo := ((DINT_TO_REAL(diYOffset) * 0.001) - 37.5) * -1;
IF (ABS(_rXPosToGo) < 10.0) AND (ABS(_rYPosToGo) < 10.0) AND (NOT _fbXAxis.xError) AND (NOT _fbYAxis.xError) THEN
_fbXAxis.M_MoveRel(lrRelDist := _rXPosToGo);
_fbYAxis.M_MoveRel(lrRelDist := _rYPosToGo);
END_IF
END_IF
// Handle enable disable vacuum command
xActivateVacuum := xEnableVacuum;
xDeactivateVacuum := (NOT xEnableVacuum);

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_Aligner" Id="{39b635fb-f58d-41f9-b477-6d52ee4f55cd}">
<Declaration><![CDATA[TYPE ST_HMI_Aligner :
STRUCT
stStationCmds : ST_HMI_PackML;
// Vacuum valve
stVacuumValve : ST_HMI_VALVE_DATA;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -10,13 +10,15 @@ VAR_INPUT
xReleaseManualMode : BOOL;
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
stHMIInterface : ST_Etcher_HMIInterface;
END_VAR
VAR_OUTPUT
xDoorOpen : BOOL;
xChuckClampOpen : BOOL;
xVacuumEnabled : BOOL;
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_Etcher;
END_VAR
VAR
_fbValveDoor : FB_Valve('Door');
_stValveDoorCfg : ST_ValveConfig := (
@@ -85,7 +87,7 @@ _fbValveDoor(
stValveConfig:= _stValveDoorCfg,
xReleaseManualMode:= FALSE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stDoorHMIInterface);
stHMIInterface:= stHMIInterface.stDoorValve);
// Chuck
@@ -102,7 +104,7 @@ _fbUnlockLeft(
stValveConfig:= _stValveUnlockLeftCfg,
xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stUnlockLeftHMIInterface);
stHMIInterface:= stHMIInterface.stChuckUnlockLeft);
_fbUnlockRight(
xAutomaticOpen:= xOpenChuckClamp,
@@ -110,7 +112,7 @@ _fbUnlockRight(
stValveConfig:= _stValveUnlockRightCfg,
xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stUnlockRightHMIInterface);
stHMIInterface:= stHMIInterface.stChuckUnlockRight);
_fbEjectFront(
xAutomaticOpen:= _tpEjectChuck.Q,
@@ -118,7 +120,7 @@ _fbEjectFront(
stValveConfig:= _stValveClampingFrontCfg,
xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stEjectFrontHMIInterface);
stHMIInterface:= stHMIInterface.stChuckEjectFront);
_fbEjectBack(
xAutomaticOpen:= _tpEjectChuck.Q,
@@ -126,12 +128,12 @@ _fbEjectBack(
stValveConfig:= _stValveEjectBackCfg,
xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stEjectBackHMIInterface);
stHMIInterface:= stHMIInterface.stChuckEjectBack);
xDisableVacuum := (NOT xEnableVacuum);
// Call base sm
SUPER^(stPackMLHMIInterface := THIS^.stPackMLHMIInterface);
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);
// Copy internal signals to output
xDoorOpen := _fbValveDoor.IsOpen;

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_Etcher_HMIInterface" Id="{b42cab98-5a22-4703-a464-a4d1f5cdc177}">
<Declaration><![CDATA[TYPE ST_Etcher_HMIInterface :
STRUCT
stDoorHMIInterface : ST_HMI_VALVE_DATA;
stUnlockLeftHMIInterface : ST_HMI_VALVE_DATA;
stUnlockRightHMIInterface : ST_HMI_VALVE_DATA;
stEjectFrontHMIInterface : ST_HMI_VALVE_DATA;
stEjectBackHMIInterface : ST_HMI_VALVE_DATA;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_Etcher" Id="{430b2000-fd60-4c23-be04-2ef93001007b}">
<Declaration><![CDATA[TYPE ST_HMI_Etcher :
STRUCT
stStationCmds : ST_HMI_PackML;
// Vacuum valve
stVacuumValve : ST_HMI_VALVE_DATA;
// Door valve
stDoorValve : ST_HMI_VALVE_DATA;
// Chuck unlock left valve
stChuckUnlockLeft : ST_HMI_VALVE_DATA;
// Chuck unlock right valve
stChuckUnlockRight : ST_HMI_VALVE_DATA;
// Chuck eject front valve
stChuckEjectFront : ST_HMI_VALVE_DATA;
// Chuck eject back valve
stChuckEjectBack: ST_HMI_VALVE_DATA;
// Unlock chuck command
stChuckUnlockCmd : ST_HMI_CONTROL_BUTTON;
// Lock chuck command
stChuckLockCmd : ST_HMI_CONTROL_BUTTON;
// Chuck eject command
stChuckEjectCmd : ST_HMI_CONTROL_BUTTON;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -7,38 +7,20 @@ VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_HVTester;
END_VAR
VAR
xOpenDoor1 AT %Q* : BOOL;
xOpenDoor2 AT %Q* : BOOL;
xCloseDoor1 AT %Q* : BOOL;
xCloseDoor2 AT %Q* : BOOL;
// Chamber is the big cylinder not the door
xOpenChamber1 AT %Q* : BOOL;
xOpenChamber2 AT %Q* : BOOL;
xCloseChamber1 AT %Q* : BOOL;
xCloseChamber2 AT %Q* : BOOL;
stDoorValve : FB_Valve('');
stTestChamberValve : FB_Valve('');
stReleaseChamberMovement : FB_Valve('');
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF xOpenChambers THEN
xOpenDoor1 := TRUE;
xOpenDoor2 := TRUE;
xCloseDoor1 := FALSE;
xCloseDoor2 := FALSE;
ELSE
xOpenDoor1 := FALSE;
xOpenDoor2 := FALSE;
xCloseDoor1 := TRUE;
xCloseDoor2 := TRUE;
END_IF
<ST><![CDATA[
// Call base sm
SUPER^(stPackMLHMIInterface := THIS^.stPackMLHMIInterface);]]></ST>
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_HVTester" Id="{2e5a3886-f38d-4b91-b83d-51766b9f5c82}">
<Declaration><![CDATA[TYPE ST_HMI_HVTester :
STRUCT
stStationCmds : ST_HMI_PackML;
// Door valve
stDoorValve : ST_HMI_VALVE_DATA;
// Test chamber open close valve
stTestChamberValve : ST_HMI_VALVE_DATA;
// Optional temperature setpoint
stTempSP : ST_HMI_ANALOG_VALUE;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,24 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_CoolPlate" Id="{629e3316-5d72-4e23-a03a-af14d37e58d6}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_CoolPlate
<POU Name="FB_Coolplate" Id="{629e3316-5d72-4e23-a03a-af14d37e58d6}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Coolplate
VAR_INPUT
rTempSetpoint : REAL := 25.0;
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HCPlateHMIInterface;
stHMIInterface : ST_HMI_Coolplate;
END_VAR
VAR
// Card inputs
stStatus AT %I* : ST_SerialStatus;
//abyDataIn AT %I* : ARRAY[0..21] OF BYTE;
abyDataIn AT %I* : ARRAY[0..21] OF BYTE;
// Card outputs
stCtrl AT %Q* : ST_SerialCrl;
abyDataOut AT %Q* : ARRAY[0..21] OF BYTE;
_fbTempSensor : FB_AnalogInput('');
// Internal temp setpoint
_rTempSetpoint : REAL;
@@ -32,7 +34,7 @@ END_VAR
<Implementation>
<ST><![CDATA[// Clamp temperature settings
// Currently only controlled throught hmi interface
_rTempSetpoint := stHMIInterface.rSetpoint;
_rTempSetpoint := stHMIInterface.stSetpoint.rValue;
IF _rTempSetpoint > 60.0 THEN
_rTempSetpoint := 60.0;
@@ -62,10 +64,9 @@ IF stStatus.bTransmitAccepted THEN
stCtrl.bTransmitRequest := 0;
END_IF
// Debug test
IF stHMIInterface.xEnable THEN
stHMIInterface.xEnable := FALSE;
M_SetTemp(rTemp := _rTempSetpoint);
IF stHMIInterface.stSetSetpointBtn.xRequest THEN
stHMIInterface.stSetSetpointBtn.xRequest := FALSE;
M_SetTemp(rTemp := stHMIInterface.stSetpoint.rValue);
_xSend := TRUE;
END_IF]]></ST>
</Implementation>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_HotPlate" Id="{317a2373-f886-4e32-b683-81b726d00aac}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_HotPlate
<POU Name="FB_Hotplate" Id="{317a2373-f886-4e32-b683-81b726d00aac}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Hotplate EXTENDS FB_PackMLGeneric
VAR_INPUT
xEnable : BOOL;
rTargetTemp : REAL;
@@ -14,7 +14,7 @@ VAR_OUTPUT
uiNextReadySlot : UINT;
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HCPlateHMIInterface;
stHMIInterface : ST_HMI_Hotplate;
END_VAR
VAR
xEnableHotplate AT %Q* : BOOL;
@@ -41,10 +41,25 @@ VAR
_fbPITempControl : FB_PI;
_fbLimit : FB_Limit;
_fbPWMOut : FB_PWM;
_xEnable : BOOL;
_xFirstCycle : BOOL := TRUE;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Call sensor fbs
<ST><![CDATA[IF _xFirstCycle THEN
_xFirstCycle := FALSE;
stHMIInterface.stSetpoint.rMin := 0;
stHMIInterface.stSetpoint.rMax := 140.0;
stHMIInterface.stSetpoint.sUnit := '°C';
stHMIInterface.stSetpoint.sName := 'Temp. Hotplate';
END_IF
A_HandleHMIInput();
// Call sensor fbs
_fbTempSensor(
stAnalogIOConfig:= _stTempSensorConfig,
stAnalogEWConfig:= _stTempSEnsorEWConfig,
@@ -52,24 +67,15 @@ _fbTempSensor(
xReleaseLimitErrors:= FALSE,
xReleaseHardwareErrors:= TRUE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> );
// Clamp HMI Setpoint
IF stHMIInterface.rSetpoint > 140.0 THEN
stHMIInterface.rSetpoint := 140;
END_IF
IF stHMIInterface.rSetpoint < 0.0 THEN
stHMIInterface.rSetpoint := 0.0;
END_IF
stHMIInterface=> stHMIInterface.stPV);
// For now get setpoint from HMI interface
_fbPITempControl(
rSP:= stHMIInterface.rSetpoint,
rSP:= stHMIInterface.stSetpoint.rValue,
rPV:= _fbTempSensor.rScaledValue,
rKp:= 6,
rTn:= 0,
xEnable:= stHMIInterface.xEnable,
xEnable:= _xEnable,
rMV=> _fbLimit.rIn);
_fbLimit(
@@ -83,10 +89,36 @@ _fbPWMOut(
timPeriod:= T#100MS,
xOutput=> xEnableHotplate);
// Output HMI Interface
stHMIInterface.rPV := _fbTempSensor.rScaledValue;
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);
]]></ST>
</Implementation>
<Action Name="A_HandleHMIInput" Id="{d22cec08-4a88-4001-b04b-e7a9775ff9a8}">
<Implementation>
<ST><![CDATA[// Clamp HMI Setpoint
IF stHMIInterface.stSetpoint.rValue > 140.0 THEN
stHMIInterface.stSetpoint.rValue := 140;
END_IF
IF stHMIInterface.stSetpoint.rValue < 0.0 THEN
stHMIInterface.stSetpoint.rValue := 0.0;
END_IF]]></ST>
</Implementation>
</Action>
<Method Name="FB_Init" Id="{b45cedd9-9c6c-4658-b56c-da5577886b8f}">
<Declaration><![CDATA[//FB_Init is always available implicitly and it is used primarily for initialization.
//The return value is not evaluated. For a specific influence, you can also declare the
//methods explicitly and provide additional code there with the standard initialization
//code. You can evaluate the return value.
METHOD FB_Init: BOOL
VAR_INPUT
bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
bInCopyCode: BOOL; // TRUE: the instance will be copied to the copy code afterward (online change)
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_AddItem" Id="{9707459a-6558-487c-b730-c9dc92d598ed}">
<Declaration><![CDATA[METHOD M_AddItem
VAR_INPUT

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<GVL Name="GVL_HeatCoolConfig" Id="{865917de-a2fa-49b0-b682-05395fd01971}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'naming' := 'off'}
{attribute 'analysis' := '-43'}
VAR_GLOBAL CONSTANT
HEAT_COOL_PLATES_NUM_SLOTS : UINT := 9;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HCPlateHMIInterface" Id="{cc97f396-14fe-4cf1-8a0f-254b86749233}">
<Declaration><![CDATA[TYPE ST_HCPlateHMIInterface :
STRUCT
xEnable : BOOL;
rSetpoint : REAL;
rPV : REAL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HCStationHMIInterface" Id="{2459de16-cb2e-4745-be67-cc251c8b91cf}">
<Declaration><![CDATA[TYPE ST_HCStationHMIInterface :
STRUCT
stHotplateHMIInterface : ST_HCPlateHMIInterface;
stCoolplateHMIInterface : ST_HCPlateHMIInterface;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_Coolplate" Id="{0ae5281c-4f55-43f7-9c76-f3b88f84f743}">
<Declaration><![CDATA[TYPE ST_HMI_Coolplate :
STRUCT
stStationCmds : ST_HMI_PackML;
// Setpoint
stSetpoint : ST_HMI_ANALOG_VALUE;
// Set setpoint
stSetSetpointBtn : ST_HMI_CONTROL_BUTTON;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_Hotplate" Id="{ab37d0f5-58b8-40e5-b7d2-1ab669f4a063}">
<Declaration><![CDATA[TYPE ST_HMI_Hotplate :
STRUCT
stStationCmds : ST_HMI_PackML;
// Setpoint
stSetpoint : ST_HMI_ANALOG_VALUE;
// Process value
stPV : ST_HMI_ANALOG_VALUE;
// Enable button
stEnableBtn : ST_HMI_CONTROL_BUTTON;
// Disable button
stDisableBtn : ST_HMI_CONTROL_BUTTON;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -23,6 +23,9 @@ VAR_OUTPUT
xReady : BOOL;
xError : BOOL;
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_Kuka;
END_VAR
VAR
// 0 - Nicht aus
// 1 - Enable
@@ -142,7 +145,7 @@ _xRobotReady := stState.bExt
// =============================
// Call isa88 base state machine
// =============================
SUPER^(stPackMLHMIInterface := THIS^.stPackMLHMIInterface);
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);
// ==============================

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_Kuka" Id="{d33ceec3-928d-4488-9aec-30598b609ff5}">
<Declaration><![CDATA[TYPE ST_HMI_Kuka :
STRUCT
stStationCmds : ST_HMI_PackML;
// Job parameter
stJobParams : ST_KukaRobot_JobParams;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -6,16 +6,16 @@ STRUCT
// Robot job number
eJob : E_KukaRobot_JobNumberRobot;
// Position in x in mm
// Pick/Place position in x in mm
rPosX : REAL := 78;
// Position in y in mm
// Pick/Place Position in y in mm
rPosY : REAL := 88;
// Substrate thickness in mm
rThickness : REAL := 2.7;
// Gripper side (1 or 2)
// Gripper side (1 - 6)
byGripperSide : BYTE := 3;
// Scan QR Code during pickup from loading station

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_NOK" Id="{a2df56e9-efea-40aa-988c-7d0f04448d9f}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_NOK EXTENDS FB_PackMLGeneric
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_NOK;
END_VAR
VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_NOK" Id="{d259a86f-52c2-4bdd-8153-d79adfe6f6fe}">
<Declaration><![CDATA[TYPE ST_HMI_NOK :
STRUCT
stStationCmds : ST_HMI_PackML;
// Clamp trays diagonal
stClampDiagValve : ST_HMI_VALVE_DATA;
// Clamp try across
stClampAcrossValve : ST_HMI_VALVE_DATA;
// Clamp command
stClampCmd : ST_HMI_CONTROL_BUTTON;
// Unclamp command
stUnclampCmd : ST_HMI_CONTROL_BUTTON;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -8,6 +8,9 @@ VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
stHMIInterface : ST_HMI_TrayFeeder;
END_VAR
VAR
_sIpAddr : STRING(15);
_udiPort : UDINT;
@@ -34,7 +37,7 @@ _fbProtocolHandler(
xError=> );
// Call isa88 base state machine
SUPER^(stPackMLHMIInterface := THIS^.stPackMLHMIInterface);]]></ST>
SUPER^(stPackMLHMIInterface := stHMIInterface.stStationCmds);]]></ST>
</Implementation>
<Method Name="FB_init" Id="{6c7048d9-3836-4289-b5f3-f8878267494f}">
<Declaration><![CDATA[//FB_Init ist immer implizit verfügbar und wird primär für die Initialisierung verwendet.

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_HMI_TrayFeeder" Id="{4414491b-4072-41e7-8d0d-7bcf44378912}">
<Declaration><![CDATA[TYPE ST_HMI_TrayFeeder :
STRUCT
stStationCmds : ST_HMI_PackML;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>