Browse Source

Sequence SPEC update.

sangwq 2 years ago
parent
commit
096c873956

+ 6 - 6
Venus/Framework/Common/Fsm/StateMachine.cs

@@ -162,7 +162,7 @@ namespace Aitex.Core.RT.Fsm
                                     ///add log
                                     if (Name == "EFEM FSM")
                                     {
-                                        //LOG.Write($"状态机 {Name}收到消息 {GetStringMessage(_msgInProcess.Key)}, 状态 {GetStringState(PrevState)}==>{GetStringState(State)} 。");
+                                        LOG.Write(eEvent.EV_FSM_NOTIFY, MECF.Framework.Common.Equipment.ModuleName.System, $"状态机 {Name}收到消息 {GetStringMessage(_msgInProcess.Key)}, 状态 {GetStringState(PrevState)}==>{GetStringState(State)} 。");
                                     }
 
 
@@ -185,7 +185,7 @@ namespace Aitex.Core.RT.Fsm
                     {
                         if (_msgInProcess.Key != (int)FSM_MSG.TIMER)
                         {
-                            //LOG.Warning($"StateMachine [{Name}] no definition of state [{GetStringState(State)}] ");
+                            LOG.Write(eEvent.WARN_FSM_WARN, MECF.Framework.Common.Equipment.ModuleName.System, $"StateMachine [{Name}] no definition of state [{GetStringState(State)}] ");
                         }
 
                         if (_msgInProcess.Key != timeoutMsg.Key)
@@ -201,7 +201,7 @@ namespace Aitex.Core.RT.Fsm
                     {
                         if (_msgInProcess.Key != (int)FSM_MSG.TIMER)
                         {
-                            //LOG.Warning($"StateMachine {Name} no definition of [state={GetStringState(State)}], [message={GetStringMessage(_msgInProcess.Key)}]");
+                            LOG.Write(eEvent.WARN_FSM_WARN, MECF.Framework.Common.Equipment.ModuleName.System, $"StateMachine {Name} no definition of [state={GetStringState(State)}], [message={GetStringMessage(_msgInProcess.Key)}]");
                         }
 
                         if (_msgInProcess.Key != timeoutMsg.Key)
@@ -229,7 +229,7 @@ namespace Aitex.Core.RT.Fsm
                             ///add log
                             if (Name == "EFEM FSM")
                             {
-                                //LOG.Write($"状态机 {Name}收到消息 {GetStringMessage(_msgInProcess.Key)}, 状态 {GetStringState(PrevState)}==>{GetStringState(State)} 。");
+                                LOG.Write(eEvent.EV_FSM_NOTIFY, MECF.Framework.Common.Equipment.ModuleName.System, $"状态机 {Name}收到消息 {GetStringMessage(_msgInProcess.Key)}, 状态 {GetStringState(PrevState)}==>{GetStringState(State)} 。");
                             }
 
                             OnEnterState((int)FSM_STATE.ANY);
@@ -248,11 +248,11 @@ namespace Aitex.Core.RT.Fsm
                 }
                 catch (OperationCanceledException)
                 {
-                    //LOG.Info($"FSM {Name} is canceled");
+                    LOG.Write(eEvent.EV_FSM_NOTIFY, MECF.Framework.Common.Equipment.ModuleName.System, $"FSM {Name} is canceled");
                 }
                 catch (Exception ex)
                 {
-                    LOG.WriteExeption(ex.StackTrace, ex);
+                    LOG.Write(eEvent.EV_FSM_NOTIFY, MECF.Framework.Common.Equipment.ModuleName.System, ex.StackTrace + ex.Message);
                 }
             }
         }

+ 10 - 2
Venus/Framework/Common/Log/LOG.cs

@@ -1,6 +1,7 @@
 using Aitex.Core.RT.SCCore;
 using System;
 using System.Linq;
+using System.Diagnostics;
 using MECF.Framework.Common.Equipment;
 using System.Text;
 using Aitex.Core.RT.Event;
