LiquidPipeSwitchTitration2.cs 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. using SHJX.Service.Control.Common.Assets;
  2. namespace SHJX.Service.Control.Execute
  3. {
  4. public class LiquidPipeSwitchTitration2
  5. {
  6. #region Fields
  7. private string _liquidName;
  8. private static readonly object obj_locker = new();
  9. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(LiquidPipeSwitch));
  10. #endregion
  11. private LiquidPipeSwitchTitration2() { }
  12. public static LiquidPipeSwitchTitration2 StartNew
  13. {
  14. get
  15. {
  16. lock (obj_locker)
  17. {
  18. return new();
  19. }
  20. }
  21. }
  22. /// <summary>
  23. /// 是否原点
  24. /// </summary>
  25. public bool IsArriveEndPoint
  26. {
  27. get
  28. {
  29. lock (obj_locker)
  30. {
  31. char[] readRes = _liquidName.MotorRead();
  32. if (readRes is null or { Length: 0 })
  33. {
  34. return false;
  35. }
  36. bool arriveEndPoint = readRes[2].Equals('0');
  37. return arriveEndPoint;
  38. }
  39. }
  40. }
  41. /// <summary>
  42. /// 设置液体名称
  43. /// </summary>
  44. /// <param name="liquidName"></param>
  45. /// <returns></returns>
  46. public LiquidPipeSwitchTitration2 SetLiquidName(string liquidName)
  47. {
  48. _liquidName = liquidName;
  49. return this;
  50. }
  51. /// <summary>
  52. /// 检查是否在原点
  53. /// </summary>
  54. /// <returns></returns>
  55. public LiquidPipeSwitchTitration2 CheckWhetherArriveEndPoint(LiquidSwitchPattern pattern = LiquidSwitchPattern.In)
  56. {
  57. bool arriveEndPoint = IsArriveEndPoint;
  58. if (!arriveEndPoint )
  59. {
  60. LiquidMotorGoBack(pattern);//如果不在原点,则切换为出液模式
  61. }
  62. return this;
  63. }
  64. /// <summary>
  65. /// 液体电机返回原点
  66. /// </summary>
  67. /// <param name="pattern"></param>
  68. /// <returns></returns>
  69. public bool LiquidMotorGoBack(LiquidSwitchPattern pattern)
  70. {
  71. SetPattern(pattern); //如果不在原点,则切换为出液模式
  72. var res = _liquidName.MotorGoBack();
  73. try
  74. {
  75. int register = ConfigInstance.GetPortRegister(_liquidName);
  76. int retryCount = 0;
  77. for (; ; )
  78. {
  79. Thread.Sleep(2 * 1000);//如果返回成功,则休眠两秒再次读取
  80. char[] judgeRes = _liquidName.MotorRead();
  81. if (judgeRes is null or not { Length: 8 })
  82. {
  83. return false;
  84. }
  85. bool reread = judgeRes[register - 1].Equals('0');
  86. if (reread)
  87. {
  88. break;
  89. }
  90. retryCount++;
  91. logger.LogInformation($"下发返回原点成功后,再次读取原点信号为false,重发返回原点指令第{retryCount}次");
  92. res = _liquidName.MotorGoBack();
  93. }
  94. return res;
  95. }
  96. catch (Exception ex)
  97. {
  98. logger.LogInformation($"Error:液体电机返回原点异常。Exception:{ex}");
  99. return false;
  100. }
  101. }
  102. /// <summary>
  103. /// 执行液体操作
  104. /// </summary>
  105. /// <param name="value"></param>
  106. /// <returns></returns>
  107. public bool Execute(object value)
  108. {
  109. bool res = Execute(LiquidSwitchPattern.In, value);
  110. return res && Execute(LiquidSwitchPattern.Out, value);
  111. }
  112. public bool Execute(LiquidSwitchPattern pattern, object value)
  113. {
  114. SetPattern(pattern);
  115. int writeData = pattern switch
  116. {
  117. LiquidSwitchPattern.In => -Math.Abs(Convert.ToInt32(value)),
  118. LiquidSwitchPattern.Out => Math.Abs(Convert.ToInt32(value)),
  119. _ => throw new ArgumentNullException(nameof(pattern)),
  120. };
  121. logger.LogInformation(_liquidName + "-*****高锰酸钾2移动*****" + pattern.ToString() + writeData.ToString());
  122. return _liquidName.LiquidMotorMove(writeData);
  123. }
  124. /// <summary>
  125. /// 设置液体模式
  126. /// </summary>
  127. /// <returns></returns>
  128. public void SetPattern(LiquidSwitchPattern pattern)
  129. {
  130. char[] states = _liquidName.MotorRead();
  131. if (states is null or { Length: 0 })
  132. {
  133. throw new ArgumentException($"{pattern}无法读取数据!");
  134. }
  135. OptPipe(() =>
  136. {
  137. char[] readRes = _liquidName.MotorRead();
  138. if (readRes is null or { Length: 0 })
  139. {
  140. Thread.Sleep(1000);
  141. return false;
  142. }
  143. bool res = pattern switch
  144. {
  145. LiquidSwitchPattern.In => readRes[6].Equals('0'),
  146. LiquidSwitchPattern.Out => readRes[7].Equals('0'),
  147. _ => false,
  148. };
  149. return res;
  150. }, pattern.Equals(LiquidSwitchPattern.In) ? -1 : 1);
  151. }
  152. /// <summary>
  153. /// 选择管道(出 or 吸)
  154. /// </summary>
  155. /// <param name="func"></param>
  156. private void OptPipe(Func<bool> func, int orientation)
  157. {
  158. bool res = func.Invoke();
  159. if (res)
  160. {
  161. return;
  162. }
  163. Thread.Sleep(1000);
  164. OpenRegister();
  165. Thread.Sleep(1000);
  166. _liquidName.LiquidMotorMove(50 * orientation);
  167. Policy.HandleResult<bool>(arg => arg.Equals(false)).RetryForever(_ =>
  168. {
  169. _liquidName.LiquidMotorMove(110 * orientation);
  170. }).Execute(func);
  171. Thread.Sleep(1000);
  172. CloseRegister();
  173. Thread.Sleep(2000);
  174. }
  175. /// <summary>
  176. /// 打开寄存器
  177. /// </summary>
  178. private void OpenRegister()
  179. {
  180. bool openRes;
  181. do
  182. {
  183. openRes = string.Concat(_liquidName, "Switch").RegisterOpen();
  184. Thread.Sleep(1000);
  185. } while (!openRes);
  186. }
  187. /// <summary>
  188. /// 关闭寄存器
  189. /// </summary>
  190. private void CloseRegister()
  191. {
  192. bool closeRes;
  193. do
  194. {
  195. closeRes = string.Concat(_liquidName, "Switch").RegisterClose();
  196. Thread.Sleep(1000);
  197. } while (!closeRes);
  198. }
  199. }
  200. }