Some improvements and fixes

- Added robot schift params for aligning etcher 1 position
- Added HMI Interface to robot fb
- Added machine LED's at main cabinet
- Aligner now works in auto mode
- Added HMI interface to etcher station
- Added cReleaseAlarms to HeatCoolPlates
- Added HMI interface to HVTester
- STarted tray feeder response parsing
- Fixed some packml base state machine bugs
This commit is contained in:
2026-02-15 10:04:59 +01:00
parent d6a4fc6e42
commit 0c40092d8f
26 changed files with 1259 additions and 190 deletions

View File

@@ -7,10 +7,12 @@ VAR
_fbHVTester : FB_HVTester;
_fbEtcher1 : FB_Etcher;
_fbEtcher2 : FB_Etcher;
_fbTrayFeederInput : FB_TrayFeeder(sIPAddr := '192.168.0.41', udiPort := 1337);
_fbTrayFeederInput : FB_TrayFeeder(sIPAddr := '192.168.1.10', udiPort := 5000);
_fbHeatCoolPlates : FB_HeatCoolPlates;
_fbAligner : FB_Aligner;
_xReleaseAlarms : BOOL;
_xConfirmAlarms : BOOL;
_stRobotCmd : ST_PMLc;
@@ -43,7 +45,10 @@ VAR
END_VAR
]]></Declaration>
<Implementation>
<ST><![CDATA[IF _xClear THEN
<ST><![CDATA[// Data from safety
_xReleaseAlarms := PRG_Safety.xEStopOk;
IF _xClear THEN
_xClear := FALSE;
_fbRobot.M_Clear();
END_IF
@@ -86,40 +91,46 @@ _fbRobot(
stCommand:= _stRobotCmd,
stJobParams := _stRobotJobParams,
stUnitFeedbacks := _stUnitFeedbacks,
xReleaseAlarms:= TRUE,
xReleaseAlarms:= _xReleaseAlarms,
xConfirmAlarms:= GVL_SCADA.xErrAck,
stStatus => _stRobotStatus,
stAdmin => _stRobotAdmin,
xReady=> ,
xError=> );
stPackMLHMIInterface := GVL_SCADA.stMachine.stKukaRobot);
IF _stRobotCmd.xCmdChangeRequest THEN
_stRobotCmd.xCmdChangeRequest := FALSE;
END_IF
_fbHVTester(xOpenChambers:= GVL_SCADA.xOpenAllChambers);
_fbHVTester(xOpenChambers:= GVL_SCADA.xOpenAllChambers, stPackMLHMIInterface := GVL_SCADA.stMachine.stHVTester);
_fbEtcher1(
xOpenDoor:= GVL_SCADA.xOpenAllChambers,
xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher1,
xConfirmAlarms := GVL_SCADA.xErrAck);
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms := GVL_SCADA.xErrAck,
stPackMLHMIInterface := GVL_SCADA.stMachine.stEtcher1);
_fbEtcher2(
xOpenDoor:= GVL_SCADA.xOpenAllChambers,
xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher2,
xConfirmAlarms := GVL_SCADA.xErrAck);
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms := GVL_SCADA.xErrAck,
stPackMLHMIInterface := GVL_SCADA.stMachine.stEtcher2);
_fbTrayFeederInput(
stCommand:= ,
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms := GVL_SCADA.xErrAck,
stStatus=> GVL_SCADA.stTrayFeederInputState,
stAdmin=> GVL_SCADA.stTRayFeederInputAdmin);
stAdmin=> GVL_SCADA.stTRayFeederInputAdmin,
stPackMLHMIInterface := GVL_SCADA.stMachine.stTrayFeeder);
_fbHeatCoolPlates(
stHMIInterface := GVL_SCADA.stHCPlatesHMIInterface,
xReleaseAlarms := _xReleaseAlarms,
xConfirmAlarms:= GVL_SCADA.xErrAck);
_fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.xErrAck);
_fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.xErrAck, stPackMLHMIInterface := GVL_SCADA.stMachine.stAligner);
// Call safety program
@@ -136,48 +147,72 @@ CASE _iState OF
IF _xStartCycle THEN
_xStartCycle := FALSE;
// Only start with robot in idle
// Only start with robot in idle then put into aligner
IF _stRobotStatus.eStateCurrent = E_PackMLState.IDLE THEN
_stRobotJobParams.eJob := E_KukaRobot_JobNumberRobot.PUT_INTO_ALIGNER;
_fbRobot.M_Start();
_iState := 10;
END_IF
END_IF
// Grab from position 1
// Wait for part in aligner
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;
_fbAligner.M_Start();
_iState := 20;
END_IF
// Job aborted
IF (_stRobotStatus.eStateCurrent = E_PackMLState.ABORTED) OR (_stRobotStatus.eStateCurrent = E_PackMLState.STOPPED) THEN
_iState := 900;
// IF (_stRobotStatus.eStateCurrent = E_PackMLState.ABORTED) OR (_stRobotStatus.eStateCurrent = E_PackMLState.STOPPED) THEN
// _iState := 900;
// END_IF
// Wait for aligner to be done then get it with the robot
20:
IF (_fbAligner.stStatus.eStateCurrent = E_PackMLState.COMPLETED) THEN
_stRobotJobParams.eJob := E_KukaRobot_JobNumberRobot.GET_FROM_ALIGNER;
_fbRobot.M_Start();
_iState := 40;
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
// Get from aligner done, reset aligner
40:
;
IF (_stRobotStatus.eStateCurrent = E_PackMLState.IDLE) THEN
_fbAligner.M_Reset();
_iState := 45;
END_IF
45: // Wait for start to put into etcher
IF _xStartCycle THEN
_xStartCycle := FALSE;
_stRobotJobParams.eJob := E_KukaRobot_JobNumberRobot.PUT_INTO_ETCHER1;
_fbRobot.M_Start();
_iState := 50;
END_IF
// Wait for robot to be done
50:
IF (_stRobotStatus.eStateCurrent = E_PackMLState.IDLE) THEN
_iState := 60;
END_IF
// Wait for start then get it from the etcher
60:
IF _xStartCycle THEN
_xStartCycle := FALSE;
_stRobotJobParams.eJob := E_KukaRobot_JobNumberRobot.GET_FROM_ETCHER1;
_fbRobot.M_Start();
_iState := 70;
END_IF
// Done with getting it from the etcher
70:
IF (_stRobotStatus.eStateCurrent = E_PackMLState.IDLE) THEN
_stRobotJobParams.eJob := E_KukaRobot_JobNumberRobot.PUT_INTO_ALIGNER;
_fbRobot.M_Start();
_iState := 10;
END_IF
ELSE
// Nothing to do here
@@ -188,6 +223,8 @@ END_CASE
// DEBUG
// =====
_tofTriggerTime(IN := _xStartTrigger, PT := T#1S);
IF _xStartTrigger THEN
_xStartTrigger := FALSE;