Added hot and cold plates

- Started spinner chuck io's
This commit is contained in:
2026-02-01 13:53:21 +01:00
parent 8c41ff9bad
commit 1ade81c1c5
30 changed files with 3626 additions and 5882 deletions

View File

@@ -7,6 +7,8 @@ VAR
_fbHVTester : FB_HVTester;
_fbEtcher1 : FB_Etcher;
_fbEtcher2 : FB_Etcher;
_fbTrayFeederInput : FB_TrayFeeder(sIPAddr := '192.168.1.10', udiPort := 5000);
_fbHeatCoolPlates : FB_HeatCoolPlates;
_xConfirmAlarms : BOOL;
@@ -16,11 +18,18 @@ VAR
_stRobotJobParams : ST_KukaRobot_JobParams;
_stCamResult AT %I* : ST_TrayFeederCamPosData;
_rtStopRobotFromSafety : R_TRIG;
// DEBUG commands
_xClear : BOOL;
_xReset : BOOL;
_xStart : BOOL;
_xHold : BOOL;
_xUnhold : BOOL;
_xStop : BOOL;
_xStartTrigger : BOOL;
_tofTriggerTime : TOF := (PT := T#1S);
@@ -30,19 +39,37 @@ END_VAR
<Implementation>
<ST><![CDATA[IF _xClear THEN
_xClear := FALSE;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.CLEAR;
_stRobotCmd.xCmdChangeRequest := TRUE;
_fbRobot.M_Clear();
END_IF
IF _xReset THEN
_xReset := FALSE;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.RESET;
_stRobotCmd.xCmdChangeRequest := TRUE;
_fbRobot.M_Reset();
END_IF
IF _xStart THEN
_xStart := FALSE;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.START;
_fbRobot.M_Start();
END_IF
IF _xHold THEN
_xHold := FALSE;
_fbRobot.M_Hold();
END_IF
IF _xUnhold THEN
_xUnhold := FALSE;
_fbRobot.M_Unhold();
END_IF
IF _xStop THEN
_xStop := FALSE;
_fbRobot.M_Stop();
END_IF
_rtStopRobotFromSafety(CLK := PRG_Safety.xStopRobot);
IF _rtStopRobotFromSafety.Q THEN
_stRobotCmd.eCntrlCmd := E_PackMLCmd.STOP;
_stRobotCmd.xCmdChangeRequest := TRUE;
END_IF
@@ -62,12 +89,22 @@ END_IF
_fbHVTester(xOpenChambers:= GVL_SCADA.xOpenAllChambers);
_fbEtcher1(xOpenDoor:= GVL_SCADA.xOpenAllChambers);
_fbEtcher2(xOpenDoor:= GVL_SCADA.xOpenAllChambers);
_fbEtcher1(xOpenDoor:= GVL_SCADA.xOpenAllChambers, xConfirmAlarms := GVL_SCADA.xErrAck);
_fbEtcher2(xOpenDoor:= GVL_SCADA.xOpenAllChambers, xConfirmAlarms := GVL_SCADA.xErrAck);
// _fbTrayFeederInput(
// stCommand:= ,
// xConfirmAlarms := GVL_SCADA.xErrAck,
// stStatus=> GVL_SCADA.stTrayFeederInputState,
// stAdmin=> GVL_SCADA.stTRayFeederInputAdmin);
_fbHeatCoolPlates(xConfirmAlarms:= GVL_SCADA.xErrAck);
// Call safety program
PRG_Safety(xConfirmAlarms := GVL_SCADA.xErrAck);
PRG_Safety(
xConfirmAlarms := GVL_SCADA.xErrAck,
xRobotStopped := (_stRobotStatus.eStateCurrent <> E_PackMLState.EXECUTE));
// =====
// DEBUG

View File

@@ -4,9 +4,15 @@
<Declaration><![CDATA[PROGRAM PRG_Safety
VAR_INPUT
xConfirmAlarms : BOOL;
xRobotStopped : BOOL;
END_VAR
VAR_OUTPUT
xStopRobot : BOOL := FALSE;
END_VAR
VAR
_xRun AT %Q* : BOOL;
_xEStopOk AT %I* : BOOL;
_xRequestOpenDoor AT %I* : BOOL;
_rtrigDoorUnlock : R_TRIG;
@@ -22,8 +28,9 @@ END_VAR
<Implementation>
<ST><![CDATA[_xRun := NOT _xComStartup;
_rtrigDoorUnlock(CLK := _xRequestOpenDoor);
_rtrigDoorUnlock(CLK := _xRequestOpenDoor AND xRobotStopped);
IF _rtrigDoorUnlock.Q THEN
xStopRobot := (NOT xStopRobot);
_xLockDoor := (NOT _xLockDoor);
END_IF

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PosData" Id="{a239aa72-8733-4bd3-94a0-6f6589ef2443}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_PosData :
STRUCT
wPosX : INT;
wPosY : INT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_TrayFeederCamPosData" Id="{b23e235e-7a29-4216-a7f3-ec637f9c5927}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_TrayFeederCamPosData :
STRUCT
byNumberOf : BYTE;
astPosData : ARRAY[0..7] OF ST_PosData;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,25 +1,146 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_Etcher" Id="{e75b6d70-36db-4c78-b78d-a594609441d1}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Etcher
<Declaration><![CDATA[FUNCTION_BLOCK FB_Etcher EXTENDS FB_PackMLGeneric
VAR_INPUT
xOpenDoor : BOOL;
xOpenChuckClamp : BOOL;
xEjectChuck : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xChuckClampOpen : BOOL;
END_VAR
VAR
_xOpenDoor AT %Q* : BOOL;
_xCloseDoor AT %Q* : BOOL;
_fbValveDoor : FB_Valve('Door');
_stValveDoorCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_stDoorHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingLeft : FB_Valve('Clamping left');
_stValveClampingLeftCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_stClampingLeftHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingRight : FB_Valve('Clamping right');
_stValveClampingRightCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_stClampingRightHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingFront : FB_Valve('Clamping front');
_stValveClampingFrontCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_stClampingFrontHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingBack : FB_Valve('Clamping back');
_stValveClampingBackCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S,
timTimeoutClose := T#5S);
_stClampingBackHMIInterface : ST_HMI_VALVE_DATA;
_rtEjectChuckCmd : R_TRIG;
_tpEjectChuck : TP;
// =======
// Sensors
// =======
// Spinner vibration sensor
_xVibrationSensor AT %I* : BOOL;
// =========
// Actuators
// =========
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF xOpenDoor THEN
_xOpenDoor := TRUE;
_xCloseDoor := FALSE;
<ST><![CDATA[// Main door
_fbValveDoor(
xAutomaticOpen:= xOpenDoor,
xReleaseErrors:= TRUE,
stValveConfig:= _stValveDoorCfg,
xReleaseManualMode:= FALSE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stDoorHMIInterface);
// Chuck
_rtEjectChuckCmd(CLK := xEjectChuck);
IF _rtEjectChuckCmd.Q THEN
_tpEjectChuck(IN := TRUE, PT := T#500MS);
ELSE
_xOpenDoor := FALSE;
_xCloseDoor := TRUE;
END_IF]]></ST>
_tpEjectChuck(IN := FALSE);
END_IF
_fbClampingLeft(
xAutomaticOpen:= xOpenChuckClamp,
xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingLeftCfg,
xReleaseManualMode:= FALSE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingLeftHMIInterface);
_fbClampingRight(
xAutomaticOpen:= xOpenChuckClamp,
xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingRightCfg,
xReleaseManualMode:= FALSE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingRightHMIInterface);
_fbClampingFront(
xAutomaticOpen:= _tpEjectChuck.Q,
xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingFrontCfg,
xReleaseManualMode:= FALSE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingFrontHMIInterface);
_fbClampingBack(
xAutomaticOpen:= _tpEjectChuck.Q,
xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingBackCfg,
xReleaseManualMode:= FALSE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingBackHMIInterface);
// Call base sm
SUPER^();]]></ST>
</Implementation>
<Method Name="FB_Init" Id="{afcda70c-3e52-4a32-9ca9-670a6b854f24}">
<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[_stSMConfig.xStoppingDisabled := TRUE;
_stSMConfig.xCompletingDisabled := TRUE;
_stSMConfig.xCompletedDisabled := TRUE;
_stSMConfig.xAbortingDisabled := TRUE;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_HVTester" Id="{63fd7fbb-2896-492c-ad94-827a20571a58}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_HVTester
<Declaration><![CDATA[FUNCTION_BLOCK FB_HVTester EXTENDS FB_PackMLGeneric
VAR_INPUT
xOpenChambers : BOOL;
END_VAR
@@ -35,7 +35,10 @@ ELSE
_xCloseDoor1 := TRUE;
_xCloseDoor2 := TRUE;
END_IF]]></ST>
END_IF
// Call base sm
SUPER^();]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,147 @@
<?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
VAR_INPUT
rTempSetpoint : REAL := 25.0;
END_VAR
VAR_OUTPUT
END_VAR
VAR
// Card inputs
_stStatus AT %I* : ST_SerialStatus;
_byDataIn AT %I* : ARRAY[0..21] OF BYTE;
// Card outputs
_stCtrl AT %Q* : ST_SerialCrl;
_byDataOut AT %Q* : ARRAY[0..21] OF BYTE;
// Internal temp setpoint
_rTempSetpoint : REAL;
// Send trigger
_xSend : BOOL;
// Send temp test
_xTempTest : BOOL;
// Init trigger
_xInit : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Clamp temperature settings
_rTempSetpoint := rTempSetpoint;
IF _rTempSetpoint > 60.0 THEN
_rTempSetpoint := 60.0;
END_IF
IF _rTempSetpoint < 10.0 THEN
_rTempSetpoint := 10.0;
END_IF
// Init card on first run
IF _xInit THEN
_xInit := FALSE;
_stCtrl.bInitRequest := 1;
END_IF
IF _stStatus.bInitAccepted THEN
_stCtrl.bInitRequest := 0;
END_IF
// Send
IF _xSend THEN
_xSend := FALSE;
_stCtrl.bTransmitRequest := 1;
END_IF
IF _stStatus.bTransmitAccepted THEN
_stCtrl.bTransmitRequest := 0;
END_IF
// Debug test
IF _xTempTest THEN
_xTempTest := FALSE;
M_SetTemp(rTemp := _rTempSetpoint);
_xSend := TRUE;
END_IF]]></ST>
</Implementation>
<Method Name="M_CalcChecksum" Id="{dc2c8dbc-8315-4281-befa-84b7f4e74dc9}">
<Declaration><![CDATA[METHOD M_CalcChecksum
VAR_INPUT
uiStartIndex : UINT;
uiEndIndex : UINT;
END_VAR
VAR_OUTPUT
byHigh : BYTE;
byLow : BYTE;
END_VAR
VAR
_dwChecksum : DWORD;
_uiCounter : UINT;
_byHigh : BYTE;
_byLow : BYTE;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Calculate sum
FOR _uiCounter := uiStartIndex TO uiEndIndex DO
_dwChecksum := _dwChecksum + _byDataOut[_uiCounter];
END_FOR
// Use lower bytes
_byHigh := SHR(_dwChecksum.%B0 AND 16#F0, 4);
_byLow := _dwChecksum.%B0 AND 16#0F;
// Add offset
_byHigh := _byHigh + 16#30;
_byLow := _byLow + 16#30;
byHigh := _byHigh;
byLow := _byLow;]]></ST>
</Implementation>
</Method>
<Method Name="M_SetTemp" Id="{e9f6069c-f4a0-47e4-9ef0-4fbbec8764d9}">
<Declaration><![CDATA[METHOD M_SetTemp
VAR_INPUT
rTemp : REAL;
END_VAR
VAR
_dwTemp : DWORD;
_sTemp : STRING(4);
_byHigh : BYTE;
_byLow : BYTE;
_sHexString : STRING(4);
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Convert temperature
_dwTemp := REAL_TO_DWORD(rTemp * 10)*10;
_sTemp := DWORD_TO_STRING(_dwTemp);
_byDataOut[0] := 16#02; // STX
_byDataOut[1] := 16#31; // Command code
_byDataOut[2] := _sTemp[0];
_byDataOut[3] := _sTemp[1];
_byDataOut[4] := _sTemp[2];
_byDataOut[5] := _sTemp[3];
_byDataOut[6] := 16#03; // ETX
M_CalcChecksum(
uiStartIndex:= 1,
uiEndIndex:= 5,
byHigh=> _byDataOut[7],
byLow=> _byDataOut[8]);
_byDataOut[9] := 16#0D; // <CR>
_stCtrl.byOutputLength := 10;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_HeatCoolPlates" Id="{a2be063c-19d7-4ca2-8121-529d61cc7bc2}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_HeatCoolPlates
VAR_INPUT
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
_fbHeatingPlate : FB_HotPlate;
_xEnableHotplate : BOOL;
_rTargetTemp : REAL := 30.0;
// Cool plate
_fbCoolPlate : FB_CoolPlate;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_fbHeatingPlate(
xEnable:= _xEnableHotplate,
rTargetTemp:= _rTargetTemp,
xConfirmAlarms:= xConfirmAlarms,
uiNextFreeSlot=> ,
uiNextReadySlot=> );
_fbCoolPlate();]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,72 @@
<?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
VAR_INPUT
xEnable : BOOL;
rTargetTemp : REAL;
rDeadBand : REAL := 5.0;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
uiNextFreeSlot : UINT;
uiNextReadySlot : UINT;
END_VAR
VAR
_xEnableHotplate AT %Q* : BOOL;
_axSlotFree : ARRAY [0..(GVL_HeatCoolConfig.HEAT_COOL_PLATES_NUM_SLOTS - 1)] OF BOOL;
_tonSlotTimer : ARRAY[0..(GVL_HeatCoolConfig.HEAT_COOL_PLATES_NUM_SLOTS - 1)] OF TON;
// Temp sensor
_fbTempSensor : FB_AnalogInput('Temp sensor');
_stTempSensorConfig : ST_ANALOG_IO_CONFIG := (sUnit := '°C', rPVMin := -200, rPVMax := 850, iAIMin := -2000, iAIMax := 8500);
_stTempSEnsorEWConfig : ST_ANALOG_EW_CONFIG := (
stLevels := (
rErrorMin := -2000,
rErrorMax := 8500,
rWarningMin := -1000,
rWarningMax := 7500),
stDelays := (
timErrorHighOn := T#1S,
timErrorLowOn := T#1S,
timWarningHighOn := T#1S,
timWarningLowOn := T#1S,
timHardwareSignalLevelOff := T#1S));
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Call sensor fbs
_fbTempSensor(
stAnalogIOConfig:= _stTempSensorConfig,
stAnalogEWConfig:= _stTempSEnsorEWConfig,
xReleaseErrors:= TRUE,
xReleaseLimitErrors:= FALSE,
xReleaseHardwareErrors:= TRUE,
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> );
// Control temperature with two point controller
IF _fbTempSensor.rScaledValue < (rTargetTemp - rDeadBand) THEN
_xEnableHotplate := TRUE;
END_IF
IF _fbTempSensor.rScaledValue >= (rTargetTemp) THEN
_xEnableHotplate := FALSE;
END_IF
]]></ST>
</Implementation>
<Method Name="M_AddItem" Id="{9707459a-6558-487c-b730-c9dc92d598ed}">
<Declaration><![CDATA[METHOD M_AddItem
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,9 @@
<?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'}
VAR_GLOBAL CONSTANT
HEAT_COOL_PLATES_NUM_SLOTS : UINT := 9;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_SerialCrl" Id="{02e99166-5c76-4fb3-84cc-719c63e20136}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_SerialCrl :
STRUCT
bTransmitRequest : BIT;
bReceiveAccepted : BIT;
bInitRequest : BIT;
bSendContinues : BIT;
byOutputLength : BYTE;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_SerialStatus" Id="{e37399e0-7acb-4d91-826f-26258cabab1c}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_SerialStatus :
STRUCT
bTransmitAccepted : BIT;
bReceiveRequested : BIT;
bInitAccepted : BIT;
bBufferFull : BIT;
bParityError : BIT;
bFramingError : BIT;
bOverrunError : BIT;
byInputLength : BYTE;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -140,9 +140,9 @@ SUPER^();
_uCtrl.stCtrl.bNotDisableAxes := 1;
// Disable move if in T2 for safety reasons
IF _uState.stState.bT2 THEN
_uCtrl.stCtrl.bEnableMove := 0;
END_IF
// IF _uState.stState.bT2 THEN
// _uCtrl.stCtrl.bEnableMove := 0;
// END_IF
// ============================
@@ -179,7 +179,7 @@ _stSMConfig.xAbortingDisabled := TRUE;]]></ST>
</Implementation>
</Method>
<Method Name="M_Aborted" Id="{0c0c17ce-5c1c-4640-9d39-f25b22309d5d}">
<Declaration><![CDATA[METHOD M_Aborted
<Declaration><![CDATA[METHOD PROTECTED M_Aborted
]]></Declaration>
<Implementation>
<ST><![CDATA[// Reset all relevant robot control signals
@@ -196,7 +196,7 @@ _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
<Declaration><![CDATA[METHOD PROTECTED M_Clearing
VAR_INST
_tonWait : TON;
END_VAR]]></Declaration>
@@ -214,7 +214,7 @@ END_IF
</Implementation>
</Method>
<Method Name="M_Execute" Id="{bc86876c-a8db-4285-b95c-7c6858a2ca66}">
<Declaration><![CDATA[METHOD M_Execute
<Declaration><![CDATA[METHOD PROTECTED M_Execute
]]></Declaration>
<Implementation>
<ST><![CDATA[// Wait for robot to be done
@@ -224,28 +224,33 @@ END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Held" Id="{22ddbad0-0b66-427e-a2aa-f177f8adbc94}">
<Declaration><![CDATA[METHOD M_Held
<Declaration><![CDATA[METHOD PROTECTED 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><![CDATA[METHOD PROTECTED M_Holding
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
<ST><![CDATA[_uCtrl.stCtrl.bEnableMove := 0;
IF _uState.stState.bRobStopped THEN
M_StateComplete();
END_IF
]]></ST>
</Implementation>
</Method>
<Method Name="M_Idle" Id="{025437ab-beb0-4ad6-bdc3-468dec599ff4}">
<Declaration><![CDATA[METHOD M_Idle
<Declaration><![CDATA[METHOD PROTECTED M_Idle
]]></Declaration>
<Implementation>
<ST><![CDATA[_stJobParams := stJobParams;]]></ST>
</Implementation>
</Method>
<Method Name="M_Resetting" Id="{dfe4d36a-80aa-4364-bfd8-6ddd41636d59}">
<Declaration><![CDATA[METHOD M_Resetting
<Declaration><![CDATA[METHOD PROTECTED M_Resetting
VAR_INST
_tonTimeout : TON;
END_VAR]]></Declaration>
@@ -253,7 +258,26 @@ END_VAR]]></Declaration>
<ST><![CDATA[_tonTimeout(PT := T#10S);
CASE _iSSM OF
// Check if com interface is ok
0:
_uCtrl.stCtrl.bEnableMove := 1;
_uCtrl.stCtrl.bConfMess := 1;
_tonTimeout.IN := TRUE;
IF _uState.stState.bIOActConf THEN
_uCtrl.stCtrl.bConfMess := 0;
_iSSM := 10;
END_IF
// Timeout io_Act_conf ready
IF _tonTimeout.Q THEN
_uCtrl.stCtrl.bConfMess := 0;
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
END_IF
// Enable axes
10:
_uCtrl.stCtrl.bEnableAxes := 1;
_tonTimeout.IN := TRUE;
@@ -261,7 +285,7 @@ CASE _iSSM OF
IF _uState.stState.bPeriRdy THEN
_uCtrl.stCtrl.bEnableAxes := 0;
_tonTimeout(IN := FALSE);
_iSSM := 10;
_iSSM := 20;
END_IF
// Timeout drives ready
@@ -272,16 +296,16 @@ CASE _iSSM OF
_eCmd := E_PackMLCmd.ABORT;
END_IF
10:
// Reset move stop
20:
_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;
_iSSM := 30;
END_IF
// Timeout reset errors
@@ -291,10 +315,9 @@ CASE _iSSM OF
_eCmd := E_PackMLCmd.ABORT;
END_IF
20:
// Start main program
// Start program
30:
_uCtrl.stCtrl.bExtStart := 1;
_tonTimeout.IN := TRUE;
IF _tonTimeout.Q THEN
@@ -312,7 +335,7 @@ END_CASE]]></ST>
</Implementation>
</Method>
<Method Name="M_Starting" Id="{011f85d8-1225-4288-876f-918df6e4f235}">
<Declaration><![CDATA[METHOD M_Starting
<Declaration><![CDATA[METHOD PROTECTED M_Starting
VAR_INST
_tonTimeout : TON;
END_VAR]]></Declaration>
@@ -413,10 +436,10 @@ END_CASE
</Implementation>
</Method>
<Method Name="M_Stopped" Id="{50813767-4bd7-4147-b5dc-1bbd18ae1555}">
<Declaration><![CDATA[METHOD M_Stopped
<Declaration><![CDATA[METHOD PROTECTED M_Stopped
]]></Declaration>
<Implementation>
<ST><![CDATA[_uCtrl.stCtrl.bConfMess := 0;
<ST><![CDATA[// _uCtrl.stCtrl.bConfMess := 0;
_uCtrl.stCtrl.bEnableAxes := 0;
_uCtrl.stCtrl.bNotDisableAxes := 1;
_uCtrl.stCtrl.bExtStart := 0;
@@ -426,28 +449,89 @@ _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><![CDATA[METHOD PROTECTED 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><![CDATA[METHOD PROTECTED 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>
<Declaration><![CDATA[METHOD PROTECTED M_Unholding
VAR_INST
_tonTimeout : TON;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
<ST><![CDATA[_tonTimeout(PT := T#10S);
CASE _iSSM OF
0:
_uCtrl.stCtrl.bEnableMove := 1;
_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_Unsuspending" Id="{d7ce33fd-cd94-44f1-9289-25a3ab3829eb}">
<Declaration><![CDATA[METHOD M_Unsuspending
<Declaration><![CDATA[METHOD PROTECTED M_Unsuspending
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>

View File

@@ -0,0 +1,376 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_TFProtocol" Id="{f0c44f0b-70b8-45d0-8720-9bd7e08b6aa6}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_TFProtocol
VAR_INPUT
sIpAddr : STRING;
udiPort : UDINT;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xConnected : BOOL;
xNewResponseReady : BOOL;
xBusy : BOOL;
xError : BOOL;
END_VAR
VAR
// Connection settings
_fbTcpConnection : FB_ClientServerConnection;
_sIpAddr : STRING;
_udiPort : UDINT;
_hSocket : T_HSOCKET;
_xConnect : BOOL := TRUE;
_xConnected : BOOL;
// Socket send
_fbSocketSend : FB_SocketSend;
_timSendTimeout : TIME := T#5S;
// Socket receive
_fbSocketReceive : FB_SocketReceive;
_timReceiveTimeout : TIME := T#5S;
_abReceivedBuffer : ARRAY[0..100] OF BYTE;
_sReceivedResponse : STRING;
_udiCounterReceive : UDINT;
_udiReceivedBytes : UDINT;
_timPollingTime : TIME := T#50MS;
_tonPollTimer : TON;
_xEnableReceiveTimeout : BOOL;
_timReceiveTimeoutTime : TIME := T#500MS;
_tonReceiveTimeout : TON;
_uiLastReceivedResponseId : UINT := 0;
// Receive state machine
_iStateReceive : INT;
// Command data
_uiCmdId : UINT := 1;
_sCmd : STRING(255);
_sAck : STRING(255);
// Main state machine
_iState : INT := 0;
_diCounter : DINT;
_xSendCmd : BOOL;
_uiRetries : UINT;
_xCmdReceived : BOOL;
_iPlaceCmdSeperator : INT;
_sTmp : STRING;
_xReceivedResponseOk : BOOL;
_uiReceivedCommandId : UINT;
// Buffer before output
_xBusy : BOOL;
_xError : BOOL;
END_VAR
VAR CONSTANT
MAX_RETRIES : UINT := 3;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Call client server connection fb
_fbTcpConnection(
sSrvNetID:= '',
nMode:= ,
sRemoteHost:= sIpAddr,
nRemotePort:= udiPort,
bEnable:= _xConnect,
tReconnect:= T#2S,
bBusy=> ,
bError=> ,
nErrId=> ,
hSocket=> _hSocket,
eState=> );
// Get connected state
_xConnected := (_fbTcpConnection.eState = E_SocketConnectionState.eSOCKET_CONNECTED);
// Receive timeout after sending a command
_tonReceiveTimeout(IN := _xEnableReceiveTimeout, PT := _timReceiveTimeoutTime);
// Receive state machine
CASE _iStateReceive OF
// Main socket not connected
0:
IF _xConnected THEN
_iStateReceive := 10;
END_IF
// Call receive
10:
_fbSocketReceive(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= SIZEOF(_abReceivedBuffer) - _udiReceivedBytes,
pDest:= ADR(_abReceivedBuffer) + _udiReceivedBytes,
bExecute:= TRUE,
tTimeout:= _timReceiveTimeout,
bBusy=> ,
bError=> ,
nErrId=> ,
nRecBytes=> );
IF (NOT _fbSocketReceive.bBusy) AND (NOT _fbSocketReceive.bError) THEN
_fbSocketReceive(bExecute := FALSE);
IF _fbSocketReceive.nRecBytes > 0 THEN
_udiReceivedBytes := _udiReceivedBytes + _fbSocketReceive.nRecBytes;
_iStateReceive := 20;
ELSE
_iStateReceive := 15;
END_IF
END_IF
// If we have an error, check if we are connected
IF _fbSocketReceive.bError THEN
_fbSocketReceive(bExecute := FALSE);
_iStateReceive := 0;
END_IF
// Wait some time before rechecking
15:
_tonPollTimer(IN := TRUE, PT := _timPollingTime);
IF _tonPollTimer.Q THEN
_tonPollTimer(IN := FALSE);
_iStateReceive := 10;
END_IF
// Check if we are still connected
IF (NOT _xConnected) THEN
_tonPollTimer(IN := FALSE);
_sReceivedResponse := '';
_iStateReceive := 0;
END_IF
// Check received data
20:
// Check if received command is complete
MEMCPY(destAddr := ADR(_sReceivedResponse), srcAddr := ADR(_abReceivedBuffer), n := _udiReceivedBytes);
_udiReceivedBytes := 0;
//_xCmdReceived := TRUE;
// Go back to polling wait state
_iStateReceive := 15;
END_CASE
CASE _iState OF
// Wait for active connection to tray feeder
0:
IF _xConnected THEN
_iState := 10;
END_IF
// Connected and idle
10:
// Got to disconnected state if connection is lost
IF (NOT _xConnected) THEN
_iState := 0;
END_IF
IF _xSendCmd THEN
_xSendCmd := FALSE;
_xBusy := TRUE;
_iState := 20;
END_IF
// Check if we received a response without sending a command
// IF _xCmdReceived THEN
// _iState := 50;
// END_IF
// Send command
20:
_fbSocketSend(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= SIZEOF(_sCmd),
pSrc:= ADR(_sCmd),
bExecute:= TRUE,
tTimeout:= _timSendTimeout,
bBusy=> ,
bError=> ,
nErrId=> );
IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN
_fbSocketSend(bExecute := FALSE);
//_xEnableReceiveTimeout := TRUE;
//_iState := 30;
END_IF
IF _fbSocketSend.bError THEN
_fbSocketSend(bExecute := FALSE);
_iState := 90;
END_IF
// Wait for response
30:
// Received a response
IF _xCmdReceived THEN
_xCmdReceived := FALSE;
_xEnableReceiveTimeout := FALSE;
_uiRetries := 0;
_iState := 40;
END_IF
// Didnt receive command ack in time
// So resend the command if max retries are not reached
IF _tonReceiveTimeout.Q THEN
_xEnableReceiveTimeout := FALSE;
_uiRetries := _uiRetries + 1;
// Check if we reached the max number of retries
IF _uiRetries > MAX_RETRIES THEN
_iState := 90;
ELSE
// Retry by sendind command again
_iState := 20;
END_IF
END_IF
// Check response
40:
// Check for cmd id
IF (TO_STRING(_sReceivedResponse[0]) <> UINT_TO_STRING(_uiCmdId)) THEN
// Wrong command id received
_iState := 90;
END_IF
// For for response indicator
IF _sReceivedResponse[1] <> F_ToASC('<') THEN
// Wrong response indicator
_iState := 90;
END_IF
// Check for correct cmd
_xReceivedResponseOk := TRUE;
FOR _diCounter := 2 TO (LEN(_sReceivedResponse) - 1) DO
IF _sReceivedResponse[_diCounter] = F_ToASC(':') THEN
EXIT;
ELSIF _sReceivedResponse[_diCounter] <> _sCmd[_diCounter] THEN
_xReceivedResponseOk := FALSE;
EXIT;
END_IF
END_FOR
IF _xReceivedResponseOk THEN
_iState := 10;
ELSE
_iState := 90;
END_IF
50:
// Get command id
_uiReceivedCommandId := STRING_TO_UINT(TO_STRING(_sReceivedResponse[0]));
// Check if it is a new command
IF (_uiReceivedCommandId <> _uiLastReceivedResponseId) OR (_uiReceivedCommandId = 0) THEN
_uiLastReceivedResponseId := _uiReceivedCommandId;
xNewResponseReady := TRUE;
// Send acknowledgement
_iState := 60;
END_IF
// Prepare ack response
60:
_sAck := CONCAT(UINT_TO_STRING(_uiLastReceivedResponseId), '<');
FOR _diCounter := 2 TO (LEN(_sReceivedResponse) - 1) DO
IF _sReceivedResponse[_diCounter] <> F_ToASC(':') THEN
_sAck[_diCounter] := _sReceivedResponse[_diCounter];
ELSE
_sAck[_diCounter] := F_ToASC('\0');
EXIT;
END_IF
END_FOR
_iState := 70;
// Send ack response
70:
_fbSocketSend(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= SIZEOF(_sAck),
pSrc:= ADR(_sAck),
bExecute:= TRUE,
tTimeout:= _timSendTimeout,
bBusy=> ,
bError=> ,
nErrId=> );
IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN
_fbSocketSend(bExecute := FALSE);
_xEnableReceiveTimeout := TRUE;
_iState := 10;
END_IF
IF _fbSocketSend.bError THEN
_fbSocketSend(bExecute := FALSE);
_iState := 90;
END_IF
// Error
90:
_xError := TRUE;
_xBusy := FALSE;
IF xConfirmAlarms THEN
_xError := FALSE;
_iState := 0;
END_IF
END_CASE
// Copy output buffers to outputs
xConnected := _xConnected;
xBusy := _xBusy;
xError := _xError;]]></ST>
</Implementation>
<Method Name="M_GetResponse" Id="{48f8719d-7ed0-4fb1-824a-0bf475fcfc2c}">
<Declaration><![CDATA[METHOD M_GetResponse : STRING
VAR
_sTmp : STRING(255);
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[xNewResponseReady := FALSE;
MEMCPY(destAddr := ADR(_sTmp), ADR(_sReceivedResponse) + 2, n := INT_TO_UDINT(LEN(_sReceivedResponse) - 2));
M_GetResponse := _sTmp;]]></ST>
</Implementation>
</Method>
<Method Name="M_SendCmd" Id="{d00a8c1a-c183-4659-9c9e-be5b30566b7c}">
<Declaration><![CDATA[METHOD M_SendCmd : BOOL
VAR_INPUT
sCmd : STRING(80);
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Check if we are already sending a command
IF _xBusy OR _xError THEN
M_SendCmd := FALSE;
RETURN;
END_IF
// Increment command id
_uiCmdId := _uiCmdId + 1;
// Overflows at 9 and is reset to 1
IF _uiCmdId > 9 THEN
_uiCmdId := 1;
END_IF
// Create command with id
_sCmd := CONCAT(UINT_TO_STRING(_uiCmdId), '>');
_sCmd := CONCAT(_sCmd, sCmd);
// start sendind command state machine
_xSendCmd := TRUE;
M_SendCmd := TRUE;]]></ST>
</Implementation>
</Method>
</POU>
</TcPlcObject>

View File

@@ -1,38 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_TrayFeeder" Id="{e2e3e993-37de-42b1-80e1-7dba99a66e94}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FINAL FB_TrayFeeder EXTENDS FB_Isa88_SM
<Declaration><![CDATA[FUNCTION_BLOCK FINAL FB_TrayFeeder EXTENDS FB_PackMLGeneric
VAR_INPUT
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
_fbTcpConnection : FB_ClientServerConnection;
_sIpAddr : STRING;
_udiPort : UDINT;
_fbProtocolHandler : FB_TFProtocol;
_xTest : BOOL;
_xSendResult : BOOL;
_sCmd : STRING := 'STAT-FEED:';
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Call client server connection fb
_fbTcpConnection(
sSrvNetID:= '',
nMode:= ,
sRemoteHost:= _sIpAddr,
nRemotePort:= ,
bEnable:= ,
tReconnect:= ,
bBusy=> ,
bError=> ,
nErrId=> ,
hSocket=> ,
eState=> );
<ST><![CDATA[// IPs
// 192.168.1.10
// 192.168.1.11
_fbProtocolHandler(
sIpAddr:= _sIpAddr,
udiPort:= _udiPort,
xConfirmAlarms:= xConfirmAlarms,
xConnected=> ,
xNewResponseReady=> ,
xBusy=> ,
xError=> );
IF _xTest THEN
_xTest := FALSE;
_xSendResult := _fbProtocolHandler.M_SendCmd(sCmd := _sCmd);
END_IF
// Call isa88 base state machine
SUPER^();
// IPs
// 192.168.1.10
// 192.168.1.11]]></ST>
SUPER^();]]></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.
@@ -48,8 +54,17 @@ sIPAddr : STRING;
udiPort : UDINT;
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_sIpAddr := sIPAddr;
_udiPort := udiPort;]]></ST>
<ST><![CDATA[// Save connection settings
_sIpAddr := sIPAddr;
_udiPort := udiPort;
// Config state machine
_stSMConfig.xStoppingDisabled := TRUE;
_stSMConfig.xCompletingDisabled := TRUE;
_stSMConfig.xCompletedDisabled := TRUE;
_stSMConfig.xAbortingDisabled := TRUE;]]></ST>
</Implementation>
</Method>
</POU>

View File

@@ -6,6 +6,10 @@ VAR_GLOBAL
xErrAck : BOOL;
xOpenAllChambers : BOOL;
// Unit states
stTrayFeederInputState : ST_PMLs;
stTRayFeederInputAdmin : ST_PMLa;
END_VAR]]></Declaration>
</GVL>
</TcPlcObject>

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_PI" Id="{d504557e-7fd7-4784-a00a-5d7d1bed0c95}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PI
VAR_INPUT
rSP : REAL;
rPV : REAL;
rKp : REAL;
rTn : REAL;
xEnable : BOOL;
xSaturatedUpper : BOOL := FALSE;
xSaturatedLower : BOOL := FALSE;
END_VAR
VAR_OUTPUT
rMV : REAL;
END_VAR
VAR
_rError : REAL := 0.0;
_rIntegral : REAL := 0.0;
_rProportinal : REAL := 0.0;
_rDeltaIntegral : REAL := 0.0;
_fbGetCurTaskIdx : GETCURTASKINDEX;
_rT : REAL;
_xFirstCylce : BOOL := TRUE;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xFirstCylce THEN
_xFirstCylce := FALSE;
// Get current task time
_fbGetCurTaskIdx();
_rT := LREAL_TO_REAL(UDINT_TO_LREAL(TwinCAT_SystemInfoVarList._TASKInfo[_fbGetCurTaskIdx.index].CycleTime) * 10E-5);
END_IF
IF xEnable THEN
_rError := rSP - rPV;
ELSE
_rError := 0.0;
_rIntegral := 0.0;
rMV := 0.0;
RETURN;
END_IF
// Calculate proportinal part
_rProportinal := rKp * _rError;
// Calculate controller output
rMV := _rProportinal + _rIntegral;
// Calculate integral for this step
IF rTn <> 0 THEN
_rDeltaIntegral := (rKp * _rT / rTn) * _rError;
ELSE
_rDeltaIntegral := 0;
END_IF
// Only add new integral part if we are going away from the upper or lower bound
IF (xSaturatedUpper AND (_rDeltaIntegral > 0.0)) THEN
_rDeltaIntegral := 0.0;
END_IF
IF (xSaturatedLower AND (_rDeltaIntegral < 0.0)) THEN
_rDeltaIntegral := 0.0;
END_IF
// Calculate integral part
_rIntegral := _rIntegral + _rDeltaIntegral;
// Reset integral with deactivated integral time
IF (rTn = 0.0) AND (_rIntegral <> 0) THEN
_rIntegral := 0.0;
END_IF]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_PackMLGenericHMIInterface" Id="{54cdd4b1-e09e-436e-9737-cc31548609eb}">
<Declaration><![CDATA[TYPE ST_PackMLGenericHMIInterface :
STRUCT
stBtnAbort : ST_HMI_CONTROL_BUTTON;
stBtnClear : ST_HMI_CONTROL_BUTTON;
stBtnHold : ST_HMI_CONTROL_BUTTON;
stBtnReset : ST_HMI_CONTROL_BUTTON;
stBtnStart : ST_HMI_CONTROL_BUTTON;
stBtnStop : ST_HMI_CONTROL_BUTTON;
stBtnSuspend : ST_HMI_CONTROL_BUTTON;
stBtnUnhold : ST_HMI_CONTROL_BUTTON;
stBtnUnsuspend : ST_HMI_CONTROL_BUTTON;
eCurrentMode : E_PackMLUnitMode;
eCurrentState : E_PackMLState;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_PackMLGeneric" Id="{f562a10e-01bc-407d-9fc0-2837d13c10b1}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PackMLGeneric IMPLEMENTS I_UnitState
<Declaration><![CDATA[FUNCTION_BLOCK FB_PackMLGeneric
VAR_INPUT
stCommand : ST_PMLc;
END_VAR
@@ -12,6 +12,9 @@ VAR_OUTPUT
// Admin data
stAdmin : ST_PMLa;
END_VAR
VAR_IN_OUT
//stHMIInterface : ST_PackMLGenericHMIInterface;
END_VAR
VAR
// State machine handler
_fbStateMachine : FB_PackMLStateMachine;
@@ -143,85 +146,161 @@ CASE stStatus.eStateCurrent OF
;
END_CASE]]></ST>
</Implementation>
<Method Name="M_Aborted" Id="{db1a684f-e4e1-4d89-a3aa-9b9dfde0508c}">
<Declaration><![CDATA[METHOD M_Aborted
<Folder Name="Commands" Id="{11740802-7551-418d-83f3-5b2d5c93c299}" />
<Folder Name="States" Id="{2cf25144-1e5c-4db8-ba57-9d98461c53ce}" />
<Action Name="A_HandleHMIOutput" Id="{73c47dbe-0382-4e83-8c9e-e4744dd66394}">
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Action>
<Method Name="M_Abort" Id="{a8ac7d94-0639-4bcc-b083-994135ce6951}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Abort : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF (stStatus.eStateCurrent <> E_PackMLState.ABORTED) AND (stStatus.eStateCurrent <> E_PackMLState.ABORTING) THEN
_eCmd := E_PackMLCmd.ABORT;
M_Abort := TRUE;
ELSE
M_Abort := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Aborted" Id="{db1a684f-e4e1-4d89-a3aa-9b9dfde0508c}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Aborted
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Aborting" Id="{928ad614-a3a7-4c6c-b1bc-55ae54e4c95f}">
<Declaration><![CDATA[METHOD M_Aborting
<Method Name="M_Aborting" Id="{928ad614-a3a7-4c6c-b1bc-55ae54e4c95f}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Aborting
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Clearing" Id="{1716cf1b-94c6-4995-8b3f-c7ebcf5727d3}">
<Declaration><![CDATA[METHOD M_Clearing
<Method Name="M_Clear" Id="{1ae1174f-acb8-4f8a-bc73-ec233f6637b2}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Clear : BOOL
]]></Declaration>
<Implementation>
<ST><![CDATA[IF stStatus.eStateCurrent = E_PackMLState.ABORTED THEN
_eCmd := E_PackMLCmd.CLEAR;
M_Clear := TRUE;
ELSE
M_Clear := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Clearing" Id="{1716cf1b-94c6-4995-8b3f-c7ebcf5727d3}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Clearing
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Complete" Id="{33df5dea-d83b-48e1-8898-d7c8e1f031bd}">
<Declaration><![CDATA[METHOD M_Complete
<Method Name="M_Complete" Id="{33df5dea-d83b-48e1-8898-d7c8e1f031bd}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Complete
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Completing" Id="{341608cb-1218-481f-929c-cb79602c11ab}">
<Declaration><![CDATA[METHOD M_Completing
<Method Name="M_Completing" Id="{341608cb-1218-481f-929c-cb79602c11ab}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Completing
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Execute" Id="{2a469169-0eb2-43c9-be21-48909285ee44}">
<Declaration><![CDATA[METHOD M_Execute
<Method Name="M_Execute" Id="{2a469169-0eb2-43c9-be21-48909285ee44}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Execute
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Held" Id="{05b040b0-b1b9-4afd-81d0-88fc1f1a7f9b}">
<Declaration><![CDATA[METHOD M_Held
<Method Name="M_Held" Id="{05b040b0-b1b9-4afd-81d0-88fc1f1a7f9b}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Held
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Holding" Id="{519b03b3-2409-4b45-818f-535b3e16b22e}">
<Declaration><![CDATA[METHOD M_Holding
<Method Name="M_Hold" Id="{63908543-c84a-46a6-803b-0cd0a69ee040}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Hold : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF (stStatus.eStateCurrent = E_PackMLState.EXECUTE) OR (stStatus.eStateCurrent = E_PackMLState.SUSPENDED) THEN
_eCmd := E_PackMLCmd.HOLD;
M_Hold := TRUE;
ELSE
M_Hold := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Holding" Id="{519b03b3-2409-4b45-818f-535b3e16b22e}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Holding
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Idle" Id="{aa784f5c-7adf-4c9f-a414-65b10afd2772}">
<Declaration><![CDATA[METHOD M_Idle
<Method Name="M_Idle" Id="{aa784f5c-7adf-4c9f-a414-65b10afd2772}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Idle
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Resetting" Id="{4050ed6f-edbe-4c3e-ac42-919a37a47ea9}">
<Declaration><![CDATA[METHOD M_Resetting
<Method Name="M_Reset" Id="{9acdfbad-6477-4a07-aac5-b9a102467964}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Reset : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF stStatus.eStateCurrent = E_PackMLState.STOPPED THEN
_eCmd := E_PackMLCmd.RESET;
M_Reset := TRUE;
ELSE
M_Reset := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Resetting" Id="{4050ed6f-edbe-4c3e-ac42-919a37a47ea9}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Resetting
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Starting" Id="{0059e7f6-5f2a-40e4-9d9b-652f221495a9}">
<Declaration><![CDATA[METHOD M_Starting
<Method Name="M_Start" Id="{86eb6432-588a-4480-b09e-72e5733dc716}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Start : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF stStatus.eStateCurrent = E_PackMLState.IDLE THEN
_eCmd := E_PackMLCmd.RESET;
M_Start := TRUE;
ELSE
M_Start := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Starting" Id="{0059e7f6-5f2a-40e4-9d9b-652f221495a9}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Starting
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_StateComplete" Id="{0cf3625e-8009-4108-a9f4-d98c991f9930}">
<Declaration><![CDATA[METHOD M_StateComplete
<Method Name="M_StateComplete" Id="{0cf3625e-8009-4108-a9f4-d98c991f9930}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_StateComplete
]]></Declaration>
<Implementation>
<ST><![CDATA[// Reset state state machine
@@ -231,43 +310,104 @@ _iSSM := 0;
_fbStateMachine.M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Stopped" Id="{9f8a09cf-f3be-4d60-b5e4-cd9572fae88c}">
<Declaration><![CDATA[METHOD M_Stopped
<Method Name="M_Stop" Id="{8beef0bf-5aa2-4644-ae54-6acbcdaacef4}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Stop : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF (stStatus.eStateCurrent <> E_PackMLState.ABORTED)
AND (stStatus.eStateCurrent <> E_PackMLState.ABORTING)
AND (stStatus.eStateCurrent <> E_PackMLState.CLEARING)
AND (stStatus.eStateCurrent <> E_PackMLState.STOPPING)
AND (stStatus.eStateCurrent <> E_PackMLState.STOPPED)
THEN
_eCmd := E_PackMLCmd.STOP;
M_Stop := TRUE;
ELSE
M_Stop := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Stopped" Id="{9f8a09cf-f3be-4d60-b5e4-cd9572fae88c}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Stopped
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Stopping" Id="{193565ef-cf20-428c-b726-e7c1b61375c5}">
<Declaration><![CDATA[METHOD M_Stopping
<Method Name="M_Stopping" Id="{193565ef-cf20-428c-b726-e7c1b61375c5}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Stopping
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Suspended" Id="{222c3ad7-f7d5-4773-8e98-863345472053}">
<Declaration><![CDATA[METHOD M_Suspended
<Method Name="M_Suspend" Id="{a69941cd-31ee-44b4-9c8b-a7c774e40447}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Suspend : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF stStatus.eStateCurrent = E_PackMLState.EXECUTE THEN
_eCmd := E_PackMLCmd.SUSPEND;
M_Suspend := TRUE;
ELSE
M_Suspend := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Suspended" Id="{222c3ad7-f7d5-4773-8e98-863345472053}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Suspended
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</Method>
<Method Name="M_Suspending" Id="{0f5d52e2-2a54-4ea9-a0c4-7f08229c4f21}">
<Declaration><![CDATA[METHOD M_Suspending
<Method Name="M_Suspending" Id="{0f5d52e2-2a54-4ea9-a0c4-7f08229c4f21}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Suspending
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Unholding" Id="{662dd054-329b-4e57-ba77-486f92af795a}">
<Declaration><![CDATA[METHOD M_Unholding
<Method Name="M_Unhold" Id="{6af8dbfd-0422-459a-b99f-09e9246d2621}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Unhold : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF (stStatus.eStateCurrent = E_PackMLState.HELD) THEN
_eCmd := E_PackMLCmd.UNSUSPEND;
M_Unhold := TRUE;
ELSE
M_Unhold := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Unholding" Id="{662dd054-329b-4e57-ba77-486f92af795a}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Unholding
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>
</Implementation>
</Method>
<Method Name="M_Unsuspending" Id="{80fb11c4-916a-4f8f-9cf9-b9a2d51524a1}">
<Declaration><![CDATA[METHOD M_Unsuspending
<Method Name="M_Unsuspend" Id="{ff6f4f4b-4bc6-47f7-a257-a2bcea2d6ae3}" FolderPath="Commands\">
<Declaration><![CDATA[METHOD M_Unsuspend : BOOL
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF (stStatus.eStateCurrent = E_PackMLState.SUSPENDED) THEN
_eCmd := E_PackMLCmd.UNSUSPEND;
M_Unsuspend := TRUE;
ELSE
M_Unsuspend := FALSE;
END_IF]]></ST>
</Implementation>
</Method>
<Method Name="M_Unsuspending" Id="{80fb11c4-916a-4f8f-9cf9-b9a2d51524a1}" FolderPath="States\">
<Declaration><![CDATA[METHOD PROTECTED M_Unsuspending
]]></Declaration>
<Implementation>
<ST><![CDATA[M_StateComplete();]]></ST>

View File

@@ -27,9 +27,34 @@
<SubType>Code</SubType>
<ExcludeFromBuild>false</ExcludeFromBuild>
</Compile>
<Compile Include="00_Main\ST_PosData.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="00_Main\ST_TrayFeederCamPosData.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Etcher\FB_Etcher.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\FB_CoolPlate.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\FB_HeatCoolPlates.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\FB_HotPlate.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\GVL_HeatCoolConfig.TcGVL">
<SubType>Code</SubType>
<LinkAlways>true</LinkAlways>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\ST_SerialCrl.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\ST_SerialStatus.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HVTester\FB_HVTester.TcPOU">
<SubType>Code</SubType>
</Compile>
@@ -66,6 +91,9 @@
<Compile Include="01_Stationen\Kuka_Robot\ST_KukaRobot_UnitFeedbacks.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\TrayFeeder\FB_TFProtocol.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\TrayFeeder\FB_TrayFeeder.TcPOU">
<SubType>Code</SubType>
</Compile>
@@ -73,6 +101,9 @@
<SubType>Code</SubType>
<LinkAlways>true</LinkAlways>
</Compile>
<Compile Include="LibraryCandidates\FB_PI.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\E_PackMLCmd.TcDUT">
<SubType>Code</SubType>
</Compile>
@@ -112,6 +143,9 @@
<Compile Include="LibraryCandidates\PackML\DUTs\PackTags\ST_PMLs.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\ST_PackMLGenericHMIInterface.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="LibraryCandidates\PackML\DUTs\ST_PackMLStateMachineConfig.TcDUT">
<SubType>Code</SubType>
</Compile>
@@ -150,6 +184,7 @@
<Folder Include="01_Stationen\Kuka_Robot\InterfaceUnions" />
<Folder Include="01_Stationen\HVTester" />
<Folder Include="01_Stationen\Etcher" />
<Folder Include="01_Stationen\HeatCoolPlates" />
<Folder Include="01_Stationen\TrayFeeder" />
<Folder Include="01_Stationen" />
<Folder Include="00_Main" />
@@ -221,6 +256,10 @@
<DefaultResolution>Tc2_TcpIp, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_TcpIp</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc2_Utilities">
<DefaultResolution>Tc2_Utilities, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc2_Utilities</Namespace>
</PlaceholderReference>
<PlaceholderReference Include="Tc3_Module">
<DefaultResolution>Tc3_Module, * (Beckhoff Automation GmbH)</DefaultResolution>
<Namespace>Tc3_Module</Namespace>

File diff suppressed because one or more lines are too long

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<TargetSystemConfig Crc="3821398253" Version="1.5">
<TargetSystemConfig Crc="1407690307" Version="1.5">
<TargetSystemType>HSafetyPLC</TargetSystemType>
<TargetSystemSubType>EL1918</TargetSystemSubType>
<IsExternalDevice>false</IsExternalDevice>
@@ -7,7 +7,7 @@
<TargetSystemObjectName>PC_K01_KL02 (EL1918)</TargetSystemObjectName>
<SoftwareVersion>02 (V01.08) </SoftwareVersion>
<SerialNumber>3885647</SerialNumber>
<ProjectCRC>32969</ProjectCRC>
<ProjectCRC>21996</ProjectCRC>
<MapProjectCRC>false</MapProjectCRC>
<MapSerialNumber>false</MapSerialNumber>
<VersionNumber>1</VersionNumber>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Crc="2889350834" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<Project Crc="1261477591" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<SchemaVersion>2.0</SchemaVersion>
@@ -62,7 +62,6 @@
<None Include="TwinSafeGroup1\Alias Devices\PC_K01_KL01 %28EL1918%29.sds" />
<None Include="TwinSafeGroup1\Alias Devices\Other_Err.sds" />
<None Include="TwinSafeGroup1\Alias Devices\RobotMain - Module 2 %28Safety Data Bitf %288 Byte%29%29.sds" />
<None Include="TwinSafeGroup1\Alias Devices\RunStop.sds" />
<None Include="TwinSafeGroup1\Alias Devices\SafetyChuck - Module 1 %28Safety Process Data, 2 axis%29.sds" />
<None Include="TwinSafeGroup1\Alias Devices\MainDoorLock.sds" />
<None Include="TwinSafeGroup1\Alias Devices\NIO_DOOR_LOCK.sds" />

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<SafetyDeviceDesc Crc="852270779" FileFormatVersion="1.9">
<AliasDeviceType>
<Type>1</Type>
<SubType>1</SubType>
<VendorId>0</VendorId>
</AliasDeviceType>
<SDSID>9</SDSID>
<StandardAliasDevice>
<LinkingMode>Manual</LinkingMode>
<IO>
<Name>In</Name>
<BitOffsMessage>0</BitOffsMessage>
<DataType>BIT</DataType>
<BitSize>1</BitSize>
</IO>
</StandardAliasDevice>
</SafetyDeviceDesc>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<safetyApplication Crc="1147292257" xmlns:dm0="http://schemas.microsoft.com/VisualStudio/2008/DslTools/Core" dslVersion="1.5.0.0" Id="d197abde-1e46-4da1-af49-0c5e8acb0bf2" name="" mapState="false" mapDiag="false" groupOrderId="0" passificationAllowed="false" temporaryDeactivationAllowed="false" permamentDeactivationAllowed="false" xmlid="0" analogFBOutputReplacementValues="Zero" verifyAnalogFBInputsIfStart="false" userFbId="00000000-0000-0000-0000-000000000000" xmlns="http://schemas.microsoft.com/dsltools/SafetyApplicationLanguage">
<safetyApplication Crc="1919680748" xmlns:dm0="http://schemas.microsoft.com/VisualStudio/2008/DslTools/Core" dslVersion="1.5.0.0" Id="d197abde-1e46-4da1-af49-0c5e8acb0bf2" name="" mapState="false" mapDiag="false" groupOrderId="0" passificationAllowed="false" temporaryDeactivationAllowed="false" permamentDeactivationAllowed="false" xmlid="0" analogFBOutputReplacementValues="Zero" verifyAnalogFBInputsIfStart="false" userFbId="00000000-0000-0000-0000-000000000000" xmlns="http://schemas.microsoft.com/dsltools/SafetyApplicationLanguage">
<networks>
<safetyApplicationHasNetworks Id="980a2a23-c4cd-4476-8c84-c716c4cfd6d9">
<Network Id="cf310e0f-e61c-4ed8-80c0-d6a8048dade1" name="Network8" networkName="Network8" intId="72" networkOrderId="0">
@@ -1628,203 +1628,209 @@
<variableHasTargetUsages Id="840fffbf-5d08-4a38-b61d-12d88de0c3da">
<variableUsages Id="00efd576-263d-4965-a7bf-2dda38098f5f">
<usages>
<variableUsagesHasUsages Id="96cd6e17-8b20-4ca3-8d5a-8428dd0dead5">
<fbPortUsage Id="02e5b441-b599-45a8-9805-adda341c3f34">
<variableUsagesHasUsages Id="8e45f512-c00c-42ca-9be2-736f3fb2e540">
<fbPortUsage Id="c7335687-eb12-46ed-a086-9b0323543e30">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="538b741a-c660-48c4-aed2-ae8c57ec2112">
<fbPortUsageReferencesFunctionBlockPort Id="af75820c-45eb-4068-866c-04be78916465">
<inPortMoniker name="//Network3/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="1604a1fe-d17f-4672-9f41-74b79f249b37">
<fbPortUsage Id="1ea18004-d7bb-4a16-85fc-30e17204c03d">
<variableUsagesHasUsages Id="c68c2110-4da7-463a-a00c-db06e5497515">
<fbPortUsage Id="4db16818-258f-4b39-b01f-093ecb8dfaa2">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="a4fb47dd-4bbf-424f-84c6-2057d5464142">
<fbPortUsageReferencesFunctionBlockPort Id="4865d82c-8a4b-4794-9a47-350b552c38a1">
<inPortMoniker name="//Network4/FBAnd1/AndIn1" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="a071a223-8b55-4205-98d7-0199f61c06fa">
<fbPortUsage Id="ae47662c-0791-407e-8351-57481dab37c9">
<variableUsagesHasUsages Id="c56a9613-f513-43b4-a431-6e59ba05e5a2">
<fbPortUsage Id="b3684c55-ecbd-4e7a-9428-7c4f6e08f40e">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="a9aab7d0-8aa6-4362-ae3b-2983cd58506f">
<fbPortUsageReferencesFunctionBlockPort Id="e40d3295-9ea8-4ab7-8050-306e226644bf">
<inPortMoniker name="//Network6/FBEstop1/EStopIn1" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="c23a6eff-3841-402b-9bef-cd816265906e">
<fbPortUsage Id="d9898fd8-82a4-4ba0-ac38-03a88b33d638">
<variableUsagesHasUsages Id="938e0b1c-485c-4a02-a925-46fe06b4d8fa">
<fbPortUsage Id="ac569780-d85c-4ac2-9fc6-897221a1162b">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="051e370d-804b-43b3-a60f-c3c4a8e56e12">
<fbPortUsageReferencesFunctionBlockPort Id="2599d4f5-27b0-47f3-85e2-0e7c60f6938f">
<inPortMoniker name="//Network7/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="3af0bd47-223d-48e7-9c8b-e106508538ce">
<fbPortUsage Id="2e4dac08-57d8-4535-b31f-8d1183aac733">
<variableUsagesHasUsages Id="bf3a4e63-bc82-4c45-99d7-20a3e30fc59e">
<fbPortUsage Id="ace7af9f-acb3-44ee-9d8e-af5520613cf0">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="32448f4b-a390-4cd3-a28b-c96eecaed789">
<fbPortUsageReferencesFunctionBlockPort Id="779e6254-5bd6-4f8d-af24-7f3bd923d20d">
<inPortMoniker name="//Network9/FBAnd1/AndIn1" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="19bfdb69-c682-4454-857b-6ff1adbc3c67">
<fbPortUsage Id="308bb9a1-3284-4028-a17c-ae346be6d552">
<variableUsagesHasUsages Id="1bf2fe86-8a6e-46b0-b697-771ec132423c">
<fbPortUsage Id="a52b9094-926e-48e3-b406-7325dff9b7e5">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="4ab71dc4-fb06-474d-91e7-d338b25067ba">
<fbPortUsageReferencesFunctionBlockPort Id="561823c0-8581-47a2-84b8-c7288e114ef6">
<inPortMoniker name="//Network10/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="a637f2b5-7bd8-443e-a303-748fb0f1118a">
<fbPortUsage Id="ec02f4ab-2b29-44f8-9bf7-cd39944c2541">
<variableUsagesHasUsages Id="747674ab-e58f-49f1-92b3-14b8cce1dad0">
<fbPortUsage Id="39f125c7-19ff-4247-a34a-4c995e165e2f">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="5e5fce8b-4e08-4ea7-a991-7f8ada653ca7">
<fbPortUsageReferencesFunctionBlockPort Id="b04c3d29-6e49-4cc4-b70f-5bd772513ea1">
<inPortMoniker name="//Network11/FBAnd1/AndIn1" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="758a727c-0ced-49dd-a8fc-4346a224c6c5">
<fbPortUsage Id="1c9b566a-d447-4a0a-8460-6321356eabaa">
<variableUsagesHasUsages Id="cee3146a-3d96-46d6-b628-252f9539b6bc">
<fbPortUsage Id="92053933-be56-4914-bcd9-5ab6136e9707">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="08852d63-ff2a-4383-be63-015dd07b5701">
<fbPortUsageReferencesFunctionBlockPort Id="f77fbac9-5590-484e-ba28-3739468c74f7">
<inPortMoniker name="//Network12/FBAnd1/AndIn1" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="1c421845-bfda-4ea7-b633-703a4e725bdd">
<fbPortUsage Id="3f89b5d6-4db2-4031-9aac-88b50145e5e6">
<variableUsagesHasUsages Id="c0786058-5f31-4543-bff5-1eb8750c8f1d">
<fbPortUsage Id="5df5bdac-985d-4fe6-a45d-d10aaae6c853">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="d9d9d149-4a68-47c2-9349-02f3da17ba4f">
<fbPortUsageReferencesFunctionBlockPort Id="9c626936-6fc2-4457-9d49-4606bbe835b6">
<inPortMoniker name="//Network13/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="37129f06-8836-4e17-9884-72a667ce470c">
<fbPortUsage Id="02ac23e6-f099-4bba-93e5-e097b3883b96">
<variableUsagesHasUsages Id="39afded6-b358-490b-bc17-c2765af6c9af">
<fbPortUsage Id="21cb1970-cae7-401a-a7bd-e7b32d674a2b">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="a7edb3d2-e936-4a0d-a9a5-142e6722cd4d">
<fbPortUsageReferencesFunctionBlockPort Id="4cad8f59-9741-409b-9d4a-5d6d93338db3">
<inPortMoniker name="//Network14/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="fc7c4f69-cb4d-4539-adeb-513e051dc61e">
<fbPortUsage Id="1d7c3c31-5da3-4fb9-841e-17a0717ddad0">
<variableUsagesHasUsages Id="4c038ae2-f12a-47ca-bca6-95acf431db35">
<fbPortUsage Id="4ff09a82-4e47-4ce5-b9fe-cfabf3403df6">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="bd269440-4928-4da5-ac66-f7bf9b5eb1f2">
<fbPortUsageReferencesFunctionBlockPort Id="b839afec-d7d1-442b-a56a-544f3a3a1235">
<inPortMoniker name="//Network15/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="93e70b66-3adb-4a20-8093-e67d8fea6c4e">
<fbPortUsage Id="fff2fa06-99c4-4a68-95e5-c12c708bd7ef">
<variableUsagesHasUsages Id="8a319aef-5e9f-4e92-831c-b71116c2bfbb">
<fbPortUsage Id="80d026d1-dd97-4adb-9b13-0e533d8815eb">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="09600f31-2705-4e89-bf85-2bd23e06c154">
<fbPortUsageReferencesFunctionBlockPort Id="21870431-cfa0-4ec5-9f11-536d2cf0d482">
<inPortMoniker name="//Network16/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="fd840994-81e8-4520-ab79-f7af0b021ef9">
<fbPortUsage Id="48d3845e-5e49-4438-98e2-b13d5dfcf4d9">
<variableUsagesHasUsages Id="03b472ac-8eeb-496d-9a6a-3c40df4c8fe0">
<fbPortUsage Id="0828a104-51bd-4e42-8833-ca8de938e40f">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="97a40c99-a504-43a5-870d-314258c8d9b5">
<fbPortUsageReferencesFunctionBlockPort Id="fc1f78bc-bb79-4942-a5a4-b386a225ec46">
<inPortMoniker name="//Network17/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="0f26aee7-2d83-4aeb-9411-95d6b0dd55c7">
<fbPortUsage Id="4a587277-1ce6-44d1-b1a3-e2178ccef721">
<variableUsagesHasUsages Id="af1daa17-21fe-40c5-ac63-e3b824c26e34">
<fbPortUsage Id="ee8f8686-1d4d-41c4-83b7-a0e5f3fc1371">
<functionBlockPort>
<fbPortUsageReferencesFunctionBlockPort Id="1c52195f-5bc5-4998-b866-03f68200215b">
<fbPortUsageReferencesFunctionBlockPort Id="4b8d112f-db90-4519-b234-7c4db901616d">
<inPortMoniker name="//Network19/FBAnd1/AndIn2" />
</fbPortUsageReferencesFunctionBlockPort>
</functionBlockPort>
</fbPortUsage>
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="0261abfc-7f5a-4100-b42d-9fdb926b4c4d">
<aliasDeviceIoUsage Id="672b2fe7-3259-43d4-ac85-ca4ce7d31a34" sdsId="172" channelId="1" functionId="1879113985" />
<variableUsagesHasUsages Id="4df7b182-4f18-47bd-bffa-f57a78385366">
<aliasDeviceIoUsage Id="04f705f1-6c64-4f9f-88a8-c7c33cb16c35" sdsId="172" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="8fa40bba-9275-4a09-8a85-e5bf14023061">
<aliasDeviceIoUsage Id="6c67b7d4-7a13-4710-8f7d-8becc9e2a9a9" sdsId="172" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="4a1139e4-1d60-45a3-b321-9625bedd23d5">
<aliasDeviceIoUsage Id="89617f70-b0f8-4f19-b664-0215bda03899" sdsId="172" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="09c26912-bc0d-45b4-8c30-10371adad25b">
<aliasDeviceIoUsage Id="58213c6e-acdd-4449-aed1-b98cb22bb7f6" sdsId="172" channelId="3" functionId="1879114497" />
<variableUsagesHasUsages Id="bf45a47c-beca-43e4-989c-fb127c5ef188">
<aliasDeviceIoUsage Id="ef305099-a716-493c-b366-93486ed0c6b8" sdsId="172" channelId="3" functionId="1879114497" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="8ae03375-53ea-4364-aab6-006811f031fb">
<aliasDeviceIoUsage Id="d35d4be3-427a-49fc-944c-86ee7b58b3b4" sdsId="195" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="75302293-b84d-4c4a-928b-a08bba18c944">
<aliasDeviceIoUsage Id="10df16fc-79a0-4bc7-844d-59dbfd228725" sdsId="195" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="1aacbdfa-de0f-448b-8d0b-f33b9e1b84aa">
<aliasDeviceIoUsage Id="6f98022e-638d-4dc9-918c-73b4694b3486" sdsId="195" channelId="3" functionId="1879114497" />
<variableUsagesHasUsages Id="dcb0d2a8-d85a-4362-bb66-dbbc74cc33c7">
<aliasDeviceIoUsage Id="2c90e22a-300f-4ade-9485-45de39c4271e" sdsId="195" channelId="3" functionId="1879114497" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="52a80131-8267-46a5-a6e1-e4ef3c394e45">
<aliasDeviceIoUsage Id="1dcdf94e-7032-4c97-b671-fc3a88dfde54" sdsId="195" channelId="4" functionId="1879114753" />
<variableUsagesHasUsages Id="ab75cbd4-6e87-4642-97e8-a2b866be98bc">
<aliasDeviceIoUsage Id="64de6329-1093-46a4-b402-ad7a5f86cb9f" sdsId="195" channelId="4" functionId="1879114753" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="a77be452-603e-4078-b0a9-24dfc5172c16">
<aliasDeviceIoUsage Id="f01bf2e1-db1e-4a37-b576-94282e41adea" sdsId="183" channelId="1" functionId="1879113985" />
<variableUsagesHasUsages Id="fec2863a-237c-40bf-8f3a-f99a2525aac9">
<aliasDeviceIoUsage Id="9d6fa6db-b907-4dd7-a0ed-ad189a28fd80" sdsId="183" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="48f954b2-1656-42fe-8035-c1c6a75cec4f">
<aliasDeviceIoUsage Id="de5d2c7b-1514-411a-b0c7-31c0fe1c32d3" sdsId="183" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="0651686c-09de-4592-b590-3478aee4aa07">
<aliasDeviceIoUsage Id="d35eae4b-f708-4c00-9c8d-dfec7bad2815" sdsId="183" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="5757804c-4647-4ede-8c62-67761e7f52a7">
<aliasDeviceIoUsage Id="3c884124-d7c6-446d-afe4-6390e9f1422a" sdsId="183" channelId="3" functionId="1879114497" />
<variableUsagesHasUsages Id="dd700d85-d225-4c6e-a845-2d692d648719">
<aliasDeviceIoUsage Id="874fa81b-f023-4b87-b214-297de239174f" sdsId="183" channelId="3" functionId="1879114497" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="c536a657-717c-4b46-9668-0d383476ccf4">
<aliasDeviceIoUsage Id="8b1490f6-2d68-4eb6-b2e5-0d126599252c" sdsId="196" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="031891c2-2512-4f7a-9e33-dec74b6e7113">
<aliasDeviceIoUsage Id="6bb02821-9e6c-4d49-803f-5c7d8f5e8499" sdsId="196" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="3a9e6ef0-3a0c-4775-84a9-5699359ffb1c">
<aliasDeviceIoUsage Id="4d3ee1d3-8edd-4d3d-950a-541d325e9f79" sdsId="196" channelId="3" functionId="1879114497" />
<variableUsagesHasUsages Id="4cd46286-c428-4212-93fe-7df15e8a6c03">
<aliasDeviceIoUsage Id="9cf808a6-a52c-4177-9b67-0bc98ef48ab5" sdsId="196" channelId="3" functionId="1879114497" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="1bc75964-cf22-416d-b83a-bbe960d04253">
<aliasDeviceIoUsage Id="eff7545c-b40f-4ea0-bb31-4bb58d7fe579" sdsId="196" channelId="4" functionId="1879114753" />
<variableUsagesHasUsages Id="9c841a39-f032-4b2c-b9dd-4473233b873c">
<aliasDeviceIoUsage Id="3ed82322-e7d4-4c77-94a0-801fab70efaf" sdsId="196" channelId="4" functionId="1879114753" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="69df6abb-10d6-4668-89ad-9b01671ab075">
<aliasDeviceIoUsage Id="81589773-1ef0-4292-8949-a4682bb42b54" sdsId="164" channelId="1" functionId="1879113985" />
<variableUsagesHasUsages Id="6320f68b-574c-4f2a-a8b4-2a7211d29bb3">
<aliasDeviceIoUsage Id="49f11b54-a7e5-4951-84be-02471e540c98" sdsId="164" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="3f9ac284-b8e5-4b17-99a8-8c0a9a1ef439">
<aliasDeviceIoUsage Id="4c2ae005-0e50-4b01-98f3-ab4d48afeec3" sdsId="164" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="47ebde49-6530-41c5-a876-470a81c5aa5e">
<aliasDeviceIoUsage Id="5337c456-4a57-44fe-b78d-a49b43a042ea" sdsId="164" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="9d83b3cf-9022-4cc7-843c-8d919cc8ead1">
<aliasDeviceIoUsage Id="7109bc36-596b-40cf-8760-16b2e504a7f9" sdsId="197" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="d9ae5440-b589-4e92-94dc-f6f7d1b69707">
<aliasDeviceIoUsage Id="ba342559-cc4c-45e1-bd0f-ba7156f64bd2" sdsId="197" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="f98eb314-7a85-45b0-99a2-86f164764824">
<aliasDeviceIoUsage Id="b1b6abdb-d95c-4cad-982b-b7843760ce2b" sdsId="157" channelId="1" functionId="1131179972" />
<variableUsagesHasUsages Id="bf47cf66-ccc5-4c7d-9964-aabd6466b3e4">
<aliasDeviceIoUsage Id="cc36c3b4-c364-423d-9978-bff2fabfc24c" sdsId="157" channelId="1" functionId="1131179972" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="290538af-70de-4299-8b10-97fc4bba50e5">
<aliasDeviceIoUsage Id="fbb23e98-99fe-4672-a5d8-b4bdaef85833" sdsId="161" channelId="1" functionId="1879113985" />
<variableUsagesHasUsages Id="a5a6f4f9-ee7e-405e-a5da-bd85eb13635e">
<aliasDeviceIoUsage Id="525ab9bf-fa84-4ba8-8bcd-ede4a22de9bf" sdsId="155" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="6b3f0bff-5982-4c0f-9a01-c6ef2d736368">
<aliasDeviceIoUsage Id="1459c0a4-dc9e-4238-ae14-0aa7ed6fb4e9" sdsId="161" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="02377bcb-afc6-44f9-a3c6-e34d5f0dd337">
<aliasDeviceIoUsage Id="3c41d4e1-0f9c-4066-8c09-70769c877835" sdsId="155" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="5595b72e-fe47-4980-b029-5183284ac496">
<aliasDeviceIoUsage Id="dc348f25-bcb0-4a4c-830e-7cd68acd6e04" sdsId="185" channelId="2" functionId="1879179777" />
<variableUsagesHasUsages Id="9faefda8-0bae-4d0d-8d9c-902b8e1c1a33">
<aliasDeviceIoUsage Id="b07c2ae5-6f1f-47a1-9c8d-c1c3b8963b11" sdsId="161" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="63d4e7ef-704e-478d-a4ce-e8ad7bfd5a12">
<aliasDeviceIoUsage Id="1f37d907-f800-451c-b77d-fef369a495d9" sdsId="185" channelId="5" functionId="1879180545" />
<variableUsagesHasUsages Id="ba8bc3bf-d3bb-4606-8613-0da9a8288500">
<aliasDeviceIoUsage Id="eacd0814-2157-4d22-ae81-8c8f9b2d2e47" sdsId="161" channelId="2" functionId="1879114241" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="7d50c4df-9fa0-49e1-a06f-bd5ed3ba1f5a">
<aliasDeviceIoUsage Id="28d597e1-7ba5-4956-9e67-0af68e649796" sdsId="185" channelId="6" functionId="1879180801" />
<variableUsagesHasUsages Id="bbfff957-0b01-4c30-88ee-5b626cc4d9bc">
<aliasDeviceIoUsage Id="61705c82-9d3f-4d05-87b5-c236c79c403a" sdsId="185" channelId="2" functionId="1879179777" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="0913dc38-7c7e-4b6e-9a02-dd09655d8b0c">
<aliasDeviceIoUsage Id="09385227-d92d-4f0e-9b8a-98333c000156" sdsId="185" channelId="10" functionId="1879181825" />
<variableUsagesHasUsages Id="bfbf10b9-7e4d-4d2c-9924-205129ddce85">
<aliasDeviceIoUsage Id="f4303e49-c5f7-41b3-945e-f654e152b5fe" sdsId="185" channelId="5" functionId="1879180545" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="ce067add-ad98-4a1b-a15e-bebde0ac5ec5">
<aliasDeviceIoUsage Id="e035ff09-36a2-40d2-91b8-671565f60f5b" sdsId="171" channelId="1" functionId="1715470337" />
<variableUsagesHasUsages Id="60fffe57-85d2-4675-886b-a40e3335439a">
<aliasDeviceIoUsage Id="e70d31a3-0732-40f5-be2f-b49c81b0c790" sdsId="185" channelId="6" functionId="1879180801" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="4fcbf156-7b21-4446-84c7-75939d8909fb">
<aliasDeviceIoUsage Id="23150484-fe13-450a-bde1-64423a717cb4" sdsId="171" channelId="17" functionId="1849688065" />
<variableUsagesHasUsages Id="01ac2a5a-23a3-4763-9300-a2ecc319d910">
<aliasDeviceIoUsage Id="72e1813f-4ab0-4420-a585-1aa11c9995f5" sdsId="185" channelId="10" functionId="1879181825" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="86d2f510-9a40-4614-8f4b-c592c827e263">
<aliasDeviceIoUsage Id="92ba40c0-40c2-42aa-b4fa-457d4eed03aa" sdsId="171" channelId="1" functionId="1715470337" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="f2d19318-6af3-4288-8c99-795d181e3ba9">
<aliasDeviceIoUsage Id="743c99fc-f4a0-4f33-a7fa-feaa2a430b98" sdsId="171" channelId="17" functionId="1849688065" />
</variableUsagesHasUsages>
</usages>
</variableUsages>
@@ -4486,14 +4492,8 @@
<variableHasTargetUsages Id="ed5bf127-97e7-4125-b75a-9add883ed4b0">
<variableUsages Id="1b241d71-c95a-4e26-9390-a1824554d88f">
<usages>
<variableUsagesHasUsages Id="2bd69f3f-b7ad-436a-8670-253e74472c47">
<aliasDeviceIoUsage Id="b97b5572-2553-4020-80f6-0c283f7fb15f" sdsId="197" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="26659601-d7c9-43aa-bb42-c5f15e4a51bb">
<aliasDeviceIoUsage Id="fe1ec7cc-002f-4ee7-b51e-ae461202bb9b" sdsId="155" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
<variableUsagesHasUsages Id="0caaca75-b4a8-4083-b5dd-f3896e59eea9">
<aliasDeviceIoUsage Id="cced0dc1-5cda-4250-8b03-96ce96aec1fb" sdsId="155" channelId="2" functionId="1879114241" />
<variableUsagesHasUsages Id="5d0b0fc3-2f30-4ae8-aa62-15ed1edfa2d6">
<aliasDeviceIoUsage Id="c90624b9-d621-4d02-92d7-4363e20065eb" sdsId="197" channelId="1" functionId="1879113985" />
</variableUsagesHasUsages>
</usages>
</variableUsages>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
<?xml version="1.0"?>
<TcSmItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4026.19" ClassName="CNcSafTaskDef" SubType="0">
<TcSmItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.beckhoff.com/schemas/2012/07/TcSmProject" TcSmVersion="1.0" TcVersion="3.1.4026.20" ClassName="CNcSafTaskDef" SubType="0">
<DataTypes>
<DataType>
<Name GUID="{18071995-0000-0000-0000-000000000035}" TcBaseType="true" HideType="true">UINTARR2</Name>
@@ -1440,7 +1440,7 @@ External Setpoint Generation:
<SvbTask Priority="8" CycleTime="100000" AmsPort="511">
<Name>NC-Task 1 SVB</Name>
</SvbTask>
<Axis Id="1" CreateSymbols="true" AxisType="1" SimulationMode="true">
<Axis Id="1" CreateSymbols="true" AxisType="1">
<Name>Etcher1Chuck</Name>
<AxisPara>
<General UnitName="°" UnitFlags="#x00000004"/>
@@ -1729,7 +1729,7 @@ External Setpoint Generation:
</Var>
</Vars>
</Axis>
<Axis Id="2" CreateSymbols="true" AxisType="1" SimulationMode="true" GroupId="3">
<Axis Id="2" CreateSymbols="true" AxisType="1" GroupId="3">
<Name>Etcher2Chuck</Name>
<AxisPara>
<General UnitName="°" UnitFlags="#x00000004"/>
@@ -2450,13 +2450,12 @@ External Setpoint Generation:
<Link VarA="Drive^Inputs^In^nState1" VarB="AT 1^Drive status word" Size="8" OffsB="8"/>
<Link VarA="Drive^Inputs^In^nState2" VarB="AT 1^Drive status word" Size="8"/>
<Link VarA="Drive^Inputs^In^nState4" VarB="WcState^InputToggle" Size="1" OffsA="1"/>
<Link VarA="Drive^Inputs^In^nState4" VarB="WcState^WcState" Size="1"/>
<Link VarA="Drive^Inputs^In^nState4" VarB="WcState^InputToggle" Size="1" OffsA="1"/>
<Link VarA="Drive^Outputs^Out^nCtrl1" VarB="MDT 1^Master control word" Size="8" OffsB="8"/>
<Link VarA="Drive^Outputs^Out^nDataOut1" VarB="MDT 1^Position command value"/>
<Link VarA="Enc^Inputs^In^nDataIn1" VarB="AT 1^Position feedback 1 value"/>
<Link VarA="Enc^Inputs^In^nDcInputTime" VarB="InfoData^DcInputShift"/>
<Link VarA="Enc^Inputs^In^nState4" VarB="WcState^InputToggle" Size="1" OffsA="1"/>
<Link VarA="Enc^Inputs^In^nState4" VarB="WcState^WcState" Size="1"/>
</OwnerB>
</OwnerA>
<OwnerA Name="Axes^Etcher2BSR">
@@ -2483,13 +2482,12 @@ External Setpoint Generation:
<Link VarA="Drive^Inputs^In^nState1" VarB="AT 2^Drive status word" Size="8" OffsB="8"/>
<Link VarA="Drive^Inputs^In^nState2" VarB="AT 2^Drive status word" Size="8"/>
<Link VarA="Drive^Inputs^In^nState4" VarB="WcState^InputToggle" Size="1" OffsA="1"/>
<Link VarA="Drive^Inputs^In^nState4" VarB="WcState^WcState" Size="1"/>
<Link VarA="Drive^Inputs^In^nState4" VarB="WcState^InputToggle" Size="1" OffsA="1"/>
<Link VarA="Drive^Outputs^Out^nCtrl1" VarB="MDT 2^Master control word" Size="8" OffsB="8"/>
<Link VarA="Drive^Outputs^Out^nDataOut1" VarB="MDT 2^Position command value"/>
<Link VarA="Enc^Inputs^In^nDataIn1" VarB="AT 2^Position feedback 1 value"/>
<Link VarA="Enc^Inputs^In^nDcInputTime" VarB="InfoData^DcInputShift"/>
<Link VarA="Enc^Inputs^In^nState4" VarB="WcState^InputToggle" Size="1" OffsA="1"/>
<Link VarA="Enc^Inputs^In^nState4" VarB="WcState^WcState" Size="1"/>
</OwnerB>
</OwnerA>
</Mappings>

View File

@@ -3,6 +3,14 @@
<Instance Id="#x08502000" TcSmClass="TComPlcObjDef" KeepUnrestoredLinks="2" XtvPath="PLC\PLC Instance.xtv" TmcPath="PLC\PLC.tmc">
<Name>__FILENAME__</Name>
<CLSID ClassFactory="TcPlc30">{08500001-0000-0000-F000-000000000064}</CLSID>
<UnrestoredVarLinks ImportTime="2026-02-01T12:34:23">
<OwnerA Name="OutputSrc" Prefix="TIPC^PLC^PLC Instance" Type="2">
<OwnerB Name="TIID^Device 1 (EtherCAT)^K20_QM01 (EX260-SEC1)">
<Link VarA="PRG_Main._fbEtcher2._xCloseDoor" TypeA="BOOL" InOutA="1" GuidA="{18071995-0000-0000-0000-000000000030}" VarB="Byte 0^Output[1]" Size="1" RestoreInfo="ANotFound"/>
<Link VarA="PRG_Main._fbEtcher2._xOpenDoor" TypeA="BOOL" InOutA="1" GuidA="{18071995-0000-0000-0000-000000000030}" VarB="Byte 0^Output[0]" Size="1" RestoreInfo="ANotFound"/>
</OwnerB>
</OwnerA>
</UnrestoredVarLinks>
<Contexts>
<Context>
<Id>0</Id>
@@ -26,6 +34,60 @@
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xOpenDoor1" VarB="Byte 0^Output[2]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xOpenDoor2" VarB="Byte 0^Output[0]" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^HP (EK1100)^Term 47 (EL2004)">
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbHeatingPlate._xEnableHotplate" VarB="Channel 1^HotplateControl" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^HP (EK1100)^Term 48 (EL3202)">
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbHeatingPlate._fbTempSensor.iAnalogValue" VarB="RTD Inputs Channel 1^HOTPLATE_CurrentTemp"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^HP (EK1100)^Term 49 (EL6021)">
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[0]" VarB="COM TxPDO-Map Inputs^Data In 0"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[10]" VarB="COM TxPDO-Map Inputs^Data In 10"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[11]" VarB="COM TxPDO-Map Inputs^Data In 11"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[12]" VarB="COM TxPDO-Map Inputs^Data In 12"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[13]" VarB="COM TxPDO-Map Inputs^Data In 13"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[14]" VarB="COM TxPDO-Map Inputs^Data In 14"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[15]" VarB="COM TxPDO-Map Inputs^Data In 15"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[16]" VarB="COM TxPDO-Map Inputs^Data In 16"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[17]" VarB="COM TxPDO-Map Inputs^Data In 17"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[18]" VarB="COM TxPDO-Map Inputs^Data In 18"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[19]" VarB="COM TxPDO-Map Inputs^Data In 19"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[1]" VarB="COM TxPDO-Map Inputs^Data In 1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[20]" VarB="COM TxPDO-Map Inputs^Data In 20"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[21]" VarB="COM TxPDO-Map Inputs^Data In 21"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[2]" VarB="COM TxPDO-Map Inputs^Data In 2"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[3]" VarB="COM TxPDO-Map Inputs^Data In 3"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[4]" VarB="COM TxPDO-Map Inputs^Data In 4"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[5]" VarB="COM TxPDO-Map Inputs^Data In 5"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[6]" VarB="COM TxPDO-Map Inputs^Data In 6"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[7]" VarB="COM TxPDO-Map Inputs^Data In 7"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[8]" VarB="COM TxPDO-Map Inputs^Data In 8"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataIn[9]" VarB="COM TxPDO-Map Inputs^Data In 9"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._stStatus" VarB="COM TxPDO-Map Inputs^Status"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[0]" VarB="COM RxPDO-Map Outputs^Data Out 0"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[10]" VarB="COM RxPDO-Map Outputs^Data Out 10"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[11]" VarB="COM RxPDO-Map Outputs^Data Out 11"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[12]" VarB="COM RxPDO-Map Outputs^Data Out 12"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[13]" VarB="COM RxPDO-Map Outputs^Data Out 13"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[14]" VarB="COM RxPDO-Map Outputs^Data Out 14"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[15]" VarB="COM RxPDO-Map Outputs^Data Out 15"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[16]" VarB="COM RxPDO-Map Outputs^Data Out 16"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[17]" VarB="COM RxPDO-Map Outputs^Data Out 17"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[18]" VarB="COM RxPDO-Map Outputs^Data Out 18"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[19]" VarB="COM RxPDO-Map Outputs^Data Out 19"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[1]" VarB="COM RxPDO-Map Outputs^Data Out 1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[20]" VarB="COM RxPDO-Map Outputs^Data Out 20"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[21]" VarB="COM RxPDO-Map Outputs^Data Out 21"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[2]" VarB="COM RxPDO-Map Outputs^Data Out 2"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[3]" VarB="COM RxPDO-Map Outputs^Data Out 3"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[4]" VarB="COM RxPDO-Map Outputs^Data Out 4"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[5]" VarB="COM RxPDO-Map Outputs^Data Out 5"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[6]" VarB="COM RxPDO-Map Outputs^Data Out 6"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[7]" VarB="COM RxPDO-Map Outputs^Data Out 7"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[8]" VarB="COM RxPDO-Map Outputs^Data Out 8"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._byDataOut[9]" VarB="COM RxPDO-Map Outputs^Data Out 9"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate._stCtrl" VarB="COM RxPDO-Map Outputs^Ctrl"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^HV_K01_KL01^HV_K01_KL07 (EL2008)">
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xCloseChamber1" VarB="Channel 6^HV Hot_CloseChamber" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xCloseChamber2" VarB="Channel 3^HV Cold_CloseChamber" Size="1"/>
@@ -35,19 +97,44 @@
<OwnerB Name="TIID^Device 1 (EtherCAT)^K01_KL01 (EK1100)^K01_KL02 (EL1018)">
<Link VarA="PlcTask Inputs^PRG_Safety._xRequestOpenDoor" VarB="Channel 4^MainDoorUnlock" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K20_A1 (EP1018-0001)">
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbValveDoor.xCloseFeedback" VarB="Channel 3^ShutterClosed" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbValveDoor.xOpenFeedback" VarB="Channel 2^ShutterOpened" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K20_QM01 (EX260-SEC1)">
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._xCloseDoor" VarB="Byte 0^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._xOpenDoor" VarB="Byte 0^Output[0]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingBack.xCloseValve" VarB="Byte 0^Output[7]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingBack.xOpenValve" VarB="Byte 0^Output[6]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingFront.xCloseValve" VarB="Byte 0^Output[5]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingFront.xOpenValve" VarB="Byte 0^Output[4]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingLeft.xCloseValve" VarB="Byte 1^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingLeft.xOpenValve" VarB="Byte 1^Output[0]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingRight.xCloseValve" VarB="Byte 1^Output[3]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbClampingRight.xOpenValve" VarB="Byte 1^Output[2]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbValveDoor.xCloseValve" VarB="Byte 0^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbValveDoor.xOpenValve" VarB="Byte 0^Output[0]" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_A1 (EP1018-0001)">
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbValveDoor.xCloseFeedback" VarB="Channel 3^ShutterClosed" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbValveDoor.xOpenFeedback" VarB="Channel 2^ShutterOpened" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_A2 (EP1018-0001)">
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingBack.xCloseFeedback" VarB="Channel 8^Clamping fixture back closed" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingBack.xOpenFeedback" VarB="Channel 7^Clamping fixture back opened" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingFront.xCloseFeedback" VarB="Channel 6^Clamping fixture in front closed" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingFront.xOpenFeedback" VarB="Channel 5^Clamping fixture in front opened" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingLeft.xCloseFeedback" VarB="Channel 2^Clamping fixture left closed" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingLeft.xOpenFeedback" VarB="Channel 1^Clamping fixture left opened" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingRight.xCloseFeedback" VarB="Channel 4^Clamping fixture right closed" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingRight.xOpenFeedback" VarB="Channel 3^Clamping fixture right opened" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_QM01 (EX260-SEC1)">
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._xCloseDoor" VarB="Byte 0^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._xOpenDoor" VarB="Byte 0^Output[0]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbValveDoor.xCloseValve" VarB="Byte 0^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbValveDoor.xOpenValve" VarB="Byte 0^Output[0]" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^PC_K01_KL01 (EK1100)^PC_K01_KL02 (EL1918)">
<Link VarA="PlcTask Inputs^PRG_Safety._xComStartup" VarB="StandardInputs^Standard Out Var 12" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Safety._xErrorAck" VarB="StandardOutputs^Standard In Var 212" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Safety._xLockDoor" VarB="StandardOutputs^Standard In Var 192" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Safety._xRun" VarB="StandardOutputs^Standard In Var 9" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^RobotMain">
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._abMirrorToolsAndPositions" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 4 (Greifer/Drehteller/Positionen)"/>
@@ -68,6 +155,7 @@
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot._uJobs" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 1 (JobNr/PLCJobNr)"/>
</OwnerB>
<OwnerB Name="TIID^Device 2 (Profinet Controller)^vs-0001">
<Link VarA="PlcTask Inputs^PRG_Main._stCamResult" VarB="API^Term 4 (Result Data 128Byte)^Subterm 6 (Result Data 128Byte)^Inputs^Result Data" Size="264" OffsB="224"/>
<Link VarA="PlcTask Outputs^PRG_Main._xTriggerCamera" VarB="API^Term 10 (Control)^Subterm 12 (Control)^Outputs^Control Register[0]^Trigger" Size="1"/>
</OwnerB>
</OwnerA>