using JinYuan.Helper; using JinYuan.MES.Enums; using JinYuan.Models; using JinYuan.VirtualDataLibrary; using Language; using PLCCommunication; using PLCCommunication.Common; using PLCCommunication.Common.DataConvert; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Eventing.Reader; using System.IO; using System.Linq; using System.Runtime.InteropServices.ComTypes; using System.Runtime.Remoting.Messaging; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace JinYuan.ControlCenters { public partial class ControlCenter { public object FileLock = new object();//文件锁 #region 上料工位(数据处理) /// /// 上料工位A /// //int JXCount = 0; //上料解析 private async Task FeedingStationA(JYResult bArrays, object plcModel) { PlcGroup pf = plcModel as PlcGroup; var swTotal = new Stopwatch(); var swSegment = new Stopwatch(); if (bArrays.IsSuccess && bArrays.Content != null) { try { swTotal.Start(); LogHelper.Instance.WriteLog($"【进站A】开始处理, 时间={DateTime.Now:HH:mm:ss.fff}", "A进站性能"); #region 数据初始化 swSegment.Start(); //解析数据 List list = new List();//实体 List listRes = GetList(4, 2);//默认为1,良品 List listMark = GetList(4, false);//有料标志 List listCode = GetList(4, "");//电芯码 List listRemark = GetList(4, "");//备注 List listFlag = GetList(4, "0");//是否上传标志 List listResult = GetList(4, "OK");//结果 List listMesage = GetList(4, "");//mesMesage List listMesResType = GetList(4, MesResType.B);//mesType swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】数据初始化耗时: {swSegment.ElapsedMilliseconds}ms", "A进站性能"); #endregion // 从D2021开始 #region 数据解析 swSegment.Restart(); byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 //有料标志 for (int i = 0; i < listMark.Count; i++) { listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2)) == 1 ? true : false;// 从D2021开始 if (listMark[i]) { #region 数据读取 //条码长度 int codeLength = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (20 * 2));// 从D2041开始 if (codeLength > 0) { //条码 listCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 50) + (79 * 2), codeLength, System.Text.Encoding.ASCII).// 从D2100开始 Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); } else { listCode[i] = "ERROR"; } #endregion #region 数据保存 AGearEntity m = new AGearEntity(); m.BarCode = listCode[i]; m.ChannelNo = (i + 1).ToString(); m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); list.Add(m); #endregion } else { CommonMethods.AddDataMonitorLog(0, "进站上料工位A有料标志为0".Translated() + "通道号".Translated() + $":{i}"); } } swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】数据解析耗时: {swSegment.ElapsedMilliseconds}ms, 解析条数: {list.Count}", "A进站性能"); #endregion #region 上传MES if (list.Count > 0 && CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { swSegment.Restart(); var allMesMessages = new List(); var allMesResTypes = new List(); var allFlags = new List(); for (int i = 0; i < list.Count; i++) { var swSegment1 = new Stopwatch(); swSegment1.Start(); // 每次只上传一个条码(封装为List) var singleCodeList = new List { list[i].BarCode }; var (success1, mesage1, mesResType1) = await CommonMethods.hbgMes.ManyCellInStationAsync( CommonMethods.mesConfig.ProductInStation, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.mesUserName, singleCodeList); if (success1) { // 收集结果而不是覆盖 allMesMessages.AddRange(mesage1); allMesResTypes.AddRange(mesResType1); allFlags.Add("1"); } else { // 收集失败结果 allMesMessages.AddRange(mesage1); allMesResTypes.AddRange(mesResType1); allFlags.Add("2"); // 记录失败状态 listRes[i] = 3; listRemark[i] = ""; if (mesage1.Count > 0 && mesage1[0].Contains("一个或多个错误")) { CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); } } swSegment1.Stop(); LogHelper.Instance.WriteLog($"【进站A】单条{i}上传mes耗时: {swSegment1.ElapsedMilliseconds}ms", "A进站性能"); } // 将收集的结果赋给主列表 listMesage = allMesMessages; listMesResType = allMesResTypes; listFlag = allFlags; swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】MES上传总耗时: {swSegment.ElapsedMilliseconds}ms, 上传条数: {list.Count}", "A进站性能"); } else if (list.Count > 0 && (!CommonMethods.sysConfig.MesModeSwitching || !CommonMethods.mesConfig.isConnected)) { swSegment.Restart(); listRes = GetList(4, 3); listRemark = GetList(4, "MES未连接".Translated()); listFlag = GetList(4, "2"); CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】MES未连接处理耗时: {swSegment.ElapsedMilliseconds}ms", "A进站性能"); } #endregion #region 数据组合 swSegment.Restart(); for (int i = 0; i < list.Count; i++) { if (String.IsNullOrEmpty(list[i].BarCode) || list[i].BarCode.Trim() == "ERROR" || !IsAlphaNumeric(list[i].BarCode)) { listRes[i] = 2; listResult[i] = "NG"; listRemark[i] = "电芯码不良".Translated(); } else { int codeIndex = i; listResult[i] = "OK,"; listRes[i] = 1; if (CommonMethods.sysConfig.MesModeSwitching) { switch (listMesResType[codeIndex]) { case MesResType.A:// 停线,设备报警停机 listResult[i] += "MES NG"; listRemark[i] += listMesage[codeIndex]; listRes[i] = 3;//10 break; case MesResType.B:// 排出 listResult[i] += "MES NG"; listRemark[i] += listMesage[codeIndex]; listRes[i] = 3;//2 break; case MesResType.C:// 警示 case MesResType.D:// 条码上传OK listResult[i] += "MES OK";//MES认为是可以当成良品流下去的 listRemark[i] += listMesage[codeIndex]; listRes[i] = 1; break; default: listResult[i] += "MES NG"; listRemark[i] += listMesage[codeIndex]; listRes[i] = 3;//2 break; } } } list[i].Result = listResult[i].TrimStart(',').TrimEnd(','); list[i].Remark = listRemark[i].TrimStart(',').TrimEnd(','); list[i].Flag = listFlag[i]; } swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】数据组合耗时: {swSegment.ElapsedMilliseconds}ms, 组合条数: {list.Count}", "A进站性能"); #endregion //读取结果显示 //数据存储 -异步处理 #region 数据反馈&保存 swSegment.Restart(); _ = Task.Run(async ()=> { try { await SaveFeedingDataAsync(list); } catch(Exception ex) { LogHelper.Instance.WriteError($"【进站A】SaveFeedingDataAsync: {ex.Message}", "SysErrorLog"); } }); swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】数据存储耗时: {swSegment.ElapsedMilliseconds}ms, 存储条数: {list.Count}", "A进站性能"); swSegment.Restart(); //写入结果反馈 JYResult result = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[1].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort); if (result != null) { string strres = "进站A工位发送给PLC".Translated() + $",[{pf.VarList[1].VarAddress}]:{string.Join(",", listRes)}"; CommonMethods.AddDataMonitorLog(0, strres); LogHelper.Instance.WriteError($"【进站A】工位发送给PLC:{strres}", "SysErrorLog"); } swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】 反馈PLC,耗时{swSegment.ElapsedMilliseconds}ms, 结果:{string.Join(",", listRes)}", "A进站性能"); swSegment.Restart(); CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0); swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站A】PLC 清0耗时: {swSegment.ElapsedMilliseconds}ms", "A进站性能"); #endregion } catch (Exception ex) { LogHelper.Instance.WriteError($"电芯进站A线程数据处理:{ex}", "SysErrorLog"); CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0); } swTotal.Stop(); long cost = swTotal.ElapsedMilliseconds; LogHelper.Instance.WriteLog($"【进站A】总耗时: {cost}ms", "A进站性能"); CommonMethods.AddDataMonitorLog(0, "卷芯进站A共耗时".Translated() + $":{cost}ms"); } else { LogHelper.Instance.WriteError($"【进站A】 数据无效", "SysErrorLog"); CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0); } } /// /// 上料工位B /// //上料解析 private async Task FeedingStationB(JYResult bArrays, object plcModel) { PlcGroup pf = plcModel as PlcGroup; var swTotal = new Stopwatch(); var swSegment = new Stopwatch(); if (bArrays.IsSuccess && bArrays.Content != null) { try { swTotal.Start(); LogHelper.Instance.WriteLog($"【进站B】开始处理, 时间={DateTime.Now:HH:mm:ss.fff}", "B进站性能"); #region 数据初始化 swSegment.Start(); //解析数据 List list = new List();//实体 List listRes = GetList(4, 2);//默认为1,良品 List listMark = GetList(4, false);//有料标志 List listCode = GetList(4, "");//电芯码 List listRemark = GetList(4, "");//备注 List listFlag = GetList(4, "0");//是否上传标志 List listResult = GetList(4, "OK");//结果 List listMesage = GetList(4, "");//mesMesage List listMesResType = GetList(4, MesResType.B);//mesType swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站B】数据初始化耗时: {swSegment.ElapsedMilliseconds}ms", "B进站性能"); #endregion // 从D3021开始 #region 数据解析 swSegment.Restart(); byte[] bytes = bArrays.Content.ByteReverse();//高低位转换 //有料标志 for (int i = 0; i < listMark.Count; i++) { listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2)) == 1 ? true : false;// 从D3021开始 if (listMark[i]) { #region 数据读取 //条码长度 int codeLength = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (20 * 2));// 从D3041开始 if (codeLength > 0) { //条码 listCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 50) + (79 * 2), codeLength, System.Text.Encoding.ASCII).// 从D3100开始 Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); } else { listCode[i] = "ERROR"; } #endregion #region 数据保存 AGearEntity m = new AGearEntity(); m.BarCode = listCode[i]; m.ChannelNo = (i + 1).ToString(); m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); list.Add(m); #endregion } else { CommonMethods.AddDataMonitorLog(0, "进站上料工位B有料标志为0".Translated() + "通道号".Translated() + $":{i}"); } } swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站B】数据解析耗时: {swSegment.ElapsedMilliseconds}ms, 解析条数: {list.Count}", "B进站性能"); #endregion #region 上传MES if (list.Count > 0 && CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { swSegment.Restart(); // 创建临时列表收集所有结果 var allMesMessages = new List(); var allMesResTypes = new List(); var allFlags = new List(); //foreach (var item in list) for (int i = 0; i < list.Count; i++) { var swSegment1 = new Stopwatch(); swSegment1.Start(); // 每次只上传一个条码(封装为List) var singleCodeList = new List { list[i].BarCode }; var (success1, mesage1, mesResType1) = await CommonMethods.hbgMes.ManyCellInStationAsync( CommonMethods.mesConfig.ProductInStation, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.mesUserName, singleCodeList); // 单条码列表 if (success1) { // 收集结果而不是覆盖 allMesMessages.AddRange(mesage1); allMesResTypes.AddRange(mesResType1); allFlags.Add("1"); } else { // 收集失败结果 allMesMessages.AddRange(mesage1); allMesResTypes.AddRange(mesResType1); allFlags.Add("2"); // 记录失败状态 listRes[i] = 3; listRemark[i] = ""; if (mesage1.Count > 0 && mesage1[0].Contains("一个或多个错误")) { CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); // 反馈PLC结果 } } swSegment1.Stop(); LogHelper.Instance.WriteLog($"【进站B】MES上传{i}单条耗时: {swSegment1.ElapsedMilliseconds}ms", "B进站性能"); } // 将收集的结果赋给主列表 listMesage = allMesMessages; listMesResType = allMesResTypes; listFlag = allFlags; swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站B】MES上传总耗时: {swSegment.ElapsedMilliseconds}ms, 上传条数: {list.Count}", "B进站性能"); } else if (list.Count > 0 && (!CommonMethods.sysConfig.MesModeSwitching || !CommonMethods.mesConfig.isConnected)) { swSegment.Restart(); listRes = GetList(4, 3); listRemark = GetList(4, "MES断连".Translated()); listFlag = GetList(4, "2"); CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站B】MES未连接处理耗时: {swSegment.ElapsedMilliseconds}ms", "B进站性能"); } #endregion #region 数据组合 swSegment.Restart(); for (int i = 0; i < list.Count; i++) { if (string.IsNullOrEmpty(list[i].BarCode) || list[i].BarCode.Trim() == "ERROR" || !IsAlphaNumeric(list[i].BarCode)) { listRes[i] = 2; listResult[i] = "NG"; listRemark[i] = "电芯码不良".Translated(); } else { int codeIndex = i; listResult[i] = "OK,"; listRes[i] = 1; if (CommonMethods.sysConfig.MesModeSwitching) { switch (listMesResType[codeIndex]) { case MesResType.A:// 停线,设备报警停机 listResult[i] += "MES NG"; listRemark[i] += listMesage[codeIndex]; listRes[i] = 3; break; case MesResType.B:// 排出 listResult[i] += "MES NG"; listRemark[i] += listMesage[codeIndex]; listRes[i] = 3; break; case MesResType.C:// 警示 case MesResType.D:// 条码上传OK listResult[i] += "MES OK";//MES认为是可以当成良品流下去的 listRemark[i] += listMesage[codeIndex]; listRes[i] = 1; break; default: listResult[i] += "MES NG"; listRemark[i] += listMesage[codeIndex]; listRes[i] = 3; break; } } } list[i].Result = listResult[i].TrimStart(',').TrimEnd(','); list[i].Remark = listRemark[i].TrimStart(',').TrimEnd(','); list[i].Flag = listFlag[i]; } swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站B】数据组合耗时: {swSegment.ElapsedMilliseconds}ms, 组合条数: {list.Count}", "B进站性能"); #endregion #region 数据反馈&保存 swSegment.Restart(); _ = Task.Run(async () => { try { await SaveFeedingDataAsync(list); } catch (Exception ex) { LogHelper.Instance.WriteError($"【进站B】SaveFeedingDataAsync: {ex.Message}", "SysErrorLog"); } }); swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站B】数据存储耗时: {swSegment.ElapsedMilliseconds}ms", "B进站性能"); //写入·结果反馈 JYResult result = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[1].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC if (result != null) { string strres = "进站B工位发送给PLC".Translated() + $",[{pf.VarList[1].VarAddress}]:{string.Join(",", listRes)}"; CommonMethods.AddDataMonitorLog(0, strres); LogHelper.Instance.WriteError($"进站B工位发送给PLC:{strres}", "SysErrorLog"); } CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);//置位0 //读取结果显示 //数据存储 -异步处理 swSegment.Stop(); LogHelper.Instance.WriteLog($"【进站B】反馈PLC+置0组合耗时: {swSegment.ElapsedMilliseconds}ms", "B进站性能"); #endregion } catch (Exception ex) { LogHelper.Instance.WriteError($"电芯进站B线程数据处理:{ex}", "SysErrorLog"); try { CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0); } catch { } } swTotal.Stop(); long cost = swTotal.ElapsedMilliseconds; LogHelper.Instance.WriteLog($"【进站B】总耗时: {cost}ms", "B进站性能"); CommonMethods.AddDataMonitorLog(0, "卷芯进站B共耗时".Translated() + $":{cost}ms"); } else { LogHelper.Instance.WriteError($"【进站B】 数据无效", "SysErrorLog"); CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0); } } #region 保存上料数据 /// /// 保存上料数据到数据 /// /// private async Task SaveFeedingDataAsync(List list) { //数据的保存 try { if (list != null && list.Count > 0) { bool b = await CommonMethods.db.AddReturnBoolAsync(list); //数据显示 CommonMethods.ShowFeedingDelegate.Invoke(list); } } catch (Exception ex) { LogHelper.Instance.WriteError($"卷芯上料保存处理异常:{ex}", "SysErrorLog"); } } #endregion #endregion #region 下料工位(数据处理) /// /// 电芯出站A /// /// /// private async Task BlankingStationA(JYResult bArrays, object plcModel) { PlcGroup pf = plcModel as PlcGroup; var swTotal = new Stopwatch(); var swSegment = new Stopwatch(); string logName = "A出站"; LogHelper.Instance.WriteLog($"[{logName}] 开始处理", logName); if (bArrays.IsSuccess && bArrays.Content != null) { try { swTotal.Start(); LogHelper.Instance.WriteLog($"【出站A】开始处理, 时间={DateTime.Now:HH:mm:ss.fff}", "A出站性能"); #region 初始化数据 swSegment.Restart(); List list = new List(); List listRes = GetList(8, 2);//默认为1,良品 List listMark = GetList(8, false);//有料标志 List listCode = GetList(8, "");//电芯码 List listRemark = GetList(8, "");//备注 List listFlag = GetList(8, "0");//是否上传标志 List listResult = GetList(8, "OK");//结果 List listMesMesage = GetList(8, "");//mesMesage List listMesResType = GetList(8, MesResType.B);//mesType List listFutou = GetList(8, 0);//复投 //ushort listRes = 1; // 默认为1,良品 string lst_RFIDCodes = ""; // 托杯码 string lst_BarCodes = ""; // 条码 string windSpeed = "";// 风速 string ccdFaceTestDeviceNum1;// 端面检测设备号1 string ccdFaceTestDeviceNum2;// 端面检测设备号2 string ccdFaceTestDeviceNum3;// 端面检测设备号3 string ccdFaceTestDeviceNum4;// 端面检测设备号4 string ccdCylinderTestDeviceNum1;// 柱面检测设备号1 string ccdCylinderTestDeviceNum2;// 柱面检测设备号2 string ccdCylinderTestDeviceNum3;// 柱面检测设备号3 int ccdNegativeTerminalWeldingZone2DInspectionResult = 0; //负极焊接区2D检测结果 int ccdNegativeTerminalWeldingZone2DInspectionNGReasons = 0; //负极焊接区2D检测NG原因(脏污) int ccdNegativeTerminalWeldingZone2DInspectionNGReasons1 = 0; //负极焊接区2D检测NG原因(划伤) int ccdNegativeTerminalWeldingZone2DInspectionNGReasons2 = 0; //负极焊接区2D检测NG原因(凹点) int ccdCoverPlate2DInspectionResult = 0; //盖板2D检测结果 int ccdCoverPlate2DInspectionNGReasons = 0; //盖板2D检测NG原因(脏污) int ccdCoverPlate2DInspectionNGReasons1 = 0; //盖板2D检测NG原因(划伤) int ccdCoverPlate2DInspectionNGReasons2 = 0; //盖板2D检测NG原因(凹点) int ccdCoverPlate2DInspectionNGReasons3 = 0; //盖板2D检测NG原因(生锈) int ccdNegativeTerminalWeldingZone25DInspectionResult = 0; //负极焊接区2.5D检测结果 int ccdNegativeTerminalWeldingZone25DInspectionNGReasons = 0; //负极焊接区2.5D检测NG原因(脏污) int ccdNegativeTerminalWeldingZone25DInspectionNGReasons1 = 0; //负极焊接区2.5D检测NG原因(划伤) int ccdNegativeTerminalWeldingZone25DInspectionNGReasons2 = 0; //负极焊接区2.5D检测NG原因(凹点) int ccdCoverPlate25DInspectionResult = 0; //盖板2.5D检测结果 int ccdCoverPlate25DInspectionNGReasons = 0; //盖板2.5D检测NG原因(脏污) int ccdCoverPlate25DInspectionNGReasons1 = 0; //盖板2.5D检测NG原因(划伤) int ccdCoverPlate25DInspectionNGReasons2 = 0; //盖板2.5D检测NG原因(凹点) int ccdTerminalPost2DInspectionResult = 0; //极柱2D检测结果 int ccdTerminalPost2DInspectionNGReasons = 0; //极柱2D检测NG原因(脏污) int ccdTerminalPost2DInspectionNGReasons1 = 0; //极柱2D检测NG原因(划伤) int ccdTerminalPost2DInspectionNGReasons2 = 0; //极柱2D检测NG原因(凹点) int ccdTerminalPost2DInspectionNGReasons3 = 0; //极柱2D检测NG原因(残缺) int ccdTerminalPost3DInspectionResult = 0; //极柱3D检测结果 int ccdTerminalPost3DInspectionNGReasons = 0; //极柱3D检测NG原因(脏污) int ccdTerminalPost3DInspectionNGReasons1 = 0; //极柱3D检测NG原因(划伤) int ccdTerminalPost3DInspectionNGReasons2 = 0; //极柱3D检测NG原因(凹点) int ccdTerminalPost3DInspectionNGReasons3 = 0; //极柱3D检测NG原因(残缺) int ccdSealingNail2DInspectionResult = 0; //密封钉2D检测结果 int ccdSealingNail2DInspectionNGReasons = 0; //密封钉2D检测NG原因(铝钉焊接) int ccdSealingNail3DInspectionResult = 0; //密封钉3D检测结果 int ccdSealingNail3DInspectionNGReasons = 0; //密封钉3D检测NG原因(铝钉焊接) int ccdTopFillet25DInspectionResult = 0; //上部R角2.5D检测结果 int ccdTopFillet25DInspectionNGReasons = 0; //上部R角2.5D检测NG原因(凹点) int ccdBottomFillet25DInspectionResult = 0; //底部R角2.5D检测结果 int ccdBottomFillet25DInspectionNGReasons = 0; //底部R角2.5D检测NG原因(凹点) int ccdCylindricalSurface25DInspectionResult = 0; //柱面2.5D检测结果 int ccdCylindricalSurface25DInspectionNGReasons = 0; //柱面2.5D检测NG原因(生锈) int ccdCylindricalSurface25DInspectionNGReasons1 = 0; //柱面2.5D检测NG原因(划伤) int ccdCylindricalSurface25DInspectionNGReasons2 = 0; //柱面2.5D检测NG原因(凹点) int ccdCylindricalSurface25DInspectionNGReasons3 = 0; //柱面2.5D检测NG原因(模糊) int ccdCylindricalSurface3DInspectionResult = 0; //柱面3D检测结果 int ccdCylindricalSurface3DInspectionNGReasons = 0; //柱面3D检测NG原因(生锈) int ccdCylindricalSurface3DInspectionNGReasons1 = 0; //柱面3D检测NG原因(划伤) int ccdCylindricalSurface3DInspectionNGReasons2 = 0; //柱面3D检测NG原因(凹点) int ccdCylindricalSurface3DInspectionNGReasons3 = 0; //柱面3D检测NG原因(模糊) int ccdPositiveTerminaJYQ2DInspectionResult = 0; //正极绝缘圈2D检测结果 int ccdPositiveTerminaJYQ2DInspectionNGReasons = 0; //正极绝缘圈2D检测NG原因(变形) int ccdNegativeTerminaJYQ2DInspectionResult = 0; //负极绝缘圈2D检测结果 int ccdNegativeTerminaJYQ2DInspectionNGReasons = 0; //负极绝缘圈2D检测NG原因(变形) int[] ccdTestResult = new int[12];//ccd检测结果 string result = "";//总结果 string info = "";//NG详情 swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站A】数据初始化耗时: {swSegment.ElapsedMilliseconds}ms", "A出站性能"); #endregion #region 数据解析 swSegment.Restart(); byte[] bytes = bArrays.Content.ByteReverse(); //有料标志 for (int i = 0; i < listMark.Count; i++) { BGearEntity m2 = new BGearEntity(); listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2)) == 1 ? true : false;// 从D4021开始 if (listMark[i])//无料标志只提示 { #region 数据读取 //条码长度 int codeLength = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (20 * 2));// 从D4041开始 if (codeLength > 0) { //条码 listCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 50) + (79 * 2), codeLength, System.Text.Encoding.ASCII).// 从D4100开始 Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); LogHelper.Instance.WriteLog($"电芯出站A条码:{listCode[i]}", "A出站"); } else { listCode[i] = "ERROR"; } windSpeed = GetValueFromByteArray(bArrays.Content, "windSpeed", i * 4); // 风速 D4600 579 ccdFaceTestDeviceNum1 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum1", (i * 8) * 2); // 端面检测设备号1 D4616 595 ccdFaceTestDeviceNum2 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum2", (i * 8) * 2); // 端面检测设备号2 D4618 597 ccdFaceTestDeviceNum3 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum3", (i * 8) * 2); // 端面检测设备号3 D4620 599 ccdFaceTestDeviceNum4 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum4", (i * 8) * 2); // 端面检测设备号4 D4622 601 ccdCylinderTestDeviceNum1 = GetValueFromByteArray(bArrays.Content, "ccdCylinderTestDeviceNum1", (i * 8) * 2); // 柱面检测设备号1 D4680 659 ccdCylinderTestDeviceNum2 = GetValueFromByteArray(bArrays.Content, "ccdCylinderTestDeviceNum2", (i * 8) * 2); // 柱面检测设备号2 D4682 661 ccdCylinderTestDeviceNum3 = GetValueFromByteArray(bArrays.Content, "ccdCylinderTestDeviceNum3", (i * 8) * 2); // 柱面检测设备号3 D4684 663 ccdNegativeTerminalWeldingZone2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionResult", (i * 2))); // 负极焊接区2D检测结果 ccdNegativeTerminalWeldingZone2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionNGReasons", (i * 2))); // 负极焊接区2D检测NG原因 ccdNegativeTerminalWeldingZone2DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionNGReasons1", (i * 2))); // 负极焊接区2D检测NG原因 ccdNegativeTerminalWeldingZone2DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionNGReasons2", (i * 2))); // 负极焊接区2D检测NG原因 ccdCoverPlate2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionResult", (i * 2))); // 盖板2D检测结果 ccdCoverPlate2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons", (i * 2))); // 盖板2D检测NG原因 ccdCoverPlate2DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons1", (i * 2))); // 盖板2D检测NG原因 ccdCoverPlate2DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons2", (i * 2))); // 盖板2D检测NG原因 ccdCoverPlate2DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons3", (i * 2))); // 盖板2D检测NG原因 ccdNegativeTerminalWeldingZone25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionResult", (i * 2))); // 负极焊接区2.5D检测结果 ccdNegativeTerminalWeldingZone25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionNGReasons", (i * 2))); // 负极焊接区2.5D检测NG原因 ccdNegativeTerminalWeldingZone25DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionNGReasons1", (i * 2))); // 负极焊接区2.5D检测NG原因 ccdNegativeTerminalWeldingZone25DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionNGReasons2", (i * 2))); // 负极焊接区2.5D检测NG原因 ccdCoverPlate25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionResult", (i * 2))); // 盖板2.5D检测结果 ccdCoverPlate25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionNGReasons", (i * 2))); // 盖板2.5D检测NG原因 ccdCoverPlate25DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionNGReasons1", (i * 2))); // 盖板2.5D检测NG原因 ccdCoverPlate25DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionNGReasons2", (i * 2))); // 盖板2.5D检测NG原因 ccdTerminalPost2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionResult", (i * 2))); // 极柱2D检测结果 ccdTerminalPost2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost2DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons1", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost2DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons2", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost2DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons3", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost3DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionResult", (i * 2))); // 极柱3D检测结果 ccdTerminalPost3DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons", (i * 2))); // 极柱3D检测NG原因 ccdTerminalPost3DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons1", (i * 2))); // 极柱3D检测NG原因 ccdTerminalPost3DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons2", (i * 2))); // 极柱3D检测NG原因 ccdTerminalPost3DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons3", (i * 2))); // 极柱3D检测NG原因 ccdSealingNail2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail2DInspectionResult", (i * 2))); // 密封钉2D检测结果 ccdSealingNail2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail2DInspectionNGReasons", (i * 2))); // 密封钉2D检测NG原因 ccdSealingNail3DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail3DInspectionResult", (i * 2))); // 密封钉3D检测结果 ccdSealingNail3DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail3DInspectionNGReasons", (i * 2))); // 密封钉3D检测NG原因 ccdTopFillet25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTopFillet25DInspectionResult", (i * 2))); // 上部R角2.5D检测结果 ccdTopFillet25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTopFillet25DInspectionNGReasons", (i * 2))); // 上部R角2.5D检测NG原因 ccdBottomFillet25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdBottomFillet25DInspectionResult", (i * 2))); // 底部R角2.5D检测结果 ccdBottomFillet25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdBottomFillet25DInspectionNGReasons", (i * 2))); // 底部R角2.5D检测NG原因 ccdCylindricalSurface25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionResult", (i * 2))); // 柱面2.5D检测结果 ccdCylindricalSurface25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface25DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons1", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface25DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons2", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface25DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons3", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface3DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionResult", (i * 2))); // 柱面3D检测结果 ccdCylindricalSurface3DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons", (i * 2))); // 柱面3D检测NG原因 ccdCylindricalSurface3DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons1", (i * 2))); // 柱面3D检测NG原因 ccdCylindricalSurface3DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons2", (i * 2))); // 柱面3D检测NG原因 ccdCylindricalSurface3DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons3", (i * 2))); // 柱面3D检测NG原因 ccdPositiveTerminaJYQ2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdPositiveTerminaJYQ2DInspectionResult", (i * 2))); // 正极绝缘圈2D检测结果 ccdPositiveTerminaJYQ2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdPositiveTerminaJYQ2DInspectionNGReasons", (i * 2))); // 正极绝缘圈2D检测NG原因(变形) ccdNegativeTerminaJYQ2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminaJYQ2DInspectionResult", (i * 2))); // 负极绝缘圈2D检测结果 ccdNegativeTerminaJYQ2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminaJYQ2DInspectionNGReasons", (i * 2))); // 负极绝缘圈2D检测NG原因(变形) ccdTestResult[0] = ccdNegativeTerminalWeldingZone2DInspectionResult;//D4728 // 负极焊接区2D检测结果 ccdTestResult[1] = ccdCoverPlate2DInspectionResult;//D4760 // 盖板2D检测结果 ccdTestResult[2] = ccdNegativeTerminalWeldingZone25DInspectionResult;//D4808 // 负极焊接区2.5D检测结果 ccdTestResult[3] = ccdCoverPlate25DInspectionResult;//D4840 // 盖板2.5D检测结果 ccdTestResult[4] = ccdTerminalPost2DInspectionResult;//D4872 // 极柱2D检测结果 ccdTestResult[5] = ccdTerminalPost3DInspectionResult;//D4912 // 极柱3D检测结果 ccdTestResult[6] = ccdSealingNail2DInspectionResult;//D4952 // 密封钉2D检测结果 ccdTestResult[7] = ccdSealingNail3DInspectionResult;//D4968 // 密封钉3D检测结果 ccdTestResult[8] = ccdTopFillet25DInspectionResult;//D4984 // 上部R角2.5D检测结果 ccdTestResult[9] = ccdBottomFillet25DInspectionResult;//D5000 // 底部R角2.5D检测结果 ccdTestResult[10] = ccdCylindricalSurface25DInspectionResult;//D5016 // 柱面2.5D检测结果 ccdTestResult[11] = ccdCylindricalSurface3DInspectionResult;//D5056 // 柱面3D检测结果 //string resultPLC = GetValueFromByteArray(bArrays.Content, "result", (i * 2));// 总结果 D4768 747 result = int.Parse(GetValueFromByteArray(bArrays.Content, "result", (i * 2))) == 1 ? "OK" : "NG"; //LogHelper.Instance.WriteError($"A出站总结果1:result:"+ result + ", resultPLC:" + resultPLC, "电芯出站A"); string strErr = ""; short a = (short)GetResult(ccdTestResult, ref strErr); info = strErr; //result = a == 12 ? "OK" : "NG"; LogHelper.Instance.WriteLog($"A出站总结果:result:" + result + ", info:" + info, "A出站"); //info = GetValueFromByteArray(bArrays.Content, "info", (i * 2));// NG详情 D4776 755 lst_RFIDCodes = "";//StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 39, Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); // RFID D3200-3219 lst_BarCodes = listCode[i]; listFutou[i] = 0; // todo add 20260425 #endregion #region 数据保存 BGearEntity m = new BGearEntity { ChannelNo = (i + 1).ToString(), TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), RFID = lst_RFIDCodes, BarCode = lst_BarCodes, WindSpeed = windSpeed, WindDeviceNum = "A", CCDFaceTestDeviceNum1 = "A", CCDFaceTestDeviceNum2 = "A", CCDFaceTestDeviceNum3 = "A", CCDFaceTestDeviceNum4 = "A", CCDCylinderTestDeviceNum1 = "A", CCDCylinderTestDeviceNum2 = "A", CCDCylinderTestDeviceNum3 = "A", CCDNegativeTerminalWeldingZone2DInspectionResult = ccdNegativeTerminalWeldingZone2DInspectionResult == 1 ? "OK" : "NG", CCDNegativeTerminalWeldingZone2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdNegativeTerminalWeldingZone2DInspectionNGReasons, "UI20801"), GetNGReasons(ccdNegativeTerminalWeldingZone2DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdNegativeTerminalWeldingZone2DInspectionNGReasons2, "UI127")), CCDCoverPlate2DInspectionResult = ccdCoverPlate2DInspectionResult == 1 ? "OK" : "NG", CCDCoverPlate2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCoverPlate2DInspectionNGReasons, "UI20801"), GetNGReasons(ccdCoverPlate2DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCoverPlate2DInspectionNGReasons2, "UI127"), GetNGReasons(ccdCoverPlate2DInspectionNGReasons3, "UI298")), CCDNegativeTerminalWeldingZone25DInspectionResult = ccdNegativeTerminalWeldingZone25DInspectionResult == 1 ? "OK" : "NG", CCDNegativeTerminalWeldingZone25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdNegativeTerminalWeldingZone25DInspectionNGReasons, "UI20801"), GetNGReasons(ccdNegativeTerminalWeldingZone25DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdNegativeTerminalWeldingZone25DInspectionNGReasons2, "UI127")), CCDCoverPlate25DInspectionResult = ccdCoverPlate25DInspectionResult == 1 ? "OK" : "NG", CCDCoverPlate25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCoverPlate25DInspectionNGReasons, "UI20801"), GetNGReasons(ccdCoverPlate25DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCoverPlate25DInspectionNGReasons2, "UI127")), CCDTerminalPost2DInspectionResult = ccdTerminalPost2DInspectionResult == 1 ? "OK" : "NG", CCDTerminalPost2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCoverPlate25DInspectionNGReasons, "UI20801"), GetNGReasons(ccdTerminalPost2DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdTerminalPost2DInspectionNGReasons2, "UI127"), GetNGReasons(ccdTerminalPost2DInspectionNGReasons3, "UI125")), CCDTerminalPost3DInspectionResult = ccdTerminalPost3DInspectionResult == 1 ? "OK" : "NG", CCDTerminalPost3DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdTerminalPost3DInspectionNGReasons, "UI20801"), GetNGReasons(ccdTerminalPost3DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdTerminalPost3DInspectionNGReasons2, "UI127"), GetNGReasons(ccdTerminalPost3DInspectionNGReasons3, "UI125")), CCDSealingNail2DInspectionResult = ccdSealingNail2DInspectionResult == 1 ? "OK" : "NG", CCDSealingNail2DInspectionNGReasons = "", CCDSealingNail3DInspectionResult = ccdSealingNail3DInspectionResult == 1 ? "OK" : "NG", CCDSealingNail3DInspectionNGReasons = "", CCDTopFillet25DInspectionResult = ccdTopFillet25DInspectionResult == 1 ? "OK" : "NG", CCDTopFillet25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdTopFillet25DInspectionNGReasons, "UI127")), CCDBottomFillet25DInspectionResult = ccdBottomFillet25DInspectionResult == 1 ? "OK" : "NG", CCDBottomFillet25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdBottomFillet25DInspectionNGReasons, "UI127")), CCDCylindricalSurface25DInspectionResult = ccdCylindricalSurface25DInspectionResult == 1 ? "OK" : "NG", CCDCylindricalSurface25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons, "UI128"), GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons2, "UI127"), GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons3, "UI00404")), CCDCylindricalSurface3DInspectionResult = ccdCylindricalSurface3DInspectionResult == 1 ? "OK" : "NG", CCDCylindricalSurface3DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons, "UI128"), GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons2, "UI127"), GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons3, "UI00404")), CCDPositiveTerminaJYQ2DInspectionResult = ccdPositiveTerminaJYQ2DInspectionResult == 1 ? "OK" : "NG", CCDPositiveTerminaJYQ2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdPositiveTerminaJYQ2DInspectionNGReasons, "UI15301")), CCDNegativeTerminaJYQ2DInspectionResult = ccdNegativeTerminaJYQ2DInspectionResult == 1 ? "OK" : "NG", CCDNegativeTerminaJYQ2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdNegativeTerminaJYQ2DInspectionNGReasons, "UI15302")), Flag = "0", Flag1 = "2", Result = result, Info = info, MaterialCode = CommonMethods.mesConfig.MaterialCode, Futou = listFutou[i], }; m2 = m; //list.Add(m); #endregion } else { CommonMethods.AddDataMonitorLog(0, "出站下料工位A有料标志为0".Translated() + "通道号".Translated() + $":{i}"); } list.Add(m2); } swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站A】数据解析耗时: {swSegment.ElapsedMilliseconds}ms, 解析条数: {list.Count}", "A出站性能"); #endregion #region 数据上传MES if (list.Count > 0 && CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { swSegment.Restart(); // 初始化结果收集列表 var tempMesMessages = new List(); var tempMesResTypes = new List(); var tempFlags = new List(); foreach (var item in list) { // 创建单个电池的列表 var singleBatteryList = new List { item }; // 调用MES接口(每次只传一个电池) var (success, mesage, mesResType) = await CommonMethods.hbgMes.ManyCellOutStationAsync( CommonMethods.mesConfig.ProductOutStation, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.ModelName, CommonMethods.mesConfig.mesUserName, singleBatteryList, 1, CommonMethods.mesConfig.materialLotCodeLocator); if (success) { // 收集成功结果 tempMesMessages.AddRange(mesage); tempMesResTypes.AddRange(mesResType); tempFlags.Add("1"); } else { // 收集失败结果 tempMesMessages.AddRange(mesage); tempMesResTypes.AddRange(mesResType); tempFlags.Add("2"); // 记录失败状态 listRes = GetList(8, 3); listRemark = GetList(8, ""); if (mesage.Count > 0 && mesage[0].Contains("一个或多个错误")) { CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); // 反馈PLC结果 } } } // 将收集的结果赋给主列表 listMesMesage = tempMesMessages; listMesResType = tempMesResTypes; listFlag = tempFlags; //LogHelper.Instance.WriteError($"A出站是否上传mes参数:{listFlag}", "电芯出站A是否上传mes"); swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站A】MES上传总耗时: {swSegment.ElapsedMilliseconds}ms", "A出站性能"); } else { LogHelper.Instance.WriteLog($"【出站A】MES未连接或未开启, MesModeSwitching={CommonMethods.sysConfig.MesModeSwitching}, isConnected={CommonMethods.mesConfig.isConnected}, 时间={DateTime.Now:HH:mm:ss.fff}", "A出站"); listRes = GetList(8, 3); listRemark = GetList(8, "MES断连".Translated() + ","); listFlag = GetList(8, "2"); CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short);//反馈MES结果 } #endregion #region 上传产品结果参数 if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { swSegment.Restart(); _ = Task.Run(async () => { try { await UpProducResultParamAsync(list); } catch (Exception ex) { LogHelper.Instance.WriteError($"【出站A】UpProducResultParamAsync: {ex.Message}", "SysErrorLog"); } }); swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站A】产品结果参数上传耗时: {swSegment.ElapsedMilliseconds}ms", "A出站性能"); } #endregion #region 数据组合 LogHelper.Instance.WriteLog($"【出站A】开始数据组合, list.Count={list.Count}, listMesResType.Count={listMesResType.Count}, 时间={DateTime.Now:HH:mm:ss.fff}", "A出站"); for (int i = 0; i < list.Count; i++) { if (String.IsNullOrEmpty(list[i].BarCode) || list[i].BarCode.Trim() == "ERROR" || !IsAlphaNumeric(list[i].BarCode)) { listRes[i] = 2; listResult[i] = "NG"; list[i].Info = "电芯码不良".Translated(); listFlag[i] = "2"; } else { listResult[i] = list[i].Result; //list[i].Info = list[i].Info; // 本地判断OK,MES判断OK if (listResult[i] == "OK" && listMesResType[i] == MesResType.D) { listResult[i] += ",MES OK"; list[i].Info = "良品".Translated(); listRes[i] = 1; listFlag[i] = "1"; } // 本地判断OK,MES判断NG listMesResType 默认 B else if (listResult[i] == "OK" && listMesResType[i] != MesResType.D) { listRes[i] = 1; if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { switch (listMesResType[i]) { case MesResType.A: // 停线,设备报警停机 listResult[i] += ",MES NG"; listRemark[i] += $"A,{listMesMesage[i]}"; listRes[i] = 3;//10 listFlag[i] = "2"; break; case MesResType.B: // MES不良 listResult[i] += ",MES NG"; listRemark[i] += $"B,{listMesMesage[i]}"; listRes[i] = 3;//9 listFlag[i] = "2"; break; case MesResType.C: // 警示 listResult[i] += ",MES OK"; // MES认为是可以当成良品流下去的 listRemark[i] += $"Alarm:{listMesMesage[i]}"; listRes[i] = 1; listFlag[i] = "1"; break; case MesResType.D: // 条码上传OK listResult[i] += ",MES OK"; listRemark[i] += $"D,{listMesMesage[i]}"; listRes[i] = 1; listFlag[i] = "1"; break; default: listResult[i] += ",MES NG"; listRemark[i] += $"{listMesMesage[i]}"; listRes[i] = 3;//9 listFlag[i] = "2"; break; } } } // 本地判断NG,MES判断OK else if (listResult[i] == "NG" && listMesResType[i] == MesResType.D) { listResult[i] += ",MES OK"; listRemark[i] += $"D,{listMesMesage[i]}"; listRes[i] = 1; listFlag[i] = "1"; } // 本地判断NG,MES判断NG else if (listResult[i] == "NG" && listMesResType[i] != MesResType.D) { if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { listResult[i] += ",MES NG"; listRemark[i] += $"{listMesResType[i].ToString()},{listMesMesage[i]}"; listRes[i] = 3;//9 listFlag[i] = "2"; } else { listRes[i] = 4;// CCD ng } } // 其他情况 else { if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { listResult[i] += ",MES NG"; listRemark[i] += listMesMesage[i]; listRes[i] = 3;//9 listFlag[i] = "2"; } else { listRes[i] = 4;// CCD ng } } } list[i].Result = listResult[i].TrimStart(',').TrimEnd(','); list[i].Remark = listRemark[i].TrimStart(',').TrimEnd(','); list[i].Flag = listFlag[i]; } #endregion var listBGearEntity = new List(); for (int i = 0; i < listMark.Count; i++) { if (listMark[i]) { listBGearEntity.Add(list[i]); } } #region 数据反馈 swSegment.Restart(); _ = Task.Run(async () => { try { await SaveBlankingDataAsync(listBGearEntity); } catch (Exception ex) { LogHelper.Instance.WriteError($"【出站A】SaveBlankingDataAsync: {ex.Message}", "SysErrorLog"); } }); swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站A】数据存储耗时: {swSegment.ElapsedMilliseconds}ms", "A出站性能"); swSegment.Restart(); if (pf.IsFeedbackPlc) { //写入·结果反馈 JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[1].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC if (result1 != null) { string strres = "出站A工位发送给PLC".Translated() + $",[{pf.VarList[1].VarAddress}]:{string.Join(",", listRes)}"; CommonMethods.AddDataMonitorLog(0, strres); LogHelper.Instance.WriteLog($"出站A工位发送给PLC:{string.Join(",", listCode)}======{string.Join(",", listRes)}", "A出站"); } } CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0); // 置位0 swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站A】PLC反馈耗时: {swSegment.ElapsedMilliseconds}ms", "A出站性能"); #endregion } catch (Exception ex) { CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0); // 置位0 LogHelper.Instance.WriteLog($"出站A工位置位0", "A出站"); LogHelper.Instance.WriteError($"电芯出站A线程数据处理:{ex}", "SysErrorLog"); } swTotal.Stop(); CommonMethods.AddDataMonitorLog(0, "电芯出站A共耗时".Translated() + $":{swTotal.ElapsedMilliseconds}ms"); LogHelper.Instance.WriteLog($"【出站A】总耗时: {swTotal.ElapsedMilliseconds}ms", "A出站性能"); } } /// /// 电芯出站B /// /// /// private async Task BlankingStationB(JYResult bArrays, object plcModel) { PlcGroup pf = plcModel as PlcGroup; var swTotal = new Stopwatch(); var swSegment = new Stopwatch(); if (bArrays.IsSuccess && bArrays.Content != null) { try { swTotal.Start(); LogHelper.Instance.WriteLog($"【出站B】开始处理, 时间={DateTime.Now:HH:mm:ss.fff}", "B出站性能"); #region 初始化数据 swSegment.Restart(); List list = new List(); List listRes = GetList(8, 2);//默认为1,良品 List listMark = GetList(8, false);//有料标志 List listCode = GetList(8, "");//电芯码 List listRemark = GetList(8, "");//备注 List listFlag = GetList(8, "0");//是否上传标志 List listResult = GetList(8, "OK");//结果 List listMesMesage = GetList(8, "");//mesMesage List listMesResType = GetList(8, MesResType.B);//mesType List listFutou = GetList(8, 0);//复投 string lst_RFIDCodes = ""; // 托杯码 string lst_BarCodes = ""; // 条码 string windSpeed = "";// 风速 string ccdFaceTestDeviceNum1;// 端面检测设备号1 string ccdFaceTestDeviceNum2;// 端面检测设备号2 string ccdFaceTestDeviceNum3;// 端面检测设备号3 string ccdFaceTestDeviceNum4;// 端面检测设备号4 string ccdCylinderTestDeviceNum1;// 柱面检测设备号1 string ccdCylinderTestDeviceNum2;// 柱面检测设备号2 string ccdCylinderTestDeviceNum3;// 柱面检测设备号3 int ccdNegativeTerminalWeldingZone2DInspectionResult = 0; //负极焊接区2D检测结果 int ccdNegativeTerminalWeldingZone2DInspectionNGReasons = 0; //负极焊接区2D检测NG原因(脏污) int ccdNegativeTerminalWeldingZone2DInspectionNGReasons1 = 0; //负极焊接区2D检测NG原因(划伤) int ccdNegativeTerminalWeldingZone2DInspectionNGReasons2 = 0; //负极焊接区2D检测NG原因(凹点) int ccdCoverPlate2DInspectionResult = 0; //盖板2D检测结果 int ccdCoverPlate2DInspectionNGReasons = 0; //盖板2D检测NG原因(脏污) int ccdCoverPlate2DInspectionNGReasons1 = 0; //盖板2D检测NG原因(划伤) int ccdCoverPlate2DInspectionNGReasons2 = 0; //盖板2D检测NG原因(凹点) int ccdCoverPlate2DInspectionNGReasons3 = 0; //盖板2D检测NG原因(生锈) int ccdNegativeTerminalWeldingZone25DInspectionResult = 0; //负极焊接区2.5D检测结果 int ccdNegativeTerminalWeldingZone25DInspectionNGReasons = 0; //负极焊接区2.5D检测NG原因(脏污) int ccdNegativeTerminalWeldingZone25DInspectionNGReasons1 = 0; //负极焊接区2.5D检测NG原因(划伤) int ccdNegativeTerminalWeldingZone25DInspectionNGReasons2 = 0; //负极焊接区2.5D检测NG原因(凹点) int ccdCoverPlate25DInspectionResult = 0; //盖板2.5D检测结果 int ccdCoverPlate25DInspectionNGReasons = 0; //盖板2.5D检测NG原因(脏污) int ccdCoverPlate25DInspectionNGReasons1 = 0; //盖板2.5D检测NG原因(划伤) int ccdCoverPlate25DInspectionNGReasons2 = 0; //盖板2.5D检测NG原因(凹点) int ccdTerminalPost2DInspectionResult = 0; //极柱2D检测结果 int ccdTerminalPost2DInspectionNGReasons = 0; //极柱2D检测NG原因(脏污) int ccdTerminalPost2DInspectionNGReasons1 = 0; //极柱2D检测NG原因(划伤) int ccdTerminalPost2DInspectionNGReasons2 = 0; //极柱2D检测NG原因(凹点) int ccdTerminalPost2DInspectionNGReasons3 = 0; //极柱2D检测NG原因(残缺) int ccdTerminalPost3DInspectionResult = 0; //极柱3D检测结果 int ccdTerminalPost3DInspectionNGReasons = 0; //极柱3D检测NG原因(脏污) int ccdTerminalPost3DInspectionNGReasons1 = 0; //极柱3D检测NG原因(划伤) int ccdTerminalPost3DInspectionNGReasons2 = 0; //极柱3D检测NG原因(凹点) int ccdTerminalPost3DInspectionNGReasons3 = 0; //极柱3D检测NG原因(残缺) int ccdSealingNail2DInspectionResult = 0; //密封钉2D检测结果 int ccdSealingNail2DInspectionNGReasons = 0; //密封钉2D检测NG原因(铝钉焊接) int ccdSealingNail3DInspectionResult = 0; //密封钉3D检测结果 int ccdSealingNail3DInspectionNGReasons = 0; //密封钉3D检测NG原因(铝钉焊接) int ccdTopFillet25DInspectionResult = 0; //上部R角2.5D检测结果 int ccdTopFillet25DInspectionNGReasons = 0; //上部R角2.5D检测NG原因(凹点) int ccdBottomFillet25DInspectionResult = 0; //底部R角2.5D检测结果 int ccdBottomFillet25DInspectionNGReasons = 0; //底部R角2.5D检测NG原因(凹点) int ccdCylindricalSurface25DInspectionResult = 0; //柱面2.5D检测结果 int ccdCylindricalSurface25DInspectionNGReasons = 0; //柱面2.5D检测NG原因(生锈) int ccdCylindricalSurface25DInspectionNGReasons1 = 0; //柱面2.5D检测NG原因(划伤) int ccdCylindricalSurface25DInspectionNGReasons2 = 0; //柱面2.5D检测NG原因(凹点) int ccdCylindricalSurface25DInspectionNGReasons3 = 0; //柱面2.5D检测NG原因(模糊) int ccdCylindricalSurface3DInspectionResult = 0; //柱面3D检测结果 int ccdCylindricalSurface3DInspectionNGReasons = 0; //柱面3D检测NG原因(生锈) int ccdCylindricalSurface3DInspectionNGReasons1 = 0; //柱面3D检测NG原因(划伤) int ccdCylindricalSurface3DInspectionNGReasons2 = 0; //柱面3D检测NG原因(凹点) int ccdCylindricalSurface3DInspectionNGReasons3 = 0; //柱面3D检测NG原因(模糊) int ccdPositiveTerminaJYQ2DInspectionResult = 0; //正极绝缘圈2D检测结果 int ccdPositiveTerminaJYQ2DInspectionNGReasons = 0; //正极绝缘圈2D检测NG原因(变形) int ccdNegativeTerminaJYQ2DInspectionResult = 0; //负极绝缘圈2D检测结果 int ccdNegativeTerminaJYQ2DInspectionNGReasons = 0; //负极绝缘圈2D检测NG原因(变形) int[] ccdTestResult = new int[12];//ccd检测结果 string result = "";//总结果 string info = "";//NG详情 swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站B】数据初始化耗时: {swSegment.ElapsedMilliseconds}ms", "B出站性能"); #endregion #region 数据解析 swSegment.Restart(); byte[] bytes = bArrays.Content.ByteReverse(); //有料标志 for (int i = 0; i < listMark.Count; i++) { BGearEntity m2 = new BGearEntity(); listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2)) == 1 ? true : false;// 从D6021开始 if (listMark[i]) { #region 数据读取 //条码长度 int codeLength = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (20 * 2));// 从D6041开始 if (codeLength > 0) { //条码 listCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 50) + (79 * 2), codeLength, System.Text.Encoding.ASCII).// 从D4100开始 Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); LogHelper.Instance.WriteLog($"电芯出站B条码:{listCode[i]}", "BarCode"); } else { listCode[i] = "ERROR"; } windSpeed = GetValueFromByteArray(bArrays.Content, "windSpeed", i == 0 ? 0 : (int)Math.Pow(2, i + 1)); // 风速 D6600 579 ccdFaceTestDeviceNum1 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum1", (i * 8) * 2); // 端面检测设备号1 D6616 595 ccdFaceTestDeviceNum2 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum2", (i * 8) * 2); // 端面检测设备号2 D6618 597 ccdFaceTestDeviceNum3 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum3", (i * 8) * 2); // 端面检测设备号3 D6620 599 ccdFaceTestDeviceNum4 = GetValueFromByteArray(bArrays.Content, "ccdFaceTestDeviceNum4", (i * 8) * 2); // 端面检测设备号4 D6622 601 ccdCylinderTestDeviceNum1 = GetValueFromByteArray(bArrays.Content, "ccdCylinderTestDeviceNum1", (i * 8) * 2); // 柱面检测设备号1 D6680 659 ccdCylinderTestDeviceNum2 = GetValueFromByteArray(bArrays.Content, "ccdCylinderTestDeviceNum2", (i * 8) * 2); // 柱面检测设备号2 D6682 661 ccdCylinderTestDeviceNum3 = GetValueFromByteArray(bArrays.Content, "ccdCylinderTestDeviceNum3", (i * 8) * 2); // 柱面检测设备号3 D6684 663 //ccdPosFaceTestResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdPosFaceTestResult", (i * 2)));// 正极端面检测结果 D6728 707 //ccdNegFaceTestResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegFaceTestResult", (i * 2)));// 负极端面检测结果 D6736 715 //ccdBeforeCoatedCylinderTestResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdBeforeCoatedCylinderTestResult", (i * 2)));// 包膜前圆柱面检测结果 D6744 723 //ccdPosCylinderTestResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdPosCylinderTestResult", (i * 2)));// 正极柱检测结果 D6752 731 //ccdNegCylinderTestResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegCylinderTestResult", (i * 2)));// 负极柱检测结果 D6760 739 ccdNegativeTerminalWeldingZone2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionResult", (i * 2))); // 负极焊接区2D检测结果 ccdNegativeTerminalWeldingZone2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionNGReasons", (i * 2))); // 负极焊接区2D检测NG原因 ccdNegativeTerminalWeldingZone2DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionNGReasons1", (i * 2))); // 负极焊接区2D检测NG原因 ccdNegativeTerminalWeldingZone2DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone2DInspectionNGReasons2", (i * 2))); // 负极焊接区2D检测NG原因 ccdCoverPlate2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionResult", (i * 2))); // 盖板2D检测结果 ccdCoverPlate2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons", (i * 2))); // 盖板2D检测NG原因 ccdCoverPlate2DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons1", (i * 2))); // 盖板2D检测NG原因 ccdCoverPlate2DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons2", (i * 2))); // 盖板2D检测NG原因 ccdCoverPlate2DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate2DInspectionNGReasons3", (i * 2))); // 盖板2D检测NG原因 ccdNegativeTerminalWeldingZone25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionResult", (i * 2))); // 负极焊接区2.5D检测结果 ccdNegativeTerminalWeldingZone25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionNGReasons", (i * 2))); // 负极焊接区2.5D检测NG原因 ccdNegativeTerminalWeldingZone25DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionNGReasons1", (i * 2))); // 负极焊接区2.5D检测NG原因 ccdNegativeTerminalWeldingZone25DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminalWeldingZone25DInspectionNGReasons2", (i * 2))); // 负极焊接区2.5D检测NG原因 ccdCoverPlate25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionResult", (i * 2))); // 盖板2.5D检测结果 ccdCoverPlate25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionNGReasons", (i * 2))); // 盖板2.5D检测NG原因 ccdCoverPlate25DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionNGReasons1", (i * 2))); // 盖板2.5D检测NG原因 ccdCoverPlate25DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCoverPlate25DInspectionNGReasons2", (i * 2))); // 盖板2.5D检测NG原因 ccdTerminalPost2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionResult", (i * 2))); // 极柱2D检测结果 ccdTerminalPost2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost2DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons1", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost2DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons2", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost2DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost2DInspectionNGReasons3", (i * 2))); // 极柱2D检测NG原因 ccdTerminalPost3DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionResult", (i * 2))); // 极柱3D检测结果 ccdTerminalPost3DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons", (i * 2))); // 极柱3D检测NG原因 ccdTerminalPost3DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons1", (i * 2))); // 极柱3D检测NG原因 ccdTerminalPost3DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons2", (i * 2))); // 极柱3D检测NG原因 ccdTerminalPost3DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTerminalPost3DInspectionNGReasons3", (i * 2))); // 极柱3D检测NG原因 ccdSealingNail2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail2DInspectionResult", (i * 2))); // 密封钉2D检测结果 ccdSealingNail2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail2DInspectionNGReasons", (i * 2))); // 密封钉2D检测NG原因 ccdSealingNail3DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail3DInspectionResult", (i * 2))); // 密封钉3D检测结果 ccdSealingNail3DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdSealingNail3DInspectionNGReasons", (i * 2))); // 密封钉3D检测NG原因 ccdTopFillet25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTopFillet25DInspectionResult", (i * 2))); // 上部R角2.5D检测结果 ccdTopFillet25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdTopFillet25DInspectionNGReasons", (i * 2))); // 上部R角2.5D检测NG原因 ccdBottomFillet25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdBottomFillet25DInspectionResult", (i * 2))); // 底部R角2.5D检测结果 ccdBottomFillet25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdBottomFillet25DInspectionNGReasons", (i * 2))); // 底部R角2.5D检测NG原因 ccdCylindricalSurface25DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionResult", (i * 2))); // 柱面2.5D检测结果 ccdCylindricalSurface25DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface25DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons1", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface25DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons2", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface25DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface25DInspectionNGReasons3", (i * 2))); // 柱面2.5D检测NG原因 ccdCylindricalSurface3DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionResult", (i * 2))); // 柱面3D检测结果 ccdCylindricalSurface3DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons", (i * 2))); // 柱面3D检测NG原因 ccdCylindricalSurface3DInspectionNGReasons1 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons1", (i * 2))); // 柱面3D检测NG原因 ccdCylindricalSurface3DInspectionNGReasons2 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons2", (i * 2))); // 柱面3D检测NG原因 ccdCylindricalSurface3DInspectionNGReasons3 = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdCylindricalSurface3DInspectionNGReasons3", (i * 2))); // 柱面3D检测NG原因 ccdPositiveTerminaJYQ2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdPositiveTerminaJYQ2DInspectionResult", (i * 2))); // 正极绝缘圈2D检测结果 ccdPositiveTerminaJYQ2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdPositiveTerminaJYQ2DInspectionNGReasons", (i * 2))); // 正极绝缘圈2D检测NG原因(变形) ccdNegativeTerminaJYQ2DInspectionResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminaJYQ2DInspectionResult", (i * 2))); // 负极绝缘圈2D检测结果 ccdNegativeTerminaJYQ2DInspectionNGReasons = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdNegativeTerminaJYQ2DInspectionNGReasons", (i * 2))); // 负极绝缘圈2D检测NG原因(变形) ccdTestResult[0] = ccdNegativeTerminalWeldingZone2DInspectionResult; // 负极焊接区2D检测结果 ccdTestResult[1] = ccdCoverPlate2DInspectionResult; // 盖板2D检测结果 ccdTestResult[2] = ccdNegativeTerminalWeldingZone25DInspectionResult;// 负极焊接区2.5D检测结果 ccdTestResult[3] = ccdCoverPlate25DInspectionResult; // 盖板2.5D检测结果 ccdTestResult[4] = ccdTerminalPost2DInspectionResult; // 极柱2D检测结果 ccdTestResult[5] = ccdTerminalPost3DInspectionResult; // 极柱3D检测结果 ccdTestResult[6] = ccdSealingNail2DInspectionResult; // 密封钉2D检测结果 ccdTestResult[7] = ccdSealingNail3DInspectionResult; // 密封钉3D检测结果 ccdTestResult[8] = ccdTopFillet25DInspectionResult; // 上部R角2.5D检测结果 ccdTestResult[9] = ccdBottomFillet25DInspectionResult; // 底部R角2.5D检测结果 ccdTestResult[10] = ccdCylindricalSurface25DInspectionResult; // 柱面2.5D检测结果 ccdTestResult[11] = ccdCylindricalSurface3DInspectionResult; // 柱面3D检测结果 //string resultPLC = GetValueFromByteArray(bArrays.Content, "result", (i * 2));// 总结果 D4768 747 result = int.Parse(GetValueFromByteArray(bArrays.Content, "result", (i * 2))) == 1 ? "OK" : "NG"; string strErr = ""; short a = (short)GetResult(ccdTestResult, ref strErr); info = strErr; //result = a == 12 ? "OK" : "NG"; LogHelper.Instance.WriteError($"B出站总结果:result:" + result + ", info:" + info, "电芯出站B"); lst_RFIDCodes = "";//StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 39, Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); // RFID D3200-3219 lst_BarCodes = listCode[i]; listFutou[i] = 0; // todo add 20260425 #endregion #region 数据保存 BGearEntity m = new BGearEntity { ChannelNo = (i + 1).ToString(), TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), RFID = lst_RFIDCodes, BarCode = lst_BarCodes, WindSpeed = windSpeed, WindDeviceNum = "B", CCDFaceTestDeviceNum1 = "B", CCDFaceTestDeviceNum2 = "B", CCDFaceTestDeviceNum3 = "B", CCDFaceTestDeviceNum4 = "B", CCDCylinderTestDeviceNum1 = "B", CCDCylinderTestDeviceNum2 = "B", CCDCylinderTestDeviceNum3 = "B", CCDNegativeTerminalWeldingZone2DInspectionResult = ccdNegativeTerminalWeldingZone2DInspectionResult == 1 ? "OK" : "NG", CCDNegativeTerminalWeldingZone2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdNegativeTerminalWeldingZone2DInspectionNGReasons, "UI20801"), GetNGReasons(ccdNegativeTerminalWeldingZone2DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdNegativeTerminalWeldingZone2DInspectionNGReasons2, "UI127")), CCDCoverPlate2DInspectionResult = ccdCoverPlate2DInspectionResult == 1 ? "OK" : "NG", CCDCoverPlate2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCoverPlate2DInspectionNGReasons, "UI20801"), GetNGReasons(ccdCoverPlate2DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCoverPlate2DInspectionNGReasons2, "UI127"), GetNGReasons(ccdCoverPlate2DInspectionNGReasons3, "UI298")), CCDNegativeTerminalWeldingZone25DInspectionResult = ccdNegativeTerminalWeldingZone25DInspectionResult == 1 ? "OK" : "NG", CCDNegativeTerminalWeldingZone25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdNegativeTerminalWeldingZone25DInspectionNGReasons, "UI20801"), GetNGReasons(ccdNegativeTerminalWeldingZone25DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdNegativeTerminalWeldingZone25DInspectionNGReasons2, "UI127")), CCDCoverPlate25DInspectionResult = ccdCoverPlate25DInspectionResult == 1 ? "OK" : "NG", CCDCoverPlate25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCoverPlate25DInspectionNGReasons, "UI20801"), GetNGReasons(ccdCoverPlate25DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCoverPlate25DInspectionNGReasons2, "UI127")), CCDTerminalPost2DInspectionResult = ccdTerminalPost2DInspectionResult == 1 ? "OK" : "NG", CCDTerminalPost2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCoverPlate25DInspectionNGReasons, "UI20801"), GetNGReasons(ccdTerminalPost2DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdTerminalPost2DInspectionNGReasons2, "UI127"), GetNGReasons(ccdTerminalPost2DInspectionNGReasons3, "UI125")), CCDTerminalPost3DInspectionResult = ccdTerminalPost3DInspectionResult == 1 ? "OK" : "NG", CCDTerminalPost3DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdTerminalPost3DInspectionNGReasons, "UI20801"), GetNGReasons(ccdTerminalPost3DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdTerminalPost3DInspectionNGReasons2, "UI127"), GetNGReasons(ccdTerminalPost3DInspectionNGReasons3, "UI125")), CCDSealingNail2DInspectionResult = ccdSealingNail2DInspectionResult == 1 ? "OK" : "NG", CCDSealingNail2DInspectionNGReasons = "", CCDSealingNail3DInspectionResult = ccdSealingNail3DInspectionResult == 1 ? "OK" : "NG", CCDSealingNail3DInspectionNGReasons = "", CCDTopFillet25DInspectionResult = ccdTopFillet25DInspectionResult == 1 ? "OK" : "NG", CCDTopFillet25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdTopFillet25DInspectionNGReasons, "UI127")), CCDBottomFillet25DInspectionResult = ccdBottomFillet25DInspectionResult == 1 ? "OK" : "NG", CCDBottomFillet25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdBottomFillet25DInspectionNGReasons, "UI127")), CCDCylindricalSurface25DInspectionResult = ccdCylindricalSurface25DInspectionResult == 1 ? "OK" : "NG", CCDCylindricalSurface25DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons, "UI128"), GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons2, "UI127"), GetNGReasons(ccdCylindricalSurface25DInspectionNGReasons3, "UI00404")), CCDCylindricalSurface3DInspectionResult = ccdCylindricalSurface3DInspectionResult == 1 ? "OK" : "NG", CCDCylindricalSurface3DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons, "UI128"), GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons1, "UI21301"), GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons2, "UI127"), GetNGReasons(ccdCylindricalSurface3DInspectionNGReasons3, "UI00404")), CCDPositiveTerminaJYQ2DInspectionResult = ccdPositiveTerminaJYQ2DInspectionResult == 1 ? "OK" : "NG", CCDPositiveTerminaJYQ2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdPositiveTerminaJYQ2DInspectionNGReasons, "UI15301")), CCDNegativeTerminaJYQ2DInspectionResult = ccdNegativeTerminaJYQ2DInspectionResult == 1 ? "OK" : "NG", CCDNegativeTerminaJYQ2DInspectionNGReasons = CombineNGReasons (GetNGReasons(ccdNegativeTerminaJYQ2DInspectionNGReasons, "UI15302")), Flag = "0", Flag1 = "2", Result = result, Info = info, MaterialCode = CommonMethods.mesConfig.MaterialCode, Futou = listFutou[i], }; m2 = m; #endregion } else { CommonMethods.AddDataMonitorLog(0, "出站下料工位B有料标志为0".Translated() + "通道号".Translated() + $":{i}"); } list.Add(m2); } swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站B】数据解析耗时: {swSegment.ElapsedMilliseconds}ms, 解析条数: {list.Count}", "B出站性能"); #endregion #region 数据上传MES if (list.Count > 0 && CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { swSegment.Restart(); var tempMesMessages = new List(); var tempMesResTypes = new List(); var tempFlags = new List(); foreach (var item in list) { // 创建单个电池的列表 var singleBatteryList = new List { item }; // 调用MES接口(每次只传一个电池) var (success, mesage, mesResType) = await CommonMethods.hbgMes.ManyCellOutStationAsync( CommonMethods.mesConfig.ProductOutStation, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.ModelName, CommonMethods.mesConfig.mesUserName, singleBatteryList, 1, CommonMethods.mesConfig.materialLotCodeLocator); if (success) { // 收集成功结果 tempMesMessages.AddRange(mesage); tempMesResTypes.AddRange(mesResType); tempFlags.Add("1"); } else { // 收集失败结果 tempMesMessages.AddRange(mesage); tempMesResTypes.AddRange(mesResType); tempFlags.Add("2"); // 记录失败状态 listRes = GetList(8, 3); listRemark = GetList(8, ""); if (mesage.Count > 0 && mesage[0].Contains("一个或多个错误")) { CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); // 反馈PLC结果 } } } // 将收集的结果赋给主列表 listMesMesage = tempMesMessages; listMesResType = tempMesResTypes; listFlag = tempFlags; swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站B】MES上传总耗时: {swSegment.ElapsedMilliseconds}ms", "B出站性能"); } else { LogHelper.Instance.WriteLog($"【出站B】MES未连接或未开启, MesModeSwitching={CommonMethods.sysConfig.MesModeSwitching}, isConnected={CommonMethods.mesConfig.isConnected}, 时间={DateTime.Now:HH:mm:ss.fff}", "B出站"); listRes = GetList(8, 3); listRemark = GetList(8, "MES断连".Translated() + ","); listFlag = GetList(8, "2"); CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short);//反馈MES结果 } #endregion #region 上传产品结果参数 if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { swSegment.Restart(); _ = Task.Run(async () => { try { await UpProducResultParamAsync(list); } catch (Exception ex) { LogHelper.Instance.WriteError($"【出站B】UpProducResultParamAsync: {ex.Message}", "SysErrorLog"); } }); swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站B】产品结果参数上传耗时: {swSegment.ElapsedMilliseconds}ms", "B出站性能"); } #endregion #region 数据组合 LogHelper.Instance.WriteLog($"【出站B】开始数据组合, list.Count={list.Count}, listMesResType.Count={listMesResType.Count}, 时间={DateTime.Now:HH:mm:ss.fff}", "B出站"); for (int i = 0; i < list.Count; i++) { if (String.IsNullOrEmpty(list[i].BarCode) || list[i].BarCode.Trim() == "ERROR" || !IsAlphaNumeric(list[i].BarCode)) { listRes[i] = 2; listResult[i] = "NG"; list[i].Info = "电芯码不良".Translated(); listFlag[i] = "2"; } else { //string strErr = ""; //short a = (short)GetResult(ccdTestResult, ref strErr); //listResult[i] = a == 12 ? "OK" : "NG"; listResult[i] = list[i].Result; //list[i].Info = strErr; // 本地判断OK,MES判断OK if (listResult[i] == "OK" && listMesResType[i] == MesResType.D) { listResult[i] += ",MES OK"; listFlag[i] = "1"; list[i].Info = "良品".Translated(); listRes[i] = 1; } // 本地判断OK,MES判断NG else if (listResult[i] == "OK" && listMesResType[i] != MesResType.D) { listRes[i] = 1; //listMesResType 默认值 是B if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { switch (listMesResType[i]) { case MesResType.A: // 停线,设备报警停机 listResult[i] += ",MES NG"; listRemark[i] += $"A,{listMesMesage[i]}"; listRes[i] = 3;//10 listFlag[i] = "2"; break; case MesResType.B: // MES不良 listResult[i] += ",MES NG"; listRemark[i] += $"B,{listMesMesage[i]}"; listRes[i] = 3;//9 listFlag[i] = "2"; break; case MesResType.C: // 警示 listResult[i] += ",MES OK"; // MES认为是可以当成良品流下去的 listRemark[i] += $"Alarm:{listMesMesage[i]}"; listRes[i] = 1; listFlag[i] = "1"; break; case MesResType.D: // 条码上传OK listResult[i] += ",MES OK"; listRemark[i] += $"D,{listMesMesage[i]}"; listRes[i] = 1; listFlag[i] = "1"; break; default: listResult[i] += ",MES NG"; listRemark[i] += $"{listMesMesage[i]}"; listRes[i] = 3;//9 listFlag[i] = "2"; break; } } } // 本地判断NG,MES判断OK else if (listResult[i] == "NG" && listMesResType[i] == MesResType.D) { listResult[i] += ",MES OK"; listRemark[i] += $"D,{listMesMesage[i]}"; listRes[i] = 1; listFlag[i] = "1"; } // 本地判断NG,MES判断NG listMesResType 默认值是B else if (listResult[i] == "NG" && listMesResType[i] != MesResType.D) { //if 1 //futou >=1 //开了 mes =mesng =3 // 没开么事 = ng =3 //else 需要复投 // =4 CCD NG if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { listResult[i] += ",MES NG"; listRemark[i] += $"{listMesResType[i].ToString()},{listMesMesage[i]}"; listRes[i] = 3;//9 listFlag[i] = "2"; } else { listRes[i] = 4;//CCD NG } } // 其他情况 else { if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { listResult[i] += ",MES NG"; listRemark[i] += listMesMesage[i]; listRes[i] = 3;//9 listFlag[i] = "2"; } else { listRes[i] = 4;//CCD NG } } } list[i].Result = listResult[i].TrimStart(',').TrimEnd(','); list[i].Remark = listRemark[i].TrimStart(',').TrimEnd(','); list[i].Flag = listFlag[i]; } #endregion #region 数据保存&上传 var listBGearEntity = new List(); for (int i = 0; i < listMark.Count; i++) { if (listMark[i]) { listBGearEntity.Add(list[i]); } } swSegment.Restart(); _ = Task.Run(async () => { try { await SaveBlankingDataAsync(listBGearEntity); } catch (Exception ex) { LogHelper.Instance.WriteError($"【出站B】SaveBlankingDataAsync: {ex.Message}", "SysErrorLog"); } }); swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站B】数据存储耗时: {swSegment.ElapsedMilliseconds}ms", "B出站性能"); swSegment.Restart(); if (pf.IsFeedbackPlc) { //写入·结果反馈 JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[1].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort); if (result1 != null) { string strres = "出站B工位发送给PLC".Translated() + $",[{pf.VarList[1].VarAddress}]:{string.Join(",", listRes)}"; CommonMethods.AddDataMonitorLog(0, strres); LogHelper.Instance.WriteLog($"出站B工位发送给PLC:{string.Join(",", listCode)}======{string.Join(",", listRes)}", "B出站"); } } CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0); // 置位0 swSegment.Stop(); LogHelper.Instance.WriteLog($"【出站B】PLC反馈耗时: {swSegment.ElapsedMilliseconds}ms", "B出站性能"); #endregion } catch (Exception ex) { CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, (short)0); LogHelper.Instance.WriteLog($"出站B工位异常,触发地址置位0", "B出站"); LogHelper.Instance.WriteError($"电芯出站B线程数据处理:{ex}", "SysErrorLog"); } swTotal.Stop(); // 输出上料数据处理耗时: CommonMethods.AddDataMonitorLog(0, "电芯出站B共耗时".Translated() + $":{swTotal.ElapsedMilliseconds}ms"); LogHelper.Instance.WriteLog($"【出站B】总耗时: {swTotal.ElapsedMilliseconds}ms", "B出站性能"); } } #region 保存下料数据 /// /// 保存下料数据到数据 /// /// private async Task SaveBlankingDataAsync(List list) { LogHelper.Instance.WriteError($"SaveBlankingData-enter", "A出站"); //数据的保存 try { if (list != null && list.Count > 0) { //数据显示 bool b = await CommonMethods.db.AddReturnBoolAsync(list); //数据显示 CommonMethods.ShowBlankingDelegate.Invoke(list); //数据保存本地 //string strData = string.Empty;//数据字符串,本地保存 //foreach (BGearEntity m in list) //{ // string strData = string.Empty; // foreach (var item in m.GetType().GetProperties()) // { // strData += item.GetValue(m).ToString() + ","; // } // strData = strData.TrimEnd(','); // BlankingDataSaveLocal(strData); //} var lines = list.Select(m => { var values = m.GetType().GetProperties() .Select(p => p.GetValue(m)?.ToString() ?? ""); return string.Join(",", values); }).ToList(); // 批量写本地文件 await Task.Run(() => BlankingDataSaveLocalBatch(lines)); } else { LogHelper.Instance.WriteError($"电芯出站数据List为空", "SysErrorLog"); } } catch (Exception ex) { LogHelper.Instance.WriteError($"电芯出站数据保存异常A:{ex}", "SysErrorLog"); } LogHelper.Instance.WriteError($"SaveBlankingData-end", "A出站"); } private async Task SaveReInData(List list) { try { if (list != null && list.Count > 0) { bool b = await CommonMethods.db.AddReturnBoolAsync(list); } } catch (Exception ex) { LogHelper.Instance.WriteError($"电芯复投数据保存异常:{ex}", "SysErrorLog"); } } #endregion /// /// 电池结果判断 /// /// private ushort GetResult(int[] res, ref string strErr) { strErr = ""; int resNum = 0; for (int i = 0; i < res.Length; i++) { if (i == 0) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "负极焊接区2D检测结果不良".Translated() + ","; resNum = resNum + 2; break; default: strErr += "负极焊接区2D检测结果未知".Translated() + ","; resNum = resNum + 4; break; } } else if (i == 1) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "盖板2D检测结果不良".Translated() + ","; resNum = resNum + 2; break; default: strErr += "盖板2D检测结果未知".Translated() + ","; resNum = resNum + 4; break; } } else if (i == 2) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "负极焊接区2.5D检测结果不良".Translated() + ","; resNum = resNum + 2; break; default: strErr += "负极焊接区2.5D检测结果未知".Translated() + ","; resNum = resNum + 4; break; } } else if (i == 3) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "盖板2.5D检测结果不良".Translated() + ","; resNum = resNum + 2; break; default: strErr += "盖板2.5D检测结果未知".Translated() + ","; resNum = resNum + 4; break; } } else if (i == 4) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "极柱2D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "极柱2D检测结果未知".Translated(); resNum = resNum + 4; break; } } else if (i == 5) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "极柱3D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "极柱3D检测结果未知".Translated(); resNum = resNum + 4; break; } } else if (i == 6) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "密封钉2D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "密封钉2D检测结果未知".Translated(); resNum = resNum + 4; break; } } else if (i == 7) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "密封钉3D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "密封钉3D检测结果未知".Translated(); resNum = resNum + 4; break; } } else if (i == 8) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "上部R角2.5D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "上部R角2.5D检测结果未知".Translated(); resNum = resNum + 4; break; } } else if (i == 9) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "底部R角2.5D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "底部R角2.5D检测结果未知".Translated(); resNum = resNum + 4; break; } } else if (i == 10) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "柱面2.5D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "柱面2.5D检测结果未知".Translated(); resNum = resNum + 4; break; } } else if (i == 11) { switch (res[i]) { case 1: strErr += ""; resNum++; break; case 2: strErr += "柱面3D检测结果不良".Translated(); resNum = resNum + 2; break; default: strErr += "柱面3D检测结果未知".Translated(); resNum = resNum + 4; break; } } } strErr = strErr.TrimEnd(','); return (ushort)resNum; } #endregion #region 结果数据上传 /// /// 结果数据上传 /// /// private async Task UpProducResultParamAsync(List listBger) { try { var swTotal = Stopwatch.StartNew(); LogHelper.Instance.WriteLog($"UpProducResultParam-enter", "A出站"); if (listBger != null && listBger.Count > 0) { foreach (BGearEntity m in listBger) { if (m.BarCode != "NG" && m.BarCode != "ERROR" && m.BarCode != "") { var sw2 = Stopwatch.StartNew(); string dateStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var (success, message) = await CommonMethods.hbgMes.ProducResultParamAsync(CommonMethods.mesConfig.ProductResultParams, CommonMethods.mesConfig.siteCode, CommonMethods.mesConfig.lineCode, CommonMethods.mesConfig.equipNum, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.mesUserName, m, MesUploadType.DD, dateStr); sw2.Stop(); LogHelper.Instance.WriteLog($"ProducResultParamAsync m.BarCode={m.BarCode} 耗时{sw2.ElapsedMilliseconds}ms"); if (!success) { LogHelper.Instance.WriteError($"条码: {m.BarCode}, 结果数据上传失败, {message}", "系统报错"); } else { m.Flag1 = "1"; var sw = Stopwatch.StartNew(); int a = await CommonMethods.db.UpdateSingleAsync(m, it => new BGearEntity() { Flag1 = m.Flag1 }, it => it.BarCode == m.BarCode); sw.Stop(); LogHelper.Instance.WriteLog($"UpdateSingleAsync Flag1 耗时{sw.ElapsedMilliseconds}ms"); } } } } swTotal.Stop(); LogHelper.Instance.WriteLog($"UpProducResultParamAsync 总 耗时{swTotal.ElapsedMilliseconds}ms"); } catch (Exception ex) { LogHelper.Instance.WriteError($"结果数据上传失败, 原因: {ex}", "系统报错"); //throw new Exception(ex.ToString()); } LogHelper.Instance.WriteError($"UpProducResultParam-end", "A出站"); } #endregion #region 判断CCD结果 private bool GetCcdResult(BGearEntity m) { if (m.CCDNegativeTerminalWeldingZone2DInspectionResult.Contains("NG") || m.CCDNegativeTerminalWeldingZone25DInspectionResult.Contains("NG") || m.CCDCoverPlate2DInspectionResult.Contains("NG") || m.CCDCoverPlate25DInspectionResult.Contains("NG") || m.CCDTerminalPost2DInspectionResult.Contains("NG") || m.CCDTerminalPost3DInspectionResult.Contains("NG") || m.CCDSealingNail2DInspectionResult.Contains("NG") || m.CCDSealingNail3DInspectionResult.Contains("NG") || m.CCDTopFillet25DInspectionResult.Contains("NG") || m.CCDBottomFillet25DInspectionResult.Contains("NG") || m.CCDCylindricalSurface25DInspectionResult.Contains("NG") || m.CCDCylindricalSurface3DInspectionResult.Contains("NG")) { return false; } return true; } #endregion #region 数据组合 private bool GetDataCombine(BGearEntity m, MesResType mesResType, string mesMesage, ref short res, ref string result, ref string remark, ref string flag) { #region 数据组合 if (String.IsNullOrEmpty(m.BarCode) || m.BarCode.Trim() == "ERROR" || !IsAlphaNumeric(m.BarCode)) { res = 2; result = "NG"; m.Info = "电芯码不良".Translated(); flag = "2"; } else { // 本地判断OK,MES判断OK if (result == "OK" && mesResType == MesResType.D) { result += ",MES OK"; m.Info = "良品".Translated(); res = 1; flag = "1"; } // 本地判断OK,MES判断NG else if (result == "OK" && mesResType != MesResType.D) { switch (mesResType) { case MesResType.A: // 停线,设备报警停机 result += ",MES NG"; remark += $"A,{mesMesage}"; res = 3;//10 flag = "2"; break; case MesResType.B: // MES不良 result += ",MES NG"; remark += $"B,{mesMesage}"; res = 3;//9 flag = "2"; break; case MesResType.C: // 警示 result += ",MES OK"; // MES认为是可以当成良品流下去的 remark += $"Alarm:{mesMesage}"; res = 1; flag = "1"; break; case MesResType.D: // 条码上传OK result += ",MES OK"; remark += $"D,{mesMesage}"; res = 1; flag = "1"; break; default: result += ",MES NG"; remark += $"{mesMesage}"; res = 3;//9 flag = "2"; break; } } // 本地判断NG,MES判断OK else if (result == "NG" && mesResType == MesResType.D) { result += ",MES OK"; remark += $"D,{mesMesage}"; res = 1; flag = "1"; } // 本地判断NG,MES判断NG else if (result == "NG" && mesResType != MesResType.D) { result += ",MES NG"; remark += $"{mesResType.ToString()},{mesMesage}"; res = 3;//9 flag = "2"; } // 其他情况 else { result += ",MES NG"; remark += mesMesage; res = 3;//9 flag = "2"; } } #endregion return true; } #endregion #region 结构件料盘工位(数据处理) /// /// 结构件料盘工位 /// /// /// /// private async Task MaterialStation(JYResult bArrays, object plcModel) { PlcGroup pf = plcModel as PlcGroup; var sw = new Stopwatch(); if (bArrays.IsSuccess && bArrays.Content != null) { sw.Restart(); #region 初始化数据 List list = new List();//实体 List listMaterialCode = GetList(1, "");//料盘码 List listRes = GetList(1, 1);//默认为1,良品 #endregion #region 数据解析 byte[] bytes = bArrays.Content.ByteReverse(); for (int i = 0; i < listMaterialCode.Count; i++) { listMaterialCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, i * 40, 39, System.Text.Encoding.ASCII). Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); } #endregion for (int i = 0; i < listMaterialCode.Count; i++) { DGearEntity m = new DGearEntity(); try { switch (pf.GroupName) { case "结构件料盘B": m.ChannelNo = 1; break; case "结构件料盘D": m.ChannelNo = 2; break; } m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); m.MaterialCode = listMaterialCode[i]; m.MaterialCodes = CommonMethods.mesConfig.MaterialCode; m.EquipNum = CommonMethods.mesConfig.equipNum; m.Flag = 0; if (String.IsNullOrEmpty(m.MaterialCode) || m.MaterialCode.Trim() == "ERROR" || m.MaterialCode.Trim() == "NG") { m.MaterialCode = "NG"; m.Result = "NG"; m.Remark = "料盘码不良"; listRes[i] = 2; } else { m.Result = "OK"; m.Remark = "良品"; #region MES对接 if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected) { var (mesRes, Mesage, mesResType) = await CommonMethods.hbgMes.RawMaterialStationAsync(CommonMethods.mesConfig.MaterialInputInfo, CommonMethods.mesConfig.MaterialCode, CommonMethods.mesConfig.equipNum, m.MaterialCode); if (mesRes) //调用接口成功 { m.Flag = 1; //本地判断OK,MES判断OK if (m.Result == "OK" && mesResType == MesResType.D) { m.Result = "OK"; m.Remark = m.Remark + Mesage; listRes[i] = 1; } //本地判断OK,MES判断NG else if (m.Result == "OK" && mesResType != MesResType.D) { switch (mesResType) { case MesResType.B: m.Result = "MES NG"; m.Remark = $"{Mesage}"; listRes[i] = 9; break; default: m.Result = "MES NG"; m.Remark = $"{Mesage}"; listRes[i] = 9; break; } } //其他情况 else { m.Result = " MES NG"; m.Remark = Mesage; listRes[i] = 9; } } else { m.Result = " MES NG"; m.Remark = Mesage; listRes[i] = 9; if (Mesage.Contains("接口调用失败")) { listRes[i] = 10; CommonMethods.AddLog(false, $"原材料上传失败,请联系IT人员检查MES网络或服务器"); LogHelper.Instance.WriteLog($"原材料上传失败,请联系IT人员检查MES网络或服务器", "SysErrorLog"); } } } #endregion } list.Add(m); } catch (Exception ex) { LogHelper.Instance.WriteError($"结构件料盘线程数据解析:{ex}", "系统报错"); } } JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[2].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC JYResult result3 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[0].VarAddress, 0);//置位 //数据存储 -异步处理 await SaveMaterialData(list); sw.Stop(); ////输出上料数据处理耗时: CommonMethods.AddDataMonitorLog(0, $"结构件料盘线程共耗时:{sw.ElapsedMilliseconds}ms"); } } /// /// 结构件料盘保存 /// /// private Task SaveMaterialData(List list) { //数据的保存 try { if (list != null && list.Count > 0) { string strRes = ""; foreach (DGearEntity m in list) { if (m.MaterialCode != "NG") { //bool b1 = await CommonMethods.db.AddReturnBoolAsync(m); //strRes = b1 ? ",本存Yes" : ",本存No"; } else { strRes = ",不存储"; } m.Remark = m.Remark + strRes; } //数据显示 CommonMethods.ShowMaterialDelegate.Invoke(list); } else { LogHelper.Instance.WriteError($"结构件料盘数据List为空", "SysErrorLog"); } } catch (Exception ex) { LogHelper.Instance.WriteError($"结构件料盘保存处理异常:{ex}", "SysErrorLog"); } return Task.CompletedTask; } #endregion #region 创建空的数组List public List GetList(int num, T data) { List list = new List(); for (int i = 0; i < num; i++) { list.Add(data); } return list; } public List GetMesType(int Num) { List mesResTypes = new List(); for (int i = 0; i < Num; i++) { mesResTypes.Add(MesResType.UnKnow); } return mesResTypes; } /// /// PLC内批量写\0 /// /// /// public string GetString_0(int Num) { string ff = ""; for (int i = 0; i < Num; i++) { ff = ff.Insert(ff.Length, "\0"); } return ff; } public string GetBarCodeNum(int Num) { string CodeNo = ""; int CodeLenth = Num.ToString().Length; switch (CodeLenth) { case 1: return CodeNo = $"00000{Num}"; case 2: return CodeNo = $"0000{Num}"; case 3: return CodeNo = $"000{Num}"; case 4: return CodeNo = $"00{Num}"; case 5: return CodeNo = $"0{Num}"; default: return CodeNo = $"{Num}"; } } #endregion /// /// 检测数据是否只包含字母加数字 /// /// /// public bool IsAlphaNumeric(string input) { // 使用正则表达式检查是否只包含字母和数字 return Regex.IsMatch(input, "^[a-zA-Z0-9]+$"); } #region 方法 /// /// 下料数据保存本地 /// /// private void BlankingDataSaveLocal(string strData) { #region string savePath = string.Format(@"{0}\{1}\{2}\{3}\", @"D:\LocalData", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); bool acquiredLock = false; Monitor.TryEnter(FileLock, ref acquiredLock); if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } try { if (acquiredLock) { string strFileName = System.DateTime.Now.ToString("yyyyMMdd") + ".csv";//yyyyMMdd.csv if (!File.Exists(savePath + strFileName)) //如果文件不存在,创建文件,并保存到本地 { string strProlnfoFileHead = string.Empty; foreach (var item in CommonMethods.m_DBCtrl.HeaderTextOut) { strProlnfoFileHead += item + ","; } strProlnfoFileHead = strProlnfoFileHead.TrimEnd(','); strProlnfoFileHead = strProlnfoFileHead.Substring(strProlnfoFileHead.IndexOf(',') + 1); StreamWriter sw = new StreamWriter(savePath + strFileName, true, Encoding.GetEncoding("GB2312")); sw.WriteLine(strProlnfoFileHead); sw.WriteLine(strData); sw.Flush(); sw.Close(); sw.Dispose(); } else { StreamWriter sw = new StreamWriter(savePath + strFileName, true, Encoding.GetEncoding("GB2312")); sw.WriteLine(strData); sw.Flush(); sw.Close(); sw.Dispose(); } Monitor.Exit(FileLock); } } catch (Exception ex) { LogHelper.Instance.WriteError($"下料数据保存异常:{ex}", "SysErrorLog"); if (acquiredLock) { Monitor.Exit(FileLock); } } #endregion } /// /// 批量保存本地数据 /// private void BlankingDataSaveLocalBatch(List lines) { if (lines == null || lines.Count == 0) return; string savePath = string.Format(@"{0}\{1}\{2}\{3}\", @"D:\LocalData", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); string strFileName = DateTime.Now.ToString("yyyyMMdd") + ".csv"; if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath); string fullPath = Path.Combine(savePath, strFileName); lock (FileLock) { bool isNewFile = !File.Exists(fullPath); using (var sw = new StreamWriter(fullPath, true, Encoding.GetEncoding("GB2312"))) { if (isNewFile) { // 写入表头 var header = string.Join(",", CommonMethods.m_DBCtrl.HeaderTextOut); header = header.Substring(header.IndexOf(',') + 1); sw.WriteLine(header); } foreach (var line in lines) { sw.WriteLine(line); } } } } #endregion /// /// 电池结果辅助方法 /// /// private string GetNGReasons(int value, string reasonCode) { // 只有当值为2时才返回原因代码,否则返回空字符串 return value == 2 ? reasonCode : string.Empty; } // 组合多个NG原因字段 private string CombineNGReasons(params string[] reasons) { // 过滤空值并连接 var validReasons = reasons .Where(r => !string.IsNullOrEmpty(r)) .Distinct(); // 去重 return string.Join(",", validReasons); } } }