@@ -43,6 +44,13 @@ namespace Aitex.Core.RT.Log
             if (InnerLogger != null)
                 InnerLogger.Error(message);
         }
+        static string GetFormatStackFrameInfo(Exception ex, int traceLevel = 2)
+        {
+            StackFrame sf = new StackTrace(true).GetFrame(traceLevel + 1);
+            string pathFile = sf.GetFileName();
+            string file = string.IsNullOrEmpty(pathFile) ? "" : pathFile.Substring(pathFile.LastIndexOf('\\') + 1);
+            return $"{ex.Message}\r\n{file}\tLine {sf.GetFileLineNumber()}\t{sf.GetMethod().Name}()";
+        }
 
         public static void Write(eEvent id, string module, params string[] values)
         {
@@ -51,12 +59,12 @@ namespace Aitex.Core.RT.Log
 
         public static void WriteExeption(Exception ex)
         {
-            Write(eEvent.ERR_EXCEPTION, ModuleName.System, ex.Message);
+            Write(eEvent.ERR_EXCEPTION, ModuleName.System, GetFormatStackFrameInfo(ex));
         }
 
         public static void WriteExeption(string prefix, Exception ex)
         {
-            Write(eEvent.ERR_EXCEPTION, ModuleName.System, prefix + ex.Message);
+            Write(eEvent.ERR_EXCEPTION, ModuleName.System, prefix + GetFormatStackFrameInfo(ex));
         }
         public static void Write(eEvent id, ModuleName module, params string[] values)
         {

+ 3 - 0
Venus/Venus_Core/EventDefine.cs

@@ -21,6 +21,9 @@ namespace Aitex.Core.RT.Log{
 		EV_WAFER_MANAGER_NOTIFY = 20,
 		WARN_WAFER_MANAGER_WARN = 21,
 		ERR_WAFER_MANAGER_FAILED = 22,
+		EV_FSM_NOTIFY = 23,
+		WARN_FSM_WARN = 24,
+		ERR_FSM_FAILED = 25,
 		INFO_DEVICE_IO_HEATER = 1000,
 		WARN_DEVICE_IO_HEATER = 1001,
 		ERR_DEVICE_IO_HEATER = 1002,

+ 27 - 0
Venus/Venus_RT/Config/LogDefine.json

@@ -180,6 +180,33 @@
     "Note": "Wafermanager Failed"
   },
   {
+    "Id": 23,
+    "Level": "Info",
+    "LogEnum": "EV_FSM_NOTIFY",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "System",
+    "Note": "FSM Notify"
+  },
+  {
+    "Id": 24,
+    "Level": "Warning",
+    "LogEnum": "WARN_FSM_WARN",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "System",
+    "Note": "FSM Warning"
+  },
+  {
+    "Id": 25,
+    "Level": "Error",
+    "LogEnum": "ERR_FSM_FAILED",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "System",
+    "Note": "FSM Failed"
+  },
+  {
     "Id": 1000,
     "Level": "Info",
     "LogEnum": "INFO_DEVICE_IO_HEATER",

+ 10 - 33
Venus/Venus_RT/Devices/AdTecRF.cs

@@ -71,6 +71,7 @@ namespace Venus_RT.Devices
         private readonly double            _scPowerRange;
         private readonly DIAccessor        _diIntlk;
         private StatsDataItemRFAndPump     _statRFOnTime;
+        private readonly VenusDevice        _device;
         // --------------------------Properties------------------------
         //
         public bool ConnectedStatus { get; set; }
@@ -197,6 +198,7 @@ namespace Venus_RT.Devices
         {
             var portNum = SC.GetStringValue(device == VenusDevice.Rf ? $"{mod}.Rf.Port" : $"{mod}.BiasRf.Port");
             this.Status = GeneratorStatus.Unknown;
+            _device     = device;
 
             _serial = new AsyncSerialPort(portNum, 9600, 8, System.IO.Ports.Parity.None, System.IO.Ports.StopBits.One, "\r\r");
 
@@ -478,7 +480,7 @@ namespace Venus_RT.Devices
             str = "";
 
             var _chamber = DEVICE.GetDevice<JetPM>(Module);
-            if (on && !_chamber.CheckGeneratorAndHVInterlock(VenusDevice.Rf))
+            if (on && !_chamber.CheckGeneratorAndHVInterlock(_device))
             {
                 return false;
             }
@@ -796,33 +798,16 @@ namespace Venus_RT.Devices
         /// <param name="c1,c2">百分比数字</param>
         /// <param name="c2"></param>
         /// 
-        private  async void setPos(float c1, float c2)
+        private  async void executeMatchPostion(float c1, float c2)
         {
-            base.SetMatchPosition(c1, c2, out _);
             SetWorkMode(EnumRfMatchTuneMode.Manual);
-            var t = Task.Run(async delegate
-            {
-                await Task.Delay(200);
-                return 42;
-            });
-            await t;
+            await Task.Delay(200);
 
             SetPosition(c1, c2);
-
-            t = Task.Run(async delegate
-            {
-                await Task.Delay(200);
-                return 42;
-            });
-            await t;
+            await Task.Delay(200);
 
             SetPresetMemory(0);
-            t = Task.Run(async delegate
-            {
-                await Task.Delay(200);
-                return 42;
-            });
-            await t;
+            await Task.Delay(200);
 
             SetWorkMode(EnumRfMatchTuneMode.Auto);
         }
@@ -830,18 +815,10 @@ namespace Venus_RT.Devices
         {
 
             LOG.Write(eEvent.WARN_RF, Module, $"AdTec Match error [{c1}, {c2}]");
-            base.SetMatchPosition(c1, c2, out reason);
-
-            setPos(c1, c2);
-           
 
+            base.SetMatchPosition(c1, c2, out reason);
 
-            //Task.Delay(500)
-            //    .ContinueWith(_ => SetPosition(c1, c2))
-            //    .ContinueWith(_ => Task.Delay(500))
-            //    .ContinueWith(_ => SetPresetMemory(0))
-            //    .ContinueWith(_ => Task.Delay(500))
-            //    .ContinueWith(_ => SetWorkMode(EnumRfMatchTuneMode.Auto));
+            executeMatchPostion(c1, c2);
 
             reason = "";
         }
@@ -870,7 +847,7 @@ namespace Venus_RT.Devices
                 {
                     // BYTE 3,4; bit 7
                     string s0 = sItem1.Substring(2 + S3_HEAD_LENGTH, 2);
-                    ushort status0 = Convert.ToUInt16(s0);
+                    ushort status0 = Convert.ToUInt16(s0, 16);
                     byte[] a1 = BitConverter.GetBytes(status0);
 
                     BitArray ba1 = new BitArray(a1);

+ 9 - 9
Venus/Venus_RT/Devices/JetPM.cs

@@ -145,6 +145,7 @@ namespace Venus_RT.Devices
         public bool IsPumpRunning => _MainPump.IsRunning;
         public bool IsTurboPumpRunning => _TurboPump.IsRunning;
         public bool IsTurboPumpAtSpeed => _TurboPump.AtSpeed;
+        public float TurboPumpSpeed => _TurboPump.Speed;
         public bool HasPumpError => _MainPump.IsError || !_MainPump.IsRunning;
 
         public bool HasTurboPumpError => _TurboPump.IsError || !_TurboPump.IsRunning;
@@ -944,46 +945,45 @@ namespace Venus_RT.Devices
         public bool CheckGeneratorAndHVInterlock(VenusDevice device)
         {
             eEvent evt = device == VenusDevice.Rf ? eEvent.ERR_RF : eEvent.ERR_ESC_HV;
-            string deviceName = device == VenusDevice.Rf ? "RF Generator" : "ESC HV";
             if (!PMLidClosed)
             {
-                LOG.Write(evt, Module, $"Cannot Power ON {deviceName} as PM Lid is Open.");
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as PM Lid is Open.");
                 return false;
             }
 
             if (!IsVAC)
             {
-                LOG.Write(evt, Module, $"Cannot Power ON {deviceName} as PM is not Vacuum.");
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as PM is not Vacuum.");
                 return false;
             }
 
             if(!IsWaterFlowOk)
             {
-                LOG.Write(evt, Module, $"Cannot Power ON {deviceName} as Water Flow is OFF.");
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Water Flow is OFF.");
                 return false;
             }
 
             if(!IsRFGInterlockOn)
             {
-                LOG.Write(evt, Module, $"Cannot Power ON {deviceName} as Generator Interlock is OFF.");
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Generator Interlock is OFF.");
                 return false;
             }
 
             if(!SourceRFFanInterlock)
             {
-                LOG.Write(evt, Module, $"Cannot Power ON {deviceName} as Source RF Fan is OFF.");
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Source RF Fan is OFF.");
                 return false;
             }
 
             if(!SlitDoorClosed)
             {
-                LOG.Write(evt, Module, $"Cannot Power ON {deviceName} as Slit Door is open.");
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as Slit Door is open.");
                 return false;
             }
 
-            if(device == VenusDevice.ESCHV && WaferManager.Instance.CheckNoWafer(Module, 0))
+            if ((device == VenusDevice.ESCHV || device == VenusDevice.BiasRf) && WaferManager.Instance.CheckNoWafer(Module, 0))
             {
-                LOG.Write(evt, Module, $"Cannot Power ON {deviceName} as {Module} has no wafer");
+                LOG.Write(evt, Module, $"Cannot Power ON {device} as {Module} has no wafer");
                 return false;
             }
 

+ 8 - 1
Venus/Venus_RT/Devices/PendulumValve.cs

@@ -417,7 +417,14 @@ namespace Venus_RT.Devices
             if (_chamber.ForelinePressure > 500)
             {
                 
-                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Foreline Pressure:{_chamber.ForelinePressure} is too high, can not turn on pendulum valve.");
+                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Foreline Pressure:{_chamber.ForelinePressure} is higher than 500mtorr, can not turn on pendulum valve.");
+                //_noRepeatAlarm($"Foreline Pressure:{_chamber.ForelinePressure} is too high, can not turn on pendulum valve.");
+                return false;
+            }
+
+            if(_chamber.ChamberPressure > 500 && _chamber.TurboPumpSpeed > 100)
+            {
+                LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"Chamber Pressure:{_chamber.ForelinePressure} is higher than 500mtorr, can not turn on pendulum valve.");
                 //_noRepeatAlarm($"Foreline Pressure:{_chamber.ForelinePressure} is too high, can not turn on pendulum valve.");
                 return false;
             }

+ 15 - 2
Venus/Venus_RT/Modules/PMs/LoadLockLeakCheckRoutine.cs

@@ -9,9 +9,12 @@ namespace Venus_RT.Modules.PMs
     {
         private enum LeakCheckStep
         {
+            kCloseValves,
             kPumpToBasePressure,
             kPumpingDelay,
             kLeakCheckDelay,
+            kLeakCheckCalc,
+            kPumpToBasePressure_2,
             kEnd,
         }
         public double LeakRate { get; private set; }
@@ -51,10 +54,13 @@ namespace Venus_RT.Modules.PMs
 
         public RState Monitor()
         {
-            Runner.Run((int)LeakCheckStep.kPumpToBasePressure,  HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockPumping, true),   () => { return _chamber.LoadlockPressure <= _basePressureLL; })
+            Runner.Delay((int)LeakCheckStep.kCloseValves,       _delay_1s)
+                .Run((int)LeakCheckStep.kPumpToBasePressure,    HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockPumping, true),   () => { return _chamber.LoadlockPressure <= _basePressureLL; })
                 .Delay((int)LeakCheckStep.kPumpingDelay,        _leakcheckPumpTimeLL * 1000)
                 .Run((int)LeakCheckStep.kLeakCheckDelay,        StartLeakCheck,                                                         _leakcheckWaitTimeLL * 1000)
-                .End((int)LeakCheckStep.kEnd,                   CalcLeakCheckResult,                                                    _delay_50ms);
+                .Run((int)LeakCheckStep.kLeakCheckCalc,         CalcLeakCheckResult,                                                    _delay_50ms)
+                .Run((int)LeakCheckStep.kPumpToBasePressure_2,  HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockPumping, true),   () => { return _chamber.LoadlockPressure <= _basePressureLL; })
+                .End((int)LeakCheckStep.kEnd,                   LeakCheckEnd,                                                           _delay_50ms);
 
             return Runner.Status;
         }
@@ -90,5 +96,12 @@ namespace Venus_RT.Modules.PMs
             
             return true;
         }
+
+        bool LeakCheckEnd()
+        {
+            // 临时版试验机, 关Pumping Valve, 正式版保持 Pumping Valve 打开
+            _chamber.OpenValve(ValveType.LoadlockPumping, false);
+            return true;
+        }
     }
 }

