Преглед на файлове

enhance the pause function and fix the atm prepare pressure bugs.

sangwq преди 1 година
родител
ревизия
694c2524ad
променени са 2 файла, в които са добавени 70 реда и са изтрити 56 реда
  1. 69 55
      Venus/Venus_RT/Modules/AutoCycle.cs
  2. 1 1
      Venus/Venus_RT/Modules/Schedulers/SchedulerTMRobot.cs

+ 69 - 55
Venus/Venus_RT/Modules/AutoCycle.cs

@@ -171,7 +171,6 @@ namespace Venus_RT.Modules
 
 
             DATA.Subscribe("Scheduler.PjIdList", () => Array.ConvertAll(_lstProcessJobs.ToArray(), x => x.InnerId.ToString()).ToList());
-
             DATA.Subscribe("Scheduler.PjNameList", () => Array.ConvertAll(_lstProcessJobs.ToArray(), x => x.LotName.ToString()).ToList());
 
         }
@@ -469,7 +468,7 @@ namespace Venus_RT.Modules
             ControlJobInfo cj = _lstControlJobs.Find(x => x.Name == jobName);
             if (cj == null)
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"resume job rejected, not found job with id {jobName}");
+                //LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"resume job rejected, not found job with id {jobName}");
                 return;
             }
 
@@ -487,7 +486,7 @@ namespace Venus_RT.Modules
             ControlJobInfo cj = _lstControlJobs.Find(x => x.Name == jobName);
             if (cj == null)
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"pause job rejected, not found job with id {jobName}");
+                //LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"pause job rejected, not found job with id {jobName}");
                 return;
             }
 
@@ -497,7 +496,9 @@ namespace Venus_RT.Modules
             }
             _faCallback.JobPaused(cj, GetFirstProcessJob(cj));
 
-            _cycleState = RState.Paused;
+
+            if (!_lstControlJobs.Exists(job => job.State == EnumControlJobState.Executing))
+                _cycleState = RState.Paused;
         }
 
 
@@ -585,13 +586,13 @@ namespace Venus_RT.Modules
                 return false;
             }
 
-            if(WaferManager.Instance.CheckNoWafer(SourceModule, SourceSlot))
+            if (WaferManager.Instance.CheckNoWafer(SourceModule, SourceSlot))
             {
                 LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"Can not return wafer as {SourceModule} {SourceSlot} has no wafer");
                 return false;
             }
 
-            if(!_vacSchedulers.Keys.Contains(SourceModule) || !_vacSchedulers[SourceModule].IsIdle)
+            if (!_vacSchedulers.Keys.Contains(SourceModule) || !_vacSchedulers[SourceModule].IsIdle)
             {
                 LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"The module: {SourceModule} is not ready for return wafer");
                 return false;
@@ -599,7 +600,7 @@ namespace Venus_RT.Modules
 
             var wafer = WaferManager.Instance.GetWafer(SourceModule, SourceSlot);
             LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"Manual return  wafer: {wafer.WaferOrigin} at {SourceModule} {SourceSlot} while system is auto running");
-            
+
             _lstReturnWafers.Add(wafer.InnerId);
             return true;
         }
