First bigger step to automation

- Aligned X and Y NC Axis with aligner camera coordination system
- Added robot plc jobs and feedback
- Began Meca500 robot interface
- Changed hotplate control to slow PWM
- PackML statemachine now starts in aborted state
- Fixed StateML start method
This commit is contained in:
2026-02-04 19:31:13 +01:00
parent 677c03d51d
commit c1850f780b
29 changed files with 1249 additions and 374 deletions

View File

@@ -47,6 +47,7 @@
<MappingInfo Identifier="{00000000-2001-0850-0020-500851000403}" Id="#x02030030"/> <MappingInfo Identifier="{00000000-2001-0850-0020-500851000403}" Id="#x02030030"/>
<MappingInfo Identifier="{00000000-0010-0304-3000-040310000403}" Id="#x02030010"/> <MappingInfo Identifier="{00000000-0010-0304-3000-040310000403}" Id="#x02030010"/>
<MappingInfo Identifier="{00000000-0020-0304-3000-040322000403}" Id="#x02030040"/> <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"/> <MappingInfo Identifier="{03040050-0050-0304-5000-040350000403}" Id="#x02030020" Watchdog="04000000040000000400000004000000"/>
</Mappings> </Mappings>
</TcSmProject> </TcSmProject>

View File

@@ -9,6 +9,7 @@ VAR
_fbEtcher2 : FB_Etcher; _fbEtcher2 : FB_Etcher;
_fbTrayFeederInput : FB_TrayFeeder(sIPAddr := '192.168.1.10', udiPort := 5000); _fbTrayFeederInput : FB_TrayFeeder(sIPAddr := '192.168.1.10', udiPort := 5000);
_fbHeatCoolPlates : FB_HeatCoolPlates; _fbHeatCoolPlates : FB_HeatCoolPlates;
_fbAligner : FB_Aligner;
_xConfirmAlarms : BOOL; _xConfirmAlarms : BOOL;
@@ -17,6 +18,7 @@ VAR
_stRobotAdmin : ST_PMLa; _stRobotAdmin : ST_PMLa;
_stRobotJobParams : ST_KukaRobot_JobParams; _stRobotJobParams : ST_KukaRobot_JobParams;
_stUnitFeedbacks : ST_KukaRobot_UnitFeedbacks;
_stCamResult AT %I* : ST_TrayFeederCamPosData; _stCamResult AT %I* : ST_TrayFeederCamPosData;
@@ -31,9 +33,13 @@ VAR
_xUnhold : BOOL; _xUnhold : BOOL;
_xStop : BOOL; _xStop : BOOL;
_xStartCycle : BOOL;
_xStartTrigger : BOOL; _xStartTrigger : BOOL;
_tofTriggerTime : TOF := (PT := T#1S); _tofTriggerTime : TOF := (PT := T#1S);
_xTriggerCamera AT %Q* : BOOL; _xTriggerCamera AT %Q* : BOOL;
_iState : INT;
END_VAR END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
@@ -73,11 +79,15 @@ IF _rtStopRobotFromSafety.Q THEN
_stRobotCmd.xCmdChangeRequest := TRUE; _stRobotCmd.xCmdChangeRequest := TRUE;
END_IF END_IF
_stUnitFeedbacks.xDoorEtcher1Open := _fbEtcher1.xDoorOpen;
_stUnitFeedbacks.xDoorEtcher2Open := _fbEtcher2.xDoorOpen;
_fbRobot( _fbRobot(
stCommand:= _stRobotCmd, stCommand:= _stRobotCmd,
stJobParams := _stRobotJobParams, stJobParams := _stRobotJobParams,
stUnitFeedbacks := _stUnitFeedbacks,
xReleaseAlarms:= TRUE, xReleaseAlarms:= TRUE,
xConfirmAlarms:= _xConfirmAlarms, xConfirmAlarms:= GVL_SCADA.xErrAck,
stStatus => _stRobotStatus, stStatus => _stRobotStatus,
stAdmin => _stRobotAdmin, stAdmin => _stRobotAdmin,
xReady=> , xReady=> ,
@@ -89,23 +99,84 @@ END_IF
_fbHVTester(xOpenChambers:= GVL_SCADA.xOpenAllChambers); _fbHVTester(xOpenChambers:= GVL_SCADA.xOpenAllChambers);
_fbEtcher1(xOpenDoor:= GVL_SCADA.xOpenAllChambers, xConfirmAlarms := GVL_SCADA.xErrAck); _fbEtcher1(
_fbEtcher2(xOpenDoor:= GVL_SCADA.xOpenAllChambers, xConfirmAlarms := GVL_SCADA.xErrAck); xOpenDoor:= GVL_SCADA.xOpenAllChambers,
xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher1,
xConfirmAlarms := GVL_SCADA.xErrAck);
// _fbTrayFeederInput( _fbEtcher2(
// stCommand:= , xOpenDoor:= GVL_SCADA.xOpenAllChambers,
// xConfirmAlarms := GVL_SCADA.xErrAck, xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher2,
// stStatus=> GVL_SCADA.stTrayFeederInputState, xConfirmAlarms := GVL_SCADA.xErrAck);
// stAdmin=> GVL_SCADA.stTRayFeederInputAdmin);
_fbTrayFeederInput(
stCommand:= ,
xConfirmAlarms := GVL_SCADA.xErrAck,
stStatus=> GVL_SCADA.stTrayFeederInputState,
stAdmin=> GVL_SCADA.stTRayFeederInputAdmin);
_fbHeatCoolPlates(xConfirmAlarms:= GVL_SCADA.xErrAck); _fbHeatCoolPlates(xConfirmAlarms:= GVL_SCADA.xErrAck);
_fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.xErrAck);
// Call safety program // Call safety program
PRG_Safety( PRG_Safety(
xConfirmAlarms := GVL_SCADA.xErrAck, xConfirmAlarms := GVL_SCADA.xErrAck,
xRobotStopped := (_stRobotStatus.eStateCurrent <> E_PackMLState.EXECUTE)); xRobotStopped := (_stRobotStatus.eStateCurrent <> E_PackMLState.EXECUTE));
// Handle robot cmds
M_HandleRobotCmd();
// Main state machine
CASE _iState OF
0: // Idle
IF _xStartCycle THEN
_xStartCycle := FALSE;
// Only start with robot in idle
IF _stRobotStatus.eStateCurrent = E_PackMLState.IDLE THEN
_iState := 10;
END_IF
END_IF
// Grab from position 1
10:
// Prepare robot command
_stRobotJobParams.eJob := E_KukaRobot_JobNumberRobot.GET_FROM_INPUT;
_stRobotJobParams.rPosX := 88.0;
_stRobotJobParams.rPosY := 79.0;
_stRobotJobParams.byGripperSide := 3;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.START;
_stRobotCmd.xCmdChangeRequest := TRUE;
_iState := 20;
// Wait for Robot to be done
20:
IF (_stRobotStatus.eStateCurrent = E_PackMLState.IDLE) THEN
_iState := 30;
END_IF
// Job aborted
IF (_stRobotStatus.eStateCurrent = E_PackMLState.ABORTED) OR (_stRobotStatus.eStateCurrent = E_PackMLState.STOPPED) THEN
_iState := 900;
END_IF
// Put part onto aligner
30:
_stRobotJobParams.eJob := E_KukaRobot_JobNumberRobot.PUT_INTO_ALIGNER;
_stRobotCmd.eCntrlCmd := E_PackMLCmd.START;
_stRobotCmd.xCmdChangeRequest := TRUE;
_iState := 40;
// Align blank
40:
END_CASE
// ===== // =====
// DEBUG // DEBUG
// ===== // =====
@@ -123,5 +194,131 @@ IF _xConfirmAlarms THEN
_xConfirmAlarms := FALSE; _xConfirmAlarms := FALSE;
END_IF]]></ST> END_IF]]></ST>
</Implementation> </Implementation>
<Method Name="M_HandleRobotCmd" Id="{14934aaa-b667-4ddb-915d-1d84e8eb799d}">
<Declaration><![CDATA[METHOD PRIVATE M_HandleRobotCmd
VAR_INST
_iState : INT;
_tonTimeout : TON;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[// Handle robot commands to plc
CASE _iState OF
// Wait for command
0:
_fbRobot.xAckPLCCmd := FALSE;
IF _fbRobot.xNewCmdRequested THEN
_tonTimeout(IN := FALSE);
_fbRobot.xAckPLCCmd := FALSE;
_fbRobot.xPLCJobFailed := FALSE;
_iState := 10;
END_IF
// Do command
10:
CASE _fbRobot.eCmdFromRobot OF
E_KukaRobot_JobNumerPLC.ENABLE_VACUUM_ALIGNER:
_fbAligner.xEnableVacuum := TRUE;
// Check for timeout
_tonTimeout(IN := TRUE, PT := T#10S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF _fbAligner.xVacuumEnabled THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.DISABLE_VACUUM_ALIGNER:
_fbAligner.xEnableVacuum := FALSE;
// Check for timeout
_tonTimeout(IN := TRUE, PT := T#10S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF (NOT _fbAligner.xVacuumEnabled) THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.ENABLE_VACUUM_ETCHER1:
_fbEtcher1.xEnableVacuum := TRUE;
// Check for timeout
_tonTimeout(IN := TRUE, PT := T#20S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF _fbEtcher1.xVacuumEnabled THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.DISABLE_VACUUM_ETCHER1:
_fbEtcher1.xEnableVacuum := FALSE;
// Check for timeout
_tonTimeout(IN := TRUE, PT := T#20S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF (NOT _fbEtcher1.xVacuumEnabled) THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.ENABLE_VACUUM_ETCHER2:
_fbEtcher2.xEnableVacuum := TRUE;
// Check for timeout
_tonTimeout(IN := TRUE, PT := T#20S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF _fbEtcher2.xVacuumEnabled THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
E_KukaRobot_JobNumerPLC.DISABLE_VACUUM_ETCHER2:
_fbEtcher2.xEnableVacuum := FALSE;
// Check for timeout
_tonTimeout(IN := TRUE, PT := T#20S);
IF _tonTimeout.Q THEN
_fbRobot.xAckPLCCmd := TRUE;
_fbRobot.xPLCJobFailed := TRUE;
_iState := 0;
END_IF
IF (NOT _fbEtcher2.xVacuumEnabled) THEN
_fbRobot.xAckPLCCmd := TRUE;
_iState := 0;
END_IF
ELSE
_iState := 90;
END_CASE
END_CASE]]></ST>
</Implementation>
</Method>
</POU> </POU>
</TcPlcObject> </TcPlcObject>

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_Aligner" Id="{5be6cab7-2294-48e5-869c-33773329143e}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Aligner EXTENDS FB_PackMLGeneric
VAR_INPUT
xEnableVacuum : BOOL;
xAlign : BOOL;
xConfirmAlarms : BOOL;
END_VAR
VAR_OUTPUT
xVacuumEnabled : BOOL;
END_VAR
VAR
_fbXAxis : FB_AxisPTP;
_fbYAxis : FB_AxisPTP;
_xEnableVacuum AT %Q* : BOOL := FALSE;
_xDisableVacuum AT %Q* : BOOL := TRUE;
_xVacuumOk AT %I* : BOOL;
_udiXOffset AT %I* : UDINT;
_udiYOffset AT %I* : UDINT;
_rXPosToGo : REAL;
_rYPosToGo : REAL;
_iState : INT := 0;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_fbXAxis(
xEnable:= TRUE,
xInvertCalibrationCam:= FALSE,
xEnablePositive:= TRUE,
xEnableNegative:= TRUE,
rOverride:= 100.0,
lrVelocity:= 2.5,
lrAcceleration:= 0,
lrDecelleration:= 0,
lrJerk:= 0,
xConfirmAlarms:= xConfirmAlarms,
xEnabled=> ,
xHomed=> ,
lrActPosition=> ,
xIsStopped=> ,
xBusy=> ,
xError=> );
_fbYAxis(
xEnable:= TRUE,
xInvertCalibrationCam:= FALSE,
xEnablePositive:= TRUE,
xEnableNegative:= TRUE,
rOverride:= 100.0,
lrVelocity:= 2.5,
lrAcceleration:= 0,
lrDecelleration:= 0,
lrJerk:= 0,
xConfirmAlarms:= xConfirmAlarms,
xEnabled=> ,
xHomed=> ,
lrActPosition=> ,
xIsStopped=> ,
xBusy=> ,
xError=> );
// Drei mal ausführen damit die Position genau ist
IF xAlign THEN
xAlign := FALSE;
_rXPosToGo := UDINT_TO_REAL(_udiXOffset) * -0.001;
_rYPosToGo := ((UDINT_TO_REAL(_udiYOffset) * 0.001) - 37.5) * -1;
IF (ABS(_rXPosToGo) < 10.0) AND (ABS(_rYPosToGo) < 10.0) AND (NOT _fbXAxis.xError) AND (NOT _fbYAxis.xError) THEN
_fbXAxis.M_MoveRel(lrRelDist := _rXPosToGo);
_fbYAxis.M_MoveRel(lrRelDist := _rYPosToGo);
END_IF
END_IF
// Handle enable disable vacuum command
_xEnableVacuum := xEnableVacuum;
_xDisableVacuum := (NOT xEnableVacuum);
xVacuumEnabled := _xVacuumOk;]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -4,12 +4,17 @@
<Declaration><![CDATA[FUNCTION_BLOCK FB_Etcher EXTENDS FB_PackMLGeneric <Declaration><![CDATA[FUNCTION_BLOCK FB_Etcher EXTENDS FB_PackMLGeneric
VAR_INPUT VAR_INPUT
xOpenDoor : BOOL; xOpenDoor : BOOL;
xEnableVacuum : BOOL;
xOpenChuckClamp : BOOL; xOpenChuckClamp : BOOL;
xEjectChuck : BOOL; xEjectChuck : BOOL;
xReleaseManualMode : BOOL;
xConfirmAlarms : BOOL; xConfirmAlarms : BOOL;
stHMIInterface : ST_Etcher_HMIInterface;
END_VAR END_VAR
VAR_OUTPUT VAR_OUTPUT
xDoorOpen : BOOL;
xChuckClampOpen : BOOL; xChuckClampOpen : BOOL;
xVacuumEnabled : BOOL;
END_VAR END_VAR
VAR VAR
_fbValveDoor : FB_Valve('Door'); _fbValveDoor : FB_Valve('Door');
@@ -18,39 +23,39 @@ VAR
xHasOpenFeedback := TRUE, xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S, timTimeoutOpen := T#5S,
timTimeoutClose := T#5S); timTimeoutClose := T#5S);
_stDoorHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingLeft : FB_Valve('Clamping left');
_stValveClampingLeftCfg : ST_ValveConfig := ( _fbUnlockLeft : FB_Valve('Clamping left');
_stValveUnlockLeftCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE, xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE, xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S, timTimeoutOpen := T#5S,
timTimeoutClose := T#5S); timTimeoutClose := T#5S);
_stClampingLeftHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingRight : FB_Valve('Clamping right');
_stValveClampingRightCfg : ST_ValveConfig := ( _fbUnlockRight : FB_Valve('Clamping right');
_stValveUnlockRightCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE, xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE, xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S, timTimeoutOpen := T#5S,
timTimeoutClose := T#5S); timTimeoutClose := T#5S);
_stClampingRightHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingFront : FB_Valve('Clamping front');
_fbEjectFront : FB_Valve('Clamping front');
_stValveClampingFrontCfg : ST_ValveConfig := ( _stValveClampingFrontCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE, xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE, xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S, timTimeoutOpen := T#5S,
timTimeoutClose := T#5S); timTimeoutClose := T#5S);
_stClampingFrontHMIInterface : ST_HMI_VALVE_DATA;
_fbClampingBack : FB_Valve('Clamping back');
_stValveClampingBackCfg : ST_ValveConfig := ( _fbEjectBack : FB_Valve('Clamping back');
_stValveEjectBackCfg : ST_ValveConfig := (
xHasClosedFeedback := TRUE, xHasClosedFeedback := TRUE,
xHasOpenFeedback := TRUE, xHasOpenFeedback := TRUE,
timTimeoutOpen := T#5S, timTimeoutOpen := T#5S,
timTimeoutClose := T#5S); timTimeoutClose := T#5S);
_stClampingBackHMIInterface : ST_HMI_VALVE_DATA;
_rtEjectChuckCmd : R_TRIG; _rtEjectChuckCmd : R_TRIG;
_tpEjectChuck : TP; _tpEjectChuck : TP;
@@ -59,6 +64,8 @@ VAR
// Sensors // Sensors
// ======= // =======
_xVacuumOk AT %I* : BOOL;
// Spinner vibration sensor // Spinner vibration sensor
_xVibrationSensor AT %I* : BOOL; _xVibrationSensor AT %I* : BOOL;
@@ -66,7 +73,7 @@ VAR
// Actuators // Actuators
// ========= // =========
_xDisableVacuum AT %Q* : BOOL;
END_VAR END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
@@ -77,7 +84,9 @@ _fbValveDoor(
stValveConfig:= _stValveDoorCfg, stValveConfig:= _stValveDoorCfg,
xReleaseManualMode:= FALSE, xReleaseManualMode:= FALSE,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stDoorHMIInterface); stHMIInterface:= stHMIInterface.stDoorHMIInterface);
xDoorOpen := _fbValveDoor.IsOpen;
// Chuck // Chuck
_rtEjectChuckCmd(CLK := xEjectChuck); _rtEjectChuckCmd(CLK := xEjectChuck);
@@ -87,40 +96,45 @@ ELSE
_tpEjectChuck(IN := FALSE); _tpEjectChuck(IN := FALSE);
END_IF END_IF
_fbClampingLeft( _fbUnlockLeft(
xAutomaticOpen:= xOpenChuckClamp, xAutomaticOpen:= xOpenChuckClamp,
xReleaseErrors:= TRUE, xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingLeftCfg, stValveConfig:= _stValveUnlockLeftCfg,
xReleaseManualMode:= FALSE, xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingLeftHMIInterface); stHMIInterface:= stHMIInterface.stUnlockLeftHMIInterface);
_fbClampingRight( _fbUnlockRight(
xAutomaticOpen:= xOpenChuckClamp, xAutomaticOpen:= xOpenChuckClamp,
xReleaseErrors:= TRUE, xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingRightCfg, stValveConfig:= _stValveUnlockRightCfg,
xReleaseManualMode:= FALSE, xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingRightHMIInterface); stHMIInterface:= stHMIInterface.stUnlockRightHMIInterface);
_fbClampingFront( _fbEjectFront(
xAutomaticOpen:= _tpEjectChuck.Q, xAutomaticOpen:= _tpEjectChuck.Q,
xReleaseErrors:= TRUE, xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingFrontCfg, stValveConfig:= _stValveClampingFrontCfg,
xReleaseManualMode:= FALSE, xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingFrontHMIInterface); stHMIInterface:= stHMIInterface.stEjectFrontHMIInterface);
_fbClampingBack( _fbEjectBack(
xAutomaticOpen:= _tpEjectChuck.Q, xAutomaticOpen:= _tpEjectChuck.Q,
xReleaseErrors:= TRUE, xReleaseErrors:= TRUE,
stValveConfig:= _stValveClampingBackCfg, stValveConfig:= _stValveEjectBackCfg,
xReleaseManualMode:= FALSE, xReleaseManualMode:= xReleaseManualMode,
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface:= _stClampingBackHMIInterface); stHMIInterface:= stHMIInterface.stEjectBackHMIInterface);
_xDisableVacuum := (NOT xEnableVacuum);
// Call base sm // Call base sm
SUPER^();]]></ST> SUPER^();
// Copy internal signals to output
xVacuumEnabled := _xVacuumOk;]]></ST>
</Implementation> </Implementation>
<Method Name="FB_Init" Id="{afcda70c-3e52-4a32-9ca9-670a6b854f24}"> <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. <Declaration><![CDATA[//FB_Init is always available implicitly and it is used primarily for initialization.

View File

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

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_Meca_JointSet" Id="{11c9caa0-793d-42a4-a6d6-9b5ea59d2923}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_Meca_JointSet :
STRUCT
rSubIndex001 : REAL;
rSubIndex002 : REAL;
rSubIndex003 : REAL;
rSubIndex004 : REAL;
rSubIndex005 : REAL;
rSubIndex006 : REAL;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_Meca_MotionStatus" Id="{5e335d40-97f1-424a-b3e3-1b2de304decf}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_Meca_MotionStatus :
STRUCT
uiReachedCheckPointId : UINT;
uiDiscardedCheckpointId : UINT;
uiMoveID : UINT;
uiFIFOSpace : UINT;
bPaused : BIT;
bEOB : BIT;
bEOM : BIT;
bFIFOCleared : BIT;
PStop2 : BIT;
bExcessiveTorque : BIT;
uiOfflineProgramID : UINT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<DUT Name="ST_Meca_RobotStatus" Id="{2543bfc1-49aa-4184-94d9-b32f02498fcc}">
<Declaration><![CDATA[{attribute 'pack_mode' := '1'}
TYPE ST_Meca_RobotStatus :
STRUCT
bBusy : BIT;
bActivated : BIT;
bHomed : BIT;
bSimActivated : BIT;
bBrakesEngaged : BIT;
bRecoveryMode : BIT;
bEStop : BIT;
bCollisionStatus : BIT;
bWorkZoneStatus : BIT;
uiError : UINT;
END_STRUCT
END_TYPE
]]></Declaration>
</DUT>
</TcPlcObject>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_Mecademics" Id="{c81cf0ae-3f01-4427-918b-0d3e1c93ae01}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_Mecademics
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -35,6 +35,12 @@ VAR
timWarningLowOn := T#1S, timWarningLowOn := T#1S,
timHardwareSignalLevelOff := T#1S)); timHardwareSignalLevelOff := T#1S));
_fbPITempControl : FB_PI;
_xSaturatedUpper : BOOL;
_xSaturatedLower : BOOL;
_rMV : REAL;
_fbPulsOut : TP;
_fbPWMOut : FB_PWM;
END_VAR END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
@@ -48,15 +54,43 @@ _fbTempSensor(
xConfirmAlarms:= xConfirmAlarms, xConfirmAlarms:= xConfirmAlarms,
stHMIInterface=> ); stHMIInterface=> );
_fbPITempControl(
rSP:= rTargetTemp,
rPV:= _fbTempSensor.rScaledValue,
rKp:= 2,
rTn:= 0,
xEnable:= xEnable,
xSaturatedUpper:= _xSaturatedUpper,
xSaturatedLower:= _xSaturatedLower,
rMV=> _rMV);
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
_fbPWMOut(
rPWM:= _rMV,
timPeriod:= T#10S,
xOutput=> _xEnableHotplate);
// Control temperature with two point controller // Control temperature with two point controller
IF _fbTempSensor.rScaledValue < (rTargetTemp - rDeadBand) THEN // IF _fbTempSensor.rScaledValue < (rTargetTemp - rDeadBand) THEN
_xEnableHotplate := TRUE; // _xEnableHotplate := TRUE;
END_IF // END_IF
//
IF _fbTempSensor.rScaledValue >= (rTargetTemp) THEN // IF _fbTempSensor.rScaledValue >= (rTargetTemp) THEN
_xEnableHotplate := FALSE; // _xEnableHotplate := FALSE;
END_IF // END_IF
]]></ST> ]]></ST>
</Implementation> </Implementation>
<Method Name="M_AddItem" Id="{9707459a-6558-487c-b730-c9dc92d598ed}"> <Method Name="M_AddItem" Id="{9707459a-6558-487c-b730-c9dc92d598ed}">

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<TcPlcObject Version="1.1.0.1">
<POU Name="FB_PWM" Id="{39ea0d97-8eb7-44fa-b55f-8461b6c6c8ae}" SpecialFunc="None">
<Declaration><![CDATA[FUNCTION_BLOCK FB_PWM
VAR_INPUT
rPWM : REAL;
timPeriod : TIME;
END_VAR
VAR_OUTPUT
xOutput : BOOL;
END_VAR
VAR
_tonTimer : TON;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_tonTimer(IN := TRUE, PT := timPeriod);
IF _tonTimer.Q THEN
_tonTimer(IN := FALSE);
END_IF
IF rPWM = 0.0 THEN
xOutput := FALSE;
ELSIF rPWM >= 100.0 THEN
xOutput := TRUE;
ELSE
IF (1.0 - (TIME_TO_REAL(_tonTimer.ET) / TIME_TO_REAL(timPeriod))) <= (rPWM * 0.01) THEN
xOutput := TRUE;
ELSE
xOutput := FALSE;
END_IF
END_IF]]></ST>
</Implementation>
</POU>
</TcPlcObject>

View File

@@ -15,15 +15,17 @@ TYPE E_KukaRobot_JobNumerPLC :
// Etcher 1 station // Etcher 1 station
ENABLE_VACUUM_ETCHER1 := 20, ENABLE_VACUUM_ETCHER1 := 20,
DISABLE_VACUUM_ETHER1 := 22, DISABLE_VACUUM_ETCHER1 := 22,
UNLOCK_CHUCK_ETCHER1 := 60, UNLOCK_CHUCK_ETCHER1 := 60,
LOCK_CHUCK_ETCHER1 := 62, LOCK_CHUCK_ETCHER1 := 62,
// Ether 2 station // Ether 2 station
ENABLE_VACUUM_ETCHER2 := 21, ENABLE_VACUUM_ETCHER2 := 21,
DISABLE_VACUUM_ETCHER2 := 23, DISABLE_VACUUM_ETCHER2 := 23,
UNLOCK_CHUCK_ETHCER2 := 61, UNLOCK_CHUCK_ETCHER2 := 61,
LOCK_CHUCK_ETCHER2 := 63 LOCK_CHUCK_ETCHER2 := 63,
JOB_FAILED := 99
) WORD := NO_JOB; ) WORD := NO_JOB;
END_TYPE END_TYPE
]]></Declaration> ]]></Declaration>

View File

@@ -10,10 +10,16 @@ VAR_INPUT
// like if a door is open and such things // like if a door is open and such things
stUnitFeedbacks : ST_KukaRobot_UnitFeedbacks; stUnitFeedbacks : ST_KukaRobot_UnitFeedbacks;
xAckPLCCmd : BOOL;
xPLCJobFailed : BOOL;
xReleaseAlarms : BOOL; xReleaseAlarms : BOOL;
xConfirmAlarms : BOOL; xConfirmAlarms : BOOL;
END_VAR END_VAR
VAR_OUTPUT VAR_OUTPUT
eCmdFromRobot : E_KukaRobot_JobNumerPLC;
xNewCmdRequested : BOOL;
xReady : BOOL; xReady : BOOL;
xError : BOOL; xError : BOOL;
END_VAR END_VAR
@@ -43,7 +49,7 @@ VAR
_uState AT %I* : U_KukaRobot_State; _uState AT %I* : U_KukaRobot_State;
_dwErrorBits AT %I* : DWORD; _dwErrorBits AT %I* : DWORD;
_awJobStatesFromRobot AT %I* : ARRAY[0..1] OF WORD; _awJobStatesFromRobot AT %I* : ARRAY[0..1] OF WORD;
_dwJobForPLC AT %I* : DWORD; _eJobForPLC AT %I* : E_KukaRobot_JobNumerPLC;
_abMirrorToolsAndPositions AT %I* : ARRAY[0..3] OF BYTE; _abMirrorToolsAndPositions AT %I* : ARRAY[0..3] OF BYTE;
@@ -58,6 +64,8 @@ VAR
_ePlcJob :E_KukaRobot_JobNumerPLC; _ePlcJob :E_KukaRobot_JobNumerPLC;
_iState : INT;
_xRobotReady : BOOL; _xRobotReady : BOOL;
_xError : BOOL; _xError : BOOL;
@@ -97,7 +105,7 @@ _fbAlarmEStopActive(
timOffDelay:= T#0S); timOffDelay:= T#0S);
_fbAlarmOperatorSafetyNotOk( _fbAlarmOperatorSafetyNotOk(
xActive:= (NOT _uState.stState.bUserSAF), xActive:= (NOT _uState.stState.bUserSAF) AND (_uState.stState.bExt),
xRelease:= TRUE, xRelease:= TRUE,
xAcknowledge:= xConfirmAlarms, xAcknowledge:= xConfirmAlarms,
timOnDelay:= T#0S, timOnDelay:= T#0S,
@@ -149,7 +157,12 @@ _uCtrl.stCtrl.bNotDisableAxes := 1;
// Write unit feedbacks outputs // Write unit feedbacks outputs
// ============================ // ============================
_uCtrl.stCtrl.bDoorEtcher1Open := stUnitFeedbacks.xDoorEtcher1Open;
_uCtrl.stCtrl.bDoorEtcher2Open := stUnitFeedbacks.xDoorEtcher2Open;
_uCtrl.stCtrl.bDoorHVTestHotOpen := stUnitFeedbacks.xDoorHVTestHotOpen;
_uCtrl.stCtrl.bDoorHVTestColdOpen := stUnitFeedbacks.xDoorHVTestColdOpen;
M_HandlePLCJobs();
// ================= // =================
@@ -217,9 +230,69 @@ END_IF
<Declaration><![CDATA[METHOD PROTECTED M_Execute <Declaration><![CDATA[METHOD PROTECTED M_Execute
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[// Wait for robot to be done <ST><![CDATA[CASE stJobParams.eJob OF
IF _awJobStatesFromRobot[0] = 0 THEN E_KukaRobot_JobNumberRobot.WARMUP:
CASE _iSSM OF
0: // Wait for program to end
IF _awJobStatesFromRobot[0] = 0 THEN
IF _asiMotorTemps1To4[3] < 40 THEN
_iSSM := 10;
ELSE
_eCmd := E_PackMLCmd.COMPLETE; _eCmd := E_PackMLCmd.COMPLETE;
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;
_iSSM := 0;
END_IF
END_CASE
ELSE
// Wait for robot to be done
IF _awJobStatesFromRobot[0] = 0 THEN
_uJobs.stJobs.wJobNrForRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
_eCmd := E_PackMLCmd.COMPLETE;
END_IF
END_CASE
]]></ST>
</Implementation>
</Method>
<Method Name="M_HandlePLCJobs" Id="{4e3710b4-697b-42e8-86b1-31b19b3023db}">
<Declaration><![CDATA[METHOD M_HandlePLCJobs
VAR_INST
_rtrigNewJob : R_TRIG;
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[_rtrigNewJob(CLK := (_eJobForPLC <> E_KukaRobot_JobNumberRobot.NO_JOB));
IF _rtrigNewJob.Q THEN
eCmdFromRobot := _eJobForPLC;
xNewCmdRequested := TRUE;
END_IF
IF xNewCmdRequested AND xAckPLCCmd THEN
xNewCmdRequested := FALSE;
IF (NOT xPLCJobFailed) THEN
_uJobs.stJobs.wFinishedJobNrFromPlc := _eJobForPLC;
ELSE
_uJobs.stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumerPLC.JOB_FAILED;
END_IF
eCmdFromRobot := E_KukaRobot_JobNumberRobot.NO_JOB;
END_IF
// Reset plc job done
IF (_eJobForPLC = E_KukaRobot_JobNumberRobot.NO_JOB)
AND (_uJobs.stJobs.wFinishedJobNrFromPlc <> E_KukaRobot_JobNumberRobot.NO_JOB)
AND (NOT xPLCJobFailed)
THEN
_uJobs.stJobs.wFinishedJobNrFromPlc := E_KukaRobot_JobNumberRobot.NO_JOB;
END_IF]]></ST> END_IF]]></ST>
</Implementation> </Implementation>
</Method> </Method>
@@ -343,15 +416,20 @@ END_VAR]]></Declaration>
<ST><![CDATA[CASE _iSSM OF <ST><![CDATA[CASE _iSSM OF
// Check job parameters // Check job parameters
0: 0:
IF (_stJobParams.byGripperNumber < 0) OR (_stJobParams.byGripperNumber > 3) // Wrong gripper number IF (_stJobParams.byGripperNumber < 0) OR (_stJobParams.byGripperNumber > 4) // Wrong gripper number
OR (_stJobParams.byChuckNumber < 1) OR (_stJobParams.byChuckNumber > 6) // Wrong chuck number //OR (_stJobParams.byChuckNumber < 1) OR (_stJobParams.byChuckNumber > 6) // Wrong chuck number
OR (_stJobParams.byGripperSide < 1) OR (_stJobParams.byGripperSide > 2) // Wrong gripper side OR (_stJobParams.byGripperSide < 1) OR (_stJobParams.byGripperSide > 6) // Wrong gripper side
THEN THEN
_eCmd := E_PackMLCmd.ABORT; _eCmd := E_PackMLCmd.ABORT;
ELSE ELSE
_iSSM := 10; _iSSM := 10;
END_IF END_IF
// BLOCKIERE GREIFER TAUSCH, DA AKTUELL KABEL DEFEKT !!!!!
IF _stJobParams.eJob = E_KukaRobot_JobNumberRobot.CHANGE_GRIPPER THEN
_eCmd := E_PackMLCmd.ABORT;;
END_IF
// Transfer job data to robot // Transfer job data to robot
10: 10:
// Pos x in um // Pos x in um
@@ -364,16 +442,7 @@ END_VAR]]></Declaration>
_diThickness := REAL_TO_DINT(_stJobParams.rThickness * 1000); _diThickness := REAL_TO_DINT(_stJobParams.rThickness * 1000);
// Gripper side // Gripper side
IF _stJobParams.byGripperSide = 1 THEN _uCtrl.stCtrl.byGripperSide := _stJobParams.byGripperSide;
_uCtrl.stCtrl.bGripperSide1 := 1;
_uCtrl.stCtrl.bGripperSide2 := 0;
ELSIF _stJobParams.byGripperSide = 2 THEN
_uCtrl.stCtrl.bGripperSide1 := 0;
_uCtrl.stCtrl.bGripperSide2 := 1;
ELSE
_uCtrl.stCtrl.bGripperSide1 := 0;
_uCtrl.stCtrl.bGripperSide2 := 0;
END_IF
// Scan QR code // Scan QR code
IF stJobParams.xScanQRCode THEN IF stJobParams.xScanQRCode THEN

View File

@@ -38,15 +38,18 @@ STRUCT
bDummy8 : BIT; bDummy8 : BIT;
bDummy9 : BIT; bDummy9 : BIT;
bGripperSide1 : BIT;
bGripperSide2 : BIT;
bDummy10 : BIT; bDummy10 : BIT;
bDummy11 : BIT;
bDummy12 : BIT;
bDoorEtcher1Open : BIT; bDoorEtcher1Open : BIT;
bDoorEtcher2Open : BIT; bDoorEtcher2Open : BIT;
bDoorHVTestHotOpen : BIT; bDoorHVTestHotOpen : BIT;
bDoorHVTestColdOpen : BIT; bDoorHVTestColdOpen : BIT;
bDummy13: BIT;
byGripperSide : BYTE;
END_STRUCT END_STRUCT
END_TYPE END_TYPE
]]></Declaration> ]]></Declaration>

View File

@@ -7,31 +7,31 @@ STRUCT
eJob : E_KukaRobot_JobNumberRobot; eJob : E_KukaRobot_JobNumberRobot;
// Position in x in mm // Position in x in mm
rPosX : REAL; rPosX : REAL := 78;
// Position in y in mm // Position in y in mm
rPosY : REAL; rPosY : REAL := 88;
// Substrate thickness in mm // Substrate thickness in mm
rThickness : REAL; rThickness : REAL := 2.7;
// Gripper side (1 or 2) // Gripper side (1 or 2)
byGripperSide : BYTE; byGripperSide : BYTE := 3;
// Scan QR Code during pickup from loading station // Scan QR Code during pickup from loading station
xScanQRCode : BOOL; xScanQRCode : BOOL;
// Position on hotplate (1-9) // Position on hotplate (1-9)
byPlaceOnHotplate : BYTE; byPlaceOnHotplate : BYTE := 1;
// Position on coolplate (1-9) // Position on coolplate (1-9)
byPlaceOnCoolPlate : BYTE; byPlaceOnCoolPlate : BYTE := 1;
// Gripper tool number (0-3) // Gripper tool number (0-3)
byGripperNumber : BYTE; byGripperNumber : BYTE := 2;
// Chuck for etcher to load (1-6) // Chuck for etcher to load (1-6)
byChuckNumber : BYTE; byChuckNumber : BYTE := 1;
END_STRUCT END_STRUCT
END_TYPE END_TYPE
]]></Declaration> ]]></Declaration>

