| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 | using System;using Aitex.Core.RT.Log;using Aitex.Core.RT.Routine;using Aitex.Core.RT.SCCore;using VirgoCommon;using VirgoRT.Devices;namespace VirgoRT.Modules.PMs{    class LeakCheckRoutine : PMRoutineBase    {        private enum LeakCheckStep        {            PumpDown,            CheckDoor,            CheckDryPump,            CloseAllValve,            OpenPumpingValve,            OpenGasFinalValve,            CloseGasFinalValve,            OpenMfc1Valve,            OpenMfc2Valve,            OpenMfc3Valve,            OpenMfc4Valve,            OpenMfc5Valve,            CloseMfc1Valve,            CloseMfc2Valve,            CloseMfc3Valve,            CloseMfc4Valve,            CloseMfc5Valve,            StartFlow,            StopFlow,            RecordStartPressure,            RecordEndPressure,            PumpDownDelay,            StartPressureDelay,            EndPressureDelay,            ClosePumpValve,            LeakCheckDelay,            CalcLeakCheck,            End,            EndLeakCheck,            AbortLeakCheck,            CheckPressure        };        // Fields        private double _beginPressure = 0;        private double _endPressure = 0;        private double _leakRate;        public double LeakRate { get; private set; }        private int _leakCheckPumpDownTime;        private int _leakCheckWaitTime;        private LeakCheckMode _mode;        private bool[] _enableGasLine = new bool[5];        private double[] _mfcFlow = new double[5];        private readonly PumpDownRoutine _pumpdownRoutine;        // Properties        //        public int ElapseTime => (int)(delayTimer.GetElapseTime() / 1000.0);        // Constructor        //        public LeakCheckRoutine(JetPM chamber, PumpDownRoutine _pdRoutine) : base(chamber)        {            Name = "leak check";            bUINotify = true;            _pumpdownRoutine = _pdRoutine;        }        public void Terminate()        {        }        public Result Start(params object[] objs)        {            // 预检查            if (CheckLid() == Result.RUN &&                CheckSlitDoor() == Result.RUN &&                CheckDryPump() == Result.RUN)            {                _enableGasLine = new bool[5] { false, false, false, false, false };                _mfcFlow = new double[5] { 0.0, 0.0, 0.0, 0.0, 0.0 };                Reset();                delayTimer.Start(0);                try                {                    if (objs.Length == 0)                    {                        _leakCheckPumpDownTime = SC.GetValue<int>($"{Module}.Pump.LeakCheckPumpingTime");                        _leakCheckWaitTime = SC.GetValue<int>($"{Module}.Pump.LeakCheckWaitTime");                        _leakRate = SC.GetValue<double>($"{Module}.Pump.LeakRate");                        _mode = LeakCheckMode.ChamberOnly;                    }                    else                    {                        _leakCheckPumpDownTime = Convert.ToInt32(objs[0].ToString());                        _leakCheckWaitTime = Convert.ToInt32(objs[1].ToString());                        _mode = (LeakCheckMode)Enum.Parse(typeof(LeakCheckMode), objs[2].ToString());                        _leakRate = Convert.ToInt32(objs[3].ToString());                        for (int i = 0; i < 5; i++)                            _enableGasLine[i] = Convert.ToBoolean(objs[4 + i].ToString());                    }                    for (int i = 0; i < 5; i++)                    {                        if (_enableGasLine[i]) _mfcFlow[i] = SC.GetValue<int>($"{Module}.MfcGas{i + 1}.MfcN2Scale");                    }                }                catch (Exception ex)                {                    LOG.Write(ex);                    return Result.FAIL;                }                return Result.RUN;            }            return Result.FAIL;        }        public Result Monitor()        {            try            {                ExecuteRoutine((int)LeakCheckStep.PumpDown, _pumpdownRoutine);                if (_mode == LeakCheckMode.ChamberOnly)                {                    ;                }                else if (_mode == LeakCheckMode.ChamberAndGasLine)                {                    SetValve((int)LeakCheckStep.OpenGasFinalValve, ValveType.PROCESS, true);                    if (_enableGasLine[0]) SetValve((int)LeakCheckStep.OpenMfc1Valve, ValveType.Mfc1, true);                    if (_enableGasLine[1]) SetValve((int)LeakCheckStep.OpenMfc2Valve, ValveType.Mfc2, true);                    if (_enableGasLine[2]) SetValve((int)LeakCheckStep.OpenMfc3Valve, ValveType.Mfc3, true);                    if (_enableGasLine[3]) SetValve((int)LeakCheckStep.OpenMfc4Valve, ValveType.Mfc4, true);                    if (_enableGasLine[4]) SetValve((int)LeakCheckStep.OpenMfc5Valve, ValveType.Mfc5, true);                }                else if (_mode == LeakCheckMode.ChamberAndGasLineAndFAC)                {                    SetValve((int)LeakCheckStep.OpenGasFinalValve, ValveType.PROCESS, true);                    if (_enableGasLine[0]) SetValve((int)LeakCheckStep.OpenMfc1Valve, ValveType.Mfc1, true);                    if (_enableGasLine[1]) SetValve((int)LeakCheckStep.OpenMfc2Valve, ValveType.Mfc2, true);                    if (_enableGasLine[2]) SetValve((int)LeakCheckStep.OpenMfc3Valve, ValveType.Mfc3, true);                    if (_enableGasLine[3]) SetValve((int)LeakCheckStep.OpenMfc4Valve, ValveType.Mfc4, true);                    if (_enableGasLine[4]) SetValve((int)LeakCheckStep.OpenMfc5Valve, ValveType.Mfc5, true);                    StartFlowMFC((int)LeakCheckStep.StartFlow, _mfcFlow);                }                TimeDelay((int)LeakCheckStep.PumpDownDelay, _leakCheckPumpDownTime);                SetValve((int)LeakCheckStep.ClosePumpValve, ValveType.FAST_PUMP, false);                //记录腔体Start pressure P1                RecordBeginPressure((int)LeakCheckStep.RecordStartPressure);                //pump down delay                TimeDelay((int)LeakCheckStep.EndPressureDelay, _leakCheckWaitTime);                //记录腔体End pressure P2                RecordEndPressure((int)LeakCheckStep.RecordEndPressure);                CalcLeakCheck((int)LeakCheckStep.CalcLeakCheck, _leakRate, _leakCheckWaitTime, 0);                if (_mode == LeakCheckMode.ChamberOnly)                {                    ;                }                else if (_mode == LeakCheckMode.ChamberAndGasLine)                {                    SetValve((int)LeakCheckStep.CloseGasFinalValve, ValveType.PROCESS, false);                    if (_enableGasLine[0]) SetValve((int)LeakCheckStep.CloseMfc1Valve, ValveType.Mfc1, false);                    if (_enableGasLine[1]) SetValve((int)LeakCheckStep.CloseMfc2Valve, ValveType.Mfc2, false);                    if (_enableGasLine[2]) SetValve((int)LeakCheckStep.CloseMfc3Valve, ValveType.Mfc3, false);                    if (_enableGasLine[3]) SetValve((int)LeakCheckStep.CloseMfc4Valve, ValveType.Mfc4, false);                    if (_enableGasLine[4]) SetValve((int)LeakCheckStep.CloseMfc5Valve, ValveType.Mfc5, false);                }                else if (_mode == LeakCheckMode.ChamberAndGasLineAndFAC)                {                    SetValve((int)LeakCheckStep.CloseGasFinalValve, ValveType.PROCESS, false);                    if (_enableGasLine[0]) SetValve((int)LeakCheckStep.CloseMfc1Valve, ValveType.Mfc1, false);                    if (_enableGasLine[1]) SetValve((int)LeakCheckStep.CloseMfc2Valve, ValveType.Mfc2, false);                    if (_enableGasLine[2]) SetValve((int)LeakCheckStep.CloseMfc3Valve, ValveType.Mfc3, false);                    if (_enableGasLine[3]) SetValve((int)LeakCheckStep.CloseMfc4Valve, ValveType.Mfc4, false);                    if (_enableGasLine[4]) SetValve((int)LeakCheckStep.CloseMfc5Valve, ValveType.Mfc5, false);                    StopFlowMFC((int)LeakCheckStep.StopFlow);                }                End((int)LeakCheckStep.End);                //ExecuteRoutine((int)LeakCheckStep.EndLeakCheck, _pumpDownRoutine);            }            catch (RoutineBreakException)            {                return Result.RUN;            }            catch (RoutineFaildException)            {                return Result.FAIL;            }            return Result.DONE;        }        public void DelayLeakCheck(int id, string name, double time)        {            bool Func()            {                Notify(name);                return true;            }            Tuple<bool, Result> ret = Delay(id, Func, time * 1000);            if (ret.Item1)            {                if (ret.Item2 == Result.RUN)                {                    throw new RoutineBreakException();                }            }        }        public void CheckChamberPressure(int id, double target, out double pressure, int time)        {            bool Func()            {                return true;            }            bool? Check1()            {                if (_chamber.ChamberPressure < target)                {                    Notify($"Chamber pressure [{_chamber.ChamberPressure}] mt, less than [{target}] mt");                    return true;                }                Stop($"Chamber pressure [{_chamber.ChamberPressure}], greater than [{target}]");                return false;            }            pressure = _chamber.ChamberPressure;            Tuple<bool, Result> ret = ExecuteAndWait(id, Func, Check1, time * 1000);            if (ret.Item1)            {                if (ret.Item2 == Result.FAIL)                {                    throw new RoutineFaildException();                }                if (ret.Item2 == Result.TIMEOUT)                {                    throw new RoutineFaildException();                }                throw new RoutineBreakException();            }        }        public void RecordBeginPressure(int id)        {            bool Func()            {                _beginPressure = _chamber.ChamberPressure;                Notify($"Record PM begin pressure {_beginPressure} mt");                return true;            }            bool? Check1()            {                return true;            }            Tuple<bool, Result> ret = ExecuteAndWait(id, Func, Check1, 1 * 1000);            if (ret.Item1)            {                if (ret.Item2 == Result.FAIL)                {                    throw new RoutineFaildException();                }                if (ret.Item2 == Result.TIMEOUT)                {                    throw new RoutineFaildException();                }                throw new RoutineBreakException();            }        }        public void RecordEndPressure(int id)        {            bool Func()            {                _endPressure = _chamber.ChamberPressure;                Notify($"Record PM end pressure {_endPressure} mt");                return true;            }            bool? Check1()            {                return true;            }            Tuple<bool, Result> ret = ExecuteAndWait(id, Func, Check1, 1 * 1000);            if (ret.Item1)            {                if (ret.Item2 == Result.FAIL)                {                    throw new RoutineFaildException();                }                if (ret.Item2 == Result.TIMEOUT)                {                    throw new RoutineFaildException();                }                throw new RoutineBreakException();            }        }        public void CalcLeakCheck(int id, double target, int timeRate, int time)        {            bool Func()            {                return true;            }            bool? Check1()            {                LeakRate = (_endPressure - _beginPressure) / (timeRate / 60.0);                if (LeakRate < target)                {                    Notify($"PM leak rate [{LeakRate}] mt/min, less than [{target}] mt/min");                    LeakCheckResultManager.Instance.AddLeakCheck(Module, DateTime.Now, ElapseTime, (int)_beginPressure, (int)_endPressure, LeakRate, LeakCheckStatus.Succeed.ToString(), _mode.ToString());                    return true;                }                Stop($"PM leak rate [{LeakRate}] mt/min, greater than [{target}] mt/min");                LeakCheckResultManager.Instance.AddLeakCheck(Module, DateTime.Now, ElapseTime, (int)_beginPressure, (int)_endPressure, LeakRate, LeakCheckStatus.Failed.ToString(), _mode.ToString());                return false;            }            Tuple<bool, Result> ret = ExecuteAndWait(id, Func, Check1, time * 1000);            if (ret.Item1)            {                if (ret.Item2 == Result.FAIL)                {                    throw new RoutineFaildException();                }                if (ret.Item2 == Result.TIMEOUT)                {                    throw new RoutineFaildException();                }                throw new RoutineBreakException();            }        }        public void StopFlowMFC(int id)        {            bool Func()            {                _chamber.StopAllGases();                return true;            }            bool? Check1()            {                return true;            }            Tuple<bool, Result> ret = ExecuteAndWait(id, Func, Check1, 1 * 1000);            if (ret.Item1)            {                if (ret.Item2 == Result.FAIL)                {                    throw new RoutineFaildException();                }                if (ret.Item2 == Result.TIMEOUT)                {                    throw new RoutineFaildException();                }                throw new RoutineBreakException();            }        }        public void StartFlowMFC(int id, double[] mfcValues)        {            bool Func()            {                for (int index = 0; index < mfcValues.Length; index++)                {                    _chamber.FlowGas(index, mfcValues[index]);                }                return true;            }            bool? Check1()            {                return true;            }            Tuple<bool, Result> ret = ExecuteAndWait(id, Func, Check1, 1 * 1000);            if (ret.Item1)            {                if (ret.Item2 == Result.FAIL)                {                    throw new RoutineFaildException();                }                if (ret.Item2 == Result.TIMEOUT)                {                    throw new RoutineFaildException();                }                throw new RoutineBreakException();            }        }        public void DeleteLeadCheck(object[] args)        {            LeakCheckResultManager.Instance.Delete(Module, args[0].ToString());        }        public override void Abort()        {            try            {                _chamber.CloseValves();                LeakCheckResultManager.Instance.AddLeakCheck(Module, DateTime.Now, ElapseTime, (int)_beginPressure, (int)_chamber.ChamberPressure, 0, LeakCheckStatus.Aborted.ToString(), _mode.ToString());            }            catch (Exception ex)            {                LOG.Write(ex);            }        }    }}
 |