DosingCommonHelper.cs 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using CyberX8_Core;
  4. using CyberX8_RT.Devices.Reservoir;
  5. using CyberX8_RT.Modules.Reservoir;
  6. using MECF.Framework.Common.Persistent.Reservoirs;
  7. using MECF.Framework.Common.Persistent.Temperature;
  8. using MECF.Framework.Common.RecipeCenter;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Reflection;
  12. using static CyberX8_RT.Devices.Reservoir.DosingSystemHelper;
  13. namespace CyberX8_RT.Devices.Dose
  14. {
  15. public class DosingCommonHelper
  16. {
  17. public enum DoseState
  18. {
  19. Init,
  20. Idle,
  21. Error,
  22. Initializing
  23. }
  24. #region 内部变量
  25. /// <summary>
  26. /// ModuleName
  27. /// </summary>
  28. private string _moduleName;
  29. /// <summary>
  30. /// ReplenID
  31. /// </summary>
  32. private int _replenNum;
  33. /// <summary>
  34. /// StandardHotReservoirDevice
  35. /// </summary>
  36. private StandardHotReservoirDevice _shReservoirDevice;
  37. /// <summary>
  38. /// 当前操作
  39. /// </summary>
  40. private List<DosingOperation> _currentDosingOperation;
  41. /// <summary>
  42. /// Replen Persistent Value
  43. /// </summary>
  44. private Dictionary<string, ReplenPersistentValue> _persistentValue = new Dictionary<string, ReplenPersistentValue>();
  45. /// <summary>
  46. /// DosingSystem初始化状态
  47. /// </summary>
  48. private RState _initializeRState;
  49. /// <summary>
  50. /// DosingSystemState
  51. /// </summary>
  52. private string _dosingSystemState;
  53. /// <summary>
  54. /// DosingSystemInitializeRoutine
  55. /// </summary>
  56. private DosingSystemInitializeRoutine _dosingSystemInitializeRoutine;
  57. /// <summary>
  58. /// DosingSystem是否已初始化
  59. /// </summary>
  60. private bool _isDosingSystemInitialized;
  61. #endregion
  62. #region 属性
  63. /// <summary>
  64. /// DosingSystem是否已经Initialized
  65. /// </summary>
  66. public bool IsDosingSystemInitialized { get { return _isDosingSystemInitialized; } }
  67. /// <summary>
  68. /// DosingSystem State
  69. /// </summary>
  70. public string DosingSystemState { get { return _dosingSystemState; } }
  71. /// <summary>
  72. /// DosingSystem Initialize State
  73. /// </summary>
  74. public RState InitializeState { get { return _initializeRState; } }
  75. #endregion
  76. /// <summary>
  77. /// 构造函数
  78. /// </summary>
  79. /// <param name="moduleName"></param>
  80. public DosingCommonHelper(string moduleName, int replenNum)
  81. {
  82. _moduleName = moduleName;
  83. _replenNum = replenNum;
  84. _shReservoirDevice = DEVICE.GetDevice<StandardHotReservoirDevice>($"{_moduleName}");
  85. _currentDosingOperation = new List<DosingOperation>();
  86. for (int i = 0; i < _replenNum; i++)
  87. {
  88. string replenName = "Replen" + (i + 1).ToString();
  89. _currentDosingOperation.Add(DosingOperation.None);
  90. _persistentValue[replenName] = ReplenPersistentManager.Instance.GetReplenPersistentValue(_moduleName, replenName);
  91. }
  92. _dosingSystemInitializeRoutine = new DosingSystemInitializeRoutine(_moduleName);
  93. _dosingSystemState = DoseState.Init.ToString();
  94. }
  95. /// <summary>
  96. /// AutoDose监控
  97. /// </summary>
  98. public void AutoDoseSystemMonitor()
  99. {
  100. for (int i = 0; i < _replenNum; i++)
  101. {
  102. string replenName = "Replen" + (i + 1).ToString();
  103. if (_shReservoirDevice.ReplenDatas[i].IsAutoDosingError)
  104. {
  105. //LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"{replenName} is in Error State");
  106. continue;
  107. }
  108. //AutoDoing条件(1.自动模式 2.当前Recipe非空 3.Recipe未更换)
  109. RdsRecipe recipe = _shReservoirDevice.RdsRecipe[i];
  110. if (recipe != null && _shReservoirDevice.DosingSystemHelpers[i].CheckandLoadRecipe(recipe))
  111. {
  112. //非AutoDosing模式下进入AutoDosing模式,并记录开始数据
  113. if (_currentDosingOperation[i] != DosingOperation.AutoDosing)
  114. {
  115. LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, $"Timing of {replenName} AutoDosing has started now");
  116. _shReservoirDevice.DosingSystemHelpers[i].RecordStartData();
  117. _currentDosingOperation[i] = DosingOperation.AutoDosing;
  118. }
  119. else
  120. {
  121. //AutoDosing模式下,若上一次Dosing完成则再次记录数据
  122. if (_persistentValue[replenName].AutoDosingStartTime == DateTime.MinValue
  123. && _persistentValue[replenName].AutoDosingStartAmpHour == 0)
  124. {
  125. LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, $"Timing of {replenName} AutoDosing has started again now");
  126. _shReservoirDevice.DosingSystemHelpers[i].RecordStartData();
  127. }
  128. }
  129. }
  130. else
  131. {
  132. _currentDosingOperation[i] = DosingOperation.None;
  133. }
  134. //AutoDosing监控
  135. if (!_persistentValue[replenName].IsDosingRunning && _currentDosingOperation[i] == DosingOperation.AutoDosing
  136. && _shReservoirDevice.DosingSystemHelpers[i].AutoDosingMonitor())
  137. {
  138. _shReservoirDevice.DosingSystemHelpers[i].StartDosing(_shReservoirDevice.DosingSystemHelpers[i].AutoDosingVolume, true);
  139. }
  140. }
  141. }
  142. /// <summary>
  143. /// ManualDose监控
  144. /// </summary>
  145. public void ManualDoseSystemMonitor()
  146. {
  147. for (int i = 0; i < _replenNum; i++)
  148. {
  149. string replenName = "Replen" + (i + 1).ToString();
  150. if (_currentDosingOperation[i] == DosingOperation.ManualDosing && !_persistentValue[replenName].IsDosingRunning)
  151. {
  152. _currentDosingOperation[i] = DosingOperation.None;
  153. }
  154. else if (_currentDosingOperation[i] == DosingOperation.ManualDosing && _persistentValue[replenName].IsDosingRunning)
  155. {
  156. continue;
  157. }
  158. }
  159. }
  160. public void CheckDoseOperation()
  161. {
  162. for (int i = 0; i < _replenNum; i++)
  163. {
  164. if (_currentDosingOperation[i] == DosingOperation.AutoDosing)
  165. {
  166. _currentDosingOperation[i] = DosingOperation.None;
  167. }
  168. }
  169. }
  170. /// <summary>
  171. /// Dose状态监控
  172. /// </summary>
  173. public void DoseStatusMonitor()
  174. {
  175. //DosingSystem Initialize监控
  176. if (_initializeRState == RState.Running)
  177. {
  178. DosingInitializingMonitor();
  179. }
  180. for (int i = 0; i < _replenNum; i++)
  181. {
  182. string replenName = "Replen" + (i + 1).ToString();
  183. RState state = _shReservoirDevice.DosingSystemHelpers[i].DosingState;
  184. if (state == RState.Running)
  185. {
  186. _shReservoirDevice.DosingSystemHelpers[i].DosingTimeOutMonitor();
  187. }
  188. else if(state == RState.Failed || state == RState.Timeout)
  189. {
  190. if (_shReservoirDevice.ReplenDatas[i].ReplenPumpEnable)
  191. {
  192. Object[] args = new object[1];
  193. args[0] = replenName;
  194. bool result = _shReservoirDevice.ReplenPumpOffOperation("", args);
  195. if (result)
  196. {
  197. LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, "Replen Pump Off");
  198. }
  199. }
  200. }
  201. //BottleLevel监控
  202. if (_shReservoirDevice.ReplenDatas[i].BottleLevel != BottleLevelState.Warning.ToString())
  203. {
  204. _shReservoirDevice.CheckandUpdateBottleLevel(replenName, -1, false);
  205. }
  206. }
  207. }
  208. /// <summary>
  209. /// 监控DosingSystem初始化
  210. /// </summary>
  211. /// <returns></returns>
  212. public void DosingInitializingMonitor()
  213. {
  214. _initializeRState = _dosingSystemInitializeRoutine.Monitor();
  215. if (_initializeRState == RState.Failed || _initializeRState == RState.Timeout)
  216. {
  217. _dosingSystemState = DoseState.Error.ToString();
  218. }
  219. if (_initializeRState == RState.End)
  220. {
  221. _isDosingSystemInitialized = true;
  222. _dosingSystemState = DoseState.Idle.ToString();
  223. }
  224. }
  225. /// <summary>
  226. /// DosingSystem初始化
  227. /// </summary>
  228. /// <param name="cmd"></param>
  229. /// <param name="args"></param>
  230. /// <returns></returns>
  231. public bool DosingInitialize()
  232. {
  233. _dosingSystemState = DoseState.Initializing.ToString();
  234. _isDosingSystemInitialized = false;
  235. _initializeRState = _dosingSystemInitializeRoutine.Start();
  236. if (_initializeRState == RState.Running) return true;
  237. return false;
  238. }
  239. /// <summary>
  240. /// Enetr Init State
  241. /// </summary>
  242. /// <param name="cmd"></param>
  243. /// <param name="args"></param>
  244. /// <returns></returns>
  245. public bool DosingEnterInit()
  246. {
  247. if (_dosingSystemState == DoseState.Idle.ToString())
  248. {
  249. _dosingSystemState = DoseState.Init.ToString();
  250. }
  251. _isDosingSystemInitialized = false;
  252. return true;
  253. }
  254. }
  255. }