View File

@@ -3,8 +3,8 @@
<DUT Name="ST_KukaRobot_UnitFeedbacks" Id="{d247890a-fdb7-498e-85a5-2423833e65fc}"> <DUT Name="ST_KukaRobot_UnitFeedbacks" Id="{d247890a-fdb7-498e-85a5-2423833e65fc}">
<Declaration><![CDATA[TYPE ST_KukaRobot_UnitFeedbacks : <Declaration><![CDATA[TYPE ST_KukaRobot_UnitFeedbacks :
STRUCT STRUCT
xDoorEthcher1Open : BOOL; xDoorEtcher1Open : BOOL;
xDoorEther2Open : BOOL; xDoorEtcher2Open : BOOL;
xDoorHVTestHotOpen : BOOL; xDoorHVTestHotOpen : BOOL;
xDoorHVTestColdOpen : BOOL; xDoorHVTestColdOpen : BOOL;
END_STRUCT END_STRUCT

View File

@@ -32,13 +32,14 @@ VAR
_fbSocketReceive : FB_SocketReceive; _fbSocketReceive : FB_SocketReceive;
_timReceiveTimeout : TIME := T#5S; _timReceiveTimeout : TIME := T#5S;
_abReceivedBuffer : ARRAY[0..100] OF BYTE; _abReceivedBuffer : ARRAY[0..100] OF BYTE;
_sReceivedResponse : STRING; _asReceivedResponse : ARRAY[0..9] OF STRING;
_uiBufferPos : UINT;
_udiCounterReceive : UDINT; _udiCounterReceive : UDINT;
_udiReceivedBytes : UDINT; _udiReceivedBytes : UDINT;
_timPollingTime : TIME := T#50MS; _timPollingTime : TIME := T#1S;
_tonPollTimer : TON; _tonPollTimer : TON;
_xEnableReceiveTimeout : BOOL; _xEnableReceiveTimeout : BOOL;
_timReceiveTimeoutTime : TIME := T#500MS; _timReceiveTimeoutTime : TIME := T#5S;
_tonReceiveTimeout : TON; _tonReceiveTimeout : TON;
_uiLastReceivedResponseId : UINT := 0; _uiLastReceivedResponseId : UINT := 0;
@@ -141,194 +142,369 @@ CASE _iStateReceive OF
// Check if we are still connected // Check if we are still connected
IF (NOT _xConnected) THEN IF (NOT _xConnected) THEN
_tonPollTimer(IN := FALSE); _tonPollTimer(IN := FALSE);
_sReceivedResponse := ''; //_asReceivedResponse[] := '';
_iStateReceive := 0; _iStateReceive := 0;
END_IF END_IF
// Check received data // Check received data
20: 20:
// Check if received command is complete // Check if received command is complete
MEMCPY(destAddr := ADR(_sReceivedResponse), srcAddr := ADR(_abReceivedBuffer), n := _udiReceivedBytes); MEMCPY(destAddr := ADR(_asReceivedResponse[_uiBufferPos]), srcAddr := ADR(_abReceivedBuffer), n := _udiReceivedBytes);
_uiBufferPos := _uiBufferPos + 1;
IF _uiBufferPos > 9 THEN
_uiBufferPos := 0;
END_IF
_udiReceivedBytes := 0; _udiReceivedBytes := 0;
//_xCmdReceived := TRUE; _xCmdReceived := TRUE;
// Go back to polling wait state // Go back to polling wait state
_iStateReceive := 15; _iStateReceive := 15;
END_CASE END_CASE
CASE _iState OF // CASE _iState OF
// Wait for active connection to tray feeder // // Wait for active connection to tray feeder
0: // 0:
IF _xConnected THEN // IF _xConnected THEN
_iState := 10; // _iState := 10;
END_IF // END_IF
//
// Connected and idle // // Connected and idle
10: // 10:
// Got to disconnected state if connection is lost // // Got to disconnected state if connection is lost
IF (NOT _xConnected) THEN // IF (NOT _xConnected) THEN
_iState := 0; // _iState := 0;
END_IF // END_IF
//
IF _xSendCmd THEN // IF _xSendCmd THEN
_xSendCmd := FALSE; // _xSendCmd := FALSE;
_xBusy := TRUE; // _xBusy := TRUE;
_iState := 20; // _iState := 20;
END_IF // END_IF
//
// Check if we received a response without sending a command // // Check if we received a response without sending a command
// IF _xCmdReceived THEN // IF _xCmdReceived THEN
// _xCmdReceived := FALSE;
// _iState := 50; // _iState := 50;
// END_IF // END_IF
//
// Send command // // Send command
20: // 20:
_fbSocketSend( // _fbSocketSend(
sSrvNetId:= '', // sSrvNetId:= '',
hSocket:= _hSocket, // hSocket:= _hSocket,
cbLen:= SIZEOF(_sCmd), // cbLen:= SIZEOF(_sCmd),
pSrc:= ADR(_sCmd), // pSrc:= ADR(_sCmd),
bExecute:= TRUE, // bExecute:= TRUE,
tTimeout:= _timSendTimeout, // tTimeout:= _timSendTimeout,
bBusy=> , // bBusy=> ,
bError=> , // bError=> ,
nErrId=> ); // nErrId=> );
//
IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN // IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN
_fbSocketSend(bExecute := FALSE); // _fbSocketSend(bExecute := FALSE);
//_xEnableReceiveTimeout := TRUE; // _xEnableReceiveTimeout := TRUE;
//_iState := 30; // _iState := 30;
END_IF // END_IF
//
IF _fbSocketSend.bError THEN // IF _fbSocketSend.bError THEN
_fbSocketSend(bExecute := FALSE); // _fbSocketSend(bExecute := FALSE);
_iState := 90; // _iState := 90;
END_IF // END_IF
//
// Wait for response // // Wait for response
30: // 30:
// Received a response // // Received a response
IF _xCmdReceived THEN // IF _xCmdReceived THEN
_xCmdReceived := FALSE; // _xCmdReceived := FALSE;
_xEnableReceiveTimeout := FALSE; // _xEnableReceiveTimeout := FALSE;
_uiRetries := 0; // _uiRetries := 0;
_iState := 40; // _iState := 40;
END_IF // END_IF
//
// Didnt receive command ack in time // // Didnt receive command ack in time
// So resend the command if max retries are not reached // // So resend the command if max retries are not reached
IF _tonReceiveTimeout.Q THEN // IF _tonReceiveTimeout.Q THEN
_xEnableReceiveTimeout := FALSE; // _xEnableReceiveTimeout := FALSE;
_uiRetries := _uiRetries + 1; // _uiRetries := _uiRetries + 1;
//
// Check if we reached the max number of retries // // Check if we reached the max number of retries
IF _uiRetries > MAX_RETRIES THEN // IF _uiRetries > MAX_RETRIES THEN
_iState := 90; // _iState := 90;
ELSE // ELSE
// Retry by sendind command again // // Retry by sendind command again
_iState := 20; // _iState := 20;
END_IF // END_IF
END_IF // END_IF
//
// Check response // // Check response
40: // 40:
// Check for cmd id // // Check for cmd id
IF (TO_STRING(_sReceivedResponse[0]) <> UINT_TO_STRING(_uiCmdId)) THEN // IF (TO_STRING(_sReceivedResponse[0]) <> UINT_TO_STRING(_uiCmdId)) THEN
// Wrong command id received // // Wrong command id received
_iState := 90; // _iState := 900;
END_IF // END_IF
//
// For for response indicator // // For for response indicator
IF _sReceivedResponse[1] <> F_ToASC('<') THEN // IF _sReceivedResponse[1] <> F_ToASC('<') THEN
// Wrong response indicator // // Wrong response indicator
_iState := 90; // _iState := 901;
END_IF // END_IF
//
// Check for correct cmd // // Check for correct cmd
_xReceivedResponseOk := TRUE; // _xReceivedResponseOk := TRUE;
FOR _diCounter := 2 TO (LEN(_sReceivedResponse) - 1) DO // FOR _diCounter := 2 TO 10 DO
IF _sReceivedResponse[_diCounter] = F_ToASC(':') THEN // IF _sReceivedResponse[_diCounter] <> _sCmd[_diCounter] THEN
EXIT; // _xReceivedResponseOk := FALSE;
ELSIF _sReceivedResponse[_diCounter] <> _sCmd[_diCounter] THEN // EXIT;
_xReceivedResponseOk := FALSE; // END_IF
EXIT; // END_FOR
END_IF //
END_FOR // IF _xReceivedResponseOk THEN
// _xBusy := FALSE;
IF _xReceivedResponseOk THEN // _iState := 10;
_iState := 10; // ELSE
ELSE // _iState := 902;
_iState := 90; // END_IF
END_IF //
// 50:
50: // // Get command id
// Get command id // _uiReceivedCommandId := _sReceivedResponse[0] - 16#30;
_uiReceivedCommandId := STRING_TO_UINT(TO_STRING(_sReceivedResponse[0])); //
// // Check if it is a new command
// Check if it is a new command // IF (_uiReceivedCommandId <> _uiLastReceivedResponseId) OR (_uiReceivedCommandId = 0) THEN
IF (_uiReceivedCommandId <> _uiLastReceivedResponseId) OR (_uiReceivedCommandId = 0) THEN // _uiLastReceivedResponseId := _uiReceivedCommandId;
_uiLastReceivedResponseId := _uiReceivedCommandId; // xNewResponseReady := FALSE;
xNewResponseReady := TRUE; //
// // Send acknowledgement
// Send acknowledgement // _iState := 60;
_iState := 60; // END_IF
END_IF //
// // Prepare ack response
// Prepare ack response // 60:
60: // FOR _diCounter := 0 TO 10 DO
_sAck := CONCAT(UINT_TO_STRING(_uiLastReceivedResponseId), '<'); // _sAck[_diCounter] := _sReceivedResponse[_diCounter];
// END_FOR
FOR _diCounter := 2 TO (LEN(_sReceivedResponse) - 1) DO // _sAck[11] := 0;
IF _sReceivedResponse[_diCounter] <> F_ToASC(':') THEN //
_sAck[_diCounter] := _sReceivedResponse[_diCounter]; // IF _sReceivedResponse[1] = F_ToAsc('>') THEN
ELSE // _iState := 70;
_sAck[_diCounter] := F_ToASC('\0'); // ELSE
EXIT; // _iState := 10;
END_IF // END_IF
END_FOR //
//
_iState := 70; // // Send ack response
// 70:
// Send ack response // _fbSocketSend(
70: // sSrvNetId:= '',
_fbSocketSend( // hSocket:= _hSocket,
sSrvNetId:= '', // cbLen:= SIZEOF(_sAck),
hSocket:= _hSocket, // pSrc:= ADR(_sAck),
cbLen:= SIZEOF(_sAck), // bExecute:= TRUE,
pSrc:= ADR(_sAck), // tTimeout:= _timSendTimeout,
bExecute:= TRUE, // bBusy=> ,
tTimeout:= _timSendTimeout, // bError=> ,
bBusy=> , // nErrId=> );
bError=> , //
nErrId=> ); // IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN
// _fbSocketSend(bExecute := FALSE);
IF (NOT _fbSocketSend.bBusy) AND (NOT _fbSocketSend.bError) THEN // _xEnableReceiveTimeout := TRUE;
_fbSocketSend(bExecute := FALSE); // _xBusy := FALSE;
_xEnableReceiveTimeout := TRUE; // _iState := 10;
_iState := 10; // END_IF
END_IF //
// IF _fbSocketSend.bError THEN
IF _fbSocketSend.bError THEN // _fbSocketSend(bExecute := FALSE);
_fbSocketSend(bExecute := FALSE); // _iState := 90;
_iState := 90; // END_IF
END_IF //
// // Error
// Error // 90:
90: // _xError := TRUE;
_xError := TRUE; // _xBusy := FALSE;
_xBusy := FALSE; //
// IF xConfirmAlarms THEN
IF xConfirmAlarms THEN // _xError := FALSE;
_xError := FALSE; // _uiRetries := 0;
_iState := 0; // _iState := 0;
END_IF // END_IF
END_CASE // END_CASE
// Copy output buffers to outputs // Copy output buffers to outputs
xConnected := _xConnected; xConnected := _xConnected;
xBusy := _xBusy; xBusy := _xBusy;
xError := _xError;]]></ST> xError := _xError;]]></ST>
</Implementation> </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}"> <Method Name="M_GetResponse" Id="{48f8719d-7ed0-4fb1-824a-0bf475fcfc2c}">
<Declaration><![CDATA[METHOD M_GetResponse : STRING <Declaration><![CDATA[METHOD M_GetResponse : STRING
VAR VAR
@@ -337,7 +513,7 @@ END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[xNewResponseReady := FALSE; <ST><![CDATA[xNewResponseReady := FALSE;
MEMCPY(destAddr := ADR(_sTmp), ADR(_sReceivedResponse) + 2, n := INT_TO_UDINT(LEN(_sReceivedResponse) - 2)); //MEMCPY(destAddr := ADR(_sTmp), ADR(_asReceivedResponse) + 2, n := INT_TO_UDINT(LEN(_asReceivedResponse) - 2));
M_GetResponse := _sTmp;]]></ST> M_GetResponse := _sTmp;]]></ST>
</Implementation> </Implementation>
</Method> </Method>

View File

@@ -15,7 +15,7 @@ VAR
_xTest : BOOL; _xTest : BOOL;
_xSendResult : BOOL; _xSendResult : BOOL;
_sCmd : STRING := 'STAT-FEED:'; _sCmd : STRING := 'STAT-FEED';
END_VAR END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>

View File

@@ -7,6 +7,9 @@ VAR_GLOBAL
xOpenAllChambers : BOOL; xOpenAllChambers : BOOL;
xOpenChuckClampEtcher1 : BOOL;
xOpenChuckClampEtcher2 : BOOL;
// Unit states // Unit states
stTrayFeederInputState : ST_PMLs; stTrayFeederInputState : ST_PMLs;
stTRayFeederInputAdmin : ST_PMLa; stTRayFeederInputAdmin : ST_PMLa;

View File

@@ -24,7 +24,7 @@ TYPE E_PackMLState :
RESETTING := 15, RESETTING := 15,
COMPLETING := 16, COMPLETING := 16,
COMPLETED := 17 COMPLETED := 17
) DINT := STOPPED; ) DINT := ABORTED;
END_TYPE END_TYPE
]]></Declaration> ]]></Declaration>
</DUT> </DUT>

