Browse Source

Pause/Resume function and enhance duplicated function while transfer wafer timeout.

sangwq 11 months ago
parent
commit
8f537a79cb

+ 32 - 3
Venus/Framework/Common/SubstrateTrackings/WaferManager.cs

@@ -42,7 +42,6 @@ namespace MECF.Framework.Common.SubstrateTrackings
                     if (_locationWafers != null)
                     {
                         BinarySerializer<Dictionary<ModuleName, Dictionary<int, WaferInfo>>>.ToStream(_locationWafers, "WaferManager");
-                        BinarySerializer<List<DulicatedWaferInfo>>.ToStream(_duplicatedWafers, "DuplicatedWafers");
                     }
                 }
                 catch (Exception ex)
@@ -52,6 +51,21 @@ namespace MECF.Framework.Common.SubstrateTrackings
             });
         }
 
+        public async void SerializeDuplicatedWaferInfo()
+        {
+            await Task.Run(() =>
+            {
+                try
+                {
+                    BinarySerializer<List<DulicatedWaferInfo>>.ToStream(_duplicatedWafers, "DuplicatedWafers");
+                }
+                catch (Exception ex)
+                {
+                    LOG.WriteExeption(ex);
+                }
+            });
+        }
+
         public void Deserialize()
         {
             try
@@ -71,27 +85,38 @@ namespace MECF.Framework.Common.SubstrateTrackings
                     }
                     _locationWafers = ccc;
                 }
+            }
 
+            catch (Exception ex)
+            {
+                LOG.WriteExeption(ex);
+            }
+        }
+
+        public void DeserializeDuplicatedWaferInfo()
+        {
+            try
+            {
                 var duplicatedWafers = BinarySerializer<List<DulicatedWaferInfo>>.FromStream("DuplicatedWafers");
                 if (duplicatedWafers != null)
                 {
                     _duplicatedWafers = duplicatedWafers;
                 }
             }
+
             catch (Exception ex)
             {
                 LOG.WriteExeption(ex);
             }
-
         }
 
-
         public void Initialize()
         {
             EV.Subscribe(new EventItem("Event", EventWaferLeft, "Wafer Left"));
             EV.Subscribe(new EventItem("Event", EventWaferArrive, "Wafer Arrived"));
 
             Deserialize();
+            DeserializeDuplicatedWaferInfo();
         }
  
         public void SubscribeLocation(string module, int slotNumber)
@@ -491,6 +516,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
             LOG.Write(eEvent.EV_WAFER_DUPLICATED, ModuleName.System, waferOrigin, source.ToString(), (source + 1).ToString(), destination.ToString(), (destSlot + 1).ToString());
 
             Serialize();
+            SerializeDuplicatedWaferInfo();
         }
 
         private void deleteDuplicatedWafer(ModuleName module, int slot)
@@ -515,6 +541,9 @@ namespace MECF.Framework.Common.SubstrateTrackings
             _locationWafers[module][slot].SetEmpty();
             _locationWafers[(ModuleName)peerModule][peerSlot].IsDuplicated = false;
             _duplicatedWafers.RemoveAt(infoIndex);
+
+            Serialize();
+            SerializeDuplicatedWaferInfo();
         }
 
         public bool CheckDuplicatedWafersBeforeMove(Queue<MoveItem> moveItems)

+ 19 - 5
Venus/Venus_RT/Modules/EFEM/EfemPickRoutine.cs

