瀏覽代碼

develop Pre/Post Clean functionalities.

sangwq 11 月之前
父節點
當前提交
c8e945317e
共有 1 個文件被更改,包括 161 次插入138 次删除
  1. 161 138
      Venus/Venus_RT/Modules/VenusDispatcher.cs

+ 161 - 138
Venus/Venus_RT/Modules/VenusDispatcher.cs

@@ -58,7 +58,6 @@ namespace Venus_RT.Modules
                         {
                             return Scheduler.IsAvailable ? 0 : (Scheduler.TimeToReady + 500) / 1000;
                         }
-                        break;
                 }
 
                 return int.MaxValue;
@@ -75,146 +74,158 @@ namespace Venus_RT.Modules
         { }
         public override RState Run()
         {
-            if (Scheduler.IsIdle)
+            if(_runingWaferTask.Value.Count == 0)
             {
-                switch (Status)
+                if(_pendingWaferTasks.Count > 0)
                 {
-                    case ModuleStatus.Idle:
-                        {
-                            if (WaferManager.Instance.CheckNoWafer(Module, 0) && Scheduler.IsOnline)
-                            {
-                                if (_pmScheduler.RunIdleCleanTask())  // Check Idle Clean
-                                {
-                                    Status = ModuleStatus.StartIdleClean;
-                                }
-                            }
-                        }
-                        break;
-                    case ModuleStatus.WaitProcess:
+                    _runingWaferTask = _pendingWaferTasks.Dequeue();
+                }
+                else
+                {
+                    if(Scheduler.IsIdle && Status == ModuleStatus.Idle)
+                    {
+                        if (WaferManager.Instance.CheckNoWafer(Module, 0) && Scheduler.IsOnline)
                         {
-                            if(WaferManager.Instance.CheckHasWafer(Module, 0))
-                            {
-                                Scheduler.EventWaferArrived?.Invoke(this, new WaferMoveArgs(ModuleName.TMRobot, 0, Module, 0));
-                                Status = ModuleStatus.StartProcess;
-                            }
-                            else
+                            if (_pmScheduler.RunIdleCleanTask())  // Check Idle Clean
                             {
-                                LOG.Write(eEvent.WARN_ROUTER, Module, $"Run process recipe failed, wafer existance{WaferManager.Instance.GetWafer(Module, 0).WaferOrigin}, pending job type: {_runingWaferTask.Value.First().Key}");
+                                Status = ModuleStatus.StartIdleClean;
                             }
                         }
-                        break;
-                    case ModuleStatus.WaitPreJobClean:
-                        {
-                            if (WaferManager.Instance.CheckNoWafer(Module, 0))
+                    }
+                }
+            }
+            else
+            {
+                if(Scheduler.IsIdle && Status == ModuleStatus.Idle)
+                {
+                    switch(_runingWaferTask.Value.First().Key)
+                    {
+                        case RecipeJobType.PreClean:
                             {
-                                if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
+                                if(WaferManager.Instance.CheckNoWafer(Module,0))
                                 {
-                                    Status = ModuleStatus.StartPreJobClean;
+                                    if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
+                                    {
+                                        Status = ModuleStatus.StartPreJobClean;
+                                    }
+                                    else
+                                    {
+                                        LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean recipe{_runingWaferTask.Value.First().Value} failed");
+                                        TryDequeueRuningTask(Status);
+                                        Status = ModuleStatus.Idle;
+                                    }
                                 }
-                                else
+                            }
+                            break;
+                        case RecipeJobType.Process:
+                            {
+                                if (WaferManager.Instance.CheckHasWafer(Module, 0))
                                 {
-                                    LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean recipe{_runingWaferTask.Value.First().Value} failed");
-                                    TryDequeueRuningTask(Status);
-                                    Status = ModuleStatus.Idle;
+                                    if(_wafer.waferId == _runingWaferTask.Key)
+                                    {
+                                        Scheduler.EventWaferArrived?.Invoke(this, new WaferMoveArgs(ModuleName.TMRobot, 0, Module, 0));
+                                        Status = ModuleStatus.StartProcess;
+                                    }
+                                    else
+                                    {
+                                        LOG.Write(eEvent.WARN_ROUTER, Module, $"wafer id dismatch while launch {_wafer.sourceMod}.{_wafer.sourceSlot + 1} process recipe");
+                                    }
                                 }
                             }
-                            else
+                            break;
+                        case RecipeJobType.PostClean:
                             {
-                                LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean failded, wafer existance{WaferManager.Instance.GetWafer(Module, 0).WaferOrigin}, pending job type: {_runingWaferTask.Value.First().Key}");
+                                if (WaferManager.Instance.CheckNoWafer(Module, 0))
+                                {
+                                    if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
+                                    {
+                                        Status = ModuleStatus.StartPostJobClean;
+                                    }
+                                    else
+                                    {
+                                        LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Postjob clean recipe{_runingWaferTask.Value.First().Value} failed");
+                                        TryDequeueRuningTask(Status);
+                                        Status = ModuleStatus.Idle;
+                                    }
+                                }
                             }
-                        }
-                        break;
-                    case ModuleStatus.WaitPostJobClean:
-                        {
-                            if (WaferManager.Instance.CheckNoWafer(Module, 0))
+                            break;
+                    }
+                }
+            }
+
+            if(_runingWaferTask.Value.Count > 0 || Status != ModuleStatus.Idle)
+            {
+                if (Scheduler.IsIdle)
+                {
+                    switch (Status)
+                    {
+                        case ModuleStatus.Processing:
                             {
-                                if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
+                                var wafer = WaferManager.Instance.GetWafer(Module, 0);
+                                if (Scheduler.IsOnline)
                                 {
-                                    Status = ModuleStatus.StartPostJobClean;
+                                    if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
+                                    {
+                                        _wafer.Return();
+                                        TryDequeueRuningTask(Status);
+                                        Status = ModuleStatus.Idle;
+                                    }
                                 }
-                                else
+                                else  // handle offline exception situation
                                 {
-                                    LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Postjob clean recipe{_runingWaferTask.Value.First().Value} failed");
                                     TryDequeueRuningTask(Status);
                                     Status = ModuleStatus.Idle;
                                 }
                             }
-                            else
+                            break;
+                        case ModuleStatus.PreJobClean:
                             {
-                                LOG.Write(eEvent.WARN_ROUTER, Module, $"Run postJob clean failded, wafer existance{WaferManager.Instance.GetWafer(Module, 0).WaferOrigin}, pending job type: {_runingWaferTask.Value.First().Key}");
+                                TryDequeueRuningTask(Status);
+                                Status = ModuleStatus.Idle;
                             }
-                        }
-                        break;
-                    case ModuleStatus.Processing:
-                        {
-                            var wafer = WaferManager.Instance.GetWafer(Module, 0);
-                            if (Scheduler.IsOnline)
+                            break;
+                        case ModuleStatus.PostJobClean:
                             {
-                                if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
-                                {
-                                    _wafer.Return();
-                                    TryDequeueRuningTask(Status);
-                                    Status = ModuleStatus.Idle;
-                                }
+                                TryDequeueRuningTask(Status);
+                                Status = ModuleStatus.Idle;
                             }
-                            else  // handle offline exception situation
+                            break;
+                        case ModuleStatus.IdleClean:
                             {
-                                TryDequeueRuningTask(Status);
                                 Status = ModuleStatus.Idle;
                             }
-                        }
-                        break;
-                    case ModuleStatus.PreJobClean:
-                        {
-                            TryDequeueRuningTask(Status);
-                            Status = ModuleStatus.Idle;
-                        }
-                        break;
-                    case ModuleStatus.PostJobClean:
-                        {
-                            TryDequeueRuningTask(Status);
-                            Status = ModuleStatus.Idle;
-                        }
-                        break;
-                    case ModuleStatus.IdleClean:
-                        {
-                            Status = ModuleStatus.Idle;
-                        }
-                        break;
-                    case ModuleStatus.StartProcess:
-                        {
-                            if (RouteManager.IsATMMode)
+                            break;
+                        case ModuleStatus.StartProcess:
                             {
-                                Status = ModuleStatus.Processing;
+                                if (RouteManager.IsATMMode)
+                                {
+                                    Status = ModuleStatus.Processing;
+                                }
                             }
-                        }
-                        break;
+                            break;
+                    }
                 }
-            }
-            else
-            {
-                switch (Status)
+                else
                 {
-                    case ModuleStatus.StartProcess:
-                        Status = ModuleStatus.Processing;
-                        break;
-                    case ModuleStatus.StartIdleClean:
-                        Status = ModuleStatus.IdleClean;
-                        break;
-                    case ModuleStatus.StartPreJobClean:
-                        Status = ModuleStatus.PreJobClean;
-                        break;
-                    case ModuleStatus.StartPostJobClean:
-                        Status = ModuleStatus.PostJobClean;
-                        break;
+                    switch (Status)
+                    {
+                        case ModuleStatus.StartProcess:
+                            Status = ModuleStatus.Processing;
+                            break;
+                        case ModuleStatus.StartIdleClean:
+                            Status = ModuleStatus.IdleClean;
+                            break;
+                        case ModuleStatus.StartPreJobClean:
+                            Status = ModuleStatus.PreJobClean;
+                            break;
+                        case ModuleStatus.StartPostJobClean:
+                            Status = ModuleStatus.PostJobClean;
+                            break;
+                    }
                 }
             }
 
-            if (_runingWaferTask.Value.Count == 0 && _pendingWaferTasks.Count > 0)
-            {
-                _runingWaferTask = _pendingWaferTasks.Dequeue();
-            }
-
             return RState.Running;
         }
 