View File

@@ -285,7 +285,7 @@ END_VAR
]]></Declaration> ]]></Declaration>
<Implementation> <Implementation>
<ST><![CDATA[IF stStatus.eStateCurrent = E_PackMLState.IDLE THEN <ST><![CDATA[IF stStatus.eStateCurrent = E_PackMLState.IDLE THEN
_eCmd := E_PackMLCmd.RESET; _eCmd := E_PackMLCmd.START;
M_Start := TRUE; M_Start := TRUE;
ELSE ELSE
M_Start := FALSE; M_Start := FALSE;

View File

@@ -33,9 +33,27 @@
<Compile Include="00_Main\ST_TrayFeederCamPosData.TcDUT"> <Compile Include="00_Main\ST_TrayFeederCamPosData.TcDUT">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="01_Stationen\Aligner\FB_Aligner.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Etcher\FB_Etcher.TcPOU"> <Compile Include="01_Stationen\Etcher\FB_Etcher.TcPOU">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="01_Stationen\Etcher\Mecademics\DUTs\ST_Etcher_HMIInterface.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Etcher\Mecademics\DUTs\ST_Meca_JointSet.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Etcher\Mecademics\DUTs\ST_Meca_MotionStatus.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Etcher\Mecademics\DUTs\ST_Meca_RobotStatus.TcDUT">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\Etcher\Mecademics\FB_Mecademics.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\FB_CoolPlate.TcPOU"> <Compile Include="01_Stationen\HeatCoolPlates\FB_CoolPlate.TcPOU">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
@@ -45,6 +63,9 @@
<Compile Include="01_Stationen\HeatCoolPlates\FB_HotPlate.TcPOU"> <Compile Include="01_Stationen\HeatCoolPlates\FB_HotPlate.TcPOU">
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Compile Include="01_Stationen\HeatCoolPlates\FB_PWM.TcPOU">
<SubType>Code</SubType>
</Compile>
<Compile Include="01_Stationen\HeatCoolPlates\GVL_HeatCoolConfig.TcGVL"> <Compile Include="01_Stationen\HeatCoolPlates\GVL_HeatCoolConfig.TcGVL">
<SubType>Code</SubType> <SubType>Code</SubType>
<LinkAlways>true</LinkAlways> <LinkAlways>true</LinkAlways>
@@ -179,12 +200,15 @@
</Compile> </Compile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="01_Stationen\Etcher\Mecademics" />
<Folder Include="01_Stationen\Etcher\Mecademics\DUTs" />
<Folder Include="01_Stationen\Kuka_Robot" /> <Folder Include="01_Stationen\Kuka_Robot" />
<Folder Include="01_Stationen\Kuka_Robot\InterfaceStructs" /> <Folder Include="01_Stationen\Kuka_Robot\InterfaceStructs" />
<Folder Include="01_Stationen\Kuka_Robot\InterfaceUnions" /> <Folder Include="01_Stationen\Kuka_Robot\InterfaceUnions" />
<Folder Include="01_Stationen\HVTester" /> <Folder Include="01_Stationen\HVTester" />
<Folder Include="01_Stationen\Etcher" /> <Folder Include="01_Stationen\Etcher" />
<Folder Include="01_Stationen\HeatCoolPlates" /> <Folder Include="01_Stationen\HeatCoolPlates" />
<Folder Include="01_Stationen\Aligner" />
<Folder Include="01_Stationen\TrayFeeder" /> <Folder Include="01_Stationen\TrayFeeder" />
<Folder Include="01_Stationen" /> <Folder Include="01_Stationen" />
<Folder Include="00_Main" /> <Folder Include="00_Main" />

File diff suppressed because one or more lines are too long

View File

@@ -26305,42 +26305,42 @@ Bit 8 - 15 : reserved]]></Comment>
<SyncMan>001001000000010004000000010001000100001000010000</SyncMan> <SyncMan>001001000000010004000000010001000100001000010000</SyncMan>
<Fmmu>0000000000000000001000010100000002000000000000000000000000000000</Fmmu> <Fmmu>0000000000000000001000010100000002000000000000000000000000000000</Fmmu>
<Pdo Name="Channel 1" Index="#x1a00" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 1" Index="#x1a00" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture left opened" Index="#x6000" Sub="#x01"> <Entry Name="Clamping fixture unlock left retracted" Index="#x6000" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 2" Index="#x1a01" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 2" Index="#x1a01" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture left closed" Index="#x6010" Sub="#x01"> <Entry Name="Clamping fixture unlock left extended" Index="#x6010" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 3" Index="#x1a02" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 3" Index="#x1a02" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture right opened" Index="#x6020" Sub="#x01"> <Entry Name="Clamping fixture unlock right retracted" Index="#x6020" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 4" Index="#x1a03" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 4" Index="#x1a03" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture right closed" Index="#x6030" Sub="#x01"> <Entry Name="Clamping fixture unlock right extended" Index="#x6030" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 5" Index="#x1a04" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 5" Index="#x1a04" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture in front opened" Index="#x6040" Sub="#x01"> <Entry Name="Clamping fixture ejector front retracted" Index="#x6040" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 6" Index="#x1a05" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 6" Index="#x1a05" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture in front closed" Index="#x6050" Sub="#x01"> <Entry Name="Clamping fixture ejector front extended" Index="#x6050" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 7" Index="#x1a06" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 7" Index="#x1a06" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture back opened" Index="#x6060" Sub="#x01"> <Entry Name="Clamping fixture ejector back retracted" Index="#x6060" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 8" Index="#x1a07" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 8" Index="#x1a07" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture back closed" Index="#x6070" Sub="#x01"> <Entry Name="Clamping fixture ejector back extended" Index="#x6070" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
@@ -32104,42 +32104,42 @@ Bit 8 - 15 : reserved]]></Comment>
<SyncMan>001001000000010004000000010001000100001000010000</SyncMan> <SyncMan>001001000000010004000000010001000100001000010000</SyncMan>
<Fmmu>0000000000000000001000010100000002000000000000000000000000000000</Fmmu> <Fmmu>0000000000000000001000010100000002000000000000000000000000000000</Fmmu>
<Pdo Name="Channel 1" Index="#x1a00" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 1" Index="#x1a00" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture left opened" Index="#x6000" Sub="#x01"> <Entry Name="Clamping fixture unlock left retracted" Index="#x6000" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 2" Index="#x1a01" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 2" Index="#x1a01" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture left closed" Index="#x6010" Sub="#x01"> <Entry Name="Clamping fixture unlock left extended" Index="#x6010" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 3" Index="#x1a02" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 3" Index="#x1a02" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture right opened" Index="#x6020" Sub="#x01"> <Entry Name="Clamping fixture unlock right retracted" Index="#x6020" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 4" Index="#x1a03" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 4" Index="#x1a03" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture right closed" Index="#x6030" Sub="#x01"> <Entry Name="Clamping fixture unlock right extended" Index="#x6030" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 5" Index="#x1a04" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 5" Index="#x1a04" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture in front opened" Index="#x6040" Sub="#x01"> <Entry Name="Clamping fixture ejector front retracted" Index="#x6040" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 6" Index="#x1a05" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 6" Index="#x1a05" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture in front closed" Index="#x6050" Sub="#x01"> <Entry Name="Clamping fixture ejector front extended" Index="#x6050" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 7" Index="#x1a06" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 7" Index="#x1a06" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture back opened" Index="#x6060" Sub="#x01"> <Entry Name="Clamping fixture ejector back retracted" Index="#x6060" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
<Pdo Name="Channel 8" Index="#x1a07" Flags="#x0011" SyncMan="0"> <Pdo Name="Channel 8" Index="#x1a07" Flags="#x0011" SyncMan="0">
<Entry Name="Clamping fixture back closed" Index="#x6070" Sub="#x01"> <Entry Name="Clamping fixture ejector back extended" Index="#x6070" Sub="#x01">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
</Pdo> </Pdo>
@@ -32225,10 +32225,10 @@ Bit 8 - 15 : reserved]]></Comment>
<Entry Name="Channel 1" Index="#x7000" Sub="#x02" Flags="#x00001000"> <Entry Name="Channel 1" Index="#x7000" Sub="#x02" Flags="#x00001000">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
<Entry Name="Channel 2" Index="#x7000" Sub="#x03" Flags="#x00001000"> <Entry Name="Aligner enable vacuum" Index="#x7000" Sub="#x03" Flags="#x00001000">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
<Entry Name="Channel 3" Index="#x7000" Sub="#x04" Flags="#x00001000"> <Entry Name="Aligner disable vacuum" Index="#x7000" Sub="#x04" Flags="#x00001000">
<Type>BIT</Type> <Type>BIT</Type>
</Entry> </Entry>
<Entry Name="Channel 4" Index="#x7000" Sub="#x05" Flags="#x00001000"> <Entry Name="Channel 4" Index="#x7000" Sub="#x05" Flags="#x00001000">
@@ -34991,7 +34991,7 @@ Bit 8 - 15 : reserved]]></Comment>
<ModuleIdent>640</ModuleIdent> <ModuleIdent>640</ModuleIdent>
<Module Id="#x03090055" Type="Sync Inputs" Class=""> <Module Id="#x03090055" Type="Sync Inputs" Class="">
<Name>Module 1 (Sync Inputs)</Name> <Name>Module 1 (Sync Inputs)</Name>
<ImageId>564</ImageId> <ImageId>565</ImageId>
<ModuleData>c860000080020000000004000000000000000000000000000000000000000000</ModuleData> <ModuleData>c860000080020000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6657</PdoIndex> <PdoIndex>6657</PdoIndex>
</Module> </Module>
@@ -35020,7 +35020,7 @@ Bit 8 - 15 : reserved]]></Comment>
<ModuleIdent>519</ModuleIdent> <ModuleIdent>519</ModuleIdent>
<Module Id="#x0309000d" Type="Default IO" Class=""> <Module Id="#x0309000d" Type="Default IO" Class="">
<Name>Module 3 (Default IO)</Name> <Name>Module 3 (Default IO)</Name>
<ImageId>564</ImageId> <ImageId>565</ImageId>
<ModuleData>c860000004020000000004000000000000000000000000000000000000000000</ModuleData> <ModuleData>c860000004020000000004000000000000000000000000000000000000000000</ModuleData>
<PdoIndex>6676</PdoIndex> <PdoIndex>6676</PdoIndex>
<PdoIndex>5652</PdoIndex> <PdoIndex>5652</PdoIndex>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0"?> <?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"> <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" Disabled="true" DevType="121"> <Device Id="11" DevType="121">
<Name>__FILENAME__</Name> <Name>__FILENAME__</Name>
<AddressInfo> <AddressInfo>
<Pci> <Pci>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0"?> <?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="CDevEtherCATDef" SubType="111"> <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="CDevEtherCATDef" SubType="111">
<DataTypes> <DataTypes>
<DataType> <DataType>
<Name GUID="{18071995-0000-0000-0000-002000000007}" IecBaseType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..6] OF BIT</Name> <Name GUID="{18071995-0000-0000-0000-002000000007}" IecBaseType="true" BitType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..6] OF BIT</Name>
<BitSize>7</BitSize> <BitSize>7</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType> <BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType>
<ArrayInfo> <ArrayInfo>

