瀏覽代碼

optimize routing algorithm.

sangwq 9 月之前
父節點
當前提交
02266cbd46
共有 1 個文件被更改,包括 28 次插入32 次删除
  1. 28 32
      Venus/Venus_RT/Modules/SystemDispatcher.cs

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

@@ -856,6 +856,7 @@ namespace Venus_RT.Modules
         private List<WaferTask> _lstWaferTasks = new List<WaferTask>();
         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<List<MoveItem>> _efemSchdActions = new Queue<List<MoveItem>>();
         private Queue<List<MoveItem>> _tmSchdActions = new Queue<List<MoveItem>>();
@@ -1391,6 +1392,7 @@ namespace Venus_RT.Modules
             _lpThroughput = new Dictionary<ModuleName, float> { { ModuleName.LP1, 0 }, { ModuleName.LP2, 0 }, { ModuleName.LP3, 0 } };
 
             _lstWaferTasks.Clear();
+            _qeWaitInWafers.Clear();
             _tmSchdActions.Clear();
             _curTmAction.Clear();
             _efemSchdActions.Clear();
@@ -2186,6 +2188,7 @@ namespace Venus_RT.Modules
             waferTask.OnWaferLeaved += WaferLeaved;
 
             _lstWaferTasks.Add(waferTask);
+            _qeWaitInWafers.Enqueue(wafer.InnerId);
         }
 
         private void ReDispatchBlockingWafers()
@@ -2210,45 +2213,40 @@ namespace Venus_RT.Modules
 
         private bool ForwardATMWafers(ModuleName ll)
         {
-            var emptySlots = _LLSlotInOutOption == LLSlotInOutOpt.AllInAllOut ? GetLLReadyInOutSlots(ll).emptySlot : GetLLFixedReadyInOutSlots(ll).eInSlot;
+            if (_qeWaitInWafers.Count == 0)
+                return false;
+
+            var emptySlots = GetLLReadyInOutSlots(ll).emptySlot;
             var atmWafers = _lstWaferTasks.Where(wafer => (wafer.movingStatus == RState.End ||wafer.movingStatus == RState.Init) && (ModuleHelper.IsEFEMRobot(wafer.currentMod) || ModuleHelper.IsAligner(wafer.currentMod))).ToList();
             var notAlignedWafer = atmWafers.Where(wafer => !wafer.IsAligned).ToList();
-            var readyInWafers = _lstWaferTasks.Where(wafer => ModuleHelper.IsLoadPort(wafer.currentMod) && IsCtrlJobExecuting(wafer.currentMod) && wafer.movingStatus == RState.Init && wafer.pressureStatus == RState.Init && CanWaferGotoLL(wafer, ll)).OrderBy(wafer => wafer.currentSlot).ToArray();
             var freeHands = GetEFEMFreeHand();
+            var waitInWafer = _lstWaferTasks.Find(wt => wt.waferId == _qeWaitInWafers.First());
 
-            if ((atmWafers.Count >= 2 && !atmWafers.Exists(wafer => !wafer.IsAligned)) || freeHands.Count == 0 || readyInWafers.Length == 0)
+            if (atmWafers.Count >= 2 && freeHands.Count == 0 || waitInWafer == null)
                 return false;
 
-            // force all wafer aligned
-            if (notAlignedWafer.Count > 0 && _lstWaferTasks.Count(wafer => ModuleHelper.IsAligner(wafer.currentMod)) == 0)
+            // do not need pass by aligner
+            if (waitInWafer.IsAligned)
             {
-                notAlignedWafer.First().RouteTo(ModuleName.Aligner1, 0);
-                _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(notAlignedWafer.First().currentMod, notAlignedWafer.First().currentSlot, ModuleName.Aligner1, 0, (Hand)notAlignedWafer.First().currentSlot) });
-            }
-            // forward aligner wafer
-            else if (atmWafers.Count == 1 && emptySlots.Count >= 2 && ModuleHelper.IsAligner(atmWafers.First().currentMod) && freeHands.Count > 1)
-            {
-                atmWafers.First().RouteTo(ModuleName.EfemRobot, (int)freeHands[1]);
-
-                _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(atmWafers.First().currentMod, atmWafers.First().currentSlot, ModuleName.EfemRobot, (int)freeHands[1], freeHands[1]) });
+                _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(waitInWafer.currentMod, waitInWafer.currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
+                _qeWaitInWafers.Dequeue();
             }
-            // forward one wafer
-            else if ((readyInWafers.Length > 0) && (atmWafers.Count == 0 || (atmWafers.Count == 1 && emptySlots.Count >= 2)))
+            else
             {
-                if(readyInWafers[0].IsAligned)
+                if (atmWafers.Count == 0)
                 {
-                    // pick from LP
-                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyInWafers[0].currentMod, readyInWafers[0].currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
+                    // push one wafer to aligner
+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(waitInWafer.currentMod, waitInWafer.currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[0], ModuleName.Aligner1, 0, freeHands[0]) });
+                    _qeWaitInWafers.Dequeue();
                 }
-                else if(!_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod)))
+                else if (_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod)) && freeHands.Count == 2)
                 {
-                    readyInWafers[0].RouteTo(ModuleName.Aligner1, 0);
-
-                    // pick from LP
-                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyInWafers[0].currentMod, readyInWafers[0].currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
-
-                    // place to aligner
-                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[0], ModuleName.Aligner1, 0, freeHands[0]) });
+                    // forward another wafer to aligner
+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(waitInWafer.currentMod, waitInWafer.currentSlot, ModuleName.EfemRobot, (int)freeHands[1], freeHands[1]) });
+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.Aligner1, 0, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
+                    _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[1], ModuleName.Aligner1, 0, freeHands[1]) });
+                    _qeWaitInWafers.Dequeue();
                 }
             }
 
@@ -2522,7 +2520,8 @@ namespace Venus_RT.Modules
 
                 if (needAlign)
                 {
-                    if (atmWaferCount == 0 || (atmWaferCount == 1 && inLLWaferStatus.emptySlot.Count == 2 && _efemRobotSingleArmOption == 0))
+                    if (atmWaferCount == 0 ||
+                        (inLLModule.ReayForEfemInTime(20) && Math.Min(validHands, inLLWaferStatus.emptySlot.Count) > atmWaferCount))
                     {
                         if (ForwardATMWafers(inLL))
                             return;
@@ -2538,10 +2537,7 @@ namespace Venus_RT.Modules
                 }
 
                 if (inLLModule.ReayForEfemInTime(5) &&
-                    inLLWaferStatus.emptySlot.Count > 0 && atmWaferCount > 0 &&
-                    (inLLWaferStatus.emptySlot.Count == atmWaferCount ||
-                        !_lstWaferTasks.Exists(wt => ModuleHelper.IsLoadPort(wt.currentMod) && ModuleHelper.IsPm(wt.destMod)) ||
-                        _efemRobotSingleArmOption != 0))
+                    (Math.Min(validHands, inLLWaferStatus.emptySlot.Count) == atmWaferCount || _qeWaitInWafers.Count == 0))
                 {
                     if (ExchangeWaferWithLL(inLL))
                         return;