SEMFLeakCheckRoutine.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. using Aitex.Core.RT.Routine;
  2. using Aitex.Core.RT.SCCore;
  3. using MECF.Framework.Common.DBCore;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.Routine;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Reflection;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using static Mono.Security.X509.X520;
  13. using Venus_Core;
  14. using Venus_RT.Devices;
  15. using Venus_RT.Devices.TM;
  16. using Aitex.Core.UI.DeviceControl;
  17. using System.Windows.Documents;
  18. using Aitex.Core.Util;
  19. using Aitex.Core.RT.Log;
  20. namespace Venus_RT.Modules.TM.VenusEntity
  21. {
  22. public class SEMFLeakCheckRoutine : ModuleRoutineBase, IRoutine
  23. {
  24. private enum LeakCheckStep
  25. {
  26. vWaitPump,
  27. vCloseValves,
  28. vPumpToCrossing,
  29. vPumpToBasePressure,
  30. vPumpingDelay,
  31. vLeakCheckDelay,
  32. vLeakCheckCalc,
  33. vPumpToCrossing_2,
  34. vPumpToBasePressure_2,
  35. vCloseAndRecord,
  36. vEnd,
  37. }
  38. public double LeakRate { get; private set; }
  39. private double _basePressure = 100;
  40. private double _CrossingPressure = 2000;
  41. private int _leakcheckPumpTime = 180;
  42. private int _leakcheckWaitTime = 300;
  43. private double _startPressure = 0;
  44. private double _endPressure = 0;
  45. private double _leakRate = 30.0;
  46. private TMBase _tm;
  47. //public string CurrentStep;
  48. private string _result;
  49. PressureType _pressureType = PressureType.mTorr;
  50. public SEMFLeakCheckRoutine(TMBase tm, ModuleName mod) : base(mod)
  51. {
  52. Name = $"{Module} Leakcheck";
  53. _tm = tm;
  54. }
  55. public RState Start(params object[] objs)
  56. {
  57. if (ModuleHelper.IsVCE(Module) && !Singleton<RouteManager>.Instance.GetVCE(Module).VCEOutDoorClosed)
  58. {
  59. LOG.Write(eEvent.ERR_VCE_COMMON_Failed, Module, $"cannot leakcheck as {Module}outdoor is open.");
  60. return RState.Failed;
  61. }
  62. if (_tm.CheckVentValveClosed(Module) &&
  63. _tm.CheckPumpValveClosed(Module))
  64. {
  65. Reset();
  66. //关闭所有阀体
  67. _tm.CloseModuleAllValves(Module);
  68. _basePressure = SC.GetValue<double>($"{Module}.PumpBasePressure");
  69. _CrossingPressure = SC.GetValue<double>($"{Module}.PumpCrossingPressure");
  70. _leakcheckPumpTime = SC.GetValue<int>($"{Module}.LeakCheckPumpTime");
  71. _leakcheckWaitTime = SC.GetValue<int>($"{Module}.LeakCheckWaitTime");
  72. _leakRate = SC.GetValue<double>($"{Module}.LeakRate");
  73. _result = "";
  74. return Runner.Start(Module, Name);
  75. }
  76. return RState.Failed;
  77. }
  78. public RState Monitor()
  79. {
  80. Runner.Wait(LeakCheckStep.vWaitPump, WaitPumpRelease, _delay_60s)
  81. .Delay(LeakCheckStep.vCloseValves, _delay_1s)
  82. .Run(LeakCheckStep.vPumpToCrossing, HOFs.WrapAction(_tm.TurnSoftPumpValve, Module, true), () => { return _tm.GetModulePressure(Module) <= _CrossingPressure; })
  83. .Run(LeakCheckStep.vPumpToBasePressure, SwitchFastPump, () => { return _tm.GetModulePressure(Module) <= _basePressure; })
  84. .Delay(LeakCheckStep.vPumpingDelay, _leakcheckPumpTime * 1000)
  85. .Run(LeakCheckStep.vLeakCheckDelay, StartLeakCheck, _leakcheckWaitTime * 1000)
  86. .Run(LeakCheckStep.vLeakCheckCalc, CalcLeakCheckResult, _delay_50ms)
  87. .Run(LeakCheckStep.vPumpToCrossing_2, HOFs.WrapAction(_tm.TurnSoftPumpValve, Module, true), () => { return _tm.GetModulePressure(Module) <= _CrossingPressure; })
  88. .Run(LeakCheckStep.vPumpToBasePressure_2, SwitchFastPump, () => { return _tm.GetModulePressure(Module) <= _basePressure; })
  89. .Run(LeakCheckStep.vCloseAndRecord, LeakCheckEnd, _delay_3s)
  90. .End(LeakCheckStep.vEnd, ReleasePump, _delay_50ms);
  91. return Runner.Status;
  92. }
  93. public bool ReleasePump()
  94. {
  95. //释放控制权
  96. _tm.ReleasePump(Module);
  97. return true;
  98. }
  99. public bool WaitPumpRelease()
  100. {
  101. return _tm.TryGetPump(Module);
  102. }
  103. public void Abort()
  104. {
  105. _tm.CloseModuleAllValves(Module);
  106. }
  107. bool StartLeakCheck()
  108. {
  109. _tm.TurnFastPumpValve(Module, false);
  110. _startPressure = _tm.GetModulePressure(Module);
  111. Notify($"{Module} 压力开始值 {_startPressure} {_pressureType}");
  112. return true;
  113. }
  114. bool CalcLeakCheckResult()
  115. {
  116. _endPressure = _tm.GetModulePressure(Module);
  117. LeakRate = (_endPressure - _startPressure) * 60.0 / _leakcheckWaitTime;
  118. if (LeakRate < _leakRate)
  119. {
  120. Notify($"{Module} Leakcheck完成, 压力结束值: {_startPressure}{_pressureType}, 漏率:{LeakRate} {_pressureType}/min");
  121. _result = "Success";
  122. }
  123. else
  124. {
  125. Stop($"{Module} Leakcheck失败, 腔体漏率 [{LeakRate}] {_pressureType}/min, 高于 [{_leakRate}] {_pressureType}/min");
  126. _result = "Fail";
  127. }
  128. return true;
  129. }
  130. bool LeakCheckEnd()
  131. {
  132. _tm.CloseModuleAllValves(Module);
  133. LeakCheckDataRecorder.Add(_leakcheckPumpTime, Math.Round(_startPressure, 1), Math.Round(_endPressure, 1), LeakRate, _result, "", Module.ToString(), "");
  134. return true;
  135. }
  136. private bool SwitchFastPump()
  137. {
  138. _tm.TurnSoftPumpValve(Module, false);
  139. _tm.TurnFastPumpValve(Module, true);
  140. return true;
  141. }
  142. }
  143. }