SEMFPumpRoutine.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.RT.Routine;
  3. using Aitex.Core.RT.SCCore;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Equipment;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Venus_Core;
  12. using Venus_RT.Devices;
  13. using Venus_RT.Devices.TM;
  14. namespace Venus_RT.Modules.TM.VenusEntity
  15. {
  16. public class SEMFPumpRoutine : ModuleRoutineBase, IRoutine
  17. {
  18. public enum PumpDownStep
  19. {
  20. seWaitModuleReady,
  21. seWaitForelinePump,
  22. seOpenSoftPump,
  23. seSwitchFastPump,
  24. seClosePumpValves,
  25. seDelayForSafe,
  26. seReleasePump
  27. }
  28. private double _pumpBasePressure;
  29. private double _pumpCrossingPressure;
  30. private int _pumpingTimeout;
  31. private int _switchPumpDelay;
  32. private readonly TMBase _TM;
  33. public SEMFPumpRoutine(TMBase tm, ModuleName module) : base(module)
  34. {
  35. _TM = tm;
  36. Name = "Pump Down";
  37. }
  38. public RState Start(params object[] objs)
  39. {
  40. if (ModuleHelper.IsVCE(Module) && !Singleton<RouteManager>.Instance.GetVCE(Module).VCEOutDoorClosed)
  41. {
  42. LOG.Write(eEvent.ERR_VCE_COMMON_Failed, Module, $"cannot pumpdown as {Module}outdoor is open.");
  43. return RState.Failed;
  44. }
  45. //待补充 lid purge状态检查 没有相关IO
  46. if (_TM.CheckVentValveClosed(Module))
  47. {
  48. Reset();
  49. _pumpBasePressure = SC.GetValue<double>($"{Module}.PumpBasePressure");
  50. _pumpCrossingPressure = SC.GetValue<double>($"{Module}.PumpCrossingPressure");
  51. _pumpingTimeout = SC.GetValue<int>($"{Module}.PumpingTimeout") * 1000;
  52. _switchPumpDelay = SC.GetValue<int>($"{Module}.SwitchPumpDelay");
  53. return Runner.Start(Module, Name);
  54. }
  55. return RState.Failed;
  56. }
  57. public RState Monitor()
  58. {
  59. Runner
  60. .Wait(PumpDownStep.seWaitModuleReady, WaitPump, _delay_60s)
  61. .Delay(PumpDownStep.seWaitForelinePump, 3000)
  62. .Run(PumpDownStep.seOpenSoftPump, OpenSoftPump, ArriveCrossPressure, _pumpingTimeout)
  63. .Run(PumpDownStep.seSwitchFastPump, SwitchFastPump, IsPressureReady, _pumpingTimeout)
  64. .Delay(PumpDownStep.seDelayForSafe, _switchPumpDelay)
  65. .Run(PumpDownStep.seClosePumpValves, ClosePumpValves, NullFun)
  66. .End(PumpDownStep.seReleasePump, ReleaseTMPump, NullFun);
  67. return Runner.Status;
  68. }
  69. private bool WaitPump()
  70. {
  71. if (!IsPressureReady())
  72. {
  73. return _TM.TryGetPump(Module);
  74. }
  75. return true;
  76. }
  77. private bool OpenSoftPump()
  78. {
  79. if (!IsPressureReady())
  80. {
  81. _TM.TurnSoftPumpValve(Module, true);
  82. }
  83. return true;
  84. }
  85. private bool ArriveCrossPressure()
  86. {
  87. return _TM.GetModulePressure(Module) < _pumpCrossingPressure;
  88. }
  89. public bool SwitchFastPump()
  90. {
  91. if (!IsPressureReady())
  92. {
  93. _TM.TurnSoftPumpValve(Module, false);
  94. _TM.TurnFastPumpValve(Module, true);
  95. }
  96. return true;
  97. }
  98. public bool IsPressureReady()
  99. {
  100. return _TM.GetModulePressure(Module) < _pumpBasePressure;
  101. }
  102. public bool ClosePumpValves()
  103. {
  104. _TM.TurnFastPumpValve(Module, false);
  105. _TM.TurnSoftPumpValve(Module, false);
  106. return true;
  107. }
  108. public bool ReleaseTMPump()
  109. {
  110. _TM.ReleasePump(Module);
  111. return true;
  112. }
  113. public void Abort()
  114. {
  115. //关闭所有阀体 释放使用权
  116. _TM.TurnFastPumpValve(Module, false);
  117. _TM.TurnSoftPumpValve(Module, false);
  118. _TM.ReleasePump(Module);
  119. }
  120. }
  121. }