View File

@@ -1,8 +1,8 @@
<?xml version="1.0"?> <?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="CDevEtherCATDef" SubType="111"> <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="CDevEtherCATDef" SubType="111">
<DataTypes> <DataTypes>
<DataType> <DataType>
<Name GUID="{18071995-0000-0000-0000-002000000007}" IecBaseType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..6] OF BIT</Name> <Name GUID="{18071995-0000-0000-0000-002000000007}" IecBaseType="true" BitType="true" AutoDeleteType="true" HideSubItems="true">ARRAY [0..6] OF BIT</Name>
<BitSize>7</BitSize> <BitSize>7</BitSize>
<BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType> <BaseType GUID="{18071995-0000-0000-0000-000000000010}">BIT</BaseType>
<ArrayInfo> <ArrayInfo>

View File

@@ -1449,7 +1449,7 @@ External Setpoint Generation:
<OtherSettings AllowMotionCmdToSlave="true"/> <OtherSettings AllowMotionCmdToSlave="true"/>
</AxisPara> </AxisPara>
<Encoder Name="Enc" EncType="8"> <Encoder Name="Enc" EncType="8">
<EncPara ScaleFactorNumerator="360" ScaleFactorDenominator="1048576" Offset="28.5" MaxCount="#xffffffff" ReferenceSystem="4"> <EncPara ScaleFactorNumerator="360" ScaleFactorDenominator="1048576" Offset="28.5" MaxCount="#xffffffff" ReferenceSystem="1">
<FilterTime TVelo="0.2"/> <FilterTime TVelo="0.2"/>
</EncPara> </EncPara>
<Vars VarGrpType="1"> <Vars VarGrpType="1">
@@ -1509,7 +1509,7 @@ External Setpoint Generation:
</Vars> </Vars>
</Encoder> </Encoder>
<Drive Name="Drive" DrvType="9"> <Drive Name="Drive" DrvType="9">
<DrvPara MaxCount="#xffffffff" DriveControlDWord="#x00000100"> <DrvPara MaxCount="#xffffffff" DriveControlDWord="#x00030100">
<Analog VeloReferenz="35031.3336914063" VeloScale="1.02400649589962" TorqueSetpointScale="10" ScaleFactorActTorque="0.1"/> <Analog VeloReferenz="35031.3336914063" VeloScale="1.02400649589962" TorqueSetpointScale="10" ScaleFactorActTorque="0.1"/>
<TimeComp TaskDelayCycles="1"/> <TimeComp TaskDelayCycles="1"/>
</DrvPara> </DrvPara>
@@ -1798,7 +1798,7 @@ External Setpoint Generation:
</Vars> </Vars>
</Encoder> </Encoder>
<Drive Name="Drive" DrvType="9"> <Drive Name="Drive" DrvType="9">
<DrvPara MaxCount="#xffffffff" DriveControlDWord="#x00000100"> <DrvPara MaxCount="#xffffffff" DriveControlDWord="#x00030100">
<Analog VeloReferenz="35031.3336914063" VeloScale="1.02400649589962" TorqueSetpointScale="10" ScaleFactorActTorque="0.1"/> <Analog VeloReferenz="35031.3336914063" VeloScale="1.02400649589962" TorqueSetpointScale="10" ScaleFactorActTorque="0.1"/>
<TimeComp TaskDelayCycles="1"/> <TimeComp TaskDelayCycles="1"/>
</DrvPara> </DrvPara>
@@ -2018,16 +2018,16 @@ External Setpoint Generation:
</Var> </Var>
</Vars> </Vars>
</Axis> </Axis>
<Axis Id="5" CreateSymbols="true" AxisType="1" SimulationMode="true"> <Axis Id="5" CreateSymbols="true" AxisType="1">
<Name>AlignerXAxis</Name> <Name>AlignerXAxis</Name>
<AxisPara> <AxisPara>
<Dynamic Acceleration="15" Deceleration="15" Jerk="45"/> <Dynamic AccelerationMaximum="2000" DecelerationMaximum="2000" Acceleration="2" Deceleration="2" Jerk="2"/>
<Velo RefSearch="5" RefSync="0.5" SlowManual="1" FastManual="5" Fast="12.834" Maximum="10"/> <Velo RefSearch="1.5" RefSync="0.5" SlowManual="1" FastManual="5" Fast="12.834" Maximum="5"/>
<OtherSettings AllowMotionCmdToSlave="true"/> <OtherSettings AllowMotionCmdToSlave="true"/>
</AxisPara> </AxisPara>
<Encoder Name="Enc" EncType="4"> <Encoder Name="Enc" EncType="4">
<EncPara ScaleFactorNumerator="1" ScaleFactorDenominator="12800" MaxCount="#xffffffff"> <EncPara ScaleFactorNumerator="1" ScaleFactorDenominator="12800" MaxCount="#xffffffff">
<Inc RefSearchInverse="true" RefSyncInverse="false" RefPosition="-14.2" RefMode="1" RefSoftSyncMask="#x0000ffff" HomingSensorSource="2"/> <Inc RefSearchInverse="true" RefSyncInverse="false" RefPosition="-34.47" RefMode="1" RefSoftSyncMask="#x0000ffff" HomingSensorSource="2"/>
</EncPara> </EncPara>
<Vars VarGrpType="1"> <Vars VarGrpType="1">
<Name>Inputs</Name> <Name>Inputs</Name>
@@ -2177,16 +2177,16 @@ External Setpoint Generation:
</Var> </Var>
</Vars> </Vars>
</Axis> </Axis>
<Axis Id="6" CreateSymbols="true" AxisType="1" SimulationMode="true"> <Axis Id="6" CreateSymbols="true" AxisType="1">
<Name>AlignerYAxis</Name> <Name>AlignerYAxis</Name>
<AxisPara> <AxisPara>
<Dynamic Acceleration="15" Deceleration="15" Jerk="45"/> <Dynamic AccelerationMaximum="2000" DecelerationMaximum="2000" Acceleration="1.99999914163127" Deceleration="1.99999914163127" Jerk="22.4999806867077"/>
<Velo RefSearch="5" RefSync="0.5" SlowManual="1" FastManual="5" Fast="12.834" Maximum="10"/> <Velo RefSearch="1.5" RefSync="0.5" SlowManual="1" FastManual="5" Fast="12.834" Maximum="5"/>
<OtherSettings AllowMotionCmdToSlave="true"/> <OtherSettings AllowMotionCmdToSlave="true"/>
</AxisPara> </AxisPara>
<Encoder Name="Enc" EncType="4"> <Encoder Name="Enc" EncType="4">
<EncPara ScaleFactorNumerator="1" ScaleFactorDenominator="12800" MaxCount="#xffffffff"> <EncPara ScaleFactorNumerator="1" ScaleFactorDenominator="12800" MaxCount="#xffffffff">
<Inc RefSearchInverse="true" RefSyncInverse="false" RefPosition="-34.46" RefMode="1" RefSoftSyncMask="#x0000ffff" HomingSensorSource="2"/> <Inc RefSearchInverse="true" RefSyncInverse="false" RefPosition="-11.67" RefMode="1" RefSoftSyncMask="#x0000ffff" HomingSensorSource="2"/>
</EncPara> </EncPara>
<Vars VarGrpType="1"> <Vars VarGrpType="1">
<Name>Inputs</Name> <Name>Inputs</Name>
@@ -2339,7 +2339,7 @@ External Setpoint Generation:
</NC> </NC>
<Mappings> <Mappings>
<OwnerA Name="Axes^AlignerXAxis"> <OwnerA Name="Axes^AlignerXAxis">
<OwnerB Name="TIID^Device 1 (EtherCAT)^K12_KL01 (EK1100)^K12_KL07 (EL7037)"> <OwnerB Name="TIID^Device 1 (EtherCAT)^K12_KL01 (EK1100)^K12_KL08 (EL7037)">
<Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Error" Size="1" OffsA="3"/> <Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Error" Size="1" OffsA="3"/>
<Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Motor stall" Size="1" OffsA="7"/> <Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Motor stall" Size="1" OffsA="7"/>
<Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Moving negative" Size="1" OffsA="5"/> <Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Moving negative" Size="1" OffsA="5"/>
@@ -2383,7 +2383,7 @@ External Setpoint Generation:
</OwnerB> </OwnerB>
</OwnerA> </OwnerA>
<OwnerA Name="Axes^AlignerYAxis"> <OwnerA Name="Axes^AlignerYAxis">
<OwnerB Name="TIID^Device 1 (EtherCAT)^K12_KL01 (EK1100)^K12_KL08 (EL7037)"> <OwnerB Name="TIID^Device 1 (EtherCAT)^K12_KL01 (EK1100)^K12_KL07 (EL7037)">
<Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Error" Size="1" OffsA="3"/> <Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Error" Size="1" OffsA="3"/>
<Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Motor stall" Size="1" OffsA="7"/> <Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Motor stall" Size="1" OffsA="7"/>
<Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Moving negative" Size="1" OffsA="5"/> <Link VarA="Drive^Inputs^In^nState1" VarB="STM Status^Status^Moving negative" Size="1" OffsA="5"/>

