SEMFLeakCheckRoutine.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. namespace Venus_RT.Modules.TM.VenusEntity
  19. {
  20. public class SEMFLeakCheckRoutine : ModuleRoutineBase, IRoutine
  21. {
  22. private enum LeakCheckStep
  23. {
  24. vWaitPump,
  25. vCloseValves,
  26. vPumpToCrossing,
  27. vPumpToBasePressure,
  28. vPumpingDelay,
  29. vLeakCheckDelay,
  30. vLeakCheckCalc,
  31. vPumpToCrossing_2,
  32. vPumpToBasePressure_2,
  33. vCloseAndRecord,
  34. vEnd,
  35. }
  36. public double LeakRate { get; private set; }
  37. private double _basePressure = 100;
  38. private double _CrossingPressure = 2000;
  39. private int _leakcheckPumpTime = 180;
  40. private int _leakcheckWaitTime = 300;
  41. private double _startPressure = 0;
  42. private double _endPressure = 0;
  43. private double _leakRate = 30.0;
  44. private TMBase _tm;
  45. //public string CurrentStep;
  46. private string _result;
  47. PressureType _pressureType = PressureType.mTorr;
  48. public SEMFLeakCheckRoutine(TMBase tm, ModuleName mod) : base(mod)
  49. {
  50. Name = $"{Module} Leakcheck";
  51. _tm = tm;
  52. }
  53. public RState Start(params object[] objs)
  54. {
  55. if (
  56. _tm.CheckVentValveClosed(Module) &&
  57. _tm.CheckPumpValveClosed(Module))
  58. {
  59. Reset();
  60. //关闭所有阀体
  61. _tm.CloseModuleAllValves(Module);
  62. _basePressure = SC.GetValue<double>($"{Module}.PumpBasePressure");
  63. _CrossingPressure = SC.GetValue<double>($"{Module}.PumpCrossingPressure");
  64. _leakcheckPumpTime = SC.GetValue<int>($"{Module}.LeakCheckPumpTime");
  65. _leakcheckWaitTime = SC.GetValue<int>($"{Module}.LeakCheckWaitTime");
  66. _leakRate = SC.GetValue<double>($"{Module}.LeakRate");
  67. _result = "";
  68. return Runner.Start(Module, Name);
  69. }
  70. return RState.Failed;
  71. }
  72. public RState Monitor()
  73. {
  74. Runner.Wait(LeakCheckStep.vWaitPump, WaitPumpRelease, _delay_60s)
  75. .Delay(LeakCheckStep.vCloseValves, _delay_1s)
  76. .Run(LeakCheckStep.vPumpToCrossing, HOFs.WrapAction(_tm.TurnSoftPumpValve, Module, true), () => { return _tm.GetModulePressure(Module) <= _CrossingPressure; })
  77. .Run(LeakCheckStep.vPumpToBasePressure, SwitchFastPump, () => { return _tm.GetModulePressure(Module) <= _basePressure; })
  78. .Delay(LeakCheckStep.vPumpingDelay, _leakcheckPumpTime * 1000)
  79. .Run(LeakCheckStep.vLeakCheckDelay, StartLeakCheck, _leakcheckWaitTime * 1000)
  80. .Run(LeakCheckStep.vLeakCheckCalc, CalcLeakCheckResult, _delay_50ms)
  81. .Run(LeakCheckStep.vPumpToCrossing_2, HOFs.WrapAction(_tm.TurnSoftPumpValve, Module, true), () => { return _tm.GetModulePressure(Module) <= _CrossingPressure; })
  82. .Run(LeakCheckStep.vPumpToBasePressure_2, SwitchFastPump, () => { return _tm.GetModulePressure(Module) <= _basePressure; })
  83. .Run(LeakCheckStep.vCloseAndRecord, LeakCheckEnd, _delay_3s)
  84. .End(LeakCheckStep.vEnd, ReleasePump, _delay_50ms);
  85. return Runner.Status;
  86. }
  87. public bool ReleasePump()
  88. {
  89. //释放控制权
  90. _tm.ReleasePump(Module);
  91. return true;
  92. }
  93. public bool WaitPumpRelease()
  94. {
  95. return _tm.TryGetPump(Module);
  96. }
  97. public void Abort()
  98. {
  99. _tm.CloseModuleAllValves(Module);
  100. }
  101. bool StartLeakCheck()
  102. {
  103. _tm.TurnFastPumpValve(Module, false);
  104. _startPressure = _tm.GetModulePressure(Module);
  105. Notify($"{Module} 压力开始值 {_startPressure} {_pressureType}");
  106. return true;
  107. }
  108. bool CalcLeakCheckResult()
  109. {
  110. _endPressure = _tm.GetModulePressure(Module);
  111. LeakRate = (_endPressure - _startPressure) * 60.0 / _leakcheckWaitTime;
  112. if (LeakRate < _leakRate)
  113. {
  114. Notify($"{Module} Leakcheck完成, 压力结束值: {_startPressure}{_pressureType}, 漏率:{LeakRate} {_pressureType}/min");
  115. _result = "Success";
  116. }
  117. else
  118. {
  119. Stop($"{Module} Leakcheck失败, 腔体漏率 [{LeakRate}] {_pressureType}/min, 高于 [{_leakRate}] {_pressureType}/min");
  120. _result = "Fail";
  121. }
  122. return true;
  123. }
  124. bool LeakCheckEnd()
  125. {
  126. _tm.CloseModuleAllValves(Module);
  127. LeakCheckDataRecorder.Add(_leakcheckPumpTime, Math.Round(_startPressure, 1), Math.Round(_endPressure, 1), LeakRate, _result, "", Module.ToString(), "");
  128. return true;
  129. }
  130. private bool SwitchFastPump()
  131. {
  132. _tm.TurnSoftPumpValve(Module, false);
  133. _tm.TurnFastPumpValve(Module, true);
  134. return true;
  135. }
  136. }
  137. }