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 dicMaxTemp = null; //表示该变量的引用(指针)不可变 string url = null; public string URL { get { if (url != null) { return url; } TDeviceConfig dev = _unityContainer.Resolve().GetConfig(EDeviceType.MOM)[0]; GetJsonParam(dev.Json); return url; } } readonly IUnityContainer _unityContainer; public MESProcess(IUnityContainer unityContainer) { _unityContainer = unityContainer; dicMaxTemp = new ConcurrentDictionary(); } public void GetJsonParam(string param) { dynamic d = JsonConvert.DeserializeObject(param); this.url = d.URL; } /// /// 心跳 /// /// public MESReturnCmdModel Alive() { EqptAlive eqptAlive = new EqptAlive(); DateTime currentTime = DateTime.Now; DateTime oneMinuteAgo = currentTime.AddMinutes(-1); eqptAlive.Info.EquipmentCode = _unityContainer.Resolve().GetValueByParaID(ESysSetup.DeviceNum.ToString()); ; eqptAlive.Info.PPM = _unityContainer.Resolve().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(result); return resultModel; } //2.设备状态 报警要把报警信息传过去,(与PLC确认) public MESReturnCmdModel MESEqptStatus(UInt16 status, List models) { string urlCmd = URL; EqptStatus eqptStatu = new EqptStatus(); eqptStatu.Info.EquipmentCode = _unityContainer.Resolve().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); } /// /// 3.设备报警 /// /// public void MESEqptAlert(List 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().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().GetValueByParaID(ESysSetup.DeviceNum.ToString()); var result = SendData(JSON.SerializeObject(process), (int)EMesLogClass.ParameterRequest); if (result == default(EqptParameterReturnCmd)) { LogHelper.Instance.Error($"获取工艺参数失败!请求内容:{JSON.SerializeObject(process)}"); return null; } return result; } /// ///5 参数变更 /// /// /// /// public MESReturnCmdModel ChangeParam(string userId, List paramInfo) { ParameterChangeCmd param = new ParameterChangeCmd(); //param.Info = new ParameterChange(); param.Info.EquipmentCode = _unityContainer.Resolve().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().GetValueByParaID(ESysSetup.DeviceNum.ToString()); eqptRunCmd.Info = eqptRun; return SendData(JSON.SerializeObject(eqptRunCmd), (int)EMesLogClass.EqptRun); } /// ///7 电芯状态获取(进站电芯) /// /// public MESReturnCmdModel GetBatteryStatus(string batteryCode) { CellStateCmd cellStateCmd = new CellStateCmd(); //cellStateCmd.Info = new CellState(); cellStateCmd.Info.CellNo = batteryCode; cellStateCmd.Info.EquipmentCode = _unityContainer.Resolve().GetValueByParaID(ESysSetup.DeviceNum.ToString()); return SendData(JSON.SerializeObject(cellStateCmd), (int)EMesLogClass.GetCellState); } /// ///8 烘烤进站 /// /// /// /// public void MESBakingInput(string LocationID, string palletCode, List batteryCodes, string recipeName) { BakingInputCmd bakingInputCmd = new BakingInputCmd(); //bakingInputCmd.Info = new BakingInput(); bakingInputCmd.Info.EquipmentCode = _unityContainer.Resolve().GetValueByParaID(ESysSetup.DeviceNum.ToString());// "EC001"; bakingInputCmd.Info.TrayNo = palletCode; bakingInputCmd.Info.LocationID = LocationID; bakingInputCmd.Info.RecipeName = recipeName; List cellModels = new List(); batteryCodes.ForEach((x) => { cellModels.Add(new CellModel() { CellNo = x }); }); bakingInputCmd.Info.Cells = cellModels; SendData(JSON.SerializeObject(bakingInputCmd), (int)EMesLogClass.EnterStation, true); } /// /// 9.烘烤过程参数采集 /// /// public void MESBakingParameter(float vacuum, float[] temps, string LocationID) { int index = 0; BakingParameterCmd param = new BakingParameterCmd(); //param.Info = new BakingParameter(); List processDatas = new List(); param.Info.LocationID = LocationID; param.Info.LocalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); ; param.Info.EquipmentCode = _unityContainer.Resolve().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); } /// ///10. 烘烤出站 /// public MESReturnCmdModel MESBakingOutput(string LocationID, TPalletInfo palletInfo, List batterys, bool outFlag, bool realTimeSend) { BakingOutputCmd outputParams = new BakingOutputCmd(); outputParams.Info.EquipmentCode = _unityContainer.Resolve().GetValueByParaID(ESysSetup.DeviceNum.ToString()); outputParams.Info.TrayNo = palletInfo.PalletCode; outputParams.Info.LocationID = LocationID; outputParams.Info.OutFlag = outFlag ? "Y" : "N"; List cellModels = new List(); WaterModel waterModel = new WaterModel(); if (!string.IsNullOrEmpty(palletInfo.WaterValue)) { var waterModelList = JsonConvert.DeserializeObject>(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 bakingOutputDatas = new List(); ParametersModel bakingOutputData = new ParametersModel(); bakingOutputData = new ParametersModel(); bakingOutputData.ParameterCode = "HK-0001"; bakingOutputData.ParameterDesc = "烘烤号"; var cavity = _unityContainer.Resolve().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().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(result); } public T SendData(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(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().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().Insert(mesModel); //保存数据 } if (string.IsNullOrEmpty(result)) { return null; } WriteRequestLog(info); WriteResponseLog(result); //var resultModel = JSON.DeserializeObject(result); return result; } else if (int.Parse(_unityContainer.Resolve().GetValueByParaID(ESysSetup.MOMEnable.ToString())) == (int)EMOMEnable.Disable || !isEanble) //只存不发 { mesModel.SendFlag = (sbyte)EMesUpLoadStatus.Wait; _unityContainer.Resolve().Insert(mesModel); //保存数据 return null; } else //不发,也不存 { return null; } } ///发送 public void WriteRequestLog(string info) { dynamic d = JsonConvert.DeserializeObject(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}]"); } /// /// 接收 /// /// public void WriteResponseLog(string info) { dynamic d = JsonConvert.DeserializeObject(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().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; } } }