+ 1 - 1
Venus/Venus_RT/Modules/PMs/LoadLockPurgeRoutine.cs

@@ -63,7 +63,7 @@ namespace Venus_RT.Modules.PMs
                 .LoopRun((int)PurgeStep.kPurgeDelay_2,      HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockVent, false),     _delay_1s)
                 .LoopRun((int)PurgeStep.kPurgePumpToBase,   HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockPumping, true),   () => { return _chamber.LoadlockPressure < _basePressureLL; })
                 .LoopRun((int)PurgeStep.kPurgePumpDelay,    NullFun,                                                                _purgePumpTime * 1000)
-                .LoopEnd((int)PurgeStep.kPurgeEnd,          ClosePumpValve,                                                         _delay_50ms)
+                .LoopEnd((int)PurgeStep.kPurgeEnd,          ClosePumpValve,                                                         _delay_1s)
                 .End((int)PurgeStep.kEnd,                   NullFun,                                                                _delay_50ms);
                 
             return Runner.Status;

+ 28 - 24
Venus/Venus_RT/Modules/PMs/PMPurgeRoutine.cs

@@ -10,22 +10,24 @@ namespace Venus_RT.Modules.PMs
     {
         private enum PurgeStep
         {
+            kStart,
             kCloseValvesExceptN2Purge,
             kPurgeVent,
             kStopVent,
             kCloseISOValve,
             kSoftPump,
             kFastPump,
-            kOpenISOValve,
-            kRoughPump,
             kCloseFastPump,
-            kPurgeDelay,
+            kOpenISOValve,
+            kOpenVATValve,
+            kOpenV8N2Purge,
+            kCloseVATValve,
             kEnd,
         }
 
         public int PurgeCounter { get; private set; }
 
-        private readonly int _forelinePressure = 200;
+        private readonly int _pumpingTargetPressure = 200;
         private int _purgeVentPressure = 1000;
         private int _roughPumpDownPressure = 75;
         private int _purgePumpTime = 60;
@@ -51,7 +53,7 @@ namespace Venus_RT.Modules.PMs
 
                 Reset();
 
-                CloseValvesExceptN2Purge();
+                //CloseValvesExceptN2Purge();
 
                 PurgeCounter = 0;
                 return Runner.Start(Module, Name);
@@ -60,18 +62,19 @@ namespace Venus_RT.Modules.PMs
         }
         public RState Monitor()
         {
-            Runner.Delay((int)PurgeStep.kCloseValvesExceptN2Purge,              _delay_1s)
-                .LoopStart((int)PurgeStep.kPurgeVent,       "Purge Cycle",      _purgeCycleCount,       OpenVentValves,                 () => { return _chamber.ChamberPressure >= _purgeVentPressure; })
-                .LoopRun((int)PurgeStep.kStopVent,          CloseVentValves, _delay_1s)
-                .LoopRun((int)PurgeStep.kCloseISOValve,     HOFs.WrapAction(_chamber.OpenValve, ValveType.TurboPumpPumping, false),     _delay_1s)
+            Runner.Delay((int)PurgeStep.kStart,              _delay_1s)
+                .LoopStart((int)PurgeStep.kCloseValvesExceptN2Purge,       "Purge Cycle",      _purgeCycleCount,                        CloseValvesExceptN2Purge,           _delay_5s)
+                .LoopRun((int)PurgeStep.kPurgeVent,         OpenVentValves,                                                             () => { return _chamber.ChamberPressure >= _purgeVentPressure; })
+                .LoopRun((int)PurgeStep.kStopVent,          CloseVentValves,                                                            _delay_2s)
+                .LoopRun((int)PurgeStep.kCloseISOValve,     HOFs.WrapAction(_chamber.OpenValve, ValveType.TurboPumpPumping, false),     _delay_2s)
                 .LoopRun((int)PurgeStep.kSoftPump,          HOFs.WrapAction(_chamber.OpenValve, ValveType.SoftPump, true),              () => { return _chamber.ChamberPressure <= _roughPumpDownPressure; })
-                .LoopRun((int)PurgeStep.kFastPump,          StartFastPump,                                                              () => { return _chamber.ForelinePressure <= _forelinePressure; })
-                .LoopRun((int)PurgeStep.kOpenISOValve,      HOFs.WrapAction(_chamber.OpenValve, ValveType.TurboPumpPumping, true),      _delay_1s)
-                .LoopRun((int)PurgeStep.kRoughPump,         HOFs.WrapAction(_chamber.OpenValve, ValveType.TurboPumpPurge, true),        _purgePumpTime * 1000)
-                .LoopEnd((int)PurgeStep.kCloseFastPump,     CloseFastPump,                                                              _delay_1s)
-                .Delay((int)PurgeStep.kPurgeDelay,          _delay_1s)
-                .End((int)PurgeStep.kEnd,                   FinalStep,                                                                  _delay_1s);
-
+                .LoopRun((int)PurgeStep.kFastPump,          StartFastPump,                                                              () => { return _chamber.ChamberPressure <= _pumpingTargetPressure; })
+                .LoopRun((int)PurgeStep.kCloseFastPump,     HOFs.WrapAction(_chamber.OpenValve, ValveType.FastPump, false),             _delay_2s)
+                .LoopRun((int)PurgeStep.kOpenISOValve,      HOFs.WrapAction(_chamber.OpenValve, ValveType.TurboPumpPumping, true),      _delay_2s)
+                .LoopRun((int)PurgeStep.kOpenVATValve,      HOFs.Apply(_chamber.TurnPendulumValve, true),                               _delay_5s)
+                .LoopRun((int)PurgeStep.kOpenV8N2Purge,     OpenV8N2Purge,                                                              (_purgePumpTime - 5) * 1000)
+                .LoopEnd((int)PurgeStep.kCloseVATValve,     CloseVATValve,                                                              _delay_1s)
+                .End((int)PurgeStep.kEnd,                   NullFun,                                                                    _delay_1s);
 
             return Runner.Status;
         }
