Some refactoring after static code analysis

This commit is contained in:
2026-02-08 12:48:29 +01:00
parent bdaaf1fe9f
commit 69ef2c6904
43 changed files with 3244 additions and 1097 deletions

View File

@@ -25,8 +25,8 @@ Global
Release|TwinCAT RT (x86) = Release|TwinCAT RT (x86)
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT HMI.ActiveCfg = Debug|TwinCAT OS (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT HMI.Build.0 = Debug|TwinCAT OS (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT HMI.ActiveCfg = Debug|TwinCAT RT (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT HMI.Build.0 = Debug|TwinCAT RT (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT OS (ARMV7-A).ActiveCfg = Debug|TwinCAT OS (ARMV7-A)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT OS (ARMV7-A).Build.0 = Debug|TwinCAT OS (ARMV7-A)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT OS (ARMV7-M).ActiveCfg = Debug|TwinCAT OS (ARMV7-M)
@@ -41,8 +41,8 @@ Global
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT HMI.ActiveCfg = Release|TwinCAT OS (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT HMI.Build.0 = Release|TwinCAT OS (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT HMI.ActiveCfg = Release|TwinCAT RT (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT HMI.Build.0 = Release|TwinCAT RT (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT OS (ARMV7-A).ActiveCfg = Release|TwinCAT OS (ARMV7-A)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT OS (ARMV7-A).Build.0 = Release|TwinCAT OS (ARMV7-A)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT OS (ARMV7-M).ActiveCfg = Release|TwinCAT OS (ARMV7-M)
@@ -57,8 +57,8 @@ Global
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{CB97A0B0-7E22-470D-8550-AA318EA46E50}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT HMI.ActiveCfg = Debug|TwinCAT OS (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT HMI.Build.0 = Debug|TwinCAT OS (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT HMI.ActiveCfg = Debug|TwinCAT RT (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT HMI.Build.0 = Debug|TwinCAT RT (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT OS (ARMV7-A).ActiveCfg = Debug|TwinCAT OS (ARMV7-A)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT OS (ARMV7-A).Build.0 = Debug|TwinCAT OS (ARMV7-A)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT OS (ARMV7-M).ActiveCfg = Debug|TwinCAT OS (ARMV7-M)
@@ -73,8 +73,8 @@ Global
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{384A40E7-3107-4D80-8361-04B00829260A}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT HMI.ActiveCfg = Release|TwinCAT OS (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT HMI.Build.0 = Release|TwinCAT OS (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT HMI.ActiveCfg = Release|TwinCAT RT (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT HMI.Build.0 = Release|TwinCAT RT (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT OS (ARMV7-A).ActiveCfg = Release|TwinCAT OS (ARMV7-A)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT OS (ARMV7-A).Build.0 = Release|TwinCAT OS (ARMV7-A)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT OS (ARMV7-M).ActiveCfg = Release|TwinCAT OS (ARMV7-M)
@@ -89,8 +89,8 @@ Global
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT RT (x64).Build.0 = Release|TwinCAT RT (x64)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT RT (x86).ActiveCfg = Release|TwinCAT RT (x86)
{384A40E7-3107-4D80-8361-04B00829260A}.Release|TwinCAT RT (x86).Build.0 = Release|TwinCAT RT (x86)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT HMI.ActiveCfg = Debug|TwinCAT OS (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT HMI.Build.0 = Debug|TwinCAT OS (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT HMI.ActiveCfg = Debug|TwinCAT RT (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT HMI.Build.0 = Debug|TwinCAT RT (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT OS (ARMV7-A).ActiveCfg = Debug|TwinCAT OS (ARMV7-A)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT OS (ARMV7-A).Build.0 = Debug|TwinCAT OS (ARMV7-A)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT OS (ARMV7-M).ActiveCfg = Debug|TwinCAT OS (ARMV7-M)
@@ -105,8 +105,8 @@ Global
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT RT (x64).Build.0 = Debug|TwinCAT RT (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT RT (x86).ActiveCfg = Debug|TwinCAT RT (x86)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Debug|TwinCAT RT (x86).Build.0 = Debug|TwinCAT RT (x86)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Release|TwinCAT HMI.ActiveCfg = Release|TwinCAT OS (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Release|TwinCAT HMI.Build.0 = Release|TwinCAT OS (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Release|TwinCAT HMI.ActiveCfg = Release|TwinCAT RT (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Release|TwinCAT HMI.Build.0 = Release|TwinCAT RT (x64)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Release|TwinCAT OS (ARMV7-A).ActiveCfg = Release|TwinCAT OS (ARMV7-A)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Release|TwinCAT OS (ARMV7-A).Build.0 = Release|TwinCAT OS (ARMV7-A)
{16E7B360-DCD5-431E-9380-EF0E96A38071}.Release|TwinCAT OS (ARMV7-M).ActiveCfg = Release|TwinCAT OS (ARMV7-M)

View File

@@ -1,14 +1,13 @@
<?xml version="1.0"?>
<TcSmProject 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">
<Project ProjectGUID="{CB97A0B0-7E22-470D-8550-AA318EA46E50}" TargetNetId="5.127.104.206.1.1" Target64Bit="true" ShowHideConfigurations="#x6">
<Project ProjectGUID="{CB97A0B0-7E22-470D-8550-AA318EA46E50}" Target64Bit="true" ShowHideConfigurations="#x6">
<System>
<Settings MaxCpus="4" NonWinCpus="2">
<Cpu CpuId="2"/>
</Settings>
<Settings MaxCpus="2"/>
<Licenses>
<Target>
<ManualSelect>{2752D285-16AD-4E89-AE6C-80E72784D264}</ManualSelect>
<LicenseDevice DongleHardwareId="2" DongleDevice="#x03020036" DongleLevel="60" DongleSystemId="{62CA069B-335C-D22F-33C1-C939EDC0FF9A}" DongleSerialNumber="000brrhk" DongleCacheLicense="true"/>
<ManualSelect>{9FD32FC8-0CF9-4C5B-95FB-F35423496A77}</ManualSelect>
<LicenseDevice DongleHardwareId="2" DongleDevice="#x03020036" DongleLevel="40" DongleSerialNumber="000brrhk" DongleCacheLicense="true"/>
<LicenseDevice Disabled="true" DongleHardwareId="4" DongleDevice="#x71010002" DongleLevel="40" DongleSystemId="{5097FB65-8A2A-EFB0-8273-38CF2A98119D}" DongleSerialNumber="000btjb7" DongleCacheLicense="false"/>
</Target>
</Licenses>
<Tasks>
@@ -42,12 +41,4 @@
<Device File="Device 5 (EtherCAT).xti" Id="5"/>
</Io>
</Project>
<Mappings>
<MappingInfo Identifier="{00000000-2001-0850-0020-500840000403}" Id="#x02030050"/>
<MappingInfo Identifier="{00000000-2001-0850-0020-500851000403}" Id="#x02030030"/>
<MappingInfo Identifier="{00000000-0010-0304-3000-040310000403}" Id="#x02030010"/>
<MappingInfo Identifier="{00000000-0020-0304-3000-040322000403}" Id="#x02030040"/>
<MappingInfo Identifier="{05000010-2001-0850-3000-040300205008}" Id="#x02030060" Watchdog="10000000040000000400000004000000"/>
<MappingInfo Identifier="{03040050-0050-0304-5000-040350000403}" Id="#x02030020" Watchdog="04000000040000000400000004000000"/>
</Mappings>
</TcSmProject>

View File

@@ -7,7 +7,7 @@ VAR
_fbHVTester : FB_HVTester;
_fbEtcher1 : FB_Etcher;
_fbEtcher2 : FB_Etcher;
_fbTrayFeederInput : FB_TrayFeeder(sIPAddr := '192.168.1.10', udiPort := 5000);
_fbTrayFeederInput : FB_TrayFeeder(sIPAddr := '192.168.0.41', udiPort := 1337);
_fbHeatCoolPlates : FB_HeatCoolPlates;
_fbAligner : FB_Aligner;
@@ -20,7 +20,7 @@ VAR
_stRobotJobParams : ST_KukaRobot_JobParams;
_stUnitFeedbacks : ST_KukaRobot_UnitFeedbacks;
_stCamResult AT %I* : ST_TrayFeederCamPosData;
stCamResult AT %I* : ST_TrayFeederCamPosData;
_rtStopRobotFromSafety : R_TRIG;
@@ -36,8 +36,8 @@ VAR
_xStartCycle : BOOL;
_xStartTrigger : BOOL;
_tofTriggerTime : TOF := (PT := T#1S);
_xTriggerCamera AT %Q* : BOOL;
_tofTriggerTime : TOF;
xTriggerCamera AT %Q* : BOOL;
_iState : INT;
END_VAR
@@ -177,17 +177,22 @@ CASE _iState OF
// Align blank
40:
;
ELSE
// Nothing to do here
;
END_CASE
// =====
// DEBUG
// =====
_tofTriggerTime(IN := _xStartTrigger);
_tofTriggerTime(IN := _xStartTrigger, PT := T#1S);
IF _xStartTrigger THEN
_xStartTrigger := FALSE;
END_IF
_xTriggerCamera := _tofTriggerTime.Q;
xTriggerCamera := _tofTriggerTime.Q;
// Reset alarm reset request
GVL_SCADA.xErrAck := FALSE;
@@ -383,6 +388,10 @@ CASE _iState OF
ELSE
_iState := 90;
END_CASE
ELSE
// Nothing to do here
;
END_CASE]]></ST>
</Implementation>
</Method>

View File

@@ -8,34 +8,37 @@ VAR_INPUT
END_VAR
VAR_OUTPUT
xStopRobot : BOOL := FALSE;
xEStopOk AT %I* : BOOL;
END_VAR
VAR
_xRun AT %Q* : BOOL;
_xEStopOk AT %I* : BOOL;
xComStartup AT %I* : BOOL;
xRequestOpenDoor AT %I* : BOOL;
_xRequestOpenDoor AT %I* : BOOL;
_rtrigDoorUnlock : R_TRIG;
xRun AT %Q* : BOOL;
xErrorAck AT %Q* : BOOL;
xLockDoor AT %Q* : BOOL := TRUE;
_xLockDoor AT %Q* : BOOL := TRUE;
_rtDoorUnlock : R_TRIG;
_tofErrorAck : TOF;
_xComStartup AT %I* : BOOL;
_xErrorAck AT %Q* : BOOL;
_tofErrorAck : TOF := (PT := T#500MS);
_xStopRobot : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_xRun := NOT _xComStartup;
<ST><![CDATA[xRun := NOT xComStartup;
_rtrigDoorUnlock(CLK := _xRequestOpenDoor AND xRobotStopped);
IF _rtrigDoorUnlock.Q THEN
xStopRobot := (NOT xStopRobot);
_xLockDoor := (NOT _xLockDoor);
_rtDoorUnlock(CLK := xRequestOpenDoor AND xRobotStopped);
IF _rtDoorUnlock.Q THEN
_xStopRobot := (NOT _xStopRobot);
xLockDoor := (NOT xLockDoor);
END_IF
// Reset safety group errors
_tofErrorAck(IN:= xConfirmAlarms, PT:= T#500MS, Q=> _xErrorAck, ET=> );]]></ST>
_tofErrorAck(IN:= xConfirmAlarms, PT:= T#500MS, Q=> xErrorAck, ET=> );
// Copy internal signals to outputs
xStopRobot := _xStopRobot;]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -4,8 +4,8 @@
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_PosData :
STRUCT
wPosX : INT;
wPosY : INT;
iPosX : INT;
iPosY : INT;
END_STRUCT
END_TYPE
]]></Declaration>

View File

@@ -4,26 +4,29 @@
<Declaration><![CDATA[FUNCTION_BLOCK FB_Aligner EXTENDS FB_PackMLGeneric
VAR_INPUT
xEnableVacuum : BOOL;
xAlign : BOOL;
xExecute : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xVacuumEnabled : BOOL;
END_VAR
VAR
VAR
xActivateVacuum AT %Q* : BOOL := FALSE;
xDeactivateVacuum AT %Q* : BOOL := TRUE;
xVacuumOk AT %I* : BOOL;
diXOffset AT %I* : DINT;
diYOffset AT %I* : DINT;
_fbXAxis : FB_AxisPTP;
_fbYAxis : FB_AxisPTP;
_xEnableVacuum AT %Q* : BOOL := FALSE;
_xDisableVacuum AT %Q* : BOOL := TRUE;
_xVacuumOk AT %I* : BOOL;
_udiXOffset AT %I* : DINT;
_udiYOffset AT %I* : DINT;
_rXPosToGo : REAL;
_rYPosToGo : REAL;
_rtExecute : R_TRIG;
_xStartAlign : BOOL;
END_VAR
]]></Declaration>
<Implementation>
@@ -51,12 +54,13 @@ _fbYAxis(
lrJerk:= 0,
xConfirmAlarms:= xConfirmAlarms);
// Drei mal ausführen damit die Position genau ist
IF xAlign THEN
xAlign := FALSE;
_rtExecute(CLK:= xExecute, Q=> _xStartAlign);
_rXPosToGo := DINT_TO_REAL(_udiXOffset) * -0.001;
_rYPosToGo := ((DINT_TO_REAL(_udiYOffset) * 0.001) - 37.5) * -1;
// Drei mal ausführen damit die Position genau ist
IF _xStartAlign THEN
_rXPosToGo := DINT_TO_REAL(diXOffset) * -0.001;
_rYPosToGo := ((DINT_TO_REAL(diYOffset) * 0.001) - 37.5) * -1;
IF (ABS(_rXPosToGo) < 10.0) AND (ABS(_rYPosToGo) < 10.0) AND (NOT _fbXAxis.xError) AND (NOT _fbYAxis.xError) THEN
_fbXAxis.M_MoveRel(lrRelDist := _rXPosToGo);
@@ -65,9 +69,9 @@ IF xAlign THEN
END_IF
// Handle enable disable vacuum command
_xEnableVacuum := xEnableVacuum;
_xDisableVacuum := (NOT xEnableVacuum);
xVacuumEnabled := _xVacuumOk;]]></ST>
xActivateVacuum := xEnableVacuum;
xDeactivateVacuum := (NOT xEnableVacuum);
xVacuumEnabled := xVacuumOk;]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -64,16 +64,16 @@ VAR
// Sensors
// =======
_xVacuumOk AT %I* : BOOL;
xVacuumOk AT %I* : BOOL;
// Spinner vibration sensor
_xVibrationSensor AT %I* : BOOL;
xVibrationSensor AT %I* : BOOL;
// =========
// Actuators
// =========
_xDisableVacuum AT %Q* : BOOL;
xDisableVacuum AT %Q* : BOOL;
END_VAR
]]></Declaration>
<Implementation>
@@ -128,7 +128,7 @@ _fbEjectBack(
xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= stHMIInterface.stEjectBackHMIInterface);
_xDisableVacuum := (NOT xEnableVacuum);
xDisableVacuum := (NOT xEnableVacuum);
// Call base sm
SUPER^();
@@ -136,7 +136,7 @@ SUPER^();
// Copy internal signals to output
xDoorOpen := _fbValveDoor.IsOpen;
xChuckClampOpen := _fbUnlockLeft.IsOpen AND _fbUnlockRight.IsOpen;
xVacuumEnabled := _xVacuumOk;]]></ST>
xVacuumEnabled := xVacuumOk;]]></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.

View File

@@ -8,33 +8,33 @@ END_VAR
VAR_OUTPUT
END_VAR
VAR
_xOpenDoor1 AT %Q* : BOOL;
_xOpenDoor2 AT %Q* : BOOL;
xOpenDoor1 AT %Q* : BOOL;
xOpenDoor2 AT %Q* : BOOL;
_xCloseDoor1 AT %Q* : BOOL;
_xCloseDoor2 AT %Q* : BOOL;
xCloseDoor1 AT %Q* : BOOL;
xCloseDoor2 AT %Q* : BOOL;
// Chamber is the big cylinder not the door
_xOpenChamber1 AT %Q* : BOOL;
_xOpenChamber2 AT %Q* : BOOL;
xOpenChamber1 AT %Q* : BOOL;
xOpenChamber2 AT %Q* : BOOL;
_xCloseChamber1 AT %Q* : BOOL;
_xCloseChamber2 AT %Q* : BOOL;
xCloseChamber1 AT %Q* : BOOL;
xCloseChamber2 AT %Q* : BOOL;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF xOpenChambers THEN
_xOpenDoor1 := TRUE;
_xOpenDoor2 := TRUE;
xOpenDoor1 := TRUE;
xOpenDoor2 := TRUE;
_xCloseDoor1 := FALSE;
_xCloseDoor2 := FALSE;
xCloseDoor1 := FALSE;
xCloseDoor2 := FALSE;
ELSE
_xOpenDoor1 := FALSE;
_xOpenDoor2 := FALSE;
xOpenDoor1 := FALSE;
xOpenDoor2 := FALSE;
_xCloseDoor1 := TRUE;
_xCloseDoor2 := TRUE;
xCloseDoor1 := TRUE;
xCloseDoor2 := TRUE;
END_IF
// Call base sm

View File

@@ -12,12 +12,12 @@ VAR_IN_OUT
END_VAR
VAR
// Card inputs
_stStatus AT %I* : ST_SerialStatus;
_byDataIn AT %I* : ARRAY[0..21] OF BYTE;
stStatus AT %I* : ST_SerialStatus;
//abyDataIn AT %I* : ARRAY[0..21] OF BYTE;
// Card outputs
_stCtrl AT %Q* : ST_SerialCrl;
_byDataOut AT %Q* : ARRAY[0..21] OF BYTE;
stCtrl AT %Q* : ST_SerialCrl;
abyDataOut AT %Q* : ARRAY[0..21] OF BYTE;
// Internal temp setpoint
_rTempSetpoint : REAL;
@@ -25,9 +25,6 @@ VAR
// Send trigger
_xSend : BOOL;
// Send temp test
_xTempTest : BOOL;
// Init trigger
_xInit : BOOL;
END_VAR
@@ -48,21 +45,21 @@ END_IF
// Init card on first run
IF _xInit THEN
_xInit := FALSE;
_stCtrl.bInitRequest := 1;
stCtrl.bInitRequest := 1;
END_IF
IF _stStatus.bInitAccepted THEN
_stCtrl.bInitRequest := 0;
IF stStatus.bInitAccepted THEN
stCtrl.bInitRequest := 0;
END_IF
// Send
IF _xSend THEN
_xSend := FALSE;
_stCtrl.bTransmitRequest := 1;
stCtrl.bTransmitRequest := 1;
END_IF
IF _stStatus.bTransmitAccepted THEN
_stCtrl.bTransmitRequest := 0;
IF stStatus.bTransmitAccepted THEN
stCtrl.bTransmitRequest := 0;
END_IF
// Debug test
@@ -91,10 +88,19 @@ VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Calculate sum
<ST><![CDATA[// Check end index
IF uiEndIndex > 21 THEN
byHigh := 0;
byLow := 0;
RETURN;
END_IF
// Calculate sum
{analysis -81}
FOR _uiCounter := uiStartIndex TO uiEndIndex DO
_dwChecksum := _dwChecksum + _byDataOut[_uiCounter];
_dwChecksum := _dwChecksum + abyDataOut[_uiCounter];
END_FOR
{analysis +81}
// Use lower bytes
_byHigh := SHR(_dwChecksum.%B0 AND 16#F0, 4);
@@ -115,36 +121,31 @@ VAR_INPUT
END_VAR
VAR
_dwTemp : DWORD;
_sTemp : STRING(4);
_byHigh : BYTE;
_byLow : BYTE;
_sHexString : STRING(4);
_sTemp : STRING;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Convert temperature
_dwTemp := REAL_TO_DWORD(rTemp * 10)*10;
_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
abyDataOut[0] := 16#02; // STX
abyDataOut[1] := 16#31; // Command code
abyDataOut[2] := _sTemp[0];
abyDataOut[3] := _sTemp[1];
abyDataOut[4] := _sTemp[2];
abyDataOut[5] := _sTemp[3];
abyDataOut[6] := 16#03; // ETX
M_CalcChecksum(
uiStartIndex:= 1,
uiEndIndex:= 5,
byHigh=> _byDataOut[7],
byLow=> _byDataOut[8]);
byHigh=> abyDataOut[7],
byLow=> abyDataOut[8]);
_byDataOut[9] := 16#0D; // <CR>
abyDataOut[9] := 16#0D; // <CR>
_stCtrl.byOutputLength := 10;]]></ST>
stCtrl.byOutputLength := 10;]]></ST>
</Implementation>
</Method>
</POU>

View File

@@ -5,7 +5,6 @@
VAR_INPUT
xEnable : BOOL;
rTargetTemp : REAL;
rDeadBand : REAL := 5.0;
xConfirmAlarms : BOOL;
END_VAR
@@ -17,10 +16,10 @@ VAR_IN_OUT
stHMIInterface : ST_HCPlateHMIInterface;
END_VAR
VAR
_xEnableHotplate AT %Q* : BOOL;
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;
// _axSlotFree : ARRAY [0..(GVL_HeatCoolConfig.HEAT_COOL_PLATES_NUM_SLOTS - 1)] OF BOOL;
// _atonSlotTimer : ARRAY[0..(GVL_HeatCoolConfig.HEAT_COOL_PLATES_NUM_SLOTS - 1)] OF TON;
// Temp sensor
_fbTempSensor : FB_AnalogInput('Temp sensor');
@@ -39,10 +38,7 @@ VAR
timHardwareSignalLevelOff := T#1S));
_fbPITempControl : FB_PI;
_xSaturatedUpper : BOOL;
_xSaturatedLower : BOOL;
_rMV : REAL;
_fbPulsOut : TP;
_fbLimit : FB_Limit;
_fbPWMOut : FB_PWM;
END_VAR
]]></Declaration>
@@ -73,28 +69,18 @@ _fbPITempControl(
rKp:= 6,
rTn:= 0,
xEnable:= stHMIInterface.xEnable,
xSaturatedUpper:= _xSaturatedUpper,
xSaturatedLower:= _xSaturatedLower,
rMV=> _rMV);
rMV=> _fbLimit.rIn);
IF _rMV >= 100.0 THEN
_rMV := 100.0;
_xSaturatedUpper := TRUE;
ELSE
_xSaturatedUpper := FALSE;
END_IF
IF _rMV <=0 THEN
_rMV := 0.0;
_xSaturatedLower := TRUE;
ELSE
_xSaturatedLower := FALSE;
END_IF
_fbLimit(
rMin:= 0,
rMax:= 100.0,
rOut=> _fbPWMOut.rPWM,
xClampedUpper=> _fbPITempControl.xSaturatedUpper,
xClampedLower=> _fbPITempControl.xSaturatedLower);
_fbPWMOut(
rPWM:= _rMV,
timPeriod:= T#10S,
xOutput=> _xEnableHotplate);
xOutput=> xEnableHotplate);
// Output HMI Interface
stHMIInterface.rPV := _fbTempSensor.rScaledValue;

View File

@@ -14,7 +14,13 @@ VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_tonTimer(IN := TRUE, PT := timPeriod);
<ST><![CDATA[// Check for possible division by zero
IF TIME_TO_REAL(timPeriod) = 0 THEN
xOutput := FALSE;
RETURN;
END_IF
_tonTimer(IN := TRUE, PT := timPeriod);
IF _tonTimer.Q THEN
_tonTimer(IN := FALSE);
END_IF

View File

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

View File

@@ -2,6 +2,7 @@
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_SerialCrl" Id="{02e99166-5c76-4fb3-84cc-719c63e20136}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
{attribute 'analysis' := '-33'}
TYPE ST_SerialCrl :
STRUCT
bTransmitRequest : BIT;

View File

@@ -2,6 +2,7 @@
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_SerialStatus" Id="{e37399e0-7acb-4d91-826f-26258cabab1c}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
{attribute 'analysis' := '-33'}
TYPE ST_SerialStatus :
STRUCT
bTransmitAccepted : BIT;

View File

@@ -28,44 +28,44 @@ VAR
// 1 - Enable
// 2 - Enable move
// 3 - Conf_Mess (Reset)
_uCtrl AT %Q* : U_KukaRobot_Ctrl;
stCtrl AT %Q* : ST_KukaRobot_Ctrl;
// 0 -> Robot job to do
// 1 -> PLC job which is finished
_uJobs AT %Q* : U_KukaRobot_Jobs;
stJobs AT %Q* : ST_KukaRobot_Jobs;
// 0 - Greifer nummer
// 1 - Drehteller Nummer
// 2 - Position Heizplatte
// 3 - Position Kuehlplatte
_abToolsAndPositions AT %Q* : ARRAY[0..3] OF BYTE;
abyToolsAndPositions AT %Q* : ARRAY[0..3] OF BYTE;
// Positions in um
_diOffsetPosX AT %Q* : DINT;
_diOffsetPosY AT %Q* : DINT;
_diThickness AT %Q* : DINT;
diOffsetPosX AT %Q* : DINT;
diOffsetPosY AT %Q* : DINT;
diThickness AT %Q* : DINT;
// Inputs
_uState AT %I* : U_KukaRobot_State;
_dwErrorBits AT %I* : DWORD;
_awJobStatesFromRobot AT %I* : ARRAY[0..1] OF WORD;
_eJobForPLC AT %I* : E_KukaRobot_JobNumerPLC;
stState AT %I* : ST_KukaRobot_State;
dwErrorBits AT %I* : DWORD;
awJobStatesFromRobot AT %I* : ARRAY[0..1] OF WORD;
eJobForPLC AT %I* : E_KukaRobot_JobNumerPLC;
_abMirrorToolsAndPositions AT %I* : ARRAY[0..3] OF BYTE;
{attribute 'analysis' := '-33'}
abyMirrorToolsAndPositions AT %I* : ARRAY[0..3] OF BYTE;
// Position mirrors
_diMirrorOffsetPosX AT %I* : DINT;
_diMirrorOffsetPosY AT %I* : DINT;
_diMirrorThickness AT %I* : DINT;
diMirrorOffsetPosX AT %I* : DINT;
diMirrorOffsetPosY AT %I* : DINT;
diMirrorThickness AT %I* : DINT;
{attribute 'analysis' := '+33'}
// Motortemperaturen
_asiMotorTemps1To4 AT %I* : ARRAY[0..3] OF SINT;
_asiMotorTemps5To8 AT %I* : ARRAY[0..3] OF SINT;
asiMotorTemps1To4 AT %I* : ARRAY[0..3] OF SINT;
asiMotorTemps5To8 AT %I* : ARRAY[0..3] OF SINT;
_ePlcJob :E_KukaRobot_JobNumerPLC;
_iState : INT;
_xRobotReady : BOOL;
_xError : BOOL;
@@ -91,21 +91,21 @@ END_VAR
// =============
_fbAlarmNotInExtMode(
xActive:= (NOT _uState.stState.bExt),
xActive:= (NOT stState.bExt),
xRelease:= TRUE,
xAcknowledge:= xConfirmAlarms,
timOnDelay:= T#0S,
timOffDelay:= T#0S);
_fbAlarmEStopActive(
xActive:= (NOT _uState.stState.bAlarmStop),
xActive:= (NOT stState.bAlarmStop),
xRelease:= TRUE,
xAcknowledge:= xConfirmAlarms,
timOnDelay:= T#0S,
timOffDelay:= T#0S);
_fbAlarmOperatorSafetyNotOk(
xActive:= (NOT _uState.stState.bUserSAF) AND (_uState.stState.bExt),
xActive:= (NOT stState.bUserSAF) AND (stState.bExt),
xRelease:= TRUE,
xAcknowledge:= xConfirmAlarms,
timOnDelay:= T#0S,
@@ -126,12 +126,12 @@ _fbAlarmRobotErrorResetTimeout(
// Check if robot is ready
// =======================
_xRobotReady := _uState.stState.bExt
AND _uState.stState.bAlarmStop
AND _uState.stState.bUserSAF
AND _uState.stState.bPeriRdy
AND _uState.stState.bIOActConf
AND (NOT _uState.stState.bStopMess);
_xRobotReady := stState.bExt
AND stState.bAlarmStop
AND stState.bUserSAF
AND stState.bPeriRdy
AND stState.bIOActConf
AND (NOT stState.bStopMess);
// =============================
@@ -145,7 +145,7 @@ SUPER^();
// ==============================
// Allow robot to be moved with programming pendant
_uCtrl.stCtrl.bNotDisableAxes := 1;
stCtrl.bNotDisableAxes := 1;
// Disable move if in T2 for safety reasons
// IF _uState.stState.bT2 THEN
@@ -157,10 +157,10 @@ _uCtrl.stCtrl.bNotDisableAxes := 1;
// Write unit feedbacks outputs
// ============================
_uCtrl.stCtrl.bDoorEtcher1Open := stUnitFeedbacks.xDoorEtcher1Open;
_uCtrl.stCtrl.bDoorEtcher2Open := stUnitFeedbacks.xDoorEtcher2Open;
_uCtrl.stCtrl.bDoorHVTestHotOpen := stUnitFeedbacks.xDoorHVTestHotOpen;
_uCtrl.stCtrl.bDoorHVTestColdOpen := stUnitFeedbacks.xDoorHVTestColdOpen;
stCtrl.bDoorEtcher1Open := stUnitFeedbacks.xDoorEtcher1Open;
stCtrl.bDoorEtcher2Open := stUnitFeedbacks.xDoorEtcher2Open;
stCtrl.bDoorHVTestHotOpen := stUnitFeedbacks.xDoorHVTestHotOpen;
stCtrl.bDoorHVTestColdOpen := stUnitFeedbacks.xDoorHVTestColdOpen;
M_HandlePLCJobs();
@@ -196,16 +196,16 @@ _stSMConfig.xAbortingDisabled := TRUE;]]></ST>
]]></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;
stCtrl.bConfMess := 0;
stCtrl.bExtStart := 0;
stCtrl.bEnableAxes := 0;
stCtrl.bEnableMove := 0;
stCtrl.bNotDisableAxes := 1;
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>
stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumerPLC.NO_JOB;]]></ST>
</Implementation>
</Method>
<Method Name="M_Clearing" Id="{e6152288-8c7d-4b38-bfbc-4f861d76ccc5}">
@@ -215,8 +215,8 @@ VAR_INST
END_VAR]]></Declaration>
<Implementation>
<ST><![CDATA[_tonWait(IN := TRUE, PT := T#1S);
_uCtrl.stCtrl.bEnableMove := 1;
_uCtrl.stCtrl.bAbortJob := 0;
stCtrl.bEnableMove := 1;
stCtrl.bAbortJob := 0;
IF _tonWait.Q THEN
_tonWait(IN := FALSE, PT := T#1S);
@@ -234,8 +234,8 @@ END_IF
E_KukaRobot_JobNumberRobot.WARMUP:
CASE _iSSM OF
0: // Wait for program to end
IF _awJobStatesFromRobot[0] = 0 THEN
IF _asiMotorTemps1To4[3] < 40 THEN
IF awJobStatesFromRobot[0] = 0 THEN
IF asiMotorTemps1To4[3] < 40 THEN
_iSSM := 10;
ELSE
_eCmd := E_PackMLCmd.COMPLETE;
@@ -243,17 +243,20 @@ END_IF
END_IF
10: // Write robot number 0
_uJobs.stJobs.wJobNrForRobot := stJobParams.eJob;
IF _awJobStatesFromRobot[0] = _uJobs.stJobs.wJobNrForRobot THEN
_uJobs.stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
stJobs.wJobNrForRobot := stJobParams.eJob;
IF awJobStatesFromRobot[0] = stJobs.wJobNrForRobot THEN
stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
_iSSM := 0;
END_IF
ELSE
;
END_CASE
ELSE
// Wait for robot to be done
IF _awJobStatesFromRobot[0] = 0 THEN
_uJobs.stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
IF awJobStatesFromRobot[0] = 0 THEN
stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
_eCmd := E_PackMLCmd.COMPLETE;
END_IF
END_CASE
@@ -264,35 +267,35 @@ END_CASE
<Method Name="M_HandlePLCJobs" Id="{4e3710b4-697b-42e8-86b1-31b19b3023db}">
<Declaration><![CDATA[METHOD M_HandlePLCJobs
VAR_INST
_rtrigNewJob : R_TRIG;
_rtNewJob : R_TRIG;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_rtrigNewJob(CLK := (_eJobForPLC <> E_KukaRobot_JobNumberRobot.NO_JOB));
<ST><![CDATA[_rtNewJob(CLK := (eJobForPLC <> E_KukaRobot_JobNumerPLC.NO_JOB));
IF _rtrigNewJob.Q THEN
eCmdFromRobot := _eJobForPLC;
IF _rtNewJob.Q THEN
eCmdFromRobot := eJobForPLC;
xNewCmdRequested := TRUE;
END_IF
IF xNewCmdRequested AND xAckPLCCmd THEN
IF xAckPLCCmd THEN
xNewCmdRequested := FALSE;
IF (NOT xPLCJobFailed) THEN
_uJobs.stJobs.wFinishedJobNrFromPlc := _eJobForPLC;
stJobs.wFinishedJobNrFromPlc := eJobForPLC;
ELSE
_uJobs.stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumerPLC.JOB_FAILED;
stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumerPLC.JOB_FAILED;
END_IF
eCmdFromRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
eCmdFromRobot := E_KukaRobot_JobNumerPLC.NO_JOB;
END_IF
// Reset plc job done
IF (_eJobForPLC = E_KukaRobot_JobNumberRobot.NO_JOB)
AND (_uJobs.stJobs.wFinishedJobNrFromPlc <> E_KukaRobot_JobNumberRobot.NO_JOB)
IF (eJobForPLC = E_KukaRobot_JobNumerPLC.NO_JOB)
AND (stJobs.wFinishedJobNrFromPlc <> E_KukaRobot_JobNumberRobot.NO_JOB)
AND (NOT xPLCJobFailed)
THEN
_uJobs.stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumberRobot.NO_JOB;
stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumerPLC.NO_JOB;
END_IF]]></ST>
</Implementation>
</Method>
@@ -307,9 +310,9 @@ END_IF]]></ST>
<Declaration><![CDATA[METHOD PROTECTED M_Holding
]]></Declaration>
<Implementation>
<ST><![CDATA[_uCtrl.stCtrl.bEnableMove := 0;
<ST><![CDATA[stCtrl.bEnableMove := 0;
IF _uState.stState.bRobStopped THEN
IF stState.bRobStopped THEN
M_StateComplete();
END_IF
]]></ST>
@@ -333,37 +336,37 @@ END_VAR]]></Declaration>
CASE _iSSM OF
// Check if com interface is ok
0:
_uCtrl.stCtrl.bEnableMove := 1;
_uCtrl.stCtrl.bConfMess := 1;
stCtrl.bEnableMove := 1;
stCtrl.bConfMess := 1;
_tonTimeout.IN := TRUE;
IF _uState.stState.bIOActConf THEN
_uCtrl.stCtrl.bConfMess := 0;
IF stState.bIOActConf THEN
stCtrl.bConfMess := 0;
_iSSM := 10;
END_IF
// Timeout io_Act_conf ready
IF _tonTimeout.Q THEN
_uCtrl.stCtrl.bConfMess := 0;
stCtrl.bConfMess := 0;
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
END_IF
// Enable axes
10:
_uCtrl.stCtrl.bEnableAxes := 1;
stCtrl.bEnableAxes := 1;
_tonTimeout.IN := TRUE;
// Wait for drives to be ready
IF _uState.stState.bPeriRdy THEN
_uCtrl.stCtrl.bEnableAxes := 0;
IF stState.bPeriRdy THEN
stCtrl.bEnableAxes := 0;
_tonTimeout(IN := FALSE);
_iSSM := 20;
END_IF
// Timeout drives ready
IF _tonTimeout.Q THEN
_uCtrl.stCtrl.bEnableAxes := 0;
stCtrl.bEnableAxes := 0;
_fbAlarmDrivesEnableTimeout.xRelease := TRUE;
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
@@ -371,12 +374,12 @@ CASE _iSSM OF
// Reset move stop
20:
_uCtrl.stCtrl.bConfMess := 1;
stCtrl.bConfMess := 1;
_tonTimeout.IN := TRUE;
// Wait for errors to be reset
IF (NOT _uState.stState.bStopMess) THEN
_uCtrl.stCtrl.bConfMess := 0;
IF (NOT stState.bStopMess) THEN
stCtrl.bConfMess := 0;
_tonTimeout(IN := FALSE);
_iSSM := 30;
END_IF
@@ -390,7 +393,7 @@ CASE _iSSM OF
// Start program
30:
_uCtrl.stCtrl.bExtStart := 1;
stCtrl.bExtStart := 1;
_tonTimeout.IN := TRUE;
IF _tonTimeout.Q THEN
@@ -398,12 +401,14 @@ CASE _iSSM OF
_eCmd := E_PackMLCmd.ABORT;
END_IF
IF _uState.stState.bProAct THEN
_uCtrl.stCtrl.bExtStart := 0;
IF stState.bProAct THEN
stCtrl.bExtStart := 0;
_tonTimeout(IN := FALSE);
M_StateComplete();
END_IF
ELSE
;
END_CASE]]></ST>
</Implementation>
</Method>
@@ -416,7 +421,7 @@ END_VAR]]></Declaration>
<ST><![CDATA[CASE _iSSM OF
// Check job parameters
0:
IF (_stJobParams.byGripperNumber < 0) OR (_stJobParams.byGripperNumber > 4) // Wrong gripper number
IF (_stJobParams.byGripperNumber > 4) // Wrong gripper number
//OR (_stJobParams.byChuckNumber < 1) OR (_stJobParams.byChuckNumber > 6) // Wrong chuck number
OR (_stJobParams.byGripperSide < 1) OR (_stJobParams.byGripperSide > 6) // Wrong gripper side
THEN
@@ -433,38 +438,38 @@ END_VAR]]></Declaration>
// Transfer job data to robot
10:
// Pos x in um
_diOffsetPosX := REAL_TO_DINT(_stJobParams.rPosX * 1000);
diOffsetPosX := REAL_TO_DINT(_stJobParams.rPosX * 1000);
// Pos y in um
_diOffsetPosY := REAL_TO_DINT(_stJobParams.rPosY * 1000);
diOffsetPosY := REAL_TO_DINT(_stJobParams.rPosY * 1000);
// Thickness
_diThickness := REAL_TO_DINT(_stJobParams.rThickness * 1000);
diThickness := REAL_TO_DINT(_stJobParams.rThickness * 1000);
// Gripper side
_uCtrl.stCtrl.byGripperSide := _stJobParams.byGripperSide;
stCtrl.byGripperSide := _stJobParams.byGripperSide;
// Scan QR code
IF stJobParams.xScanQRCode THEN
_uCtrl.stCtrl.bScanQRCode := 1;
stCtrl.bScanQRCode := 1;
ELSE
_uCtrl.stCtrl.bScanQRCode := 0;
stCtrl.bScanQRCode := 0;
END_IF
// Position on hotplate
_abToolsAndPositions[2] := stJobParams.byPlaceOnHotplate;
abyToolsAndPositions[2] := stJobParams.byPlaceOnHotplate;
// Position on coolplate
_abToolsAndPositions[3] := stJobParams.byPlaceOnCoolPlate;
abyToolsAndPositions[3] := stJobParams.byPlaceOnCoolPlate;
// Gripper number
_abToolsAndPositions[0] := stJobParams.byGripperNumber;
abyToolsAndPositions[0] := stJobParams.byGripperNumber;
// Chuck for etcher to load
_abToolsAndPositions[1] := stJobParams.byChuckNumber;
abyToolsAndPositions[1] := stJobParams.byChuckNumber;
// Write robot job number
_uJobs.stJobs.wJobNrForRobot := DINT_TO_WORD(_stJobParams.eJob);
stJobs.wJobNrForRobot := DINT_TO_WORD(_stJobParams.eJob);
// Safety reset timout fb
_tonTimeout(IN := FALSE);
@@ -476,8 +481,8 @@ END_VAR]]></Declaration>
_tonTimeout(IN := TRUE, PT := T#5S);
// 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;
IF awJobStatesFromRobot[0] = stJobs.wJobNrForRobot THEN
stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
_tonTimeout(IN := FALSE);
M_StateComplete();
END_IF
@@ -489,10 +494,13 @@ END_VAR]]></Declaration>
END_IF
// Robot has error
IF _dwErrorBits <> 0 THEN
IF dwErrorBits <> 0 THEN
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
END_IF
ELSE
;
END_CASE
@@ -509,11 +517,11 @@ END_CASE
]]></Declaration>
<Implementation>
<ST><![CDATA[// _uCtrl.stCtrl.bConfMess := 0;
_uCtrl.stCtrl.bEnableAxes := 0;
_uCtrl.stCtrl.bNotDisableAxes := 1;
_uCtrl.stCtrl.bExtStart := 0;
stCtrl.bEnableAxes := 0;
stCtrl.bNotDisableAxes := 1;
stCtrl.bExtStart := 0;
_uJobs.stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
_ePlcJob := E_KukaRobot_JobNumerPLC.NO_JOB;]]></ST>
</Implementation>
</Method>
@@ -541,33 +549,33 @@ END_VAR]]></Declaration>
CASE _iSSM OF
0:
_uCtrl.stCtrl.bEnableMove := 1;
_uCtrl.stCtrl.bEnableAxes := 1;
stCtrl.bEnableMove := 1;
stCtrl.bEnableAxes := 1;
_tonTimeout.IN := TRUE;
// Wait for drives to be ready
IF _uState.stState.bPeriRdy THEN
_uCtrl.stCtrl.bEnableAxes := 0;
IF stState.bPeriRdy THEN
stCtrl.bEnableAxes := 0;
_tonTimeout(IN := FALSE);
_iSSM := 10;
END_IF
// Timeout drives ready
IF _tonTimeout.Q THEN
_uCtrl.stCtrl.bEnableAxes := 0;
stCtrl.bEnableAxes := 0;
_fbAlarmDrivesEnableTimeout.xRelease := TRUE;
_tonTimeout(IN := FALSE);
_eCmd := E_PackMLCmd.ABORT;
END_IF
10:
_uCtrl.stCtrl.bConfMess := 1;
stCtrl.bConfMess := 1;
_tonTimeout.IN := TRUE;
// Wait for errors to be reset
IF (NOT _uState.stState.bStopMess) THEN
_uCtrl.stCtrl.bConfMess := 0;
IF (NOT stState.bStopMess) THEN
stCtrl.bConfMess := 0;
_tonTimeout(IN := FALSE);
_iSSM := 20;
END_IF
@@ -581,7 +589,7 @@ CASE _iSSM OF
20:
// Start main program
_uCtrl.stCtrl.bExtStart := 1;
stCtrl.bExtStart := 1;
_tonTimeout.IN := TRUE;
@@ -590,12 +598,14 @@ CASE _iSSM OF
_eCmd := E_PackMLCmd.ABORT;
END_IF
IF _uState.stState.bProAct THEN
_uCtrl.stCtrl.bExtStart := 0;
IF stState.bProAct THEN
stCtrl.bExtStart := 0;
_tonTimeout(IN := FALSE);
M_StateComplete();
END_IF
ELSE
;
END_CASE]]></ST>
</Implementation>
</Method>

