LiquidPipeSwitch.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using SHJX.Service.Control.Common.Assets;
  2. namespace SHJX.Service.Control.Execute
  3. {
  4. public class LiquidPipeSwitch
  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 LiquidPipeSwitch() { }
  12. public static LiquidPipeSwitch 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 LiquidPipeSwitch SetLiquidName(string liquidName)
  47. {
  48. _liquidName = liquidName;
  49. return this;
  50. }
  51. /// <summary>
  52. /// 检查是否在原点
  53. /// </summary>
  54. /// <returns></returns>
  55. public LiquidPipeSwitch 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. return res && Executeout();
  112. }
  113. public bool Execute(LiquidSwitchPattern pattern, object value)
  114. {
  115. SetPattern(pattern);
  116. int writeData = pattern switch
  117. {
  118. LiquidSwitchPattern.In => -Math.Abs(Convert.ToInt32(value)),
  119. LiquidSwitchPattern.Out => Math.Abs(Convert.ToInt32(value)),
  120. _ => throw new ArgumentNullException(nameof(pattern)),
  121. };
  122. logger.LogInformation(_liquidName + "****高锰酸钾移动****" + pattern.ToString() + writeData.ToString());
  123. return _liquidName.LiquidMotorMove(writeData);
  124. }
  125. public bool Executeout()
  126. {
  127. SetPattern(LiquidSwitchPattern.Out);
  128. logger.LogInformation(_liquidName + "****高锰酸钾回原点****" + LiquidSwitchPattern.Out.ToString());
  129. return LiquidMotorGoBack(LiquidSwitchPattern.Out);
  130. }
  131. /// <summary>
  132. /// 设置液体模式
  133. /// </summary>
  134. /// <returns></returns>
  135. public void SetPattern(LiquidSwitchPattern pattern)
  136. {
  137. char[] states = _liquidName.MotorRead();
  138. if (states is null or { Length: 0 })
  139. {
  140. throw new ArgumentException($"{pattern}无法读取数据!");
  141. }
  142. OptPipe(() =>
  143. {
  144. char[] readRes = _liquidName.MotorRead();
  145. if (readRes is null or { Length: 0 })
  146. {
  147. Thread.Sleep(1000);
  148. return false;
  149. }
  150. bool res = pattern switch
  151. {
  152. LiquidSwitchPattern.In => readRes[6].Equals('0'),
  153. LiquidSwitchPattern.Out => readRes[7].Equals('0'),
  154. _ => false,
  155. };
  156. return res;
  157. }, pattern.Equals(LiquidSwitchPattern.In) ? -1 : 1);
  158. }
  159. /// <summary>
  160. /// 选择管道(出 or 吸)
  161. /// </summary>
  162. /// <param name="func"></param>
  163. private void OptPipe(Func<bool> func, int orientation)
  164. {
  165. bool res = func.Invoke();
  166. if (res)
  167. {
  168. return;
  169. }
  170. OpenRegister();
  171. Policy.HandleResult<bool>(arg => arg.Equals(false)).RetryForever(_ =>
  172. {
  173. _liquidName.LiquidMotorMove(110 * orientation);
  174. }).Execute(func);
  175. CloseRegister();
  176. }
  177. /// <summary>
  178. /// 打开寄存器
  179. /// </summary>
  180. private void OpenRegister()
  181. {
  182. bool openRes;
  183. do
  184. {
  185. openRes = string.Concat(_liquidName, "Switch").RegisterOpen();
  186. Thread.Sleep(1000);
  187. } while (!openRes);
  188. }
  189. /// <summary>
  190. /// 关闭寄存器
  191. /// </summary>
  192. private void CloseRegister()
  193. {
  194. bool closeRes;
  195. do
  196. {
  197. closeRes = string.Concat(_liquidName, "Switch").RegisterClose();
  198. Thread.Sleep(1000);
  199. } while (!closeRes);
  200. }
  201. }
  202. }