@@ -81,7 +84,7 @@ namespace Venus_RT.Modules.PMs
             CloseAllValves();
         }
 
-        private void CloseValvesExceptN2Purge()
+        private bool CloseValvesExceptN2Purge()
         {
             _chamber.OpenValve(ValveType.Guage, false);
             _chamber.OpenValve(ValveType.SoftPump, false);
@@ -91,17 +94,18 @@ namespace Venus_RT.Modules.PMs
 
             _chamber.OpenValve(ValveType.GasFinal, false);
             _chamber.OpenValve(ValveType.N2, false);
-            _chamber.OpenValve(ValveType.PVN22, false);
 
+            _chamber.OpenValve(ValveType.PVN22, true);
             _chamber.OpenValve(ValveType.TurboPumpPumping, true);
             _chamber.OpenValve(ValveType.TurboPumpPurge, true);
+
+            return true;
         }
 
         private bool OpenVentValves()
         {
             _chamber.OpenValve(ValveType.GasFinal, true);
             _chamber.OpenValve(ValveType.N2, true);
-            _chamber.OpenValve(ValveType.PVN22, true);
 
             return true;
         }
@@ -111,7 +115,7 @@ namespace Venus_RT.Modules.PMs
             _chamber.OpenValve(ValveType.GasFinal, false);
             _chamber.OpenValve(ValveType.N2, false);
             _chamber.OpenValve(ValveType.PVN22, false);
