Files
RollMarking/JinYuan.ControlCenter/ControlCenter_Plc.cs
T
2026-09-09 17:50:15 +08:00

2329 lines
112 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 SqlSugar.Extensions;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace JinYuan.ControlCenters
{
public partial class ControlCenter
{
public object FileLock = new object();//文件锁
#region 上料工位(数据处理)
/// <summary>
/// 上料工位A
/// </summary>
//上料解析
private async Task FeedingStationA(JYResult<byte[]> bArrays, object plcModel)
{
PlcGroup pf = plcModel as PlcGroup;
var sw = new Stopwatch();
var sw1 = new Stopwatch();
string logName = "A进站";
LogHelper.Instance.WriteLog($"[{logName}] 开始处理", logName);
if (bArrays.IsSuccess && bArrays.Content != null)
{
try
{
sw.Start();
LogHelper.Instance.WriteLog($"[{logName}] 数据有效, 数据长度:{bArrays.Content.Length}", logName);
#region 数据初始化
//解析数据
List<AGearEntity> list = new List<AGearEntity>();//实体
List<short> listRes = GetList<short>(8, 2);//默认为1,良品
List<bool> listMark = GetList<bool>(8, false);//有料标志
List<string> listCode = GetList<string>(8, "");//电芯码
List<string> listRemark = GetList<string>(8, "");//备注
List<string> listFlag = GetList<string>(8, "0");//是否上传标志
List<string> listResult = GetList<string>(8, "OK");//结果
List<string> listMesage = GetList<string>(8, "");//mesMesage
List<MesResType> listMesResType = GetList<MesResType>(8, MesResType.B);//mesType
#endregion
#region 数据解析
sw1.Start();
// 从D2021开始
byte[] bytes = bArrays.Content.ByteReverse();//高低位转换
int validCount = 0;
//有料标志
for (int i = 0; i < listMark.Count; i++)
{
listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2)) == 1 ? true : false;// 从D2021开始
if (listMark[i])
{
validCount++;
#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}");
}
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 解析完成, 耗时{sw1.ElapsedMilliseconds}ms, 有料数量:{validCount}, 条码:{string.Join(",", listCode.Where(x => !string.IsNullOrEmpty(x)))}", logName);
#endregion
#region 上传MES
sw1.Restart();
if (list.Count > 0)
{
if (CommonMethods.sysConfig.MesModeSwitching)
{
if (CommonMethods.mesConfig.isConnected)
{
LogHelper.Instance.WriteLog($"[{logName}] 开始上传MES, 数量:{list.Count}", logName);
var allMesMessages = new List<string>();
var allMesResTypes = new List<MesResType>();
var allFlags = new List<string>();
foreach (var item in list)
{
// 每次只上传一个条码(封装为List)
var singleCodeList = new List<string> { item.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 = GetList<short>(8, 3);
listRemark = GetList<string>(8, "");
if (mesage1.Count > 0 && mesage1[0].Contains("一个或多个错误"))
{
CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); // 反馈PLC结果
}
}
}
// 将收集的结果赋给主列表
listMesage = allMesMessages;
listMesResType = allMesResTypes;
listFlag = allFlags;
LogHelper.Instance.WriteLog($"[{logName}] MES上传完成, 成功:{allFlags.Count(x => x == "1")}, 失败:{allFlags.Count(x => x == "2")}", logName);
}
else
{
LogHelper.Instance.WriteLog($"[{logName}] MES断连", logName);
listRes = GetList<short>(8, 3);
listRemark = GetList<string>(8, "MES断连".Translated());
listFlag = GetList<string>(8, "2");
CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short);//反馈MES结果
}
}
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] MES上传耗时:{sw1.ElapsedMilliseconds}ms", logName);
#endregion
#region 数据组合
sw1.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();
listFlag[i] = "2";
}
else
{
int codeIndex = i;//listCode.Count - i - 1;
listResult[i] = "OK,";
listRemark[i] = "良品,".Translated();
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
listFlag[i] = "2";
break;
case MesResType.B:// 排出
listResult[i] += "MES NG";
listRemark[i] += listMesage[codeIndex];
listRes[i] = 3;//2
listFlag[i] = "2";
break;
case MesResType.C:// 警示
case MesResType.D:// 条码上传OK
listResult[i] += "MES OK";//MES认为是可以当成良品流下去的
listRemark[i] += listMesage[codeIndex];
listRes[i] = 1;
listFlag[i] = "1";
break;
default:
listResult[i] += "MES NG";
listRemark[i] += listMesage[codeIndex];
listRes[i] = 3;//2
listFlag[i] = "2";
break;
}
}
}
list[i].Result = listResult[i].TrimStart(',').TrimEnd(',');
list[i].Remark = listRemark[i].TrimStart(',').TrimEnd(',');
list[i].Flag = listFlag[i];
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 数据组合耗时:{sw1.ElapsedMilliseconds}ms", logName);
#endregion
#region 数据反馈&上传
sw1.Restart();
_ = Task.Run(async () =>
{
try
{
await SaveFeedingDataAsync(list);
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"{logName} SaveFeedingDataAsync 异常{ex.Message}", "SysErrorLog");
}
}
);
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 存储耗时:{sw1.ElapsedMilliseconds}ms", logName);
sw1.Restart();
JYResult result = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[1].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC
if (result != null)
{
string strres = "进站A工位发送给PLC".Translated() + $",[{pf.VarList[1].VarAddress}]:{string.Join(",", listRes)}";
CommonMethods.AddDataMonitorLog(0, strres);
LogHelper.Instance.WriteError($"logName 工位发送给PLC:{strres}", "SysErrorLog");
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 反馈PLC,耗时{sw1.ElapsedMilliseconds}ms, 结果:{string.Join(",", listRes)}", logName);
sw1.Restart();
bool writeResult = CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 清0耗时:{sw1.ElapsedMilliseconds}ms, 结果:{writeResult}", logName);
#endregion
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"[{logName}] 异常:{ex.Message}", "SysErrorLog");
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
}
sw.Stop();
long cost = sw.ElapsedMilliseconds;
LogHelper.Instance.WriteLog($"[{logName}] 总耗时: {cost}ms", logName);
CommonMethods.AddDataMonitorLog(0, "卷芯进站A共耗时".Translated() + $":{cost}ms");
}
else
{
LogHelper.Instance.WriteLog($"[{logName}] 数据无效", logName);
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
}
}
/// <summary>
/// 上料工位B
/// </summary>
//上料解析
private async Task FeedingStationB(JYResult<byte[]> bArrays, object plcModel)
{
PlcGroup pf = plcModel as PlcGroup;
var sw = new Stopwatch();
string logName = "B进站";
LogHelper.Instance.WriteLog($"[{logName}] 开始处理", logName);
if (bArrays.IsSuccess && bArrays.Content != null)
{
try
{
sw.Start();
LogHelper.Instance.WriteLog($"[{logName}] 数据有效, 数据长度:{bArrays.Content.Length}", logName);
#region 数据初始化
//解析数据
List<AGearEntity> list = new List<AGearEntity>();//实体
List<short> listRes = GetList<short>(8, 2);//默认为1,良品
List<bool> listMark = GetList<bool>(8, false);//有料标志
List<string> listCode = GetList<string>(8, "");//电芯码
List<string> listRemark = GetList<string>(8, "");//备注
List<string> listFlag = GetList<string>(8, "0");//是否上传标志
List<string> listResult = GetList<string>(8, "OK");//结果
List<string> listMesage = GetList<string>(8, "");//mesMesage
List<MesResType> listMesResType = GetList<MesResType>(8, MesResType.B);//mesType
#endregion
#region 数据解析
// 从D3021开始
byte[] bytes = bArrays.Content.ByteReverse();//高低位转换
int validCount = 0;
//有料标志
for (int i = 0; i < listMark.Count; i++)
{
listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2)) == 1 ? true : false;// 从D3021开始
if (listMark[i])
{
validCount++;
#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}");
}
}
LogHelper.Instance.WriteLog($"[{logName}] 解析完成, 有料数量:{validCount}, 条码:{string.Join(",", listCode.Where(x => !string.IsNullOrEmpty(x)))}", logName);
#endregion
#region 上传MES
var sw1 = new Stopwatch();
sw1.Start();
if (list.Count > 0)
{
if (CommonMethods.sysConfig.MesModeSwitching)
{
if (CommonMethods.mesConfig.isConnected)
{
LogHelper.Instance.WriteLog($"[{logName}] 开始上传MES, 数量:{list.Count}", logName);
var allMesMessages = new List<string>();
var allMesResTypes = new List<MesResType>();
var allFlags = new List<string>();
foreach (var item in list)
{
// 每次只上传一个条码(封装为List)
var singleCodeList = new List<string> { item.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 = GetList<short>(8, 3);
listRemark = GetList<string>(8, "");
if (mesage1.Count > 0 && mesage1[0].Contains("一个或多个错误"))
{
CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); // 反馈PLC结果
}
}
}
// 将收集的结果赋给主列表
listMesage = allMesMessages;
listMesResType = allMesResTypes;
listFlag = allFlags;
LogHelper.Instance.WriteLog($"[{logName}] MES上传完成, 成功:{allFlags.Count(x => x == "1")}, 失败:{allFlags.Count(x => x == "2")}", logName);
}
else
{
LogHelper.Instance.WriteLog($"[{logName}] MES断连", logName);
listRes = GetList<short>(8, 3);
listRemark = GetList<string>(8, "MES断连".Translated());
listFlag = GetList<string>(8, "2");
CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short);//反馈MES结果
}
}
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] MES上传耗时:{sw1.ElapsedMilliseconds}ms", logName);
#endregion
#region 数据组合
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();
listFlag[i] = "2";
}
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
listFlag[i] = "2";
break;
case MesResType.B:// 排出
listResult[i] += "MES NG";
listRemark[i] += listMesage[codeIndex];
listRes[i] = 3;//2
listFlag[i] = "2";
break;
case MesResType.C:// 警示
case MesResType.D:// 条码上传OK
listResult[i] += "MES OK";//MES认为是可以当成良品流下去的
listRemark[i] += listMesage[codeIndex];
listRes[i] = 1;
listFlag[i] = "1";
break;
default:
listResult[i] += "MES NG";
listRemark[i] += listMesage[codeIndex];
listRes[i] = 3;//2
listFlag[i] = "2";
break;
}
}
}
list[i].Result = listResult[i].TrimStart(',').TrimEnd(',');
list[i].Remark = listRemark[i].TrimStart(',').TrimEnd(',');
list[i].Flag = listFlag[i];
}
#endregion
#region 数据反馈&上传
//读取结果显示
//数据存储 -异步处理
_ = Task.Run(async () =>
{
try
{
await SaveFeedingDataAsync(list);
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"SaveFeedingDataAsync 异常{ex.Message}", logName);
}
}
);
//写入·结果反馈
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.WriteLog($"[{logName}] 反馈PLC结果:{string.Join(",", listRes)}", logName);
bool writeResult = CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
LogHelper.Instance.WriteLog($"[{logName}] 清0结果:{writeResult}", logName);
#endregion
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"[{logName}] 异常:{ex.Message}", logName);
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
}
sw.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 处理完成, 总耗时:{sw.ElapsedMilliseconds}ms", logName);
CommonMethods.AddDataMonitorLog(0, "卷芯进站B共耗时".Translated() + $":{sw.Elapsed.TotalMilliseconds}ms");
}
else
{
LogHelper.Instance.WriteLog($"[{logName}] 数据无效", logName);
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
}
}
#region 保存上料数据
/// <summary>
/// 保存上料数据到数据
/// </summary>
/// <param name="list"></param>
private async Task SaveFeedingDataAsync(List<AGearEntity> list)
{
var sw = new Stopwatch();
sw.Start();
//数据的保存
try
{
if (list != null && list.Count > 0)
{
var sw1 = new Stopwatch();
sw1.Start();
bool b = await CommonMethods.db.AddReturnBoolAsync<AGearEntity>(list);
sw1.Stop();
LogHelper.Instance.WriteLog($"SaveFeedingDataAsync AddReturnBoolAsync 耗时{sw1.ElapsedMilliseconds}", "A进站");
sw1.Restart();
//数据显示
CommonMethods.ShowFeedingDelegate.Invoke(list);
sw1.Stop();
LogHelper.Instance.WriteLog($"SaveFeedingDataAsync ShowFeedingDelegate 耗时{sw1.ElapsedMilliseconds}", "A进站");
}
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"卷芯上料保存处理异常:{ex}", "SysErrorLog");
}
sw.Stop();
LogHelper.Instance.WriteLog($"SaveFeedingDataAsync 耗时{sw.ElapsedMilliseconds}", "A进站");
}
#endregion
#endregion
#region 下料工位(数据处理)
/// <summary>
/// 电芯出站A
/// </summary>
/// <param name="bArrays"></param>
/// <param name="plcModel"></param>
private async Task BlankingStationA(JYResult<byte[]> bArrays, object plcModel)
{
PlcGroup pf = plcModel as PlcGroup;
var sw = new Stopwatch();
var sw1 = new Stopwatch();
string logName = "A出站";
LogHelper.Instance.WriteLog($"[{logName}] 开始处理", logName);
if (bArrays.IsSuccess && bArrays.Content != null)
{
try
{
sw.Start();
LogHelper.Instance.WriteLog($"【出站A】开始处理, 时间={DateTime.Now:HH:mm:ss.fff} 数据有效, 数据长度:{bArrays.Content.Length}", logName);
#region 初始化数据
sw1.Restart();
List<BGearEntity> list = new List<BGearEntity>();
List<short> listRes = GetList<short>(8, 2);//默认为1,良品
List<bool> listMark = GetList<bool>(8, false);//有料标志
List<string> listCode = GetList<string>(8, "");//电芯码
List<string> listRemark = GetList<string>(8, "");//备注
List<string> listFlag = GetList<string>(8, "0");//是否上传标志
List<string> listResult = GetList<string>(8, "OK");//结果
List<string> listMesMesage = GetList<string>(8, "");//mesMesage
List<string> listrfid = GetList<string>(8, "");//RFID
List<string> listJetCode = GetList<string>(8, "");//喷码
List<MesResType> listMesResType = GetList<MesResType>(8, MesResType.B);//mesType
List<DataTurnover> list_battery411_2Entity = new List<DataTurnover>();
//ushort listRes = 1; // 默认为1,良品
string lst_RFIDCodes = ""; // 托杯码
string lst_BarCodes = ""; // 条码
string lst_JetCode = "";// 喷码
string windSpeed;// 风速
string barCodeLength;// 电芯码长度
string barCodeWidth;// 电芯码宽度
string gbCodeBottomToCoverPlateHeight;// GB码底部距盖板高度
string midDiameter;// 中间直径
string insulationFilmToBottemHeight1;// 绝缘膜距底部高度1
string insulationFilmToBottemHeight2;// 绝缘膜距底部高度2
string insulationFilmToBottemHeight3;// 绝缘膜距底部高度3
string insulationFilmToBottemHeight4;// 绝缘膜距底部高度4
string insulationFilmToBottemHeight5;// 包膜对齐度1
string insulationFilmToBottemHeight6;// 包膜对齐度2
string topiameter;// 顶部直径
string lowiameter;// 底部直径
int firstTrueIndex = 0;//通道号
int station = 0;// 工位
int stationA1 = 0; //滚标位
int ccdAfterCoatedAlignmentTestResult = 0; // 包膜后对齐度检测结果
int ccdAfterCoatedApperanceTestResult = 0; // 贴膜后外观检测结果
int ccdAfterCoatedApperanceTestReson = 0; // 贴膜后外观NG
string shuttleActuator = ""; // 穿梭动子
string cEDistance = "";// Ce 距离
string cEHeight = "";// Ce 高
string cEWidth = "";// Ce 宽
int[] ccdTestResult = new int[2];//ccd检测结果
string result = "";//总结果
string info = "";//NG详情
string flag = "";//是否上传mes
sw1.Stop();
LogHelper.Instance.WriteLog($"【出站A】数据初始化耗时: {sw1.ElapsedMilliseconds}ms", logName);
#endregion
#region 数据解析
byte[] bytes = bArrays.Content.ByteReverse();
int validCount = 0;
sw1.Restart();
for (int i = 0; i < listMark.Count; i++)
{
listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, i * 2) == 1 ? true : false;// 从D4021开始
if (listMark[i])
{
validCount++;
#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();
}
else { listCode[i] = "ERROR"; }
bool jetCodeMark = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (579 * 2)) == 1 ? true : false;// 从D4600开始
if (jetCodeMark)
{
// 从PLC获取
int jetCodeLength = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (587 * 2));// 从D4608开始
if (jetCodeLength > 0)
{
listJetCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 50) + (629 * 2), jetCodeLength, System.Text.Encoding.ASCII).// 从D4650开始
Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
}
}
// 从PLC获取RFID
int RFIDCodeLength = 9;
if (RFIDCodeLength > 0)
{
listrfid[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 60) + (1079 * 2), RFIDCodeLength, System.Text.Encoding.ASCII).// 从D5100开始
Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
}
windSpeed = GetValueFromByteArray(bArrays.Content, "windSpeed", i * 4);// 风速 D4850 829
barCodeLength = GetValueFromByteArray(bArrays.Content, "barCodeLength", i * 4);// 二维码长度 D4866 845
barCodeWidth = GetValueFromByteArray(bArrays.Content, "barCodeWidth", i * 4);// 二维码宽度 D4882 861
gbCodeBottomToCoverPlateHeight = GetValueFromByteArray(bArrays.Content, "gbCodeBottomToCoverPlateHeight", i * 4);// GB码底部距盖板高度 D4898 877
midDiameter = GetValueFromByteArray(bArrays.Content, "midDiameter", i * 4);// 中间直径 D4914 893
insulationFilmToBottemHeight1 = GetValueFromByteArray(bArrays.Content, "insulationFilmToBottemHeight1", i * 6 * 2 * 2);// 绝缘膜距底部高度1 D4930 909
insulationFilmToBottemHeight2 = GetValueFromByteArray(bArrays.Content, "insulationFilmToBottemHeight2", i * 6 * 2 * 2);// 绝缘膜距底部高度2 D4932 911
insulationFilmToBottemHeight3 = GetValueFromByteArray(bArrays.Content, "insulationFilmToBottemHeight3", i * 6 * 2 * 2);// 绝缘膜距底部高度3 D4934 913
insulationFilmToBottemHeight4 = GetValueFromByteArray(bArrays.Content, "insulationFilmToBottemHeight4", i * 6 * 2 * 2);// 绝缘膜距底部高度4 D4936 915
insulationFilmToBottemHeight5 = GetValueFromByteArray(bArrays.Content, "insulationFilmToBottemHeight5", i * 6 * 2 * 2);// 包膜对齐度1 D4938 917
insulationFilmToBottemHeight6 = GetValueFromByteArray(bArrays.Content, "insulationFilmToBottemHeight6", i * 6 * 2 * 2);// 包膜对齐度2 D4940 919
station = int.Parse(GetValueFromByteArray(bArrays.Content, "station", i * 4));// 工位 D5026 1005
ccdAfterCoatedAlignmentTestResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdAfterCoatedAlignmentTestResult", i * 2)); // 包膜后对齐度检测结果 D5042 1021
ccdAfterCoatedApperanceTestResult = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdAfterCoatedApperanceTestResult", i * 2)); // 贴膜后外观检测结果 D5050 1029
ccdAfterCoatedApperanceTestReson = int.Parse(GetValueFromByteArray(bArrays.Content, "ccdAfterCoatedApperanceTestReson", i * 2)); // 贴膜后外观NG D5058 1037
topiameter = GetValueFromByteArray(bArrays.Content, "topiameter", i * 4);// 顶部直径
lowiameter = GetValueFromByteArray(bArrays.Content, "lowiameter", i * 4);// 底部直径
shuttleActuator = GetValueFromByteArray(bArrays.Content, "shuttleActuator", i * 2);// 穿梭动子
stationA1 = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (1369 * 2)); // D5390~5397
cEHeight = GetValueFromByteArray(bArrays.Content, "cEHeight", (i * 4));//5400 CE宽
cEWidth = GetValueFromByteArray(bArrays.Content, "cEWidth", (i * 4));// 5416 CE高
cEDistance = GetValueFromByteArray(bArrays.Content, "cEDistance", (i * 4));// 5432 CE距离
result = GetValueFromByteArray(bArrays.Content, "result", i * 2);// 总结果 D5058 1037
info = GetValueFromByteArray(bArrays.Content, "info", i * 2); // NG详情 D5066 1045
lst_RFIDCodes = listrfid[i];//StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 39, Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); // RFID D3200-3219
lst_BarCodes = listCode[i];
lst_JetCode = listJetCode[i];
firstTrueIndex = listMark.IndexOf(true);
#endregion
#region 数据保存
BGearEntity m = new BGearEntity
{
ChannelNo = (i + 1).ToString(),
TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
RFID = listrfid[i],
BarCode = listCode[i],
JetCode = listJetCode[i],
WindSpeed = windSpeed,
BarCodeLength = barCodeLength,
BarCodeWidth = barCodeWidth,
GBCodeBottomToCoverPlateHeight = gbCodeBottomToCoverPlateHeight,
MidDiameter = midDiameter,
InsulationFilmToBottemHeight1 = insulationFilmToBottemHeight1,
InsulationFilmToBottemHeight2 = insulationFilmToBottemHeight2,
InsulationFilmToBottemHeight3 = insulationFilmToBottemHeight3,
InsulationFilmToBottemHeight4 = insulationFilmToBottemHeight4,
InsulationFilmToBottemHeight5 = insulationFilmToBottemHeight5,
InsulationFilmToBottemHeight6 = insulationFilmToBottemHeight6,
TOPiameter = topiameter,
LOWiameter = lowiameter,
ShuttleActuator = shuttleActuator,
CCDAfterCoatedAlignmentTestResult = ccdAfterCoatedAlignmentTestResult == 1 ? "OK" : "NG",
CCDAfterCoatedApperanceTestResult = ccdAfterCoatedApperanceTestResult == 1 ? "OK" : "NG",
CCDAfterCoatedApperanceTestReson = ccdAfterCoatedApperanceTestResult == 2 ? "UI003" : "",
Station = station == 1 ? "A" : "B",
stationA1 = stationA1 == 1 ? "1" : "2",
cEHeight = cEHeight,
cEDistance = cEDistance,
cEWidth =cEWidth,
Flag = listFlag[i],
Flag1 = "2",
Result = result,
Info = info,
MaterialCode = CommonMethods.mesConfig.MaterialCode,
};
list_battery411_2Entity.Add(new DataTurnover()
{
equipNum = CommonMethods.mesConfig.equipNum,
Time = DateTime.Now,
containerCode = listrfid[i],
identification = listCode[i],
message = "OK"
});
list.Add(m);
#endregion
}
else
{
CommonMethods.AddDataMonitorLog(0, "出站下料工位A有料标志为0".Translated() + "通道号".Translated() + $":{i}");
}
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 解析完成,耗时:{sw1.ElapsedMilliseconds}ms, 有料数量:{validCount}, 条码:{string.Join(",", listCode.Where(x => !string.IsNullOrEmpty(x)))}", logName);
#endregion
#region 数据上传
sw1.Restart();
if (list.Count > 0)
{
if (CommonMethods.sysConfig.MesModeSwitching)
{
if (CommonMethods.mesConfig.isConnected)
{
LogHelper.Instance.WriteLog($"[{logName}] 开始上传MES, 数量:{list.Count}", logName);
var tempMesMessages = new List<string>();
var tempMesResTypes = new List<MesResType>();
var tempFlags = new List<string>();
foreach (var item in list)
{
var sw3 = new Stopwatch();
sw3.Start();
// 创建单个电池的列表
var singleBatteryList = new List<BGearEntity> { 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<short>(8, 3);
listRemark = GetList<string>(8, "");
if (mesage.Count > 0 && mesage[0].Contains("一个或多个错误"))
{
CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short); // 反馈PLC结果
}
}
sw3.Stop();
LogHelper.Instance.WriteLog($"A出站 {item.BarCode} 上传mes单次耗时: {sw3.ElapsedMilliseconds},", logName);
}
// 将收集的结果赋给主列表
listMesMesage = tempMesMessages;
listMesResType = tempMesResTypes;
listFlag = tempFlags;
LogHelper.Instance.WriteLog($"[{logName}] MES上传完成, 成功:{tempFlags.Count(x => x == "1")}, 失败:{tempFlags.Count(x => x == "2")}", logName);
var sw2 = new Stopwatch();
sw2.Start();
_ = Task.Run(async () =>
{
try
{
await UpProducResultParamAsync(list);
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"UpProducResultParamAsync 异常{ex.Message}", logName);
}
}
);
sw2.Stop();
LogHelper.Instance.WriteLog($"A出站上传结果参数耗时: {sw2.ElapsedMilliseconds},", logName);
}
else
{
LogHelper.Instance.WriteLog($"[{logName}] MES断连", logName);
listRes = GetList<short>(8, 3);
listRemark = GetList<string>(8, "MES断连".Translated());
listFlag = GetList<string>(8, "2");
CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short);//反馈MES结果
}
}
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] MES 上传总耗时:{sw1.ElapsedMilliseconds}ms", logName);
#endregion
#region 数据组合
for (int i = 0; i < list.Count; i++)
{
if (String.IsNullOrEmpty(listCode[i]) || listCode[i].Trim() == "ERROR" || listCode[i].Trim().ToUpper() == "NOREAD" || listCode[i].Trim().ToUpper() == "NG" || !IsAlphaNumeric(listCode[i]))
{
listRes[i] = 2;
listResult[i] = "NG";
listRemark[i] = "电芯码不良".Translated();
listFlag[i] = "2";
}
else
{
string strMessage = "";
ccdTestResult[0] = list[i].CCDAfterCoatedAlignmentTestResult == "OK" ? 1 : 2;
ccdTestResult[1] = list[i].CCDAfterCoatedApperanceTestResult == "OK" ? 1 : 2;
//short a = (short)GetResult(ccdTestResult, ref strErr);
int ngMessage = Convert.ToInt32(list[i].Info);
strMessage = (string)GetFinalResult(ngMessage,ref strMessage);
listResult[i] = list[i].Result == "2" ? "OK" : "NG";
list[i].Info = strMessage;
listRes[i] = 1;
if (CommonMethods.sysConfig.MesModeSwitching)
{
// 本地判断OK,MES判断OK D代表MES OK
if (listResult[i] == "OK" && listMesResType[i] == MesResType.D)
{
listResult[i] += ",MES OK";
listRemark[i] += "良品".Translated();
listRemark[i] += $"{listMesMesage[i]}";
listRes[i] = 1;
listFlag[i] = "1";
}
// 本地判断OK,MES判断NG
else if (listResult[i] == "OK" && listMesResType[i] != MesResType.D)
{
switch (listMesResType[i])
{
case MesResType.A: // 停线,设备报警停机
listResult[i] += ",MES NG";
listRemark[i] += $"{listMesMesage[i]}";
listRes[i] = 3;//10
listFlag[i] = "2";
break;
case MesResType.B: // MES不良
listResult[i] += ",MES NG";
listRemark[i] += $"{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] += $"{listMesMesage[i]}";
listRes[i] = 1;
listFlag[i] = "1";
break;
default:
listResult[i] += ",MES NG";
listRemark[i] += $"{listMesMesage[i]}";
listRes[i] = 3;
listFlag[i] = "2";
break;
}
}
// 本地判断NG,MES判断OK
else if (listResult[i] == "NG" && listMesResType[i] == MesResType.D)
{
listResult[i] += ",MES OK";
listRemark[i] += $"{listMesMesage[i]}";
//listRes[i] = 1;
listRes[i] = 99;
listFlag[i] = "1";
}
// 本地判断NG,MES判断NG
else if (listResult[i] == "NG" && listMesResType[i] != MesResType.D)
{
listResult[i] += ",MES NG";
listRemark[i] += $"{listMesResType[i].ToString()},{listMesMesage[i]}";
listRes[i] = 3;//9
listFlag[i] = "2";
}
// 其他情况
else
{
listResult[i] += ",MES NG";
listRemark[i] += listMesMesage[i];
listRes[i] = 3;
listFlag[i] = "2";
}
}
}
list[i].Result = listResult[i].TrimStart(',').TrimEnd(',');
list[i].Remark = listRemark[i].TrimStart(',').TrimEnd(',');
list[i].Flag = listFlag[i];
}
#endregion
#region 数据保存&上传
sw1.Restart();
if (list_battery411_2Entity.Any())
{
await SaveBlankingData2SQL(list_battery411_2Entity);
}
sw1.Stop();
LogHelper.Instance.WriteLog($"A出站远端存储耗时: {sw1.ElapsedMilliseconds}ms", logName);
//数据存储 - 异步处理
sw1.Restart();
_ = Task.Run(async () =>
{
try
{
await SaveBlankingDataAsync(list);
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"SaveBlankingDataAsync 异常{ex.Message}", logName);
}
});
sw1.Stop();
LogHelper.Instance.WriteLog($"A出站本地存储耗时: {sw1.ElapsedMilliseconds}", logName);
sw1.Restart();
if (pf.IsFeedbackPlc)
{
//写入·结果反馈
JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[1].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC
LogHelper.Instance.WriteLog($"[{logName}] 反馈PLC结果:{string.Join(",", listRes)}", logName);
if (result1 != null)
{
string strres = "出站A工位发送给PLC".Translated() + $",[{pf.VarList[1].VarAddress}]:{string.Join(",", listRes)}";
CommonMethods.AddDataMonitorLog(0, strres);
}
}
sw1.Stop();
LogHelper.Instance.WriteLog($"反馈结果给PLC 耗时: {sw1.ElapsedMilliseconds}ms", logName);
sw1.Restart();
bool writeResult = CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
if (!writeResult)
{
int count = 0;
bool success = false;
do
{
success = CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
count++;
LogHelper.Instance.WriteLog($"[{logName}] 清0失败第{count}次重试结果:{success}", logName);
}
while (count < 3 && success == false);
}
sw1.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 清0, 耗时{sw1.ElapsedMilliseconds}ms,结果:{writeResult}", logName);
#endregion
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"[{logName}] 异常:{ex.Message}", logName);
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
}
sw.Stop();
LogHelper.Instance.WriteLog($"[{logName}] 处理完成, 总耗时:{sw.ElapsedMilliseconds}ms", logName);
// 输出上料数据处理耗时:
CommonMethods.AddDataMonitorLog(0, "电芯出站A共耗时".Translated() + $":{sw.Elapsed.TotalMilliseconds}ms");
}
else
{
LogHelper.Instance.WriteLog($"[{logName}] 数据无效", logName);
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);
}
}
#region//上传托杯 电芯码绑定关系 到 数据库
private async Task<bool> SaveBlankingData2SQL(List<DataTurnover> list)
{
var res = false;
try
{
if (list != null && list.Count > 0)
{
res = await CommonMethods.dbServer.AddReturnBoolAsync<DataTurnover>(list);
}
else
{
LogHelper.Instance.WriteError($"电芯出站数据上传远程数据库的List为空", "SysErrorLog");
}
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"电芯出站数据上传远程数据库保存异常:{ex}", "SysErrorLog");
}
return res;
}
# endregion
#region 保存下料数据
/// <summary>
/// 保存下料数据到数据
/// </summary>
/// <param name="list"></param>
private async Task SaveBlankingDataAsync(List<BGearEntity> list)
{
var sw = new Stopwatch();
//数据的保存
try
{
if (list != null && list.Count > 0)
{
//数据显示
sw.Restart();
bool b = await CommonMethods.db.AddReturnBoolAsync<BGearEntity>(list);
sw.Stop();
LogHelper.Instance.WriteError($"AddReturnBoolAsync 耗时 {sw.ElapsedMilliseconds}ms", "SysErrorLog");
//数据显示
sw.Restart();
CommonMethods.ShowBlankingDelegate.Invoke(list);
sw.Stop();
LogHelper.Instance.WriteError($"ShowBlankingDelegate 耗时 {sw.ElapsedMilliseconds}ms", "SysErrorLog");
sw.Restart();
// 2. 保存到临时表(新增代码)
if (b) // 确保主表保存成功后再保存到临时表
{
// 创建临时表实体列表
var tempList = list.Select(b => new Temprfidtable
{
// 复制所有属性
ChannelNo = b.ChannelNo,
TestTime = b.TestTime,
RFID = b.RFID,
BarCode = b.BarCode,
JetCode = b.JetCode,
WindSpeed = b.WindSpeed,
BarCodeLength = b.BarCodeLength,
BarCodeWidth = b.BarCodeWidth,
GBCodeBottomToCoverPlateHeight = b.GBCodeBottomToCoverPlateHeight,
MidDiameter = b.MidDiameter,
InsulationFilmToBottemHeight1 = b.InsulationFilmToBottemHeight1,
InsulationFilmToBottemHeight2 = b.InsulationFilmToBottemHeight2,
InsulationFilmToBottemHeight3 = b.InsulationFilmToBottemHeight3,
InsulationFilmToBottemHeight4 = b.InsulationFilmToBottemHeight4,
InsulationFilmToBottemHeight5 = b.InsulationFilmToBottemHeight5,
InsulationFilmToBottemHeight6 = b.InsulationFilmToBottemHeight6,
CCDAfterCoatedAlignmentTestResult = b.CCDAfterCoatedAlignmentTestResult,
CCDAfterCoatedApperanceTestResult = b.CCDAfterCoatedApperanceTestResult,
Station = b.Station,
Flag = b.Flag,
Flag1 = b.Flag1,
Result = b.Result,
Info = b.Info,
MaterialCode = b.MaterialCode
}).ToList();
// 保存到临时表
await CommonMethods.db.AddReturnBoolAsync<Temprfidtable>(tempList);
}
sw.Stop();
LogHelper.Instance.WriteError($"AddReturnBoolAsync 耗时 {sw.ElapsedMilliseconds}ms", "SysErrorLog");
sw.Restart();
//数据保存本地
string strData = string.Empty;//数据字符串,本地保存
foreach (BGearEntity m in list)
{
foreach (var item in m.GetType().GetProperties())
{
strData += item.GetValue(m) + ",";
}
strData = strData.TrimEnd(',');
BlankingDataSaveLocal(strData);
}
sw.Stop();
LogHelper.Instance.WriteError($"BlankingDataSaveLocal 耗时 {sw.ElapsedMilliseconds}ms", "SysErrorLog");
}
else
{
LogHelper.Instance.WriteError($"电芯出站数据List为空", "SysErrorLog");
}
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"电芯出站数据保存异常:{ex}", "SysErrorLog");
}
}
#endregion
/// <summary>
/// 电池结果判断
/// </summary>
/// <returns></returns>
private ushort GetResult(int[] res, ref string strErr)
{
strErr = "";
int resNum = 0;
int resNum1 = 0;
int resultNum = 0;
for (int i = 0; i < res.Length; i++)
{
if (i == 0)
{
switch (res[i])
{
case 1:
resNum = 1;
break;
case 2:
resNum = 2;
break;
default:
break;
}
}
else if (i == 1)
{
switch (res[i])
{
case 1:
resNum1 = 1;
break;
case 2:
resNum1 = 2;
break;
default:
break;
}
}
}
if (resNum == 1 && resNum1 == 1) //OK
{
resultNum = 1;
strErr = "CCD检测结果OK";
}
else if (resNum == 2 && resNum1 == 1) //对齐度NG
{
resultNum = 2;
strErr = "包膜后对齐度检测结果不良".Translated();
}
else if (resNum == 1 && resNum1 == 2) //外观检测NG
{
resultNum = 2;
strErr = "贴膜后外观检测结果不良".Translated();
}
else if (resNum == 2 && resNum1 == 2)
{
strErr = "包膜后对齐度检测结果不良,".Translated() + "贴膜后外观检测结果不良".Translated();
resultNum = 2;
}
else
{
strErr += "CCD反馈" + resultNum.ToString() + "检测结果未知".Translated();
resultNum = 2;
}
strErr = strErr.TrimEnd(',');
return (ushort)resultNum;
}
private String GetFinalResult(int res, ref string strErr)
{
strErr = "";
switch (res)
{
case 1:
strErr = "OK";
break;
case 2:
strErr = "上料扫码NG";
break;
case 3:
strErr = "上位机喷码NG";
break;
case 4:
strErr = "喷码扫码NG";
break;
case 6:
strErr = "飞拍NG";
break;
case 7:
strErr = "MES出站NG";
break;
case 8:
strErr = "MES进站NG";
break;
case 9:
strErr = "CCD1_留白异常";
break;
case 10:
strErr = "CCD1_对齐度异常";
break;
case 11:
strErr = "CCD1_ ce码异常 ";
break;
case 12:
strErr = "CCD1_二维码异常";
break;
case 13:
strErr = "CCD2_留白异常";
break;
case 14:
strErr = "CCD2_对齐度异常";
break;
case 15:
strErr = "CCD2_ ce码异常";
break;
case 16:
strErr = "CCD2_二维码异常";
break;
case 17:
strErr = "CCD1_算法NG";
break;
case 18:
strErr = "CCD2_算法NG";
break;
case 19:
strErr = "顶部直径NG";
break;
case 20:
strErr = "中间直径NG";
break;
case 21:
strErr = "底部直径NG";
break;
case 22:
strErr = "飞拍算法NG";
break;
case 23:
strErr = "CCD1数据NG";
break;
case 24:
strErr = "CCD2数据NG";
break;
case 25:
strErr = "CCD1_气泡NG_异物NG";
break;
case 26:
strErr = "CCD2_气泡NG_异物NG";
break;
case 27:
strErr = "CCD1_重叠区NG";
break;
case 28:
strErr = "CCD1_褶皱NG";
break;
case 29:
strErr = "CCD1_翘起NG";
break;
case 30:
strErr = "CCD2_重叠区NG";
break;
case 31:
strErr = "CCD2_褶皱NG";
break;
case 32:
strErr = "CCD2_翘起NG";
break;
case 33:
strErr = "CCD1_破损NG";
break;
case 34:
strErr = "CCD2_破损NG";
break;
}
return (String)strErr;
}
#region 结果数据上传
/// <summary>
/// 结果数据上传
/// </summary>
/// <param name="list"></param>
private async Task UpProducResultParamAsync(List<BGearEntity> listBger)
{
var sw = Stopwatch.StartNew();
if (listBger == null || listBger.Count == 0) return;
var tasks = listBger
.Where(m => m.BarCode != "NG" && m.BarCode != "ERROR")
.Select(async m =>
{
// 并行调用 MES
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);
if (success)
{
m.Flag1 = "1";
}
});
sw.Stop();
LogHelper.Instance.WriteLog($"UpProducResultParamAsync ProducResultParamAsync 耗时{sw.ElapsedMilliseconds}ms", "A出站");
sw.Restart();
var successCodes = listBger
.Where(m => m.Flag1 == "1")
.Select(m => m.BarCode)
.ToList();
if (successCodes.Any())
{
await CommonMethods.db.UpdateAsync<BGearEntity>(
it => it.Flag1 == "1",
it => successCodes.Contains(it.BarCode) // 条件
);
}
sw.Stop();
LogHelper.Instance.WriteLog($"UpProducResultParamAsync UpdateAsync 耗时{sw.ElapsedMilliseconds}ms", "A出站");
sw.Restart();
// 等待所有任务完成
await Task.WhenAll(tasks);
sw.Stop();
LogHelper.Instance.WriteLog($"UpProducResultParamAsync WhenAll 耗时{sw.ElapsedMilliseconds}ms", "A出站");
}
#endregion
#region 定时补传
/// <summary>
/// 定时补传
/// </summary>
//public void ReUpProducResultParam()
//{
// try
// {
// List<BGearEntity> list = CommonMethods.db.QuerySqlList<BGearEntity>(CommonMethods.dBSQL.GetOutFlag1Sql("2"));
// if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected)
// {
// UpProducResultParam(list);
// }
// }
// catch (Exception ex)
// {
// LogHelper.Instance.WriteError($"结果数据补传失败, 原因: {ex}", "系统报错");
// //throw new Exception(ex.ToString());
// }
//}
#endregion
#endregion
#region 喷码工位(数据处理)
/// <summary>
/// 喷码工位A
/// </summary>
private async Task JettingStationA(JYResult<byte[]> bArrays, object plcModel)
{
PlcGroup pf = plcModel as PlcGroup;
var sw = new Stopwatch();
if (bArrays.IsSuccess && bArrays.Content != null)
{
try
{
sw.Start();
//解析数据
List<AGearEntity> list = new List<AGearEntity>();//实体
List<short> listRes = GetList<short>(4, 2);//默认为1,良品
List<string> listJetCode = GetList<string>(4, "");//喷码
List<bool> listMark = GetList<bool>(4, false);//有料标志
List<string> listCode = GetList<string>(4, "");//电芯码
// 从D7021开始
#region 数据解析
byte[] bytes = bArrays.Content.ByteReverse();//高低位转换
//有料标志
for (int i = 0; i < listMark.Count; i++)
{
listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, i * 2) == 1 ? true : false;// 从D7021开始
if (listMark[i])
{
//条码长度
int codeLength = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (20 * 2));// 从D7041开始
if (codeLength > 0)
{
//条码
listCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 50) + (79 * 2), codeLength, System.Text.Encoding.ASCII).// 从D7100开始
Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
}
else
{
listCode[i] = "ERROR";
}
}
else
{
CommonMethods.AddDataMonitorLog(0, "喷码工位A有料标志为0".Translated() + "通道号".Translated() + $":{i}");
}
}
#endregion
#region 清空喷码机缓存区
//下发喷码前重新连接喷码机,下发完成后断开
CommonMethods.jetClientA.SetTCPParams(IPAddress.Parse("192.168.101.26"), 10086);
CommonMethods.jetClientA.ConnectWithRetry();
JetReturnResult jetReturn = new JetReturnResult();
JetKey jetKey = new JetKey();
jetKey.KEY = 66;//清空缓存数据命令
CommonMethods.jetClientA.SendAndGetRes(JsonHelper.EntityToJson(jetKey), ref jetReturn);
if (jetReturn.RS == "" || jetReturn.RS == "ERROR")
{
//listRes[i] = 3;
LogHelper.Instance.WriteError($"喷码A清空缓存区失败", "喷码A");
}
#endregion
#region 数据组合
Random random = new Random();
for (int i = 0; i < listCode.Count; i++)
{
if (listMark[i])
{
if (listCode[i].Contains("_")) { listJetCode[i] = $"TEXT{random.Next(100000, 999999)}"; }
else if (String.IsNullOrEmpty(listCode[i]) || listCode[i].Trim() == "ERROR" || !IsAlphaNumeric(listCode[i]))
{
listRes[i] = 2;
listJetCode[i] = "";
}
else
{
//喷码
listJetCode[i] = listCode[i];
//更新进站喷码字段数据
AGearEntity m = new AGearEntity();
m.BarCode = listCode[i];
m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
m.JetCode = listJetCode[i];//滚标机喷码工序喷的是GB码
list.Add(m);
#region 获取MES下发喷码 取消
//上传MES
//if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected && false)
//{
// List<string> codeList = new List<string>();
// codeList.Add(listCode[i]);
// var (success, mesDMCCode, mesReason) = await CommonMethods.hbgMes.GetDMCJetCodeAsync(CommonMethods.mesConfig.DMCJetCodeURL, CommonMethods.mesConfig.equipNum, codeList);
// if (success) //调用接口成功
// {
// //喷码
// m.JetCode = listJetCode[i] = mesDMCCode[i];
// }
// else
// {
// listRes[i] = 4;
// m.Remark += $",{mesReason[i]}";
// }
//}
//else
//{
// listRes[i] = 4;
// m.Remark = "MES断连";
// m.Flag = "0";
// CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short);//反馈MES结果
//}
#endregion
}
}
}
#endregion
#region 喷码下发喷码机
for (int i = listCode.Count - 1; i >= 0; i--)
{
if (CommonMethods.jetClientA.Connected)
{
//喷码下发喷码机
//json组合
JetData jetData = new JetData();
jetData.MID = 1;
jetData.SID = 1;
jetData.VAL = listJetCode[i];
JetVisible jetVisible = new JetVisible();
jetVisible.MID = 2;
if (listJetCode[i] != "")
jetVisible.VAL = true;
else
jetVisible.VAL = false;
List<JetData> listJetData = new List<JetData>();
List<JetVisible> listJetVisible = new List<JetVisible>();
listJetData.Add(jetData);
listJetVisible.Add(jetVisible);
JetClass jet = new JetClass();
jet.KEY = 82;//喷码下发喷码机缓存命令
jet.DATA = listJetData;
jet.VISIBLE = listJetVisible;
string json = JsonHelper.EntityToJson(jet);
CommonMethods.jetClientA.SendAndGetRes(json, ref jetReturn);
if (jetReturn.RS == "" || jetReturn.RS == "ERROR")
{
listRes[i] = 3;
LogHelper.Instance.WriteError($"喷码A条码:{listJetCode}下发失败,返回结果:{jetReturn.RS}", "喷码A");
}
else { listRes[i] = 1; }
LogHelper.Instance.WriteError($"喷码json: {json}", "喷码A"); //临时日志,可取消
}
else
{
listRes[i] = 5;
LogHelper.Instance.WriteError($"喷码机A断连,喷码下发失败", "喷码A");
}
}
CommonMethods.jetClientA.Close();
//Thread.Sleep(100);
#endregion
#region 数据反馈&保存
//写入·结果反馈
JYResult result = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[1].VarAddress, listRes.ToArray(), PLC.DataType.ArrShort);//判断结果写入PLC
if (result != null)
{
string strres = "喷码A工位发送给PLC".Translated() + $",[{pf.VarList[1].VarAddress}]:{string.Join(",", listRes)}";
CommonMethods.AddDataMonitorLog(0, strres);
}
//喷码下发plc
//for (int j = 0; j < listJetCode.Count; j++)
//{
// JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[j + 3].VarAddress, listJetCode[j], PLC.DataType.String);
// if (result1 != null)
// {
// string strres = $"喷码A工位发送给PLC喷码{j + 1},[{pf.VarList[j + 3].VarAddress}]:{listJetCode[j]}";
// LogHelper.Instance.WriteLog(strres);
// }
//}
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
//#region 喷码下发数量与电芯有料数量比较
//if (CommonMethods.jetClientA.Connected)
//{
// jetKey = new JetKey();
// jetKey.KEY = 65;//查询未打印缓存数据个数
// string js = JsonHelper.EntityToJson(jetKey);
// int cacheCount = 0;
// CommonMethods.jetClientA.SendAndGetRes(jetKey.KEY, js, ref jetReturn, ref cacheCount);
// //if (jetReturn.DATA != listCode.Count.ToString())//list.Count
// //{
// // LogHelper.Instance.WriteError($"喷码A下发数量与电芯有料数量不一致,条码:{string.Join(",", listCode)},,喷码数量:{jetReturn.DATA}", "SysErrorLog");
// //}
//}
//#endregion
//数据存储 -异步处理
//lock (this)
//{
// SaveJetCodeData(list);
//}
#endregion
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"喷码线程A数据处理:{ex}", "喷码A");
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
CommonMethods.jetClientA.Close();
}
sw.Stop();
////输出上料数据处理耗时:
CommonMethods.AddDataMonitorLog(0, "卷芯喷码A获取/下发共耗时".Translated() + $":{sw.Elapsed.TotalMilliseconds}ms");
}
}
/// <summary>
/// 喷码工位B D8000
/// </summary>
private async Task JettingStationB(JYResult<byte[]> bArrays, object plcModel)
{
PlcGroup pf = plcModel as PlcGroup;
var sw = new Stopwatch();
if (bArrays.IsSuccess && bArrays.Content != null)
{
try
{
sw.Start();
//解析数据
List<AGearEntity> list = new List<AGearEntity>();//实体
List<short> listRes = GetList<short>(4, 2);//默认为1,良品
List<string> listJetCode = GetList<string>(4, "");//喷码
List<bool> listMark = GetList<bool>(4, false);//有料标志
List<string> listCode = GetList<string>(4, "");//电芯码
// 从D8021开始
#region 数据解析
byte[] bytes = bArrays.Content.ByteReverse();//高低位转换
//有料标志
for (int i = 0; i < listMark.Count; i++)
{
listMark[i] = ShortLib.GetShortFromByteArray(bArrays.Content, i * 2) == 1 ? true : false;// 从D8021开始
if (listMark[i])
{
//条码长度
int codeLength = ShortLib.GetShortFromByteArray(bArrays.Content, (i * 2) + (20 * 2));// 从D8041开始
if (codeLength > 0)
{
//条码
listCode[i] = StringLib.GetStringFromByteArrayByEncoding(bytes, (i * 50) + (79 * 2), codeLength, System.Text.Encoding.ASCII).// 从D8100开始
Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
}
else
{
listCode[i] = "ERROR";
}
}
else
{
CommonMethods.AddDataMonitorLog(0, "喷码工位B有料标志为0".Translated() + "通道号".Translated() + $":{i}");
}
}
#endregion
#region 清空喷码机缓存区
CommonMethods.jetClientB.SetTCPParams(IPAddress.Parse("192.168.100.27"), 10086);
CommonMethods.jetClientB.ConnectWithRetry();
JetReturnResult jetReturn = new JetReturnResult();
JetKey jetKey = new JetKey();
jetKey.KEY = 66;//清空缓存数据命令
CommonMethods.jetClientB.SendAndGetRes(JsonHelper.EntityToJson(jetKey), ref jetReturn);
if (jetReturn.RS == "" || jetReturn.RS == "ERROR")
{
//listRes[i] = 3;
LogHelper.Instance.WriteError($"喷码B清空缓存区失败", "喷码B");
}
#endregion
#region 数据组合
Random random = new Random();
for (int i = 0; i < listCode.Count; i++)
{
if (listMark[i])
{
if (listCode[i].Contains("_")) { listJetCode[i] = $"TEXT{random.Next(100000, 999999)}"; }
else if (String.IsNullOrEmpty(listCode[i]) || listCode[i].Trim() == "ERROR" || !IsAlphaNumeric(listCode[i]))
{
listRes[i] = 2;
listJetCode[i] = "";
}
else
{
//喷码
listJetCode[i] = listCode[i];
//更新进站喷码字段数据
AGearEntity m = new AGearEntity();
m.BarCode = listCode[i];
m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
m.JetCode = listJetCode[i];//滚标机喷码工序喷的是GB码
list.Add(m);
#region 获取MES下发喷码 取消
//上传MES
//if (CommonMethods.sysConfig.MesModeSwitching && CommonMethods.mesConfig.isConnected && false)
//{
// List<string> codeList = new List<string>();
// codeList.Add(listCode[i]);
// var (success, mesDMCCode, mesReason) = await CommonMethods.hbgMes.GetDMCJetCodeAsync(CommonMethods.mesConfig.DMCJetCodeURL, CommonMethods.mesConfig.equipNum, codeList);
// if (success) //调用接口成功
// {
// //喷码
// m.JetCode = listJetCode[i] = mesDMCCode[i];
// }
// else
// {
// listRes[i] = 4;
// m.Remark += $",{mesReason[i]}";
// }
//}
//else
//{
// listRes[i] = 4;
// m.Remark = "MES断连";
// m.Flag = "0";
// CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue("D80", 1, PLC.DataType.Short);//反馈MES结果
//}
#endregion
}
}
}
#endregion
#region 喷码下发喷码机
for (int i = listCode.Count - 1; i >= 0; i--)
{
if (CommonMethods.jetClientB.Connected)
{
//喷码下发喷码机
//json组合
JetData jetData = new JetData();
jetData.MID = 1;
jetData.SID = 1;
jetData.VAL = listJetCode[i];
//
JetVisible jetVisible = new JetVisible();
jetVisible.MID = 2;
if (listJetCode[i] != "")
jetVisible.VAL = true;
else
jetVisible.VAL = false;
List<JetData> listJetData = new List<JetData>();
List<JetVisible> listJetVisible = new List<JetVisible>();
listJetData.Add(jetData);
listJetVisible.Add(jetVisible);
JetClass jet = new JetClass();
jet.KEY = 82;//喷码下发喷码机缓存命令
jet.DATA = listJetData;
jet.VISIBLE = listJetVisible;
string json = JsonHelper.EntityToJson(jet);
CommonMethods.jetClientB.SendAndGetRes(json, ref jetReturn);
if (jetReturn.RS == "" || jetReturn.RS == "ERROR")
{
listRes[i] = 3;
LogHelper.Instance.WriteError($"喷码B条码:{listJetCode}下发失败,返回结果:{jetReturn.RS}", "喷码B");
}
else { listRes[i] = 1; }
LogHelper.Instance.WriteError($"喷码json: {json}", "喷码B"); //临时日志,可取消
}
else
{
listRes[i] = 5;
LogHelper.Instance.WriteError($"喷码机B断连,喷码下发失败", "喷码B");
}
}
CommonMethods.jetClientB.Close();
//Thread.Sleep(100);
#endregion
#region 数据反馈&保存
//写入·结果反馈
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);
}
//喷码下发plc
//for (int j = 0; j < listJetCode.Count; j++)
//{
// JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(pf.VarList[j + 3].VarAddress, listJetCode[j], PLC.DataType.String);
// if (result1 != null)
// {
// string strres = $"喷码B工位发送给PLC喷码{j + 1},[{pf.VarList[j + 3].VarAddress}]:{listJetCode[j]}";
// LogHelper.Instance.WriteLog(strres);
// }
//}
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
//#region 喷码下发数量与电芯有料数量比较
//if (CommonMethods.jetClientB.Connected)
//{
// jetKey = new JetKey();
// jetKey.KEY = 65;//查询未打印缓存数据个数
// string js = JsonHelper.EntityToJson(jetKey);
// CommonMethods.jetClientB.SendAndGetRes(jetKey.KEY, js, ref jetReturn, ref cacheCount);
// //if (jetReturn.DATA != listCode.Count.ToString())//list.Count
// //{
// // LogHelper.Instance.WriteError($"喷码B下发数量与电芯有料数量不一致,条码:{string.Join(",", listCode)},,喷码数量:{jetReturn.DATA}", "SysErrorLog");
// //}
//}
//#endregion
//数据存储 -异步处理
//SaveJetCodeData(list);
#endregion
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"喷码线程B数据处理:{ex}", "喷码B");
CommonMethods.jetClientB.Close();
CommonMethods.plcDevices[pf.PlcNum - 1].WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
}
sw.Stop();
////输出上料数据处理耗时:
CommonMethods.AddDataMonitorLog(0, "卷芯喷码B获取/下发共耗时".Translated() + $":{sw.Elapsed.TotalMilliseconds}ms");
}
}
#region 保存上料数据
/// <summary>
/// 保存喷码数据到数据
/// </summary>
/// <param name="list"></param>
private async void SaveJetCodeData(List<AGearEntity> list)
{
//数据的保存
try
{
if (list != null && list.Count > 0)
{
foreach (var m in list)
{
int a = await CommonMethods.db.UpdateSingleAsync(m, it => new AGearEntity() { JetCode = m.JetCode }, it => it.BarCode == m.BarCode);
}
}
}
catch (Exception ex)
{
LogHelper.Instance.WriteError($"喷码数据保存处理异常:{ex}", "SysErrorLog");
}
}
#endregion
#endregion
#region 复投工位
private async Task ReInStation(JYResult<byte[]> bArrays, object plcModel)
{
PlcGroup pf = plcModel as PlcGroup;
var sw = new Stopwatch();
if (bArrays.IsSuccess)//&& bArrays.Content != null
{
try
{
sw.Start();
#region 数据解析
//byte[] bytes = bArrays.Content.ByteReverse();//高低位转换
int codeListLen = CommonMethods.tempCodeList.Count;
if (codeListLen >= 8)
{
//复投条码下发plc
for (int i = 0; i < 8; i++)
{
string tempCode = CommonMethods.tempCodeList.Dequeue();
JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(
pf.VarList[i + 3].VarAddress,
tempCode,
PLC.DataType.String
);
CommonMethods.AddDataMonitorLog(0, string.Format("卷芯复投电芯{0}, 电芯:{1}", i, tempCode));
if (result1 != null)
{
string strres = $"复投工位发送给PLC电芯码{i + 1},[{pf.VarList[i + 3].VarAddress}]:{tempCode}";
//LogHelper.Instance.WriteLog(strres);
LogHelper.Instance.WriteError(strres, "系统报错");
}
}
}
else if (codeListLen > 0 && codeListLen < 8)
{
//复投条码下发plc
for (int i = 0; i < codeListLen; i++)
{
string tempCode = CommonMethods.tempCodeList.Dequeue();
JYResult result1 = CommonMethods.plcDevices[pf.PlcNum - 1].WriteValue(
pf.VarList[i + 3].VarAddress,
tempCode,
PLC.DataType.String
);
if (result1 != null)
{
string strres = $"复投工位发送给PLC电芯码{i + 1},[{pf.VarList[i + 3].VarAddress}]:{tempCode}";
//LogHelper.Instance.WriteLog(strres);
LogHelper.Instance.WriteError(strres, "系统报错");
}
}
}
//else
//{
// CommonMethods.plcDevices[0].WriteInt16("D9052", 0);//plc恢复扫码信号
//}
#endregion
#region 数据反馈
// Thread.Sleep(5000);
// CommonMethods.plcDevices[0].WriteInt16("D9053", 0);//触发复位
if (CommonMethods.tempCodeList.Count == 0) { CommonMethods.plcDevices[0].WriteInt16("D9052", 0); }//plc恢复扫码信号
#endregion
sw.Stop();
////输出复投数据处理耗时:
CommonMethods.AddDataMonitorLog(0, "卷芯复投共耗时".Translated() + $":{sw.Elapsed.TotalMilliseconds}ms");
}
catch (Exception ex)
{
CommonMethods.AddDataMonitorLog(2, "批量复投工位异常:".Translated() + ex.Message);
}
}
}
#endregion
#region 结构件料盘工位(数据处理)
/// <summary>
/// 结构件料盘工位
/// </summary>
/// <param name="resByte"></param>
/// <param name="plcModel"></param>
///
private async Task MaterialStation(JYResult<byte[]> bArrays, object plcModel)
{
PlcGroup pf = plcModel as PlcGroup;
var sw = new Stopwatch();
if (bArrays.IsSuccess && bArrays.Content != null)
{
sw.Restart();
#region 初始化数据
List<DGearEntity> list = new List<DGearEntity>();//实体
List<string> listMaterialCode = GetList<string>(1, "");//料盘码
List<short> listRes = GetList<short>(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)
{
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.Elapsed.TotalMilliseconds}ms");
}
}
/// <summary>
/// 结构件料盘保存
/// </summary>
/// <param name="list"></param>
private async Task SaveMaterialData(List<DGearEntity> 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<DGearEntity>(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");
}
}
#endregion
#region 创建空的数组List
public List<T> GetList<T>(int num, T data)
{
List<T> list = new List<T>();
for (int i = 0; i < num; i++)
{
list.Add(data);
}
return list;
}
public List<MesResType> GetMesType(int Num)
{
List<MesResType> mesResTypes = new List<MesResType>();
for (int i = 0; i < Num; i++)
{
mesResTypes.Add(MesResType.UnKnow);
}
return mesResTypes;
}
/// <summary>
/// PLC内批量写\0
/// </summary>
/// <param name="Num"></param>
/// <returns></returns>
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
/// <summary>
/// 检测数据是否只包含字母加数字
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public bool IsAlphaNumeric(string input)
{
// 使用正则表达式检查是否只包含字母和数字
return Regex.IsMatch(input, "^[a-zA-Z0-9]+$");
}
#region 方法
/// <summary>
/// 下料数据保存本地
/// </summary>
/// <param name="strData"></param>
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
}
#endregion
}
}