DisableMode THEN CMD[i] := InitCMD; END_IF END_CASE END_FOR step := step +1; 22: FOR i:= FirstStation TO LastStation DO CASE StationsStatus[i].StationType OF noStationType, TypeRobot, TypeGeneral, TypeMedia: ; ELSE IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN RETURN; END_IF END_CASE END_FOR step := 30; 30: step := 100; 100: INIT := TRUE; Step := 0; END_CASE*) CASE _Step OF 0: IF NOT MEDIA_MAIN.IO.bInCDAOk THEN iStationStatus.Error := TRUE; iStationStatus.StepRetry := 0; iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eCDA,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE); RETURN; END_IF (*IF NOT MEDIA_MAIN.IO.bInVacOk THEN iStationStatus.Error := TRUE; iStationStatus.ErrorIndex := AlarmSend(iStation,MsgId := MAIN_ErrorNr.eVacuum,TRUE, eReportType.Error, sAvailableResponse.RetryCancel, FALSE); RETURN; END_IF*) _Step := 10; 10: IF NOT StationsStatus[RobotStation].Ist.Busy THEN CMD[RobotStation] := InitCMD; _Step := _Step +1; END_IF 11: IF StationsStatus[RobotStation].Ist.InitDone THEN _Step := 20; END_IF 20: FOR i:= FirstStation TO LastStation DO CASE StationsStatus[i].StationType OF noStationType, TypeRobot, TypeGeneral: ; ELSE IF OperationMode[i] = DisableMode THEN CONTINUE; END_IF StationsStatus[i].Soll.Stop := TRUE; END_CASE END_FOR _Step := _Step +1; 21: FOR i:= FirstStation TO LastStation DO CASE StationsStatus[i].StationType OF noStationType, TypeRobot, TypeGeneral: ; ELSE IF OperationMode[i] = DisableMode THEN CONTINUE; END_IF IF StationsStatus[i].Soll.Stop OR StationsStatus[i].Ist.Busy THEN RETURN; END_IF END_CASE END_FOR _Step := _Step +1; 22: DelayTimer(IN := TRUE, PT := T#1S); IF DelayTimer.Q THEN DelayTimer(IN := FALSE); _Step := _Step +1; END_IF 23: FOR i:= FirstStation TO LastStation DO CASE StationsStatus[i].StationType OF noStationType, TypeRobot, TypeGeneral: ; ELSE IF NOT StationsStatus[i].Ist.InitDone AND OperationMode[i] <> DisableMode THEN CMD[i] := InitCMD; END_IF END_CASE END_FOR _Step := _Step +1; 24: FOR i:= FirstStation TO LastStation DO CASE StationsStatus[i].StationType OF noStationType, TypeRobot, TypeGeneral, TypeMedia: ; ELSE IF CMD[i] = InitCMD THEN RETURN; END_IF END_CASE END_FOR _Step := 30; 30: _Step := 100; 100: bInitialization := FALSE; INIT := TRUE; _Step := 0; END_CASE]]> StartCMD; iMediaArray[eMainMedienNamen.Empty].Invisible := iCMD <> StartCMD; WaferInSystem := FALSE; FOR i := FirstSpinner TO RobotStation DO IF StationsStatus[i].WaferInfo[0].Number > 0 THEN WaferInSystem := TRUE; END_IF END_FOR IF StationsStatus[RobotStation].WaferInfo[1].Number > 0 THEN WaferInSystem := TRUE; END_IF CASE PaddleMode OF ePaddleMode.All: TimeBetweenProcesses := 10; ePaddleMode.LowerPaddle, ePaddleMode.UpperPaddle: TimeBetweenProcesses := 20; END_CASE SubstrateOnRetry := FALSE; FOR i := FirstLelaxStation TO LastRelaxStation DO IF StationsStatus[i].WaferInfo[0].Number > 0 THEN SubstrateOnRetry := TRUE; END_IF END_FOR ]]> 0 THEN _Step := 10; ELSE FOR i := FirstCassette TO LastCassette DO IF StationsStatus[i].Ist.Busy THEN RETURN; END_IF END_FOR _Step := 90; END_IF 10: IF bPause THEN RETURN; END_IF IF RobotJob.NumberOfjob = 0 OR ChuckChangeBusy THEN _Step := 0; RETURN; END_IF IF StationsStatus[RobotStation].Ist.Busy THEN _Step := 0; RETURN; END_IF FOR i := 0 TO MIN(20, RobotJob.NumberOfjob) DO IF IsTargetReady(RobotJob.Job[i]) THEN CassetteNumber := RobotJob.Job[i].CassetteNumber; ROBOT_MAIN.TargetSlot := RobotJob.Job[i].WaferNumber; CASE CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].WaferStatus OF WaferForProccess: IF SubstrateOnRetry THEN CONTINUE; END_IF END_CASE _Step := 20; RETURN; END_IF END_FOR 20: CASE CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].WaferStatus OF WaferForProccess: ROBOT_MAIN.TargetStation := CassetteNumber; //ROBOT_MAIN.Size := CASSETTE_MAIN[CassetteNumber].Signal.Wafer[ROBOT_MAIN.TargetSlot].Size; _Step := _Step +1; ELSE FOR i := FirstStation TO LastStation DO IF StationsStatus[i].WaferInfo[0].CassetteNumber = CassetteNumber AND StationsStatus[i].WaferInfo[0].Number = ROBOT_MAIN.TargetSlot THEN ROBOT_MAIN.TargetStation := i; _Step := _Step +1; RETURN; END_IF END_FOR END_CASE 21: IF NOT RobotStatus.Ist.Busy THEN CASE PaddleMode OF ePaddleMode.All, ePaddleMode.UpperPaddle: ROBOT_MAIN.TargetPuddle := 0; ePaddleMode.LowerPaddle: ROBOT_MAIN.TargetPuddle := 1; END_CASE CMD[RobotStation] := GetCMD; _Step := _Step +1; END_IF 22: IF RobotStatus.Ist.Busy THEN _Step := _Step +1; END_IF 23: IF NOT RobotStatus.Ist.Busy THEN IF RobotStatus.WaferInfo[0].Number > 0 OR RobotStatus.WaferInfo[1].Number > 0 THEN _Step := 30; ELSE _Step := 0; END_IF END_IF 30: IF StationsStatus[RobotStation].WaferInfo[0].Number > 0 THEN NextProcess := StationsStatus[RobotStation].WaferInfo[0].FlowStepNumber +1; ELSIF StationsStatus[RobotStation].WaferInfo[1].Number > 0 THEN NextProcess := StationsStatus[RobotStation].WaferInfo[1].FlowStepNumber +1; ELSE RETURN; END_IF IF CASSETTE_PROCESS[CassetteNumber][ROBOT_MAIN.TargetSlot][NextProcess].TargetStation = 0 THEN ROBOT_MAIN.TargetStation := CassetteNumber; ELSE ROBOT_MAIN.TargetStation := CASSETTE_PROCESS[CassetteNumber][ROBOT_MAIN.TargetSlot][NextProcess].TargetStation; END_IF IF StationsStatus[ROBOT_MAIN.TargetStation].WaferInfo[0].Number = 0 THEN _Step := 50; ELSE _Step := 40; END_IF 40: IF RobotStatus.Ist.Busy THEN RETURN; END_IF CMD[RobotStation] := ChangeCMD; _Step := _Step +1; 41: IF RobotStatus.Ist.Busy THEN RETURN; END_IF IF RobotStatus.WaferInfo[0].Number > 0 THEN CassetteNumber := RobotStatus.WaferInfo[0].CassetteNumber; ROBOT_MAIN.TargetSlot := RobotStatus.WaferInfo[0].Number; ELSIF RobotStatus.WaferInfo[1].Number > 0 THEN CassetteNumber := RobotStatus.WaferInfo[1].CassetteNumber; ROBOT_MAIN.TargetSlot := RobotStatus.WaferInfo[1].Number; ELSE _Step := 0; RETURN; END_IF _Step := _Step +1; 42: _Step := 30; 50: IF StationsStatus[RobotStation].WaferInfo[0].Number > 0 AND StationsStatus[RobotStation].WaferInfo[1].Number = 0 THEN ROBOT_MAIN.TargetPuddle := 0; ELSIF StationsStatus[RobotStation].WaferInfo[1].Number > 0 AND StationsStatus[RobotStation].WaferInfo[0].Number = 0 THEN ROBOT_MAIN.TargetPuddle := 1; ELSE RETURN; END_IF IF RobotStatus.Ist.Busy THEN RETURN; END_IF CASE StationsStatus[ROBOT_MAIN.TargetStation].StationType OF TypeCassette: IF StationsStatus[ROBOT_MAIN.TargetStation].Ist.CloseIn OR CMD[ROBOT_MAIN.TargetStation] = StartCMD THEN CMD[RobotStation] := PutCMD; _Step := _Step +1; END_IF ELSE CMD[RobotStation] := PutCMD; _Step := _Step +1; END_CASE 51: IF RobotStatus.Ist.Busy THEN _Step := _Step +1; END_IF 52: IF RobotStatus.Ist.Busy THEN RETURN; END_IF IF StationsStatus[ROBOT_MAIN.TargetStation].OnlyMoveToStation THEN _Step := 30; ELSE _Step := 10; END_IF 90: ROBOT_MAIN.RobotControl.bOut_EndOfCycle := TRUE; IF ROBOT_MAIN.RobotControl.bIn_PGNO_REG THEN ROBOT_MAIN.RobotControl.bOut_EndOfCycle := FALSE; _Step := 100; END_IF 100: bEmpty := FALSE; Start := TRUE; _Step := 0; END_CASE ]]>