0 THEN iSize := iStationStatus.WaferInfo[0].Size; IF RobotControl.MTR(TargetStation, iSize, 1) THEN _Step := 5; END_IF ELSIF iStationStatus.WaferInfo[1].Number > 0 THEN iSize := iStationStatus.WaferInfo[1].Size; IF RobotControl.MTR(TargetStation, iSize, 0) THEN _Step := 5; END_IF END_IF 5: PrepareNext(TargetStation); IF StationsStatus[TargetStation].Ist.PrepOut THEN _Step := 10; ELSIF NOT StationsStatus[TargetStation].Ist.InitDone THEN TargetStation := FirstCassette; IF iStationStatus.WaferInfo[0].Number > 0 THEN TargetPuddle := 0; iStationStatus.WaferInfo[0].Defect := TRUE; ELSIF iStationStatus.WaferInfo[1].Number > 0 THEN TargetPuddle := 1; iStationStatus.WaferInfo[1].Defect := TRUE; END_IF iCMD := PutCMD; _Step := 0; END_IF 10: IF RobotControl.MSS(TargetStation, iSize) THEN _Step := 20; END_IF 20: IF iStationStatus.WaferInfo[0].Number > 0 THEN iStationStatus.WaferInfo[1] := StationsStatus[TargetStation].WaferInfo[0]; StationsStatus[TargetStation].WaferInfo[0] := iStationStatus.WaferInfo[0]; iStationStatus.WaferInfo[0].Number := 0; ELSIF iStationStatus.WaferInfo[1].Number > 0 THEN iStationStatus.WaferInfo[0] := StationsStatus[TargetStation].WaferInfo[0]; StationsStatus[TargetStation].WaferInfo[0] := iStationStatus.WaferInfo[1]; iStationStatus.WaferInfo[1].Number := 0; ELSE RETURN; END_IF _Step := 50; 50: StationsStatus[TargetStation].WaferInfo[0].FlowStepNumber := StationsStatus[TargetStation].WaferInfo[0].FlowStepNumber +1; CASE CMD[GeneralStation] OF StartCMD: _Step := _Step +1; ELSE _Step := 100; END_CASE 51: FOR i := 0 TO iScheduler.NumberOfjob - 1 DO IF iScheduler.Job[i].WaferNumber = StationsStatus[TargetStation].WaferInfo[0].Number AND iScheduler.Job[i].CassetteNumber = StationsStatus[TargetStation].WaferInfo[0].CassetteNumber THEN //iScheduler.Job[i].Delete := TRUE; JobDelete(i); _Step := _Step +1; EXIT; END_IF END_FOR 52: // StationsStatus[TargetStation].WaferInfo[0].RecipeName := RecipeName; StationsStatus[TargetStation].Soll.AutoStart := TRUE; CMD[TargetStation] := CloseInCMD; _Step := 100; 100: Change := TRUE; _Step := 0; END_CASE ]]> 0 AND (CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].WaferStatus = WaferForProccess OR iStationStatus.Ist.Service) THEN IF CMD[TargetStation] = StartCMD THEN RobotControl.bInAutoIgnore := TRUE; END_IF _Step := 5; END_IF ELSE IF StationsStatus[TargetStation].WaferInfo[0].Number <> 0 THEN IF StationsStatus[TargetStation].Ist.PrepIn OR StationsStatus[TargetStation].Ist.PrepOut THEN _Step := 30; ELSE IF NOT StationsStatus[TargetStation].Ist.Busy THEN CMD[TargetStation] := PrepOutCMD; END_IF _Step := 10; END_IF END_IF END_CASE 5: iSize := CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].Size; IF RobotControl.MTR(TargetStation, iSize, TargetPuddle, 1) THEN _Step := 30; END_IF 10: iSize := StationsStatus[TargetStation].WaferInfo[0].Size; IF RobotControl.MTR(TargetStation, iSize, TargetPuddle, 1) THEN _Step := 20; END_IF 20: IF StationsStatus[TargetStation].Ist.PrepOut THEN _Step := 30; RETURN; END_IF IF NOT StationsStatus[TargetStation].Ist.Busy THEN CMD[TargetStation] := PrepOutCMD; END_IF 30: CASE StationsStatus[TargetStation].StationType OF TypeCassette: iSize := CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].Size; IF RobotControl.GET(TargetStation, iSize, TargetSlot, TargetPuddle) THEN IF RobotControl.bDeleteWafer THEN DeleteCassette := TargetStation; DeleteSlot := TargetSlot; _Step := 35; ELSIF RobotControl.bIgnore THEN CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].WaferStatus := noWafer; RobotControl.bIgnore := FALSE; _Step := 100; ELSE _Step := 40; END_IF END_IF ELSE iSize := StationsStatus[TargetStation].WaferInfo[0].Size; IF RobotControl.GET(TargetStation, iSize, 1, TargetPuddle) THEN IF RobotControl.bDeleteWafer THEN RobotControl.bDeleteWafer := FALSE; StationsStatus[TargetStation].Soll.Stop := TRUE; IF StationsStatus[TargetStation].WaferInfo[0].Number = 100 THEN _Step := 100; ELSE DeleteCassette := StationsStatus[TargetStation].WaferInfo[0].CassetteNumber; DeleteSlot := StationsStatus[TargetStation].WaferInfo[0].Number; _Step := 35; END_IF ELSIF RobotControl.bIgnore THEN RobotControl.bIgnore := FALSE; StationsStatus[TargetStation].WaferInfo[0].Number := 0; _Step := 100; ELSE _Step := 40; END_IF END_IF END_CASE 35: IF DeleteWaferFromScheduler(DeleteCassette, DeleteSlot) THEN CASSETTE_MAIN[DeleteCassette].Signal.Wafer[DeleteSlot].WaferStatus := noWafer; RobotControl.bDeleteWafer := FALSE; _Step := 100; END_IF 40: CASE StationsStatus[TargetStation].StationType OF TypeCassette: iStationStatus.WaferInfo[TargetPuddle].Number := TargetSlot; iStationStatus.WaferInfo[TargetPuddle].CassetteNumber := TargetStation; iStationStatus.WaferInfo[TargetPuddle].FlowStepNumber := 0; iStationStatus.WaferInfo[TargetPuddle].Defect := FALSE; iStationStatus.WaferInfo[TargetPuddle].Size := CASSETTE_MAIN[FirstCassette].Signal.Wafer[TargetSlot].Size; IF iStationStatus.Ist.Service THEN CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].WaferStatus := noWafer; iStationStatus.WaferInfo[TargetPuddle].Number := 100; _Step := 100; ELSE CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].WaferStatus := WaferInProccess; _Step := 50; END_IF ELSE iStationStatus.WaferInfo[TargetPuddle] := StationsStatus[TargetStation].WaferInfo[0]; StationsStatus[TargetStation].WaferInfo[0].Number := 0; CMD[TargetStation] := eStationCMD.CloseOutCMD; _Step := 100; END_CASE 50: (*faTime[0] := LocalTime.wYear; faTime[1] := LocalTime.wMonth; faTime[2] := LocalTime.wDay; faTime[3] := LocalTime.wHour; faTime[4] := LocalTime.wMinute; faTime[5] := LocalTime.wSecond; fbFormat( sFormat:=format, arg1:= F_REAL (faTime[0]), arg2:= F_REAL (faTime[1]), arg3:= F_REAL (faTime[2]), arg4:= F_REAL (faTime[3]), arg5:= F_REAL (faTime[4]), arg6:= F_REAL (faTime[5]), sOut=> SLOTID );*) SLOTID := INT_TO_STRING(TargetSlot); //CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].SLOT_ID := SLOTID; iStationStatus.WaferInfo[0].LotStartTime := CASSETTE_MAIN[TargetStation].Signal.START_TIME; iStationStatus.WaferInfo[0].LotID := CASSETTE_MAIN[TargetStation].Signal.LotID; iStationStatus.WaferInfo[0].SlotID := SLOTID; _Step := _Step +1; 51: Path := CONCAT(LOG_MAIN_PATH, iStationStatus.WaferInfo[0].LotStartTime); Path := CONCAT(Path, '\'); Path := CONCAT(Path, iStationStatus.WaferInfo[0].LotID); Path := CONCAT(Path, '\'); Path := CONCAT(Path, iStationStatus.WaferInfo[0].SlotID); CreateDir(sPathName := Path, bExecute := TRUE); _Step := _Step +1; 52: IF CreateDir.bError THEN _Step := 200; ELSIF NOT CreateDir.bBusy THEN _Step := 100; END_IF CreateDir(bExecute := FALSE); 100: Get := TRUE; _Step := 0; END_CASE]]> PassFailText ); iStationStatus.Ist.Busy := iCMD <> noStationCMD; IF bInStartRobotCleanOut THEN IF CleanOut() THEN bInStartRobotCleanOut := FALSE; END_IF END_IF CleanOutNeeded := FALSE; FOR i:= FirstStation TO LastStation DO CASE StationsStatus[i].StationType OF noStationType, TypeGeneral, TypeMedia, TypeCassette: ; TypeRobot: IF StationsStatus[i].WaferInfo[0].Number = 100 THEN CleanOutNeeded := TRUE; END_IF IF StationsStatus[i].WaferInfo[1].Number = 100 THEN CleanOutNeeded := TRUE; END_IF ELSE IF StationsStatus[i].OnlyMoveToStation THEN CONTINUE; END_IF IF StationsStatus[i].WaferInfo[0].Number = 100 THEN CleanOutNeeded := TRUE; END_IF END_CASE END_FOR iMediaArray[eRobotMedienNamen.CleanOut].Input := bInStartRobotCleanOut; iMediaArray[eRobotMedienNamen.CleanOut].Invisible := NOT CleanOutNeeded; IF StationsStatus[GeneralStation].Ist.Busy OR NOT StationsStatus[GeneralStation].Ist.InitDone OR NOT iStationStatus.Ist.InitDone THEN iMediaArray[eRobotMedienNamen.CleanOut].Invisible := TRUE; END_IF WarmUp();]]> 0 THEN iSize := StationsStatus[TargetStation].WaferInfo[0].Size; ELSE iSize := iStationStatus.WaferInfo[0].Size; END_IF // CASSETTE_MAIN[FirstCassette].TraySize; IF RobotControl.MTR(TargetStation, iSize, TargetPuddle, 1) THEN iCMD := eStationCMD.noStationCMD; END_IF]]> 0)) AND StationsStatus[TargetStation].WaferInfo[0].Number = 0 THEN _Step := 30; ELSIF NOT StationsStatus[TargetStation].Ist.Busy THEN CMD[TargetStation] := PrepInCMD; StationsStatus[TargetStation].WaferInfo[0].Size := iStationStatus.WaferInfo[0].Size; END_IF 30: CASE StationsStatus[TargetStation].StationType OF TypeCassette: iSize := iStationStatus.WaferInfo[TargetPuddle].Size; IF RobotControl.PUT(TargetStation, iSize, TargetSlot, TargetPuddle) THEN _Step := 40; END_IF ELSE iSize := iStationStatus.WaferInfo[TargetPuddle].Size; IF RobotControl.PUT(TargetStation, iSize, 1, TargetPuddle) THEN _Step := 40; END_IF END_CASE 40: CASE StationsStatus[TargetStation].StationType OF TypeCassette: IF CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].Defect THEN CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].WaferStatus := WaferDefect; ELSE CASSETTE_MAIN[TargetStation].Signal.Wafer[TargetSlot].WaferStatus := WaferFinish; END_IF IF NOT iStationStatus.Ist.Service AND NOT bInStartRobotCleanOut THEN CASSETTE_MAIN[OldTarget].Signal.Wafer[OldTargetSlot].WaferStatus := noWafer; END_IF _Step := _Step +1; ELSE StationsStatus[TargetStation].WaferInfo[0] := iStationStatus.WaferInfo[TargetPuddle]; StationsStatus[TargetStation].WaferInfo[0].FlowStepNumber := StationsStatus[TargetStation].WaferInfo[0].FlowStepNumber +1; _Step := _Step +1; END_CASE 41: iStationStatus.WaferInfo[TargetPuddle].Number := 0; iStationStatus.WaferInfo[TargetPuddle].CassetteNumber := 0; _Step := 50; 50: IF iStationStatus.Ist.Service THEN IF StationsStatus[TargetStation].NoRecipe THEN CMD[TargetStation] := CloseInCMD; StationsStatus[TargetStation].Soll.AutoStart := TRUE; END_IF _Step := 100; ELSIF CMD[GeneralStation] = StartCMD THEN _Step := 60; ELSE _Step := 100; END_IF 60: CASE StationsStatus[TargetStation].StationType OF TypeCassette: IF DeleteWaferFromScheduler(OldTarget, OldTargetSlot) THEN CASE TargetStation OF LastCassette: FailCounter := FailCounter + 1; CumulativeFailCounter := CumulativeFailCounter +1; ELSE PassCounter := PassCounter + 1; CumulativePassCounter := CumulativePassCounter +1; END_CASE _Step := 100; END_IF (*FOR i := 0 TO iScheduler.NumberOfjob - 1 DO IF iScheduler.Job[i].WaferNumber = OldTargetSlot AND iScheduler.Job[i].CassetteNumber = OldTarget THEN JobDelete(i); //iScheduler.Job[i].Delete := TRUE; _Step := 100; EXIT; END_IF END_FOR*) ELSE FOR i := 0 TO iScheduler.NumberOfjob - 1 DO IF iScheduler.Job[i].WaferNumber = StationsStatus[TargetStation].WaferInfo[0].Number AND iScheduler.Job[i].CassetteNumber = StationsStatus[TargetStation].WaferInfo[0].CassetteNumber THEN JobDelete(i); //iScheduler.Job[i].Delete := TRUE; _Step := _Step +1; EXIT; END_IF END_FOR END_CASE 61: // StationsStatus[TargetStation].WaferInfo[0].RecipeName := RecipeName; StationsStatus[TargetStation].Soll.AutoStart := TRUE; CMD[TargetStation] := CloseInCMD; _Step := 100; 70: iSize := iStationStatus.WaferInfo[TargetPuddle].Size; IF RobotControl.MTS(TargetStation, iSize, TargetPuddle) THEN _Step := _Step +1; END_IF 71: StationsStatus[TargetStation].WaferInfo[0] := iStationStatus.WaferInfo[TargetPuddle]; StationsStatus[TargetStation].WaferInfo[0].FlowStepNumber := StationsStatus[TargetStation].WaferInfo[0].FlowStepNumber +1; CMD[TargetStation] := CloseInCMD; StationsStatus[TargetStation].Soll.AutoStart := TRUE; _Step := _Step +1; 72: IF NOT iStationStatus.Ist.Service THEN PrepareNext(TargetStation); END_IF IF StationsStatus[TargetStation].Ist.PrepOut THEN iStationStatus.WaferInfo[TargetPuddle] := StationsStatus[TargetStation].WaferInfo[0]; StationsStatus[TargetStation].WaferInfo[0].Number := 0; _Step := _Step +1; END_IF 73: CASE StationsStatus[TargetStation].StationType OF TypeCodeReader: IF RobotControl.MTS_DONE(TRUE) THEN _Step := _Step +1; END_IF ELSE IF RobotControl.MTS_DONE(TRUE) THEN _Step := _Step +1; END_IF END_CASE 74: IF iStationStatus.Ist.Service THEN _Step := 0; Put := TRUE; ELSE FOR i := 0 TO iScheduler.NumberOfjob - 1 DO IF iScheduler.Job[i].WaferNumber = iStationStatus.WaferInfo[0].Number AND iScheduler.Job[i].CassetteNumber = iStationStatus.WaferInfo[0].CassetteNumber THEN JobDelete(i); //iScheduler.Job[i].Delete := TRUE; _Step := 79; EXIT; END_IF END_FOR END_IF 79: _Step := 0; Put := TRUE; 100: _Step := 0; Put := TRUE; END_CASE]]> _Size) THEN Step := 10; END_IF ELSE Step := 20; END_CASE 10: IF _Size > 0 THEN LastSizeFound := _Size; iStationStatus.WaferInfo[0].Size := _Size; IF KeyenceCamera.Mapping(Size := _Size, Out := MAP) THEN Step := 20; END_IF END_IF 20: FOR i := 1 TO MaxNumberOfSubstratesPerTray DO CASE MAP[i] OF 0: CASSETTE_MAIN[TargetStation].Signal.Wafer[i].WaferStatus := noWafer; 1: CASSETTE_MAIN[TargetStation].Signal.Wafer[i].WaferStatus := WaferForProccess; CASSETTE_MAIN[TargetStation].Signal.Wafer[i].Size := _Size; ELSE CASSETTE_MAIN[TargetStation].Signal.Wafer[i].WaferStatus := WaferDefect; END_CASE END_FOR Step := 100; 100: _Step := 0; Scan := TRUE; END_CASE]]> 0 OR // StationsStatus[RobotStation].WaferNumber[1] <> 0 OR NOT TargetStationStatus.Ist.InitDone THEN RobotSignal.Service.ScanInvisible := TRUE; END_IF IF NOT TargetStationStatus.Ist.CloseIn THEN RobotSignal.Service.GetInvisible := TRUE; RobotSignal.Service.PutInvisible := TRUE; RobotSignal.Service.CassetteInvisible := TRUE; END_IF CASE RobotSignal.Service.TargetPuddle OF eRobotPaddle.UpperPaddle: IF iStationStatus.WaferInfo[0].Number = 0 THEN RobotSignal.Service.PutInvisible := TRUE; ELSE RobotSignal.Service.GetInvisible := TRUE; END_IF eRobotPaddle.LowerPaddle: IF iStationStatus.WaferInfo[1].Number = 0 THEN RobotSignal.Service.PutInvisible := TRUE; ELSE RobotSignal.Service.GetInvisible := TRUE; END_IF END_CASE IF CASSETTE_MAIN[RobotSignal.Service.TargetCassette].Signal.Wafer[RobotSignal.Service.TargetSlot].WaferStatus = noWafer THEN RobotSignal.Service.GetInvisible := TRUE; ELSE RobotSignal.Service.PutInvisible := TRUE; END_IF IF NOT CASSETTE_MAIN[TargetStationStatus.iStation].IO.CarrierAvailable THEN RobotSignal.Service.GetInvisible := TRUE; RobotSignal.Service.PutInvisible := TRUE; RobotSignal.Service.CassetteInvisible := TRUE; RobotSignal.Service.ScanInvisible := TRUE; END_IF // IF TargetStationStatus.NoPut THEN // RobotSignal.Service.PutInvisible := TRUE; // END_IF // IF TargetStationStatus.NoGet THEN // RobotSignal.Service.GetInvisible := TRUE; // END_IF ELSE RobotSignal.Service.TargetCassette := FirstCassette; RobotSignal.Service.ScanInvisible := TRUE; RobotSignal.Service.CassetteInvisible := TRUE; IF TargetStationStatus.Ist.Busy OR NOT TargetStationStatus.Ist.InitDone THEN RobotSignal.Service.GetInvisible := TRUE; RobotSignal.Service.PutInvisible := TRUE; END_IF IF TargetStationStatus.WaferInfo[0].Number = 0 THEN RobotSignal.Service.GetInvisible := TRUE; ELSE RobotSignal.Service.PutInvisible := TRUE; END_IF CASE RobotSignal.Service.TargetPuddle OF eRobotPaddle.UpperPaddle: IF iStationStatus.WaferInfo[0].Number = 0 THEN RobotSignal.Service.PutInvisible := TRUE; END_IF eRobotPaddle.LowerPaddle: IF iStationStatus.WaferInfo[1].Number = 0 THEN RobotSignal.Service.PutInvisible := TRUE; END_IF END_CASE RobotSignal.Service.ScanInvisible := TRUE; END_CASE IF iStationStatus.Ist.Busy THEN RobotSignal.Service.ScanInvisible := TRUE; RobotSignal.Service.GetInvisible := TRUE; RobotSignal.Service.PutInvisible := TRUE; RobotSignal.Service.SelectionDisable := TRUE; END_IF FOR i := FirstCassette TO LastCassette DO IF CMD[i] = CloseInCMD THEN RobotSignal.Service.ScanInvisible := TRUE; RobotSignal.Service.GetInvisible := TRUE; RobotSignal.Service.PutInvisible := TRUE; RobotSignal.Service.SelectionDisable := TRUE; END_IF END_FOR IF TargetStationStatus.NoGet THEN RobotSignal.Service.GetInvisible := TRUE; END_IF IF TargetStationStatus.NoPut THEN RobotSignal.Service.PutInvisible := TRUE; END_IF iMediaArray[eRobotMedienNamen.ChuckGet].Invisible := FALSE; iMediaArray[eRobotMedienNamen.ChuckPut].Invisible := FALSE; IF iStationStatus.WaferInfo[0].Number > 0 OR iStationStatus.WaferInfo[1].Number > 0 THEN iMediaArray[eRobotMedienNamen.ChuckGet].Invisible := TRUE; iMediaArray[eRobotMedienNamen.ChuckPut].Invisible := TRUE; END_IF IF RobotControl.HasChuck THEN iMediaArray[eRobotMedienNamen.ChuckGet].Invisible := TRUE; ELSE iMediaArray[eRobotMedienNamen.ChuckPut].Invisible := TRUE; END_IF CASE RobotControl.rInTargetStation OF FirstSpinner: //IF SPINNER_MAIN[RobotControl.rInTargetStation].iChuckSize = 0 THEN ; //END_IF LastSpinner: ; ELSE iMediaArray[eRobotMedienNamen.ChuckGet].Invisible := TRUE; iMediaArray[eRobotMedienNamen.ChuckPut].Invisible := TRUE; END_CASE (*CASE RobotControl.rInTargetStation OF FirstSpinner: CASE RobotControl.rInTargetChuck OF 1: 2: 3: END_CASE LastSpinner: END_CASE*) //IF RobotControl.HasChuck THEN // IF RobotControl. //END_IF]]> 0 THEN // FOR j := 0 TO Scheduler[i].NumberOfjob-1 DO // Scheduler[i].Job[j].Delete := TRUE; // END_FOR //END_IF CASE StationsStatus[i].StationType OF noStationType, TypeRobot, TypeAligner, TypeGeneral, TypeMedia, TypeCassette: ; //TypeCassette: // StationsStatus[i].Soll.Stop := TRUE; ELSE IF StationsStatus[i].Ist.Busy THEN StationsStatus[i].Soll.FinishProcess := TRUE; END_IF END_CASE END_FOR Step := 100; 100: iStationStatus.Soll.Stop := FALSE; Step := 0; END_CASE ]]> 100) DO TargetTray := TargetTray +1; RealTargetSlot := RealTargetSlot - 100; END_WHILE Step := Step +1; 1: IF TargetTray = CASSETTE_MAIN[FirstCassette+1].TrayFeeder.TrayNumber THEN Step := 10; ELSE Step := 5; END_IF 5: IF CASSETTE_MAIN[FirstCassette+1].TrayFeeder.GetTray(TargetTray) THEN Step := 10; END_IF 10: Step := 0; TargetCassette := TRUE; END_CASE]]> 0 THEN hFile := fbFileOpen.hFile; Step := 130; END_IF fbFileOpen(bExecute := FALSE); 130: //Value := LREAL_TO_STRING(Offset.X); Value := CONCAT(Value, ';'); //Value := CONCAT(Value, LREAL_TO_STRING(Offset.Y)); Value := CONCAT(Value, ';$N'); Step := 140; 140: fbFilePuts.hFile := hFile; fbFilePuts.sLine := Value; fbFilePuts(bExecute := TRUE); IF fbFilePuts.bBusy THEN Step := Step +1; END_IF 141: IF NOT fbFilePuts.bBusy THEN Step := 150; END_IF fbFilePuts(bExecute := FALSE); 150: fbFileClose.hFile := hFile; fbFileClose(bExecute := TRUE); IF fbFileClose.bBusy THEN Step := Step +1; END_IF 151: IF NOT fbFileClose.bBusy THEN Step := 0; END_IF fbFileClose(bExecute := FALSE); END_CASE]]>