Browse Source

fixed the routing bug while B In B Out.

sangwq 1 year ago
parent
commit
709c7a1c10

+ 1 - 0
Venus/Venus_Core/EventDefine.cs

@@ -75,6 +75,7 @@ namespace Aitex.Core.RT.Log{
 		ERR_MATCH = 1034,
 		ERR_MATCH = 1034,
 		WARN_MATCH = 1035,
 		WARN_MATCH = 1035,
 		INFO_MATCH = 1036,
 		INFO_MATCH = 1036,
+		INFO_RF = 1037,
 		ERR_TM = 2000,
 		ERR_TM = 2000,
 		INFO_TM = 2001,
 		INFO_TM = 2001,
 		WARN_TM = 2002,
 		WARN_TM = 2002,

+ 9 - 0
Venus/Venus_RT/Config/LogDefine.json

@@ -667,6 +667,15 @@
     "Note": "MATCH Info"
     "Note": "MATCH Info"
   },
   },
   {
   {
+    "Id": 1037,
+    "Level": "Info",
+    "LogEnum": "INFO_RF",
+    "GlobalDescription_zh": "RF info: {0}",
+    "GlobalDescription_en": "RF info: {0}",
+    "Module": "PM",
+    "Note": "RF info"
+  },
+  {
     "Id": 2000,
     "Id": 2000,
     "Level": "Error",
     "Level": "Error",
     "LogEnum": "ERR_TM",
     "LogEnum": "ERR_TM",

+ 7 - 7
Venus/Venus_RT/Devices/CometRF.cs

@@ -535,28 +535,28 @@ namespace Venus_RT.Devices
                     switch (value)
                     switch (value)
                     {
                     {
                         case 0:
                         case 0:
-                            LOG.Write(eEvent.ERR_RF, Module, $"{Module} [{Display} Read] Device is not ready");
+                            LOG.Write(eEvent.WARN_RF, Module, $"{Module} [{Display} Read] Device is not ready");
                             break;
                             break;
                         case 1:
                         case 1:
-                            //LOG.Info($"{Module} [{Display} Read] Device is ready, RF is off");
+                            LOG.Write(eEvent.INFO_RF, Module, $"{Module} [{Display} Read] Device is ready, RF is off");
                             Status = GeneratorStatus.OFF;
                             Status = GeneratorStatus.OFF;
                             break;
                             break;
                         case 2:
                         case 2:
-                            //LOG.Info($"{Module} [{Display} Read] Device is active, RF is on");
+                            LOG.Write(eEvent.INFO_RF, Module, $"{Module} [{Display} Read] Device is active, RF is on");
                             Status = GeneratorStatus.ON;
                             Status = GeneratorStatus.ON;
                             break;
                             break;
                         case 3:
                         case 3:
-                            //LOG.Info($"{Module} [{Display} Read] Device is in error state");
+                            LOG.Write(eEvent.ERR_RF, Module, $"{Module} [{Display} Read] Device is in error state");
                             Status = GeneratorStatus.ERROR;
                             Status = GeneratorStatus.ERROR;
                             break;
                             break;
                         case 4:
                         case 4:
-                            //LOG.Info($"{Module} [{Display} Read] Device is in calibration state");
+                            LOG.Write(eEvent.INFO_RF, Module, $"{Module} [{Display} Read] Device is in calibration state");
                             break;
                             break;
                         case 5:
                         case 5:
-                            //LOG.Info($"{Module} [{Display} Read] Device is waiting for firmware update");
+                            LOG.Write(eEvent.INFO_RF, Module, $"{Module} [{Display} Read] Device is waiting for firmware update");
                             break;
                             break;
                         case 6:
                         case 6:
-                            //LOG.Info($"{Module} [{Display} Read] Device is blocked for configuration update");
+                            LOG.Write(eEvent.INFO_RF, Module, $"{Module} [{Display} Read] Device is blocked for configuration update");
                             break;
                             break;
                         default:
                         default:
                             break;
                             break;

+ 104 - 100
Venus/Venus_RT/Modules/SystemDispatcher.cs

@@ -203,11 +203,6 @@ namespace Venus_RT.Modules
         StartAlign,
         StartAlign,
         Aligning,
         Aligning,
 
 
-        // PreHeating
-        WaitPreHeating,
-        StartPreHeating,
-        PreHeating,
-
         // Loadlock Status
         // Loadlock Status
         ExchangeWaferWithEFEM,
         ExchangeWaferWithEFEM,
         ExchangeWaferWithTM,
         ExchangeWaferWithTM,
@@ -219,7 +214,7 @@ namespace Venus_RT.Modules
         public ModuleStatus                 Status      { get; set; }
         public ModuleStatus                 Status      { get; set; }
         public SchedulerModule              Scheduler   { get; }
         public SchedulerModule              Scheduler   { get; }
         public virtual int                  SlotNum     { get; protected set; }
         public virtual int                  SlotNum     { get; protected set; }
-        public virtual bool                 IsIdle      { get { return Status == ModuleStatus.Idle || Status == ModuleStatus.PreHeating; } }
+        public virtual bool                 IsIdle      { get { return Status == ModuleStatus.Idle; } }
 
 
         private int     _currentActionTime = 0;
         private int     _currentActionTime = 0;
 
 
@@ -326,8 +321,6 @@ namespace Venus_RT.Modules
                             }
                             }
                         }
                         }
                         break;
                         break;
