DryerRunRecipeRoutine.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using Aitex.Core.RT.SCCore;
  5. using MECF.Framework.Common.RecipeCenter;
  6. using MECF.Framework.Common.Routine;
  7. using CyberX8_Core;
  8. using CyberX8_RT.Devices.Dryer;
  9. using System.Collections.Generic;
  10. using MECF.Framework.Common.CommonData.Dryer;
  11. using MECF.Framework.Common.CommonData;
  12. using MECF.Framework.Common.Alarm;
  13. namespace CyberX8_RT.Modules.Dryer
  14. {
  15. public class DryerRunRecipeRoutine : RoutineBase, IRoutine
  16. {
  17. #region step enum
  18. /// <summary>
  19. /// 步骤枚举
  20. /// </summary>
  21. private enum DryerRunRecipeStep
  22. {
  23. ControlPowerOn,
  24. HighOn,
  25. Delay,
  26. CheckPressureMinimum,
  27. DelayCheckPressureWarning,
  28. CheckPressureWarning,
  29. DelayCheckPressureError,
  30. CheckPressureError,
  31. DelayRecipeTime,
  32. LowerOn,
  33. End
  34. }
  35. #endregion
  36. #region 常量
  37. private const int PRESSURE_DELAY = 500;
  38. private const string EXHAUST_PRESSURE = "ExhaustPressure";
  39. #endregion
  40. #region 内部变量
  41. /// <summary>
  42. /// 设备对象
  43. /// </summary>
  44. private DryerDevice _device;
  45. /// <summary>
  46. /// HVD Recipe
  47. /// </summary>
  48. public HvdRecipe _hvdRecipe;
  49. /// <summary>
  50. /// minimum pressure
  51. /// </summary>
  52. private double _minimumPressure = 0;
  53. /// <summary>
  54. /// Check Pressure Warning Delay Second
  55. /// </summary>
  56. private int _pressureCheckWarningHoldoffSeconds;
  57. /// <summary>
  58. /// Warning Pressure value
  59. /// </summary>
  60. private double _pressureCheckWarningMMHG;
  61. /// <summary>
  62. /// Check Pressure Error Delay Second
  63. /// </summary>
  64. private int _pressureCheckErrorHoldoffSeconds;
  65. /// <summary>
  66. /// Error Pressure value
  67. /// </summary>
  68. private double _pressureCheckErrorMMHG;
  69. /// <summary>
  70. /// recipe时长
  71. /// </summary>
  72. private int _dryProcessTime;
  73. /// <summary>
  74. /// recipe里的DryTime时长
  75. /// </summary>
  76. public int _recipeDrytime;
  77. #endregion
  78. #region 属性
  79. /// <summary>
  80. /// HVD Recipe
  81. /// </summary>
  82. public HvdRecipe HvdRecipe { get { return _hvdRecipe; } }
  83. /// <summary>
  84. /// LotTrack数据
  85. /// </summary>
  86. #endregion
  87. /// <summary>
  88. /// 构造函数
  89. /// </summary>
  90. /// <param name="module"></param>
  91. public DryerRunRecipeRoutine(string module) : base(module)
  92. {
  93. }
  94. /// <summary>
  95. /// 中止
  96. /// </summary>
  97. public void Abort()
  98. {
  99. Runner.Stop("Manual abort dryer run recipe");
  100. _device.BlowerLowOn();
  101. }
  102. /// <summary>
  103. /// 监控
  104. /// </summary>
  105. /// <returns></returns>
  106. public RState Monitor()
  107. {
  108. Runner.Run(DryerRunRecipeStep.ControlPowerOn, () => _device.PowerControlOn(), () => { return _device.CommonData.PowerControl; }, _delay_1s)
  109. .Run(DryerRunRecipeStep.HighOn, () => _device.BlowerHighOn(),()=> { return _device.CommonData.BlowerHigh; }, _delay_1s)
  110. .DelayIf(DryerRunRecipeStep.Delay,!_device.Bypass,PRESSURE_DELAY)
  111. .RunIf(DryerRunRecipeStep.CheckPressureMinimum, !_device.Bypass, CheckPressureMinimum,_delay_1ms)
  112. .Delay(DryerRunRecipeStep.DelayCheckPressureWarning, _pressureCheckWarningHoldoffSeconds * 1000)
  113. .Run(DryerRunRecipeStep.CheckPressureWarning, CheckPressureWaring, _delay_1ms)
  114. .Delay(DryerRunRecipeStep.DelayCheckPressureError, _pressureCheckErrorHoldoffSeconds * 1000)
  115. .Run(DryerRunRecipeStep.CheckPressureError, CheckPressureError, _delay_1ms)
  116. .Delay(DryerRunRecipeStep.DelayRecipeTime, _dryProcessTime)
  117. .Run(DryerRunRecipeStep.LowerOn, () => _device.BlowerLowOn(), _delay_1ms)
  118. .End(DryerRunRecipeStep.End, NullFun, _delay_1ms);
  119. return Runner.Status;
  120. }
  121. /// <summary>
  122. /// 检验Minimum Pressure
  123. /// </summary>
  124. /// <returns></returns>
  125. private bool CheckPressureMinimum()
  126. {
  127. double pressure = _device.CommonData.ExhaustPressure;
  128. if(pressure>=_minimumPressure)
  129. {
  130. NotifyError(eEvent.ERR_DRYER, $"{pressure} is over minimum pressure {_minimumPressure}", 0);
  131. _device.BlowerLowOn();
  132. return false;
  133. }
  134. return true;
  135. }
  136. /// <summary>
  137. /// 检验Pressure是否低于Waring
  138. /// </summary>
  139. /// <returns></returns>
  140. private bool CheckPressureWaring()
  141. {
  142. double pressure = _device.CommonData.ExhaustPressure;
  143. if(pressure > _pressureCheckWarningMMHG)
  144. {
  145. string str = $"{pressure} is large than waring pressure {_pressureCheckWarningMMHG}";
  146. if (AlarmListManager.Instance.AddWarn(Module, "Exhaust Pressure",str))
  147. {
  148. LOG.WriteLog(eEvent.WARN_DRYER, Module,str);
  149. }
  150. }
  151. return true;
  152. }
  153. /// <summary>
  154. /// 检验Pressure是否低于Error
  155. /// </summary>
  156. /// <returns></returns>
  157. private bool CheckPressureError()
  158. {
  159. double pressure = _device.CommonData.ExhaustPressure;
  160. if (pressure > _pressureCheckErrorMMHG)
  161. {
  162. NotifyError(eEvent.ERR_DRYER, $"{pressure} is large than error pressure {_pressureCheckErrorMMHG}",0);
  163. _device.BlowerLowOn();
  164. return false;
  165. }
  166. return true;
  167. }
  168. /// <summary>
  169. /// 启动
  170. /// </summary>
  171. /// <param name="objects"></param>
  172. /// <returns></returns>
  173. public RState Start(params object[] objects)
  174. {
  175. _hvdRecipe = objects[0] as HvdRecipe;
  176. if (_hvdRecipe == null)
  177. {
  178. NotifyError(eEvent.ERR_DRYER, "recipe is null",-1);
  179. return RState.Failed;
  180. }
  181. _device = DEVICE.GetDevice<DryerDevice>(Module);
  182. _recipeDrytime = _hvdRecipe.DryTime;
  183. _pressureCheckWarningHoldoffSeconds = SC.GetValue<int>("Dryer.PressureCheckWarningHoldoffSeconds");
  184. _pressureCheckWarningMMHG = SC.GetValue<double>("Dryer.PressureCheckWarningMMHG");
  185. _pressureCheckErrorHoldoffSeconds = SC.GetValue<int>("Dryer.PressureCheckErrorHoldoffSeconds");
  186. _pressureCheckErrorMMHG = SC.GetValue<double>("Dryer.PressureCheckErrorMMHG");
  187. _minimumPressure = SC.GetValue<double>("Dryer.MinimumPressure");
  188. int dryRecipeTime = _hvdRecipe.DryTime*1000;
  189. int processTime= dryRecipeTime-PRESSURE_DELAY- _pressureCheckWarningHoldoffSeconds*1000- _pressureCheckErrorHoldoffSeconds*1000;
  190. if(processTime>0)
  191. {
  192. _dryProcessTime = processTime;
  193. }
  194. else
  195. {
  196. _dryProcessTime = 1;
  197. }
  198. return Runner.Start(Module, "Start run dryer recipe");
  199. }
  200. }
  201. }