Browse Source

Enhance throughput.

sangwq 1 year ago
parent
commit
74c52de151

+ 104 - 32
Venus/Venus_RT/Modules/AutoCycle.cs

@@ -684,6 +684,30 @@ namespace Venus_RT.Modules
             return false;
         }
 
+        bool SearchCanReplaceSlot(SlotItem llSlot, out SlotItem replaceSlot, out SlotItem destSlot)
+        {
+            replaceSlot = new SlotItem(ModuleName.System, -1);
+            destSlot = new SlotItem(ModuleName.System, -1);
+            var wafer = WaferManager.Instance.GetWafer(llSlot.Module, llSlot.Slot);
+            if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null || wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
+                return false;
+
+            foreach (var next_module in wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules)
+            {
+                if (!ModuleHelper.IsPm(next_module) || WaferManager.Instance.CheckNoWafer(next_module, 0))
+                    continue;
+
+                if (SearchWaferDestination(new SlotItem(next_module, 0), out destSlot))
+                {
+                    replaceSlot.Module = next_module;
+                    replaceSlot.Slot = 0;
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
         List<int> GetModuleValidSlots(ModuleName mod)
         {
             var validSlot = new List<int>();
@@ -796,10 +820,22 @@ namespace Venus_RT.Modules
             {
                 if(WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 0) || WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 1))
                 {
+                    for(int i = 0; i < 2; i++)
+                    {
+                        if (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, i))
+                        {
+                            if (SearchWaferDestination(new SlotItem(ModuleName.TMRobot, i), out SlotItem destSlot))
+                            {
+                                _movingItems.Add(new MoveItem(ModuleName.TMRobot, i, destSlot.Module, destSlot.Slot, (Hand)i));
+                                UpdateModuleMovingStatus(destSlot.Module);
+                            }
+                        }
+                    }
+
                     return;
                 }
 
-                foreach(var slot in _vacReadyOutSlots)
+                foreach (var slot in _vacReadyOutSlots)
                 {
                     if (_vacModules[slot.Key.Module].MovingStatus != MovingStatus.Idle)
                         continue;
@@ -809,27 +845,49 @@ namespace Venus_RT.Modules
                         if (IsLoadLockReservedByEFEM(slot.Key.Module))
                             continue;
 
+                        var llStatus = GetLLProcessStatusCount(slot.Key.Module);
                         if(SearchWaferDestination(slot.Key, out SlotItem destSlot))
                         {
                             _movingItems.Add(new MoveItem(slot.Key.Module, slot.Key.Slot, destSlot.Module, destSlot.Slot, Hand.None));
                             UpdateModuleMovingStatus(slot.Key.Module);
                             UpdateModuleMovingStatus(destSlot.Module);
 
-                            // check whether match double pick pattern
-                            foreach(var item in _vacReadyOutSlots)
+                            if(llStatus.Item2 > 1)
                             {
-                                if(item.Key.Module == slot.Key.Module && item.Key.Slot != slot.Key.Slot)
+                                // check whether match double pick pattern
+                                foreach (var item in _vacReadyOutSlots)
                                 {
-                                    if (SearchWaferDestination(item.Key, out SlotItem destSlot_2))
+                                    if (item.Key.Module == slot.Key.Module && item.Key.Slot != slot.Key.Slot)
                                     {
-                                        _movingItems.Add(new MoveItem(item.Key.Module, item.Key.Slot, destSlot_2.Module, destSlot_2.Slot, Hand.None));
-                                        UpdateModuleMovingStatus(item.Key.Module);
-                                        UpdateModuleMovingStatus(destSlot_2.Module);
-                                        break;
+                                        if (SearchWaferDestination(item.Key, out SlotItem destSlot_2))
+                                        {
+                                            _movingItems.Add(new MoveItem(item.Key.Module, item.Key.Slot, destSlot_2.Module, destSlot_2.Slot, Hand.None));
+                                            UpdateModuleMovingStatus(destSlot_2.Module);
+                                            break;
+                                        }
+                                    }
+                                }
+
+                                if(_movingItems.Count == 1)
+                                {
+                                    foreach (var item in _vacReadyOutSlots)
+                                    {
+                                        if (item.Key.Module == slot.Key.Module && item.Key.Slot != slot.Key.Slot)
+                                        {
+                                            if(SearchCanReplaceSlot(item.Key, out SlotItem replaceSlot, out SlotItem destSlot_2))
+                                            {
+                                                _movingItems.Add(new MoveItem(item.Key.Module, item.Key.Slot, replaceSlot.Module, replaceSlot.Slot, Hand.None));
+                                                _movingItems.Add(new MoveItem(replaceSlot.Module, replaceSlot.Slot, destSlot_2.Module, destSlot_2.Slot, Hand.None));
+                                                UpdateModuleMovingStatus(replaceSlot.Module);
+                                                UpdateModuleMovingStatus(destSlot.Module);
+                                                return;
+                                            }
+                                        }
                                     }
                                 }
                             }
 
+
                             // check whether match swap pattern
                             int inCount = 0;
                             var in_slots = SearchWaitInSlots(slot.Key.Module);
@@ -1199,10 +1257,18 @@ namespace Venus_RT.Modules
 
         private bool IsLoadLockReservedByEFEM(ModuleName ll)
         {
-            if (_efemMovingItems.Exists(item => item.DestinationModule == ll || item.SourceModule == ll))
-                return true;
+            List<ModuleName> unfinished = new List<ModuleName>();
+            foreach (var item in _atmWaferTargets)
+            {
+                var moving = _efemMovingItems.Find(m_item => m_item.DestinationModule == item.Key.Module && m_item.DestinationSlot == item.Key.Slot);
+                if (!unfinished.Contains(moving.SourceModule))
+                    unfinished.Add(moving.SourceModule);
 
-            return false;
+                if (!unfinished.Contains(moving.DestinationModule))
+                    unfinished.Add(moving.DestinationModule);
+            }
+
+            return unfinished.Contains(ll);
         }
 
         private bool IsLoadLockReservedByTM(ModuleName ll)
@@ -1267,12 +1333,14 @@ namespace Venus_RT.Modules
 
             if(_LLInOutPath == SequenceLLInOutPath.AInBOut)
             {
-                return _LLASlotNumber + pmWaferStatus.Item2 - llaWaferStatus.Item1 - llaWaferStatus.Item2 
+                return llbWaferStatus.Item1 == _LLBSlotNumber ? 0 :
+                    _LLASlotNumber + pmWaferStatus.Item2 - llaWaferStatus.Item1 - llaWaferStatus.Item2 
                     - GetTMRobotWaferCount() - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
             }
             else if(_LLInOutPath == SequenceLLInOutPath.BInAOut)
             {
-                return _LLBSlotNumber + pmWaferStatus.Item2 - llbWaferStatus.Item1 - llbWaferStatus.Item2 
+                return llaWaferStatus.Item1 == _LLASlotNumber ? 0 :
+                    _LLBSlotNumber + pmWaferStatus.Item2 - llbWaferStatus.Item1 - llbWaferStatus.Item2 
                     - GetTMRobotWaferCount() - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
             }
             else if(_LLInOutPath == SequenceLLInOutPath.AInAOut || (_LLInOutPath == SequenceLLInOutPath.DInDOut && _vacSchedulers[ModuleName.LLA].IsOnline && !_vacSchedulers[ModuleName.LLB].IsOnline))
@@ -1779,7 +1847,7 @@ namespace Venus_RT.Modules
                     if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
                         continue;
 
-                    if (wafer.InnerId == tar.Value)
+                    if (wafer.InnerId == tar.Value && _tmRobot.RobotStatus != RState.Running)
                     {
                         // wafer arrive
                         _vacWaferTargets.Remove(tar.Key);
@@ -1791,23 +1859,15 @@ namespace Venus_RT.Modules
                         {
                             _vacModules[tar.Key.Module].MovingStatus = MovingStatus.WaitProcess;
                         }
+
+                        if(!ModuleHelper.IsTMRobot(tar.Key.Module))
+                            wafer.NextSequenceStep++;
                     }
                 }
 
                 if(ModuleHelper.IsLoadLock(mod.Key))
                 {
-                    List<ModuleName> unfinished = new List<ModuleName>();
-                    foreach(var item in _vacWaferTargets)
-                    {
-                        var moving = _movingItems.Find(m_item => m_item.DestinationModule == item.Key.Module && m_item.DestinationSlot == item.Key.Slot);
-                        if (!unfinished.Contains(moving.SourceModule))
-                            unfinished.Add(moving.SourceModule);
-
-                        if (!unfinished.Contains(moving.DestinationModule))
-                            unfinished.Add(moving.DestinationModule);
-                    }
-
-                    if(!unfinished.Contains(mod.Key) && mod.Value.IsAvailable)
+                    if(!IsLoadLockReservedByTM(mod.Key) && mod.Value.IsAvailable)
                     {
                         _vacModules[mod.Key].MovingStatus = MovingStatus.Idle;
                     }
@@ -1830,7 +1890,7 @@ namespace Venus_RT.Modules
                     }
                 }
 
-                UpateSequenceStep(_movingItems);
+                //UpateSequenceStep(_movingItems);
                 _movingItems.Clear();
             }
 
@@ -1844,7 +1904,7 @@ namespace Venus_RT.Modules
                     if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
                         continue;
 
-                    if (wafer.InnerId == tar.Value)
+                    if (wafer.InnerId == tar.Value && _efemRobot.RobotStatus != RState.Running)
                     {
                         //LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"wafer {wafer.WaferOrigin}: {wafer.InnerId} arrived {tar.Key.Module}{tar.Key.Slot + 1}");
                         // wafer arrive
@@ -1858,9 +1918,19 @@ namespace Venus_RT.Modules
                         {
                             _atmModules[tar.Key.Module].MovingStatus = MovingStatus.WaitAlign;
                         }
+
+                        if (!ModuleHelper.IsEFEMRobot(tar.Key.Module))
+                            wafer.NextSequenceStep++;
                     }
                 }
 
