浏览代码

enhance Venus dispatcher module.

sangwq 11 月之前
父节点
当前提交
5b6817486a
共有 1 个文件被更改,包括 56 次插入13 次删除
  1. 56 13
      Venus/Venus_RT/Modules/VenusDispatcher.cs

+ 56 - 13
Venus/Venus_RT/Modules/VenusDispatcher.cs

@@ -92,7 +92,7 @@ namespace Venus_RT.Modules
                         break;
                     case ModuleStatus.WaitProcess:
                         {
-                            if(WaferManager.Instance.CheckHasWafer(Module, 0) && _runingWaferTask.Value.First().Key == RecipeJobType.Process)
+                            if(WaferManager.Instance.CheckHasWafer(Module, 0))
                             {
                                 Scheduler.EventWaferArrived?.Invoke(this, new WaferMoveArgs(ModuleName.TMRobot, 0, Module, 0));
                                 Status = ModuleStatus.StartProcess;
@@ -105,7 +105,7 @@ namespace Venus_RT.Modules
                         break;
                     case ModuleStatus.WaitPreJobClean:
                         {
-                            if (WaferManager.Instance.CheckNoWafer(Module, 0) && _runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
+                            if (WaferManager.Instance.CheckNoWafer(Module, 0))
                             {
                                 if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
                                 {
@@ -114,7 +114,7 @@ namespace Venus_RT.Modules
                                 else
                                 {
                                     LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean recipe{_runingWaferTask.Value.First().Value} failed");
-                                    _runingWaferTask.Value.Dequeue();
+                                    TryDequeueRuningTask(Status);
                                     Status = ModuleStatus.Idle;
                                 }
                             }
@@ -126,7 +126,7 @@ namespace Venus_RT.Modules
                         break;
                     case ModuleStatus.WaitPostJobClean:
                         {
-                            if (WaferManager.Instance.CheckNoWafer(Module, 0) && _runingWaferTask.Value.First().Key == RecipeJobType.PostClean)
+                            if (WaferManager.Instance.CheckNoWafer(Module, 0))
                             {
                                 if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
                                 {
@@ -135,7 +135,7 @@ namespace Venus_RT.Modules
                                 else
                                 {
                                     LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Postjob clean recipe{_runingWaferTask.Value.First().Value} failed");
-                                    _runingWaferTask.Value.Dequeue();
+                                    TryDequeueRuningTask(Status);
                                     Status = ModuleStatus.Idle;
                                 }
                             }
@@ -153,30 +153,26 @@ namespace Venus_RT.Modules
                                 if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
                                 {
                                     _wafer.Return();
+                                    TryDequeueRuningTask(Status);
                                     Status = ModuleStatus.Idle;
                                 }
                             }
                             else  // handle offline exception situation
                             {
+                                TryDequeueRuningTask(Status);
                                 Status = ModuleStatus.Idle;
                             }
-
-                            if(_runingWaferTask.Value.Count > 0 && _runingWaferTask.Value.First().Key == RecipeJobType.Process)
-                                _runingWaferTask.Value.Dequeue();
-
                         }
                         break;
                     case ModuleStatus.PreJobClean:
                         {
-                            if(_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
-                                _runingWaferTask.Value.Dequeue();
+                            TryDequeueRuningTask(Status);
                             Status = ModuleStatus.Idle;
                         }
                         break;
                     case ModuleStatus.PostJobClean:
                         {
-                            if (_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
-                                _runingWaferTask.Value.Dequeue();
+                            TryDequeueRuningTask(Status);
                             Status = ModuleStatus.Idle;
                         }
                         break;
@@ -222,6 +218,53 @@ namespace Venus_RT.Modules
             return RState.Running;
         }
 
+        void TryDequeueRuningTask( ModuleStatus status)
+        {
+            bool bMatch = false;
+            if (_runingWaferTask.Value.Count > 0) 
+            {
+                switch(status)
+                {
+                    case ModuleStatus.PreJobClean:
+                        if(_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
+                        {
+                            _runingWaferTask.Value.Dequeue();
+                            bMatch = true;  
+                        }
+                        break;
+                    case ModuleStatus.Processing:
+                        if(_runingWaferTask.Value.First().Key == RecipeJobType.Process) 
+                        {
+                            _runingWaferTask.Value.Dequeue();
+                            bMatch = true;  
+                        }
+                        break;
+                    case ModuleStatus.PostJobClean:
+                        if(_runingWaferTask.Value.First().Key == RecipeJobType.PostClean)
+                        {
+                            _runingWaferTask.Value.Dequeue();
+                            bMatch = true;  
+                        }
+                        break;
+                    case ModuleStatus.WaitPreJobClean:
+                        _runingWaferTask.Value.Dequeue();
+                        break;
+                    case ModuleStatus.WaitProcess:
+                        _runingWaferTask.Value.Dequeue();
+                        break;
+                    case ModuleStatus.WaitPostJobClean:
+                        _runingWaferTask.Value.Dequeue();
+                        break;
+                }
+            }
+
+            if(!bMatch)
+            {
+                string runingTask = _runingWaferTask.Value.Count > 0 ? _runingWaferTask.Value.First().ToString() : "Empty";
+                LOG.Write(eEvent.WARN_ROUTER, Module, $"PM Status: {status}, runing task : {runingTask}");
+            }
+        }
+
         public override void WaferArrived(WaferTask wafer, int slot)
         {
             _wafer = wafer;