Procházet zdrojové kódy

Enhance AutoCycle Module.

sangwq před 1 rokem
rodič
revize
f216c69fcf

+ 40 - 21
Venus/Venus_RT/Modules/AutoCycle.cs

@@ -121,8 +121,6 @@ namespace Venus_RT.Modules
             _LLBInSlot.RemoveAll(item => item >= _LLBSlotNumber);
             _LLBOutSlot.RemoveAll(item => item >= _LLBSlotNumber);
 
-            _cycledCount = 1;
-            _cycledWafer = 2;
             DATA.Subscribe("Scheduler.CycledCount", () => _cycledCount);
             DATA.Subscribe("Scheduler.CycledWafer", () => _cycledWafer);
             DATA.Subscribe("Scheduler.CycleSetPoint", () => _cycleSetPoint);
@@ -578,6 +576,9 @@ namespace Venus_RT.Modules
                         var inSlots = mod.Key == ModuleName.LLA ? _LLAInSlot : _LLBInSlot;
                         foreach(var slot in inSlots)
                         {
+                            if (IsLoadLockReservedByEFEM(mod.Key))
+                                continue;
+
                             if(WaferManager.Instance.CheckHasWafer(mod.Key, slot) && IsVacWaferReadyOut(mod.Key, slot))
                             {
                                 _vacReadyOutSlots.Add(new SlotItem(mod.Key, slot));
@@ -587,7 +588,10 @@ namespace Venus_RT.Modules
                         var outSlots = mod.Key == ModuleName.LLA ? _LLAOutSlot : _LLBOutSlot;
                         foreach(var slot in outSlots)
                         {
-                            if(WaferManager.Instance.CheckNoWafer(mod.Key, slot))
+                            if (IsLoadLockReservedByEFEM(mod.Key))
+                                continue;
+
+                            if (WaferManager.Instance.CheckNoWafer(mod.Key, slot))
                             {
                                 _vacReadyInSlots.Add(new SlotItem(mod.Key, slot));
                             }
@@ -641,15 +645,19 @@ namespace Venus_RT.Modules
             var validSlot = new List<int>();
             if(ModuleHelper.IsLoadLock(mod))
             {
-                var inSlots = mod == ModuleName.LLA ? _LLAInSlot : _LLBInSlot;
-                foreach (var slot in inSlots)
+                if(!IsLoadLockReservedByEFEM(mod))
                 {
-                    if (WaferManager.Instance.CheckNoWafer(mod, slot) && !_movingItems.Exists(item => item.DestinationModule == mod && item.DestinationSlot == slot) && !IsSlotReservedByEFEM(mod, slot))
-                        validSlot.Add(slot);
+                    var inSlots = mod == ModuleName.LLA ? _LLAInSlot : _LLBInSlot;
+                    foreach (var slot in inSlots)
+                    {
+                        if (WaferManager.Instance.CheckNoWafer(mod, slot) && !_movingItems.Exists(item => item.DestinationModule == mod && item.DestinationSlot == slot))
+                            validSlot.Add(slot);
 
-                    if (WaferManager.Instance.CheckHasWafer(mod, slot) && _movingItems.Exists(item => item.SourceModule == mod && item.SourceSlot == slot))
-                        validSlot.Add(slot);
+                        if (WaferManager.Instance.CheckHasWafer(mod, slot) && _movingItems.Exists(item => item.SourceModule == mod && item.SourceSlot == slot))
+                            validSlot.Add(slot);
+                    }
                 }
+
             }
             else if(ModuleHelper.IsPm(mod))
             {
@@ -692,6 +700,9 @@ namespace Venus_RT.Modules
                 if (slot.Module == inModule && _vacModules[slot.Module].MovingStatus == MovingStatus.Moving)
                     continue;
 
+                if (IsLoadLockReservedByEFEM(slot.Module))
+                    continue;
+
                 var wafer = WaferManager.Instance.GetWafer(slot.Module, slot.Slot);
 
                 if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null || wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
@@ -751,6 +762,9 @@ namespace Venus_RT.Modules
 
                     if (ModuleHelper.IsLoadLock(slot.Module))
                     {
+                        if (IsLoadLockReservedByEFEM(slot.Module))
+                            continue;
+
                         if(SearchWaferDestination(slot, out SlotItem destSlot))
                         {
                             _movingItems.Add(new MoveItem(slot.Module, slot.Slot, destSlot.Module, destSlot.Slot, Hand.None));
@@ -773,8 +787,11 @@ namespace Venus_RT.Modules
                             var in_slots = SearchWaitInSlots(slot.Module);
                             foreach(var in_slot in in_slots)
                             {
-                                _movingItems.Add(in_slot);
-                                UpdateItemMovingStatus(in_slot);
+                                if(_vacModules[in_slot.Module].MovingStatus == MovingStatus.Idle)
+                                {
+                                    _movingItems.Add(in_slot);
+                                    UpdateItemMovingStatus(in_slot);
+                                }
                             }
 
                             return;
@@ -799,7 +816,7 @@ namespace Venus_RT.Modules
                             {
                                 // check whether match double move pattern
                                 var same_dest = SearchWaitInSlots(destSlot.Module);
-                                if(same_dest.Count > 0)
+                                if(same_dest.Count > 0 && _vacModules[same_dest[0].SourceModule].MovingStatus == MovingStatus.Idle)
                                 {
                                     _movingItems.Add(same_dest[0]);
                                     UpdateItemMovingStatus(same_dest[0]);
@@ -1032,7 +1049,7 @@ namespace Venus_RT.Modules
         }
         private bool ProcessLLEFEMRobotTask(ModuleName ll)
         {
-            if (_vacModules[ll].MovingStatus != MovingStatus.Idle)
+            if (_vacModules[ll].MovingStatus != MovingStatus.Idle ||  IsLoadLockReservedByTM(ll))
                 return false;
 
             var robotSlots = GetEfemRobotWaferReadyInHands(ll);
@@ -1041,7 +1058,7 @@ namespace Venus_RT.Modules
             {
                 if(robotSlots.Count >= 1)
                 {
-                    if(WaferManager.Instance.CheckNoWafer(ll, slot) && !IsSlotReservedByTM(ll, slot))
+                    if(WaferManager.Instance.CheckNoWafer(ll, slot))
                     {
                         _efemMovingItems.Add(new MoveItem(ModuleName.EfemRobot, robotSlots.First(), ll, slot, (Hand)robotSlots.First()));
                         robotSlots.RemoveAt(0);
@@ -1095,17 +1112,17 @@ namespace Venus_RT.Modules
             return (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0) ? 1 : 0) + (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 1) ? 1 : 0);
         }
 
-        private bool IsSlotReservedByEFEM(ModuleName ll, int slot)
+        private bool IsLoadLockReservedByEFEM(ModuleName ll)
         {
-            if (_efemMovingItems.Exists(item => item.DestinationModule == ll && item.DestinationSlot == slot))
+            if (_efemMovingItems.Exists(item => item.DestinationModule == ll || item.SourceModule == ll))
                 return true;
 
             return false;
         }
 
-        private bool IsSlotReservedByTM(ModuleName ll, int slot)
+        private bool IsLoadLockReservedByTM(ModuleName ll)
         {
-            if (_movingItems.Exists(item => item.DestinationModule == ll && item.DestinationSlot == slot))
+            if (_movingItems.Exists(item => item.DestinationModule == ll || item.SourceModule == ll))
                 return true;
 
             return false;
@@ -1542,11 +1559,13 @@ namespace Venus_RT.Modules
                 if(!ModuleHelper.IsTMRobot(item.DestinationModule) && !ModuleHelper.IsEFEMRobot(item.DestinationModule))
                 {
                     var wafer = WaferManager.Instance.GetWafer(item.DestinationModule, item.DestinationSlot);
-                    if(!wafer.IsEmpty && (wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count ||  wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(item.DestinationModule)))
+                    if(!wafer.IsEmpty && wafer.ProcessJob != null)
                     {
-                        wafer.NextSequenceStep++;
+                        if (wafer.NextSequenceStep < wafer.ProcessJob.Sequence.Steps.Count && wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(item.DestinationModule))
+                            wafer.NextSequenceStep++;
                     }
-                    else
+                    
+                    if(wafer.IsEmpty || wafer.ProcessJob == null)
                     {
                         // should not go here
                         LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"UpateSequenceStep() failed, location: {item.DestinationModule}:{item.DestinationSlot}, NextSequenceStep: {wafer.NextSequenceStep}");

+ 17 - 1
Venus/Venus_RT/Modules/LLs/LLEntity.cs

@@ -164,7 +164,7 @@ namespace Venus_RT.Modules
             Transition(STATE.Pumping,           MSG.Abort,          FnAbortPump,        STATE.Idle);
 
             // Purge sequence
-            Transition(STATE.Idle,              MSG.Purge,     FnStartPurge,       STATE.Purging);
+            Transition(STATE.Idle,              MSG.Purge,          FnStartPurge,       STATE.Purging);
             Transition(STATE.Purging,           FSM_MSG.TIMER,      FnPurgeTimeout,     STATE.Idle);
             Transition(STATE.Purging,           MSG.Abort,          FnAbortPurge,       STATE.Idle);
 
@@ -176,12 +176,16 @@ namespace Venus_RT.Modules
             // Prepare TM Transfer
             Transition(STATE.Idle,              MSG.Prepare_TM,         FnStartPrepareTM,       STATE.Prepare_For_TM);
             Transition(STATE.Prepare_For_TM,    FSM_MSG.TIMER,          FnPreparaTMTimeout,     STATE.Ready_For_TM);
+            Transition(STATE.Prepare_For_TM,    MSG.Abort,              FnAbortPreparaTM,       STATE.Idle);
             Transition(STATE.Ready_For_TM,      MSG.TM_Exchange_Ready,  null,                   STATE.Idle);
+            Transition(STATE.Ready_For_TM,      MSG.Abort,              null,                   STATE.Idle);
 
             // Prepare EFEM Transfer
             Transition(STATE.Idle,              MSG.Prepare_EFEM,       FnStartPrepareEFEM,     STATE.Prepare_For_EFEM);
             Transition(STATE.Prepare_For_EFEM,  FSM_MSG.TIMER,          FnPrepareEFEMTimeout,   STATE.Ready_For_EFEM);
+            Transition(STATE.Prepare_For_EFEM,  MSG.Abort,              FnAbortPrepareEFEM,     STATE.Idle);
             Transition(STATE.Ready_For_EFEM,    MSG.EFEM_Exchange_Ready, null,                  STATE.Idle);
+            Transition(STATE.Ready_For_EFEM,    MSG.Abort,              null,                   STATE.Idle);
 
 
             Running = true;
@@ -406,6 +410,12 @@ namespace Venus_RT.Modules
             return ret == RState.End;
         }
 
+        private bool FnAbortPreparaTM(object[] param)
+        {
+            _pumpingRoutine.Abort();
+            return true;
+        }
+
         private bool FnStartPrepareEFEM(object[] param)
         {
             if (_isATMMode)
@@ -438,6 +448,12 @@ namespace Venus_RT.Modules
             return ret == RState.End;
         }
 
+        private bool FnAbortPrepareEFEM(object[] param)
+        {
+            _ventingRoutine.Abort();
+            return true;
+        }
+
         private void _debugRoutine()
         {
             int flag = 0;

+ 1 - 0
Venus/Venus_RT/Modules/ManualTransfer.cs

@@ -303,6 +303,7 @@ namespace Venus_RT.Modules
         public RState Start(params object[] objs)
         {
             Singleton<TransferModule>.Instance.GetScheduler(ModuleName.TMRobot).ResetTask();
+            Singleton<TransferModule>.Instance.GetScheduler(ModuleName.EfemRobot).ResetTask();
             foreach(var mod in _moduleList)
             {
                 if (ModuleHelper.IsInstalled(mod) && Singleton<TransferModule>.Instance.GetScheduler(mod).IsAvailable)

+ 2 - 1
Venus/Venus_RT/Modules/Schedulers/SchedulerEfemRobot.cs

@@ -188,7 +188,8 @@ namespace Venus_RT.Scheduler
             base.ResetTask();
 
             _entityTaskToken = (int)FSM_MSG.NONE;
-            _currentScheduler.Status = RState.End;
+            if(_currentScheduler != null)
+                _currentScheduler.Status = RState.End;
 
         }
     }

+ 1 - 1
Venus/Venus_RT/Modules/TM/MFPumpRoutine.cs

@@ -47,7 +47,7 @@ namespace Venus_RT.Modules.TM
         public RState Monitor()
         {
             Runner.Wait((int)PumpStep.kWaitPeerModule,  WaitPeerModule)
-                .Run((int)PumpStep.kSoftPump,           OpenSoftPump,                       () => { return _JetTM.TMPressure < _pumpCrossingPressure; }, _pumpingTimeout)
+                .Run((int)PumpStep.kSoftPump,           OpenSoftPump,                       () => { return _JetTM.GetModulePressure(Module) < _pumpCrossingPressure; }, _pumpingTimeout)
                 .Run((int)PumpStep.kFastPump,           SwitchFastPump,                     IsPressureReady,                                                            _pumpingTimeout)
                 .End((int)PumpStep.kClosePumpValves,    ClosePumpValves,                    _delay_50ms);