@@ -101,14 +101,14 @@ namespace Venus_RT.Modules.EFEM
             if(_bDoublePick)
             {
                 Runner.Wait(PickStep.WaitModuleReady,  WaitModuleReady)
-                        .Run(PickStep.Picking1,        Pick1,          Pick1Done,      _moveTimeout)
-                        .Run(PickStep.Picking2,        Pick2,          Pick2Done,      _moveTimeout)
+                        .Run(PickStep.Picking1,        Pick1,          Pick1Done,       _moveTimeout + _delay_1s)
+                        .Run(PickStep.Picking2,        Pick2,          Pick2Done,       _moveTimeout + _delay_1s)
                         .End(PickStep.End,             ActionDone);
             }
             else
             {
                 Runner.Wait(PickStep.WaitModuleReady, WaitModuleReady)
-                        .Run(PickStep.Picking1,        Pick1,          Pick1Done,      _moveTimeout)
+                        .Run(PickStep.Picking1,        Pick1,          Pick1Done,       _moveTimeout + _delay_1s)
                         .End(PickStep.End,             ActionDone);
             }
 
@@ -140,7 +140,14 @@ namespace Venus_RT.Modules.EFEM
             else if (_efem.Status != RState.Running)
             {
                 WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot, ModuleName.EfemRobot, (int)_hand);
-                LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem robot picking failed: {_efem.Status}");
+                Runner.Stop($"EFEM Robot pick wafer from {_targetModule}.{_targetSlot + 1} failed, {_efem.Status}");
+                return true;
+            }
+
+            if(Runner.StepElapsedMS > _moveTimeout)
+            {
+                WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot, ModuleName.EfemRobot, (int)_hand);
+                Runner.Stop($"EFEM Robot pick wafer from {_targetModule}.{_targetSlot + 1} timeout, {_moveTimeout}ms");
                 return true;
             }
 
@@ -162,7 +169,14 @@ namespace Venus_RT.Modules.EFEM
             else if (_efem.Status != RState.Running)
             {
                 WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot2, ModuleName.EfemRobot, (int)_hand2);
-                LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem robot picking failed: {_efem.Status}");
+                Runner.Stop($"Efem robot picking wafer from {_targetModule}.{_targetSlot2 + 1} failed: {_efem.Status}");
+                return true;
+            }
+
+            if (Runner.StepElapsedMS > _moveTimeout)
+            {
+                WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot2, ModuleName.EfemRobot, (int)_hand2);
+                Runner.Stop($"EFEM Robot pick wafer from {_targetModule}.{_targetSlot2 + 1} timeout");
                 return true;
             }
 

+ 18 - 4
Venus/Venus_RT/Modules/EFEM/EfemPlaceRoutine.cs

@@ -110,14 +110,14 @@ namespace Venus_RT.Modules.EFEM
             if (_bDoublePlace)
             {
                 Runner.Wait(PlaceStep.WaitModuleReady,     WaitModuleReady)
-                        .Run(PlaceStep.Placing1,           Place1,         Place1Done,     _moveTimeout)
-                        .Run(PlaceStep.Placing2,           Place2,         Place2Done,     _moveTimeout)
+                        .Run(PlaceStep.Placing1,           Place1,         Place1Done,      _moveTimeout + _delay_1s)
+                        .Run(PlaceStep.Placing2,           Place2,         Place2Done,      _moveTimeout + _delay_1s)
                         .End(PlaceStep.End,                ActionDone);
             }
             else
             {
                 Runner.Wait(PlaceStep.WaitModuleReady, WaitModuleReady)
-                        .Run(PlaceStep.Placing1,           Place1,         Place1Done,     _moveTimeout)
+                        .Run(PlaceStep.Placing1,           Place1,         Place1Done,      _moveTimeout + _delay_1s)
                         .End(PlaceStep.End,                ActionDone);
             }
 
@@ -149,8 +149,14 @@ namespace Venus_RT.Modules.EFEM
             else if (_efem.Status != RState.Running)
             {
                 WaferManager.Instance.CreateDuplicatedWafer(ModuleName.EfemRobot, (int)_hand, _targetModule, _targetSlot);
+                Runner.Stop($"EFEM Robot place wafer to {_targetModule}.{_targetSlot + 1} failed, {_efem.Status}");
+                return true;
+            }
 
