Browse Source

Force Loadlock cooling while return wafer.

sangwq 7 months ago
parent
commit
d449c55208
1 changed files with 28 additions and 7 deletions
  1. 28 7
      Venus/Venus_RT/Modules/SystemDispatcher.cs

+ 28 - 7
Venus/Venus_RT/Modules/SystemDispatcher.cs

@@ -894,6 +894,7 @@ namespace Venus_RT.Modules
         private Dictionary<ModuleName, ModuleTask> _dictModuleTask = new Dictionary<ModuleName, ModuleTask>();
         private Queue<WaferInfo> _qeReturnWafers = new Queue<WaferInfo>();
         private Queue<Guid> _qeWaitInWafers = new Queue<Guid>();
+        private Queue<ModuleName> _qeWaitCoolingLLs = new Queue<ModuleName>();
 
         private Queue<List<MoveItem>> _efemSchdActions = new Queue<List<MoveItem>>();
         private Queue<List<MoveItem>> _tmSchdActions = new Queue<List<MoveItem>>();
@@ -1561,6 +1562,7 @@ namespace Venus_RT.Modules
             LP2InUseRecipes.Clear();
             LP3InUseRecipes.Clear();
             _qePollingJobs.Clear();
+            _qeWaitCoolingLLs.Clear();
             _cycleState = RState.End;
         }
 
@@ -1666,14 +1668,20 @@ namespace Venus_RT.Modules
                     if (!wafer.IsEmpty)
                         systemWaferCount++;
                 }
-                //if (ModuleHelper.IsLoadLock(mod.Key) && _dictModuleTask[mod.Key].HasWafer)
-                //{
-                //    (_dictModuleTask[mod.Key] as LoadlockTask).Cooling();
-                //}
             }
+
             if (systemWaferCount == 0)
                 return RState.End;
 
+            if(_qeWaitCoolingLLs.Count > 0 && _dictModuleTask[_qeWaitCoolingLLs.First()].IsIdle) 
+            {
+                if ((_dictModuleTask[_qeWaitCoolingLLs.First()] as LoadlockTask).Cooling())
+                {
+                    _qeWaitCoolingLLs.Dequeue();
+                    return RState.Running;
+                }
+            }
+
             ReturnVacWafers();
             ReturnAtmWafers();
 
@@ -4778,7 +4786,7 @@ namespace Venus_RT.Modules
                 return;
 
             var hands = GetTMFreeHand();
-            var lls = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && !IsLLReservedByEFEM(mod.Key) && mod.Value.Scheduler.IsIdle && mod.Value.Scheduler.IsInclude && GetLLWaferExistance(mod.Key).emptySlots.Count > 0).OrderByDescending(mod => GetLLReadyInOutSlots(mod.Key).emptySlot.Count);
+            var lls = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && !IsLLReservedByEFEM(mod.Key) && !_qeWaitCoolingLLs.Contains(mod.Key) && mod.Value.Scheduler.IsIdle && mod.Value.Scheduler.IsInclude && GetLLWaferExistance(mod.Key).emptySlots.Count > 0).OrderByDescending(mod => GetLLReadyInOutSlots(mod.Key).emptySlot.Count);
             if (lls.Count() > 0)
             {
                 // return robot wafers
@@ -4862,7 +4870,8 @@ namespace Venus_RT.Modules
             }
 
             // return Loadlock wafer
-            var lls = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && !IsLLReservedByTM(mod.Key) && mod.Value.Scheduler.IsIdle && GetLLWaferExistance(mod.Key).wafers.Count > 0).OrderByDescending(mod => GetLLWaferExistance(mod.Key).wafers.Count);
+            var lls = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && !IsLLReservedByTM(mod.Key) && !_qeWaitCoolingLLs.Contains(mod.Key) && mod.Value.Scheduler.IsIdle && GetLLWaferExistance(mod.Key).wafers.Count > 0).OrderByDescending(mod => GetLLWaferExistance(mod.Key).wafers.Count);
+
             if (lls.Count() > 0)
             {
                 int returnCount = 0;
@@ -4931,9 +4940,15 @@ namespace Venus_RT.Modules
 
                     var nextModule = nextActions.First().Module;
 
-                    if (ModuleHelper.IsLoadLock(nextModule) && !_dictModuleTask[nextModule].IsIdle && _dictModuleTask[nextModule].Status != ModuleStatus.StartCooling)
+                    if (ModuleHelper.IsLoadLock(nextModule) && !_dictModuleTask[nextModule].IsIdle)
                         return;
 
+                    var llActions = _curTmAction.Find(ac => ModuleHelper.IsLoadLock(ac.DestinationModule));
+                    if(llActions != null && !_qeWaitCoolingLLs.Contains(llActions.DestinationModule) && !RouteManager.IsATMMode)
+                    {
+                        _qeWaitCoolingLLs.Enqueue(llActions.DestinationModule);
+                    }
+
                     _curTmAction = _tmSchdActions.Dequeue();
 
                     tmRobot.SendMoveItems(_curTmAction.ToArray());
@@ -4941,6 +4956,12 @@ namespace Venus_RT.Modules
             }
             else if (_curTmAction.Count >= 0 && isReturnActionsDone(_curTmAction)) // all scheduled actions done
             {
+                var llActions = _curTmAction.Find(ac => ModuleHelper.IsLoadLock(ac.DestinationModule));
+                if (llActions != null && !_qeWaitCoolingLLs.Contains(llActions.DestinationModule) && !RouteManager.IsATMMode)
+                {
+                    _qeWaitCoolingLLs.Enqueue(llActions.DestinationModule);
+                }
+
                 _curTmAction.Clear();
             }
         }