+                if (ModuleHelper.IsLoadLock(mod.Key))
+                {
+                    if (!IsLoadLockReservedByEFEM(mod.Key) && mod.Value.IsAvailable)
+                    {
+                        _vacModules[mod.Key].MovingStatus = MovingStatus.Idle;
+                    }
+                }
             }
 
             _atmMoveFinishTrig.CLK = _atmWaferTargets.Count == 0 && _efemRobot.RobotStatus != RState.Running;
@@ -1874,12 +1944,11 @@ namespace Venus_RT.Modules
                     }
                 }
 
-                UpateSequenceStep(_efemMovingItems);
+                //UpateSequenceStep(_efemMovingItems);
                 _efemMovingItems.Clear();
             }
-            
-
         }
+
         private void PreJobClean(ControlJobInfo cj)
         {
             if (cj.IsPreJobCleanDone)
@@ -1893,6 +1962,7 @@ namespace Venus_RT.Modules
                 pm.PreJobClean();
             }
         }
+
         private bool ActiveProcessJob(ProcessJobInfo pj)
         {
             foreach (var pjSlotWafer in pj.SlotWafers)
@@ -1916,6 +1986,7 @@ namespace Venus_RT.Modules
 
             return true;
         }
+
         private void StartNewJob()
         {
             ControlJobInfo cjActived = null;
@@ -2045,6 +2116,7 @@ namespace Venus_RT.Modules
                 pm.CompleteJobClean();
             }
         }