-            _chamber.OpenValve(ValveType.TurboPumpPurge, false);
+            //_chamber.OpenValve(ValveType.TurboPumpPurge, false);
 
             return true;
         }
@@ -124,17 +128,17 @@ namespace Venus_RT.Modules.PMs
             return true;
         }
 
-        private bool FinalStep()
+        private bool OpenV8N2Purge()
         {
             _chamber.OpenValve(ValveType.Guage, true);
-            _chamber.TurnPendulumValve(true);
+            _chamber.OpenValve(ValveType.TurboPumpPurge, true);
 
             return true;
         }
 
-        private bool CloseFastPump()
+        private bool CloseVATValve()
         {
-            _chamber.OpenValve(ValveType.FastPump, false);
+            _chamber.TurnPendulumValve(false);
             PurgeCounter++;
             return true;
         }

+ 23 - 8
Venus/Venus_RT/Modules/PMs/PumpDownRoutine.cs

@@ -10,14 +10,16 @@ namespace Venus_RT.Modules.PMs
     {
         private enum PumpStep
         {
-            kCloseValves,
+            kDelay_2s,
+            kCloseISOValve,
             kSoftPump,
             kFastPump,
             kPVHe2,
             kISOValve,
             kTurboN2Purge,
             kVATValve,
-            kGasFinal,
+            kFinalStep,
+            kEnd,
         }
 
         //private int _ventTime;
@@ -44,7 +46,10 @@ namespace Venus_RT.Modules.PMs
                 _pump_delay = SC.GetValue<int>($"{Module}.Pump.PumpValveDelay") * 1000;
                 _basePressure = (objs.Length >= 1) ? Convert.ToInt32(objs[0]) : SC.GetValue<int>($"{Module}.Pump.PumpBasePressure");
 
+                _chamber.OpenValve(ValveType.PVN22, true);
+                _chamber.OpenValve(ValveType.TurboPumpPumping, true);
                 _chamber.TurnPendulumValve(false);
+                
                 return Runner.Start(Module, Name);
             }
 
