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 LoadLockLeakCheckRoutine : PMRoutineBase, IRoutine { private enum LeakCheckStep { kPumpToBasePressure, kPumpingDelay, kLeakCheckDelay, kEnd, } public double LeakRate { get; private set; } private int _basePressureLL = 100; private int _leakcheckPumpTimeLL = 180; private int _leakcheckWaitTimeLL = 300; private double _startPressure = 0; private double _endPressure = 0; private double _leakRate = 30.0; public LoadLockLeakCheckRoutine(JetPM chamber) : base(chamber) { Name = "Loadlock Leakcheck"; } public RState Start(params object[] objs) { if (CheckLidLoadLock() && CheckSlitDoor() && CheckDryPump()) { Reset(); _chamber.CloseValves(); _basePressureLL = SC.GetValue($"{Module}.Pump.LoadLockPumpBasePressure"); _leakcheckPumpTimeLL = SC.GetValue($"{Module}.Pump.LoadLockLeakCheckPumpTime"); _leakcheckWaitTimeLL = SC.GetValue($"{Module}.Pump.LoadLockLeakCheckPumpTime"); _leakRate = SC.GetValue($"{Module}.Pump.LoadLockLeakRate"); return Runner.Start(Module, Name); } return RState.Failed; } public RState Monitor() { Runner.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); return Runner.Status; } public void Abort() { CloseAllValves(); } bool StartLeakCheck() { _chamber.OpenValve(ValveType.LoadlockPumping, false); _startPressure = _chamber.LoadlockPressure; Notify($"LoadLock压力开始值 {_startPressure} mt"); return true; } bool CalcLeakCheckResult() { _endPressure = _chamber.LoadlockPressure; LeakRate = (_endPressure - _startPressure) * 60.0 / _leakcheckWaitTimeLL; if(LeakRate < _leakRate) { Notify($"LoadLock Leakcheck完成, 压力结束值: {_startPressure} mt, 漏率:{LeakRate} mt/min"); } else { Stop($"LoadLock Leakcheck失败, 腔体漏率 [{LeakRate}] mt/min, 高于 [{_leakRate}] mt/min"); } return true; } } }