@@ -268,30 +279,10 @@ namespace Venus_RT.Modules
         public override void WaferArrived(WaferTask wafer, int slot)
         {
             _wafer = wafer;
-            Status = ModuleStatus.WaitProcess;
         }
 
         public override void WaferLeaved(WaferTask wafer, int slot)
         {
-            if(_runingWaferTask.Value.Count == 0)
-            {
-                if(_pendingWaferTasks.Count > 0)
-                {
-                    _runingWaferTask = _pendingWaferTasks.Dequeue();
-                    if (_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
-                    {
-                        Status = ModuleStatus.WaitPreJobClean;
-                    }
-                }
-            }
-            else
-            {
-                if (_runingWaferTask.Value.First().Key == RecipeJobType.PostClean)
-                {
-                    Status = ModuleStatus.WaitPostJobClean;
-                }
-            }
-
             _wafer = null;
         }
 
@@ -327,6 +318,12 @@ namespace Venus_RT.Modules
                 _pendingWaferTasks.Enqueue(new KeyValuePair<Guid, Queue<KeyValuePair<RecipeJobType, string>>>(venusWaferTask.waferId, waferRecipes));
             }
         }
+        public bool ReadyMoveIn(WaferTask wafer)
+        {
+            return _runingWaferTask.Key == wafer.waferId && _runingWaferTask.Value.Count > 0 && _runingWaferTask.Value.First().Key == RecipeJobType.Process;
+        }
+
+
     }
 
     class PreAlignTask : ModuleTask