@@ -52,14 +57,15 @@ namespace Venus_RT.Modules.PMs
         }
         public RState Monitor()
         {
-            Runner.Delay((int)PumpStep.kCloseValves,    _delay_2s)
+            Runner.Delay((int)PumpStep.kDelay_2s,   _delay_2s)
+                .Run((int)PumpStep.kCloseISOValve,  HOFs.WrapAction(_chamber.OpenValve, ValveType.TurboPumpPumping, false), _delay_2s)
                 .Run((int)PumpStep.kSoftPump,       HOFs.WrapAction(_chamber.OpenValve, ValveType.SoftPump, true),          () => { return _chamber.ChamberPressure < _roughPumpPressure; })
                 .Run((int)PumpStep.kFastPump,       OpenFastPump,                                                           () => { return _chamber.ChamberPressure < _vHe2FlowPressure; })
-                .Run((int)PumpStep.kPVHe2,          OpenHe2Valve, _delay_1s)
-                .Run((int)PumpStep.kISOValve,       OpenISOValve, _delay_1s)
-                .Run((int)PumpStep.kTurboN2Purge,   HOFs.WrapAction(_chamber.OpenValve, ValveType.TurboPumpPurge, true),    _delay_1s)
-                .Run((int)PumpStep.kVATValve,       OpenVATValve,                                                           () => { return _chamber.ChamberPressure < _basePressure; })
-                .End((int)PumpStep.kGasFinal,       HOFs.WrapAction(_chamber.OpenValve, ValveType.GasFinal, true),          _pump_delay);
+                .Run((int)PumpStep.kPVHe2,          OpenHe2Valve,                                                           _delay_2s)
+                .Run((int)PumpStep.kISOValve,       OpenISOValve,                                                           _delay_2s)
+                .Run((int)PumpStep.kVATValve,       OpenVATValve,                                                           _delay_5s)  
+                .Run((int)PumpStep.kFinalStep,      FinalStep,                                                              () => { return _chamber.ChamberPressure < _basePressure; })
+                .End((int)PumpStep.kEnd,            NullFun,                                                                _delay_1s);
 
             return Runner.Status;
         }