-                    case ModuleStatus.PreHeating:
-                        return 0;
                 }
                 }
 
 
                 return int.MaxValue;
                 return int.MaxValue;
@@ -1771,20 +1764,34 @@ namespace Venus_RT.Modules
             _dictModuleTask[item.SourceModule].WaferLeaved(wafer, item.DestinationSlot);
             _dictModuleTask[item.SourceModule].WaferLeaved(wafer, item.DestinationSlot);
         }
         }
 
 
-        private ModuleName GetComingAvailablePM()
+        private ModuleName GetComingAvailablePM(ControlJobInfo cj)
         {
         {
+            var cjPMs = new List<ModuleName>();
+            foreach (var pj in _lstProcessJobs)
+            {
+                if(pj.ControlJobName == cj.Name)
+                {
+                    foreach(var pm in pj.Sequence.PMs)
+                    {
+                        if (!cjPMs.Contains(pm))
+                            cjPMs.Add(pm);
+                    }
+                }
+            }
+
             Dictionary<ModuleName, int> pmAssociatedWaferCount = new Dictionary<ModuleName, int>();
             Dictionary<ModuleName, int> pmAssociatedWaferCount = new Dictionary<ModuleName, int>();
             foreach (var mod in _dictModuleTask)
             foreach (var mod in _dictModuleTask)
             {
             {
-                if (ModuleHelper.IsPm(mod.Key) && mod.Value.Scheduler.IsOnline)
+                if (ModuleHelper.IsPm(mod.Key) && mod.Value.Scheduler.IsOnline && cjPMs.Contains(mod.Key))
                 {
                 {
                     pmAssociatedWaferCount[mod.Key] = 0;
                     pmAssociatedWaferCount[mod.Key] = 0;
                 }
                 }
             }
             }
 
 
-            foreach (var wafer in _lstWaferTasks)
+            var unprocessedWafer = _lstWaferTasks.Where(task => ModuleHelper.IsPm(task.destMod));
+            foreach (var wafer in unprocessedWafer)
             {
             {
-                if (ModuleHelper.IsPm(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsOnline )
+                if (ModuleHelper.IsPm(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsOnline)
                 {
                 {
                     pmAssociatedWaferCount[wafer.destMod]++;
                     pmAssociatedWaferCount[wafer.destMod]++;
                 }
                 }
@@ -1802,7 +1809,7 @@ namespace Venus_RT.Modules
             var cj = _lstControlJobs.Find(c => c.JetState == EnumJetCtrlJobState.PreJobClean || c.JetState == EnumJetCtrlJobState.Processing);
             var cj = _lstControlJobs.Find(c => c.JetState == EnumJetCtrlJobState.PreJobClean || c.JetState == EnumJetCtrlJobState.Processing);
             if (cj != null)
             if (cj != null)
             {
             {
-                var pm = GetComingAvailablePM();
+                var pm = GetComingAvailablePM(cj);
                 if (pm != ModuleName.System)
                 if (pm != ModuleName.System)
                 {
                 {
                     foreach (var wafer in cj.LotWafers)
                     foreach (var wafer in cj.LotWafers)
@@ -2034,56 +2041,9 @@ namespace Venus_RT.Modules
                     }
                     }
                 }
                 }
             }
             }
-            else // must check whole system wafer existance to avoid path blocked
+            else
             {
             {
-                var vacWaferCount = _lstWaferTasks.Where(task => ModuleHelper.IsPm(task.currentMod) || ModuleHelper.IsTMRobot(task.currentMod) || ModuleHelper.IsLoadLock(task.currentMod)).Count();
-                var preferWaferVacCount = _dictModuleTask.Where(mod => ModuleHelper.IsPm(mod.Key) && mod.Value.Scheduler.IsOnline).Count() +
-                                          (LLInOutPath == SequenceLLInOutPath.AInAOut ? _LLASlotNumber / 2 : (LLInOutPath == SequenceLLInOutPath.BInBOut ? _LLBSlotNumber / 2 : _LLASlotNumber));
-                var inOutIndicator = vacWaferCount - preferWaferVacCount;
-                if (inOutIndicator < 0)
-                {
-                    // ready to push in 
-                    var readyLLs = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 10 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).emptySlot.Count > 1).OrderBy(mod => mod.Value.TimeToReady).ToList();
-                    if (readyLLs.Count > 0 && atmWaferCount >= 1)
-                    {
-                        ExchangeWaferWithLL(readyLLs.First().Key);
-                    }
-                    // forward wafer to system
-                    else if (atmWaferCount < 2)
-                    {
-                        ForwardATMWafers(ModuleName.LLA);
-                    }
-
-                    if (_efemSchdActions.Count == 0)
-                    {
-                        var readyReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 2 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).outSlot.Count >= 1).OrderByDescending(mod => GetLLReadyInOutSlots(mod.Key).outSlot.Count).ToList();
-                        if (readyReturnLL.Count > 0)
-                        {
-                            ExchangeWaferWithLL(readyReturnLL.First().Key);
-                        }
-                    }
-                }
-                else
-                {
-                    // ready double return LL
-                    var readyDoubleReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 10 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).outSlot.Count > 1).OrderBy(mod => mod.Value.TimeToReady).ToList();
-                    if (readyDoubleReturnLL.Count > 0)
-                    {
-                        ExchangeWaferWithLL(readyDoubleReturnLL.First().Key);
-                    }
-
-                    // ready single return LL
-                    var readySingleReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 2 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).outSlot.Count == 1).OrderBy(mod => mod.Value.TimeToReady).ToList();
-                    if (readySingleReturnLL.Count > 0)
-                    {
-                        ExchangeWaferWithLL(readySingleReturnLL.First().Key);
-                    }
-
-                    if (atmWaferCount == 0 || _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 15).Count() == 0)
-                    {
-                        ForwardATMWafers(ModuleName.LLA);
-                    }
-                }
+                RoutingSameLLInOutATMSystem();
             }
             }
         }
         }
 
 
