| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188 |
- 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,
- };
- }
- /// <summary>
- /// 停止状态
- /// </summary>
- /// <param name="portArgs"></param>
- /// <param name="status"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 执行状态
- /// </summary>
- /// <param name="portArgs"></param>
- /// <param name="status"></param>
- /// <returns></returns>
- 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;
- }
- /// <summary>
- /// 等待状态
- /// </summary>
- /// <param name="portArgs"></param>
- /// <param name="status"></param>
- /// <returns></returns>
- private bool WaitiongOperate(PortArgs portArgs, EquipmentStatus status)
- {
- long temp = 0;
- if (_client.Factory(OpName).Read(portArgs) is not Dictionary<string, double> 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;
- }
- /// <summary>
- /// 更新进度条
- /// </summary>
- /// <param name="ringValue"></param>
- private void UpdateRings(double ringValue)
- {
- Dictionary<string, object> 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); //更新进度条
- }
- }
- }
|