@@ -97,6 +103,15 @@ namespace Venus_RT.Modules.PMs
             return _chamber.TurnPendulumValve(true);
         }
 
+        private bool FinalStep()
+        {
+            _chamber.OpenValve(ValveType.Guage, true);
+            _chamber.OpenValve(ValveType.TurboPumpPurge, true);
+            _chamber.OpenValve(ValveType.GasFinal, true);
+
+            return true;
+        }
+
         public void Abort()
         {
             CloseAllValves();

+ 12 - 11
Venus/Venus_RT/Modules/PMs/VentRoutine.cs

@@ -19,7 +19,6 @@ namespace Venus_RT.Modules.PMs
         }
 
         //private int _ventTime;
-        private readonly int _defaut_timeout = 5000;
         private double _ventTimeDelay = 1;  
         private int _checkATMTimeout = 90;
 
@@ -39,6 +38,9 @@ namespace Venus_RT.Modules.PMs
 
                 _chamber.CloseValves();
                 _chamber.OpenValve(ValveType.TurboPumpPumping, true);
+                _chamber.OpenValve(ValveType.TurboPumpPurge, true);
+                _chamber.OpenValve(ValveType.PVN22, true);
+                _chamber.OpenValve(ValveType.GasFinal, true);
 
                 _checkATMTimeout = SC.GetValue<int>($"{Module}.CheckATMTimeout");
                 _ventTimeDelay = SC.GetValue<double>($"{Module}.OverVentTime");
