_stRobotStatus, stAdmin => _stRobotAdmin, stPackMLHMIInterface := GVL_SCADA.stMachine.stKukaRobot); IF _stRobotCmd.xCmdChangeRequest THEN _stRobotCmd.xCmdChangeRequest := FALSE; END_IF _fbHVTester(xOpenChambers:= GVL_SCADA.xOpenAllChambers, stPackMLHMIInterface := GVL_SCADA.stMachine.stHVTester); _fbEtcher1( xOpenDoor:= GVL_SCADA.xOpenAllChambers, xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher1, xReleaseAlarms := _xReleaseAlarms, xConfirmAlarms := GVL_SCADA.xErrAck, stPackMLHMIInterface := GVL_SCADA.stMachine.stEtcher1); _fbEtcher2( xOpenDoor:= GVL_SCADA.xOpenAllChambers, xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher2, 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, stPackMLHMIInterface := GVL_SCADA.stMachine.stTrayFeeder); _fbHeatCoolPlates( stHMIInterface := GVL_SCADA.stHCPlatesHMIInterface, xReleaseAlarms := _xReleaseAlarms, xConfirmAlarms:= GVL_SCADA.xErrAck); _fbAligner(stCommand:= , stStatus=> , stAdmin=> , xConfirmAlarms:= GVL_SCADA.xErrAck, stPackMLHMIInterface := GVL_SCADA.stMachine.stAligner); // Call safety program PRG_Safety( xConfirmAlarms := GVL_SCADA.xErrAck, 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 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 // Wait for part in aligner 10: IF (_stRobotStatus.eStateCurrent = E_PackMLState.IDLE) THEN _fbAligner.M_Start(); _iState := 20; END_IF // Job aborted // 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 // 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 ; END_CASE // ===== // DEBUG // ===== _tofTriggerTime(IN := _xStartTrigger, PT := T#1S); IF _xStartTrigger THEN _xStartTrigger := FALSE; END_IF xTriggerCamera := _tofTriggerTime.Q; // Reset alarm reset request GVL_SCADA.xErrAck := FALSE; IF _xConfirmAlarms THEN _xConfirmAlarms := FALSE; END_IF]]>