@@ -1140,8 +1137,12 @@ namespace Venus_RT.Modules
                     _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, alignerWafer.currentSlot, ModuleName.TMRobot, (int)Hand.Blade1, Hand.Blade1) });
                     if (emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
                     {
-                        // move aligner wafer to PM
-                        _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)Hand.Blade1, alignerWafer.destMod, alignerWafer.destSlot, Hand.Blade1) });
+                        var pmTask = _dictModuleTask[alignerWafer.destMod] as VenusPMTask;
+                        if(pmTask.ReadyMoveIn(alignerWafer))
+                        {
+                            // move aligner wafer to PM
+                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)Hand.Blade1, alignerWafer.destMod, alignerWafer.destSlot, Hand.Blade1) });
+                        }
                     }
                 }
                 else
@@ -1173,18 +1174,19 @@ namespace Venus_RT.Modules
             }
             else if(robotWafers.Count == 1)
             {
+                var freeHand = robotWafers.First().currentSlot == 0 ? Hand.Blade2 : Hand.Blade1;
                 if (readyReturnWafers.Count >= 1)
                 {
                     // return one wafer
-                    var freeHand = robotWafers.First().currentSlot == 0 ? Hand.Blade2 : Hand.Blade1;
                     _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyReturnWafers.First().currentMod, 0, ModuleName.TMRobot, (int)freeHand, freeHand) });
                     _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)freeHand, readyReturnWafers.First().destMod, readyReturnWafers.First().destSlot, freeHand) });
                 }
