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

@@ -8,8 +8,23 @@ VAR
_fbEtcher1 : FB_Etcher;
_fbEtcher2 : FB_Etcher;
_stRobotCmd : ST_PMLc;
_xConfirmAlarms : BOOL;
_xClear : BOOL;
_xReset : BOOL;
_xStart : BOOL;
_stRobotStatus : ST_PMLs;
_stRobotAdmin : ST_PMLa;
_xFirstCycle : BOOL := TRUE;
_stRecipeGripperChange : ST_PackMLRecipe := (
diID := 0,
sName := 'Change gripper'
);
END_VAR
]]></Declaration>
<Implementation>
@@ -17,18 +32,52 @@ END_VAR
_xFirstCycle := FALSE;
END_IF
_fbRobot(xExecute:= , eCMD:= , eCurrentState=> , eCurrentCMD=> );
IF _xClear THEN
_xClear := FALSE;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.CLEAR;
_stRobotCmd.xCmdChangeRequest := TRUE;
END_IF
IF _xReset THEN
_xReset := FALSE;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.RESET;
_stRobotCmd.xCmdChangeRequest := TRUE;
END_IF
IF _xStart THEN
_xStart := FALSE;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.START;
_stRobotCmd.xCmdChangeRequest := TRUE;
END_IF
_fbRobot(
stCommand:= _stRobotCmd,
xReleaseAlarms:= TRUE,
xConfirmAlarms:= _xConfirmAlarms,
stStatus => _stRobotStatus,
stAdmin => _stRobotAdmin,
xReady=> ,
xError=> );
IF _stRobotCmd.xCmdChangeRequest THEN
_stRobotCmd.xCmdChangeRequest := FALSE;
END_IF
_fbHVTester(xOpenChambers:= GVL_SCADA.xOpenAllChambers);
_fbEtcher1(xOpenDoor:= GVL_SCADA.xOpenAllChambers);
_fbEtcher2(xOpenDoor:= GVL_SCADA.xOpenAllChambers);
// Call safety program
PRG_Safety(xConfirmAlarms := GVL_SCADA.xErrAck);
// Reset alarm reset request
GVL_SCADA.xErrAck := FALSE;]]></ST>
GVL_SCADA.xErrAck := FALSE;
IF _xConfirmAlarms THEN
_xConfirmAlarms := FALSE;
END_IF]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -59,7 +59,9 @@ TYPE E_KukaRobot_JobNumberRobot :
PUT_CHUCK_ETCHER1 := 62,
PUT_CHUCK_ETCHER2 := 63,
PUT_CHUCK_INTO_MAGAZINE := 64,
GET_CHUCK_FROM_MAGAZINE := 65
GET_CHUCK_FROM_MAGAZINE := 65,
WARMUP := 80
) WORD := NO_JOB;
END_TYPE
]]></Declaration>

View File

