|
@@ -50,12 +50,15 @@ namespace Venus_RT.Modules
|
|
|
StartIdleClean,
|
|
|
IdleClean,
|
|
|
|
|
|
+ WaitPreJobClean,
|
|
|
StartPreJobClean,
|
|
|
PreJobClean,
|
|
|
|
|
|
+ WaitPostJobClean,
|
|
|
StartPostJobClean,
|
|
|
PostJobClean,
|
|
|
|
|
|
+ WaitWTWClean,
|
|
|
StartWTWClean,
|
|
|
WTWClean,
|
|
|
|
|
@@ -1026,11 +1029,12 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
var pmScheduler = _vacSchedulers[mod.Key] as SchedulerPM;
|
|
|
string WTWCleanRecipe = string.Empty;
|
|
|
- var wtwJob = _lstControlJobs.Find(cj => cj.JetState == EnumJetCtrlJobState.Processing && IsCtrlJobNeedWTWClean(cj, out WTWCleanRecipe) && !IsAllJobWaferProcessedOrProcessing(cj));
|
|
|
- if(wtwJob != null && WTWCleanRecipe.Length > 0) // 错误, 有Wafer , 不能启动WTW clean Recipe
|
|
|
+ var wtwJob = _lstControlJobs.Find(cj => cj.JetState == EnumJetCtrlJobState.Processing && IsCtrlJobNeedWTWClean(cj, mod.Key, out WTWCleanRecipe) && !IsAllJobWaferProcessedOrProcessing(cj));
|
|
|
+ if(wtwJob != null && WTWCleanRecipe.Length > 0)
|
|
|
{
|
|
|
_waitWTWCleanPMs.Add(mod.Key);
|
|
|
}
|
|
|
+
|
|
|
mod.Value.MovingStatus = MovingStatus.Idle;
|
|
|
}
|
|
|
break;
|
|
@@ -1045,39 +1049,70 @@ namespace Venus_RT.Modules
|
|
|
var pmScheduler = _vacSchedulers[mod.Key] as SchedulerPM;
|
|
|
if (IsPMKeepEmpty(mod.Key))
|
|
|
{
|
|
|
- if(IsPreJobCleanPending(mod.Key, out string preCleanRecipe))
|
|
|
+ if(_waitPreCleanPMs.Contains(mod.Key))
|
|
|
+ {
|
|
|
+ mod.Value.MovingStatus = MovingStatus.WaitPreJobClean;
|
|
|
+ }
|
|
|
+ else if(pmScheduler.RunIdleCleanTask()) // Check Idle Clean
|
|
|
{
|
|
|
- if(pmScheduler.RunJobCleanTask(preCleanRecipe))
|
|
|
+ mod.Value.MovingStatus = MovingStatus.StartIdleClean;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MovingStatus.WaitPreJobClean:
|
|
|
+ {
|
|
|
+ mod.Value.MovingStatus = MovingStatus.Idle;
|
|
|
+ var pmScheduler = _vacSchedulers[mod.Key] as SchedulerPM;
|
|
|
+ if (IsPMKeepEmpty(mod.Key))
|
|
|
+ {
|
|
|
+ if (IsPreJobCleanPending(mod.Key, out string preCleanRecipe))
|
|
|
+ {
|
|
|
+ if (pmScheduler.RunJobCleanTask(preCleanRecipe))
|
|
|
{
|
|
|
- _waitPreCleanPMs.Remove(mod.Key);
|
|
|
mod.Value.MovingStatus = MovingStatus.StartPreJobClean;
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- _waitPreCleanPMs.Remove(mod.Key);
|
|
|
- }
|
|
|
+
|
|
|
+ _waitPreCleanPMs.Remove(mod.Key);
|
|
|
}
|
|
|
- else if(IsPostJobCleanPending(mod.Key, out string postCleanRecipe))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MovingStatus.WaitPostJobClean:
|
|
|
+ {
|
|
|
+ mod.Value.MovingStatus = MovingStatus.Idle;
|
|
|
+ var pmScheduler = _vacSchedulers[mod.Key] as SchedulerPM;
|
|
|
+ if (IsPMKeepEmpty(mod.Key))
|
|
|
+ {
|
|
|
+ if (IsPostJobCleanPending(mod.Key, out string postCleanRecipe))
|
|
|
{
|
|
|
- if(pmScheduler.RunJobCleanTask(postCleanRecipe))
|
|
|
+ if (pmScheduler.RunJobCleanTask(postCleanRecipe))
|
|
|
{
|
|
|
- _waitPostCleanPMs.Remove(mod.Key);
|
|
|
mod.Value.MovingStatus = MovingStatus.StartPostJobClean;
|
|
|
}
|
|
|
+
|
|
|
+ _waitPostCleanPMs.Remove(mod.Key);
|
|
|
}
|
|
|
- else if(IsWTWJobCleanPending(mod.Key, out string wtwCleanRecipe))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MovingStatus.WaitWTWClean:
|
|
|
+ {
|
|
|
+ mod.Value.MovingStatus = MovingStatus.Idle;
|
|
|
+ var pmScheduler = _vacSchedulers[mod.Key] as SchedulerPM;
|
|
|
+ if (IsPMKeepEmpty(mod.Key) && _waitWTWCleanPMs.Contains(mod.Key))
|
|
|
+ {
|
|
|
+ string WTWCleanRecipe = string.Empty;
|
|
|
+ var wtwJob = _lstControlJobs.Find(cj => cj.JetState == EnumJetCtrlJobState.Processing && IsCtrlJobNeedWTWClean(cj, mod.Key, out WTWCleanRecipe) && !IsAllJobWaferProcessedOrProcessing(cj));
|
|
|
+ if (wtwJob != null && WTWCleanRecipe.Length > 0)
|
|
|
{
|
|
|
- if(pmScheduler.RunJobCleanTask(wtwCleanRecipe))
|
|
|
+ if (pmScheduler.RunJobCleanTask(WTWCleanRecipe))
|
|
|
{
|
|
|
- _waitWTWCleanPMs.Remove(mod.Key);
|
|
|
mod.Value.MovingStatus = MovingStatus.StartWTWClean;
|
|
|
}
|
|
|
- }
|
|
|
- else if (pmScheduler.RunIdleCleanTask()) // Check Idle Clean
|
|
|
- {
|
|
|
- mod.Value.MovingStatus = MovingStatus.StartIdleClean;
|
|
|
- }
|
|
|
|
|
|
+ _waitWTWCleanPMs.Remove(mod.Key);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -1995,6 +2030,21 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
_vacModules[tar.Key.Module].MovingStatus = MovingStatus.WaitProcess;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ var curItem = _movingItems.Find(item => item.DestinationModule == tar.Key.Module && item.DestinationSlot == tar.Key.Slot);
|
|
|
+ if(ModuleHelper.IsPm(curItem.SourceModule) && _movingItems.FindIndex(item => item.DestinationModule == curItem.SourceModule) == -1)
|
|
|
+ {
|
|
|
+ if(_waitPostCleanPMs.Contains(curItem.SourceModule))
|
|
|
+ {
|
|
|
+ _vacModules[curItem.SourceModule].MovingStatus = MovingStatus.WaitPostJobClean;
|
|
|
+ }
|
|
|
+ else if(_waitWTWCleanPMs.Contains(curItem.SourceModule))
|
|
|
+ {
|
|
|
+ _vacModules[curItem.SourceModule].MovingStatus = MovingStatus.WaitWTWClean;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if (!ModuleHelper.IsTMRobot(tar.Key.Module))
|
|
|
wafer.NextSequenceStep++;
|
|
@@ -2124,7 +2174,13 @@ namespace Venus_RT.Modules
|
|
|
if (IsCtrlJobNeedPreClean(startJob))
|
|
|
{
|
|
|
startJob.JetState = EnumJetCtrlJobState.PreJobClean;
|
|
|
- _waitPreCleanPMs = GetWaitPreCleanPMsByCtrlJob(startJob);
|
|
|
+ _waitPreCleanPMs.Clear();
|
|
|
+
|
|
|
+ var PMs = GetWaitPreCleanPMsByCtrlJob(startJob);
|
|
|
+ foreach(var pm in PMs)
|
|
|
+ {
|
|
|
+ _waitPreCleanPMs.Add(pm);
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -2271,7 +2327,13 @@ namespace Venus_RT.Modules
|
|
|
if (IsCtrlJobNeedPreClean(cj))
|
|
|
{
|
|
|
cj.JetState = EnumJetCtrlJobState.PreJobClean;
|
|
|
- _waitPreCleanPMs = GetWaitPreCleanPMsByCtrlJob(cj);
|
|
|
+ _waitPreCleanPMs.Clear();
|
|
|
+
|
|
|
+ var PMs = GetWaitPreCleanPMsByCtrlJob(cj);
|
|
|
+ foreach (var pm in PMs)
|
|
|
+ {
|
|
|
+ _waitPreCleanPMs.Add(pm);
|
|
|
+ }
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -2326,7 +2388,12 @@ namespace Venus_RT.Modules
|
|
|
if (IsAllJobWaferProcessedOrProcessing(cj))
|
|
|
{
|
|
|
cj.JetState = EnumJetCtrlJobState.PostJobClean;
|
|
|
- _waitPostCleanPMs = GetWaitPreCleanPMsByCtrlJob(cj);
|
|
|
+ _waitPostCleanPMs.Clear();
|
|
|
+ var PMs = GetWaitPreCleanPMsByCtrlJob(cj);
|
|
|
+ foreach (var pm in PMs)
|
|
|
+ {
|
|
|
+ _waitPostCleanPMs.Add(pm);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2512,7 +2579,7 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
foreach(var pj in _lstProcessJobs)
|
|
|
{
|
|
|
- if(pj.ControlJobName == cj.Name && pj.State != EnumProcessJobState.Complete)
|
|
|
+ if(pj.ControlJobName == cj.Name && pj.State != EnumProcessJobState.ProcessingComplete)
|
|
|
{
|
|
|
return false;
|
|
|
}
|
|
@@ -2542,6 +2609,8 @@ namespace Venus_RT.Modules
|
|
|
return false;
|
|
|
|
|
|
var processJob = _lstProcessJobs.Find(pj => pj.Name == cj.ProcessJobNameList.First());
|
|
|
+ if (processJob == null || processJob.Sequence == null || processJob.Sequence.PreCleanRecipe == null)
|
|
|
+ return false;
|
|
|
|
|
|
return processJob.Sequence.PreCleanRecipe.Trim().Length > 0;
|
|
|
}
|
|
@@ -2552,20 +2621,24 @@ namespace Venus_RT.Modules
|
|
|
return false;
|
|
|
|
|
|
var processJob = _lstProcessJobs.Find(pj => pj.Name == cj.ProcessJobNameList.First());
|
|
|
+ if (processJob == null || processJob.Sequence == null || processJob.Sequence.PostCleanRecipe == null)
|
|
|
+ return false;
|
|
|
|
|
|
return processJob.Sequence.PostCleanRecipe.Trim().Length > 0;
|
|
|
}
|
|
|
|
|
|
- private bool IsCtrlJobNeedWTWClean(ControlJobInfo cj, out string WTWCleanRecipe)
|
|
|
+ private bool IsCtrlJobNeedWTWClean(ControlJobInfo cj, ModuleName pm, out string WTWCleanRecipe)
|
|
|
{
|
|
|
WTWCleanRecipe = string.Empty;
|
|
|
if (cj.ProcessJobNameList.Count != 1)
|
|
|
return false;
|
|
|
|
|
|
var processJob = _lstProcessJobs.Find(pj => pj.Name == cj.ProcessJobNameList.First());
|
|
|
+ if (processJob == null || processJob.Sequence == null || processJob.Sequence.WTWCleanRecipe == null)
|
|
|
+ return false;
|
|
|
|
|
|
WTWCleanRecipe = processJob.Sequence.WTWCleanRecipe.Trim();
|
|
|
- return WTWCleanRecipe.Length > 0;
|
|
|
+ return processJob.Sequence.PMs.Contains(pm) && WTWCleanRecipe.Length > 0;
|
|
|
}
|
|
|
|
|
|
private List<ModuleName> GetWaitPreCleanPMsByCtrlJob(ControlJobInfo cj)
|