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); //更新进度条
}
}
}