瀏覽代碼

fix some routing bugs.

sangwq 1 年之前
父節點
當前提交
b85b9aa79f

+ 1 - 1
Venus/Framework/Common/Fsm/StateMachine.cs

@@ -263,7 +263,7 @@ namespace Aitex.Core.RT.Fsm
                 }
                 catch (Exception ex)
                 {
-                    LOG.Write(eEvent.EV_FSM_NOTIFY, MECF.Framework.Common.Equipment.ModuleName.System, ex.StackTrace + ex.Message);
+                    LOG.Write(eEvent.EXCEP_FSM, MECF.Framework.Common.Equipment.ModuleName.System, ex.StackTrace + ex.Message);
                 }
             }
         }

+ 1 - 0
Venus/Venus_Core/EventDefine.cs

@@ -38,6 +38,7 @@ namespace Aitex.Core.RT.Log{
 		WARN_SYSTEM_CONFIG = 37,
 		EV_SCHEDULER = 38,
 		WARN_SCHEDULER = 39,
+		EXCEP_FSM = 40,
 		INFO_DEVICE_IO_HEATER = 1000,
 		WARN_DEVICE_IO_HEATER = 1001,
 		ERR_DEVICE_IO_HEATER = 1002,

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

@@ -333,6 +333,15 @@
     "Note": ""
   },
   {
+    "Id": 40,
+    "Level": "Warning",
+    "LogEnum": "EXCEP_FSM",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "System",
+    "Note": "FSM Exception"
+  },
+  {
     "Id": 1000,
     "Level": "Info",
     "LogEnum": "INFO_DEVICE_IO_HEATER",

+ 67 - 20
Venus/Venus_RT/Modules/SystemDispatcher.cs

@@ -104,7 +104,7 @@ namespace Venus_RT.Modules
             IsAligned = false;
 
             pressureStatus = RState.Init;
-            temperatureStatus = RState.Init;
+            temperatureStatus = RState.End;
             movingStatus = RState.Init;
             _scheduledTime = DateTime.Now;
         }
@@ -134,15 +134,16 @@ namespace Venus_RT.Modules
                 }
             }
 
-            if (ModuleHelper.IsPm(destMod) && temperatureStatus == RState.Init)
-            {
-                var pmScheduler = Singleton<TransferModule>.Instance.GetScheduler(destMod) as SchedulerPM;
-                if (pmScheduler != null && pmScheduler.IsAvailable)
-                {
-                    pmScheduler.Preheating(temperature);
-                    temperatureStatus = RState.Running;
-                }
-            }
+            // remove heating function
+            //if (ModuleHelper.IsPm(destMod) && temperatureStatus == RState.Init)
+            //{
+            //    var pmScheduler = Singleton<TransferModule>.Instance.GetScheduler(destMod) as SchedulerPM;
+            //    if (pmScheduler != null && pmScheduler.IsAvailable)
+            //    {
+            //        pmScheduler.Preheating(temperature);
+            //        temperatureStatus = RState.Running;
+            //    }
+            //}
 
             return RState.Running;
         }
