瀏覽代碼

Clean Job

sangwq 1 年之前
父節點
當前提交
bc21537c54
共有 2 個文件被更改,包括 100 次插入27 次删除
  1. 99 26
      Venus/Venus_RT/Modules/AutoCycle.cs
  2. 1 1
      Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs

+ 99 - 26
Venus/Venus_RT/Modules/AutoCycle.cs

@@ -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)

+ 1 - 1
Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs

@@ -168,7 +168,7 @@ namespace Venus_RT.Modules.PMs
             currentRecipeResult = new RecipeResult();
             currentRecipeResult.RecipeName = recipeName;
 
-            string recipeContent = RecipeFileManager.Instance.LoadRecipe(_chamber.Name, recipeName, false, RecipeType.Process.ToString());
+            string recipeContent = RecipeFileManager.Instance.LoadRecipe(_chamber.Name, recipeName, false, _withWafer ? "Process" : "Clean");
             Recipe recipe = Recipe.Load(recipeContent);
             currentRecipeResult.RecipeStepCount = recipe.Steps.Count;
             if (recipe == null)