DosingSystemInitializeRoutine.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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 CyberX8_Core;
  6. using CyberX8_RT.Devices.Reservoir;
  7. using MECF.Framework.Common.Persistent.Reservoirs;
  8. using MECF.Framework.Common.Routine;
  9. using System;
  10. using System.Collections.Generic;
  11. namespace CyberX8_RT.Modules.Reservoir
  12. {
  13. public class DosingSystemInitializeRoutine : RoutineBase, IRoutine
  14. {
  15. private enum InitializeStep
  16. {
  17. CheckState,
  18. InitData,
  19. End
  20. }
  21. #region 内部变量
  22. /// <summary>
  23. /// 模块名称
  24. /// </summary>
  25. private string _moduleName;
  26. /// <summary>
  27. /// SHReservoirDevice
  28. /// </summary>
  29. private StandardHotReservoirDevice _standardHotReservoirdevice;
  30. /// <summary>
  31. /// Replen Persistent Value
  32. /// </summary>
  33. private Dictionary<string, ReplenPersistentValue> _replenPersistentValue = new Dictionary<string, ReplenPersistentValue>();
  34. #endregion
  35. #region 属性
  36. /// <summary>
  37. /// 当前子状态机
  38. /// </summary>
  39. public string CurrentStateMachine
  40. {
  41. get { return Runner.CurrentStep.ToString(); }
  42. }
  43. #endregion
  44. /// <summary>
  45. /// 构造函数
  46. /// </summary>
  47. /// <param name="module"></param>
  48. public DosingSystemInitializeRoutine(string module) : base(module)
  49. {
  50. _moduleName = module;
  51. }
  52. public void Abort()
  53. {
  54. Runner.Stop("Manual Abort");
  55. }
  56. public RState Monitor()
  57. {
  58. Runner.Run(InitializeStep.CheckState, CheckState, NullFun, _delay_1ms)
  59. .Run(InitializeStep.InitData, InitData, NullFun, _delay_1ms)
  60. .End(InitializeStep.End, NullFun);
  61. return Runner.Status;
  62. }
  63. /// <summary>
  64. /// CheckState
  65. /// </summary>
  66. /// <returns></returns>
  67. private bool CheckState()
  68. {
  69. _standardHotReservoirdevice = DEVICE.GetDevice<StandardHotReservoirDevice>($"{_moduleName}");
  70. if (_standardHotReservoirdevice == null)
  71. {
  72. LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, "Reservoir Device is not exist");
  73. return false;
  74. }
  75. for (int i = 0; i < _standardHotReservoirdevice.ReplenNum; i++)
  76. {
  77. if (_standardHotReservoirdevice.ReplenDatas[i].ReplenPumpEnable)
  78. {
  79. //未关则关闭Replen Pump
  80. Object[] args = new object[1];
  81. args[0] = "Replen"+(i+1).ToString();
  82. bool result = _standardHotReservoirdevice.ReplenPumpOffOperation("", args);
  83. if (result)
  84. {
  85. LOG.WriteLog(eEvent.INFO_RESERVOIR, _moduleName, "Replen Pump Off");
  86. }
  87. else
  88. {
  89. LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, "Replen Pump Off is failed");
  90. return false;
  91. }
  92. }
  93. }
  94. return true;
  95. }
  96. /// <summary>
  97. /// Clear Data
  98. /// </summary>
  99. /// <returns></returns>
  100. private bool InitData()
  101. {
  102. for (int i = 0; i < _standardHotReservoirdevice.ReplenNum; i++)
  103. {
  104. string replenName = "Replen" + (i + 1).ToString();
  105. _replenPersistentValue[replenName] = ReplenPersistentManager.Instance.GetReplenPersistentValue(_moduleName, replenName);
  106. if (_replenPersistentValue[replenName] == null)
  107. {
  108. LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, $"{replenName} persistent file is null");
  109. return false;
  110. }
  111. _replenPersistentValue[replenName].CurrentDosingVolume = 0;
  112. _replenPersistentValue[replenName].AutoDosingStartAmpHour = 0;
  113. _replenPersistentValue[replenName].AutoDosingStartTime = DateTime.MinValue;
  114. _replenPersistentValue[replenName].IsDosingRunning = false;
  115. _replenPersistentValue[replenName].TargetDosingVolume = 0;
  116. ReplenPersistentManager.Instance.UpdatePersistentValue(_moduleName, replenName);
  117. _standardHotReservoirdevice.CheckandUpdateBottleLevel(replenName);
  118. _standardHotReservoirdevice.ReplenDatas[i].IsAutoDosingError = false;
  119. }
  120. return true;
  121. }
  122. /// <summary>
  123. /// 启动
  124. /// </summary>
  125. /// <param name="objs"></param>
  126. /// <returns></returns>
  127. public RState Start(params object[] objs)
  128. {
  129. return Runner.Start(Module, "DosingSystem Initialize");
  130. }
  131. }
  132. }