@@ -341,13 +342,13 @@ namespace Venus_RT.Modules
 
         public override RState Run()
         {
-            if(Scheduler.IsAvailable)
+            if(Scheduler.IsIdle)
             {
                 switch (Status)
                 {
                     case ModuleStatus.Idle:
                         {
-                            if(WaferManager.Instance.CheckNoWafer(Module, 0))
+                            if(WaferManager.Instance.CheckNoWafer(Module, 0) && Scheduler.IsOnline)
                             {
                                 if (_pendingCleanTask.Count > 0)
                                 {
@@ -428,9 +429,16 @@ namespace Venus_RT.Modules
                     case ModuleStatus.Processing:
                         {
                             var wafer = WaferManager.Instance.GetWafer(Module, 0);
-                            if(!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
+                            if(Scheduler.IsOnline)
+                            {
+                                if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
+                                {
+                                    _wafer.Return();
+                                    Status = ModuleStatus.Idle;
+                                }
+                            }
+                            else  // handle offline exception situation
                             {
-                                _wafer.Return();
                                 Status = ModuleStatus.Idle;
                             }
                         }
@@ -969,7 +977,7 @@ namespace Venus_RT.Modules
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
                     return false;
                 }
-                
+
                 if (!RouteManager.IsATMMode && !CheckSequenceRecipeFileValid(pj.Sequence, out reason))
                 {
                     LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"recipe file not valid in the sequence, {reason}");
@@ -1165,6 +1173,7 @@ namespace Venus_RT.Modules
                 LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 return false;
             }
+
             if (RtInstance.ConfigType == ConfigType.Kepler2200)
             {
                 if (!CheckSequenceKepler2200TemperatureReady(GetFirstProcessJob(cj).Sequence))
@@ -1172,6 +1181,7 @@ namespace Venus_RT.Modules
                     return false;
                 }
             }
+
             if (cj.State == EnumControlJobState.WaitingForStart)
             {
                 cj.SetState(EnumControlJobState.Executing);
@@ -1300,6 +1310,12 @@ namespace Venus_RT.Modules
                         LOG.Write(eEvent.ERR_ROUTER, destLP, $"The destination Loadport {destLP} is not ready for return wafer.");
                         return RState.Failed;
                     }
+
+                    if(!ModuleHelper.IsLoadPort(destLP))
+                    {
+                        LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"The wafer {wafer.WaferOrigin} cannot be return, please manually drag it.");
+                        return RState.Failed;
+                    }
                 }
             }
 
@@ -1782,6 +1798,7 @@ namespace Venus_RT.Modules
         private void WaferArrived(WaferTask wafer, MoveItem item)
         {
             _dictModuleTask[item.DestinationModule].WaferArrived(wafer, item.DestinationSlot);
+
             //--2024-03-21 增加了PortJobWaferEnd 上报事件 start--
             if (ModuleHelper.IsLoadPort(item.DestinationModule))
             {
@@ -1797,6 +1814,7 @@ namespace Venus_RT.Modules
         private void WaferLeaved(WaferTask wafer, MoveItem item)
         {
             _dictModuleTask[item.SourceModule].WaferLeaved(wafer, item.DestinationSlot);
+
             //--2024-03-21 增加了PortJobWaferStart 上报事件 start--
             if (ModuleHelper.IsLoadPort(item.SourceModule))
             {
@@ -1818,12 +1836,22 @@ namespace Venus_RT.Modules
                 {
                     foreach(var pm in wafer.ProcessJob.Sequence.PMs)
                     {
-                        if (!lstInProcessPMs.Contains(pm))
+                        if (!lstInProcessPMs.Contains(pm) && _dictModuleTask[pm].Scheduler.IsOnline)
                             lstInProcessPMs.Add(pm);
                     }
                 }
             }
 
+            // blocking check while only one loadlock in out
+            if (LLInOutPath == SequenceLLInOutPath.AInAOut || 
+                LLInOutPath == SequenceLLInOutPath.BInBOut || 
+                !_dictModuleTask[ModuleName.LLA].Scheduler.IsOnline || 
+                !_dictModuleTask[ModuleName.LLB].Scheduler.IsOnline)
+            {
+                if (_lstWaferTasks.Count >= lstInProcessPMs.Count + _LLASlotNumber / 2)
+                    return ModuleName.System;
+            }
+
             Dictionary<ModuleName, int> pmAssociatedWaferCount = new Dictionary<ModuleName, int>();
             foreach (var mod in _dictModuleTask)
             {
@@ -1882,12 +1910,12 @@ namespace Venus_RT.Modules
             {
                 temperature = temp;
             }
-            
+
             var waferTask = new WaferTask((ModuleName)wafer.OriginStation,
                                             wafer.OriginSlot,
                                             pm,
+                                            0,
                                             temperature,
-                                            (float)Convert.ToDouble(recipe.Header.Temperature),
                                             wafer.InnerId,
                                             recipeName,
                                             wafer.ProcessJob.Sequence.WTWCleanRecipe,
@@ -2317,7 +2345,25 @@ namespace Venus_RT.Modules
                         foreach (var action in _curEfemAction)
                         {
                             var waferTask = _lstWaferTasks.Find(wafer => (wafer.movingStatus == RState.End || wafer.movingStatus == RState.Init) && wafer.currentMod == action.SourceModule && wafer.currentSlot == action.SourceSlot);
-                            waferTask.MoveTo(action.DestinationModule, action.DestinationSlot);                            
+                            waferTask.MoveTo(action.DestinationModule, action.DestinationSlot);
+                            //--2024-03-21 增加了PortJobWaferStart 上报事件 start--
+                            if (ModuleHelper.IsLoadPort(action.SourceModule))
+                            {
+                                ControlJobInfo currentControlJob = GetLoadPortCurrentControlJob(action.SourceModule);
+                                if(currentControlJob!=null)
+                                {
+                                    _faCallback.JobWaferStart(currentControlJob, action.SourceSlot);
+                                }
+                            }
+                            if(ModuleHelper.IsLoadPort(action.DestinationModule))
+                            {
+                                ControlJobInfo currentControlJob = GetLoadPortCurrentControlJob(action.DestinationModule);
+                                if (currentControlJob != null)
+                                {
+                                    _faCallback.JobWaferEnd(currentControlJob, action.SourceSlot);
+                                }
+                            }
+                            //--2024-03-21 增加了PortJobWaferStart 上报事件 end--
                         }
 
                         (_dictModuleTask[ModuleName.EfemRobot].Scheduler as SchedulerEfemRobot).PostMoveItems(_curEfemAction.ToArray());
@@ -3500,6 +3546,7 @@ namespace Venus_RT.Modules
 
             return false;
         }
+
         private bool CheckSequenceKepler2200TemperatureReady(SequenceInfo seq)
         {
             for (int i = 0; i < seq.Steps.Count; i++)
@@ -3536,7 +3583,7 @@ namespace Venus_RT.Modules
                                     currentChamberTemperature = 0;
                                     break;
                             }
-                            if (recipe.Header.Temperature!=null && recipe.Header.Temperature!="" && (currentChamberTemperature > Convert.ToSingle(recipe.Header.Temperature) + 10 || currentChamberTemperature < Convert.ToSingle(recipe.Header.Temperature) - 10))
+                            if (recipe.Header.Temperature != null && recipe.Header.Temperature != "" && (currentChamberTemperature > Convert.ToSingle(recipe.Header.Temperature) + 10 || currentChamberTemperature < Convert.ToSingle(recipe.Header.Temperature) - 10))
                             {
                                 LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"Start job失败,由于{module}腔体温度{currentChamberTemperature}与{recipeName} Recipe温度{recipe.Header.Temperature}不匹配");
                                 return false;