View File

@@ -11,6 +11,14 @@
</OwnerB> </OwnerB>
</OwnerA> </OwnerA>
</UnrestoredVarLinks> </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"/>
</OwnerB>
</OwnerA>
</UnrestoredVarLinks>
<Contexts> <Contexts>
<Context> <Context>
<Id>0</Id> <Id>0</Id>
@@ -28,12 +36,20 @@
</Instance> </Instance>
<Mappings> <Mappings>
<OwnerA> <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"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^Box 44 (EX260-SEC1)"> <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._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._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._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._xOpenDoor2" VarB="Byte 0^Output[0]" Size="1"/>
</OwnerB> </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"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^HP (EK1100)^Term 47 (EL2004)"> <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>
@@ -97,39 +113,64 @@
<OwnerB Name="TIID^Device 1 (EtherCAT)^K01_KL01 (EK1100)^K01_KL02 (EL1018)"> <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>
<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"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K20_A1 (EP1018-0001)"> <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._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.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._fbValveDoor.xOpenFeedback" VarB="Channel 2^ShutterOpened" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._xVacuumOk" VarB="Channel 1^ChuckVacuumOn" Size="1"/>
</OwnerB> </OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_A2 (EP1018-0001)"> <OwnerB Name="TIID^Device 1 (EtherCAT)^K20_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._fbEjectBack.xCloseFeedback" VarB="Channel 7^Clamping fixture ejector back retracted" 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._fbEjectBack.xOpenFeedback" VarB="Channel 8^Clamping fixture ejector back extended" 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._fbEjectFront.xCloseFeedback" VarB="Channel 5^Clamping fixture ejector front retracted" 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._fbEjectFront.xOpenFeedback" VarB="Channel 6^Clamping fixture ejector front extended" 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._fbUnlockLeft.xCloseFeedback" VarB="Channel 1^Clamping fixture unlock left retracted" 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._fbUnlockLeft.xOpenFeedback" VarB="Channel 2^Clamping fixture unlock left extended" 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._fbUnlockRight.xCloseFeedback" VarB="Channel 3^Clamping fixture unlock right retracted" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbClampingRight.xOpenFeedback" VarB="Channel 3^Clamping fixture right opened" Size="1"/> <Link VarA="PlcTask Inputs^PRG_Main._fbEtcher1._fbUnlockRight.xOpenFeedback" VarB="Channel 4^Clamping fixture unlock right extended" Size="1"/>
</OwnerB> </OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_QM01 (EX260-SEC1)"> <OwnerB Name="TIID^Device 1 (EtherCAT)^K20_QM01 (EX260-SEC1)">
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbEjectBack.xCloseValve" VarB="Byte 0^Output[7]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbEjectBack.xOpenValve" VarB="Byte 0^Output[6]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbEjectFront.xCloseValve" VarB="Byte 0^Output[5]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbEjectFront.xOpenValve" VarB="Byte 0^Output[4]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbUnlockLeft.xCloseValve" VarB="Byte 1^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbUnlockLeft.xOpenValve" VarB="Byte 1^Output[0]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher1._fbUnlockRight.xCloseValve" VarB="Byte 1^Output[3]" Size="1"/>
<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.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._fbValveDoor.xOpenValve" VarB="Byte 0^Output[0]" 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"/>
</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"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbEjectBack.xOpenFeedback" VarB="Channel 8^Clamping fixture ejector back extended" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbEjectFront.xCloseFeedback" VarB="Channel 5^Clamping fixture ejector front retracted" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbEjectFront.xOpenFeedback" VarB="Channel 6^Clamping fixture ejector front extended" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbUnlockLeft.xCloseFeedback" VarB="Channel 1^Clamping fixture unlock left retracted" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbUnlockLeft.xOpenFeedback" VarB="Channel 2^Clamping fixture unlock left extended" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbUnlockRight.xCloseFeedback" VarB="Channel 3^Clamping fixture unlock right retracted" Size="1"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbEtcher2._fbUnlockRight.xOpenFeedback" VarB="Channel 4^Clamping fixture unlock right extended" Size="1"/>
</OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^K21_QM01 (EX260-SEC1)">
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbEjectBack.xCloseValve" VarB="Byte 0^Output[7]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbEjectBack.xOpenValve" VarB="Byte 0^Output[6]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbEjectFront.xCloseValve" VarB="Byte 0^Output[5]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbEjectFront.xOpenValve" VarB="Byte 0^Output[4]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbUnlockLeft.xCloseValve" VarB="Byte 1^Output[1]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbUnlockLeft.xOpenValve" VarB="Byte 1^Output[0]" Size="1"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbEtcher2._fbUnlockRight.xCloseValve" VarB="Byte 1^Output[3]" Size="1"/>
<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"/>
</OwnerB> </OwnerB>
<OwnerB Name="TIID^Device 1 (EtherCAT)^PC_K01_KL01 (EK1100)^PC_K01_KL02 (EL1918)"> <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 Inputs^PRG_Safety._xComStartup" VarB="StandardInputs^Standard Out Var 12" Size="1"/>
@@ -145,7 +186,7 @@
<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._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._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._dwErrorBits" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 1 (Errorbits)"/>
<Link VarA="PlcTask Inputs^PRG_Main._fbRobot._dwJobForPLC" VarB="Module 3 (Default IO)^Std. In (64 Bytes)^Input DWORD 3 (JobForPLC)"/> <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 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._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._diOffsetPosX" VarB="Module 3 (Default IO)^Std. Out (64 Bytes)^Output DWORD 3 (Offset X)"/>
@@ -158,6 +199,14 @@
<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 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 Outputs^PRG_Main._xTriggerCamera" VarB="API^Term 10 (Control)^Subterm 12 (Control)^Outputs^Control Register[0]^Trigger" Size="1"/>
</OwnerB> </OwnerB>
<OwnerB Name="TINC^NC-Task 1 SAF^Axes^AlignerXAxis">
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner._fbXAxis._fbAxis.NcToPlc" VarB="Outputs^ToPlc"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbAligner._fbXAxis._fbAxis.PlcToNc" VarB="Inputs^FromPlc"/>
</OwnerB>
<OwnerB Name="TINC^NC-Task 1 SAF^Axes^AlignerYAxis">
<Link VarA="PlcTask Inputs^PRG_Main._fbAligner._fbYAxis._fbAxis.NcToPlc" VarB="Outputs^ToPlc"/>
<Link VarA="PlcTask Outputs^PRG_Main._fbAligner._fbYAxis._fbAxis.PlcToNc" VarB="Inputs^FromPlc"/>
</OwnerB>
</OwnerA> </OwnerA>
</Mappings> </Mappings>
</TcSmItem> </TcSmItem>