_stRobotStatus, stAdmin => _stRobotAdmin, stHMIInterface := GVL_SCADA.stMachine.stKukaRobot); IF _stRobotCmd.xCmdChangeRequest THEN _stRobotCmd.xCmdChangeRequest := FALSE; END_IF _fbHVTesterHot( xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, xOpenChambers:= GVL_SCADA.xOpenAllChambers, stIO := GVL_IO.stHVTesterWarm, stHMIInterface := GVL_SCADA.stMachine.stHVTesterHot); _fbHVTesterCold( xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, xOpenChambers:= GVL_SCADA.xOpenAllChambers, stIO := GVL_IO.stHVTesterCold, stHMIInterface := GVL_SCADA.stMachine.stHVTesterCold); _fbEtcher1( xOpenDoor:= GVL_SCADA.xOpenAllChambers, xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher1, xReleaseAlarms := _xReleaseAlarms, xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, stIO := GVL_IO.stEtcher1, stHMIInterface := GVL_SCADA.stMachine.stEtcher1); _fbEtcher2( xOpenDoor:= GVL_SCADA.xOpenAllChambers, xOpenChuckClamp := GVL_SCADA.xOpenChuckClampEtcher2, xReleaseAlarms := _xReleaseAlarms, xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, stIO := GVL_IO.stEtcher2, stHMIInterface := GVL_SCADA.stMachine.stEtcher2); _fbTrayFeederInput( stCommand:= , xReleaseAlarms := _xReleaseAlarms, xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, stHMIInterface := GVL_SCADA.stMachine.stTrayFeederIn); _fbTrayFeederOutput( xReleaseAlarms := _xReleaseAlarms, xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, stHMIInterface := GVL_SCADA.stMachine.stTrayFeederOut); // _fbTrayFeederOut( // stCommand:= , // xReleaseAlarms := _xReleaseAlarms, // xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, // stStatus=> GVL_SCADA.stTrayFeederInputState, // stAdmin=> GVL_SCADA.stTRayFeederInputAdmin, // stHMIInterface := GVL_SCADA.stMachine.stTrayFeederOut); _fbHotplate( stIO := GVL_IO.stHotplate, stHMIInterface := GVL_SCADA.stMachine.stHotplate); _fbCoolplate( stIO := GVL_IO.stCoolplate, stHMIInterface := GVL_SCADA.stMachine.stCoolplate); _fbAligner( xConfirmAlarms:= GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, stIO := GVL_IO.stAligner, stHMIInterface := GVL_SCADA.stMachine.stAligner); _fbMediaCabinet( xReleaseErrors := _xReleaseAlarms, xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, stIO := GVL_IO.stMediaCabinet, stHMIInterface := GVL_SCADA.stMachine.stMediaCabinet); _fbNOK( stIO:= GVL_IO.stNOK, stHMIInterface:= GVL_SCADA.stMachine.stNOK); // Call safety program PRG_Safety( xConfirmAlarms := GVL_SCADA.stMachine.stConfirmAlarmsBtn.xRequest, xRobotStopped := (_stRobotStatus.eStateCurrent <> E_PackMLState.EXECUTE)); // Handle robot cmds M_HandleRobotCmd(); // DEBUG //_fbModbusMaster(); // IF _xReadFullScale THEN // _xReadFullScale := FALSE; // // _fbFlowSensor( // byBaseAddr:= , // xReleaseAlarms:= , // xConfirmAlarms:= , // fbMBMaster:= , // rCurrFlowrate=> , // xBusy=> , // xDone=> , // xError=> ); // END_IF // 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_CmdStart(); _iState := 10; END_IF END_IF // Wait for part in aligner 10: IF (_stRobotStatus.eStateCurrent = E_PackMLState.IDLE) THEN _fbAligner.M_CmdStart(); _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_CmdStart(); _iState := 40; END_IF // Get from aligner done, reset aligner 40: IF (_stRobotStatus.eStateCurrent = E_PackMLState.IDLE) THEN _fbAligner.M_CmdReset(); _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_CmdStart(); _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_CmdStart(); _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_CmdStart(); _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.stMachine.stConfirmAlarmsBtn.xRequest := FALSE;]]>