-                LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem robot place failed: {_efem.Status}");
+            if (Runner.StepElapsedMS > _moveTimeout)
+            {
+                WaferManager.Instance.CreateDuplicatedWafer(ModuleName.EfemRobot, (int)_hand, _targetModule, _targetSlot);
+                Runner.Stop($"EFEM Robot place wafer to {_targetModule}.{_targetSlot + 1} timeout, {_moveTimeout}ms");
                 return true;
             }
 
@@ -177,6 +183,14 @@ namespace Venus_RT.Modules.EFEM
                 return true;
             }
 
+            if (Runner.StepElapsedMS > _moveTimeout)
+            {
+                WaferManager.Instance.CreateDuplicatedWafer(ModuleName.EfemRobot, (int)_hand2, _targetModule2, _targetSlot2);
+                Runner.Stop($"EFEM Robot place wafer to {_targetModule}.{_targetSlot2 + 1} timeout, {_moveTimeout}ms");
+                LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"EFEM Robot place wafer to {_targetModule}.{_targetSlot2 + 1} timeout, {_moveTimeout}ms");
+                return true;
+            }
+
             return false;
         }
 

+ 8 - 1
Venus/Venus_RT/Modules/EFEM/EfemSwapRoutine.cs

@@ -112,7 +112,7 @@ namespace Venus_RT.Modules.EFEM
                 .Run(SwapStep.ModulePrepare,       ModulePrepare,              IsModulePrepareReady)
                 .Run(SwapStep.OpenSlitDoor,        OpenSlitDoor,               IsSlitDoorOpen)
                 .LoopStart(SwapStep.MoveWafer,     loopName(),                 _actionCount,           MoveWafer)
-                .LoopEnd(SwapStep.WaitMaferMoved,  NullFun,                    WaitWaferMoved,         _moveTimeout)
+                .LoopEnd(SwapStep.WaitMaferMoved,  NullFun,                    WaitWaferMoved,         _moveTimeout + _delay_1s)
                 .Run(SwapStep.CloseSlitDoor,       CloseSlitDoor,              IsSlitDoorClosed)
                 .End(SwapStep.NotifyDone,          NotifyLLDone,               _delay_50ms);
 
@@ -206,6 +206,13 @@ namespace Venus_RT.Modules.EFEM
         {
             if (_efem.Status == RState.Running)
             {
+                if(Runner.StepElapsedMS > _moveTimeout)
+                {
+                    WaferManager.Instance.CreateDuplicatedWafer(_currentAction.SourceModule, _currentAction.SourceSlot, _currentAction.DestinationModule, _currentAction.DestinationSlot);
+                    Runner.Stop($"EFEM Robot moving wafer from {_currentAction.SourceModule}.{_currentAction.SourceSlot + 1} to {_currentAction.DestinationModule}.{_currentAction.DestinationSlot + 1}, {_moveTimeout}ms");
+                    return true;
+                }
+
                 return false;
             }
             else if (_efem.Status == RState.End)

+ 11 - 2
Venus/Venus_RT/Modules/SystemDispatcher.cs

@@ -1748,6 +1748,15 @@ namespace Venus_RT.Modules
             return true;
         }
 