View File

@@ -2,6 +2,7 @@
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_KukaRobot_Ctrl" Id="{6a4fb617-ed87-4838-8f9a-7e8618b6ad47}">
<Declaration><![CDATA[{attribute 'pack_mode' := '0'}
{attribute 'analysis' := '-33'}
TYPE ST_KukaRobot_Ctrl :
STRUCT
// DRIVES_OFF

View File

@@ -2,6 +2,7 @@
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_KukaRobot_State" Id="{a63ba4ed-f6ed-4d69-91eb-1236a87f0780}">
<Declaration><![CDATA[{attribute 'pack_mode' := '0'}
{attribute 'analysis' := '-33'}
TYPE ST_KukaRobot_State :
STRUCT
bUserSAF : BIT;

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="U_KukaRobot_Ctrl" Id="{c0890327-8227-4b1a-8f53-5fe8dcabd304}">
<Declaration><![CDATA[TYPE U_KukaRobot_Ctrl :
UNION
dwCtrl : DWORD;
stCtrl : ST_KukaRobot_Ctrl;
END_UNION
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="U_KukaRobot_Jobs" Id="{590c2205-ccc7-4ffe-977e-f7594d299bfd}">
<Declaration><![CDATA[TYPE U_KukaRobot_Jobs :
UNION
dwJobs : DWORD;
stJobs : ST_KukaRobot_Jobs;
END_UNION
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="U_KukaRobot_State" Id="{955531d4-f458-4580-a2f2-ab760c7d37eb}">
<Declaration><![CDATA[TYPE U_KukaRobot_State :
UNION
dwState : DWORD;
stState : ST_KukaRobot_State;
END_UNION
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -3,7 +3,7 @@
<POU Name="FB_TFProtocol" Id="{f0c44f0b-70b8-45d0-8720-9bd7e08b6aa6}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_TFProtocol
VAR_INPUT
sIpAddr : STRING;
sIpAddr : STRING(15);
udiPort : UDINT;
xConfirmAlarms : BOOL;
@@ -18,30 +18,27 @@ 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;
_iCmdLength : INT;
_timSendTimeout : TIME := T#5S;
// Socket receive
_fbSocketReceive : FB_SocketReceive;
_timReceiveTimeout : TIME := T#5S;
_abReceivedBuffer : ARRAY[0..100] OF BYTE;
_asReceivedResponse : ARRAY[0..9] OF STRING;
_uiBufferPos : UINT;
_udiCounterReceive : UDINT;
_abyReceivedBuffer : ARRAY[0..100] OF BYTE;
_sReceivedResponse : STRING(255);
_udiResponseLength : UDINT;
_udiReceivedBytes : UDINT;
_timPollingTime : TIME := T#1S;
_tonPollTimer : TON;
_xEnableReceiveTimeout : BOOL;
_timReceiveTimeoutTime : TIME := T#5S;
_tonReceiveTimeout : TON;
_uiLastReceivedResponseId : UINT := 0;
// Receive state machine
_iStateReceive : INT;
@@ -49,16 +46,15 @@ VAR
// Command data
_uiCmdId : UINT := 1;
_sCmd : STRING(255);
_sAck : STRING(255);
_sAck : STRING(11);
// Main state machine
_iState : INT := 0;
_xRunSMAgain : BOOL;
_diCounter : DINT;
_xSendCmd : BOOL;
_uiRetries : UINT;
_xCmdReceived : BOOL;
_iPlaceCmdSeperator : INT;
_sTmp : STRING;
_xReceivedResponseOk : BOOL;
_uiReceivedCommandId : UINT;
@@ -67,7 +63,9 @@ VAR
_xError : BOOL;
END_VAR
VAR CONSTANT
{attribute 'naming' := 'off'}
MAX_RETRIES : UINT := 3;
{attribute 'naming' := 'on'}
END_VAR
]]></Declaration>
<Implementation>
@@ -101,17 +99,19 @@ CASE _iStateReceive OF
// Call receive
10:
{analysis -64}
_fbSocketReceive(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= SIZEOF(_abReceivedBuffer) - _udiReceivedBytes,
pDest:= ADR(_abReceivedBuffer) + _udiReceivedBytes,
cbLen:= SIZEOF(_abyReceivedBuffer) - _udiReceivedBytes,
pDest:= ADR(_abyReceivedBuffer) + _udiReceivedBytes,
bExecute:= TRUE,
tTimeout:= _timReceiveTimeout,
bBusy=> ,
bError=> ,
nErrId=> ,
nRecBytes=> );
{analysis +64}
IF (NOT _fbSocketReceive.bBusy) AND (NOT _fbSocketReceive.bError) THEN
_fbSocketReceive(bExecute := FALSE);
@@ -149,374 +149,197 @@ CASE _iStateReceive OF
// Check received data
20:
// Check if received command is complete
MEMCPY(destAddr := ADR(_asReceivedResponse[_uiBufferPos]), srcAddr := ADR(_abReceivedBuffer), n := _udiReceivedBytes);
_uiBufferPos := _uiBufferPos + 1;
IF _uiBufferPos > 9 THEN
_uiBufferPos := 0;
END_IF
MEMCPY(destAddr := ADR(_sReceivedResponse), srcAddr := ADR(_abyReceivedBuffer), n := _udiReceivedBytes);
_udiResponseLength := _udiReceivedBytes;
_udiReceivedBytes := 0;
_xCmdReceived := TRUE;
// Go back to polling wait state
_iStateReceive := 15;
ELSE
;
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
// _xCmdReceived := FALSE;
// _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 := 900;
// END_IF
//
// // For for response indicator
// IF _sReceivedResponse[1] <> F_ToASC('<') THEN
// // Wrong response indicator
// _iState := 901;
// END_IF
//
// // Check for correct cmd
// _xReceivedResponseOk := TRUE;
// FOR _diCounter := 2 TO 10 DO
// IF _sReceivedResponse[_diCounter] <> _sCmd[_diCounter] THEN
// _xReceivedResponseOk := FALSE;
// EXIT;
// END_IF
// END_FOR
//
// IF _xReceivedResponseOk THEN
// _xBusy := FALSE;
// _iState := 10;
// ELSE
// _iState := 902;
// END_IF
//
// 50:
// // Get command id
// _uiReceivedCommandId := _sReceivedResponse[0] - 16#30;
//
// // Check if it is a new command
// IF (_uiReceivedCommandId <> _uiLastReceivedResponseId) OR (_uiReceivedCommandId = 0) THEN
// _uiLastReceivedResponseId := _uiReceivedCommandId;
// xNewResponseReady := FALSE;
//
// // Send acknowledgement
// _iState := 60;
// END_IF
//
// // Prepare ack response
// 60:
// FOR _diCounter := 0 TO 10 DO
// _sAck[_diCounter] := _sReceivedResponse[_diCounter];
// END_FOR
// _sAck[11] := 0;
//
// IF _sReceivedResponse[1] = F_ToAsc('>') THEN
// _iState := 70;
// ELSE
// _iState := 10;
// END_IF
//
//
// // 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;
// _xBusy := FALSE;
// _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;
// _uiRetries := 0;
// _iState := 0;
// END_IF
// END_CASE
REPEAT
_xRunSMAgain := FALSE;
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
_xCmdReceived := FALSE;
_xRunSMAgain := TRUE;
_iState := 50;
END_IF
// Send command
20:
_fbSocketSend(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= INT_TO_UDINT(_iCmdLength),
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;
_xRunSMAgain := TRUE;
_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 (_sReceivedResponse[0] <> UINT_TO_BYTE(_uiCmdId+16#30)) THEN
// Wrong command id received
_iState := 900;
END_IF
// For for response indicator
IF _sReceivedResponse[1] <> F_ToASC('<') THEN
// Wrong response indicator
_iState := 901;
END_IF
// Check for correct cmd
_xReceivedResponseOk := TRUE;
FOR _diCounter := 2 TO 10 DO
IF _sReceivedResponse[_diCounter] <> _sCmd[_diCounter] THEN
_xReceivedResponseOk := FALSE;
EXIT;
END_IF
END_FOR
IF _xReceivedResponseOk THEN
_xBusy := FALSE;
_iState := 10;
ELSE
_iState := 902;
END_IF
// Got command from tray feeder which needs to be acknowledged
50:
// Copy first 11 bytes
FOR _diCounter := 0 TO 10 DO
_sAck[_diCounter] := _sReceivedResponse[_diCounter];
END_FOR
// Switch command indicator to ack indicator
_sAck[1] := F_ToASC('<');
// Check if it is something we need to acknowledge
IF _sReceivedResponse[1] = F_ToASC('>') THEN
// Get command id
_uiReceivedCommandId := _sReceivedResponse[0] - 16#30;
_xRunSMAgain := TRUE;
_iState := 60;
ELSE
_xRunSMAgain := TRUE;
_iState := 10;
END_IF
// Send ack response
60:
// Ack is always 11 bytes long (11 characters)
_fbSocketSend(
sSrvNetId:= '',
hSocket:= _hSocket,
cbLen:= 11,
pSrc:= ADR(_sAck),
bExecute:= TRUE,
tTimeout:= _timSendTimeout,
bBusy=> ,
bError=> ,
nErrId=> );
IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN
_fbSocketSend(bExecute := FALSE);
_xEnableReceiveTimeout := TRUE;
_xBusy := FALSE;
_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;
_uiRetries := 0;
_iState := 0;
END_IF
ELSE
;
END_CASE
UNTIL (NOT _xRunSMAgain)
END_REPEAT
// Copy output buffers to outputs
xConnected := _xConnected;
xBusy := _xBusy;
xError := _xError;]]></ST>
</Implementation>
<Method Name="M_Debug" Id="{24e700f8-310e-46c8-98c0-8a10312afeda}">
<Declaration><![CDATA[METHOD M_Debug
VAR_INPUT
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// 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
//
// // 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(_asReceivedResponse[0]) <> UINT_TO_STRING(_uiCmdId)) THEN
// // Wrong command id received
// _iState := 900;
// END_IF
//
// // For for response indicator
// IF _asReceivedResponse[1] <> F_ToASC('<') THEN
// // Wrong response indicator
// _iState := 901;
// END_IF
//
// // Check for correct cmd
// _xReceivedResponseOk := TRUE;
// FOR _diCounter := 2 TO 10 DO
// IF _asReceivedResponse[_diCounter] <> _sCmd[_diCounter] THEN
// _xReceivedResponseOk := FALSE;
// EXIT;
// END_IF
// END_FOR
//
// IF _xReceivedResponseOk THEN
// _xBusy := FALSE;
// _iState := 10;
// ELSE
// _iState := 902;
// END_IF
//
// 50:
// // Get command id
// _uiReceivedCommandId := _asReceivedResponse[0] - 16#30;
//
// // Check if it is a new command
// IF (_uiReceivedCommandId <> _uiLastReceivedResponseId) OR (_uiReceivedCommandId = 0) THEN
// _uiLastReceivedResponseId := _uiReceivedCommandId;
// xNewResponseReady := FALSE;
//
// // Send acknowledgement
// _iState := 60;
// END_IF
//
// // Prepare ack response
// 60:
// FOR _diCounter := 0 TO 10 DO
// _sAck[_diCounter] := _asReceivedResponse[_diCounter];
// END_FOR
// _sAck[11] := 0;
//
// IF _asReceivedResponse[1] = F_ToAsc('>') THEN
// _iState := 70;
// ELSE
// _iState := 10;
// END_IF
//
//
// // 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;
// _xBusy := FALSE;
// _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;
// _uiRetries := 0;
// _iState := 0;
// END_IF
// END_CASE]]></ST>
</Implementation>
</Method>
<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(_asReceivedResponse) + 2, n := INT_TO_UDINT(LEN(_asReceivedResponse) - 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
@@ -541,6 +364,7 @@ END_IF
// Create command with id
_sCmd := CONCAT(UINT_TO_STRING(_uiCmdId), '>');
_sCmd := CONCAT(_sCmd, sCmd);
_iCmdLength := LEN(sCmd);
// start sendind command state machine
_xSendCmd := TRUE;

View File

@@ -8,14 +8,14 @@ END_VAR
VAR_OUTPUT
END_VAR
VAR
_sIpAddr : STRING;
_sIpAddr : STRING(15);
_udiPort : UDINT;
_fbProtocolHandler : FB_TFProtocol;
_xTest : BOOL;
_xSendResult : BOOL;
_sCmd : STRING := 'STAT-FEED';
_sCmd : STRING := 'STAT-FEED:';
END_VAR
]]></Declaration>
<Implementation>
@@ -50,7 +50,7 @@ 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)
sIPAddr : STRING;
sIPAddr : STRING(15);
udiPort : UDINT;
END_VAR]]></Declaration>
<Implementation>

View File

@@ -2,6 +2,7 @@
<TcPlcObject Version="1.1.0.1">
<GVL Name="GVL_SCADA" Id="{bb0d1251-7abb-4971-bbc9-72bee3b1c668}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'analysis' := '-43'}
VAR_GLOBAL
xErrAck : BOOL;

View File

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

@@ -1,7 +1,8 @@
<?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 :
<Declaration><![CDATA[{attribute 'analysis' := '-33'}
TYPE ST_PMLa :
STRUCT
astProductData : ARRAY[0..(GVL_PackML_Conf.MAX_PRODUCT_DATA-1)] OF ST_PackML_ProductData;
diStopReason : DINT;

View File

@@ -1,7 +1,8 @@
<?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 :
<Declaration><![CDATA[{attribute 'analysis' := '-33'}
TYPE ST_PMLc :
STRUCT
eUnitMode : E_PackMLUnitMode;
xUnitModeChangeRequest : BOOL;

View File

@@ -1,7 +1,8 @@
<?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 :
<Declaration><![CDATA[{attribute 'analysis' := '-33'}
TYPE ST_PMLs :
STRUCT
eUnitModeCurrent : E_PackMLUnitMode;
eStateCurrent : E_PackMLState;

View File

@@ -1,7 +1,8 @@
<?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 :
<Declaration><![CDATA[{attribute 'analysis' := '-33'}
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;

View File

@@ -1,11 +1,13 @@
<?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 :
<Declaration><![CDATA[{attribute 'naming' := 'off'}
{attribute 'analysis' := '-33'}
TYPE ST_PackMLParamDINT :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
ID : DINT;
Name : STRING;
Unit : STRING(6);
Value : DINT;
END_STRUCT
END_TYPE

View File

@@ -1,11 +1,13 @@
<?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 :
<Declaration><![CDATA[{attribute 'naming' := 'off'}
{attribute 'analysis' := '-33'}
TYPE ST_PackMLParamLREAL :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
ID : DINT;
Name : STRING;
Unit : STRING(6);
Value : LREAL;
END_STRUCT
END_TYPE

View File

@@ -1,11 +1,13 @@
<?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 :
<Declaration><![CDATA[{attribute 'naming' := 'off'}
{attribute 'analysis' := '-33'}
TYPE ST_PackMLParamREAL :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
ID : DINT;
Name : STRING;
Unit : STRING(6);
Value : REAL;
END_STRUCT
END_TYPE

View File

@@ -1,11 +1,13 @@
<?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 :
<Declaration><![CDATA[{attribute 'naming' := 'off'}
{attribute 'analysis' := '-33'}
TYPE ST_PackMLParamSTRING :
STRUCT
diID : DINT;
sName : STRING;
sUnit : STRING(6);
ID : DINT;
Name : STRING;
Unit : STRING(6);
Value : STRING;
END_STRUCT
END_TYPE

View File

@@ -1,7 +1,8 @@
<?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 :
<Declaration><![CDATA[{attribute 'analysis' := '-33'}
TYPE ST_PackMLRecipe :
STRUCT
diID : DINT;
sName : STRING;

View File

@@ -1,7 +1,8 @@
<?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 :
<Declaration><![CDATA[{attribute 'analysis' := '-33'}
TYPE ST_PackML_ProductData :
STRUCT
diProcessedCount : DINT;
diDefectiveCount : DINT;

View File

@@ -4,14 +4,14 @@
<Declaration><![CDATA[TYPE ST_PackMLStateMachineConfig :
STRUCT
xClearingDisabled : BOOL;
// xStoppedDisabled : BOOL;
// xStoppedDisabled required state
xStartingDisabled : BOOL;
// xIdleDisabled : BOOL;
// xIdleDisabled required state
xSuspededDisabled : BOOL;
// xExecuteDisabled : BOOL;
// xExecuteDisabled required state
xStoppingDisabled : BOOL;
xAbortingDisabled : BOOL;
// xAbortedDisabled : BOOL;
// xAbortedDisabled required state
xHoldingDisabled : BOOL;
xHeldDisabled : BOOL;
xUnholdingDisabled : BOOL;

View File

@@ -2,6 +2,8 @@
<TcPlcObject Version="1.1.0.1">
<GVL Name="GVL_PackML_Conf" Id="{b46d8e14-5a19-467d-bb78-56321e43ef47}">
<Declaration><![CDATA[{attribute 'qualified_only'}
{attribute 'naming' := 'off'}
{attribute 'analysis' := '-43'}
VAR_GLOBAL CONSTANT
MAX_PARAMS : UINT := 10;
MAX_PRODUCT_DATA : UINT := 10;

View File

@@ -27,9 +27,6 @@ VAR
// Internal unit mode
_eMode : E_PackMLUnitMode;
// Internal unit state
_eState : E_PackMLState;
// Last state
_eLastState : E_PackMLState;

View File

@@ -1,7 +1,8 @@
<?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
<Declaration><![CDATA[{attribute 'analysis' := '-178'}
FUNCTION_BLOCK FB_PackMLStateMachine
VAR_INPUT
eMode : E_PackMLUnitMode;
eCmd : E_PackMLCmd;
@@ -419,6 +420,9 @@ END_VAR
E_PackMLState.CLEARING:
_eState := E_PackMLState.STOPPED;
ELSE
;
END_CASE
eState := _eState;]]></ST>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -171,7 +171,7 @@
</ArrayInfo>
</DataType>
<DataType>
<Name GUID="{18071995-0000-0000-0000-002000000006}" IecBaseType="true" BitType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..5] OF BIT</Name>
<Name GUID="{18071995-0000-0000-0000-002000000006}" IecBaseType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..5] OF BIT</Name>
<BitSize>6</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType>
<ArrayInfo>
@@ -326,7 +326,7 @@
</ArrayInfo>
</DataType>
<DataType>
<Name GUID="{18071995-0000-0000-0000-002000000004}" IecBaseType="true" BitType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..3] OF BIT</Name>
<Name GUID="{18071995-0000-0000-0000-002000000004}" IecBaseType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..3] OF BIT</Name>
<BitSize>4</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType>
<ArrayInfo>
@@ -371,7 +371,7 @@
</ArrayInfo>
</DataType>
<DataType>
<Name GUID="{18071995-0000-0000-0000-00200000000D}" IecBaseType="true" BitType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..12] OF BIT</Name>
<Name GUID="{18071995-0000-0000-0000-00200000000D}" IecBaseType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..12] OF BIT</Name>
<BitSize>13</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType>
<ArrayInfo>
@@ -380,7 +380,7 @@
</ArrayInfo>
</DataType>
<DataType>
<Name GUID="{18071995-0000-0000-0000-00200000000E}" IecBaseType="true" BitType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..13] OF BIT</Name>
<Name GUID="{18071995-0000-0000-0000-00200000000E}" IecBaseType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..13] OF BIT</Name>
<BitSize>14</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType>
<ArrayInfo>
@@ -389,7 +389,7 @@
</ArrayInfo>
</DataType>
<DataType>
<Name GUID="{18071995-0000-0000-0000-00200000000F}" IecBaseType="true" BitType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..14] OF BIT</Name>
<Name GUID="{18071995-0000-0000-0000-00200000000F}" IecBaseType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..14] OF BIT</Name>
<BitSize>15</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType>
<ArrayInfo>

View File

@@ -1,6 +1,6 @@
<?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.20" ClassName="CDevDpRamDef" SubType="121">
<Device Id="11" DevType="121">
<Device Id="11" Disabled="true" DevType="121">
<Name>__FILENAME__</Name>
<AddressInfo>
<Pci>

View File

@@ -6,24 +6,24 @@
<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"/>
<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>
<UnrestoredVarLinks ImportTime="2026-02-04T18:53:56">
<OwnerA Name="InputDst" Prefix="TIPC^PLC^PLC Instance" Type="1">
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 26 (TM-X5K_CB-NEC20E)">
<Link VarA="PRG_Main._fbAligner._rXOffset" TypeA="REAL" InOutA="0" GuidA="{18071995-0000-0000-0000-00000000000D}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7" RestoreInfo="ANotFound"/>
<Link VarA="PRG_Main._fbAligner._rYOffset" TypeA="REAL" InOutA="0" GuidA="{18071995-0000-0000-0000-00000000000D}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data8" RestoreInfo="ANotFound"/>
<Link VarA="PRG_Main._fbAligner.rXOffset" TypeA="REAL" InOutA="0" GuidA="{18071995-0000-0000-0000-00000000000D}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7" RestoreInfo="ANotFound"/>
<Link VarA="PRG_Main._fbAligner.rYOffset" TypeA="REAL" InOutA="0" GuidA="{18071995-0000-0000-0000-00000000000D}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data8" RestoreInfo="ANotFound"/>
</OwnerB>
</OwnerA>
</UnrestoredVarLinks>
<UnrestoredVarLinks ImportTime="2026-02-05T10:33:22">
<OwnerA Name="InputDst" Prefix="TIPC^PLC^PLC Instance" Type="1">
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 26 (TM-X5K_CB-NEC20E)">
<Link VarA="PRG_Main._fbAligner._udiXOffset" TypeA="UDINT" InOutA="0" GuidA="{18071995-0000-0000-0000-000000000008}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7" RestoreInfo="TypeMismatch" OldTypeA="UDINT" OldGuidA="{18071995-0000-0000-0000-000000000008}" NewTypeA="DINT" NewGuidA="{18071995-0000-0000-0000-000000000009}"/>
<Link VarA="PRG_Main._fbAligner._udiYOffset" TypeA="UDINT" InOutA="0" GuidA="{18071995-0000-0000-0000-000000000008}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data8" RestoreInfo="TypeMismatch" OldTypeA="UDINT" OldGuidA="{18071995-0000-0000-0000-000000000008}" NewTypeA="DINT" NewGuidA="{18071995-0000-0000-0000-000000000009}"/>
<Link VarA="PRG_Main._fbAligner.diXOffset" TypeA="UDINT" InOutA="0" GuidA="{18071995-0000-0000-0000-000000000008}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7" RestoreInfo="TypeMismatch" OldTypeA="UDINT" OldGuidA="{18071995-0000-0000-0000-000000000008}" NewTypeA="DINT" NewGuidA="{18071995-0000-0000-0000-000000000009}"/>
<Link VarA="PRG_Main._fbAligner.diYOffset" TypeA="UDINT" InOutA="0" GuidA="{18071995-0000-0000-0000-000000000008}" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data8" RestoreInfo="TypeMismatch" OldTypeA="UDINT" OldGuidA="{18071995-0000-0000-0000-000000000008}" NewTypeA="DINT" NewGuidA="{18071995-0000-0000-0000-000000000009}"/>
</OwnerB>
</OwnerA>
</UnrestoredVarLinks>
@@ -45,89 +45,45 @@
<Mappings>
<OwnerA>
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 26 (TM-X5K_CB-NEC20E)">
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner._udiXOffset" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner._udiYOffset" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data8"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner.diXOffset" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data7"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner.diYOffset" VarB="Module 1 (Result Data 128Byte)^Result Data 128Byte^Result Data8"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 44 (EX260-SEC1)">
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xCloseDoor1" VarB="Byte 0^Output[3]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xCloseDoor2" VarB="Byte 0^Output[1]" Size="1"/>
<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"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester.xCloseDoor1" VarB="Byte 0^Output[3]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester.xCloseDoor2" VarB="Byte 0^Output[1]" Size="1"/>
<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)^Box 7 (EX600-SEC#)">
<Link VarA="PlcTask Outputs^PRG_Main._fbAligner._xDisableVacuum" VarB="Module 1 (EX600-SEC#, 32 Valves)^Valve Outputs^Aligner disable vacuum" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbAligner._xEnableVacuum" VarB="Module 1 (EX600-SEC#, 32 Valves)^Valve Outputs^Aligner enable vacuum" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbAligner.xActivateVacuum" VarB="Module 1 (EX600-SEC#, 32 Valves)^Valve Outputs^Aligner enable vacuum" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbAligner.xDeactivateVacuum" VarB="Module 1 (EX600-SEC#, 32 Valves)^Valve Outputs^Aligner disable vacuum" 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"/>
<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"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbHeatCoolPlates._fbCoolPlate.stStatus" VarB="COM TxPDO-Map Inputs^Status"/>
<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"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xOpenChamber1" VarB="Channel 5^HV Hot_OpenChamber" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester._xOpenChamber2" VarB="Channel 2^HV Cold_OpenChamber" Size="1"/>
<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"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester.xOpenChamber1" VarB="Channel 5^HV Hot_OpenChamber" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbHVTester.xOpenChamber2" VarB="Channel 2^HV Cold_OpenChamber" Size="1"/>
</OwnerB>
<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"/>
<Link VarA="PlcTask Inputs^PRG_Safety.xRequestOpenDoor" VarB="Channel 4^MainDoorUnlock" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K12_KL01 (EK1100)^K12_KL04 (EL1018)">
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner._xVacuumOk" VarB="Channel 7^Input" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner.xVacuumOk" VarB="Channel 7^Input" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K20_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"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._xVacuumOk" VarB="Channel 1^ChuckVacuumOn" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1.xVacuumOk" VarB="Channel 1^ChuckVacuumOn" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K20_A2 (EP1018-0001)">
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbEjectBack.xCloseFeedback" VarB="Channel 7^Clamping fixture ejector back retracted" Size="1"/>
@@ -150,12 +106,12 @@
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbUnlockRight.xOpenValve" VarB="Byte 1^Output[2]" 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"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._xDisableVacuum" VarB="Byte 0^Output[2]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1.xDisableVacuum" VarB="Byte 0^Output[2]" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_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"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._xVacuumOk" VarB="Channel 1^ChuckVacuumOn" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2.xVacuumOk" VarB="Channel 1^ChuckVacuumOn" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_A2 (EP1018-0001)">
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbEjectBack.xCloseFeedback" VarB="Channel 7^Clamping fixture ejector back retracted" Size="1"/>
@@ -178,34 +134,34 @@
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbUnlockRight.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"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._xDisableVacuum" VarB="Byte 0^Output[2]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2.xDisableVacuum" VarB="Byte 0^Output[2]" 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 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"/>
</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)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._asiMotorTemps1To4" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 8 (Motor Temp)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._asiMotorTemps5To8" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 9 (Motor Temp)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._awJobStatesFromRobot" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 2 (JobAktiv/JobEnde)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._diMirrorOffsetPosX" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 5 (Offset X)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._diMirrorOffsetPosY" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 6 (Offset Y)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._diMirrorThickness" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 7 (Thickness)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._dwErrorBits" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 1 (Errorbits)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._eJobForPLC" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 3 (JobForPLC)" Size="16"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._uState" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 0 (Status)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot._abToolsAndPositions" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 2 (Greifer/Drehteller/Positionen)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot._diOffsetPosX" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 3 (Offset X)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot._diOffsetPosY" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 4 (Offset Y)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot._diThickness" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^ Output DWORD 5 (Thickness)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot._uCtrl" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 0 (CMDs)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot._uJobs" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 1 (JobNr/PLCJobNr)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.abyMirrorToolsAndPositions" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 4 (Greifer/Drehteller/Positionen)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.asiMotorTemps1To4" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 8 (Motor Temp)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.asiMotorTemps5To8" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 9 (Motor Temp)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.awJobStatesFromRobot" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 2 (JobAktiv/JobEnde)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.diMirrorOffsetPosX" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 5 (Offset X)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.diMirrorOffsetPosY" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 6 (Offset Y)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.diMirrorThickness" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 7 (Thickness)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.dwErrorBits" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 1 (Errorbits)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.eJobForPLC" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 3 (JobForPLC)" Size="16"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot.stState" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 0 (Status)" Size="16"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot.abyToolsAndPositions" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 2 (Greifer/Drehteller/Positionen)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot.diOffsetPosX" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 3 (Offset X)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot.diOffsetPosY" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 4 (Offset Y)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot.diThickness" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^ Output DWORD 5 (Thickness)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot.stCtrl" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 0 (CMDs)"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbRobot.stJobs" 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"/>
<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>
<OwnerB Name="TINC^NC-Task 1 SAF^Axes^AlignerXAxis">
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner._fbXAxis._fbAxis.NcToPlc" VarB="Outputs^ToPlc"/>