Browse Source

Fixed the Cycle Wafer Count and throughput calculation bugs.

sangwq 1 year ago
parent
commit
a8ee956c5e
1 changed files with 55 additions and 29 deletions
  1. 55 29
      Venus/Venus_RT/Modules/AutoCycle.cs

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

@@ -115,6 +115,8 @@ namespace Venus_RT.Modules
         private int _cycledCount = 0;
         private int _cycledWafer = 0;
         private float _throughput = 0.0f;
+        private Dictionary<ModuleName, int> _lpCycleWafer = new Dictionary<ModuleName, int>();
+        private Dictionary<ModuleName, int> _lpCycleCount = new Dictionary<ModuleName, int>();
         private Stopwatch _cycleWatch = new Stopwatch();
 
         public bool HasJobRunning => _lstControlJobs.Count > 0;
@@ -155,6 +157,8 @@ namespace Venus_RT.Modules
             _cycledCount = 0;
             _throughput = 0;
             _cycleWatch.Stop();
+            _lpCycleWafer.Clear();
+            _lpCycleCount.Clear();
 
             return RState.Running;
         }
@@ -497,6 +501,12 @@ namespace Venus_RT.Modules
                 _cycleWatch.Restart();
             }
 
+            if(!_lpCycleWafer.Keys.Contains(ModuleHelper.Converter(cj.Module)))
+            {
+                _lpCycleCount.Add(ModuleHelper.Converter(cj.Module), 0);
+                _lpCycleWafer.Add(ModuleHelper.Converter(cj.Module), 0);
+            }
+            
             _cycleState = RState.Running;
         }
 
@@ -2134,6 +2144,8 @@ namespace Venus_RT.Modules
                     allControlJobComplete = false;
                     continue;
                 }
+
+                int countProcessed = 0;
                 if (cj.State == EnumControlJobState.Executing)
                 {
                     bool allPjCompleted = true;
@@ -2145,6 +2157,22 @@ namespace Venus_RT.Modules
                             LOG.Write( eEvent.ERR_ROUTER, ModuleName.System, $"Not find pj named {pjName} in {cj.Name}");
                             continue;
                         }
+
+                        // caculate process wafer by process
+                        if (_isCycleMode && _cycledCount < (_isCycleMode ? _cycleSetPoint : 0))
+                        {
+                            foreach (var pjSlotWafer in pj.SlotWafers)
+                            {
+                                WaferInfo wafer = WaferManager.Instance.GetWafer(pjSlotWafer.Item1, pjSlotWafer.Item2);
+                                if (!wafer.IsEmpty && wafer.ProcessJob != null && wafer.ProcessJob.Sequence != null
+                                    && !IsWaferNeedGotoModule(wafer, ModuleName.PMA)
+                                    && !IsWaferNeedGotoModule(wafer, ModuleName.PMB)
+                                    && !IsWaferNeedGotoModule(wafer, ModuleName.PMC)
+                                    && !IsWaferNeedGotoModule(wafer, ModuleName.PMD))
+                                    countProcessed++;
+                            }
+                        }
+
                         if (pj.State != EnumProcessJobState.Complete && pj.State != EnumProcessJobState.ProcessingComplete)
                         {
                             allPjCompleted = false;
@@ -2177,10 +2205,35 @@ namespace Venus_RT.Modules
 
                         if (!(_isCycleMode && _cycledCount < _cycleSetPoint))
                             (Singleton<TransferModule>.Instance.GetScheduler(ModuleHelper.Converter(cj.Module)) as SchedulerLoadPort).NoteJobComplete();
+
+                        _lpCycleCount[ModuleHelper.Converter(cj.Module)]++;
                     }
                 }
 
-
+                // caculate total processed wafer and throughput
+                if (_isCycleMode && _cycledCount < (_isCycleMode ? _cycleSetPoint : 0))
+                {
+                    int lpCycleWafer = _lpCycleCount[ModuleHelper.Converter(cj.Module)] * cj.LotWafers.Count + countProcessed;
+                    if (_lpCycleCount[ModuleHelper.Converter(cj.Module)] != _cycledCount || lpCycleWafer != _lpCycleWafer[ModuleHelper.Converter(cj.Module)])
+                    {
+                        _lpCycleWafer[ModuleHelper.Converter(cj.Module)] = lpCycleWafer;
+                        int totolCycleWafer = _lpCycleWafer.Sum(item => item.Value);
+                        _cycledCount = _lpCycleCount.Sum(item => item.Value);
+                        if (totolCycleWafer != _cycledWafer)
+                        {
+                            _cycledWafer = totolCycleWafer;
+                            if (_cycledWafer >= 25)
+                            {
+                                _throughput = (float)(_cycledWafer / _cycleWatch.Elapsed.TotalHours);
+                            }
+                            else
+                            {
+                                _throughput = 0;
+                            }
+                        }
+                    }
+                }
+                    
                 LoadportCassetteState state = (LoadportCassetteState)DATA.Poll($"{cj.Module}.CassetteState");
                 if (cj.State == EnumControlJobState.Completed && state != LoadportCassetteState.Normal)
                 {
@@ -2192,36 +2245,9 @@ namespace Venus_RT.Modules
 
             if (_isCycleMode && _cycledCount < (_isCycleMode ? _cycleSetPoint : 0))
             {
-                int countPerCycle = 0;
-                int countProcessed = 0;
-                foreach (var pj in _lstProcessJobs)
-                {
-                    foreach (var pjSlotWafer in pj.SlotWafers)
-                    {
-                        countPerCycle++;
-                        WaferInfo wafer = WaferManager.Instance.GetWafer(pjSlotWafer.Item1, pjSlotWafer.Item2);
-                        if (!wafer.IsEmpty && !IsWaferNeedGotoModule(wafer, ModuleName.PMA) && !IsWaferNeedGotoModule(wafer, ModuleName.PMB) && !IsWaferNeedGotoModule(wafer, ModuleName.PMC) && !IsWaferNeedGotoModule(wafer, ModuleName.PMD))
-                            countProcessed++;
-                    }
-                }
-
-                int totalCycleWafer = _cycledCount * countPerCycle + countProcessed;
-                if(_cycledWafer != totalCycleWafer)
-                {
-                    _cycledWafer = totalCycleWafer;
-                    if(_cycledWafer >= 25)
-                    {
-                        _throughput = (float)(_cycledWafer / _cycleWatch.Elapsed.TotalHours);
-                    }
-                    else
-                    {
-                        _throughput = 0;
-                    }
-                }
-
                 if (allControlJobComplete)
                 {
-                    _cycledCount++;
+                   // _cycledCount++;
 
                     if (_cycledCount < _cycleSetPoint)
                     {