Browse Source

enhance the routing algorithm and module online/offline control logic.

sangwq 1 year ago
parent
commit
9144014f90

+ 11 - 4
Venus/Framework/Common/Jobs/SequenceInfo.cs

@@ -14,6 +14,8 @@ namespace MECF.Framework.Common.Jobs
         AInBOut,
         BInAOut,
         DInDOut,
+        AInAOut,
+        BInBOut,
     }
 
     [Serializable]
@@ -144,12 +146,17 @@ namespace MECF.Framework.Common.Jobs
                     // Loadlock Single In Single Out property check
                     var llSteps = info.Steps.FindAll(item => item.StepModules.Contains(ModuleName.LLA) || item.StepModules.Contains(ModuleName.LLB));
                     if ((llSteps.Count == 2) && 
-                        (llSteps[0].StepModules.Count == 1 && llSteps[1].StepModules.Count == 1) && 
-                        (llSteps[0].StepModules[0] != llSteps[1].StepModules[0]))
+                        (llSteps[0].StepModules.Count == 1 && llSteps[1].StepModules.Count == 1))
                     {
-                        info.LLInOutPath = llSteps[0].StepModules[0] == ModuleName.LLA ? SequenceLLInOutPath.AInBOut : SequenceLLInOutPath.BInAOut;
+                        if (llSteps[0].StepModules[0] != llSteps[1].StepModules[0])
+                        {
+                            info.LLInOutPath = llSteps[0].StepModules[0] == ModuleName.LLA ? SequenceLLInOutPath.AInBOut : SequenceLLInOutPath.BInAOut;
+                        }
+                        else
+                        {
+                            info.LLInOutPath = llSteps[0].StepModules[0] == ModuleName.LLA ? SequenceLLInOutPath.AInAOut : SequenceLLInOutPath.BInBOut;
+                        }
                     }
