using System; using System.Linq; using SHJX.Service.Dao; using System.Globalization; using SHJX.Service.Model.Dao; using SHJX.Service.ServerClient; using SHJX.Service.Model.Control; using System.Collections.Generic; using SHJX.Service.Control.Modules; using SHJX.Service.Control.Interface; using SHJX.Service.Common.UserDelegate; using SHJX.Service.Common.Logging; using Microsoft.Extensions.Logging; using SHJX.Service.Common.ReadXML; using System.Threading; namespace SHJX.Service.Control.Route.RouteController { public class LiquidHeatingOperate : FlowControlOperateImp { private static readonly ILogger logger = LogFactory.BuildLogger(typeof(LiquidHeatingOperate)); private OptClient _client; private OperateDataManager _dataManager; private const string OpName = "Heat"; private const string EquipmentName = "HeatRod"; public virtual bool Operate(ReadConfigUtil config, DataEventArgs data) { _client = data.Client; _dataManager = data.DataManager; var portArgs = new PortArgs { TypeName = OpName, Reserve = _dataManager.GetPid("Dissolve") }; var status = EquipmentName.GetEquipmentState(); //获取加热棒的状态 return status.EquipmentState switch { EquipmentEnum.Stop => StopOperate(portArgs, status), EquipmentEnum.Waiting => WaitiongOperate(portArgs, status), EquipmentEnum.Start => StartOperate(portArgs, status), _ => false, }; } /// /// 停止状态 /// /// /// /// private bool StopOperate(PortArgs portArgs, EquipmentStatus status) { #region 加热 var temp = "Step1".GetHeatingTime().Temperature; portArgs.Distance = temp; #endregion if (_client.Factory(OpName).Write(portArgs)) { Thread.Sleep(5000); logger.LogInformation($"步骤一温度设置成功,温度设置为{temp}"); status.Udf1 = "Step1"; status.EquipmentState = EquipmentEnum.Waiting; _dataManager.Update(status); var tasks = _dataManager.QueryHeatingTaskbyState("Liquid_Heating"); if (tasks.Count > 0) { var clearNames = (from task in tasks select task.To).ToList(); Messager.Send("clearCycleProcess", clearNames); //这里要做任务通知 加热位通知 } } return false; } /// /// 执行状态 /// /// /// /// private bool StartOperate(PortArgs portArgs, EquipmentStatus status) { //计算 当前时间与下发时间的差值 var timeSpan = DateTime.Now - status.LastTryTime; var minutes = timeSpan.Hours * 60 + timeSpan.Minutes + timeSpan.Seconds / 60.0; //说明:这里的Udf2记录的是步骤时间之和,由数据库里面查询得到 var ringValue = (Convert.ToDouble(status.Udf2) + minutes) / DataCentre.GetHeatingTimeSum(); UpdateRings(ringValue); var liquid = status.Udf1?.GetHeatingTime(); if (liquid == null) return false; if (minutes < liquid?.HeatingTime) return false; double value = Convert.ToDouble(status.Udf2); value += liquid.HeatingTime; status.Udf2 = value.ToString(CultureInfo.CurrentCulture); //判断条件是,如果当前步骤不等于下一步骤名称,则判定还有剩余任务 并且下一个加热步骤的温度设定大于0 if ((!liquid.CurrentStep.Equals(liquid.NextStep)) && (liquid.NextStep.GetHeatingTime().HeatingTime > 0)) { #region 加热 var nextTemperature = liquid.NextStep.GetHeatingTime().Temperature; portArgs.Distance = nextTemperature; var resNext = _client.Factory(OpName).Write(portArgs); //具体加热的步骤 #endregion if (resNext) { logger.LogInformation($"温度{nextTemperature}下发成功!"); status.EquipmentState = EquipmentEnum.Waiting; status.Udf1 = liquid.NextStep; status.LastTryTime = DateTime.MinValue; _dataManager.Update(status); } return false; } #region 停止加热 portArgs.Distance = -100; var resStop = _client.Factory(OpName).Write(portArgs); //具体加热的步骤 #endregion if (!resStop) return false; status.Udf2 = "0"; status.Udf1 = string.Empty; status.LastTryTime = DateTime.MinValue; status.EquipmentState = EquipmentEnum.Stop; _dataManager.Update(status); return true; } /// /// 等待状态 /// /// /// /// private bool WaitiongOperate(PortArgs portArgs, EquipmentStatus status) { long temp = 0; if (_client.Factory(OpName).Read(portArgs) is not Dictionary obj) return false; if (Math.Round(obj["sv"]) == -99 || Math.Round(obj["sv"]) == 0) { if (status.Udf1 == "" || status.Udf1 == null) { temp = "Step1".GetHeatingTime().Temperature; } else { temp = status.Udf1.GetHeatingTime().Temperature; } portArgs.Distance = temp; _client.Factory(OpName).Write(portArgs); } else temp =Convert.ToInt64( Math.Round(obj["sv"])); logger.LogInformation($"设定温度:{temp},实际温度:{Math.Round(obj["pv"])}"); if (temp > Math.Round(obj["pv"])) return false; logger.LogInformation($"温度到达:{Math.Round(obj["pv"])},开始计时保持!"); status.EquipmentState = EquipmentEnum.Start; status.LastTryTime = DateTime.Now; _dataManager.Update(status); return false; } /// /// 更新进度条 /// /// private void UpdateRings(double ringValue) { Dictionary args = new() { { "value1", ringValue } //value1:传递的是计算得到的进度条的值(传递到主界面中进行更新) }; var heatingTasks = _dataManager.QueryHeatingTaskbyState("Liquid_Heating"); if (heatingTasks.Count > 0) { var clearNames = (from task in heatingTasks select task.To).ToList(); args.Add("value2", clearNames); //value2:传递的为需要更新进度条的消解位的名称(传递到主界面中进行更新) } Messager.Send("ringRadius", args); //更新进度条 } } }