LiquidHeatingOperate.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. using System;
  2. using System.Linq;
  3. using SHJX.Service.Dao;
  4. using System.Globalization;
  5. using SHJX.Service.Model.Dao;
  6. using SHJX.Service.ServerClient;
  7. using SHJX.Service.Model.Control;
  8. using System.Collections.Generic;
  9. using SHJX.Service.Control.Modules;
  10. using SHJX.Service.Control.Interface;
  11. using SHJX.Service.Common.UserDelegate;
  12. using SHJX.Service.Common.Logging;
  13. using Microsoft.Extensions.Logging;
  14. using SHJX.Service.Common.ReadXML;
  15. using System.Threading;
  16. namespace SHJX.Service.Control.Route.RouteController
  17. {
  18. public class LiquidHeatingOperate : FlowControlOperateImp
  19. {
  20. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(LiquidHeatingOperate));
  21. private OptClient _client;
  22. private OperateDataManager _dataManager;
  23. private const string OpName = "Heat";
  24. private const string EquipmentName = "HeatRod";
  25. public virtual bool Operate(ReadConfigUtil config, DataEventArgs data)
  26. {
  27. _client = data.Client;
  28. _dataManager = data.DataManager;
  29. var portArgs = new PortArgs
  30. {
  31. TypeName = OpName,
  32. Reserve = _dataManager.GetPid("Dissolve")
  33. };
  34. var status = EquipmentName.GetEquipmentState(); //获取加热棒的状态
  35. return status.EquipmentState switch
  36. {
  37. EquipmentEnum.Stop => StopOperate(portArgs, status),
  38. EquipmentEnum.Waiting => WaitiongOperate(portArgs, status),
  39. EquipmentEnum.Start => StartOperate(portArgs, status),
  40. _ => false,
  41. };
  42. }
  43. /// <summary>
  44. /// 停止状态
  45. /// </summary>
  46. /// <param name="portArgs"></param>
  47. /// <param name="status"></param>
  48. /// <returns></returns>
  49. private bool StopOperate(PortArgs portArgs, EquipmentStatus status)
  50. {
  51. #region 加热
  52. var temp = "Step1".GetHeatingTime().Temperature;
  53. portArgs.Distance = temp;
  54. #endregion
  55. if (_client.Factory(OpName).Write(portArgs))
  56. {
  57. Thread.Sleep(5000);
  58. logger.LogInformation($"步骤一温度设置成功,温度设置为{temp}");
  59. status.Udf1 = "Step1";
  60. status.EquipmentState = EquipmentEnum.Waiting;
  61. _dataManager.Update(status);
  62. var tasks = _dataManager.QueryHeatingTaskbyState("Liquid_Heating");
  63. if (tasks.Count > 0)
  64. {
  65. var clearNames = (from task in tasks select task.To).ToList();
  66. Messager.Send("clearCycleProcess", clearNames); //这里要做任务通知 加热位通知
  67. }
  68. }
  69. return false;
  70. }
  71. /// <summary>
  72. /// 执行状态
  73. /// </summary>
  74. /// <param name="portArgs"></param>
  75. /// <param name="status"></param>
  76. /// <returns></returns>
  77. private bool StartOperate(PortArgs portArgs, EquipmentStatus status)
  78. {
  79. //计算 当前时间与下发时间的差值
  80. var timeSpan = DateTime.Now - status.LastTryTime;
  81. var minutes = timeSpan.Hours * 60 + timeSpan.Minutes + timeSpan.Seconds / 60.0;
  82. //说明:这里的Udf2记录的是步骤时间之和,由数据库里面查询得到
  83. var ringValue = (Convert.ToDouble(status.Udf2) + minutes) / DataCentre.GetHeatingTimeSum();
  84. UpdateRings(ringValue);
  85. var liquid = status.Udf1?.GetHeatingTime();
  86. if (liquid == null) return false;
  87. if (minutes < liquid?.HeatingTime) return false;
  88. double value = Convert.ToDouble(status.Udf2);
  89. value += liquid.HeatingTime;
  90. status.Udf2 = value.ToString(CultureInfo.CurrentCulture);
  91. //判断条件是,如果当前步骤不等于下一步骤名称,则判定还有剩余任务 并且下一个加热步骤的温度设定大于0
  92. if ((!liquid.CurrentStep.Equals(liquid.NextStep)) && (liquid.NextStep.GetHeatingTime().HeatingTime > 0))
  93. {
  94. #region 加热
  95. var nextTemperature = liquid.NextStep.GetHeatingTime().Temperature;
  96. portArgs.Distance = nextTemperature;
  97. var resNext = _client.Factory(OpName).Write(portArgs); //具体加热的步骤
  98. #endregion
  99. if (resNext)
  100. {
  101. logger.LogInformation($"温度{nextTemperature}下发成功!");
  102. status.EquipmentState = EquipmentEnum.Waiting;
  103. status.Udf1 = liquid.NextStep;
  104. status.LastTryTime = DateTime.MinValue;
  105. _dataManager.Update(status);
  106. }
  107. return false;
  108. }
  109. #region 停止加热
  110. portArgs.Distance = -100;
  111. var resStop = _client.Factory(OpName).Write(portArgs); //具体加热的步骤
  112. #endregion
  113. if (!resStop) return false;
  114. status.Udf2 = "0";
  115. status.Udf1 = string.Empty;
  116. status.LastTryTime = DateTime.MinValue;
  117. status.EquipmentState = EquipmentEnum.Stop;
  118. _dataManager.Update(status);
  119. return true;
  120. }
  121. /// <summary>
  122. /// 等待状态
  123. /// </summary>
  124. /// <param name="portArgs"></param>
  125. /// <param name="status"></param>
  126. /// <returns></returns>
  127. private bool WaitiongOperate(PortArgs portArgs, EquipmentStatus status)
  128. {
  129. long temp = 0;
  130. if (_client.Factory(OpName).Read(portArgs) is not Dictionary<string, double> obj) return false;
  131. if (Math.Round(obj["sv"]) == -99 || Math.Round(obj["sv"]) == 0)
  132. {
  133. if (status.Udf1 == "" || status.Udf1 == null)
  134. {
  135. temp = "Step1".GetHeatingTime().Temperature;
  136. }
  137. else
  138. {
  139. temp = status.Udf1.GetHeatingTime().Temperature;
  140. }
  141. portArgs.Distance = temp;
  142. _client.Factory(OpName).Write(portArgs);
  143. }
  144. else
  145. temp =Convert.ToInt64( Math.Round(obj["sv"]));
  146. logger.LogInformation($"设定温度:{temp},实际温度:{Math.Round(obj["pv"])}");
  147. if (temp > Math.Round(obj["pv"])) return false;
  148. logger.LogInformation($"温度到达:{Math.Round(obj["pv"])},开始计时保持!");
  149. status.EquipmentState = EquipmentEnum.Start;
  150. status.LastTryTime = DateTime.Now;
  151. _dataManager.Update(status);
  152. return false;
  153. }
  154. /// <summary>
  155. /// 更新进度条
  156. /// </summary>
  157. /// <param name="ringValue"></param>
  158. private void UpdateRings(double ringValue)
  159. {
  160. Dictionary<string, object> args = new()
  161. {
  162. { "value1", ringValue } //value1:传递的是计算得到的进度条的值(传递到主界面中进行更新)
  163. };
  164. var heatingTasks = _dataManager.QueryHeatingTaskbyState("Liquid_Heating");
  165. if (heatingTasks.Count > 0)
  166. {
  167. var clearNames = (from task in heatingTasks select task.To).ToList();
  168. args.Add("value2", clearNames); //value2:传递的为需要更新进度条的消解位的名称(传递到主界面中进行更新)
  169. }
  170. Messager.Send("ringRadius", args); //更新进度条
  171. }
  172. }
  173. }