0 THEN Processes[ProcessCounter].NumberOfAlternative := j; END_IF END_FOR // END_FOR //Final Robot Block ProcessCounter := ProcessCounter +1; Processes[ProcessCounter].StartTime := CurrentTime; CurrentTime := CurrentTime + LINT_TO_TIME(TimeBetweenProcesses*1000); Processes[ProcessCounter].EndTime := CurrentTime; Processes[ProcessCounter].StationType := TypeRobot; Processes[ProcessCounter].Alternative[1] := RobotStation; Processes[ProcessCounter].NumberOfAlternative := 1; ProcessesBlock := TRUE;]]> 0 OR StationsStatus[RobotStation].WaferInfo[1].Number > 0; IF StationsStatus[RobotStation].Ist.Busy OR RobotHasSubstrate THEN IF _Step >= 0 AND _Step < 40 THEN _Step := 0; RETURN; END_IF END_IF CASE _Step OF 0: FOR i := FirstLelaxStation TO LastRelaxStation DO IF i <> iStation THEN IF iStationStatus.WaferInfo[0].Number > StationsStatus[i].WaferInfo[0].Number and StationsStatus[i].WaferInfo[0].Number <> 0 THEN RETURN; END_IF END_IF END_FOR CurrentTime := timeAsDT; IF OldtimeAsDT <> timeAsDT THEN OldtimeAsDT := CurrentTime; _Step := _Step +1; END_IF 1: IF ProcessesBlock() THEN _Step := 10; ELSE _Step := 0; END_IF 10: IF CheckAlternative(NoAlternative => NoAlternative) THEN IF NoAlternative THEN _Step := 0; ELSE SavedScheduler := Scheduler; SecondLevelScheduler := Scheduler; StepCounter := 0; _Step := 20; END_IF END_IF 20: StepCounter := StepCounter +1; IF StepCounter > ProcessCounter THEN _Step := 40; ELSE FirstLevelScheduler := SecondLevelScheduler; _Step := 30; END_IF 30: AlternativeCounter := 0; _Step := _Step +1; 31: AlternativeCounter := AlternativeCounter +1; IF AlternativeCounter > Processes[StepCounter].NumberOfAlternative THEN _Step := 0; RETURN; END_IF TargetStation := Processes[StepCounter].Alternative[AlternativeCounter]; NumberOfJob := SecondLevelScheduler[TargetStation].NumberOfjob; SecondLevelScheduler[TargetStation].Job[NumberOfJob].StartTime := Processes[StepCounter].StartTime; SecondLevelScheduler[TargetStation].Job[NumberOfJob].EndTime := Processes[StepCounter].EndTime; SecondLevelScheduler[TargetStation].Job[NumberOfJob].CassetteNumber := CassetteNumber; SecondLevelScheduler[TargetStation].Job[NumberOfJob].WaferNumber := WaferNumber; SecondLevelScheduler[TargetStation].NumberOfjob := NumberOfJob +1; IF CheckReservation(SecondLevelScheduler, TargetStation) THEN Processes[StepCounter].TargetStation := TargetStation; FirstLevelScheduler := SecondLevelScheduler; _Step := 20; ELSE SecondLevelScheduler := FirstLevelScheduler; END_IF 40: FOR i := FirstStation TO LastStation DO IF NOT StationsStatus[i].OnlyMoveToStation THEN IF NOT CheckReservation(FirstLevelScheduler, i) THEN _Step := 0; RETURN; END_IF END_IF END_FOR IF SchedulerChangeOk(SavedScheduler) THEN Scheduler := FirstLevelScheduler; ELSE _Step := 0; RETURN; END_IF FlowStepNumber := iStationStatus.WaferInfo[0].FlowStepNumber; FOR j := 2 TO ProcessCounter BY 2 DO CASSETTE_PROCESS[CassetteNumber][WaferNumber][FlowStepNumber+j/2].TargetStation := Processes[j].TargetStation; CASSETTE_PROCESS[CassetteNumber][WaferNumber][FlowStepNumber+j/2].Recipe := Processes[j].Recipe; CASSETTE_PROCESS[CassetteNumber][WaferNumber][FlowStepNumber+j/2].Retry := Processes[j].Retry; CASSETTE_PROCESS[CassetteNumber][WaferNumber][FlowStepNumber+j/2].RetryFlowName := Processes[j].RetryFlowName; END_FOR _Step := 90; 90: Start := TRUE; _Step := 0; END_CASE]]>