Files

480 lines
20 KiB
C#
Raw Permalink Normal View History

using System;
using System.Collections.Generic;
using JSON = Newtonsoft.Json.JsonConvert;
using Newtonsoft.Json;
using Unity;
using System.Collections.Concurrent;
using Cowain.Bake.BLL;
using Cowain.Bake.Common.Enums;
using Cowain.Bake.Model;
using static Cowain.Bake.Common.Models.MESModel;
using Cowain.Bake.Model.Models;
using Cowain.Bake.Common.Core;
using System.Linq;
namespace Cowain.Bake.Communication.MOM
{
public class MESProcess
{
readonly ConcurrentDictionary<int, float> dicMaxTemp = null; //表示该变量的引用(指针)不可变
string url = null;
public string URL
{
get
{
if (url != null)
{
return url;
}
TDeviceConfig dev = _unityContainer.Resolve<DeviceConfigService>().GetConfig(EDeviceType.MOM)[0];
GetJsonParam(dev.Json);
return url;
}
}
readonly IUnityContainer _unityContainer;
public MESProcess(IUnityContainer unityContainer)
{
_unityContainer = unityContainer;
dicMaxTemp = new ConcurrentDictionary<int, float>();
}
public void GetJsonParam(string param)
{
dynamic d = JsonConvert.DeserializeObject<dynamic>(param);
this.url = d.URL;
}
/// <summary>
/// 心跳
/// </summary>
/// <returns></returns>
public MESReturnCmdModel Alive()
{
EqptAlive eqptAlive = new EqptAlive();
DateTime currentTime = DateTime.Now;
DateTime oneMinuteAgo = currentTime.AddMinutes(-1);
eqptAlive.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString()); ;
eqptAlive.Info.PPM = _unityContainer.Resolve<BatteryInfoService>().GetPPM(oneMinuteAgo, currentTime).ToString();
var resultModel = SendData(JSON.SerializeObject(eqptAlive), (int)EMesLogClass.EqptAlive, true);
//string result = HttpClientHelper.HttpPost(URL, JSON.SerializeObject(eqptAlive));
//var resultModel = JSON.DeserializeObject<MESReturnCmdModel>(result);
return resultModel;
}
//2.设备状态 报警要把报警信息传过去与PLC确认
public MESReturnCmdModel MESEqptStatus(UInt16 status, List<TAlarm> models)
{
string urlCmd = URL;
EqptStatus eqptStatu = new EqptStatus();
eqptStatu.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());// "EC001";
eqptStatu.Info.StatusCode = status.ToString();
if (null != models)
{
foreach(var item in models)
{
eqptStatu.Info.AlertInfo.Add(
new AlerInfoModel()
{
AlertMessage = item.Desc,
AlertCode = item.Id.ToString()
});
}
}
return SendData(JSON.SerializeObject(eqptStatu), (int)EMesLogClass.Status);
}
/// <summary>
/// 3.设备报警
/// </summary>
/// <param name="arrayAlert"></param>
public void MESEqptAlert(List<AlertInfoModel> arrayAlert)
{
if (0 == arrayAlert.Count) return;
EqptAlertModel eqptAlertModel = new EqptAlertModel();
EqptAlert eqptAlert = new EqptAlert();
eqptAlertModel.AlertInfo = arrayAlert;
eqptAlert.Info = eqptAlertModel;
eqptAlert.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
SendData(JSON.SerializeObject(eqptAlert), (int)EMesLogClass.Alarm, false);
}
//4.工艺参数请求:心跳为2时请求
public EqptParameterReturnCmd GetProcessParam()
{
EqptParameter process = new EqptParameter();
process.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
var result = SendData<EqptParameterReturnCmd>(JSON.SerializeObject(process), (int)EMesLogClass.ParameterRequest);
if (result == default(EqptParameterReturnCmd))
{
LogHelper.Instance.Error($"获取工艺参数失败!请求内容:{JSON.SerializeObject(process)}");
return null;
}
return result;
}
/// <summary>
///5 参数变更
/// </summary>
/// <param name="userId"></param>
/// <param name="paramInfo"></param>
/// <returns></returns>
public MESReturnCmdModel ChangeParam(string userId, List<EqptParameterModel> paramInfo)
{
ParameterChangeCmd param = new ParameterChangeCmd();
//param.Info = new ParameterChange();
param.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
param.Info.EmployeeNo = userId;
param.Info.ParameterInfo = paramInfo;
return SendData(JSON.SerializeObject(param), (int)EMesLogClass.ParameterChange);
}
//6.联机请求
public MESReturnCmdModel EqptRun(string user, string pwd, string equipmentModel)
{
EqptRunCmd eqptRunCmd = new EqptRunCmd();
EqptRun eqptRun = new EqptRun();
eqptRun.EmployeeNo = user;
eqptRun.Password = pwd;
eqptRun.EquipmentModel = equipmentModel;
eqptRun.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
eqptRunCmd.Info = eqptRun;
return SendData(JSON.SerializeObject(eqptRunCmd), (int)EMesLogClass.EqptRun);
}
/// <summary>
///7 电芯状态获取(进站电芯)
/// </summary>
/// <returns></returns>
public MESReturnCmdModel GetBatteryStatus(string batteryCode)
{
CellStateCmd cellStateCmd = new CellStateCmd();
//cellStateCmd.Info = new CellState();
cellStateCmd.Info.CellNo = batteryCode;
cellStateCmd.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
return SendData(JSON.SerializeObject(cellStateCmd), (int)EMesLogClass.GetCellState);
}
/// <summary>
///8 烘烤进站
/// </summary>
/// <param name="LocationID"></param>
/// <param name="palletCode"></param>
/// <param name="batteryCodes"></param>
public void MESBakingInput(string LocationID, string palletCode, List<string> batteryCodes, string recipeName)
{
BakingInputCmd bakingInputCmd = new BakingInputCmd();
//bakingInputCmd.Info = new BakingInput();
bakingInputCmd.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());// "EC001";
bakingInputCmd.Info.TrayNo = palletCode;
bakingInputCmd.Info.LocationID = LocationID;
bakingInputCmd.Info.RecipeName = recipeName;
List<CellModel> cellModels = new List<CellModel>();
batteryCodes.ForEach((x) =>
{
cellModels.Add(new CellModel() { CellNo = x });
});
bakingInputCmd.Info.Cells = cellModels;
SendData(JSON.SerializeObject(bakingInputCmd), (int)EMesLogClass.EnterStation, true);
}
/// <summary>
/// 9.烘烤过程参数采集
/// </summary>
/// <returns></returns>
public void MESBakingParameter(float vacuum, float[] temps, string LocationID)
{
int index = 0;
BakingParameterCmd param = new BakingParameterCmd();
//param.Info = new BakingParameter();
List<ProcessData> processDatas = new List<ProcessData>();
param.Info.LocationID = LocationID;
param.Info.LocalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); ;
param.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
//真空
ProcessData parameterInfo = new ProcessData();
parameterInfo.ParameterCode = "HK-0017";
parameterInfo.ParameterType = "float";
parameterInfo.Value = vacuum.ToString();
processDatas.Add(parameterInfo);
//温度
int i = 0;
foreach (var temp in temps)
{
if (i % 2 != 0)
{
index++;
parameterInfo = new ProcessData();
parameterInfo.ParameterCode = "HK-00" + $"{12 + index}";
parameterInfo.ParameterType = "float";
parameterInfo.Value = temp.ToString();
parameterInfo.Description = $"巡检-温度{index}";
processDatas.Add(parameterInfo);
}
i++;
}
param.Info.ParameterInfo = processDatas;
SendData(JSON.SerializeObject(param), (int)EMesLogClass.BakingParameter, false);
}
/// <summary>
///10. 烘烤出站
/// </summary>
public MESReturnCmdModel MESBakingOutput(string LocationID, TPalletInfo palletInfo, List<TBatteryInfo> batterys, bool outFlag, bool realTimeSend)
{
BakingOutputCmd outputParams = new BakingOutputCmd();
outputParams.Info.EquipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
outputParams.Info.TrayNo = palletInfo.PalletCode;
outputParams.Info.LocationID = LocationID;
outputParams.Info.OutFlag = outFlag ? "Y" : "N";
List<CellModel> cellModels = new List<CellModel>();
WaterModel waterModel = new WaterModel();
if (!string.IsNullOrEmpty(palletInfo.WaterValue))
{
var waterModelList = JsonConvert.DeserializeObject<List<WaterModel>>(palletInfo.WaterValue); //输入水含量异常,导致
waterModel = waterModelList.OrderByDescending(x => x.Id).First(); //最ID最大的
}
var batteryCodes = batterys.Select(x => x.BatteryCode).ToList();
batteryCodes.ForEach((x) =>
{
cellModels.Add(new CellModel() { CellNo = x });
});
outputParams.Info.Cells = cellModels;
string RowAndColumn = "";
foreach (var item in batterys)
{
RowAndColumn += $"{item.PositionX}行,{item.PositionY}列,";
}
List<ParametersModel> bakingOutputDatas = new List<ParametersModel>();
ParametersModel bakingOutputData = new ParametersModel();
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0001";
bakingOutputData.ParameterDesc = "烘烤号";
var cavity = _unityContainer.Resolve<MemoryDataProvider>().CavityInfo.Where(x => x.Id == (palletInfo.BakingPosition ?? 0)).FirstOrDefault();
bakingOutputData.Value = (cavity == null) ? "" : cavity.Name;
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0002";
bakingOutputData.ParameterDesc = "托盘号";
bakingOutputData.Value = palletInfo.PalletCode;
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0003";
bakingOutputData.ParameterDesc = "行列";
bakingOutputData.Value = $"{RowAndColumn}";
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0004";
bakingOutputData.ParameterDesc = "进站时间";
bakingOutputData.Value = null == palletInfo.LoadingBegingTime ? DateTime.Now.ToString() : palletInfo.LoadingBegingTime.Value.ToString();
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0005";
bakingOutputData.ParameterDesc = "出站时间";
bakingOutputData.Value = DateTime.Now.ToString();
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0006";
bakingOutputData.ParameterDesc = "烘烤开始时间";
bakingOutputData.Value = null == palletInfo.BakingBeginTime ? DateTime.Now.ToString() : palletInfo.BakingBeginTime.Value.ToString();
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0007";
bakingOutputData.ParameterDesc = "烘烤结束时间";
bakingOutputData.Value = null == palletInfo.BakingOverTime ? DateTime.Now.ToString() : palletInfo.BakingOverTime.Value.ToString();
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0008";
bakingOutputData.ParameterDesc = "电芯冷却温度";
var temps = batterys.Select(x => x.CoolTemp).ToList();
bakingOutputData.Value = string.Join(", ", temps);
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0011";
bakingOutputData.ParameterDesc = "冷却开始时间";
bakingOutputData.Value = DateTime.Now.ToString();
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0012";
bakingOutputData.ParameterDesc = "冷却结束时间";
bakingOutputData.Value = DateTime.Now.ToString();
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0013";
bakingOutputData.ParameterDesc = "正极水含量";
bakingOutputData.Value = waterModel.AnodeWaterValue;
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0014";
bakingOutputData.ParameterDesc = "隔膜水含量";
bakingOutputData.Value = waterModel.SeptumWaterValue;
bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0015";
bakingOutputData.ParameterDesc = "负极水含量";
bakingOutputData.Value = waterModel.CathodeWaterValue;
bakingOutputDatas.Add(bakingOutputData);
//bakingOutputData = new ParametersModel();
//bakingOutputData.ParameterCode = "HK-0019";
//bakingOutputData.ParameterDesc = "是否出站";
//bakingOutputData.Value = outFlag ? "Y" : "N";
//bakingOutputDatas.Add(bakingOutputData);
bakingOutputData = new ParametersModel();
bakingOutputData.ParameterCode = "HK-0020";
bakingOutputData.ParameterDesc = "最高温度";
bakingOutputData.Value = GetMaxTemperature(palletInfo.VirtualId).ToString();
bakingOutputDatas.Add(bakingOutputData);
outputParams.Info.Parameters = bakingOutputDatas;
//return outputParams;
return SendData(JSON.SerializeObject(outputParams), (int)EMesLogClass.ExitStation, realTimeSend);
}
public float GetMaxTemperature(int virtualId)
{
float value = 0;
if (!dicMaxTemp.TryGetValue(virtualId, out value)) //可以不删除dicMaxTemp因为量不大
{
LogHelper.Instance.Warn("开始获取最高温度");
value = _unityContainer.Resolve<StoveSctualPatrolService>().GetStoveMaxTemp(virtualId);
LogHelper.Instance.Warn("结束获取最高温度");
dicMaxTemp.TryAdd(virtualId, value);
}
return value;
}
public MESReturnCmdModel SendData(string info, sbyte msgType = (int)EMesLogClass.ExitStation, bool isEanble = true)
{
var result = GetRecvData(info, msgType, isEanble);
if (string.IsNullOrEmpty(result))
{
return null;
}
return JSON.DeserializeObject<MESReturnCmdModel>(result);
}
public T SendData<T>(string info, sbyte msgType, bool isEanble = true)
{
var result = GetRecvData(info, msgType, isEanble);
if (string.IsNullOrEmpty(result))
{
return default(T); //default(T)
}
return JSON.DeserializeObject<T>(result);
}
public string GetRecvData(string info, sbyte msgType, bool isEanble = true)
{
CCommandType ct = new CCommandType();
ct.UrlCmd = URL;
TMesData mesModel = new TMesData();
mesModel.CreateTime = DateTime.Now;
mesModel.CommandType = JSON.SerializeObject(ct);
mesModel.Content = info; //JSON.SerializeObject(obj);
mesModel.MsgType = msgType;
if (int.Parse(_unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.MOMEnable.ToString())) == (int)EMOMEnable.Enable
&& isEanble) //又发又存
{
mesModel.SendTime = DateTime.Now;
string result = HttpClientHelper.HttpPost(URL, info);
mesModel.RecvTime = DateTime.Now;
mesModel.RecvContent = result;
mesModel.SendFlag = string.IsNullOrEmpty(result) ? (sbyte)EMesUpLoadStatus.Fail : (sbyte)EMesUpLoadStatus.Success;
if(msgType != (int)EMesLogClass.EqptAlive)
{
_unityContainer.Resolve<MesDataService>().Insert(mesModel); //保存数据
}
if (string.IsNullOrEmpty(result))
{
return null;
}
WriteRequestLog(info);
WriteResponseLog(result);
//var resultModel = JSON.DeserializeObject<MESReturnCmdModel>(result);
return result;
}
else if (int.Parse(_unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.MOMEnable.ToString())) == (int)EMOMEnable.Disable
|| !isEanble) //只存不发
{
mesModel.SendFlag = (sbyte)EMesUpLoadStatus.Wait;
_unityContainer.Resolve<MesDataService>().Insert(mesModel); //保存数据
return null;
}
else //不发,也不存
{
return null;
}
}
///发送
public void WriteRequestLog(string info)
{
dynamic d = JsonConvert.DeserializeObject<dynamic>(info);
string cmd = d.Cmd;
string dateTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
string uuid = d.Info.Key;
LogHelper.Instance.Trace($"[Request][{cmd}][{dateTime}][{uuid}][{info}]");
}
/// <summary>
/// 接收
/// </summary>
/// <param name="info"></param>
public void WriteResponseLog(string info)
{
dynamic d = JsonConvert.DeserializeObject<dynamic>(info);
string cmd = d.Cmd;
string dateTime = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
string uuid = d.Info.Key;
LogHelper.Instance.Trace($"[Response][{cmd}][{dateTime}][{uuid}][{info}]");
}
public string GetEquipmentCode(int MachineID)
{
string equipmentCode = _unityContainer.Resolve<SysSetupService>().GetValueByParaID(ESysSetup.DeviceNum.ToString());
string LineCode = equipmentCode.Substring(equipmentCode.Length - 2);
MachineID = int.Parse(LineCode) + MachineID - 1;
string formattedNumber = MachineID.ToString().PadLeft(2, '0');
equipmentCode = equipmentCode.Replace(LineCode, formattedNumber);
return equipmentCode;
}
}
}