+        private bool IsCtrlJobExecuting(ModuleName lp)
+        {
+            var cJob = _lstControlJobs.Find(cj => ModuleHelper.Converter(cj.Module) == lp);
+            if (cJob != null && cJob.State == EnumControlJobState.Executing)
+                return true;
+
+            return false;
+        }
+
         private bool IsCtrlJobRuning(ControlJobInfo cj)
         {
             return cj.JetState == EnumJetCtrlJobState.PreJobClean ||
@@ -1901,7 +1910,7 @@ namespace Venus_RT.Modules
 
         private void CreateNewWaferTask()
         {
-            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) && c.State == EnumControlJobState.Executing);
             if (cj != null)
             {
                 var pm = GetComingAvailablePM(cj);
@@ -1955,7 +1964,7 @@ namespace Venus_RT.Modules
             var emptySlots = _LLSlotInOutOption == LLSlotInOutOpt.AllInAllOut ? GetLLReadyInOutSlots(ll).emptySlot : GetLLFixedReadyInOutSlots(ll).eInSlot;
             var atmWafers = _lstWaferTasks.Where(wafer => (wafer.movingStatus == RState.End ||wafer.movingStatus == RState.Init) && (ModuleHelper.IsEFEMRobot(wafer.currentMod) || ModuleHelper.IsAligner(wafer.currentMod))).ToList();
             var notAlignedWafer = atmWafers.Where(wafer => !wafer.IsAligned).ToList();
-            var readyInWafers = _lstWaferTasks.Where(wafer => ModuleHelper.IsLoadPort(wafer.currentMod) && wafer.movingStatus == RState.Init && wafer.pressureStatus == RState.Init && CanWaferGotoLL(wafer, ll)).OrderBy(wafer => wafer.currentSlot).ToArray();
+            var readyInWafers = _lstWaferTasks.Where(wafer => ModuleHelper.IsLoadPort(wafer.currentMod) && IsCtrlJobExecuting(wafer.currentMod) && wafer.movingStatus == RState.Init && wafer.pressureStatus == RState.Init && CanWaferGotoLL(wafer, ll)).OrderBy(wafer => wafer.currentSlot).ToArray();
             var freeHands = GetEFEMFreeHand();
 
             if ((atmWafers.Count >= 2 && atmWafers.Count(wafer => !wafer.IsAligned) == 0) || freeHands.Count == 0 || readyInWafers.Length == 0)

+ 9 - 3
Venus/Venus_RT/Modules/TM/MFPMPickRoutine.cs

@@ -50,8 +50,8 @@ namespace Venus_RT.Modules.TM
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
 
-        private int _pickingTimeout = 120 * 1000;
-        private int _liftPinTimeout = 20 * 1000;
+        private int _pickingTimeout = 20 * 1000;
+        private int _liftPinTimeout = 10 * 1000;
         private int _pickDelayTime = 0;
         private ModuleName _targetModule;
         private PMEntity  _pmModule;
@@ -221,11 +221,17 @@ namespace Venus_RT.Modules.TM
         {
             if (_robot.Status == RState.Running)
             {
+                if(Runner.StepElapsedMS > _pickingTimeout)
+                {
+                    WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot, ModuleName.TMRobot, (int)_hand);
+                    Runner.Stop($"TM Robot Picking {_targetModule} wafer timeout, {_pickingTimeout}");
+                    return true;
+                }
+
                 return false;
             }
             else if (_robot.Status == RState.End)
             {
-                //WaferManager.Instance.WaferMoved(ModuleName.TM, (int)_hand, _targetModule, _targetSlot);
                 WaferManager.Instance.WaferMoved(_targetModule, _targetSlot, ModuleName.TMRobot, (int)_hand);
 
                 return true;

+ 9 - 2
Venus/Venus_RT/Modules/TM/MFPMPlaceRoutine.cs

@@ -49,8 +49,8 @@ namespace Venus_RT.Modules.TM
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
 
-        private int _placingTimeout = 120 * 1000;
-        private int _liftPinTimeout = 20 * 1000;
+        private int _placingTimeout = 20 * 1000;
+        private int _liftPinTimeout = 10 * 1000;
         private int _placeDelayTime = 0;
         private ModuleName _targetModule;
         private PMEntity _pmModule;
@@ -219,6 +219,13 @@ namespace Venus_RT.Modules.TM
         {
             if (_robot.Status == RState.Running)
             {
+                if (Runner.StepElapsedMS > _placingTimeout)
+                {
+                    WaferManager.Instance.CreateDuplicatedWafer(ModuleName.TMRobot, (int)_hand, _targetModule, _targetSlot);
+                    Runner.Stop($"TM Robot place wafer to {_targetModule} timeout, {_placingTimeout}ms");
+                    return true;
+                }
+
                 return false;
             }
             else if (_robot.Status == RState.End)

+ 8 - 2
Venus/Venus_RT/Modules/TM/MFPickRoutine.cs

@@ -34,7 +34,7 @@ namespace Venus_RT.Modules.TM
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
 
-        private int _pickingTimeout = 120 * 1000;
+        private int _pickingTimeout = 20 * 1000;
         private ModuleName _targetModule;
         private LLEntity _llModule;
         int _targetSlot;
@@ -203,11 +203,17 @@ namespace Venus_RT.Modules.TM
         {
             if (_robot.Status == RState.Running)
             {
+                if (Runner.StepElapsedMS > _pickingTimeout)
+                {
+                    WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot, ModuleName.TMRobot, (int)_hand);
+                    Runner.Stop($"TM Robot Picking {_targetModule}.{_targetSlot + 1} wafer timeout, {_pickingTimeout}");
+                    return true;
+                }
+
                 return false;
             }
             else if (_robot.Status == RState.End)
             {
-                //WaferManager.Instance.WaferMoved(ModuleName.TM, (int)_hand, _targetModule, _targetSlot);
                 WaferManager.Instance.WaferMoved(_targetModule, _targetSlot, ModuleName.TMRobot, (int)_hand);
 
                 return true;

+ 8 - 1
Venus/Venus_RT/Modules/TM/MFPlaceRoutine.cs

@@ -34,7 +34,7 @@ namespace Venus_RT.Modules.TM
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
 
-        private int _placingTimeout = 120 * 1000;
+        private int _placingTimeout = 20 * 1000;
         private ModuleName _targetModule;
         private LLEntity _llModule;
         int _targetSlot;
@@ -216,6 +216,13 @@ namespace Venus_RT.Modules.TM
         {
             if (_robot.Status == RState.Running)
             {
+                if (Runner.StepElapsedMS > _placingTimeout)
+                {
+                    WaferManager.Instance.CreateDuplicatedWafer(ModuleName.TMRobot, (int)_hand, _targetModule, _targetSlot);
+                    Runner.Stop($"TM Robot place wafer to {_targetModule}.{_targetSlot + 1} timeout, {_placingTimeout}ms");
+                    return true;
+                }
+
                 return false;
             }
             else if (_robot.Status == RState.End)

+ 8 - 2
Venus/Venus_RT/Modules/TM/MFSwapRoutine.cs

@@ -33,7 +33,7 @@ namespace Venus_RT.Modules.TM
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
 
-        private int _swapTimeout = 120 * 1000;
+        private int _moveTimeout = 30 * 1000;
         private ModuleName _targetModule;
         private LLEntity _llModule;
 
@@ -90,7 +90,6 @@ namespace Venus_RT.Modules.TM
             }
 
             Reset();
-            _swapTimeout = SC.GetValue<int>($"TM.SwapTimeout") * 1000;
 
             _autoVentOptInWafer = SC.GetValue<int>("TM.LLAutoVentInWaferOpt");
             _autoVentOptOutWafer = SC.GetValue<int>("TM.LLAutoVentOutWaferOpt");
@@ -203,6 +202,13 @@ namespace Venus_RT.Modules.TM
         {
             if (_robot.Status == RState.Running)
             {
+                if(Runner.StepElapsedMS > _moveTimeout)
+                {
+                    WaferManager.Instance.CreateDuplicatedWafer(_currentAction.SourceModule, _currentAction.SourceSlot, _currentAction.DestinationModule, _currentAction.DestinationSlot);
+                    Runner.Stop($"TM Robot moving wafer from {_currentAction.SourceModule}.{_currentAction.SourceSlot + 1} to {_currentAction.DestinationModule}.{_currentAction.DestinationSlot + 1} timeout, {_moveTimeout}ms");
+                    return true;
+                }
+
                 return false;
             }
             else if (_robot.Status == RState.End)