CrossDoseResetRoutine.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using PunkHPX8_Core;
  5. using PunkHPX8_RT.Devices.Reservoir;
  6. using MECF.Framework.Common.Beckhoff.ModuleIO;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.IOCore;
  9. using MECF.Framework.Common.Persistent.Reservoirs;
  10. using MECF.Framework.Common.Routine;
  11. using MECF.Framework.Common.TwinCat;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Linq;
  15. using System.Reflection;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using System.Windows;
  19. namespace PunkHPX8_RT.Devices.Dose
  20. {
  21. public class CrossDoseResetRoutine : RoutineBase, IRoutine
  22. {
  23. private enum ResetStep
  24. {
  25. Reset_True,
  26. Reset_Wait,
  27. Reset_False,
  28. End
  29. }
  30. private enum POSStatus
  31. {
  32. Busy,
  33. InTarget,
  34. Warning,
  35. Error
  36. }
  37. #region 内部变量
  38. /// <summary>
  39. /// 模块名称
  40. /// </summary>
  41. private string _moduleName;
  42. /// <summary>
  43. /// 超时时间
  44. /// </summary>
  45. private int _timeOut = 2000;
  46. /// <summary>
  47. /// ReservoirsPersistentValue
  48. /// </summary>
  49. private ReservoirsPersistentValue _persistentValue;
  50. #endregion
  51. #region 属性
  52. public RState CurrentState { get { return Runner.Status; } }
  53. #endregion
  54. /// <summary>
  55. /// 构造函数
  56. /// </summary>
  57. /// <param name="module"></param>
  58. public CrossDoseResetRoutine(string module) : base(module)
  59. {
  60. _moduleName = module;
  61. }
  62. /// <summary>
  63. /// Monitor
  64. /// </summary>
  65. /// <returns></returns>
  66. public RState Monitor()
  67. {
  68. Runner.Run(ResetStep.Reset_True, SetTrue, _delay_1ms)
  69. .Wait(ResetStep.Reset_Wait, WaitCompleteEndStatus, _timeOut)
  70. .Run(ResetStep.Reset_False, SetFalse, _delay_1ms)
  71. .End(ResetStep.End, ClearData, _delay_1ms);
  72. return Runner.Status;
  73. }
  74. #region Operation
  75. /// <summary>
  76. /// Reset置1
  77. /// </summary>
  78. /// <returns></returns>
  79. private bool SetTrue()
  80. {
  81. //Reset = 1
  82. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{_moduleName}.TransferPumpReset");
  83. bool result = IOModuleManager.Instance.WriteIoValue(ioName, true);
  84. if (!result)
  85. {
  86. return false;
  87. }
  88. return true;
  89. }
  90. /// <summary>
  91. /// Wait Reset Done End
  92. /// </summary>
  93. /// <returns></returns>
  94. private bool WaitCompleteEndStatus()
  95. {
  96. return false;
  97. }
  98. /// <summary>
  99. /// Reset置0
  100. /// </summary>
  101. /// <returns></returns>
  102. private bool SetFalse()
  103. {
  104. //Reset = 0
  105. string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{_moduleName}.TransferPumpReset");
  106. bool result = IOModuleManager.Instance.WriteIoValue(ioName, false);
  107. if (!result)
  108. {
  109. return false;
  110. }
  111. return true;
  112. }
  113. /// <summary>
  114. /// 清除数据
  115. /// </summary>
  116. /// <returns></returns>
  117. private bool ClearData()
  118. {
  119. _persistentValue.AutoCrossDoseStartTime = DateTime.MinValue;
  120. _persistentValue.AutoCrossDoseStartAmpHour = 0;
  121. ReservoirsPersistentManager.Instance.UpdatePersistentValue(_moduleName);
  122. return true;
  123. }
  124. #endregion
  125. /// <summary>
  126. /// Start
  127. /// </summary>
  128. /// <param name="objs"></param>
  129. /// <returns></returns>
  130. public RState Start(params object[] objs)
  131. {
  132. _persistentValue = ReservoirsPersistentManager.Instance.GetReservoirsPersistentValue(_moduleName);
  133. if (_persistentValue == null)
  134. {
  135. LOG.WriteLog(eEvent.ERR_RESERVOIR, _moduleName, "Reservoir Persistent Value Object is not exist");
  136. return RState.Failed;
  137. }
  138. return Runner.Start(Module, "Reset Cross Dose");
  139. }
  140. /// <summary>
  141. /// Abort
  142. /// </summary>
  143. public void Abort()
  144. {
  145. Runner.Stop($"Stop Reset");
  146. }
  147. /// <summary>
  148. /// POS状态判断
  149. /// </summary>
  150. /// <param name="status"></param>
  151. /// <param name="statusName"></param>
  152. /// <returns></returns>
  153. private bool CheckPOSStatus(ushort status, POSStatus statusName)
  154. {
  155. bool result = false;
  156. switch (statusName)
  157. {
  158. case POSStatus.Busy:
  159. byte bit0 = (byte)(status & 0b0001);
  160. result = (bit0 == 1) ? true : false;
  161. break;
  162. case POSStatus.InTarget:
  163. byte bit1 = (byte)((status & 0b0010) >> 1);
  164. result = (bit1 == 1) ? true : false;
  165. break;
  166. case POSStatus.Warning:
  167. byte bit2 = (byte)((status & 0b0100) >> 2);
  168. result = (bit2 == 1) ? true : false;
  169. break;
  170. case POSStatus.Error:
  171. byte bit3 = (byte)((status & 0b1000) >> 3);
  172. result = (bit3 == 1) ? true : false;
  173. break;
  174. default:
  175. break;
  176. }
  177. return result;
  178. }
  179. }
  180. }