@@ -1029,7 +1030,7 @@ namespace Venus_RT.Modules
             {
                 for (int i = 0; i < 2; i++)
                 {
-                    if (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, i))
+                    if (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, i) && IsWaferCtrlJobRuning(ModuleName.TMRobot, i))
                     {
                         if (SearchWaferDestination(new SlotItem(ModuleName.TMRobot, i), out SlotItem destSlot))
                         {
@@ -1237,7 +1238,7 @@ namespace Venus_RT.Modules
 
                 if (ModuleHelper.IsPm(module.Key) && _vacSchedulers[module.Key].IsAvailable && _vacModules[module.Key].MovingStatus == MovingStatus.Idle)
                 {
-                    if (WaferManager.Instance.CheckHasWafer(module.Key, 0))
+                    if (IsWaferCtrlJobRuning(module.Key, 0))
                     {
                         if (SearchOutLLSlot(module.Key, ll, out SlotItem outSlot))
                         {
@@ -1263,7 +1264,7 @@ namespace Venus_RT.Modules
                 if (inWaferCount >= 2)
                     break;
 
-                if (SearchValidInPM(ll, slot, out SlotItem inSlot))
+                if (IsWaferCtrlJobRuning(ll, slot) && SearchValidInPM(ll, slot, out SlotItem inSlot))
                 {
                     inWaferCount++;
                     _movingItems.Add(new MoveItem(ll, slot, inSlot.Module, inSlot.Slot, Hand.None));
@@ -1286,24 +1287,24 @@ namespace Venus_RT.Modules
                 return false;
 
             Queue<SlotItem> returnSlots = new Queue<SlotItem>();
-            for(int i = 0;  i< 2; i++)
+            for (int i = 0; i < 2; i++)
             {
-                if(WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, i))
+                if (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, i))
                 {
                     var wafer_id = WaferManager.Instance.GetWafer(ModuleName.TMRobot, 0).InnerId;
-                    if(_lstReturnWafers.FindIndex(item => item == wafer_id) != -1)
+                    if (_lstReturnWafers.FindIndex(item => item == wafer_id) != -1)
                     {
                         returnSlots.Enqueue(new SlotItem(ModuleName.TMRobot, i));
                     }
                 }
             }
 
-            foreach(var mod in _vacModules)
+            foreach (var mod in _vacModules)
             {
-                if(ModuleHelper.IsPm(mod.Key) && WaferManager.Instance.CheckHasWafer(mod.Key, 0) && _vacSchedulers[mod.Key].IsIdle)
+                if (ModuleHelper.IsPm(mod.Key) && WaferManager.Instance.CheckHasWafer(mod.Key, 0) && _vacSchedulers[mod.Key].IsIdle)
                 {
                     var wafer_id = WaferManager.Instance.GetWafer(mod.Key, 0).InnerId;
-                    if(_lstReturnWafers.FindIndex(item => item == wafer_id) != -1)
+                    if (_lstReturnWafers.FindIndex(item => item == wafer_id) != -1)
                     {
                         returnSlots.Enqueue(new SlotItem(mod.Key, 0));
                     }
@@ -1321,17 +1322,17 @@ namespace Venus_RT.Modules
             {
                 destLL = ModuleName.LLA;
             }
-            else if(IsLoadReadyForTM(ModuleName.LLB) && llbSlotStatus.empty > 0)
+            else if (IsLoadReadyForTM(ModuleName.LLB) && llbSlotStatus.empty > 0)
             {
                 destLL = ModuleName.LLB;
             }
 
-            if(destLL != ModuleName.System)
+            if (destLL != ModuleName.System)
             {
                 int slotNumber = destLL == ModuleName.LLA ? _LLASlotNumber : _LLBSlotNumber;
-                for(int i = 0; i < slotNumber; i++)
+                for (int i = 0; i < slotNumber; i++)
                 {
-                    if(WaferManager.Instance.CheckNoWafer(destLL, i))
+                    if (WaferManager.Instance.CheckNoWafer(destLL, i))
                     {
                         if (_movingItems.Count >= 2 || returnSlots.Count == 0)
                             break;
@@ -1359,31 +1360,31 @@ namespace Venus_RT.Modules
 
             var llaSlotStatus = GetLLProcessStatusCount(ModuleName.LLA);
             var llbSlotStatus = GetLLProcessStatusCount(ModuleName.LLB);
-            if(LLInOutPath == SequenceLLInOutPath.AInBOut || LLInOutPath == SequenceLLInOutPath.BInAOut)
+            if (LLInOutPath == SequenceLLInOutPath.AInBOut || LLInOutPath == SequenceLLInOutPath.BInAOut)
             {
                 ModuleName InModule = LLInOutPath == SequenceLLInOutPath.AInBOut ? ModuleName.LLA : ModuleName.LLB;
                 ModuleName OutModule = LLInOutPath == SequenceLLInOutPath.AInBOut ? ModuleName.LLB : ModuleName.LLA;
                 int InNumber = Math.Min(InModule == ModuleName.LLA ? llaSlotStatus.unprocessed : llbSlotStatus.unprocessed, pmSlotStaus.Empty);
-                int OutNumber = Math.Min(OutModule == ModuleName.LLA ? llaSlotStatus.empty : llbSlotStatus.empty,  pmSlotStaus.Processed);
+                int OutNumber = Math.Min(OutModule == ModuleName.LLA ? llaSlotStatus.empty : llbSlotStatus.empty, pmSlotStaus.Processed);
 
                 if (InNumber + OutNumber == 0)
                     return;
 
-                if(IsLoadReadyForTM(InModule) && (!IsLoadReadyForTM(OutModule) || (!_vacSchedulers[OutModule].IsVac && InNumber == OutNumber) || InNumber > OutNumber))
+                if (IsLoadReadyForTM(InModule) && (!IsLoadReadyForTM(OutModule) || (!_vacSchedulers[OutModule].IsVac && InNumber == OutNumber) || InNumber > OutNumber))
                 {
                     // move in wafer
                     ForwardLLWaferToPMs(InModule);
                 }
-                else if(IsLoadReadyForTM(OutModule) && OutNumber > 0)
+                else if (IsLoadReadyForTM(OutModule) && OutNumber > 0)
                 {
                     // move out wafer
                     ForwardPMsWaferToLL(OutModule);
                 }
             }
-            else if(LLInOutPath == SequenceLLInOutPath.AInAOut || LLInOutPath == SequenceLLInOutPath.BInBOut)
+            else if (LLInOutPath == SequenceLLInOutPath.AInAOut || LLInOutPath == SequenceLLInOutPath.BInBOut)
             {
                 ModuleName loadlock = LLInOutPath == SequenceLLInOutPath.AInAOut ? ModuleName.LLA : ModuleName.LLB;
-                if(IsLoadReadyForTM(loadlock))
+                if (IsLoadReadyForTM(loadlock))
                 {
                     // switch wafer
                     ExchangeLLWafersWithPMs(loadlock);
@@ -1399,13 +1400,13 @@ namespace Venus_RT.Modules
                 int llbInNumber = Math.Min(Math.Min(llbSlotStatus.unprocessed, 2), pmSlotStaus.Empty + llbOutNumber);
                 int llbExchangeNumber = llbOutNumber + llbInNumber;
 
-                if (IsLoadReadyForTM(ModuleName.LLA) && ((!_vacSchedulers[ModuleName.LLB].IsVac && llaExchangeNumber == llbExchangeNumber) || 
-                                                                        (llaExchangeNumber > llbExchangeNumber) || 
+                if (IsLoadReadyForTM(ModuleName.LLA) && ((!_vacSchedulers[ModuleName.LLB].IsVac && llaExchangeNumber == llbExchangeNumber) ||
+                                                                        (llaExchangeNumber > llbExchangeNumber) ||
                                                                         (!IsLoadReadyForTM(ModuleName.LLB) && llaExchangeNumber > 0)))
                 {
                     ExchangeLLWafersWithPMs(ModuleName.LLA);
                 }
-                else if(IsLoadReadyForTM(ModuleName.LLB) && llbExchangeNumber > 0)
+                else if (IsLoadReadyForTM(ModuleName.LLB) && llbExchangeNumber > 0)
                 {
                     ExchangeLLWafersWithPMs(ModuleName.LLB);
                 }
@@ -1458,7 +1459,7 @@ namespace Venus_RT.Modules
                                     var pmScheduler = _vacSchedulers[mod.Key] as SchedulerPM;
                                     string WTWCleanRecipe = string.Empty;
                                     var wtwJob = _lstControlJobs.Find(cj => cj.JetState == EnumJetCtrlJobState.Processing && IsCtrlJobNeedWTWClean(cj, mod.Key, out WTWCleanRecipe) && !IsAllJobWaferProcessedOrProcessing(cj));
-                                    if(wtwJob != null && WTWCleanRecipe.Length > 0) 
+                                    if (wtwJob != null && WTWCleanRecipe.Length > 0)
                                     {
                                         _waitWTWCleanPMs.Add(mod.Key);
                                     }
@@ -1477,15 +1478,15 @@ namespace Venus_RT.Modules
                                     var pmScheduler = _vacSchedulers[mod.Key] as SchedulerPM;
                                     if (IsPMKeepEmpty(mod.Key))
                                     {
-                                        if(_waitPreCleanPMs.Contains(mod.Key))
+                                        if (_waitPreCleanPMs.Contains(mod.Key))
                                         {
                                             mod.Value.MovingStatus = MovingStatus.WaitPreJobClean;
                                         }
-                                        else if(_lstControlJobs.FindIndex(cj => cj.JetState == EnumJetCtrlJobState.PostJobClean) != -1 &&  _waitPostCleanPMs.Contains(mod.Key))
+                                        else if (_lstControlJobs.FindIndex(cj => cj.JetState == EnumJetCtrlJobState.PostJobClean) != -1 && _waitPostCleanPMs.Contains(mod.Key))
                                         {
                                             mod.Value.MovingStatus = MovingStatus.WaitPostJobClean;
                                         }
-                                        else if(pmScheduler.RunIdleCleanTask())  // Check Idle Clean
+                                        else if (pmScheduler.RunIdleCleanTask())  // Check Idle Clean
                                         {
                                             mod.Value.MovingStatus = MovingStatus.StartIdleClean;
                                         }
@@ -1536,7 +1537,7 @@ namespace Venus_RT.Modules
                                     {
                                         string WTWCleanRecipe = string.Empty;
                                         var wtwJob = _lstControlJobs.Find(cj => cj.JetState == EnumJetCtrlJobState.Processing && IsCtrlJobNeedWTWClean(cj, mod.Key, out WTWCleanRecipe) && !IsAllJobWaferProcessedOrProcessing(cj));
-                                        if (wtwJob != null && WTWCleanRecipe.Length > 0) 
+                                        if (wtwJob != null && WTWCleanRecipe.Length > 0)
                                         {
                                             if (pmScheduler.RunJobCleanTask(WTWCleanRecipe))
                                             {
@@ -1624,7 +1625,7 @@ namespace Venus_RT.Modules
         #region Atm System
         private void driveAtmSystem()
         {
-            if(_efemMovingItems.Count == 0 && _efemRobot.IsAvailable && _efemRobot.RobotStatus != RState.Running)
+            if (_efemMovingItems.Count == 0 && _efemRobot.IsAvailable && _efemRobot.RobotStatus != RState.Running)
             {
                 PumpingEFEMRobotTask();
                 RuningEFEMRobotTask();
@@ -1651,14 +1652,14 @@ namespace Venus_RT.Modules
             }
 
             var lls = _atmSchedulers.Where(x => ModuleHelper.IsLoadLock(x.Key) && x.Value.IsAvailable && !IsLoadLockReservedByTM(x.Key)).ToDictionary(k => k.Key, v => v.Value);
-            foreach(var ll in lls)
+            foreach (var ll in lls)
             {
                 if (ProcessLLEFEMRobotTask(ll.Key))
                     return;
             }
 
             var lps = _atmSchedulers.Where(x => ModuleHelper.IsLoadPort(x.Key) && x.Value.IsAvailable).ToDictionary(k => k.Key, v => v.Value);
-            foreach(var lp in lps)
+            foreach (var lp in lps)
             {
                 if (ProcessLPEFEMRobotTask(lp.Key))
                     return;
@@ -1698,13 +1699,10 @@ namespace Venus_RT.Modules
 
         bool IsAtmWaferReadyOut(ModuleName mod, int slot)
         {
-            var wafer = WaferManager.Instance.GetWafer(mod, slot);
-
-            if (wafer.IsEmpty)
+            if (!IsWaferCtrlJobRuning(mod, slot))
                 return false;
 
-            if (wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
-                return false;
+            var wafer = WaferManager.Instance.GetWafer(mod, slot);
 
             if (_lstReturnWafers.Contains(wafer.InnerId))
                 return false;
@@ -1793,7 +1791,7 @@ namespace Venus_RT.Modules
             List<ModuleName> usedPMs = GetPmUsedInRunningPj();
             foreach (var module in _vacModules)
             {
-                if (ModuleHelper.IsPm(module.Key) && ((_vacSchedulers[module.Key].IsOnline && usedPMs.Contains(module.Key)) || _cycleState == RState.End ))
+                if (ModuleHelper.IsPm(module.Key) && ((_vacSchedulers[module.Key].IsOnline && usedPMs.Contains(module.Key)) || _cycleState == RState.End))
                 {
                     if (WaferManager.Instance.CheckHasWafer(module.Key, 0))
                         exist++;
@@ -1815,11 +1813,11 @@ namespace Venus_RT.Modules
                 if (ModuleHelper.IsPm(module.Key) && usedPMs.Contains(module.Key) && _vacSchedulers[module.Key].IsAvailable && _vacModules[module.Key].MovingStatus == MovingStatus.Idle)
                 {
                     var wafer = WaferManager.Instance.GetWafer(module.Key, 0);
-                    if(wafer.IsEmpty)
+                    if (wafer.IsEmpty)
                     {
                         Empty++;
                     }
-                    else if(wafer.ProcessState == EnumWaferProcessStatus.Completed)
+                    else if (wafer.ProcessState == EnumWaferProcessStatus.Completed)
                     {
                         Processed++;
                     }
@@ -2295,7 +2293,7 @@ namespace Venus_RT.Modules
             if (_lstReturnWafers.Count == 0)
                 return false;
 
-            for(int i = 0; i < 2; i++)
+            for (int i = 0; i < 2; i++)
             {
                 if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, i))
                 {
@@ -2315,12 +2313,12 @@ namespace Venus_RT.Modules
             foreach (var ll in lls)
             {
                 int slotNumber = ll.Key == ModuleName.LLA ? _LLASlotNumber : _LLBSlotNumber;
-                for(int i = 0; i < slotNumber; i++)
+                for (int i = 0; i < slotNumber; i++)
                 {
                     if (_efemMovingItems.Count >= 2)
                         return true;
 
-                    if(WaferManager.Instance.CheckHasWafer(ll.Key, i))
+                    if (WaferManager.Instance.CheckHasWafer(ll.Key, i))
                     {
                         var wafer = WaferManager.Instance.GetWafer(ll.Key, i);
                         var robotHand = GetEFEMRobotFreeHand();
@@ -2392,7 +2390,7 @@ namespace Venus_RT.Modules
                             if (!string.IsNullOrEmpty(recipeName))
                             {
                                 var recipeContent =
-                                    RecipeFileManager.Instance.LoadRecipe($"{module}", recipeName, false,"Process");
+                                    RecipeFileManager.Instance.LoadRecipe($"{module}", recipeName, false, "Process");
                                 if (string.IsNullOrEmpty(recipeContent))
                                 {
                                     reason = $"Can not find recipe file{recipeName}";
@@ -2522,13 +2520,13 @@ namespace Venus_RT.Modules
                         else
                         {
                             var curItem = _movingItems.Find(item => item.DestinationModule == tar.Key.Module && item.DestinationSlot == tar.Key.Slot);
-                            if(ModuleHelper.IsPm(curItem.SourceModule) && _movingItems.FindIndex(item => item.DestinationModule == curItem.SourceModule) == -1)
+                            if (ModuleHelper.IsPm(curItem.SourceModule) && _movingItems.FindIndex(item => item.DestinationModule == curItem.SourceModule) == -1)
                             {
-                                if(_waitPostCleanPMs.Contains(curItem.SourceModule))
+                                if (_waitPostCleanPMs.Contains(curItem.SourceModule))
                                 {
                                     _vacModules[curItem.SourceModule].MovingStatus = MovingStatus.WaitPostJobClean;
                                 }
-                                else if(_waitWTWCleanPMs.Contains(curItem.SourceModule))
+                                else if (_waitWTWCleanPMs.Contains(curItem.SourceModule))
                                 {
                                     _vacModules[curItem.SourceModule].MovingStatus = MovingStatus.WaitWTWClean;
                                 }
@@ -2665,9 +2663,9 @@ namespace Venus_RT.Modules
                     {
                         startJob.JetState = EnumJetCtrlJobState.PreJobClean;
                         _waitPreCleanPMs.Clear();
-                            
+
                         var PMs = GetWaitPreCleanPMsByCtrlJob(startJob);
-                        foreach(var pm in PMs)
+                        foreach (var pm in PMs)
                         {
                             _waitPreCleanPMs.Add(pm);
                         }
@@ -2696,7 +2694,7 @@ namespace Venus_RT.Modules
             }
 
             var preJobClean = _lstControlJobs.Find(job => job.JetState == EnumJetCtrlJobState.PreJobClean);
-            if(preJobClean != null && _waitPreCleanPMs.Count == 0)
+            if (preJobClean != null && _waitPreCleanPMs.Count == 0)
             {
                 preJobClean.JetState = EnumJetCtrlJobState.Processing;
 
@@ -2740,6 +2738,22 @@ namespace Venus_RT.Modules
             return false;
         }
 
+        private bool IsWaferCtrlJobRuning(ModuleName mod, int slot)
+        {
+            var wafer = WaferManager.Instance.GetWafer(mod, slot);
+
+            if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
+                return false;
+
+            var waferCtrlJob = _lstControlJobs.Find(item => (int)ModuleHelper.Converter(item.Module) == wafer.OriginStation);
+            if(waferCtrlJob != null)
+            {
+                return waferCtrlJob.State == EnumControlJobState.Executing;
+            }
+
+            return false;
+        }
+
         private bool CheckAllWaferReturned(ProcessJobInfo pj, bool checkAllProcessed)
         {
             bool allWaferReturn = true;

+ 1 - 1
Venus/Venus_RT/Modules/Schedulers/SchedulerTMRobot.cs

@@ -378,7 +378,7 @@ namespace Venus_RT.Modules.Schedulers
 
         private void PrepareLLPressure(MoveItem[] items)
         {
-            if (items.Length == 0)
+            if (items.Length == 0 || RouteManager.IsATMMode)
                 return;
 
             ModuleName firstModule = items[0].SourceModule;