@@ -2120,54 +2080,98 @@ namespace Venus_RT.Modules
                     ExchangeWaferWithLL(inLL);
                     ExchangeWaferWithLL(inLL);
                 }
                 }
             }
             }
-            else // must check whole system wafer existance to avoid path blocked
+            else
             {
             {
-                var vacWaferCount = _lstWaferTasks.Where(task => ModuleHelper.IsPm(task.currentMod) || ModuleHelper.IsTMRobot(task.currentMod) || ModuleHelper.IsLoadLock(task.currentMod)).Count();
-                var preferWaferVacCount = _dictModuleTask.Where(mod => ModuleHelper.IsPm(mod.Key) && mod.Value.Scheduler.IsOnline).Count() +
-                                          (LLInOutPath == SequenceLLInOutPath.AInAOut ? _LLASlotNumber / 2 : (LLInOutPath == SequenceLLInOutPath.BInBOut ? _LLBSlotNumber / 2 : _LLASlotNumber));
-                var inOutIndicator = vacWaferCount - preferWaferVacCount;
-                if (inOutIndicator < 0)
+                RoutingSameLLInOutATMSystem();
+            }
+        }
+
+        private void RoutingSameLLInOutATMSystem()
+        {
+            var atmWaferCount = _lstWaferTasks.Where(wafer => ModuleHelper.IsEFEMRobot(wafer.currentMod) || ModuleHelper.IsAligner(wafer.currentMod)).Count();
+            var vacWaferCount = _lstWaferTasks.Where(task => ModuleHelper.IsPm(task.currentMod) || ModuleHelper.IsTMRobot(task.currentMod) || ModuleHelper.IsLoadLock(task.currentMod)).Count();
+            var preferWaferVacCount = _dictModuleTask.Where(mod => ModuleHelper.IsPm(mod.Key) && mod.Value.Scheduler.IsOnline).Count() +
+                                      (LLInOutPath == SequenceLLInOutPath.AInAOut ? _LLASlotNumber / 2 : (LLInOutPath == SequenceLLInOutPath.BInBOut ? _LLBSlotNumber / 2 : _LLASlotNumber));
+            var inOutIndicator = vacWaferCount - preferWaferVacCount;
+            if (inOutIndicator < 0)
+            {
+                // ready to push in 
+                var readyLLs = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) &&
+                        ((mod.Key != ModuleName.LLA && LLInOutPath == SequenceLLInOutPath.BInBOut) || (mod.Key != ModuleName.LLB && LLInOutPath == SequenceLLInOutPath.AInAOut)) &&
+                        mod.Value.TimeToReady <= 10 &&
+                        !IsLLReservedByTM(mod.Key) &&
+                        GetLLReadyInOutSlots(mod.Key).emptySlot.Count > 1).
+                        OrderBy(mod => mod.Value.TimeToReady).ToList();
+
+                if (readyLLs.Count > 0 && atmWaferCount >= 1)
+                {
+                    if (ExchangeWaferWithLL(readyLLs.First().Key))
+                        return;
+                }
+
+                // forward wafer to system
+                if (atmWaferCount < 2)
                 {
                 {
-                    // ready to push in 
-                    var readyLLs = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 10 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).emptySlot.Count > 1).OrderBy(mod => mod.Value.TimeToReady).ToList();
-                    if (readyLLs.Count > 0 && atmWaferCount >= 1)
-                    {
-                        ExchangeWaferWithLL(readyLLs.First().Key);
-                    }
-                    // forward wafer to system
-                    else if (atmWaferCount < 2)
-                    {
-                        ForwardATMWafers(ModuleName.LLA);
-                    }
+                    var targetLL = readyLLs.Count > 0 ? readyLLs.First().Key : (LLInOutPath == SequenceLLInOutPath.BInBOut ? ModuleName.LLB : ModuleName.LLA);
+                    ForwardATMWafers(targetLL);
+                }
 
 
-                    if (_efemSchdActions.Count == 0)
+                if (_efemSchdActions.Count == 0)
+                {
+                    var readyReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) &&
+                            ((mod.Key != ModuleName.LLA && LLInOutPath == SequenceLLInOutPath.BInBOut) || (mod.Key != ModuleName.LLB && LLInOutPath == SequenceLLInOutPath.AInAOut)) &&
+                            mod.Value.TimeToReady <= 5 &&
+                            !IsLLReservedByTM(mod.Key) &&
+                            GetLLReadyInOutSlots(mod.Key).outSlot.Count >= 1).
+                            OrderByDescending(mod => GetLLReadyInOutSlots(mod.Key).outSlot.Count).ToList();
+
+                    if (readyReturnLL.Count > 0)
                     {
                     {
-                        var readyReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 2 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).outSlot.Count >= 1).OrderByDescending(mod => GetLLReadyInOutSlots(mod.Key).outSlot.Count).ToList();
-                        if (readyReturnLL.Count > 0)
-                        {
-                            ExchangeWaferWithLL(readyReturnLL.First().Key);
-                        }
+                        ExchangeWaferWithLL(readyReturnLL.First().Key);
                     }
                     }
                 }
                 }
