Sfoglia il codice sorgente

fix a routing bug for single PM sequence.

sangwq 1 anno fa
parent
commit
faa496c2b0

+ 25 - 1
Venus/Venus_RT/Modules/AutoCycle.cs

@@ -140,6 +140,8 @@ namespace Venus_RT.Modules
         private List<ModuleName> _waitPostCleanPMs = new List<ModuleName>();
         private List<ModuleName> _waitWTWCleanPMs = new List<ModuleName>();
 
+        private List<Guid> _lstReturnWafers = new List<Guid>();
+
         public bool HasJobRunning => _lstControlJobs.Count > 0;
 
         #region public interface
@@ -565,6 +567,27 @@ namespace Venus_RT.Modules
             _cycleState = RState.End;
         }
 
+        public bool ManualReturnWafer(object[] objs)
+        {
+            ModuleName SourceModule = (ModuleName)objs[0];
+            int SourceSlot = (int)objs[1];
+
+            if (!_vacSchedulers.Keys.Contains(SourceModule) && !_atmSchedulers.Keys.Contains(SourceModule))
+            {
+                LOG.Write(eEvent.WARN_ROUTER, $"Invalid source module {SourceModule}");
+                return false;
+            }
+
+            if(WaferManager.Instance.CheckNoWafer(SourceModule, SourceSlot))
+            {
+                return false;
+            }
+
+            var _wafer_id = WaferManager.Instance.GetWafer(SourceModule, SourceSlot).InnerId;
+            _lstReturnWafers.Add(_wafer_id);
+            return true;
+        }
+
 
         #endregion
 
@@ -1700,9 +1723,10 @@ namespace Venus_RT.Modules
         {
             int Processed = 0;
             int Empty = 0;
+            List<ModuleName> usedPMs = GetPmUsedInRunningPj();
             foreach (var module in _vacModules)
             {
-                if (ModuleHelper.IsPm(module.Key) && _vacSchedulers[module.Key].IsAvailable && _vacModules[module.Key].MovingStatus == MovingStatus.Idle)
+                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)

+ 7 - 0
Venus/Venus_RT/Modules/RouteManager.cs

@@ -646,6 +646,8 @@ namespace Venus_RT.Modules
             Transition(RtState.AutoRunning,     MSG.StopJob,            FsmStopJob,                 RtState.AutoRunning);
             Transition(RtState.AutoRunning,     MSG.AbortJob,           FsmAbortJob,                RtState.AutoRunning);
 
+            Transition(RtState.AutoRunning,     MSG.MoveWafer,          FsmAutoReturnWafer,         RtState.AutoRunning);
+
             Transition(RtState.AutoRunning,     MSG.Map,                FsmMap,                     RtState.AutoRunning);
 
             Transition(RtState.AutoRunning,     MSG.ResetIdleCleanTime, FsmResetIdleCleanTime,      RtState.AutoRunning);
@@ -922,6 +924,11 @@ namespace Venus_RT.Modules
             return true;
         }
 
+        private bool FsmAutoReturnWafer(object[] objs)
+        {
+            return _AutoCycle.ManualReturnWafer(objs);
+        }
+
         private bool FsmMonitorAutoIdle(object[] objs)
         {
             RState ret = _AutoCycle.Monitor();