ManualService.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. using SHJX.Service.Control.Common.Assets;
  2. using SHJX.Service.Control.Execute.TitrationController;
  3. using shjxCamera;
  4. namespace SHJX.Service.Control.Service
  5. {
  6. public class ManualService : IManualService
  7. {
  8. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ManualService));
  9. #region Field
  10. private readonly IEventAggregator _ea;
  11. private readonly IDataManager _dataManager;
  12. private readonly ReadConfigUtil _readConfig;
  13. public readonly static List<double> GraberValues = new();
  14. public readonly static List<double> GraberValues2 = new();
  15. #endregion
  16. #region Property
  17. public Dictionary<string, string> ManualTabItems => _readConfig.GetManualTabItem;
  18. public double DissolveTemperatureDefaultValue => _readConfig.DissolveTemperatureValue;
  19. public double TitrationTemperatureDefaultValue => _readConfig.TitrationTemperatureValue;
  20. #endregion
  21. public ManualService(IEventAggregator ea, IDataManager dataManager, ReadConfigUtil readConfig)
  22. {
  23. _ea = ea;
  24. _dataManager = dataManager;
  25. _readConfig = readConfig;
  26. Messager<object>.Register("GraberColorValue", GetGraberValue);
  27. Messager<object>.Register("TitrationStart", ExecuteTitrationStart);
  28. Messager<object>.Register("TitrationStop", ExecuteTitrationStop);
  29. Messager<TitrationValueArgs>.Register("TitrationValueChange", ExecuteTitrationValueChange);
  30. Messager<object>.Register("GraberColorValue2", GetGraber2Value);
  31. Messager<object>.Register("TitrationStart2", ExecuteTitration2Start);
  32. Messager<object>.Register("TitrationStop2", ExecuteTitration2Stop);
  33. Messager<Titration2ValueArgs>.Register("Titration2ValueChange", ExecuteTitration2ValueChange);
  34. }
  35. /// <summary>
  36. /// 获取数据
  37. /// </summary>
  38. /// <param name="value"></param>
  39. public void GetGraberValue(object value)
  40. {
  41. GraberValues.Add(Convert.ToDouble(value));
  42. _ea.GetEvent<GraberValueEvent>().Publish(GraberValues);
  43. _ea.GetEvent<TitrationStatusEvent>().Publish(true);
  44. }
  45. /// <summary>
  46. /// 获取数据2
  47. /// </summary>
  48. /// <param name="value"></param>
  49. public void GetGraber2Value(object value)
  50. {
  51. GraberValues2.Add(Convert.ToDouble(value));
  52. _ea.GetEvent<Graber2ValueEvent>().Publish(GraberValues2);
  53. _ea.GetEvent<Titration2StatusEvent>().Publish(true);
  54. }
  55. /// <summary>
  56. /// 滴定开始
  57. /// </summary>
  58. /// <param name="value"></param>
  59. public void ExecuteTitrationStart(object value)
  60. {
  61. try
  62. {
  63. GraberValues.Clear();
  64. _ea.GetEvent<TitrationStatusEvent>().Publish(true);
  65. }
  66. catch (Exception ex)
  67. {
  68. logger.LogError(ex.ToString());
  69. }
  70. }
  71. /// <summary>
  72. /// 滴定2开始
  73. /// </summary>
  74. /// <param name="value"></param>
  75. public void ExecuteTitration2Start(object value)
  76. {
  77. try
  78. {
  79. GraberValues.Clear();
  80. _ea.GetEvent<Titration2StatusEvent>().Publish(true);
  81. }
  82. catch (Exception ex)
  83. {
  84. logger.LogError(ex.ToString());
  85. }
  86. }
  87. /// <summary>
  88. /// 滴定结束
  89. /// </summary>
  90. /// <param name="value"></param>
  91. public void ExecuteTitrationStop(object value)
  92. {
  93. try
  94. {
  95. GraberValues.Clear();
  96. _ea.GetEvent<TitrationStatusEvent>().Publish(false);
  97. }
  98. catch (Exception ex)
  99. {
  100. logger.LogError(ex.ToString());
  101. }
  102. }
  103. /// <summary>
  104. /// 滴定2结束
  105. /// </summary>
  106. /// <param name="value"></param>
  107. public void ExecuteTitration2Stop(object value)
  108. {
  109. try
  110. {
  111. GraberValues2.Clear();
  112. _ea.GetEvent<Titration2StatusEvent>().Publish(false);
  113. }
  114. catch (Exception ex)
  115. {
  116. logger.LogError(ex.ToString());
  117. }
  118. }
  119. /// <summary>
  120. /// 滴定改变
  121. /// </summary>
  122. public void ExecuteTitrationValueChange(TitrationValueArgs arg)
  123. {
  124. _ea.GetEvent<TitrationValueEvent>().Publish(arg);
  125. }
  126. /// <summary>
  127. /// 滴定2改变
  128. /// </summary>
  129. public void ExecuteTitration2ValueChange(Titration2ValueArgs arg)
  130. {
  131. _ea.GetEvent<Titration2ValueEvent>().Publish(arg);
  132. }
  133. public List<T> GetData<T>() where T : class => _dataManager.Query<T>().ToList();
  134. public bool UpdateData<T>(T t) where T : class => _dataManager.Update(t) > 0;
  135. public bool UpdateAreaAllData(EquipmentArea name)
  136. {
  137. DetailState flag = DetailState.Init;
  138. int flag2 = 1;
  139. if (!name.Enable)
  140. {
  141. flag = DetailState.Doing;
  142. flag2 = 0;
  143. }
  144. _dataManager.Update<SampleDetail>().Where(it => it.NodeName.Equals(name.PointName)).SetValues(it => it.TaskStatus.Set(flag) && it.DetailInfo.Set("")).Execute();
  145. _dataManager.Update<PositionHotlist>().Where(it => it.PositionName.Equals(name.PointName)).SetValues(it => it.CurrentOccupy.Set(string.Empty) && it.Enable.Set(flag2)).Execute();
  146. List<EquipmentArea> names = new List<EquipmentArea>();
  147. names.Add(name);
  148. _ea.GetEvent<UpdateSampleDetailNullEvent>().Publish(names);
  149. return true;
  150. }
  151. public async Task<bool> ManualWriteRegisterAsync(string name, double value)
  152. {
  153. return await Task.Factory.StartNew(() =>
  154. {
  155. bool res = ExecuteCommand.RegisterExecute(EquipmentNames.Timer, 1); //开启计时器
  156. return res && ExecuteCommand.RegisterExecute(name, value); //写入
  157. });
  158. }
  159. public async Task<bool> ManualWriteMoveToMotorAsync(string name, double value, MotorManualMoveType type)
  160. {
  161. return await Task.Factory.StartNew(() =>
  162. {
  163. MotorConvert convert = _dataManager.Query<MotorConvert>().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name));
  164. if (convert is null)
  165. {
  166. return false;
  167. }
  168. //if (value > 1000 && name.In(EquipmentNames.AxisX, EquipmentNames.AxisY)) //这段代码是xy移动距离大于1000前要看z是否回到原点
  169. //{
  170. // char[] judgeRes = EquipmentNames.AxisZ.MotorRead();
  171. // if (judgeRes is null or { Length: 0 })
  172. // {
  173. // return false;
  174. // }
  175. // if (!judgeRes[3 - 1].Equals('0'))
  176. // {
  177. // EquipmentNames.AxisZ.MotorGoBack();
  178. // }
  179. //}
  180. bool res = name.LiquidMotorMove(Convert.ToInt32(Math.Round(value * convert.ConvertRatio)));
  181. MotorMoveStatus status = _dataManager.Query<MotorMoveStatus>().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name));
  182. if (status is null)
  183. {
  184. return res;
  185. }
  186. if (res)
  187. {
  188. switch (type)
  189. {
  190. case MotorManualMoveType.Forward:
  191. status.CurrentPosition += Math.Abs(value);
  192. break;
  193. case MotorManualMoveType.Inversion:
  194. status.CurrentPosition -= Math.Abs(value);
  195. if (status.CurrentPosition < 0)
  196. {
  197. status.CurrentPosition = 0;
  198. }
  199. break;
  200. }
  201. _dataManager.Update(status);
  202. }
  203. return res;
  204. });
  205. }
  206. public async Task<bool> ManualWriteMoveToDMotor(string name, double value, MotorManualMoveType type)
  207. {
  208. return await Task.Factory.StartNew(() =>
  209. {
  210. MotorConvert convert = _dataManager.Query<MotorConvert>().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name));
  211. if (convert is null)
  212. {
  213. return false;
  214. }
  215. MotorMoveStatus status = _dataManager.Query<MotorMoveStatus>().ToList()?.FirstOrDefault(item => item.MotorName.Equals(name));
  216. if (status is null)
  217. {
  218. return false;
  219. }
  220. bool res = name.LiquidMotorMove(Convert.ToInt32(Math.Round(-1*(Math.Abs(value) - status.CurrentPosition ) * convert.ConvertRatio)));
  221. if (res)
  222. {
  223. switch (type)
  224. {
  225. case MotorManualMoveType.Forward:
  226. status.CurrentPosition = Math.Abs(value);
  227. break;
  228. }
  229. _dataManager.Update(status);
  230. }
  231. return res;
  232. });
  233. }
  234. public async Task<bool> MotorGoBackAsync(string name)
  235. {
  236. return await Task.Factory.StartNew(() =>
  237. {
  238. return ExecuteCommand.MotorGoBackExecute(name);
  239. });
  240. }
  241. public bool MotorStop(string name) => name.MotorStop();
  242. public async Task<bool> UpdateSpeedAsync(string name)
  243. {
  244. return await Task.Factory.StartNew(() =>
  245. {
  246. MotorSpeed speed = _dataManager.Query<MotorSpeed>().Where(it => it.DetailName.Equals(name)).First();
  247. bool res = speed.SystemName.WriteSpeed(speed.Speed);
  248. res = res && speed.SystemName.WriteAcSpeed(speed.AcSpeed);
  249. res = res && speed.SystemName.WriteDeSpeed(speed.DeSpeed);
  250. return res;
  251. });
  252. }
  253. public bool ManualControlRegister(string typeName, RegisterExecuteType type)
  254. {
  255. bool res = type switch
  256. {
  257. RegisterExecuteType.Open => typeName.RegisterOpen(),
  258. RegisterExecuteType.Close => typeName.RegisterClose(),
  259. _ => throw new ArgumentNullException(typeName),
  260. };
  261. return res;
  262. }
  263. public bool ManualSettingPID(string type, object value)
  264. {
  265. bool res = type.ToLower() switch
  266. {
  267. "ratio" => EquipmentNames.DissolveHeating.WriteRatio(value),
  268. "integral" => EquipmentNames.DissolveHeating.WriteIntegral(value),
  269. "differential" => EquipmentNames.DissolveHeating.WriteDifferential(value),
  270. "integraldeafult" => EquipmentNames.DissolveHeating.WriteIntegralDeafult(value),
  271. _ => throw new ArgumentException("未找到对应PID项定义")
  272. };
  273. return res;
  274. }
  275. public bool ManualSettingTemp(object value)
  276. {
  277. return EquipmentNames.DissolveHeating.WriteTemperature(value);
  278. }
  279. public async Task<bool> ManualDirectOutLiquidAsync(string type, object value)
  280. {
  281. return await Task.Factory.StartNew(() =>
  282. {
  283. return type.LiquidMotorMove(Convert.ToInt32(Math.Round(Convert.ToDouble(value))));
  284. });
  285. }
  286. //public static async Task<bool> ManualLiquidExecuteStatic(string pumpName, LiquidSwitchPattern pattern, object value)
  287. //{
  288. // return await Task.Factory.StartNew(() =>
  289. // {
  290. // return LiquidPipeSwitch.StartNew.SetLiquidName(pumpName).Execute(pattern, value);
  291. // });
  292. //}
  293. public async Task<bool> ManualLiquidExecute(string pumpName, LiquidSwitchPattern pattern, object value)
  294. {
  295. return await Task.Factory.StartNew(() =>
  296. {
  297. return LiquidPipeSwitch.StartNew.SetLiquidName(pumpName).Execute(pattern, value);
  298. });
  299. }
  300. public async Task<bool> ManualLiquidExecuteOxalate(string pumpName, LiquidSwitchPattern pattern, object value)
  301. {
  302. return await Task.Factory.StartNew(() =>
  303. {
  304. return LiquidPipeSwitchOxalate.StartNew.SetLiquidName(pumpName).ExecuteOxalate(pattern, value);
  305. });
  306. }
  307. public LiquidAmount GetOnceDropLiquidAmount()
  308. {
  309. LiquidAmount liquid = _dataManager.Query<LiquidAmount>().Where(it => it.LiquidName.Equals(EquipmentNames.Titration1PotassiumPermanganate)).First();
  310. return liquid;
  311. }
  312. public void ManualExecuteTitration(TitrationArg arg)
  313. {
  314. double amount = 0.0;
  315. TitrationExecute.Start(arg, ref amount);
  316. }
  317. public void ManualExecuteTitrationStop()
  318. {
  319. TitrationExecute.Running = false;
  320. }
  321. public void ManualExecuteExplosion(int MaxCameraRange)
  322. {
  323. ColorDataGraber _graber = Globals.Graber;
  324. CameraValue explosion = _dataManager.Query<CameraValue>().First();
  325. _graber.PresetLightParammanual(explosion, MaxCameraRange);
  326. }
  327. public void ManualExecuteTitration2(Titration2Arg arg)
  328. {
  329. double amount = 0.0;
  330. Titration2Execute.Start(arg, ref amount);
  331. }
  332. public void ManualExecuteTitration2Stop()
  333. {
  334. Titration2Execute.Running = false;
  335. }
  336. public void ManualExecuteExplosion2(int MaxCameraRange)
  337. {
  338. ColorData2Graber _graber = Globals.Graber2;
  339. Camera2Value explosion= _dataManager.Query<Camera2Value>().First();
  340. _graber.PresetLightParammanual(explosion, MaxCameraRange);
  341. }
  342. public void ManualcheckParams2()
  343. {
  344. ColorData2Graber _graber = Globals.Graber2;
  345. _graber.ShowParammanual();
  346. }
  347. public void ManualcheckParams()
  348. {
  349. ColorDataGraber _graber = Globals.Graber;
  350. _graber.ShowParammanual();
  351. }
  352. /// <summary>
  353. /// 计算k值
  354. /// </summary>
  355. /// <returns></returns>
  356. public double CalculationKValue()
  357. {
  358. List<EquipmentTask> tasks = _dataManager.Query<EquipmentTask>().Where(it => it.TaskType.Equals(TaskTypeName.CALIBRATION_ZH)).With(a => a.WaveKey, b => b.WaveKey, _dataManager.Query<EquipmentTask>().Where(it => it.TaskType.Equals(TaskTypeName.CALIBRATION_ZH) && it.Status.Equals(TaskState.Finished)).OrderBy(it => it.CreateTime, OrderPattern.Desc).Take(1), WithPattern.Equals).ToList();
  359. if (!tasks.Any())
  360. {
  361. return 0;
  362. }
  363. double volumeSum = 0.0;
  364. foreach (EquipmentTask task in tasks)
  365. {
  366. volumeSum += task.Amount;
  367. }
  368. if (volumeSum.Equals(0))
  369. {
  370. return 0;
  371. }
  372. double avgRes = volumeSum / tasks.Count;
  373. double returnResult = 10 / avgRes;
  374. return Math.Round(returnResult,3);
  375. }
  376. public Task<bool> ElectricDropper(string EpType, RegisterExecuteType type)
  377. {
  378. bool res = type switch
  379. {
  380. RegisterExecuteType.Open => DropperForward(EpType),
  381. RegisterExecuteType.Close => DropperInversion(EpType),
  382. RegisterExecuteType.Point => DropperPoint(EpType),
  383. _ => throw new ArgumentOutOfRangeException(nameof(type)),
  384. };
  385. return Task.FromResult(res);
  386. }
  387. public Task<bool> ElectricDropperFind(string EpType, RegisterExecuteType type)
  388. {
  389. bool res = type switch
  390. {
  391. RegisterExecuteType.Open => DropperForward(EpType),
  392. RegisterExecuteType.Close => DropperInversion(EpType),
  393. _ => throw new ArgumentOutOfRangeException(nameof(type)),
  394. };
  395. return Task.FromResult(res);
  396. }
  397. private static bool DropperForward(string elementName)
  398. {
  399. char[] readData2 = $"{elementName}Dropper".MotorRead();
  400. if (readData2 is null or not { Length: 8 })
  401. {
  402. return false;
  403. }
  404. if (readData2[5 - 1].Equals('0'))
  405. {
  406. $"{elementName}DropperForward".RegisterOpen();
  407. Thread.Sleep(200);
  408. $"{elementName}DropperInversion".RegisterOpen();
  409. bool res = true;
  410. do
  411. {
  412. Thread.Sleep(200);
  413. char[] readData = $"{elementName}Dropper".MotorRead();
  414. if (readData is null or not { Length: 8 })
  415. {
  416. continue;
  417. }
  418. res = readData[6 - 1].Equals('0');
  419. } while (!res);
  420. $"{elementName}DropperInversion".RegisterClose();
  421. Thread.Sleep(200);
  422. $"{elementName}DropperForward".RegisterClose();
  423. return true;
  424. }
  425. else
  426. return false;
  427. }
  428. public static bool DropperInversion(string elementName)
  429. {
  430. char[] readData2 = $"{elementName}Dropper".MotorRead();
  431. if (readData2 is null or not { Length: 8})
  432. {
  433. return false;
  434. }
  435. if (readData2[6 - 1].Equals('0'))
  436. {
  437. bool res = $"{elementName}DropperInversion".RegisterOpen();
  438. do
  439. {
  440. Thread.Sleep(200);
  441. char[] readData = $"{elementName}Dropper".MotorRead();
  442. if (readData is null or not { Length: 8 })
  443. {
  444. continue;
  445. }
  446. res = readData[5 - 1].Equals('0');
  447. } while (!res);
  448. $"{elementName}DropperInversion".RegisterClose();
  449. return res;
  450. }
  451. else
  452. return false;
  453. }
  454. public static bool DropperPoint(string elementName)
  455. {
  456. char[] readData2 = $"{elementName}Dropper".MotorRead();
  457. if (readData2 is null or not { Length: 8 })
  458. {
  459. return false;
  460. }
  461. bool res = $"{elementName}DropperInversion".RegisterOpen();
  462. do
  463. {
  464. Thread.Sleep(200);
  465. char[] readData = $"{elementName}Dropper".MotorRead();
  466. if (readData is null or not { Length: 8 })
  467. {
  468. continue;
  469. }
  470. res = readData[5 - 1].Equals('0');
  471. } while (!res);
  472. $"{elementName}DropperInversion".RegisterClose();
  473. return res;
  474. }
  475. }
  476. }