+                else
                 {
                     if (_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod)))
                     {
                         var alignerWafer = _lstWaferTasks.Where(wt => ModuleHelper.IsAligner(wt.currentMod)).First();
-                        _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, alignerWafer.currentSlot, ModuleName.TMRobot, (int)Hand.Blade1, Hand.Blade1) });
+                        _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, alignerWafer.currentSlot, ModuleName.TMRobot, (int)freeHand, freeHand) });
 
                         if(!robotWafers.First().IsAligned)
                         {
@@ -1193,7 +1195,11 @@ namespace Venus_RT.Modules
 
                         if (emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
                         {
-                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)Hand.Blade1, alignerWafer.destMod, alignerWafer.destSlot, Hand.Blade1) });
+                            var pmTask = _dictModuleTask[alignerWafer.destMod] as VenusPMTask;
+                            if (pmTask.ReadyMoveIn(alignerWafer))
+                            {
+                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)freeHand, alignerWafer.destMod, alignerWafer.destSlot, freeHand) });
+                            }
                         }
                     }
                     else
@@ -1206,7 +1212,11 @@ namespace Venus_RT.Modules
                             }
                             else if (emptyAndReadyIn20sPMs.Contains(robotWafers.First().destMod))
                             {
-                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, robotWafers.First().currentSlot, robotWafers.First().destMod, robotWafers.First().destSlot, (Hand)(robotWafers.First().currentSlot)) });
+                                var pmTask = _dictModuleTask[robotWafers.First().destMod] as VenusPMTask;
+                                if (pmTask.ReadyMoveIn(robotWafers.First()))
+                                {
+                                    _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, robotWafers.First().currentSlot, robotWafers.First().destMod, robotWafers.First().destSlot, (Hand)(robotWafers.First().currentSlot)) });
+                                }   
                             }
                         }
                         else if (ModuleHelper.IsLoadPort(robotWafers.First().destMod) && _dictModuleTask[robotWafers.First().destMod].Scheduler.IsAvailable)
@@ -1231,7 +1241,11 @@ namespace Venus_RT.Modules
                         }
                         else if (emptyAndReadyIn20sPMs.Contains(wafer.destMod))
                         {
-                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
+                            var pmTask = _dictModuleTask[wafer.destMod] as VenusPMTask;
+                            if (pmTask.ReadyMoveIn(wafer))
+                            {
+                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
+                            }
                         }
                     }
                     else if (ModuleHelper.IsLoadPort(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsAvailable)
@@ -1267,9 +1281,14 @@ namespace Venus_RT.Modules
                         var alignerWafer = _lstWaferTasks.Find(wt => ModuleHelper.IsAligner(wt.currentMod));
                         if(emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
                         {
-                            // move aligner wafer to PM
                             _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, 0, ModuleName.TMRobot, (int)validHand, validHand) });
-                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand, alignerWafer.destMod, alignerWafer.destSlot, validHand) });
+
+                            // move aligner wafer to PM
+                            var pmTask = _dictModuleTask[alignerWafer.destMod] as VenusPMTask;
+                            if (pmTask.ReadyMoveIn(alignerWafer))
+                            {
+                                _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand, alignerWafer.destMod, alignerWafer.destSlot, validHand) });
+                            }
                         }
                     }
                     else
@@ -1300,7 +1319,11 @@ namespace Venus_RT.Modules
                     }
                     else if (emptyAndReadyIn20sPMs.Contains(wafer.destMod))
                     {
-                        _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
+                        var pmTask = _dictModuleTask[wafer.destMod] as VenusPMTask;
+                        if (pmTask.ReadyMoveIn(wafer))
+                        {
+                            _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
+                        }
                     }
                 }
                 else if (ModuleHelper.IsLoadPort(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsAvailable)
@@ -1825,12 +1848,12 @@ namespace Venus_RT.Modules
                                             temperature,
                                             wafer.InnerId,
                                             recipeName,
-                                            wafer.ProcessJob.Sequence.WTWCleanRecipe,
+                                            String.Empty,
                                             wafer.ProcessJob.Sequence.LLInOutPath,
                                             wafer.ProcessJob.Sequence.LLDelayTime,
                                             IsSequenceNeedAlign(wafer.ProcessJob.Sequence),
-                                            wafer.ProcessJob.Sequence.WTWCleanRecipe,  // pre clean
-                                            wafer.ProcessJob.Sequence.WTWCleanRecipe);  // post clean
+                                            wafer.ProcessJob.Sequence.PreWaferCleanRecipe,  // pre clean
+                                            wafer.ProcessJob.Sequence.PostWaferCleanRecipe);  // post clean
 
             waferTask.OnWaferArrived += WaferArrived;
             waferTask.OnWaferLeaved += WaferLeaved;