ExtendScheduler.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. using SHJX.Service.Control.Common.Assets;
  2. using SHJX.Service.Control.Disposables;
  3. using SHJX.Service.Control.Extends;
  4. namespace SHJX.Service.Control.Schedules
  5. {
  6. [EnableScheduling]
  7. public class ExtendScheduler : IScheduler
  8. {
  9. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ExtendScheduler));
  10. private static IDataManager _dataManager;
  11. private static ReadConfigUtil _config;
  12. public ExtendScheduler(IDataManager dataManager, ReadConfigUtil config)
  13. {
  14. _dataManager = dataManager;
  15. _config = config;
  16. }
  17. /// <summary>
  18. /// 自动回原点
  19. /// </summary>
  20. [Scheduled("AutomaticGoBack", 1000)]
  21. public void AutomaticGoBack()
  22. {
  23. bool haveStart = _dataManager.Query<DissolveDate>().Where(it => it.Start.Equals(true)).Any();
  24. if (!haveStart)
  25. {
  26. return;
  27. }
  28. bool haveCache = _dataManager.Query<RouteCache>().Any();
  29. if (haveCache)
  30. {
  31. return;
  32. }
  33. #region 判断是否在消解位区域内
  34. List<MotorMoveStatus> motorMoves = _dataManager.Query<MotorMoveStatus>().ToList();
  35. Axis currentAxis = new()
  36. {
  37. LocationX = motorMoves.FirstOrDefault(it => it.MotorName.Equals(EquipmentNames.AxisX)).CurrentPosition,
  38. LocationY = motorMoves.FirstOrDefault(it => it.MotorName.Equals(EquipmentNames.AxisY)).CurrentPosition,
  39. LocationZ = 0,
  40. LocationZF = 0
  41. };
  42. List<EquipmentArea> dissolveAreas = _dataManager.Query<EquipmentArea>().Where(it => it.AreaName.Equals(AreaName.DISSOLVE_POSITION)).ToList();
  43. bool inDissolveArea = false;
  44. Parallel.ForEach(dissolveAreas, area =>
  45. {
  46. Axis axis = new()
  47. {
  48. LocationX = area.LocationX,
  49. LocationY = area.LocationY,
  50. LocationZ = 0,
  51. LocationZF = 0
  52. };
  53. if (axis.Equals(currentAxis))
  54. {
  55. inDissolveArea = true;
  56. }
  57. });
  58. DissolveDate dissolveDates = _dataManager.Query<DissolveDate>().Where(it => it.Start.Equals(true)).OrderBy(it => it.LastTryTime, OrderPattern.Asc).First();
  59. if (dissolveDates != null)
  60. {
  61. ExecuteTime dissolveExecuteTime = _dataManager.Query<ExecuteTime>().Where(it => it.TypeName.Equals(ExecuteTimeName.DISSOLVE_TIME)).First();
  62. int taskSecondDate = dissolveDates.LastTryTime.GetSecondDifferenceValue();
  63. TaskRuntime.Calculate(dissolveDates.PositionName, out double xNeedTime, out double yNeedTime, out double zNeedTime, out double zfNeedTime);
  64. double needTime = Math.Abs(xNeedTime) + Math.Abs(yNeedTime) + Math.Abs(zNeedTime) + Math.Abs(zfNeedTime);
  65. int sec = (int)DateTime.Now.Subtract(dissolveDates.LastTryTime).TotalSeconds;
  66. if (!inDissolveArea || dissolveExecuteTime.Value * 60 - taskSecondDate <= 2 * needTime)
  67. {
  68. return;
  69. }
  70. }
  71. #endregion
  72. StateMachine status = _dataManager.Query<StateMachine>().Where(item => item.Name.Equals(StateMachineName.MOTOR_LOCK)).First();
  73. if (status is null || status.Status >= 1)
  74. {
  75. return;
  76. }
  77. try
  78. {
  79. _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.MOTOR_LOCK));
  80. string[] items = new string[] { EquipmentNames.AxisX, EquipmentNames.AxisY };
  81. ParallelLoopResult result = Parallel.ForEach(items, item =>
  82. {
  83. ExecuteCommand.MotorGoBackExecute(item);
  84. });
  85. }
  86. finally
  87. {
  88. _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.MOTOR_LOCK));
  89. }
  90. }
  91. ///// <summary>
  92. ///// 草酸钠自动吸液
  93. ///// </summary>
  94. //[Scheduled("InLiquidSodium1Oxalate", 1000)]
  95. //public void InLiquidSodium1Oxalate()
  96. //{
  97. // if (_config.AutomaticInLiquid)
  98. // {
  99. // EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.In(TaskState.Titration, TaskState.Execute)).First();
  100. // if (titrationTask is null)
  101. // {
  102. // return;
  103. // }
  104. // //bool arriveEndPoint = LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).IsArriveEndPoint;
  105. // //if (!arriveEndPoint)
  106. // //{
  107. // // return;
  108. // //}
  109. // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK)).First();
  110. // if (state.Status > 0)
  111. // {
  112. // return;
  113. // }
  114. // LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  115. // if (record is null)
  116. // {
  117. // LiquidRecord liquidRecord = new()
  118. // {
  119. // Point = titrationTask.Source
  120. // };
  121. // _dataManager.Add(liquidRecord);
  122. // }
  123. // record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  124. // if (titrationTask.RouteStep.Equals(PipeName.TITRATION) && record.TitrationSodiumOxalateStatus is null)
  125. // {
  126. // try
  127. // {
  128. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
  129. // logger.LogInformation("自动吸液锁定草酸钠");
  130. // LiquidVolume liquidVolume = _dataManager.Query<LiquidVolume>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
  131. // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
  132. // int distance = Convert.ToInt32(Math.Round((liquidVolume.SampleVolume > liquidAmount.Capacity ? liquidAmount.Capacity : liquidVolume.SampleVolume) / liquidAmount.Amount * liquidAmount.ConvertRatio));
  133. // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).CheckWhetherArriveEndPointOxalate().ExecuteOxalate(LiquidSwitchPattern.In, distance);
  134. // //LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).SetPattern(LiquidSwitchPattern.Out);
  135. // _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationSodiumOxalateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
  136. // }
  137. // finally
  138. // {
  139. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
  140. // logger.LogInformation("自动吸液解锁草酸钠");
  141. // }
  142. // }
  143. // }
  144. //}
  145. ///// <summary>
  146. ///// 草酸钠自动吸液
  147. ///// </summary>
  148. //[Scheduled("InLiquidSodium1Oxalate", 1000)]
  149. //public void InLiquidSodium2Oxalate()
  150. //{
  151. // if (_config.AutomaticInLiquid)
  152. // {
  153. // EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION2) && it.Status.In(TaskState.Titration2, TaskState.Execute)).First();
  154. // if (titrationTask is null)
  155. // {
  156. // return;
  157. // }
  158. // //bool arriveEndPoint = LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium2Oxalate).IsArriveEndPoint;
  159. // //if (!arriveEndPoint)
  160. // //{
  161. // // return;
  162. // //}
  163. // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.SODIUM2OXALATE_LOCK)).First();
  164. // if (state.Status > 0)
  165. // {
  166. // return;
  167. // }
  168. // LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  169. // if (record is null)
  170. // {
  171. // LiquidRecord liquidRecord = new()
  172. // {
  173. // Point = titrationTask.Source
  174. // };
  175. // _dataManager.Add(liquidRecord);
  176. // }
  177. // record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  178. // if (titrationTask.RouteStep.Equals(PipeName.TITRATION2) && record.TitrationSodiumOxalateStatus is null)
  179. // {
  180. // try
  181. // {
  182. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.SODIUM2OXALATE_LOCK));
  183. // logger.LogInformation("自动吸液锁定草酸钠");
  184. // LiquidVolume liquidVolume = _dataManager.Query<LiquidVolume>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium2Oxalate)).First();
  185. // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium2Oxalate)).First();
  186. // int distance = Convert.ToInt32(Math.Round((liquidVolume.SampleVolume > liquidAmount.Capacity ? liquidAmount.Capacity : liquidVolume.SampleVolume) / liquidAmount.Amount * liquidAmount.ConvertRatio));
  187. // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium2Oxalate).CheckWhetherArriveEndPointOxalate().ExecuteOxalate(LiquidSwitchPattern.In, distance);
  188. // //LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).SetPattern(LiquidSwitchPattern.Out);
  189. // _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationSodiumOxalateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
  190. // }
  191. // finally
  192. // {
  193. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.SODIUM2OXALATE_LOCK));
  194. // logger.LogInformation("自动吸液解锁草酸钠2");
  195. // }
  196. // }
  197. // }
  198. //}
  199. ///// <summary>
  200. ///// 草酸钠自动吸液 (但滴定版本)
  201. ///// </summary>
  202. //[Scheduled("InLiquidSodiumOxalate", 1000)]
  203. //public void InLiquidSodiumOxalate()
  204. //{
  205. // if (_config.AutomaticInLiquid)
  206. // {
  207. // bool existTitrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.In(TaskState.Titration, TaskState.Execute)).Any();
  208. // if (existTitrationTask)
  209. // {
  210. // return;
  211. // }
  212. // bool arriveEndPoint = LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).IsArriveEndPoint;
  213. // if (!arriveEndPoint)
  214. // {
  215. // return;
  216. // }
  217. // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK)).First();
  218. // if (state.Status > 0)
  219. // {
  220. // return;
  221. // }
  222. // try
  223. // {
  224. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
  225. // logger.LogInformation("自动吸液锁定草酸钠");
  226. // LiquidVolume liquidVolume = _dataManager.Query<LiquidVolume>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
  227. // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Sodium1Oxalate)).First();
  228. // int distance = Convert.ToInt32(Math.Round((liquidVolume.SampleVolume > liquidAmount.Capacity ? liquidAmount.Capacity : liquidVolume.SampleVolume) / liquidAmount.Amount * liquidAmount.ConvertRatio));
  229. // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).ExecuteOxalate(LiquidSwitchPattern.In, distance);
  230. // //LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Sodium1Oxalate).SetPattern(LiquidSwitchPattern.Out);
  231. // }
  232. // finally
  233. // {
  234. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.SODIUM1OXALATE_LOCK));
  235. // logger.LogInformation("自动吸液解锁草酸钠");
  236. // }
  237. // }
  238. //}
  239. /// <summary>
  240. /// 滴定1高猛酸自动吸液
  241. /// </summary>
  242. [Scheduled("InLiquidPotassiumPermanganate", 1000)]
  243. public void InLiquidPotassiumPermanganate()
  244. {
  245. if (ConfigInstance.IsAutomaticInLiquid)
  246. {
  247. EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION) && it.Status.Equals(TaskState.Titration) || it.RouteStep.Equals(PipeName.TITRATION)&& it.Status.Equals(TaskState.Execute) ).First();
  248. if (titrationTask is null)
  249. {
  250. return;
  251. }
  252. LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  253. if (record is null)
  254. {
  255. LiquidRecord liquidRecord = new()
  256. {
  257. Point = titrationTask.Source
  258. };
  259. _dataManager.Add(liquidRecord);
  260. }
  261. record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  262. if (titrationTask.RouteStep.Equals(PipeName.TITRATION) && record.TitrationPotassiumPermanganateStatus is null)
  263. {
  264. try
  265. {
  266. StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.POTASSIUM1PERMANGANATE_LOCK)).First();
  267. if (state.Status > 0)
  268. {
  269. return;
  270. }
  271. _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.POTASSIUM1PERMANGANATE_LOCK));
  272. if (titrationTask.RouteStep == PipeName.TITRATION)
  273. {
  274. _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationPotassiumPermanganateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
  275. }
  276. logger.LogInformation(titrationTask.Source + "滴定1自动吸液锁定高锰酸盐");
  277. LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Titration1PotassiumPermanganate)).First();
  278. int distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
  279. LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration1PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(LiquidSwitchPattern.In, distance);
  280. LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration1PotassiumPermanganate).SetPattern(LiquidSwitchPattern.Out);
  281. _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.POTASSIUM1PERMANGANATE_LOCK));
  282. logger.LogInformation(titrationTask.Source + "滴定1自动吸液解锁高锰酸盐");
  283. }
  284. finally
  285. {
  286. }
  287. }
  288. }
  289. }
  290. ///// <summary>
  291. ///// 滴定2高猛酸自动吸液
  292. ///// </summary>
  293. //[Scheduled("InLiquidPotassiumPermanganate2", 1000)]
  294. //public void InLiquidPotassiumPermanganate2()
  295. //{
  296. // if (ConfigInstance.IsAutomaticInLiquid)
  297. // {
  298. // EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.TITRATION2) && it.Status.In(TaskState.Titration2, TaskState.Execute)&& it.RouteID != 0).First();
  299. // if (titrationTask is null)
  300. // {
  301. // return;
  302. // }
  303. // LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  304. // if (record is null)
  305. // {
  306. // LiquidRecord liquidRecord = new()
  307. // {
  308. // Point = titrationTask.Source
  309. // };
  310. // _dataManager.Add(liquidRecord);
  311. // }
  312. // record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  313. // if (titrationTask.RouteStep.Equals(PipeName.TITRATION2) && record.TitrationPotassiumPermanganateStatus is null)
  314. // {
  315. // try
  316. // {
  317. // StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK)).First();
  318. // if (state.Status > 0)
  319. // {
  320. // return;
  321. // }
  322. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
  323. // if (titrationTask.RouteStep == PipeName.TITRATION2)
  324. // {
  325. // _dataManager.Update<LiquidRecord>().Invoke(it => it.TitrationPotassiumPermanganateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
  326. // }
  327. // logger.LogInformation(titrationTask.Source + "滴定2自动吸液锁定高锰酸盐");
  328. // LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Titration2PotassiumPermanganate)).First();
  329. // int distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
  330. // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(LiquidSwitchPattern.In, distance);
  331. // LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).SetPattern(LiquidSwitchPattern.Out);
  332. // _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
  333. // logger.LogInformation(titrationTask.Source + "滴定2自动吸液解锁高锰酸盐");
  334. // }
  335. // finally
  336. // {
  337. // }
  338. // }
  339. // }
  340. //}
  341. /// <summary>
  342. /// 加液高猛酸自动吸液
  343. /// </summary>
  344. [Scheduled("InLiquidPotassiumPermanganate0", 1000)]
  345. public void InLiquidPotassiumPermanganate0()
  346. {
  347. if (ConfigInstance.IsAutomaticInLiquid)
  348. {
  349. EquipmentTask titrationTask = _dataManager.Query<EquipmentTask>().Where(it => it.RouteStep.Equals(PipeName.ADD_LIQUID) && it.Status.In( TaskState.AddLiquid, TaskState.Execute)).First();
  350. if (titrationTask is null)
  351. {
  352. return;
  353. }
  354. LiquidRecord record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  355. if (record is null)
  356. {
  357. LiquidRecord liquidRecord = new()
  358. {
  359. Point = titrationTask.Source
  360. };
  361. _dataManager.Add(liquidRecord);
  362. }
  363. record = _dataManager.Query<LiquidRecord>().Where(it => it.Point.Equals(titrationTask.Source)).First();
  364. if (titrationTask.RouteStep.Equals(PipeName.ADD_LIQUID) && record.AddliquidPotassiumPermanganateStatus is null)
  365. {
  366. try
  367. {
  368. StateMachine state = _dataManager.Query<StateMachine>().Where(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK)).First();
  369. if (state.Status > 0)
  370. {
  371. return;
  372. }
  373. _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(1))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
  374. if (titrationTask.RouteStep == PipeName.ADD_LIQUID)
  375. {
  376. _dataManager.Update<LiquidRecord>().Invoke(it => it.AddliquidPotassiumPermanganateStatus.Set(1))(it => it.Point.Equals(titrationTask.Source));
  377. }
  378. logger.LogInformation(titrationTask.Source + "加液自动吸液锁定高锰酸盐");
  379. LiquidAmount liquidAmount = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Titration2PotassiumPermanganate)).First();
  380. LiquidVolume liquidVolume = DataManagerInstance.GetLiquidVolume(EquipmentNames.Titration2PotassiumPermanganate);
  381. if (liquidVolume is null)
  382. {
  383. throw new ArgumentException($"{EquipmentNames.Titration2PotassiumPermanganate}查询Volume为空");
  384. }
  385. int distance = 0;
  386. double count = Math.Floor(liquidVolume.SampleVolume / liquidAmount.Capacity);
  387. if (count < 1)
  388. {
  389. distance = Convert.ToInt32(Math.Round(liquidVolume.SampleVolume / liquidAmount.Amount * liquidAmount.ConvertRatio));
  390. }
  391. else
  392. distance = Convert.ToInt32(Math.Round(liquidAmount.Capacity / liquidAmount.Amount * liquidAmount.ConvertRatio));
  393. LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).CheckWhetherArriveEndPoint().Execute(LiquidSwitchPattern.In, distance);
  394. LiquidPipeSwitch.StartNew.SetLiquidName(EquipmentNames.Titration2PotassiumPermanganate).SetPattern(LiquidSwitchPattern.Out);
  395. _dataManager.Update<StateMachine>().Invoke(it => it.Status.Set(0))(it => it.Name.Equals(StateMachineName.POTASSIUM2PERMANGANATE_LOCK));
  396. logger.LogInformation(titrationTask.Source + "加液自动吸液解锁高锰酸盐");
  397. }
  398. finally
  399. {
  400. }
  401. }
  402. }
  403. }
  404. }
  405. }