using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Venus_RT.Devices; using MECF.Framework.Common.Routine; using Venus_Core; namespace Venus_RT.Modules.PMs { class LoadLockPurgeRoutine : PMRoutineBase, IRoutine { private enum PurgeStep { kCloseValves, kPumpToBase, kPurgeDelay_1, kPurgeVent, kPurgeDelay_2, kPurgePumpToBase, kPurgePumpDelay, kPurgeEnd, kEnd, } public int PurgeCounter { get; private set; } private int _basePressureLL = 100; private int _purgeVentPressureLL = 10; private int _purgeCycleCounter = 30; private int _purgePumpTime = 120; public LoadLockPurgeRoutine(JetPMBase chamber) : base(chamber) { Name = "Loadlock Purge"; } public RState Start(params object[] objs) { if (CheckLidLoadLock() && CheckSlitDoor() && CheckDryPump()) { Reset(); _chamber.CloseValves(); _basePressureLL = SC.GetValue($"{Module}.Pump.LoadLockPumpBasePressure"); _purgeVentPressureLL = SC.GetValue($"{Module}.Pump.LoadLockPurgeVentPressure"); _purgeCycleCounter = SC.GetValue($"{Module}.Pump.LoadLockPurgeCycleCount"); _purgePumpTime = SC.GetValue($"{Module}.Pump.LoadLockPurgePumpTime"); PurgeCounter = 0; return Runner.Start(Module, Name); } return RState.Failed; } public RState Monitor() { Runner.Delay(PurgeStep.kCloseValves, _delay_1s) .Run(PurgeStep.kPumpToBase, HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockPumping, true), () => { return _chamber.LoadlockPressure < _basePressureLL; }) .LoopStart(PurgeStep.kPurgeDelay_1, "Purge", _purgeCycleCounter, HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockPumping, false), _delay_1s) .LoopRun(PurgeStep.kPurgeVent, HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockVent, true), () => { return _chamber.LoadlockPressure >= _purgeVentPressureLL; }) .LoopRun(PurgeStep.kPurgeDelay_2, HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockVent, false), _delay_1s) .LoopRun(PurgeStep.kPurgePumpToBase, HOFs.WrapAction(_chamber.OpenValve, ValveType.LoadlockPumping, true), () => { return _chamber.LoadlockPressure < _basePressureLL; }) .LoopRun(PurgeStep.kPurgePumpDelay, NullFun, _purgePumpTime * 1000) .LoopEnd(PurgeStep.kPurgeEnd, ClosePumpValve, _delay_1s) .End(PurgeStep.kEnd, NullFun, _delay_50ms); return Runner.Status; } public void Abort() { CloseAllValves(); } private bool ClosePumpValve() { _chamber.OpenValve(ValveType.LoadlockPumping, false); return true; } } }