@@ -4,6 +4,9 @@
<Declaration><![CDATA[// Positionen in um <=> 0.001mm
FUNCTION_BLOCK FINAL FB_KukaRobot EXTENDS FB_PackMLGeneric
VAR_INPUT
eRobotJob : E_KukaRobot_JobNumberRobot;
xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
@@ -56,13 +59,16 @@ VAR
_xError : BOOL;
// ======
// Alarms
// ======
_fbAlarmNotInExtMode : FB_AlarmMessage(stEventEntry := TC_EVENTS.RobotEvents.RobotNotInExtMode, xWithConfirmation := FALSE);
_fbAlarmEStopActive : FB_AlarmMessage(stEventEntry := TC_EVENTS.RobotEvents.RobotEStopActive, xWithConfirmation := FALSE);
_fbAlarmOperatorSafetyNotOk : FB_AlarmMessage(stEventEntry := TC_EVENTS.RobotEvents.OperatorSafetyNotOk, xWithConfirmation := FALSE);
_fbAlarmNotInExtMode : FB_AlarmMessage(stEventEntry := TC_EVENTS.KukaRobot.NotInExtMode, xWithConfirmation := FALSE);
_fbAlarmEStopActive : FB_AlarmMessage(stEventEntry := TC_EVENTS.KukaRobot.EStopActive, xWithConfirmation := FALSE);
_fbAlarmOperatorSafetyNotOk : FB_AlarmMessage(stEventEntry := TC_EVENTS.KukaRobot.OperatorSafetyNotOk, xWithConfirmation := FALSE);
_fbAlarmRobotErrorResetTimeout : FB_AlarmMessage(stEventEntry := TC_EVENTS.KukaRobot.ErrorResetTimeout, xWithConfirmation := TRUE);
_fbAlarmDrivesEnableTimeout : FB_AlarmMessage(stEventEntry := TC_EVENTS.KukaRobot.DrivesEnableTimeout, xWithConfirmation := TRUE);
END_VAR
]]></Declaration>
<Implementation>
@@ -91,12 +97,22 @@ _fbAlarmOperatorSafetyNotOk(
timOnDelay:= T#0S,
timOffDelay:= T#0S);
// Handled by M_Resetting
_fbAlarmDrivesEnableTimeout(
xRelease:= xReleaseAlarms,
xAcknowledge:= xConfirmAlarms);
// Handled by M_Resetting
_fbAlarmRobotErrorResetTimeout(
xRelease:= xReleaseAlarms,
xAcknowledge:= xConfirmAlarms);
// =======================
// Check if robot is ready
// =======================
_xRobotReady := _uState.stState.bExt
_xRobotReady := _uState.stState.bExt
AND _uState.stState.bAlarmStop
AND _uState.stState.bUserSAF
AND _uState.stState.bPeriRdy
@@ -118,9 +134,7 @@ SUPER^();
_uCtrl.stCtrl.bNotDisableAxes := 1;
// Disable move if in T2 for safety reasons
IF (NOT _uState.stState.bT2) THEN
_uCtrl.stCtrl.bEnableMove := 1;
ELSE
IF _uState.stState.bT2 THEN
_uCtrl.stCtrl.bEnableMove := 0;
END_IF
@@ -129,8 +143,8 @@ END_IF
// Write job outputs
// ==================
_uJobs.stJobs.wJobNrForRobot := _eRobotJob;
_uJobs.stJobs.wFinishedJobNrFromPlc := _ePlcJob;
//_uJobs.stJobs.wJobNrForRobot := _eRobotJob;
//_uJobs.stJobs.wFinishedJobNrFromPlc := _ePlcJob;
// =================
@@ -140,15 +154,225 @@ _uJobs.stJobs.wFinishedJobNrFromPlc := _ePlcJob;
xReady := _xRobotReady;
xError := _xError;]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{71a3f6f0-d3bb-4348-acc7-be533d7488d2}">
<Declaration><![CDATA[//FB_Init ist immer implizit verfügbar und wird primär für die Initialisierung verwendet.
//Der Rückgabewert wird nicht ausgewertet. Für gezielte Einflussnahme können Sie
//die Methoden explizit deklarieren und darin mit dem Standard-Initialisierungscode
//zusätzlichen Code bereitstellen. Sie können den Rückgabewert auswerten.
METHOD FB_Init: BOOL
VAR_INPUT
bInitRetains: BOOL; // TRUE: Die Retain-Variablen werden initialisiert (Reset warm / Reset kalt)
bInCopyCode: BOOL; // TRUE: Die Instanz wird danach in den Kopiercode kopiert (Online-Change)
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_stSMConfig.xStoppingDisabled := TRUE;
_stSMConfig.xCompletingDisabled := TRUE;
_stSMConfig.xCompletedDisabled := TRUE;
_stSMConfig.xAbortingDisabled := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="M_Aborted" Id="{0c0c17ce-5c1c-4640-9d39-f25b22309d5d}">
<Declaration><![CDATA[METHOD M_Aborted
]]></Declaration>
<Implementation>
<ST><![CDATA[// Reset all relevant robot control signals
_uCtrl.stCtrl.bConfMess := 0;
_uCtrl.stCtrl.bExtStart := 0;
_uCtrl.stCtrl.bEnableAxes := 0;
_uCtrl.stCtrl.bEnableMove := 0;
_uCtrl.stCtrl.bNotDisableAxes := 1;
_uCtrl.stCtrl.bAbortJob := 1;
// Reset robot program and plc job number
_uJobs.stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
_uJobs.stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumerPLC.NO_JOB;]]></ST>
</Implementation>
</Method>
<Method Name="M_Clearing" Id="{e6152288-8c7d-4b38-bfbc-4f861d76ccc5}">
<Declaration><![CDATA[METHOD M_Clearing
VAR_INST
_tonWait : TON;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_tonWait(IN := TRUE, PT := T#1S);
_uCtrl.stCtrl.bEnableMove := 1;
_uCtrl.stCtrl.bAbortJob := 0;
IF _tonWait.Q THEN
_tonWait(IN := FALSE, PT := T#1S);
M_StateComplete();
END_IF
]]></ST>
</Implementation>
</Method>
<Method Name="M_Execute" Id="{bc86876c-a8db-4285-b95c-7c6858a2ca66}">
<Declaration><![CDATA[METHOD M_Execute
]]></Declaration>
<Implementation>
<ST><![CDATA[// Wait for robot to be done
IF _awJobStatesFromRobot[0] = 0 THEN
_eCmd := E_PackMLCmd.COMPLETE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Held" Id="{22ddbad0-0b66-427e-a2aa-f177f8adbc94}">
<Declaration><![CDATA[METHOD M_Held
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Holding" Id="{ff8c2c8e-1fe0-4c63-ad7b-790d72bd9217}">
<Declaration><![CDATA[METHOD M_Holding
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Idle" Id="{025437ab-beb0-4ad6-bdc3-468dec599ff4}">
<Declaration><![CDATA[METHOD M_Idle
]]></Declaration>
<Implementation>
<ST><![CDATA[
]]></ST>
</Implementation>
</Method>
<Method Name="M_Resetting" Id="{dfe4d36a-80aa-4364-bfd8-6ddd41636d59}">
<Declaration><![CDATA[METHOD M_Resetting
VAR_INST
_tonTimeout : TON;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_tonTimeout(PT := T#10S);
CASE _iSSM OF
0:
_uCtrl.stCtrl.bEnableAxes := 1;
_tonTimeout.IN := TRUE;
// Wait for drives to be ready
IF _uState.stState.bPeriRdy THEN
_uCtrl.stCtrl.bEnableAxes := 0;
_tonTimeout(IN := FALSE);
_iSSM := 10;
END_IF
// Timeout drives ready
IF _tonTimeout.Q THEN
_uCtrl.stCtrl.bEnableAxes := 0;
_fbAlarmDrivesEnableTimeout.xRelease := TRUE;
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
END_IF
10:
_uCtrl.stCtrl.bConfMess := 1;
_tonTimeout.IN := TRUE;
// Wait for errors to be reset
IF (NOT _uState.stState.bStopMess) THEN
_uCtrl.stCtrl.bConfMess := 0;
_tonTimeout(IN := FALSE);
_iSSM := 20;
END_IF
// Timeout reset errors
IF _tonTimeout.Q THEN
_fbAlarmRobotErrorResetTimeout.xRelease := TRUE;
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
END_IF
20:
// Start main program
_uCtrl.stCtrl.bExtStart := 1;
_tonTimeout.IN := TRUE;
IF _tonTimeout.Q THEN
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
END_IF
IF _uState.stState.bProAct THEN
_uCtrl.stCtrl.bExtStart := 0;
_tonTimeout(IN := FALSE);
M_StateComplete();
END_IF
END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="M_Starting" Id="{011f85d8-1225-4288-876f-918df6e4f235}">
<Declaration><![CDATA[METHOD M_Starting
]]></Declaration>
<Implementation>
<ST><![CDATA[// Write robot job number
_uJobs.stJobs.wJobNrForRobot := DINT_TO_WORD(_stRecipe.stProcessVariables.astParameterDInt[0].Value);
// Gripper number
_abToolsAndPositions[0] := DINT_TO_BYTE(_stRecipe.stProcessVariables.astParameterDInt[1].Value);
// If job number is read back correct, go to next state
IF _awJobStatesFromRobot[0] = _uJobs.stJobs.wJobNrForRobot THEN
_uJobs.stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
M_StateComplete();
END_IF
// Wrong job read back from robot -> Abort
// IF _awJobStatesFromRobot[0] <> 0 AND _awJobStatesFromRobot[0] <> E_KukaRobot_JobNumberRobot.WARMUP THEN
// _eCmd := E_PackMLCmd.ABORT;
// END_IF
//
// // Robot has error
// IF _dwErrorBits <> 0 THEN
// _eCmd := E_PackMLCmd.ABORT;
// END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Stopped" Id="{50813767-4bd7-4147-b5dc-1bbd18ae1555}">
<Declaration><![CDATA[METHOD M_Stopped
]]></Declaration>
<Implementation>
<ST><![CDATA[_uCtrl.stCtrl.bConfMess := 0;
_uCtrl.stCtrl.bEnableAxes := 0;
_uCtrl.stCtrl.bNotDisableAxes := 1;
_uCtrl.stCtrl.bExtStart := 0;
_eRobotJob := E_KukaRobot_JobNumberRobot.NO_JOB;
_ePlcJob := E_KukaRobot_JobNumerPLC.NO_JOB;
]]></ST>
_ePlcJob := E_KukaRobot_JobNumerPLC.NO_JOB;]]></ST>
</Implementation>
</Method>
<Method Name="M_Suspended" Id="{c2db015c-1cd0-491a-8ce6-6c0bffba7631}">
<Declaration><![CDATA[METHOD M_Suspended
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Suspending" Id="{5b0e5227-d5bb-40c6-a1b8-8e81b852b9b9}">
<Declaration><![CDATA[METHOD M_Suspending
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Unholding" Id="{786f4949-9630-4ace-9e30-65bea4e87cb2}">
<Declaration><![CDATA[METHOD M_Unholding
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Unsuspending" Id="{d7ce33fd-cd94-44f1-9289-25a3ab3829eb}">
<Declaration><![CDATA[METHOD M_Unsuspending
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
</POU>

View File

@@ -13,8 +13,21 @@ STRUCT
// MOVE_ENABLE
bEnableMove : BIT;
// EXT_START
bExtStart : BIT;
// CONF_MESS
bConfMess : BIT;
// Dummy bits
bDummy1 : BIT;
bDummy2 : BIT;
bDummy3 : BIT;
bDummy4 : BIT;
// Abort job with rising edge
bAbortJob : BIT;
END_STRUCT
END_TYPE
]]></Declaration>

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<GlobalTextList Name="GlobalTextList" Id="{71e616d8-9f28-44f9-85e4-c09f140a97bd}">
<XmlArchive>
<Data>
<o xml:space="preserve" t="GlobalTextListObject">
<l n="TextList" t="ArrayList" cet="TextListRow">
<o>
<v n="TextID">"134"</v>
<v n="TextDefault">"Rest"</v>
<l n="LanguageTexts" t="ArrayList" />
</o>
</l>
<l n="Languages" t="ArrayList" />
<v n="GuidInit">{70dbd3f8-6154-4749-9cca-681da551cf9b}</v>
<v n="GuidReInit">{7f241e67-9115-442d-b41b-9dac33ba1617}</v>
<v n="GuidExitX">{db2ea5fe-8596-4215-8845-f46ef9e4d4dc}</v>
</o>
</Data>
<TypeList>
<Type n="ArrayList">System.Collections.ArrayList</Type>
<Type n="GlobalTextListObject">{63784cbb-9ba0-45e6-9d69-babf3f040511}</Type>
<Type n="Guid">System.Guid</Type>
<Type n="String">System.String</Type>
<Type n="TextListRow">{53da1be7-ad25-47c3-b0e8-e26286dad2e0}</Type>
</TypeList>
</XmlArchive>
</GlobalTextList>
</TcPlcObject>

View File

@@ -23,7 +23,7 @@ TYPE E_PackMLState :
UNSUSPENDING := 14,
RESETTING := 15,
COMPLETING := 16,
COMPLETE := 17
COMPLETED := 17
) DINT := STOPPED;
END_TYPE
]]></Declaration>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PMLa" Id="{16746b45-38ff-4f58-95c8-eb6734adb976}">
<Declaration><![CDATA[TYPE ST_PMLa :
STRUCT
astProductData : ARRAY[0..(GVL_PackML_Conf.MAX_PRODUCT_DATA-1)] OF ST_PackML_ProductData;
diStopReason : DINT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PMLc" Id="{5cf4c850-57ba-42f8-9986-b146207e1b2f}">
<Declaration><![CDATA[TYPE ST_PMLc :
STRUCT
eUnitMode : E_PackMLUnitMode;
xUnitModeChangeRequest : BOOL;
rMachSpeed : REAL;
eCntrlCmd : E_PackMLCmd;
xCmdChangeRequest : BOOL;
// Parameters
astParameterReal : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamREAL;
astParameterString : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamSTRING;
astParameterLReal : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamLREAL;
astParameterDInt : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamDINT;
// Recipe data
diSelectedRecipe : DINT;
xRecipeChangeRequest : BOOL;
astRecipe : ARRAY[0..(GVL_PackML_Conf.MAX_RECIPES_PER_UNIT - 1)] OF ST_PackMLRecipe;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PMLs" Id="{dace328e-4599-42b5-ac3b-2a705ec8e2f3}">
<Declaration><![CDATA[TYPE ST_PMLs :
STRUCT
eUnitModeCurrent : E_PackMLUnitMode;
eStateCurrent : E_PackMLState;
rMachSpeed : REAL;
rCurMachSpeed : REAL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLPI" Id="{e7198eb6-2cd3-41c0-be59-e7dbcf10a569}">
<Declaration><![CDATA[TYPE ST_PackMLPI :
STRUCT
astParameterReal : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamREAL;
astParameterString : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamSTRING;
astParameterLReal : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamLREAL;
astParameterDInt : ARRAY[0..(GVL_PackML_Conf.MAX_PARAMS-1)] OF ST_PackMLParamDINT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLParamDINT" Id="{f9801bf5-a73d-450f-b9fc-a5d8229e4946}">
<Declaration><![CDATA[TYPE ST_PackMLParamDINT :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
Value : DINT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLParamLREAL" Id="{195fabe8-44c0-43ec-8434-75e38b68efb7}">
<Declaration><![CDATA[TYPE ST_PackMLParamLREAL :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
Value : LREAL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLParamREAL" Id="{373303ba-9979-4979-a439-c899a36baa12}">
<Declaration><![CDATA[TYPE ST_PackMLParamREAL :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
Value : REAL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLParamSTRING" Id="{85353d3e-e4c9-4e83-857e-8ce7ed43abaf}">
<Declaration><![CDATA[TYPE ST_PackMLParamSTRING :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
Value : STRING;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLRecipe" Id="{b453a4b5-bb40-4669-97f2-8d8ab8d3dc26}">
<Declaration><![CDATA[TYPE ST_PackMLRecipe :
STRUCT
diID : DINT;
sName : STRING;
rPrimaryQty : REAL;
stProcessVariables : ST_PackMLPI;
stIngredients : ST_PackMLPI;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackML_ProductData" Id="{2af30e31-0927-41d2-9df4-7ed222070c13}">
<Declaration><![CDATA[TYPE ST_PackML_ProductData :
STRUCT
diProcessedCount : DINT;
diDefectiveCount : DINT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLStateMachineConfig" Id="{ced5a276-0ad8-4ce9-8d27-4b268a010876}">
<Declaration><![CDATA[TYPE ST_PackMLStateMachineConfig :
STRUCT
xClearingDisabled : BOOL;
// xStoppedDisabled : BOOL;
xStartingDisabled : BOOL;
// xIdleDisabled : BOOL;
xSuspededDisabled : BOOL;
// xExecuteDisabled : BOOL;
xStoppingDisabled : BOOL;
xAbortingDisabled : BOOL;
// xAbortedDisabled : BOOL;
xHoldingDisabled : BOOL;
xHeldDisabled : BOOL;
xUnholdingDisabled : BOOL;
xSuspendingDisabled : BOOL;
xUnsuspendingDisabled : BOOL;
xResettingDisabled : BOOL;
xCompletingDisabled : BOOL;
xCompletedDisabled : BOOL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

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

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<GVL Name="GVL_PackML_Conf" Id="{b46d8e14-5a19-467d-bb78-56321e43ef47}">
<Declaration><![CDATA[{attribute 'qualified_only'}
VAR_GLOBAL CONSTANT
MAX_PARAMS : UINT := 10;
MAX_PRODUCT_DATA : UINT := 10;
MAX_RECIPES_PER_UNIT : UINT := 5;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

View File

@@ -3,39 +3,90 @@
<POU Name="FB_PackMLGeneric" Id="{f562a10e-01bc-407d-9fc0-2837d13c10b1}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PackMLGeneric IMPLEMENTS I_UnitState
VAR_INPUT
// Mode from superior unit
eModeCmd : E_PackMLUnitMode;
// Command for new state from superior unit
eCmd : E_PackMLCmd;
stCommand : ST_PMLc;
END_VAR
VAR_OUTPUT
// Current mode of unit
eMode : E_PackMLUnitMode;
// Unit status
stStatus : ST_PMLs;
// Current state of unit
eState : E_PackMLState;
// xInvalidModeCmd : BOOL;
// Admin data
stAdmin : ST_PMLa;
END_VAR
VAR
// State machine handler
_fbStateMachine : FB_PackMLStateMachine;
_fbStateMachine : FB_PackMLStateMachine;
// State machine config
_stSMConfig : ST_PackMLStateMachineConfig;
// Internal unit command
_eCmd : E_PackMLCmd;
// Internal unit mode
_eMode : E_PackMLUnitMode;
// Internal unit state
_eState : E_PackMLState;
// Last state
_eLastState : E_PackMLState;
// Current recipe
_stRecipe : ST_PackMLRecipe;
// Trigger for new command
_rtChangeCmdRequest : R_TRIG;
// Trigger for new mode
_rtChangeModeRequest : R_TRIG;
// Trigger change recipe
_rtChangeRecipeRequest : R_TRIG;
// State state machine variable
_iSSM : INT := 0;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_fbStateMachine(
eMode:= eMode,
eCmd:= eCmd,
eState=> _eState,
<ST><![CDATA[// Handle command change request
_rtChangeCmdRequest(CLK:= stCommand.xCmdChangeRequest);
IF _rtChangeCmdRequest.Q THEN
_eCmd := stCommand.eCntrlCmd;
END_IF
// Hande mode change request
_rtChangeModeRequest(CLK := stCommand.xUnitModeChangeRequest);
IF _rtChangeModeRequest.Q THEN
_eMode := stCommand.eUnitMode;
END_IF
// Handle recipe change rewuest
_rtChangeRecipeRequest(CLK := stCommand.xRecipeChangeRequest);
IF _rtChangeRecipeRequest.Q THEN
_stRecipe := stCommand.astRecipe[stCommand.diSelectedRecipe];
END_IF
// Call PackML state machine handler
_fbStateMachine(
eMode:= _eMode,
eCmd:= _eCmd,
stConfig := _stSMConfig,
eState=> stStatus.eStateCurrent,
eCurrentMode => stStatus.eUnitModeCurrent,
xError=> );
// Reset state state machine
IF _eLastState <> stStatus.eStateCurrent THEN
_iSSM := 0;
_eLastState := stStatus.eStateCurrent;
END_IF
// Call state method according to current state
CASE _eState OF
CASE stStatus.eStateCurrent OF
E_PackMLState.CLEARING:
M_Clearing();
@@ -84,16 +135,13 @@ CASE _eState OF
E_PackMLState.COMPLETING:
M_Completing();
E_PackMLState.COMPLETE:
E_PackMLState.COMPLETED:
M_Complete();
ELSE
;
END_CASE
// Copy internal flags to output
eState := _eState;]]></ST>
END_CASE]]></ST>
</Implementation>
<Method Name="M_Aborted" Id="{db1a684f-e4e1-4d89-a3aa-9b9dfde0508c}">
<Declaration><![CDATA[METHOD M_Aborted
@@ -176,7 +224,11 @@ eState := _eState;]]></ST>
<Declaration><![CDATA[METHOD M_StateComplete
]]></Declaration>
<Implementation>
<ST><![CDATA[_fbStateMachine.M_StateComplete();]]></ST>
<ST><![CDATA[// Reset state state machine
_iSSM := 0;
// Call state change in PackML state manager
_fbStateMachine.M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Stopped" Id="{9f8a09cf-f3be-4d60-b5e4-cd9572fae88c}">

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>

View File

@@ -194,7 +194,7 @@ fbPackML.M_StateComplete();
AssertEquals_DINT(E_PackMLState.COMPLETING, fbPackML.eState, 'Should transition to COMPLETING');
fbPackML.M_StateComplete();
AssertEquals_DINT(E_PackMLState.COMPLETE, fbPackML.eState, 'Should transition to COMPLETE');
AssertEquals_DINT(E_PackMLState.COMPLETED, fbPackML.eState, 'Should transition to COMPLETE');
TEST_FINISHED();]]></ST>
</Implementation>
@@ -221,7 +221,7 @@ AssertEquals_DINT(E_PackMLState.EXECUTE, fbPackML.eState, 'Should reach EXECUTE'
// EXECUTE -> COMPLETING -> COMPLETE
fbPackML.M_StateComplete();
fbPackML.M_StateComplete();
AssertEquals_DINT(E_PackMLState.COMPLETE, fbPackML.eState, 'Should reach COMPLETE');
AssertEquals_DINT(E_PackMLState.COMPLETED, fbPackML.eState, 'Should reach COMPLETE');
// COMPLETE -> RESETTING -> IDLE
fbPackML(eCmd := E_PackMLCmd.RESET);
@@ -425,7 +425,7 @@ fbPackML(eCmd := E_PackMLCmd.START);
fbPackML.M_StateComplete();
fbPackML.M_StateComplete();
fbPackML.M_StateComplete();
AssertEquals_DINT(E_PackMLState.COMPLETE, fbPackML.eState, 'Setup: Should be COMPLETE');
AssertEquals_DINT(E_PackMLState.COMPLETED, fbPackML.eState, 'Setup: Should be COMPLETE');
// Test RESET from COMPLETE
fbPackML(eCmd := E_PackMLCmd.RESET);
@@ -452,7 +452,7 @@ fbPackML(eCmd := E_PackMLCmd.START);
fbPackML.M_StateComplete();
fbPackML.M_StateComplete();
fbPackML.M_StateComplete();
AssertEquals_DINT(E_PackMLState.COMPLETE, fbPackML.eState, 'Setup: Should be COMPLETE');
AssertEquals_DINT(E_PackMLState.COMPLETED, fbPackML.eState, 'Setup: Should be COMPLETE');
// Test STOP from COMPLETE
fbPackML(eCmd := E_PackMLCmd.STOP);

View File

@@ -63,28 +63,56 @@
<Compile Include="01_Stationen\TrayFeeder\FB_TrayFeeder.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="GlobalTextList.TcGTLO">
<SubType>Code</SubType>
</Compile>
<Compile Include="GVLs\GVL_SCADA.TcGVL">
<SubType>Code</SubType>
<LinkAlways>true</LinkAlways>
</Compile>
<Compile Include="LibraryCandidates\PackML\E_PackMLCmd.TcDUT">
<Compile Include="LibraryCandidates\PackML\DUTs\E_PackMLCmd.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\E_PackMLState.TcDUT">
<Compile Include="LibraryCandidates\PackML\DUTs\E_PackMLState.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\E_PackMLUnitMode.TcDUT">
<Compile Include="LibraryCandidates\PackML\DUTs\E_PackMLUnitMode.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\FB_PackMLGeneric.TcPOU">
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PackMLParamDINT.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\FB_PackMLStateMachine.TcPOU">
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PackMLParamLREAL.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PackMLParamREAL.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PackMLParamSTRING.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PackMLPI.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PackMLRecipe.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PackML_ProductData.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PMLa.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PMLc.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PMLs.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\ST_PackMLStateMachineConfig.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\GVL_PackML_Conf.TcGVL">
<SubType>Code</SubType>
<LinkAlways>true</LinkAlways>
</Compile>
<Compile Include="LibraryCandidates\PackML\ITFs\I_UnitState.TcIO">
<SubType>Code</SubType>
</Compile>
@@ -94,6 +122,12 @@
<Compile Include="LibraryCandidates\PackML\ITFs\I_UnitStateWaiting.TcIO">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\POUs\FB_PackMLGeneric.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\POUs\FB_PackMLStateMachine.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\Unittests\FB_PackMLStateMachine_Test.TcPOU">
<SubType>Code</SubType>
</Compile>
@@ -103,13 +137,6 @@
<Compile Include="PlcTask.TcTTO">
<SubType>Code</SubType>
</Compile>
<Compile Include="Visualization Manager.TcVMO">
<SubType>Code</SubType>
</Compile>
<Compile Include="Visu\Visualization.TcVIS">
<SubType>Code</SubType>
<DependentUpon>Visualization Manager.TcVMO</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder Include="01_Stationen\Kuka_Robot" />
@@ -122,10 +149,12 @@
<Folder Include="00_Main" />
<Folder Include="LibraryCandidates" />
<Folder Include="GVLs" />
<Folder Include="LibraryCandidates\PackML\DUTs" />
<Folder Include="LibraryCandidates\PackML\DUTs\PackTags" />
<Folder Include="LibraryCandidates\PackML\POUs" />
<Folder Include="LibraryCandidates\Unittests" />
<Folder Include="LibraryCandidates\PackML" />
<Folder Include="LibraryCandidates\PackML\ITFs" />
<Folder Include="Visu" />
</ItemGroup>
<ItemGroup>
<PlaceholderReference Include="BaseComponents">

392
PLC/PLC.tmc Normal file

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,7 @@
<CycleTime>10000</CycleTime>
<Priority>20</Priority>
<PouCall>
<Name>PRG_Test</Name>
<Name>PRG_Main</Name>
</PouCall>
<TaskFBGuid>{40eb18ee-d47c-458f-bba5-88b899fc1567}</TaskFBGuid>
<Fb_init>{6e3535be-c313-4e44-9f98-4268a560c4bf}</Fb_init>

View File

@@ -1,397 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<Visu Name="Visualization" Id="{c7f813ad-d496-46cf-913b-a7293dcf426c}">
<XmlArchive>
<Data>
<o xml:space="preserve" t="VisualObject">
<n n="LastVisuLanguageModelEntry" />
<v n="UniqueIdGenerator">"12"</v>
<o n="VisualElemList" t="VisualElemList">
<l n="VisualElementList" t="VisualElemCollection" cet="GenericVisualElem">
<o>
<a n="ConfiguredComplexInputs" et="ComplexInput" />
<l n="Elements" t="ArrayList" />
<n n="VisualElementDescription" />
<o n="VisualElemMemberList" t="VisualElemMemberList">
<l n="VisualElemMemberList" t="VisualElemMemberCollection" cet="VisualElemMember">
<o>
<v n="Id">571893170L</v>
<v n="Value">"Rest"</v>
</o>
<o>
<v n="Id">1931512087L</v>
<v n="Value">"TOGGLE"</v>
</o>
<o>
<v n="Id">300685745L</v>
<v n="Value">false</v>
</o>
<o>
<v n="Id">2812299069L</v>
<v n="Value">4294967295U</v>
</o>
<o>
<v n="Id">494569607L</v>
<v n="Value">4278190080U</v>
</o>
<o>
<v n="Id">3719097617L</v>
<v n="Value">0</v>
</o>
<o>
<v n="Id">1649127785L</v>
<v n="Value">134</v>
</o>
<o>
<v n="Id">357335551L</v>
<v n="Value">150</v>
</o>
<o>
<v n="Id">2422045748L</v>
<v n="Value">229</v>
</o>
<o>
<v n="Id">2134141914L</v>
<v n="Value">177</v>
</o>
<o>
<v n="Id">4062784938L</v>
<v n="Value">"Element-Switch-PushSwitch-Gray"</v>
</o>
<o>
<v n="Id">550940142L</v>
<v n="Value">248</v>
</o>
<o>
<v n="Id">1473355128L</v>
<v n="Value">238</v>
</o>
<o>
<v n="Id">493260384L</v>
<v n="Value">4294967295U</v>
</o>
<o>
<v n="Id">135947015L</v>
<v n="Value">4278190080U</v>
</o>
<o>
<v n="Id">2678395525L</v>
<v n="Value">1U</v>
</o>
<o>
<v n="Id">2340015797L</v>
<v n="Value">"HCENTER"</v>
</o>
<o>
<v n="Id">2565699834L</v>
<v n="Value">"VCENTER"</v>
</o>
<o>
<v n="Id">296037572L</v>
<v n="Value">""</v>
</o>
<o>
<v n="Id">390574330L</v>
<v n="Value">""</v>
</o>
<o>
<v n="Id">2597686782L</v>
<v n="Value">false</v>
</o>
<o>
<v n="Id">743958181L</v>
<v n="Value">"GVL_SCADA.xErrAck"</v>
</o>
<o>
<v n="Id">3438453433L</v>
<v n="Value">"134"</v>
</o>
</l>
</o>
<v n="VisualElementName">"PushSwitch"</v>
<v n="VisualElementTypeName">"VisuFbElemPushSwitch"</v>
<v n="VisualElementIsRectangle">true</v>
<v n="VisualElementIdentifier">"GenElemInst_1"</v>
<n n="VisualElementOfflinePaintCommands" />
<n n="VisualElementFrameInformation" />
<d n="VisualElementInputActions" t="Hashtable" />
<v n="VisualElementIdentification">{a9fe58e2-2923-486b-83ae-c30f51fc53bc}</v>
<v n="VisualElementOwningObjectGuid">{c7f813ad-d496-46cf-913b-a7293dcf426c}</v>
<a n="LMGuids" et="Guid" />
<d n="SubElements" t="Hashtable" />
<v n="VisualElementId">0</v>
<l n="UserManagementAccessRights" t="ArrayList" />
<v n="AnimationDuration">"0"</v>
<v n="BringToForeground">""</v>
<v n="ElementVersion" t="Byte">1</v>
<n n="TabOrder" />
</o>
</l>
<v n="BackgroundBitmapId">""</v>
<v n="BackgroundColor">16777215</v>
<o n="Background" t="BackgroundSettings">
<n n="BgGradient" />
<n n="BgNamedColor" />
<v n="BgBmpId">""</v>
<v n="BgUseBmp">false</v>
<v n="BgColor">false</v>
<v n="BgUseColor">16777215</v>
<v n="BgUseGradient">false</v>
</o>
<v n="AllElementsHaveDynamicVisibility">false</v>
</o>
<o n="GeneratedLMMDescriptions" t="GeneratedLanguageModelEntriesData">
<o n="GeneratedVisuFbDescription" t="GenericFbDescription">
<d n="FbMethods" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>AreAllElementsHidden</v>
<v>a725eb54-6600-588a-9f13-869630ee3e7e</v>
<v>ContainsPoint</v>
<v>ab15b219-793c-4da0-bd07-15f4b9559413</v>
<v>Destruct</v>
<v>3ba10444-2f83-4df5-aa26-6b77c6d0abf6</v>
<v>ElementInfo</v>
<v>4fc818ce-9e66-4929-a86a-b286e246a68d</v>
<v>FB_Exit</v>
<v>77528b4c-c8c4-4f11-a991-6b9fe9e1a3d3</v>
<v>FB_Reinit</v>
<v>1d8a778c-cc51-47a7-a51d-3d9eb8125008</v>
<v>GetCallerNamespace</v>
<v>43a88302-5fea-54cf-b14f-4c85099970ea</v>
<v>GetClientData</v>
<v>cadc6a04-3260-4217-ae88-86a7d1978d67</v>
<v>GetDialogInterface</v>
<v>061c17d4-c1fd-4666-8fbf-29cb1f99ec8e</v>
<v>GetDialogInterfaceSize</v>
<v>e770c9e8-0fe5-4727-bbf9-e82c4cdde02f</v>
<v>GetElementArray</v>
<v>3453a92d-9e41-45ae-b333-a6fd05ecc05f</v>
<v>GetElementIdArray</v>
<v>01969ee2-370e-4639-8b9e-fcc1b5861ed4</v>
<v>GetElementName</v>
<v>5549a8ef-993d-5c8c-a19e-92b606693b43</v>
<v>GetInitializeVersion</v>
<v>87415d8b-3769-4476-ba47-778b9c7d9830</v>
<v>GetInstance</v>
<v>cb71613d-a9c0-4c65-af5b-0bf0cc1cc4a2</v>
<v>GetLocalUsergroup</v>
<v>a16842f4-6e61-487d-a546-e447ff985552</v>
<v>GetName</v>
<v>d299c55d-4dc9-4b9e-b9d7-81bcb628be24</v>
<v>GetNamespace</v>
<v>a00a8d02-710d-4837-b03e-8ac7f3cea203</v>
<v>GetResult</v>
<v>dd0c5ce2-d1c3-42c0-9d55-94b7f2ebfe7f</v>
<v>GetSize</v>
<v>aa96c3a1-2662-437e-b163-bed0cd701cbc</v>
<v>GetSurroundingRect</v>
<v>8a93fd36-40b4-408c-a8fa-f2094bc31dc1</v>
<v>GetTabOrderIdArray</v>
<v>22aa349f-aa1a-5a1e-b8d1-fa8b274978fc</v>
<v>GetText</v>
<v>26faf652-11c0-4434-b399-bdd6c186874b</v>
<v>GetTextProperties</v>
<v>76184248-eb5e-40ac-82e0-1b69e783afd2</v>
<v>GetTooltip</v>
<v>a0e4cc76-8d43-462d-b328-fda892a64d2d</v>
<v>GetTranslator</v>
<v>409c1071-0ab9-46d9-9cb0-f29de52cf28e</v>
<v>GetUpdateRects</v>
<v>df55534a-e997-42c4-9622-83f8a02d6684</v>
<v>HandleInput</v>
<v>0612a83a-5c13-462f-b5b0-94227cd1d4b4</v>
<v>HasInputAccess</v>
<v>27cfb0a9-611b-41e2-a755-37c98bd69211</v>
<v>HasInputAccessIntern</v>
<v>63cc92a5-408f-57e0-87e9-b2033b2b12ef</v>
<v>HasVisibilityAccess</v>
<v>f11fc703-d33e-412b-9764-588a000bede4</v>
<v>HasVisibilityAccessIntern</v>
<v>12b8a5d1-0920-5c63-846f-df1f593d4075</v>
<v>Initialize</v>
<v>28e2b0d4-7ee2-4256-bcf3-9b3d048989d7</v>
<v>IsAntialiasingInactive</v>
<v>2a637b19-2d31-4c64-a5a2-a50b98a54f46</v>
<v>Paint</v>
<v>359a8f28-6be2-40a9-b444-a14b59912a36</v>
<v>SetClientData</v>
<v>84598ba9-869d-4d41-af71-685b89f2e17f</v>
<v>SetContainerSize</v>
<v>d54f5458-6e96-5c6d-9516-413a21c534b5</v>
<v>SetDialogInterface</v>
<v>f991bc46-9bfd-4b50-87ce-4a160df90f4e</v>
<v>SetResult</v>
<v>31cc2a76-5ca2-40be-9c81-4ce91ffc8ceb</v>
<v>SetStaticState</v>
<v>a71f3a37-1f69-40b3-8810-7fbb9613ce2e</v>
<v>SetVisuFlagsInternal</v>
<v>c86bc3f1-839c-44f7-a86e-8c31b378e47d</v>
<v>Update</v>
<v>86c23628-283c-4cd6-9a8e-4fe213a72b01</v>
</d>
<d n="FbProperties" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>__getContainer</v>
<v>acc951a7-0e09-4639-b624-f1acf9de535a</v>
<v>__getVisu</v>
<v>699a8058-a362-4d94-b2bf-8d83cc15d117</v>
</d>
<v n="FbName">"NotImportant"</v>
<v n="FbGuid">{c7f813ad-d496-46cf-913b-a7293dcf426c}</v>
</o>
<v n="GeneratedGlobalVisuVarsGuid">{c3710736-16ea-4749-a94b-9a7cef0d94d9}</v>
<v n="GeneratedGlobalTheVisuVarlistGuid">{848dba92-ad40-4262-a0e6-c897149b4673}</v>
<v n="GeneratedGlobalVisuConstants">{4542b91b-c173-423b-a2e4-55fe1dcd4438}</v>
<d n="GeneratedAllElementsEntries" t="Hashtable" />
<o n="VisuRegDesc" t="GenericFbDescription">
<d n="FbMethods" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>FB_Exit</v>
<v>d076fe0e-7df0-431f-b3a9-736edf093162</v>
<v>FB_Init</v>
<v>28fb6bb3-47cc-457f-82ec-a2ee72ded81b</v>
<v>FB_Reinit</v>
<v>ee89efe4-78d3-4256-a7b0-564fc198a1d2</v>
</d>
<d n="FbProperties" t="CaseInsensitiveHashtable" />
<v n="FbName">"NotImportant"</v>
<v n="FbGuid">{cb986f24-4b1d-4e53-8e13-066c36701683}</v>
</o>
<v n="VisuRegisterGvl">{833946e1-5ee1-443a-a77a-490182229e46}</v>
<n n="SettingsPou" />
<n n="MemManPou" />
<o n="InputsPou" t="GenericFbDescription">
<d n="FbMethods" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>abstrGetDefaultCursor</v>
<v>f71cf66f-d4e9-4025-b35a-6cbbe1d389fb</v>
<v>ExecuteDialogClosed</v>
<v>e1501d0a-e558-483c-a9a5-a357640775bf</v>
<v>ExecuteKeyDown</v>
<v>4950c656-5a4e-4a24-a04d-c68e5fa80bc4</v>
<v>ExecuteKeyUp</v>
<v>cf6a31c1-32e2-4079-9359-06f71f51ac03</v>
<v>ExecuteLooseCapture</v>
<v>81003bd8-702b-46c6-8576-55b4cb3d6508</v>
<v>ExecuteMouseClick</v>
<v>38ba0b28-4b12-4493-9592-7295d83cee3f</v>
<v>ExecuteMouseDblClick</v>
<v>d096b23e-54a3-422f-b2ad-5cab7f415d68</v>
<v>ExecuteMouseDown</v>
<v>fd2a0ed4-cfa0-4c81-ac3a-154c476085bf</v>
<v>ExecuteMouseEnter</v>
<v>3eb196da-dbad-4a33-b599-c92ac619c961</v>
<v>ExecuteMouseLeave</v>
<v>4d127b58-1b2d-4421-a7a2-590f2ab04eb8</v>
<v>ExecuteMouseMove</v>
<v>ecfc61c4-6132-4304-b084-52c22b62b091</v>
<v>ExecuteMouseUp</v>
<v>97842947-afb6-4377-a1e0-497a4fad1b3a</v>
<v>ExecuteValueChanged</v>
<v>5134f3a0-6cfd-4802-91ba-4bc2ef3ec14f</v>
<v>GetElementInfo</v>
<v>18b304d4-0e71-4837-a644-83684312ccc5</v>
<v>Initialize</v>
<v>8f927b74-8f36-4a18-b313-e9657129d589</v>
</d>
<d n="FbProperties" t="CaseInsensitiveHashtable" />
<v n="FbName">"NotImportant"</v>
<v n="FbGuid">{c5c7227b-e260-46ca-81aa-66e288af04d0}</v>
</o>
<v n="DialogDut">{f68c5176-54d2-4538-b87e-5801589c0396}</v>
</o>
<v n="LastUsedIdForIdentifier">3</v>
<o n="TextDocument" t="TextDocument">
<v n="TextBlobForSerialisation">"VAR_IN_OUT
END_VAR"</v>
<n n="LineInfoPersistence" />
</o>
<v n="GvlCreated">false</v>
<n n="LMEntry" />
<v n="ProfileCompatibilityId">4140216668L</v>
<v n="LMVerMinor">0</v>
<v n="LMVerMajor">1</v>
<o n="Hotkeys" t="HotkeyConfiguration">
<v n="IdMin">481037385728L</v>
<v n="IdMax">549755813887L</v>
<v n="Id">481037385728L</v>
<v n="IdMask">549754765312L</v>
<v n="IdStep">1048576L</v>
<l2 n="Inputs" />
</o>
<o n="VisuSizeManager" t="VisualObjectSizeManager">
<d2 n="Size" ckt="Int32" cvt="VisualObjectSize">
<v>0</v>
<o>
<v n="Width">363</v>
<v n="Height">327</v>
</o>
<v>1</v>
<o>
<v n="Width">363</v>
<v n="Height">327</v>
</o>
<v>2</v>
<o>
<v n="Width">363</v>
<v n="Height">327</v>
</o>
</d2>
<v n="Version">2</v>
</o>
<n n="FrameInterfaceDataModel" />
</o>
</Data>
<TypeList>
<Type n="ArrayList">System.Collections.ArrayList</Type>
<Type n="BackgroundSettings">{1038f12c-dd4b-4f96-87a3-a350fe8f3552}</Type>
<Type n="Boolean">System.Boolean</Type>
<Type n="Byte">System.Byte</Type>
<Type n="CaseInsensitiveHashtable">{7df88604-7ac5-4e36-91c4-55e4fdad3e68}</Type>
<Type n="ComplexInput">{1de566f6-72a7-494c-9353-9a418172c96e}</Type>
<Type n="GeneratedLanguageModelEntriesData">{703465dc-4679-4ff2-bcc3-c57d0a204da3}</Type>
<Type n="GenericFbDescription">{40d6dd8d-dfd0-493a-8e29-c9a35e1e6539}</Type>
<Type n="GenericVisualElem">{f86c2928-8614-4cca-824b-e819ac4d58c4}</Type>
<Type n="Guid">System.Guid</Type>
<Type n="Hashtable">System.Collections.Hashtable</Type>
<Type n="HotkeyConfiguration">{6b108d46-58af-4e41-a3f4-174d8f160cc4}</Type>
<Type n="Int32">System.Int32</Type>
<Type n="Int64">System.Int64</Type>
<Type n="String">System.String</Type>
<Type n="TextDocument">{f3878285-8e4f-490b-bb1b-9acbb7eb04db}</Type>
<Type n="UInt32">System.UInt32</Type>
<Type n="VisualElemCollection">{ef9d0b20-c96e-48db-b361-2ded4063150e}</Type>
<Type n="VisualElemList">{f285c9a3-7019-446b-b98c-ccec3a0af8fa}</Type>
<Type n="VisualElemMember">{c694e3a2-5c0b-4177-ab35-cb06bd5a6a02}</Type>
<Type n="VisualElemMemberCollection">{a4b83bea-3742-489c-9fe8-d96d68dba7ab}</Type>
<Type n="VisualElemMemberList">{17e26cd1-bb9b-47fe-a3d5-18fcd63b9c96}</Type>
<Type n="VisualObject">{f18bec89-9fef-401d-9953-2f11739a6808}</Type>
<Type n="VisualObjectSize">{6ad3e88f-aee2-4766-a7ea-a8790037ef51}</Type>
<Type n="VisualObjectSizeManager">{5f612b0e-b404-455f-8177-27864e9f5332}</Type>
</TypeList>
</XmlArchive>
<ObjectProperties>
<XmlArchive>
<Data>
<o xml:space="preserve" t="VisualProperty">
<v n="VisuUsageType">0</v>
<v n="SizeX">1024</v>
<v n="SizeY">768</v>
<v n="IsStartVisu">false</v>
<v n="VisuSizeMode" t="VisualVisuSizeMode">AutoDetect</v>
<v n="Internal">false</v>
<v n="DialogIsOpaque">false</v>
<v n="DialogIsOpaqueIsSet">false</v>
<v n="UseParentSizeProperties">true</v>
<n n="ToolboxCategory" />
<n n="ToolboxImageId" />
<v n="IsCustomCategory">false</v>
</o>
</Data>
<TypeList>
<Type n="Boolean">System.Boolean</Type>
<Type n="Int32">System.Int32</Type>
<Type n="VisualProperty">{477d844b-9b2a-407e-90a4-d36fd6dde2fc}</Type>
<Type n="VisualVisuSizeMode">{34718b76-91f6-43de-8c65-b77e0b1ee621}</Type>
</TypeList>
</XmlArchive>
</ObjectProperties>
</Visu>
</TcPlcObject>

View File

@@ -1,593 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<VisuManager Name="Visualization Manager" Id="{99e7ae05-3563-4b1c-a1fe-76e9619e2955}">
<XmlArchive>
<Data>
<o xml:space="preserve" t="VisualManagerObject">
<v n="UseUnicodeStrings" t="UnicodeSupport">Undefined</v>
<v n="UseOverlay" t="OverlaySupport">Undefined</v>
<o n="ViewSettings" t="VisualManagerViewSettings">
<n n="StartVisu" />
<v n="StartVisu33">"Visualization"</v>
<v n="OpenTargetvisu">false</v>
<v n="BestFit">false</v>
<v n="ClientSizeMode" t="VisualClientSizeMode">AutoDetect</v>
<v n="ClientSizeX">2000</v>
<v n="ClientSizeY">2000</v>
<v n="ExtendedSettings">false</v>
<v n="PaintBufferSize">50000</v>
<v n="MemorybufferSize">400000</v>
<v n="VisuInternal">false</v>
<v n="CurrentVisuGlobal">false</v>
<v n="FileTransferMode">true</v>
<v n="VisuStyle">"Default, 3.1.9.0 (Beckhoff Automation GmbH)"</v>
<v n="MaxNumOfClients">100</v>
<n n="Language" />
<v n="NumpadDialog">"VisuDialogs.Numpad"</v>
<v n="KeypadDialog">"VisuDialogs.Keypad"</v>
<v n="InputWithLimitsDialog">"VisuDialogs.TextinputWithLimits"</v>
<v n="UseInputWithLimits">false</v>
<v n="TouchHandlingActive">false</v>
<v n="TouchScrollbarsActive">false</v>
<v n="SemiTransparentDrawingActive">true</v>
<v n="UpdateColorvariablesAfterActivationDone">true</v>
<v n="TransferSvgAndConvertedImages">false</v>
<v n="LoginDialog">"VisuUserManagement.VUM_Login"</v>
<v n="ChangePasswordDialog">"VisuUserManagement.VUM_ChangePassword"</v>
<v n="ChangeConfigDialog">"VisuUserManagement.VUM_UserManagementWide"</v>
<v n="GuidShowChangePasswordDialogFunction">{00000000-0000-0000-0000-000000000000}</v>
<v n="GuidShowChangeConfigDialogFunction">{00000000-0000-0000-0000-000000000000}</v>
<v n="UseStandardKeyboardHandling">true</v>
<v n="PaintDeactiveElementsGrayedOut">true</v>
<o n="GlobalOpenNumpadKeypadSettings" t="VisualManagerGlobalOpenNumpadKeypadSettings">
<v n="GlobalOpenNumpadKeypadType" t="GlobalOpenNumpadKeypadType">OpenCentered</v>
<n n="PositionX" />
<n n="PositionY" />
</o>
<v n="UseBackgroundForModalDialog">true</v>
<v n="AnimationDuration">200</v>
<v n="ConvertImages">false</v>
<v n="ConversionType">""</v>
<v n="BackImage">""</v>
<v n="BackImageTop">0</v>
<v n="BackImageLeft">0</v>
<v n="BackImageBot">0</v>
<v n="BackImageRight">0</v>
<v n="BackImageWarning">true</v>
<v n="BackImageLimit">true</v>
<v n="ResponsiveVisualizationSize">true</v>
</o>
<o n="RegisterDesc" t="GenericFbDescription">
<d n="FbMethods" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>FB_Exit</v>
<v>3b10f3d4-3918-46ea-8c63-adbf43a8a336</v>
<v>FB_Init</v>
<v>9df8d017-b198-465e-8e55-f69841ae986f</v>
<v>FB_Reinit</v>
<v>359af835-44f2-492f-a13c-f66f07fb0cd2</v>
</d>
<d n="FbProperties" t="CaseInsensitiveHashtable" />
<v n="FbName">"NotImportant"</v>
<v n="FbGuid">{f71ed0ce-2435-440b-9610-dc8f551135be}</v>
</o>
<o n="TargetProperties" t="VisualizationTargetProperties">
<o n="AvailableKeys" t="DeviceBasedHotkeysProvider">
<v n="Modifiers">7</v>
<v n="DevType">4096</v>
<v n="DevId">"1002 0004"</v>
<v n="DevVersion">"1.0.0.8"</v>
<v n="BaseProvider">{cb73a13e-6ccc-4bc6-8859-f5aa98bb116b}</v>
<l n="Keys" t="ArrayList" cet="DeviceBasedHotkeyItem">
<o>
<v n="FromBase">true</v>
<v n="KeyCode">48</v>
<v n="CanonicalName">"0"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">49</v>
<v n="CanonicalName">"1"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">50</v>
<v n="CanonicalName">"2"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">51</v>
<v n="CanonicalName">"3"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">52</v>
<v n="CanonicalName">"4"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">53</v>
<v n="CanonicalName">"5"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">54</v>
<v n="CanonicalName">"6"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">55</v>
<v n="CanonicalName">"7"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">56</v>
<v n="CanonicalName">"8"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">57</v>
<v n="CanonicalName">"9"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">65</v>
<v n="CanonicalName">"A"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">107</v>
<v n="CanonicalName">"ADDITION"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">66</v>
<v n="CanonicalName">"B"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">8</v>
<v n="CanonicalName">"BACKSPACE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">67</v>
<v n="CanonicalName">"C"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">110</v>
<v n="CanonicalName">"COMMA"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">68</v>
<v n="CanonicalName">"D"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">46</v>
<v n="CanonicalName">"DELETE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">111</v>
<v n="CanonicalName">"DIVIDE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">40</v>
<v n="CanonicalName">"DOWN"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">69</v>
<v n="CanonicalName">"E"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">35</v>
<v n="CanonicalName">"END"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">27</v>
<v n="CanonicalName">"ESCAPE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">70</v>
<v n="CanonicalName">"F"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">112</v>
<v n="CanonicalName">"F1"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">121</v>
<v n="CanonicalName">"F10"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">122</v>
<v n="CanonicalName">"F11"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">123</v>
<v n="CanonicalName">"F12"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">113</v>
<v n="CanonicalName">"F2"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">114</v>
<v n="CanonicalName">"F3"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">115</v>
<v n="CanonicalName">"F4"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">116</v>
<v n="CanonicalName">"F5"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">117</v>
<v n="CanonicalName">"F6"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">118</v>
<v n="CanonicalName">"F7"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">119</v>
<v n="CanonicalName">"F8"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">120</v>
<v n="CanonicalName">"F9"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">71</v>
<v n="CanonicalName">"G"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">72</v>
<v n="CanonicalName">"H"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">36</v>
<v n="CanonicalName">"HOME"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">73</v>
<v n="CanonicalName">"I"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">45</v>
<v n="CanonicalName">"INSERT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">74</v>
<v n="CanonicalName">"J"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">75</v>
<v n="CanonicalName">"K"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">76</v>
<v n="CanonicalName">"L"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">37</v>
<v n="CanonicalName">"LEFT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">77</v>
<v n="CanonicalName">"M"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">106</v>
<v n="CanonicalName">"MULTIPLY"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">78</v>
<v n="CanonicalName">"N"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">96</v>
<v n="CanonicalName">"NUM0"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">97</v>
<v n="CanonicalName">"NUM1"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">98</v>
<v n="CanonicalName">"NUM2"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">99</v>
<v n="CanonicalName">"NUM3"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">100</v>
<v n="CanonicalName">"NUM4"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">101</v>
<v n="CanonicalName">"NUM5"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">102</v>
<v n="CanonicalName">"NUM6"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">103</v>
<v n="CanonicalName">"NUM7"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">104</v>
<v n="CanonicalName">"NUM8"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">105</v>
<v n="CanonicalName">"NUM9"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">79</v>
<v n="CanonicalName">"O"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">80</v>
<v n="CanonicalName">"P"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">19</v>
<v n="CanonicalName">"PAUSE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">42</v>
<v n="CanonicalName">"PRINT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">81</v>
<v n="CanonicalName">"Q"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">82</v>
<v n="CanonicalName">"R"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">13</v>
<v n="CanonicalName">"RETURN_KEY"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">39</v>
<v n="CanonicalName">"RIGHT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">83</v>
<v n="CanonicalName">"S"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">32</v>
<v n="CanonicalName">"SPACE"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">109</v>
<v n="CanonicalName">"SUBTRACT"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">84</v>
<v n="CanonicalName">"T"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">9</v>
<v n="CanonicalName">"TAB"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">85</v>
<v n="CanonicalName">"U"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">38</v>
<v n="CanonicalName">"UP"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">86</v>
<v n="CanonicalName">"V"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">87</v>
<v n="CanonicalName">"W"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">88</v>
<v n="CanonicalName">"X"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">89</v>
<v n="CanonicalName">"Y"</v>
</o>
<o>
<v n="FromBase">true</v>
<v n="KeyCode">90</v>
<v n="CanonicalName">"Z"</v>
</o>
</l>
</o>
</o>
<o n="ConfiguredHotkeys" t="HotkeyConfiguration">
<v n="IdMin">481037385728L</v>
<v n="IdMax">549755813887L</v>
<v n="Id">481037385728L</v>
<v n="IdMask">549754765312L</v>
<v n="IdStep">1048576L</v>
<l2 n="Inputs" />
</o>
<o n="DefInpHandlerGuids" t="GenericFbDescription">
<d n="FbMethods" t="CaseInsensitiveHashtable" ckt="String" cvt="Guid">
<v>abstrGetDefaultCursor</v>
<v>cc321d7f-2f37-4b53-bce2-a9bd974a8681</v>
<v>ExecuteDialogClosed</v>
<v>3bcbc0ce-81cd-4911-8914-44188c177411</v>
<v>ExecuteKeyDown</v>
<v>fc479f4f-e138-4aaa-b6d6-697590969705</v>
<v>ExecuteKeyUp</v>
<v>156daac4-6443-4540-9838-4cc30c6e8821</v>
<v>ExecuteLooseCapture</v>
<v>0626945c-155a-452e-99e1-bc92ccdce784</v>
<v>ExecuteMouseClick</v>
<v>1b7b169c-830d-4535-a164-ba6f8d1bf165</v>
<v>ExecuteMouseDblClick</v>
<v>b1f03962-2989-414f-a5bb-812a75d56c3b</v>
<v>ExecuteMouseDown</v>
<v>028a586e-2455-441f-8a8d-00d127345483</v>
<v>ExecuteMouseEnter</v>
<v>e2b598c7-7a39-486e-9017-323dac257c30</v>
<v>ExecuteMouseLeave</v>
<v>4718b2dc-1651-40fd-9361-ef7d890a938b</v>
<v>ExecuteMouseMove</v>
<v>03e1fd3f-3a59-4354-a91c-81e5a0428954</v>
<v>ExecuteMouseUp</v>
<v>047888b5-4c63-4490-9a8c-d7184e3c26ce</v>
<v>ExecuteValueChanged</v>
<v>d7dc51a1-595c-4e58-86b1-6d8e24a5fb22</v>
<v>FB_Exit</v>
<v>e93ac5c5-9b6e-4ca7-8d80-5d9bcb7edb63</v>
<v>FB_Init</v>
<v>fbbfef41-6677-40ae-8e1d-435b00930c8d</v>
<v>FB_Reinit</v>
<v>341a7933-16e7-4fa3-a7a8-6e3d2f3c148c</v>
<v>GetElementInfo</v>
<v>0ca14ef6-3126-4c73-9f23-beb3d2c12e33</v>
<v>Init</v>
<v>ebbdcf07-6ef1-440f-91b4-94e62b85242c</v>
<v>Initialize</v>
<v>d51c9946-c924-4a41-9a42-6e79c7023378</v>
</d>
<d n="FbProperties" t="CaseInsensitiveHashtable" />
<v n="FbName">"NotImportant"</v>
<v n="FbGuid">{5b10dcd0-a6a2-4394-8d7e-fc1a897d49c8}</v>
</o>
<n n="InstantiationStorage" />
<n n="VisuUserManagement" />
<v n="UseLocalUserMgmt">true</v>
<v n="UseUserMgmtInPlc">true</v>
<n n="RemoteUserMgmtPath" />
<n n="FontsConfig" />
<n n="FontDownloadConfig" />
<n n="VisuInitializationCode" />
<n n="FontSettings" />
<v n="GuidVisuSettingsPou">{7b398c37-b8f2-44fa-92e6-cd0ac4432e05}</v>
<v n="GuidVisuSettingsPouInit">{b7af0301-7d32-4dec-821a-a12a7de2afe2}</v>
<v n="GuidVisuSettingsPouReInit">{b114b7fc-7845-4db6-b717-6ef08132d0b3}</v>
<v n="GuidVisuSettingsPouBoolMethod">{f6e93e7a-f026-47f1-9ad6-9ad85a537957}</v>
<v n="GuidVisuSettingsPouDIntMethod">{05d2daea-b06a-4275-855d-b7edf1e9a29d}</v>
<v n="GuidVisuSettingsPouStringMethod">{699620e8-1df5-45c4-8a2d-7f8ef1544fd5}</v>
<v n="GuidVisuSettingsPouReservedMethod">{db37476f-f0fb-4fa9-8a33-33f55c6ee3e6}</v>
<v n="GuidMemManInitPou">{37f8aba3-8d02-4b60-b71d-909d434464e0}</v>
<v n="GuidMemManInitPouInit">{db09399b-72ff-43d1-8c3a-e078e68c9297}</v>
<v n="GuidMemManInitPouReInit">{6864ac69-a0df-43f7-bcd5-4b9c7dc64b57}</v>
<v n="GuidStartVisuInitPou">{406a9ed5-2529-4fd5-9ad9-3ae887dda070}</v>
<v n="GuidStartVisuInitPouInit">{a4b8d7f7-933b-40f3-9d72-9fe1ba44d7ed}</v>
<v n="GuidStartVisuInitPouReInit">{129b0553-f73f-4a63-a791-589dde777670}</v>
<v n="GuidVisuGVL0">{9003aa7f-2db3-4a80-9478-ff56da7ce674}</v>
<v n="GuidVisuGVL1">{c5aeb04a-4e37-466e-adb7-6e1defc764ae}</v>
<v n="GuidVisuGVL2">{94a93fd8-eed7-425b-b4e7-d49ab50e79cc}</v>
<v n="GuidVisuGVL_3">{bdccb31c-de80-4c34-8469-8d8f1b48172b}</v>
<v n="GuidReservedPou">{b8e3eef6-1f94-489e-bb87-7da6cde40255}</v>
<v n="GuidVisuGVL3">{ac528ee4-49b0-4bb2-8b8d-0881d5ce92e3}</v>
<v n="GuidReservedPouInit">{cb123efe-50d6-4c66-b719-5a9abc7b78be}</v>
<v n="GuidVisuGVL4">{925e8f6d-a925-4ccb-9007-f4aa925f657b}</v>
<v n="GuidVisuGVL5">{0e5d2904-0f49-4ca0-873b-e30003524293}</v>
<v n="GuidLicenseGVL">{469f8113-0911-47c3-8ac7-302e738f100d}</v>
<v n="GuidGlobalClientManagerGVL">{c8fed093-737d-41c7-b196-fe237ae7ae11}</v>
<v n="GuidVisuUserMgmtInitPou">{be83b5db-04d7-49b4-95f4-135b529cdb8c}</v>
<v n="GuidVisuUserMgmtInitPouInit">{63abefd0-8bc2-4603-9bff-e90b8c47d6fe}</v>
<v n="GuidBeforeCompileCommonGVL">{c256e1fd-f3b9-4401-8b5a-a0bb6db81a94}</v>
<v n="GuidVisuGVL6">{14dbfc96-fd74-4e8a-afb4-01575aa81bde}</v>
<v n="GuidReservedPouMethod1">{e291df9c-0ae4-40f9-aaf6-c7479d74a4b2}</v>
<v n="GuidReservedPouReInit">{d9548cb4-7280-404a-a145-5a8f38a9e691}</v>
<v n="GuidReservedPouMethod0">{d5955983-4cbf-4785-9324-6a3ae3b62362}</v>
<v n="GuidReservedPouMethod2">{b155374e-21a8-4e99-83be-933da117fdc3}</v>
</o>
</Data>
<TypeList>
<Type n="ArrayList">System.Collections.ArrayList</Type>
<Type n="Boolean">System.Boolean</Type>
<Type n="CaseInsensitiveHashtable">{7df88604-7ac5-4e36-91c4-55e4fdad3e68}</Type>
<Type n="DeviceBasedHotkeyItem">{11a86981-4b02-4f98-b432-96e385cb41b7}</Type>
<Type n="DeviceBasedHotkeysProvider">{c91fc5aa-1e38-43b2-9a05-c52cc5d7f5b6}</Type>
<Type n="GenericFbDescription">{40d6dd8d-dfd0-493a-8e29-c9a35e1e6539}</Type>
<Type n="GlobalOpenNumpadKeypadType">{550f8ee0-c42e-42f0-b253-4fadf0c12bdf}</Type>
<Type n="Guid">System.Guid</Type>
<Type n="HotkeyConfiguration">{6b108d46-58af-4e41-a3f4-174d8f160cc4}</Type>
<Type n="Int32">System.Int32</Type>
<Type n="Int64">System.Int64</Type>
<Type n="OverlaySupport">{05125339-dc8c-4673-b403-e21bec548370}</Type>
<Type n="String">System.String</Type>
<Type n="UnicodeSupport">{19611221-ebd3-4607-86d2-9822fbe84c30}</Type>
<Type n="VisualClientSizeMode">{c37fe731-4f69-4d98-82fe-4f9aefbe200d}</Type>
<Type n="VisualizationTargetProperties">{997fedbb-1888-4256-b61c-2933d8056bfd}</Type>
<Type n="VisualManagerGlobalOpenNumpadKeypadSettings">{422ed780-41e9-4352-8132-b322b16154c1}</Type>
<Type n="VisualManagerObject">{4d3fdb8f-ab50-4c35-9d3a-d4bb9bb9a628}</Type>
<Type n="VisualManagerViewSettings">{ec9b2ec6-92a2-4856-be72-7866fb274c64}</Type>
</TypeList>
</XmlArchive>
</VisuManager>
</TcPlcObject>