-
                 }
                 catch (Exception ex)
                 {

+ 0 - 8
Venus/Venus_RT/Config/TM/TMInterlock.xml

@@ -12,22 +12,14 @@
 	<Action do="DO_Soft_Pumping_Valve_TM"					value="true" tip="Soft Pumping Valve TM"	tip.zh-CN="" tip.en-US="DO-01" >
 		<Limit di="DI_TM_CHB_Door_Closed"			value="true" tip="TM CHB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-17" />
 		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-		<Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
-		<Limit di="DI_LLA_T_Slit_Door_close_Position"			value="true" tip="LLA Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-25" />
 		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-		<Limit di="DI_LLB_E_Slit_Door_close_Position"			value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
-		<Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />
 		<Limit di="DI_LLB_Lid_Door_Closed"			value="true" tip="LLB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-31" />
 	</Action>
 
 	<Action do="DO_Fast_Pumping_Valve_TM"					value="true" tip="Fast Pumping Valve TM"	tip.zh-CN="" tip.en-US="DO-02" >
 		<Limit di="DI_TM_CHB_Door_Closed"	value="true" tip="TM CHB Lid Door Closed"			tip.zh-CN="" tip.en-US="DI-17" />
 		<Limit di="DI_CDA_Pressure_Switch"			value="true" tip="CDA Pressure Switch"		tip.zh-CN="" tip.en-US="DI-19" />
-		<Limit di="DI_LLA_E_Slit_Door_close_Position"			value="true" tip="LLA In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-23" />
-		<Limit di="DI_LLA_T_Slit_Door_close_Position"			value="true" tip="LLA Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-25" />
 		<Limit di="DI_LLA_Lid_Door_Closed"			value="true" tip="LLA Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-26" />
-		<Limit di="DI_LLB_E_Slit_Door_close_Position"			value="true" tip="LLB In Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-28" />
-		<Limit di="DI_LLB_T_Slit_Door_close_Position"			value="true" tip="LLB Out Slit Door close Position"		tip.zh-CN="" tip.en-US="DI-30" />
 		<Limit di="DI_LLB_Lid_Door_Closed"			value="true" tip="LLB Lid Door Closed"		tip.zh-CN="" tip.en-US="DI-31" />
 	</Action>
 

+ 31 - 26
Venus/Venus_RT/Modules/AutoCycle.cs

@@ -1,7 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
-
+using System.Diagnostics;
 using Aitex.Core.Common;
 using Aitex.Core.RT.Routine;
 using Aitex.Core.RT.SCCore;
@@ -113,6 +113,7 @@ namespace Venus_RT.Modules
         private int _cycleSetPoint = 0;
         private int _cycledCount = 0;
         private int _cycledWafer = 0;
+
         public bool HasJobRunning => _lstControlJobs.Count > 0;
 
         #region public interface
@@ -1205,44 +1206,48 @@ namespace Venus_RT.Modules
 
         private int CanPushInWaferNumber()
         {
+            if (_tmRobot.RobotStatus == RState.Running)
+                return 0;
+
             var llaWaferStatus = GetLLProcessStatusCount(ModuleName.LLA);
             var llbWaferStatus = GetLLProcessStatusCount(ModuleName.LLB);
             var pmWaferStatus = GetPMWaferExistence();
 
             if(_LLInOutPath == SequenceLLInOutPath.AInBOut)
             {
-                return _LLASlotNumber - llaWaferStatus.Item1 - llaWaferStatus.Item2 - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
+                return _LLASlotNumber + pmWaferStatus.Item2 - llaWaferStatus.Item1 - llaWaferStatus.Item2 
+                    - GetTMRobotWaferCount() - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
             }
             else if(_LLInOutPath == SequenceLLInOutPath.BInAOut)
             {
-                return _LLBSlotNumber - llbWaferStatus.Item1 - llbWaferStatus.Item2 - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
+                return _LLBSlotNumber + pmWaferStatus.Item2 - llbWaferStatus.Item1 - llbWaferStatus.Item2 
+                    - GetTMRobotWaferCount() - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
             }
-            else
+            else if(_LLInOutPath == SequenceLLInOutPath.AInAOut || (_LLInOutPath == SequenceLLInOutPath.DInDOut && _vacSchedulers[ModuleName.LLA].IsOnline && !_vacSchedulers[ModuleName.LLB].IsOnline))
             {
-                if(_vacSchedulers[ModuleName.LLA].IsOnline && !_vacSchedulers[ModuleName.LLB].IsOnline)
-                {
-                    return _LLASlotNumber - llaWaferStatus.Item1 - llaWaferStatus.Item2 
-                        - pmWaferStatus.Item1 - GetTMRobotWaferCount() 
-                        - GetEfemRoborWaferCount() - GetAtmInerWaferCount();
-                }
-                else if(!_vacSchedulers[ModuleName.LLA].IsOnline && _vacSchedulers[ModuleName.LLB].IsOnline)
-                {
-                    return _LLBSlotNumber - llbWaferStatus.Item1 - llbWaferStatus.Item2
-                        - pmWaferStatus.Item1 - GetTMRobotWaferCount()
-                        - GetEfemRoborWaferCount() - GetAtmInerWaferCount();
-                }
-                else if(_vacSchedulers[ModuleName.LLA].IsOnline && _vacSchedulers[ModuleName.LLB].IsOnline)
-                {
-                    return (_LLASlotNumber + _LLBSlotNumber) / 2 + pmWaferStatus.Item2
+                return llaWaferStatus.Item1 > 0 ? 0 :
+                    (_LLASlotNumber) / 2 + pmWaferStatus.Item2 - llaWaferStatus.Item2 
+                    - GetTMRobotWaferCount() - GetEfemRoborWaferCount() - GetAtmInerWaferCount();
+                
+            }
+            else if (_LLInOutPath == SequenceLLInOutPath.BInBOut || (_LLInOutPath == SequenceLLInOutPath.DInDOut && !_vacSchedulers[ModuleName.LLA].IsOnline && _vacSchedulers[ModuleName.LLB].IsOnline))
+            {
+                return llbWaferStatus.Item1 > 0 ? 0 : 
+                    (_LLBSlotNumber) / 2 + pmWaferStatus.Item2 - llbWaferStatus.Item2
+                        -GetTMRobotWaferCount() - GetEfemRoborWaferCount() - GetAtmInerWaferCount();
+            }
+            else if(_LLInOutPath == SequenceLLInOutPath.DInDOut && _vacSchedulers[ModuleName.LLA].IsOnline && _vacSchedulers[ModuleName.LLB].IsOnline)
+            {
+                return llaWaferStatus.Item1 + llbWaferStatus.Item1 > 1 ? 0 :
+                    (_LLASlotNumber + _LLBSlotNumber) / 2 + pmWaferStatus.Item2
                     - llaWaferStatus.Item1 - llaWaferStatus.Item2 - llbWaferStatus.Item1 - llbWaferStatus.Item2
                     - GetTMRobotWaferCount() - GetEfemRoborWaferCount() - GetAtmInerWaferCount();
-                }
-                else
-                {
-                    _cycleState = RState.Failed;
-                    LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, "Both LLA/LLB offline, stop runing.");
-                    return 0;
-                }
+            }
+            else
+            {
+                _cycleState = RState.Failed;
+                LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, "Both LLA/LLB offline, stop runing.");
+                return 0;
             }
         }
 

+ 1 - 1
Venus/Venus_RT/Modules/Schedulers/SchedulerLoadLock.cs