-                else
+            }
+            else
+            {
+                // ready double return LL
+                var readyDoubleReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) &&
+                        mod.Value.TimeToReady < 10 &&
+                        !IsLLReservedByTM(mod.Key) &&
+                        GetLLReadyInOutSlots(mod.Key).outSlot.Count > 1).
+                        OrderBy(mod => mod.Value.TimeToReady).ToList();
+
+                if (readyDoubleReturnLL.Count > 0)
                 {
                 {
-                    // ready double return LL
-                    var readyDoubleReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 10 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).outSlot.Count > 1).OrderBy(mod => mod.Value.TimeToReady).ToList();
-                    if (readyDoubleReturnLL.Count > 0)
-                    {
-                        ExchangeWaferWithLL(readyDoubleReturnLL.First().Key);
-                    }
+                    if (ExchangeWaferWithLL(readyDoubleReturnLL.First().Key))
+                        return;
+                }
 
 
-                    // ready single return LL
-                    var readySingleReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 2 && !IsLLReservedByTM(mod.Key) && GetLLReadyInOutSlots(mod.Key).outSlot.Count == 1).OrderBy(mod => mod.Value.TimeToReady).ToList();
-                    if (readySingleReturnLL.Count > 0)
-                    {
-                        ExchangeWaferWithLL(readySingleReturnLL.First().Key);
-                    }
+                // ready single return LL
+                var readySingleReturnLL = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) &&
+                        mod.Value.TimeToReady < 2 &&
+                        !IsLLReservedByTM(mod.Key) &&
+                        GetLLReadyInOutSlots(mod.Key).outSlot.Count == 1).
+                        OrderBy(mod => mod.Value.TimeToReady).ToList();
+
+                if (readySingleReturnLL.Count > 0)
+                {
+                    if (ExchangeWaferWithLL(readySingleReturnLL.First().Key))
+                        return;
+                }
+
+                if (atmWaferCount == 0)
+                {
+                    // ready to push in 
+                    var readyLLs = _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) &&
+                            ((mod.Key != ModuleName.LLA && LLInOutPath == SequenceLLInOutPath.BInBOut) || (mod.Key != ModuleName.LLB && LLInOutPath == SequenceLLInOutPath.AInAOut)) &&
+                            mod.Value.TimeToReady <= 10 &&
+                            !IsLLReservedByTM(mod.Key) &&
+                            GetLLReadyInOutSlots(mod.Key).emptySlot.Count > 1).
+                            OrderBy(mod => mod.Value.TimeToReady).ToList();
 
 
-                    if (atmWaferCount == 0 || _dictModuleTask.Where(mod => ModuleHelper.IsLoadLock(mod.Key) && mod.Value.TimeToReady < 15).Count() == 0)
+                    if (readyLLs.Count > 0)
                     {
                     {
-                        ForwardATMWafers(ModuleName.LLA);
+                        ForwardATMWafers(readyLLs.First().Key);
                     }
                     }
                 }
                 }
             }
             }