+
         private void UpdateControlJobStatus()
         {
             if (_lstControlJobs.Count == 0)

+ 38 - 0
Venus/Venus_RT/Modules/Schedulers/SchedulerTMRobot.cs

@@ -202,6 +202,44 @@ namespace Venus_RT.Modules.Schedulers
                     {
                         PackSwapCmds(items, TMEntity.MSG.Swap, 1);
                     }
+                    else if(ModuleHelper.IsLoadLock(items[0].SourceModule) && 
+                        items[0].SourceModule == items[1].SourceModule && 
+                        ModuleHelper.IsPm(items[1].DestinationModule) &&
+                        items[1].DestinationModule == items[2].SourceModule)
+                    {
+                        SchedulerItem llDoublePick = new SchedulerItem();
+                        llDoublePick.MoveType = TMEntity.MSG.Swap;
+                        llDoublePick.target = items[0].SourceModule;
+                        llDoublePick.moveList = new Queue<MoveItem>();
+                        llDoublePick.moveList.Enqueue(new MoveItem(items[0].SourceModule, items[0].SourceSlot, ModuleName.TMRobot, 0, 0));
+                        llDoublePick.moveList.Enqueue(new MoveItem(items[1].SourceModule, items[1].SourceSlot, ModuleName.TMRobot, 1, (Hand)1));
+                        _schedulerList.Enqueue(llDoublePick);
+
+                        SchedulerItem pm1_place = new SchedulerItem();
+                        pm1_place.MoveType = TMEntity.MSG.PMPlace;
+                        pm1_place.target = items[0].DestinationModule;
+                        pm1_place.moveList = new Queue<MoveItem>();
+                        pm1_place.moveList.Enqueue(new MoveItem(ModuleName.TMRobot, 0, items[0].DestinationModule, items[0].DestinationSlot, 0));
+                        _schedulerList.Enqueue(pm1_place);
+
+                        SchedulerItem pm2_swap = new SchedulerItem();
+                        pm2_swap.MoveType = TMEntity.MSG.PMSwap;
+                        pm2_swap.target = items[2].SourceModule;
+                        pm2_swap.moveList = new Queue<MoveItem>();
+                        pm2_swap.moveList.Enqueue(new MoveItem(items[2].SourceModule, items[2].SourceSlot, ModuleName.TMRobot, 0, 0));
+                        pm2_swap.moveList.Enqueue(new MoveItem(ModuleName.TMRobot, 1, items[1].DestinationModule, items[1].DestinationSlot, (Hand)1));
+                        _schedulerList.Enqueue(pm2_swap);
+
+                        if(ModuleHelper.IsLoadLock(items[2].DestinationModule))
+                        {
+                            SchedulerItem llPlace = new SchedulerItem();
+                            llPlace.MoveType = TMEntity.MSG.Place;
+                            llPlace.target = items[2].DestinationModule;
+                            llPlace.moveList = new Queue<MoveItem>();
+                            llPlace.moveList.Enqueue(new MoveItem(ModuleName.TMRobot, 0, items[2].DestinationModule, items[2].DestinationSlot, 0));
+                            _schedulerList.Enqueue(llPlace);
+                        }
+                    }
                 }
                 else if (items.Length == 2)
                 {