@@ -18,7 +18,7 @@ namespace Venus_RT.Modules.Schedulers
     {
         public override bool IsAvailable
         {
-            get { return _entity.IsIdle && /*_entity.IsOnline && */CheckTaskDone(); }
+            get { return _entity.IsIdle && _entity.IsOnline && CheckTaskDone(); }
         }
         public override bool IsOnline
         {

+ 0 - 1
Venus/Venus_RT/Modules/Schedulers/SchedulerLoadPort.cs

@@ -39,7 +39,6 @@ namespace Venus_RT.Modules.Schedulers
  
         }
 
-
         public bool Load()
         {
             //_busy = true;

+ 1 - 1
Venus/Venus_RT/Modules/Schedulers/SchedulerPM.cs

@@ -27,7 +27,7 @@ namespace Venus_RT.Scheduler
     {
         public override bool IsAvailable
         {
-            get { return _entity.IsIdle /*&& _entity.IsOnline*/ && CheckTaskDone() && !_waitCompletejobClean; } // 测试TMCycle, 暂时注释掉 _entity.IsOnline
+            get { return _entity.IsIdle && _entity.IsOnline && CheckTaskDone() && !_waitCompletejobClean; } // 测试TMCycle, 暂时注释掉 _entity.IsOnline
 
         }
         public override bool IsOnline

+ 7 - 1
Venus/Venus_RT/Modules/Schedulers/SchedulerTMRobot.cs

@@ -12,6 +12,7 @@ using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Schedulers;
 using MECF.Framework.Common.SubstrateTrackings;
 using Venus_RT.Scheduler;
+using Venus_Core;
 
 namespace Venus_RT.Modules.Schedulers
 {
@@ -27,7 +28,7 @@ namespace Venus_RT.Modules.Schedulers
     {
         public override bool IsAvailable
         {
-            get { return _entity.IsIdle && /*_entity.IsOnline && */RunSchedulers(); }
+            get { return _entity.IsIdle && _entity.IsOnline && RunSchedulers(); }
         }
         public override bool IsOnline
         {
@@ -40,6 +41,11 @@ namespace Venus_RT.Modules.Schedulers
 
         }
 
+        public RState RobotStatus
+        {
+            get { return _entity.RobotStatus;}
+        }
+
         private TMEntity _entity = null;
         public int _entityTaskToken = (int)FSM_MSG.NONE;
         private Queue<SchedulerItem> _schedulerList = new Queue<SchedulerItem>();

+ 29 - 3
Venus/Venus_RT/Modules/TM/TMEntity.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Diagnostics;
 using System.Collections.Generic;
 using Aitex.Core.RT.Fsm;
 using Aitex.Core.RT.Log;
@@ -100,6 +101,22 @@ namespace Venus_RT.Modules
             get { return !IsInit && !IsError && !IsIdle; }
         }
 
+        public RState RobotStatus
+        {
+            get 
+            {
+                if (_robot.Status != RState.Running)
+                {
+                    if (_robotWatch.ElapsedMilliseconds < 500)
+                        return RState.Running;
+                    else
+                        return _robot.Status;
+                }
+                else
+                    return RState.Running;
+            }
+        }
+
         public bool IsLLSlitDoorClosed(ModuleName ll) => ll == ModuleName.LLA ? _tm.IsLLAESlitDoorClosed : _tm.IsLLBESlitDoorClosed;
         public bool IsLLSlitDoorOpen(ModuleName ll) => ll == ModuleName.LLA ? _tm.IsLLAESlitDoorOpen : _tm.IsLLBESlitDoorOpen;
 
@@ -110,9 +127,6 @@ namespace Venus_RT.Modules
 
         public double TMPressure { get { return _tm.TMPressure; } }
 
-       
-
-
         private readonly JetTM _tm;
         private readonly ITransferRobot _robot;
 
@@ -136,6 +150,9 @@ namespace Venus_RT.Modules
         private bool startControlPressureFlag=true;
         private bool stopControlPressureFlag = true;
 
+        private Stopwatch _robotWatch = new Stopwatch();
+        R_TRIG _robotIdleTrigger = new R_TRIG();
+
         //private readonly Timer controlPressureTimer;
         public TMEntity()
         {
@@ -215,6 +232,8 @@ namespace Venus_RT.Modules
             DATA.Subscribe("TM.IsOnline", () => IsOnline);
             DATA.Subscribe("TM.Home.StepNo", () => _homeRoutine.currentStepNo, SubscriptionAttribute.FLAG.IgnoreSaveDB);
 
+            _robotWatch.Restart();
+
             return true;
         }
 
@@ -662,6 +681,13 @@ namespace Venus_RT.Modules
         }
         private bool ControlPressureTimer_Elapsed(object[] param)
         {
+            // robot idle check
+            _robotIdleTrigger.CLK = _robot.Status != RState.Running;
+            if(_robotIdleTrigger.Q)
+            {
+                _robotWatch.Restart();
+            }
+
             if (RouteManager.IsATMMode)
             {
                 return true;