@@ -50,29 +52,28 @@ namespace Venus_RT.Modules.PMs
         }
         public RState Monitor()
         {
-            Runner.Run((int)VentStep.kISODelay, NullFun, _delay_2s)
-                .Run( (int)VentStep.kClosePVValves,         ClosePVValves,                      _delay_5s)
-                .Run(   (int)VentStep.kOpenVentValves,      HOFs.Apply(TurnVentValves, true),   ()=> { return _chamber.IsATM; }, _checkATMTimeout * 1000)
-                .Delay( (int)VentStep.kDelay_2,             (int)_ventTimeDelay)
-                .End(   (int)VentStep.kCloseVentValves,     HOFs.Apply(TurnVentValves, false),   _defaut_timeout);
+            Runner.Delay((int)VentStep.kISODelay,       _delay_2s)
+                .Run((int)VentStep.kClosePVValves,      ClosePVValves,                                              _delay_5s)
+                .Run((int)VentStep.kOpenVentValves,     HOFs.WrapAction(_chamber.OpenValve, ValveType.N2, true),   ()=> { return _chamber.IsATM; }, _checkATMTimeout * 1000)
+                .Delay((int)VentStep.kDelay_2,          (int)_ventTimeDelay)
+                .End((int)VentStep.kCloseVentValves,    CloseVentGasFinalValves,                                    _delay_2s);
 
             return Runner.Status;
         }
 
         private bool ClosePVValves()
         {
+            _chamber.OpenValve(ValveType.Guage, false);
             return _chamber.TurnPendulumValve(false);
         }
 
-        private bool TurnVentValves(bool bOpen)
+        private bool CloseVentGasFinalValves()
         {
-            _chamber.OpenValve(ValveType.GasFinal, bOpen);
-            _chamber.OpenValve(ValveType.N2, bOpen);
-            _chamber.OpenValve(ValveType.PVN22, bOpen);
+            _chamber.OpenValve(ValveType.GasFinal, false);
+            _chamber.OpenValve(ValveType.N2, false);
             return true;
         }
 
-
         public void Abort()
         {
             CloseAllValves();