commit 3d8675b65c632b3a0b10bf7794a63e26d3baca25
Author: ldw <11622064+ldw888@user.noreply.gitee.com>
Date: Wed Sep 17 20:04:00 2025 +0800
first commit
diff --git a/JinYuan.ControlCenter/.vs/JinYuan.ControlCenters.csproj.dtbcache.json b/JinYuan.ControlCenter/.vs/JinYuan.ControlCenters.csproj.dtbcache.json
new file mode 100644
index 0000000..3a85db3
--- /dev/null
+++ b/JinYuan.ControlCenter/.vs/JinYuan.ControlCenters.csproj.dtbcache.json
@@ -0,0 +1 @@
+{"RootPath":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.ControlCenter","ProjectFileName":"JinYuan.ControlCenters.csproj","Configuration":"Debug|AnyCPU","FrameworkPath":"","Sources":[{"SourceFile":"ControlCenter_Plc.cs"},{"SourceFile":"Properties\\AssemblyInfo.cs"},{"SourceFile":"ControlCenter_Total.cs"},{"SourceFile":"ControlCenter.cs"},{"SourceFile":"obj\\Debug\\.NETFramework,Version=v4.7.2.AssemblyAttributes.cs"}],"References":[{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.DataConvertLib\\bin\\Debug\\DataConvertLib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.CommunicationLib\\bin\\Debug\\JinYuan.CommunicationLib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.DAL\\bin\\Debug\\JinYuan.DAL.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.Helper\\bin\\Debug\\JinYuan.Helper.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.MES\\bin\\Debug\\JinYuan.MES.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.Models\\bin\\Debug\\JinYuan.Models.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.VirtualDataLibrary\\bin\\Debug\\JinYuan.VirtualDataLibrary.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":true,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\Microsoft.CSharp.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\packages\\MiniExcel.1.31.2\\lib\\net45\\MiniExcel.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\mscorlib.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.ControlCenter\\bin\\Debug\\PLCCommunication.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.ControlCenter\\bin\\Debug\\SqlSugar.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Core.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.DataSetExtensions.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Data.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Diagnostics.Tracing.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.IO.Compression.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Net.Http.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Windows.Forms.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""},{"Reference":"C:\\Program Files (x86)\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.7.2\\System.Xml.Linq.dll","ResolvedFrom":"","OriginalItemSpec":"","Name":"","EmbedInteropTypes":false,"CopyLocal":false,"IsProjectReference":false,"ProjectPath":""}],"Analyzers":[],"Outputs":[{"OutputItemFullPath":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.ControlCenter\\bin\\Debug\\JinYuan.ControlCenters.dll","OutputItemRelativePath":"JinYuan.ControlCenters.dll"},{"OutputItemFullPath":"E:\\JY_项目\\1086大方形\\1086-1\\LargeSquareOne\\JinYuan.ControlCenter\\bin\\Debug\\JinYuan.ControlCenters.pdb","OutputItemRelativePath":"JinYuan.ControlCenters.pdb"}],"CopyToOutputEntries":[]}
\ No newline at end of file
diff --git a/JinYuan.ControlCenter/ControlCenter.cs b/JinYuan.ControlCenter/ControlCenter.cs
new file mode 100644
index 0000000..590cc86
--- /dev/null
+++ b/JinYuan.ControlCenter/ControlCenter.cs
@@ -0,0 +1,1909 @@
+
+using JinYuan.CommunicationLib.Enum;
+using JinYuan.DataConvertLib;
+using JinYuan.Helper;
+using JinYuan.MES.Models;
+using JinYuan.Models;
+using JinYuan.VirtualDataLibrary;
+using Newtonsoft.Json;
+using PLCCommunication;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+
+namespace JinYuan.ControlCenters
+{
+ public partial class ControlCenter
+ {
+ private static LoggerHelp _logger = new LoggerHelp();
+ ///
+ /// 打印日志方法
+ ///
+ /// 日志信息
+ /// 文件夹名字
+ public static void LogMessage(string Message, string FileName)
+ {
+ string filePath = FileName + "//" + DateTime.Now.ToString("yyyy-MM-dd"); // 日志文件存放路径,默认在debug目录下
+ string filePath2 = FileName + "//" + DateTime.Now.ToString("yyyy-MM-dd") + "//Mylog.txt";//也可以加上时间
+ //string file=DateTime.Now+"log.txt";
+ //检查文件夹是否存在,否则新建
+ if (!Directory.Exists(filePath))
+ {
+ Directory.CreateDirectory(filePath);
+ }
+ string logMessage = $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff")}: {Message}";//打印出现的时间
+ // 将消息写入日志文件
+ using (StreamWriter writer = new StreamWriter(filePath2, true))
+ {
+ writer.WriteLine(logMessage);
+ }
+ }
+
+ ///
+ /// 打印错误日志方法
+ ///
+ ///
+ public static void LogErrorMessage(string errorMessage)
+ {
+ string filePath = "Mylog.txt"; // 日志文件存放路径,默认在debug目录下
+ //也可以加上时间
+ //string file=DateTime.Now+"log.txt";
+ string logMessage = $"{DateTime.Now}: {errorMessage}";//打印出现问题的时间
+ // 将错误消息写入日志文件
+ using (StreamWriter writer = new StreamWriter(filePath, true))
+ {
+ writer.WriteLine(logMessage);
+ }
+ }
+
+ private static object uiLock = new object();
+
+ private Dictionary DicStationFunction;
+ ///
+ /// 定时器-定时刷新状态和数据
+ ///
+ private System.Timers.Timer Timer_RefreshData;
+ ///
+ /// 智能电表
+ ///
+ private System.Timers.Timer ProcessMeter = null;
+ //创建委托对象
+ private Action AddAlarmDelegate;
+ //创建实时报警集合
+ private ObservableCollection actualAlarmList = new ObservableCollection();
+
+ //所有归档变量的名称l集合
+ private List varNameList;
+
+ ///
+ /// 窗体实例
+ ///
+ private static ControlCenter _instance;
+ public static ControlCenter Instance
+ {
+ get
+ {
+ lock (uiLock)
+ {
+ if (_instance == null)
+ {
+ _instance = new ControlCenter();
+ }
+ return _instance;
+ }
+ }
+ }
+
+ private ControlCenter()
+ {
+
+ GetAlarmData();
+ InitFunc();
+ IntiDevice();
+ Timer_RefreshData = new System.Timers.Timer(1000);
+ Timer_RefreshData.Elapsed += Timer_RefreshData_Elapsed;
+ Timer_RefreshData.Start();
+
+ //删除30天内日志
+ DeleteLog.Start(CommonMethods.strDeletepath);
+
+ if (!CommonMethods.IsRun)
+ {
+ CommonMethods.ResetEventRecv.Reset();
+ }
+ }
+
+
+
+
+ ///
+ /// 初始化 工位方法,添加到字典里面
+ ///
+ private void InitFunc()
+ {
+ DicStationFunction = new Dictionary();
+
+ DicStationFunction.Add("电芯进站", FeedingStation);
+ DicStationFunction.Add("NG出站", NGStation);
+ DicStationFunction.Add("电芯出站", BlankingStation);
+
+ for (int i = 0; i < CommonMethods.ChatLineCount; i++)
+ {
+ Queue doubles = new Queue();
+ CommonMethods.QPlanenessData.Add(doubles);
+ }
+ }
+ public static string devPath = Application.StartupPath + "\\Config\\Device.ini";
+ public static string groupPath = Application.StartupPath + "\\Config\\Group.xlsx";
+ public static string variablePath = Application.StartupPath + "\\Config\\Variable.xlsx";
+
+ #region PLC
+ public void IntiDevice()
+ {
+
+ //var result = GetDeviceByPath(CommonMethods.settingPath);
+ var result = LoadDevice(devPath, groupPath, variablePath);
+ if (result.IsSuccess)
+ {
+ //获取到设备对象
+ CommonMethods.plcDevice = result.Content;
+ //设置一下大小端
+ CommonMethods.plcDevice.DataFormat = (int)DataFormat.CDAB;
+ //初始化
+
+ CommonMethods.plcDevice.Init();
+ //报警处理
+ //CommonMethods.plcDevice.AlarmTriggerEvent += PlcDevice_AlarmTriggerEvent;
+ //开启多线程
+ CommonMethods.plcDevice.Cts = new CancellationTokenSource();
+ //按工位读取通信组
+ CommonMethods.ListOmronGroups = CommonMethods.plcDevice.WorkVarList;
+ //风速仪器
+ //CommonMethods.AntiDustAirSpeed = GetList(1);
+
+ //按工位读取数据线程
+ CreatePLCThread();
+ }
+ else
+ {
+ CommonMethods.AddLog(true, "加载配置文件失败:" + result.Message);
+ }
+ }
+
+ private void PlcDevice_AlarmTriggerEvent(object sender, AlarmEventArgs e)
+ {
+
+ switch (actualAlarmList.Count)
+ {
+ case 0:
+ CommonMethods.SlideAlarmText = "当前无报警";
+ break;
+ default:
+ CommonMethods.SlideAlarmText = string.Join(" ", actualAlarmList);
+ break;
+ }
+ }
+
+ #region 创建PLC线程 几个工位就几个线程
+
+ ///
+ /// 按工位读取线程
+ ///
+ private void CreatePLCThread()
+ {
+ //开启工位读取线程
+ if (CommonMethods.ListOmronGroups != null)
+ {
+ foreach (var item in CommonMethods.ListOmronGroups)
+ {
+ if (item.IsActive)
+ {
+ Thread thread = new Thread(new ParameterizedThreadStart(ReadPLCMWorkModel));
+ thread.IsBackground = true;
+ thread.Priority = ThreadPriority.Highest;
+ thread.Start(item);
+ }
+ }
+ }
+
+ //开启循环读取线程
+ Task.Run(new Action(() =>
+ {
+ PLCCommunication(CommonMethods.plcDevice);
+ }), CommonMethods.plcDevice.Cts.Token);
+
+ //开启监控焊机功率
+ //GetDataFromDatabasePower();
+ }
+ #endregion
+
+ #region 循环读取PLC工位状态
+ ///
+ /// 读取PLC循环工位
+ ///
+ ///
+ ///
+ Stopwatch sw1 = new Stopwatch();
+ Stopwatch sw3 = new Stopwatch();
+ private void ReadPLCMWorkModel(object plcModel)
+ {
+ //as 类型转换
+ Group pf = plcModel as Group;
+ bool sta = CommonMethods.IsExit;
+ while (!CommonMethods.IsExit)
+ {
+ CommonMethods.ResetEventRecv.WaitOne();
+ if (CommonMethods.IsRun)
+ {
+ if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ {
+ try
+ {
+ //开始读取信号判断
+ JYResult OpenValue = CommonMethods.PlcLink.ReadValue>(pf.VarList[0].VarAddress, Data_Type.Short);//当读取值为就执行操作
+ if (OpenValue.IsSuccess && OpenValue.Content == 1)//读取先置位
+ {
+ sw1.Restart();
+ JYResult resByte = CommonMethods.PlcLink.ReadValue>($"{pf.VarList[1].VarAddress}", Data_Type.ArrByte, Convert.ToUInt16(pf.VarList[1].OffsetOrLenght));
+ sw1.Stop();
+ CommonMethods.AddDataMonitorLog(0, $"{pf.GroupName},耗时:{sw1.Elapsed.TotalMilliseconds}ms");
+ LoggerHelp.WriteLog("循环读取PLC工位" + $"读取工位:{pf.GroupName},启动读取字节共耗时:" + sw1.Elapsed.TotalMilliseconds);
+ //置位 PLC-防止重复读取
+ CommonMethods.PlcLink.WriteInt16(pf.VarList[0].VarAddress, 2);//置位,读取进行中的标志
+
+ if (resByte == null)
+ {
+ CommonMethods.AddDataMonitorLog(0, $"上料工位:{pf.GroupName},起始地址:{pf.VarList[1].VarAddress},得到空字节数组");
+ LoggerHelp.WriteLog("循环读取PLC上料工位" + $"读取工位:{pf.GroupName},起始地址:{pf.VarList[1].VarAddress},得到空字节数组");
+ }
+ else
+ {
+ //if (DicStationFunction.TryGetValue(pf.GroupName, out var func))
+ //{
+ // func.BeginInvoke(resByte, pf, ar =>
+ // {
+ // try { func.EndInvoke(ar); }
+ // catch (Exception ex)
+ // {
+ // CommonMethods.AddLog(true, ex.Message);
+ // LogHelper.Instance.WriteEX(ex);
+ // }
+ // }, null);
+ //}
+ //// private Dictionary DicStationFunction;
+ DicStationFunction[pf.GroupName].BeginInvoke(resByte, pf, null, null);//信息解析
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ CommonMethods.AddLog(true, ex.Message);
+ LoggerHelp.WriteEX(ex);
+ }
+ }
+ Thread.Sleep(200);
+ }
+ }
+ }
+ #endregion
+
+ private void PLCCommunication(Device device)
+ {
+ while (!CommonMethods.plcDevice.Cts.IsCancellationRequested)
+ {
+ CommonMethods.ResetEventRecv.WaitOne();
+ if (CommonMethods.IsRun)
+ {
+ if (device.IsConnected)
+ {
+ //读取
+ //LogErrorMessage("Ready read 1 s");
+ JYResult result = CommonMethods.PlcLink.ReadValue>("D100", Data_Type.Short);
+ if (result.IsSuccess)
+ {
+ //if(result.Content == 0)
+ {
+ //延时2s发送心跳
+ Thread.Sleep(2000);
+ //LogErrorMessage("Ready write");
+ device.ErrorTimes = 0;
+ JYResult res = CommonMethods.PlcLink.WriteValue("D100", 1, Data_Type.Short);
+ if (!res.IsSuccess)
+ {
+ device.IsConnected = false;
+ CommonMethods.AddLog(true, "心跳写入异常:" + res.Message);
+ }
+ //LogErrorMessage("Write done");
+ }
+
+ }
+ else
+ {
+ device.ErrorTimes++;
+ //容错次数的意思是指连续多少次错误,会触发重连(连续3次)
+ if (device.ErrorTimes >= device.AllowErrorTimes)
+ {
+ device.IsConnected = false;
+ CommonMethods.AddLog(true, "PLC链接异常:" + result.Message);
+ break;
+ }
+ }
+ }
+ else
+ {
+ //判断是否为第一次连接
+ if (!device.IsFirstConnect)
+ {
+ Thread.Sleep(device.ReConnectTime);
+ CommonMethods.PlcLink.Disconnect();
+ }
+ string msg = "";
+ var result = CommonMethods.PlcLink.Connect(ref msg);
+ if (result)
+ {
+ device.IsConnected = true;
+ CommonMethods.AddLog(false, device.IsFirstConnect ? $"PLC初次连接成功{msg}" : $"PLC重新连接成功{msg}");
+ }
+ else
+ {
+ device.IsConnected = false;
+ CommonMethods.AddLog(true, device.IsFirstConnect ? "PLC初次连接失败" : "PLC重新连接失败");
+ new MsgshowTip("与PLC链接断开,请检查通讯线路!").ShowDialog();
+ }
+ }
+ //如果是第一次连接,将标志位复位
+ if (device.IsFirstConnect)
+ {
+ device.IsFirstConnect = false;
+ }
+ }
+ }
+ }
+
+
+ #region 屏蔽
+ ///
+ /// 多线程执行方法
+ ///
+ ///
+ //private void PLCCommunication(OmronDevice device)
+ //{
+ // while (!CommonMethods.plcDevice.Cts.IsCancellationRequested)
+ // {
+ // CommonMethods.ResetEventRecv.WaitOne();
+ // if (CommonMethods.IsRun)
+ // {
+ // if (device.IsConnected)
+ // {
+ // //读取
+ // foreach (var gp in device.GroupList)
+ // {
+ // if (gp.IsActive)
+ // {
+ // if (!gp.IsWorkRead)
+ // {
+ // var result = GetGroupValue(device, gp);
+ // if (result.IsSuccess)
+ // {
+ // device.ErrorTimes = 0;
+ // }
+ // else
+ // {
+ // device.ErrorTimes++;
+ // //容错次数的意思是指连续多少次错误,会触发重连
+ // if (device.ErrorTimes >= device.AllowErrorTimes)
+ // {
+ // device.IsConnected = false;
+ // CommonMethods.AddLog(true, "PLC链接异常:" + result.Message);
+ // break;
+ // }
+ // }
+ // }
+
+ // }
+ // Thread.Sleep(50);
+ // }
+ // }
+ // else
+ // {
+ // //判断是否为第一次连接
+ // if (!device.IsFirstConnect)
+ // {
+ // Thread.Sleep(device.ReConnectTime);
+ // CommonMethods.plc.DisConnect();
+ // }
+ // byte[] bytes = null;
+ // var result = CommonMethods.plc.Connect(device.IpAddress, device.Port, ref bytes);
+ // if (result)
+ // {
+ // device.IsConnected = true;
+ // CommonMethods.AddLog(false, device.IsFirstConnect ? $"PLC初次连接成功:SA1-{bytes[0]},DA1-{bytes[1]}" : $"PLC重新连接成功:SA1-{bytes[0]},DA1-{bytes[1]}");
+ // }
+ // else
+ // {
+ // device.IsConnected = false;
+ // CommonMethods.AddLog(true, device.IsFirstConnect ? "PLC初次连接失败" : "PLC重新连接失败");
+ // new MsgshowTip("与PLC链接断开,请检查通讯线路!").ShowDialog();
+ // }
+ // }
+ // //如果是第一次连接,将标志位复位
+ // if (device.IsFirstConnect)
+ // {
+ // device.IsFirstConnect = false;
+ // }
+ // }
+ // }
+ //}
+
+
+ //private void PLCCommunication(Device device)
+ //{
+ // while (!CommonMethods.plcDevice.Cts.IsCancellationRequested)
+ // {
+ // CommonMethods.ResetEventRecv.WaitOne();
+ // if (CommonMethods.IsRun)
+ // {
+ // if (device.IsConnected)
+ // {
+ // 读取
+ // foreach (var gp in device.GroupList)
+ // {
+ // if (gp.IsActive)
+ // {
+ // if (!gp.IsTiggerRead)
+ // {
+ // var result = GetHSLGroupValue(device, gp);
+ // if (result.IsSuccess)
+ // {
+ // device.ErrorTimes = 0;
+ // }
+ // else
+ // {
+ // device.ErrorTimes++;
+ // 容错次数的意思是指连续多少次错误,会触发重连
+ // if (device.ErrorTimes >= device.AllowErrorTimes)
+ // {
+ // device.IsConnected = false;
+ // CommonMethods.AddLog(true, "PLC链接异常:" + result.Message);
+ // break;
+ // }
+ // }
+ // }
+
+ // }
+ // }
+ // }
+ // else
+ // {
+ // 判断是否为第一次连接
+ // if (!device.IsFirstConnect)
+ // {
+ // Thread.Sleep(device.ReConnectTime);
+ // CommonMethods.PlcLink.Disconnect();
+ // }
+ // string msg = "";
+ // var result = CommonMethods.PlcLink.Connect(ref msg);
+ // if (result)
+ // {
+ // device.IsConnected = true;
+ // CommonMethods.AddLog(false, device.IsFirstConnect ? $"PLC初次连接成功{msg}" : $"PLC重新连接成功{msg}");
+ // }
+ // else
+ // {
+ // device.IsConnected = false;
+ // CommonMethods.AddLog(true, device.IsFirstConnect ? "PLC初次连接失败" : "PLC重新连接失败");
+ // new MsgshowTip("与PLC链接断开,请检查通讯线路!").ShowDialog();
+ // }
+ // }
+ // 如果是第一次连接,将标志位复位
+ // if (device.IsFirstConnect)
+ // {
+ // device.IsFirstConnect = false;
+ // }
+ // }
+ // }
+ //}
+
+
+
+ //private OperateResult GetHSLGroupValue(Device device, Group group)
+ //{
+ // var addResult = OmronHelper.OmronFinsAnalysisAddress(group.Start, false);
+
+ // if (addResult.IsSuccess == false) return OperateResult.CreateFailResult();
+
+ // var result = CommonMethods.PlcLink.ReadValue>(group.Start, Data_Type.ArrByte, (ushort)group.Length);
+
+ // if (result.IsSuccess && result.Content.Length == group.Length * 2)
+ // {
+ // foreach (var variable in group.VarList)
+ // {
+ // var analysis = AnalysisStartAddress(variable.Start);
+
+ // if (analysis.IsSuccess)
+ // {
+ // int start = analysis.Content1;
+ // int offset = analysis.Content2;
+
+ // start -= BitConverter.ToInt16(new byte[] { addResult.Content2[1], addResult.Content2[0], addResult.Content2[2] }, 0);
+
+ // start *= 2;
+
+ // switch (variable.DataType.ToUpper())
+ // {
+ // case "BOOL":
+ // variable.VarValue = BitLib.GetBitFrom2BytesArray(result.Content, start, offset, false);
+ // break;
+ // case "BYTE":
+ // variable.VarValue = ByteLib.GetByteFromByteArray(result.Content, start);
+ // break;
+ // case "SHORT":
+ // variable.VarValue = ShortLib.GetShortFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "USHORT":
+ // variable.VarValue = UShortLib.GetUShortFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "INT":
+ // variable.VarValue = ShortLib.GetShortFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "UINT":
+ // variable.VarValue = UIntLib.GetUIntFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "FLOAT":
+ // variable.VarValue = FloatLib.GetFloatFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "LONG":
+ // variable.VarValue = LongLib.GetLongFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "ULONG":
+ // variable.VarValue = ULongLib.GetULongFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "DOUBLE":
+ // variable.VarValue = DoubleLib.GetDoubleFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "STRING":
+ // variable.VarValue = StringLib.GetStringFromByteArrayByEncoding(result.Content, start, (int)variable.Offset * 2, Encoding.ASCII);
+ // break;
+ // case "BYTEARRAY":
+ // variable.VarValue = ByteArrayLib.GetByteArrayFromByteArray(result.Content, start, (int)variable.Offset * 2);
+ // break;
+ // default:
+ // break;
+ // }
+
+ // var operateResult = MigrationLib.GetMigrationValue(variable.VarValue, variable.Scale.ToString(), variable.Offset.ToString());
+
+ // if (operateResult.IsSuccess)
+ // {
+ // variable.VarValue = operateResult.Content;
+ // }
+ // else
+ // {
+ // variable.VarValue = null;
+ // }
+
+ // //更新报警
+ // device.Update(variable);
+ // }
+ // else
+ // {
+ // return OperateResult.CreateFailResult(analysis.Message);
+ // }
+ // }
+ // }
+ // else
+ // {
+ // CommonMethods.Statues = new List { false, false, false, false };
+ // return OperateResult.CreateFailResult($"{group.GroupName}-通信组读取失败");
+ // }
+ // return OperateResult.CreateSuccessResult();
+ //}
+
+
+ ///
+ /// 单个组通信的方法
+ ///
+ ///
+ ///
+ ///
+
+ //private OperateResult GetGroupValue(Device device, Group group)
+ //{
+ // var addResult = OmronHelper.OmronFinsAnalysisAddress(group.Start, false);
+
+ // if (addResult.IsSuccess == false) return OperateResult.CreateFailResult();
+
+ // var result = CommonMethods.plc.ReadByteArray(group.Start,(ushort)group.Length);
+
+ // if (result.IsSuccess && result.Content.Length == group.Length * 2)
+ // {
+ // foreach (var variable in group.VarList)
+ // {
+ // var analysis = AnalysisStartAddress(variable.Start);
+
+ // if (analysis.IsSuccess)
+ // {
+ // int start = analysis.Content1;
+ // int offset = analysis.Content2;
+
+ // start -= BitConverter.ToInt16(new byte[] { addResult.Content2[1], addResult.Content2[0], addResult.Content2[2] }, 0);
+
+ // start *= 2;
+
+ // switch (variable.DataType.ToUpper())
+ // {
+ // case "BOOL":
+ // variable.VarValue = BitLib.GetBitFrom2BytesArray(result.Content, start, offset, false);
+ // break;
+ // case "BYTE":
+ // variable.VarValue = ByteLib.GetByteFromByteArray(result.Content, start);
+ // break;
+ // case "SHORT":
+ // variable.VarValue = ShortLib.GetShortFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "USHORT":
+ // variable.VarValue = UShortLib.GetUShortFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "INT":
+ // variable.VarValue = ShortLib.GetShortFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "UINT":
+ // variable.VarValue = UIntLib.GetUIntFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "FLOAT":
+ // variable.VarValue = FloatLib.GetFloatFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "LONG":
+ // variable.VarValue = LongLib.GetLongFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "ULONG":
+ // variable.VarValue = ULongLib.GetULongFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "DOUBLE":
+ // variable.VarValue = DoubleLib.GetDoubleFromByteArray(result.Content, start, (DataFormat)device.DataFormat);
+ // break;
+ // case "STRING":
+ // variable.VarValue = StringLib.GetStringFromByteArrayByEncoding(result.Content, start, (int)variable.Offset * 2, Encoding.ASCII);
+ // break;
+ // case "BYTEARRAY":
+ // variable.VarValue = ByteArrayLib.GetByteArrayFromByteArray(result.Content, start, (int)variable.Offset * 2);
+ // break;
+ // default:
+ // break;
+ // }
+
+ // var operateResult = MigrationLib.GetMigrationValue(variable.VarValue, variable.Scale.ToString(), variable.Offset.ToString());
+
+ // if (operateResult.IsSuccess)
+ // {
+ // variable.VarValue = operateResult.Content;
+ // }
+ // else
+ // {
+ // variable.VarValue = null;
+ // }
+
+ // //更新报警
+ // device.Update(variable);
+ // }
+ // else
+ // {
+ // return OperateResult.CreateFailResult(analysis.Message);
+ // }
+ // }
+ // }
+ // else
+ // {
+ // CommonMethods.Statues = new List { false, false, false, false };
+ // return OperateResult.CreateFailResult($"{group.GroupName}-通信组读取失败");
+ // }
+ // return OperateResult.CreateSuccessResult();
+ //}
+
+
+ ///
+ /// 解析起始地址,获取索引 和 位偏移
+ ///
+ /// 0 1 2 10.0 10.10
+ ///
+ ///
+ //private OperateResult AnalysisStartAddress(string start, int frombase = 10)
+ //{
+ // try
+ // {
+ // if (start.Contains("."))
+ // {
+ // string[] result = start.Split('.');
+
+ // if (result.Length == 2)
+ // {
+ // return OperateResult.CreateSuccessResult(Convert.ToInt32(result[0], frombase), Convert.ToInt32(result[1]));
+ // }
+ // else
+ // {
+ // return OperateResult.CreateFailResult($"变量地址格式填写不正确:{start}");
+ // }
+ // }
+ // else
+ // {
+ // return OperateResult.CreateSuccessResult(Convert.ToInt32(start, frombase), 0);
+ // }
+ // }
+ // catch (Exception ex)
+ // {
+ // return OperateResult.CreateFailResult($"变量地址 {start} 格式填写不正确:" + ex.Message);
+ // }
+ //}
+ #endregion
+
+ #region 加载设备信息
+ private OperateResult LoadDevice(string devicepath, string groupPath, string variablePath)
+ {
+ if (!File.Exists(devicepath))
+ {
+ CommonMethods.AddLog(true, "设备文件不存在");
+ return null;
+ }
+ Device device = new Device();
+ List gpList = LoadGroup(groupPath, variablePath);
+ if (gpList != null && gpList.Count > 0)
+ {
+ try
+ {
+ device.IPAddress = IniConfigHelper.ReadIniData("设备参数", "IP地址", "127.0.0.1", devicepath);
+ device.Port = Convert.ToInt32(IniConfigHelper.ReadIniData("设备参数", "端口号", "502", devicepath));
+ device.PLCType = IniConfigHelper.ReadIniData("设备参数", "PLC类型", "OmronFinsTcp_HSL", devicepath);
+
+ CommonMethods.mesConfig.siteCode = IniConfigHelper.ReadIniData("MES配置", "工厂代码", "1");
+ CommonMethods.mesConfig.lineCode = IniConfigHelper.ReadIniData("MES配置", "产线编号", "1");
+ CommonMethods.mesConfig.equipNum = IniConfigHelper.ReadIniData("MES配置", "设备编号", "1");
+ device.GroupList = gpList;
+ return OperateResult.CreateSuccessResult(device);
+ }
+ catch (Exception ex)
+ {
+ return OperateResult.CreateFailResult("请检查配置文件是否正确");
+ }
+ }
+ else
+ {
+ return OperateResult.CreateFailResult("请检查配置是否包含欧姆龙PLC");
+ }
+ }
+
+ /////
+ ///// 通信组及通信变量的解析
+ /////
+ /////
+ /////
+ /////
+ private List LoadGroup(string groupPath, string variablePath)
+ {
+ //判断文件是否存在
+ if (!File.Exists(groupPath))
+ {
+ CommonMethods.AddLog(true, "通信组文件不存在");
+ return null;
+ }
+ if (!File.Exists(variablePath))
+ {
+ CommonMethods.AddLog(true, "通信变量文件不存在");
+ return null;
+ }
+
+ //先解析通信组
+ List GpList = null;
+ try
+ {
+ GpList = MiniExcelLibs.MiniExcel.Query(groupPath).ToList();
+ }
+ catch (Exception ex)
+ {
+ CommonMethods.AddLog(true, $"通信组加载失败:{ex.Message}");
+ return null;
+ }
+
+ List VarList = null;
+ try
+ {
+ VarList = MiniExcelLibs.MiniExcel.Query(variablePath).ToList();
+ }
+ catch (Exception ex)
+ {
+ CommonMethods.AddLog(true, $"通信变量加载失败:{ex.Message}");
+ return null;
+ }
+
+ if (GpList != null && VarList != null)
+ {
+ foreach (var group in GpList)
+ {
+ group.VarList = VarList.FindAll(c => c.GroupName == group.GroupName).ToList();
+ }
+ return GpList;
+ }
+ else
+ {
+ return null;
+ }
+ }
+ #endregion
+
+ #region 屏蔽
+ ///
+ /// 读取配置文件,返回设备对象
+ ///
+ ///
+ ///
+ ///
+ //private OperateResult GetDeviceByPath(string path)
+ //{
+ // List projects = new ConfigManage().LoadProjects(path);
+
+ // if (projects != null && projects.Count >= 1)
+ // {
+ // Project project = projects[0];
+
+ // if (project.OmronList.Count > 0)
+ // {
+ // var device = project.OmronList[0];
+
+ // if (device.IsActive)
+ // {
+ // return OperateResult.CreateSuccessResult(device);
+ // }
+ // else
+ // {
+ // return OperateResult.CreateFailResult("请检查配置是否激活");
+ // }
+ // }
+ // else
+ // {
+ // return OperateResult.CreateFailResult("请检查配置是否包含欧姆龙PLC");
+ // }
+ // }
+ // else
+ // {
+ // return OperateResult.CreateFailResult("请检查配置文件是否正确");
+ // }
+
+ //}
+ #endregion
+
+ #endregion
+
+ #region 定时刷新数据
+
+ int TotalNum = 0;
+ int Regular = 0;
+
+ bool firstFresh = false;
+ bool freshed = false;
+ private void Timer_RefreshData_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
+ {
+ var nowDate = DateTime.Now;
+
+ if (Regular >= 300)
+ {
+ Task.Run(() =>
+ {
+ UploadEquEnergy();//电表
+ //UPloadAnemograph();//风速仪
+ });
+ Regular = 0;
+ }
+ if (TotalNum > 4)
+ {
+ GetEnergyData();
+ Refresh12HourProdQty();
+ GetDefectTypeQty();
+ ReadPLCComm();
+ //ClearNGData0();
+ GetASqlAlarmData(DateTime.Today, CommonMethods.strClass);
+ TotalNum = 0;
+ }
+ else if (TotalNum == 2)//设备状态读取
+ {
+ SetClass(); //变更班次
+ }
+
+ Task.Run(() =>
+ {
+ if (CommonMethods.plcDevice.IsConnected)
+ {
+ //PingEMCLink();
+ }
+ ShowStateEven_Run();
+ });
+
+
+ TotalNum++;
+ Regular++;
+ }
+ #endregion
+
+ #region 服务器连接状态检测
+ ///
+ /// 服务器连接状态检测
+ ///
+ bool isNgral = false;
+ //private void PingEMCLink()
+ //{
+ // try
+ // {
+ // string ipAddress = CommonMethods.mesConfig.RotueServerIP; // 要 ping 的 IP 地址
+
+ // Ping pingSender = new Ping();
+ // PingReply reply = pingSender.Send(ipAddress);
+
+ // if (reply.Status == IPStatus.Success)
+ // {
+ // CommonMethods.EMCStatues = true;
+
+ // if (!isNgral)
+ // {
+ // if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ // {
+ // JYResult result = CommonMethods.PlcLink.WriteValue("D80", 0, Data_Type.Short);//反馈PLC结果
+ // }
+ // CommonMethods.AddDataMonitorLog(0, $"服务器连接成功!");
+ // LogHelper.Instance.WriteLog($"服务器连接成功!");
+ // isNgral = true;
+ // }
+ // }
+ // else
+ // {
+ // CommonMethods.EMCStatues = false;
+ // if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ // {
+ // JYResult result = CommonMethods.PlcLink.WriteValue("D80", 1, Data_Type.Short);//反馈PLC结果
+ // }
+ // //CommonMethods.AddDataMonitorLog(1, $"服务器连接失败!解决办法:1、请检查MES网络,2、查看服务器是否正常!");
+ // LogHelper.Instance.WriteError($"服务器连接失败!", "系统报错");
+ // isNgral = true;
+ // //new MsgshowTip("与数据服务器链接断开!\n请检查MES网络或存储服务器!").ShowDialog();
+ // }
+
+ // }
+ // catch (Exception ex)
+ // {
+ // CommonMethods.EMCStatues = false;
+ // if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ // {
+ // JYResult result = CommonMethods.PlcLink.WriteValue("D80", 1, Data_Type.Short);//反馈PLC结果
+ // }
+
+ // //CommonMethods.AddDataMonitorLog(1, $"服务器连接失败!解决办法:1、请检查MES网络,2、查看服务器是否正常!");
+ // LogHelper.Instance.WriteError($"服务器连接失败!{ex}", "系统报错");
+ // isNgral = false;
+ // //new MsgshowTip("与数据服务器链接断开!\n请检查MES网络或存储服务器!").ShowDialog();
+ // }
+
+ //}
+ #endregion
+
+
+ #region 设备综合信息
+ ///
+ /// 读取PLC通用信息
+ ///
+ internal void ReadPLCComm()
+ {
+ if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ {
+ Task.Run(() =>
+ {
+ UpTotalCount(null);
+ });
+
+ CommonMethods.TotalQty = CommonMethods.PlcLink.ReadInt32("D15");//生产总数
+ CommonMethods.ProOKQty = CommonMethods.PlcLink.ReadInt32("D17");//良品总数
+
+ CommonMethods.Ppm = CommonMethods.PlcLink.ReadInt32("D13");
+ //CommonMethods.JiaDL = Convert.ToDouble(CommonMethods.PlcLink.ReadFloat("D11").ToString("F2"))/100;
+ CommonMethods.JiaDL = Convert.ToDouble(CommonMethods.PlcLink.ReadInt32("D11").ToString("F2")) / 100;
+
+ #region 开机时间/运行时间
+ CommonMethods.PlcOpenAndRunTime = GetList(6, 0);
+ JYResult resByte = CommonMethods.PlcLink.ReadValue>($"D50", Data_Type.ArrByte, 12);
+ if (resByte.IsSuccess)
+ {
+ for (int i = 0; i < CommonMethods.PlcOpenAndRunTimeAdress.Count; i++)
+ {
+ CommonMethods.PlcOpenAndRunTime[i] = ShortLib.GetShortFromByteArray(resByte.Content, i * 4, DataFormat.CDAB);
+ }
+ }
+ #endregion
+ }
+
+ }
+ #endregion
+
+ #region 保存12小时产能数据
+ public int totalNum = 0; // 总数
+ public int okNum = 0; // 良品数
+
+ ///
+ /// 储存数据到数据库
+ ///
+ ///
+ public void UpTotalCount(int[] DataCount)
+ {
+ string strErr = "";
+ DateTime dateTime = DateTime.Now;
+ string strDate = dateTime.ToString("yyyy-MM-dd");
+ int Min = dateTime.Minute;
+ int Hour = dateTime.Hour;
+ if (Min < 30)
+ {
+ Hour -= 1;
+ }
+ if (dateTime.Hour < 30 && dateTime.Hour == 0)
+ {
+ Hour = 0;
+ }
+
+ //读取PLC投入总数
+ int ProdCurrAllQty = GetToDayHourQty(Hour, true);
+ //读取PLC产出数
+ int ProdCurrOKQty = GetToDayHourQty(Hour, false);
+ Hourprod mh = new Hourprod();
+
+ mh.FDate = strDate;
+ mh.FHour = Hour;
+ mh.ProdIn = ProdCurrAllQty;
+ mh.ProdOut = ProdCurrOKQty;
+ mh.TestTime = DateTime.Now;
+ mh.Ppm = CommonMethods.Ppm;
+ mh.JiaDL = Convert.ToDecimal(CommonMethods.JiaDL);
+
+ //更新
+ int res = CommonMethods.db.UpdateSingle(mh, it => new Hourprod() { ProdIn = mh.ProdIn, ProdOut = mh.ProdOut, TestTime = DateTime.Now, Ppm = mh.Ppm, JiaDL = mh.JiaDL, },
+ it => it.FDate == mh.FDate && it.FHour == mh.FHour);
+ if (res <= 0) //更新失败就新增保存
+ {
+ CommonMethods.db.AddReturnBool(mh);
+ }
+ #region 屏蔽
+ // DateTime now = DateTime.Now;
+ // string day = now.ToString("yyyy-MM-dd HH:mm:ss");
+ // int Hour = 0;
+
+
+ // CommonMethods.LastHour = Convert.ToInt32(IniConfigHelper.ReadIniData("统计计数", "LastHour", "false"));
+ // CommonMethods.LastResetTime = IniConfigHelper.ReadIniData("统计计数", "LastResetTime", "false");
+ // CommonMethods.LastTotalNum = Convert.ToInt32(IniConfigHelper.ReadIniData("统计计数", "LastTotalOldNum", "false"));
+ // CommonMethods.LastOkNum = Convert.ToInt32(IniConfigHelper.ReadIniData("统计计数", "LastOkOldNum", "false"));
+
+
+ // if (now.Minute == 30 && (now.Second >= 0 && now.Second <= 3) && day != CommonMethods.LastResetTime)
+ // {
+ // // 每小时的0分0秒重置计数
+ // totalNum = 0;
+ // okNum = 0;
+ // CommonMethods.LastTotalNum = DataCount[0];
+ // CommonMethods.LastOkNum = DataCount[1];
+ // CommonMethods.LastResetTime = day;
+ // CommonMethods.LastHour = now.Hour;
+ // Hour = Convert.ToInt32($"{now.Hour}30");
+
+ // IniConfigHelper.WriteIniData("统计计数", "LastHour", CommonMethods.LastHour.ToString());
+ // IniConfigHelper.WriteIniData("统计计数", "LastResetTime", CommonMethods.LastResetTime);
+ // IniConfigHelper.WriteIniData("统计计数", "LastTotalOldNum", CommonMethods.LastTotalNum.ToString());
+ // IniConfigHelper.WriteIniData("统计计数", "LastOkOldNum", CommonMethods.LastOkNum.ToString());
+ // }
+ // else
+ // {
+ // // 读取PLC的数据(模拟数据)
+ // int[] productionData = DataCount;
+ // // 统计生产总数和良品数
+ // int newTotalNum = productionData[0] - CommonMethods.LastTotalNum;
+ // int newOkNum = productionData[1] - CommonMethods.LastOkNum;
+ // totalNum = newTotalNum;
+ // okNum = newOkNum;
+ // Hour = GetHour();
+ // // 计算百分比良率
+ // }
+
+ // Hourprod hourprod = new Hourprod();
+ // hourprod.FDate = now.Date.ToString("yyyy-MM-dd");
+ // hourprod.FHour = Hour;
+ // hourprod.ProdIn = totalNum;
+ // hourprod.ProdOut = okNum;
+ // hourprod.TestTime = now;
+
+ // //更新
+ // int res = CommonMethods.db.UpdateSingle(hourprod, it => new Hourprod() { ProdIn = hourprod.ProdIn, ProdOut = hourprod.ProdOut, TestTime = DateTime.Now },
+ // it => it.FDate == hourprod.FDate && it.FHour == hourprod.FHour);
+ // if (res == 0) //更新失败就新增保存
+ // {
+ // CommonMethods.db.AddReturnBool(hourprod);
+ // }
+ #endregion
+
+ }
+
+
+ ///
+ /// 每小时产能读取处理
+ ///
+ ///
+ ///
+ ///
+ private int GetToDayHourQty(int hour, bool flag)
+ {
+ try
+ {
+ string strAddr = "";
+
+ if (flag)//产出
+ {
+ //strAddr = "D" + (1032 + hour);
+ //1257
+ strAddr = "D" + (1040 + hour);
+ }
+ else//良品数
+ {
+ // strAddr = "D" + (1062 + hour);
+ //1257
+ strAddr = "D" + (1070 + hour);
+ }
+ int ProdNGQty = CommonMethods.PlcLink.ReadInt16(strAddr);
+ return ProdNGQty;
+
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand);
+ }
+ return 0;
+ }
+
+ #endregion
+
+ #region 5、设备状态
+ ///
+ /// 定时获取设备状态
+ ///
+ ///
+ ///
+ int OldStatues = CommonMethods.mesConfig.DeviceState; //默认状态是上一次退出程序是保存的状态
+ int StatuesCount = 0;
+ DateTime StatuesBeginTime = DateTime.Now.AddMinutes(-6); //默认时间是6分钟前,第一次获取状态时上传设备状态,不赋默认值,第一次打开程序会导致时间为空,首次启动不上传设备状态
+ bool isNewGuid = false;
+ string strGuidAlarm = CommonMethods.mesConfig.guidStr; //默认guid是上次退出程序保存的guid
+
+ bool isUpIdle = false;
+ List AlarmDataTeam = new List();
+ bool run_AlarmMark = CommonMethods.mesConfig.m_run_AlarmMark;
+ bool run_IdleMark = CommonMethods.mesConfig.m_run_IdelMark;
+ private void ShowStateEven_Run()
+ {
+ try
+ {
+ #region 上传设备状态
+ //设备状态 。Run:(正常运行)、Alert:(故障调试)、Idle:(闲置待机)、Maintain(停止运行)
+ //先确定设备是在自动还是手动状态下
+ if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ {
+ string Date = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
+ bool isUpload = false;
+ string deviceStatus = string.Empty;
+ string deviceStatusDesc = string.Empty;
+ string strGuid = string.Empty;
+ short NewStatus = 100;
+ NewStatus = CommonMethods.PlcLink.ReadInt16("D10");
+ if (NewStatus != 100)
+ {
+ //新状态:故障,旧状态:正常
+ if (NewStatus == 3 && OldStatues == 1)
+ {
+ run_AlarmMark = true;
+ IniConfigHelper.WriteIniData("MES配置", "run_AlarmMark", "1");
+ } //第一次进入报警状态,把报警标志位true
+ //新状态:正常
+ if (NewStatus == 1)
+ {
+ run_AlarmMark = false;
+ IniConfigHelper.WriteIniData("MES配置", "run_AlarmMark", "0");
+ } //如果状态变为允许,把报警标志位false
+ if (run_AlarmMark)
+ {
+ NewStatus = 3;
+ } //有报警标志位,状态一直都是报警,直到下一次状态为运行
+
+ if (NewStatus == 4 && OldStatues == 1)
+ {
+ run_IdleMark = true;
+ IniConfigHelper.WriteIniData("MES配置", "run_IdleMark", "1");
+ } //第一次进入闲置状态,把闲置标志位true
+ if (NewStatus == 1)
+ {
+ run_IdleMark = false;
+ IniConfigHelper.WriteIniData("MES配置", "run_IdleMark", "0");
+ } //如果状态变为允许,把闲置标志位false
+ if (run_IdleMark)
+ {
+ NewStatus = 4;
+ } //有闲置标志位,状态一直都是闲置,直到下一次状态为运行
+
+ if (isUpIdle)
+ {
+ foreach (var item in AlarmDataTeam)
+ {
+ UpIdleData(item);
+ }
+ isUpIdle = false;
+ AlarmDataTeam.Clear();
+ }
+
+
+ // 判断是否需要上传设备状态
+ if (NewStatus != OldStatues)
+ {
+ LogMessage("OldStatues: " + OldStatues + "; NewStatus: " + NewStatus + "上传的GUID:" + strGuidAlarm, "设备状态改变日志");
+ if (OldStatues == 3 && NewStatus != 3)
+ {
+ ShowAlarmEven_Run(strGuidAlarm);
+ }
+ OldStatues = NewStatus;
+ alarmStartDate = "";
+ isRead = false;
+ isUpload = true;
+ StatuesBeginTime = Convert.ToDateTime(Date);
+ strGuidAlarm = Guid.NewGuid().ToString();
+
+ //当设备状态发生变化,保存【设备状态和guid】到本地配置文件,下次电脑重启时读取上一次设备状态和guid
+ IniConfigHelper.WriteIniData("MES配置", "guid", strGuidAlarm.Trim());
+ IniConfigHelper.WriteIniData("MES配置", "DeviceState", OldStatues.ToString());
+ }
+ else
+ {
+ if (Convert.ToDateTime(Date).Subtract(StatuesBeginTime).TotalSeconds >= 5 * 60) //时间间隔大雨5分钟
+ {
+ isUpload = true;
+ StatuesBeginTime = DateTime.Now;
+ }
+
+ //if (Convert.ToDateTime(Date).Subtract(StatuesBeginTime).TotalSeconds > 5 * 60)
+ //{
+ // isUpload = true;
+ // StatuesBeginTime = DateTime.Now;
+ //}
+ }
+ switch (NewStatus)
+ {
+ case 1:
+
+ CommonMethods.Statues = new List { true, false, false, false };
+ deviceStatus = "Run";
+ deviceStatusDesc = "正常运行";
+
+ if (isUpload)
+ {
+ CommonMethods.AddLog(false, "正常运行");
+ }
+ break;
+ //case 2:
+ // CommonMethods.Statues = new List { false, true, false, false };
+ // deviceStatus = "Maintain";
+ // deviceStatusDesc = "停止运行";
+ // if (isUpload)
+ // {
+ // CommonMethods.AddLog(false, "停止运行");
+
+ // }
+
+ // break;
+ case 3:
+ CommonMethods.Statues = new List { false, false, true, false };
+ deviceStatus = "Alert";
+ deviceStatusDesc = "故障调试";
+ if (isUpload)
+ {
+ CommonMethods.AddLog(false, "故障调试");
+
+ }
+
+ Task.Run(() =>
+ {
+ ShowAlarmEven_Run(strGuidAlarm);
+ });
+ break;
+ case 4:
+ CommonMethods.Statues = new List { false, false, false, true };
+ deviceStatus = "Idle";
+ deviceStatusDesc = "闲置待机";
+
+ Task.Run(() =>
+ {
+ ShowStuesEven_Run(Date, strGuidAlarm);
+ });
+ if (isUpload)
+ {
+ CommonMethods.AddLog(false, "闲置待机");
+ }
+
+ break;
+ default:
+ break;
+ }
+
+ if (CommonMethods.sysConfig.MesModeSwitching)
+ {
+ if (isUpload && (NewStatus == 1 || NewStatus == 3 || NewStatus == 4))//|| NewStatus == 2
+ {
+ MESDataCombin.EqpStatusParam(deviceStatus, Date, strGuidAlarm, null);
+
+ StatuesBeginTime = DateTime.Now;
+ }
+ }
+ }
+ }
+ #endregion
+ }
+ catch (Exception ex)
+ {
+ LoggerHelp.WriteEX(ex);
+ }
+ }
+
+ #region 触摸屏弹窗
+ private void ShowStuesEven_Run(string Date, string strGuid)
+ {
+ if (CommonMethods.plcDevice.IsConnected)
+ {
+ string strCode = "";
+ string strText = "";
+ short HMIStatus = CommonMethods.PlcLink.ReadInt16("D40");
+ if (HMIStatus != 0)
+ {
+ CommonMethods.AddDataMonitorLog(0, "触发了手动HMI弹窗功能!");
+ switch (HMIStatus) //注意:B1-D12都为闲置代码,上传代码是只需上传闲置代码
+ {
+ case 1:
+ strCode = "B1";
+ CommonMethods.AddDataMonitorLog(0, "B1 计划维护");
+
+ break;
+ case 2:
+ strCode = "B2";
+ CommonMethods.AddDataMonitorLog(0, "B2 无计划生产");
+ break;
+ case 3:
+ strCode = "B3";
+ CommonMethods.AddDataMonitorLog(0, "B3 样品测试");
+ break;
+ case 4:
+ strCode = "B4";
+ CommonMethods.AddDataMonitorLog(0, "B4.其他计划停机");
+ break;
+ case 5:
+ strCode = "D1";
+ CommonMethods.AddDataMonitorLog(0, "D1 设备故障");
+ break;
+ case 6:
+ strCode = "D2";
+ CommonMethods.AddDataMonitorLog(0, "D2.设备换型");
+ break;
+ case 7:
+ strCode = "D3";
+ CommonMethods.AddDataMonitorLog(0, "D3 工程变更");
+ break;
+ case 8:
+ strCode = "D4";
+ CommonMethods.AddDataMonitorLog(0, "D4.MES停机");
+ break;
+ case 9:
+ strCode = "D5";
+ CommonMethods.AddDataMonitorLog(0, "D5.来料异常");
+ break;
+ case 10:
+ strCode = "D6";
+ CommonMethods.AddDataMonitorLog(0, "D6.选择配件/物料异常");
+ break;
+ case 11:
+ strCode = "D7";
+ CommonMethods.AddDataMonitorLog(0, "D7.来料不良");
+ break;
+ case 12:
+ strCode = "D8";
+ CommonMethods.AddDataMonitorLog(0, "D8.待料");
+ break;
+ case 13:
+ strCode = "D9";
+ CommonMethods.AddDataMonitorLog(0, "D9.品质检查");
+ break;
+ case 14:
+ strCode = "D10";
+ CommonMethods.AddDataMonitorLog(0, "D10.清洁检点");
+ break;
+ case 15:
+ strCode = "D11";
+ CommonMethods.AddDataMonitorLog(0, "D11.环境不足");
+ break;
+ case 16:
+ strCode = "D12";
+ CommonMethods.AddDataMonitorLog(0, "D12.非计划停机");
+ break;
+ default:
+ break;
+ }
+
+ if (CommonMethods.mesConfig.isUpMes)
+ {
+ AlarmData alarmData = new AlarmData();
+ alarmData.AlarmCode = strCode;
+ alarmData.StartTime = Date;
+ alarmData.EndTime = "";
+ alarmData.AlarmType = "非计划损失";
+ alarmData.AlarmContent = strText;
+ alarmData.AlarmGuid = strGuid;
+
+ AlarmDataTeam.Add(alarmData);
+ isUpIdle = true;
+ string resJson = MESDataCombin.EquAlarm(alarmData, 0);
+ var result = JsonConvert.DeserializeObject(resJson);
+ if (result.success)
+ CommonMethods.AddDataMonitorLog(0, $"HMI手动弹窗状态开始已上传成功,代码:{strCode}");
+ bool IsSuccesss = CommonMethods.PlcLink.WriteInt16("D40", 0);
+ if (IsSuccesss)
+ CommonMethods.AddDataMonitorLog(0, $"D40已复位0");
+ }
+ else
+ {
+ CommonMethods.AddDataMonitorLog(0, $"MES未在线,HMI手动弹窗状态未上传,代码:{strCode}");
+ bool IsSuccesss = CommonMethods.PlcLink.WriteInt16("D40", 0);
+ if (IsSuccesss) { CommonMethods.AddDataMonitorLog(0, $"D40已复位0"); }
+ else { CommonMethods.AddDataMonitorLog(0, $"D40未复位0"); }
+ }
+ }
+ }
+ }
+ #endregion
+
+ private void UpIdleData(AlarmData alarmData)
+ {
+ if (alarmData == null) { return; }
+ alarmData.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+
+ string resJson = MESDataCombin.EquAlarm(alarmData, 0);
+ var result = JsonConvert.DeserializeObject(resJson);
+ if (result.success)
+ CommonMethods.AddDataMonitorLog(0, $"HMI手动弹窗状态结束已上传成功,代码:{alarmData.AlarmCode}");
+ }
+ #endregion
+
+ #region 6、设备报警
+ //报警表单数据
+ List listAlarmForm = null;
+ public void GetAlarmData()
+ {
+ //加载PLC报警文件
+ try
+ {
+ string strFileName = System.Environment.CurrentDirectory + "\\欧姆龙报警寄存器对应表.csv";
+ listAlarmForm = CSVHelper.ReadCSV(strFileName);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("加载报警文件失败!");
+ }
+
+ }
+
+ ///
+ /// 报警信息读取
+ ///
+ ///
+ ///
+ List listOld = new List();
+ List listNew = new List();
+ List listAlarmStatus = null;
+ string alarmStartDate = "";
+ int AlarmCount = 0;
+ string strAllAlarm = "";
+ bool isRead = false;
+ private void ShowAlarmEven_Run(string strGuidAlarm)
+ {
+ if (CommonMethods.IsRun && CommonMethods.plcDevice.IsConnected)
+ {
+ //StringBuilder sb = new StringBuilder();
+ listNew.Clear();
+ string Date = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
+ JYResult resByte = CommonMethods.PlcLink.ReadValue>("D10010", Data_Type.ArrByte, 500);
+ if (resByte.IsSuccess && resByte != null)
+ {
+ if (resByte == null) { return; }
+ //如果未配置报警地址信息返回 TODO
+ if (listAlarmForm == null) { return; }
+ int startPlcAddr = 10010;//TODO 读取起始地址
+ //3.公用方法解析byte[]数据 => List
+ if (resByte == null) { return; } //如果未配置报警地址信息返回
+ //TODO 切换三菱和欧姆龙
+ listAlarmStatus = PLCAlarmParseHelper.OmronFinsByte2Status(startPlcAddr, resByte.Content);
+ //4.判定有不良后,关联AlarmStatus 和AlarmForm
+ if (listAlarmStatus == null) { return; } //状态信息为空返回
+ //如果有报警,获取报警信息
+ if (listAlarmStatus.Any(p => p.Status))
+ {
+ //关联表单数据和报警记录,获取报警信息
+ listNew = listAlarmStatus
+ .Where(s => s.Status)
+ .Join(listAlarmForm
+ , s => s.PLCAdress
+ , f => f.PLCAdress
+ , (s, f) => new AlarmData()
+ {
+ AlarmGuid = strGuidAlarm,
+ PLCAdress = s.PLCAdress,
+ AlarmCode = f.AlarmCode,
+ AlarmContent = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent,
+ AlarmType = "停机报警",
+ AlarmDesc = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent,
+ AlarmState = "1",
+ StartTime = Date,
+ EndTime = Date,
+ Flag = 0
+ }).ToList();
+ }
+
+ string strAlarm = "";
+ //添加新的报警信息
+ if (listNew.Count > 0)
+ {
+ if (!isRead)
+ {
+ alarmStartDate = Date;
+ isRead = true;
+ }
+
+ strAllAlarm = "";
+ listNew.ForEach(r =>
+ {
+ strAllAlarm += $"{r.AlarmContent},";
+
+ var alarmLog = listOld.FirstOrDefault(o => o.PLCAdress == r.PLCAdress);
+ if (alarmLog == null)
+ {
+ listOld.Add(r);
+ //上传报警
+ if (CommonMethods.sysConfig.MesModeSwitching)
+ {
+ //上传报警
+ MESDataCombin.EquAlarm(r, 1);
+ }
+ //显示报警信息
+ CommonMethods.ShowAlarmLog(r.AlarmContent);
+ }
+ });
+ }
+
+ //显示报警信息
+ //strAlarm = sb.ToString();
+ if (strAllAlarm != "")
+ {
+ CommonMethods.SlideAlarmText = strAllAlarm.Substring(0, strAllAlarm.Length - 1);
+ }
+
+ //移除已经消除的报警信息
+ var saveAlarmData = new List();
+ var listOldAlarm = new List();
+ listOldAlarm.AddRange(listOld);
+ if (listOldAlarm.Count > 0)
+ {
+ foreach (var item in listOldAlarm)
+ {
+ var alarmLog = listNew.FirstOrDefault(n => n.PLCAdress == item.PLCAdress);
+ if (alarmLog == null)
+ {
+ item.EndTime = Date;
+ saveAlarmData.Add(item);
+ listOld.Remove(item);
+ }
+ }
+ }
+
+ if (saveAlarmData.Count > 0)
+ {
+ string strALLAlarm = "";
+ //写csv文件
+ var nowDate = DateTime.Now;
+ string basePath = $@"{CommonMethods.strAlarmLogspath}\{DateTime.Now.Year}\{DateTime.Now.Month}";
+ string fileName = $@"{nowDate.Day}.csv";
+ string title = "GUID,报警地址,故障代码,报警内容,开始时间,结束时间,是否停机";
+ string alarmContent = string.Empty;
+
+ List faultCodeLists = new List();
+ foreach (var m in saveAlarmData)
+ {
+ FaultCodeList item = new FaultCodeList();
+ item.faultCode = m.AlarmCode;
+ faultCodeLists.Add(item);
+ alarmContent += $"{m.AlarmGuid},{m.PLCAdress},{m.AlarmCode},{m.AlarmContent},{m.StartTime},{m.EndTime},{m.AlarmType}\n";
+ strALLAlarm += $"{m.AlarmContent},";
+
+ //上传报警
+ if (CommonMethods.sysConfig.MesModeSwitching)
+ {
+ //上传报警
+ MESDataCombin.EquAlarm(m, 0);
+ }
+ }
+
+ alarmContent = alarmContent.Substring(0, alarmContent.Length - 1);
+ CSVHelper.WriterCSV(basePath, fileName, title, alarmContent);
+
+ // 上传消除的报警信息
+ if (CommonMethods.sysConfig.MesModeSwitching)
+ {
+ //上传设备报警状态
+ MESDataCombin.EqpStatusParam("Alert", string.IsNullOrEmpty(alarmStartDate) ? Date : alarmStartDate, strGuidAlarm, faultCodeLists);
+ }
+ //报警保存
+ SaveAlarmCount(saveAlarmData);
+ }
+ }
+ }
+ }
+
+
+ ///
+ /// 报警保存
+ ///
+ private void SaveAlarmCount(List alarmDatas)
+ {
+ bool ISAdd = false;
+ var recordToUpdate = new AlarmCountEntry();
+
+ DateTime today = DateTime.Today;
+ DateTime upTime = DateTime.Now;
+ var listAlarmStatistics = CommonMethods.db.QueryWhereList(it => Convert.ToDateTime(it.AlarmTime.ToString("yyyy-MM-dd")) == today);
+ List fd = new List();
+ if (listAlarmStatistics != null)
+ {
+ alarmDatas.ForEach(r =>
+ {
+ recordToUpdate = listAlarmStatistics.FirstOrDefault(x => x.PLCAdress.Trim() == r.PLCAdress);
+ if (recordToUpdate != null)
+ {
+ CommonMethods.db.Update(it => it.AlarmCount == it.AlarmCount + 1, it => it.PLCAdress == r.PLCAdress && Convert.ToDateTime(it.AlarmTime.ToString("yyyy-MM-dd")) == today);
+ }
+ else
+ {
+ ISAdd = true;
+ AlarmCountEntry alarm = new AlarmCountEntry();
+ alarm.PLCAdress = r.PLCAdress;
+ alarm.AlarmContent = r.AlarmContent;
+ alarm.AlarmCount = 1;
+ alarm.Class = CommonMethods.strClass;
+ alarm.AlarmTime = upTime;
+ fd.Add(alarm);
+ }
+
+ });
+ if (ISAdd)
+ {
+ bool res = CommonMethods.db.AddReturnBool(fd);
+
+ ISAdd = false;
+ }
+
+ }
+ else
+ {
+ foreach (var m in listNew)
+ {
+ AlarmCountEntry alarm = new AlarmCountEntry();
+ alarm.PLCAdress = m.PLCAdress;
+ alarm.AlarmContent = m.AlarmContent;
+ alarm.AlarmCount = 1;
+ alarm.Class = CommonMethods.strClass;
+ alarm.AlarmTime = today;
+ fd.Add(alarm);
+ }
+ CommonMethods.db.AddReturnBool(fd);
+ }
+
+
+ GetASqlAlarmData(DateTime.Today, CommonMethods.strClass);
+ }
+
+
+ ///
+ /// 读取数据库报警信息
+ ///
+ ///
+ ///
+ public void GetASqlAlarmData(DateTime today, string strClass)
+ {
+ try
+ {
+ List chartAlarms = new List();
+ List AlarmDatas = null;
+ List List_X = new List();
+ List List_Y = new List();
+
+ DateTime baiClassStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 8:30:00"));
+ DateTime baiClassEnd = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 20:29:59"));
+
+ DateTime yeClassStart = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 20:30:00"));
+ DateTime yeClassEnd = Convert.ToDateTime(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd 8:29:59"));
+
+
+ if (strClass == "全天")
+ {
+ AlarmDatas = CommonMethods.db.QueryList("AlarmCount", 10, it => Convert.ToDateTime(it.AlarmTime.ToString("yyyy-MM-dd")) == today);
+ }
+ else if (strClass == "白班")
+ {
+ AlarmDatas = CommonMethods.db.QueryList("AlarmCount", 10, it => it.AlarmTime >= baiClassStart && it.AlarmTime <= baiClassEnd && it.Class == strClass);
+ }
+ else
+ {
+ AlarmDatas = CommonMethods.db.QueryList("AlarmCount", 10, it => it.AlarmTime >= yeClassStart && it.AlarmTime <= yeClassEnd && it.Class == strClass);
+
+ }
+
+ if (AlarmDatas != null && AlarmDatas.Count > 0)
+ {
+
+ for (int i = 0; i < AlarmDatas.Count; i++)
+ {
+ chartAlarms.Add(new ChartDataType()
+ {
+ DataType = AlarmDatas[i].AlarmContent,
+ DataCount = (int)AlarmDatas[i].AlarmCount
+ });
+ }
+
+
+
+ CommonMethods.Lst_AlarmTop10_Qty = chartAlarms;
+ }
+ else
+ {
+ CommonMethods.Lst_AlarmTop10_Qty = null;
+ }
+ }
+ catch (Exception)
+ {
+
+ }
+ }
+
+ #endregion
+
+ #region 获取白夜班次
+ bool qiehuan = false;
+ bool Yeqiehuan = false;
+ private void SetClass()
+ {
+ try
+ {
+ var nowDate = DateTime.Now;
+ string strClass = "";
+ DateTime time1 = Convert.ToDateTime($"{nowDate.ToShortDateString()} {CommonMethods.ChangeClassTime}");
+ DateTime time2 = Convert.ToDateTime($"{nowDate.ToShortDateString()} {Convert.ToDateTime(CommonMethods.ChangeClassTime).AddHours(12).ToString("HH:mm:ss")}");
+ if (nowDate <= time1 && nowDate >= time2)
+ {
+ Yeqiehuan = false;
+ if (CommonMethods.plcDevice.IsConnected)
+ {
+ if (!qiehuan)
+ {
+ if (!SetPlcTime())
+ {
+ CommonMethods.AddLog(true, $"PC写入PLC时间失败!");
+ }
+ else
+ {
+ qiehuan = true;
+ CommonMethods.AddLog(false, "PC写入PLC时间成功!");
+ }
+ }
+ }
+ strClass = "白班";
+ }
+ else
+ {
+ qiehuan = false;
+ if (!Yeqiehuan || (nowDate.Hour == 0 && nowDate.Minute == 0 && nowDate.Second > 45))
+ {
+ if (!SetPlcTime())
+ {
+ CommonMethods.AddLog(true, $"PC写入PLC时间失败!");
+ }
+ else
+ {
+ Yeqiehuan = true;
+ CommonMethods.AddLog(false, "PC写入PLC时间成功!");
+ }
+ }
+ strClass = "夜班";
+ }
+ CommonMethods.strClass = strClass;
+ }
+ catch (Exception ex)
+ {
+ CommonMethods.AddLog(true, "设备状态" + ex.Message);
+ LoggerHelp.WriteEX(ex);
+ }
+ }
+ #endregion
+
+ #region 写入PLC时间
+ ///
+ /// 写当前时间给PLC
+ ///
+ private bool SetPlcTime()
+ {
+ var nowDate = DateTime.Now;
+ int nowSec = nowDate.Second;
+ while (nowSec == nowDate.Second)
+ nowDate = DateTime.Now;
+ string yearStr = nowDate.Year.ToString();
+
+ //byte year = ByteLib.GetByteFromByteArray(Encoding.UTF8.GetBytes(yearStr), 1);
+ //byte month = ByteLib.GetByteFromByteArray(Encoding.UTF8.GetBytes(nowDate.Month.ToString("00")), 0);
+ //byte day = ByteLib.GetByteFromByteArray(Encoding.UTF8.GetBytes(nowDate.Day.ToString("00")), 0);
+ //byte hour = ByteLib.GetByteFromByteArray(Encoding.UTF8.GetBytes(nowDate.Hour.ToString("00")), 0);
+ //byte minute = ByteLib.GetByteFromByteArray(Encoding.UTF8.GetBytes(nowDate.Minute.ToString("00")), 0);
+ //byte second = ByteLib.GetByteFromByteArray(Encoding.UTF8.GetBytes(nowDate.Second.ToString("00")), 0);
+ //byte week = ByteLib.GetByteFromByteArray(Encoding.UTF8.GetBytes(nowDate.DayOfWeek.ToString("00")), 0);
+
+
+ //List byteList = new List {
+ // // FinsTcp Header
+ // 0x46, 0x49, 0x4E, 0x53, // FINS Ascii编码
+ // 0x00,0x00,0x00,0x1B, // 后续字节数
+ // 0x00,0x00,0x00,0x02, // Command:客户端(上位机)连接到服务端(PLC)
+ // 0x00,0x00,0x00,0x00, // 错误码:表示无错误
+ // // Fins Header
+ // 0x80,
+ // 0x00,
+ // 0x02,
+ // 0x00,DA1,0x00,
+ // 0x00,SA1,0x00,
+ // 0xFF, // SID
+
+ // // Command
+ // 0x07,0x02, // 表示读取PLC时间
+ // // 年、月、日、时、分、秒 星期
+ // year,month,day,hour,minute,second,week
+ // };
+ bool IsSuccess = false;
+
+ // 为防止PLC时间出现偏差,每次自动运行的时候写PLC系统时间
+ short[] writeArr = new short[]
+ {
+ Convert.ToInt16(nowDate.Year),//D70
+ Convert.ToInt16(nowDate.Month),//D71
+ Convert.ToInt16(nowDate.Day),//D72
+ Convert.ToInt16(nowDate.Hour),//D73
+ Convert.ToInt16(nowDate.Minute),//D74
+ Convert.ToInt16(nowDate.Second + 1),//D75
+ (short)1 //D76
+ };
+ if (CommonMethods.plcDevice.IsConnected)
+ {
+ JYResult result = CommonMethods.PlcLink.WriteValue("D70", writeArr, Data_Type.ArrShort);
+ if (result.IsSuccess)
+ {
+ IsSuccess = true;
+ }
+ }
+ return IsSuccess;
+
+ }
+ #endregion
+ }
+}
diff --git a/JinYuan.ControlCenter/ControlCenter_Plc.cs b/JinYuan.ControlCenter/ControlCenter_Plc.cs
new file mode 100644
index 0000000..107438d
--- /dev/null
+++ b/JinYuan.ControlCenter/ControlCenter_Plc.cs
@@ -0,0 +1,2321 @@
+
+using JinYuan.CommunicationLib.Enum;
+using JinYuan.DataConvertLib;
+using JinYuan.Helper;
+using JinYuan.MES.Enums;
+using JinYuan.Models;
+using JinYuan.VirtualDataLibrary;
+using PLCCommunication;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace JinYuan.ControlCenters
+{
+ public partial class ControlCenter
+ {
+ private void UpAB(ref BGearEntity m)
+ {
+ for (int i = 0; i < 10; i++) { }
+ }
+
+ #region 保留2位小数
+ private float SaveTwoNum(float TNum)
+ {
+ //1.2333 0.998
+ int value = (int)(TNum * 1000) % 10;
+ value = value > 4 ? 10 - value : -value;
+ TNum += ((float)value / 1000);
+ //保留3位小数
+ TNum = (float)(int)(TNum * 1000) / 1000;
+ return TNum;
+ }
+ #endregion
+
+ //不良类型
+ string NG_Type = ""; // 用于备注
+ string OK_NG = ""; // OK或NG
+ #region 判断总结果
+ ///
+ /// 判断总结果
+ ///
+ //private int JudgmentResult(int A, int B, int C, int D, int E, int F, int G, int H, int I, int J, int K, int L, int M, int N)
+ //{
+ // //条码,芯包重量,芯包侧厚,芯包CCD极性检测,电芯裁切粘连,电芯裁切毛刺,芯包铜焊印位置,
+ // //芯包正面极耳撕裂H,芯包背面极耳撕裂,芯包正面极耳翻折J,芯包背面极耳翻折,测厚压力结果,
+ // //焊前CCD检测结果,铝焊印位置判定结果
+
+ // //目前先判断条码,芯包重量,芯包侧厚,芯包CCD极性检测,芯包正面极耳撕裂,芯包正面极耳翻折
+ // int Result = 0;
+ // OK_NG = "OK";
+ // if (A == 2 || B == 2 || C == 2 || D == 2 || H == 2 || J == 2)
+ // {
+ // //ed
+ // Result = 2;
+ // OK_NG = "NG";
+ // }
+ // else if (A == 1 && B == 1 && C == 1 && D == 1 && H == 1 && J == 1)
+ // {
+ // Result = 1;
+ // OK_NG = "OK";
+ // }
+ // else
+ // {
+ // Result = 1;
+ // OK_NG = "OK";
+ // }
+
+ // if (A == 2)
+ // {
+ // NG_Type += "无条码_";
+ // Result = 2;
+ // }
+ // if (B == 2)
+ // {
+ // NG_Type += "芯包重量1NG_";
+ // //return 2;
+ // Result = 2;
+ // }
+ // if (C == 2)
+ // {
+ // NG_Type += "芯包侧厚NG_";
+ // //return 2;
+ // Result = 2;
+ // }
+ // if (D == 2)
+ // {
+ // NG_Type += "芯包CCD极性检测NG_";
+ // //return 2;
+ // Result = 2;
+ // }
+
+ // //if (E == 2)
+ // //{
+ // // NG_Type += "电芯裁切粘连NG_";
+ // // //return 2;
+ // //}
+ // //if (F == 2)
+ // //{
+ // // NG_Type += "电芯裁切毛刺NG_";
+ // // //return 2;
+ // //}
+ // //if (G == 2)
+ // //{
+ // // NG_Type += "芯包铜焊印位置判定NG_";
+ // // //return 2;
+ // //}
+ // if (H == 2)
+ // {
+ // NG_Type += "芯包正面极耳撕裂NG_";
+ // //return 2;
+ // }
+ // //if (I == 2)
+ // //{
+ // // NG_Type += "芯包背面极耳撕裂NG_";
+ // // //return 2;
+ // //}
+ // if (J == 2)
+ // {
+ // NG_Type += "芯包正面极耳翻折NG_";
+ // //return 2;
+ // }
+ // //if (K == 2)
+ // //{
+ // // NG_Type += "芯包背面极耳翻折NG_";
+ // // //return 2;
+ // //}
+ // if (L == 2)
+ // {
+ // NG_Type += "测厚压力NG_";
+ // //return 2;
+ // }
+ // if (M == 2)
+ // {
+ // NG_Type += "焊前CCD检测NG_";
+ // //return 2;
+ // }
+ // if (N == 2)
+ // {
+ // NG_Type += "铝焊印位置判定NG_";
+ // //return 2;
+ // }
+ // if (Result == 1)
+ // {
+ // NG_Type += "OK_";
+ // }
+ // return Result;
+ //}
+ ///
+ /// 判断总结果
+ ///
+ private int JudgmentResult(int A, int B, int C, int D, int E, int F, int G, int H, int I, int J, int K, int L, int M, int N)
+ {
+ //条码,芯包重量,芯包侧厚,芯包CCD极性检测,电芯裁切粘连,电芯裁切毛刺,芯包铜焊印位置,
+ //芯包正面极耳撕裂H,芯包背面极耳撕裂,芯包正面极耳翻折J,芯包背面极耳翻折,测厚压力结果,
+ //焊前CCD检测结果,铝焊印位置判定结果
+
+ //目前先判断条码,芯包重量,芯包侧厚,芯包CCD极性检测,芯包正面极耳撕裂,芯包正面极耳翻折
+ int Result = 0;
+ OK_NG = "OK";
+ if (A == 2 || B == 2 || C == 2 || D == 2 || H == 2 || J == 2)
+ {
+ //ed
+ Result = 2;
+ OK_NG = "NG";
+ }
+ else if (A == 1 && B == 1 && C == 1 && D == 1 && H == 1 && J == 1)
+ {
+ Result = 1;
+ OK_NG = "OK";
+ }
+ else
+ {
+ Result = 1;
+ OK_NG = "OK";
+ }
+
+ if (A == 2)
+ {
+ NG_Type += "无条码_";
+ Result = 2;
+ }
+ if (B == 2)
+ {
+ NG_Type += "芯包重量1NG_";
+ //return 2;
+ Result = 2;
+ }
+ if (C == 2)
+ {
+ NG_Type += "芯包侧厚NG_";
+ //return 2;
+ Result = 2;
+ }
+ if (D == 2)
+ {
+ NG_Type += "芯包CCD极性检测NG_";
+ //return 2;
+ Result = 2;
+ }
+
+ //if (E == 2)
+ //{
+ // NG_Type += "电芯裁切粘连NG_";
+ // //return 2;
+ //}
+ //if (F == 2)
+ //{
+ // NG_Type += "电芯裁切毛刺NG_";
+ // //return 2;
+ //}
+ //if (G == 2)
+ //{
+ // NG_Type += "芯包铜焊印位置判定NG_";
+ // //return 2;
+ //}
+ if (H == 2)
+ {
+ NG_Type += "芯包正面极耳撕裂NG_";
+ //return 2;
+ }
+ //if (I == 2)
+ //{
+ // NG_Type += "芯包背面极耳撕裂NG_";
+ // //return 2;
+ //}
+ if (J == 2)
+ {
+ NG_Type += "芯包正面极耳翻折NG_";
+ //return 2;
+ }
+ //if (K == 2)
+ //{
+ // NG_Type += "芯包背面极耳翻折NG_";
+ // //return 2;
+ //}
+ if (L == 2)
+ {
+ NG_Type += "测厚压力NG_";
+ //return 2;
+ }
+ if (M == 2)
+ {
+ NG_Type += "焊前CCD检测NG_";
+ //return 2;
+ }
+ if (N == 2)
+ {
+ NG_Type += "铝焊印位置判定NG_";
+ //return 2;
+ }
+ if (Result == 1)
+ {
+ NG_Type += "OK_";
+ }
+ return Result;
+ }
+ private int JudgmentCCDResult(int A, int[,] B, int C)
+ {
+ var ngType = new string[16] {"正面(2D/3D)结果",
+ "反面(2D/3D)结果",
+ "左侧面(2D/3D)结果",
+ "右侧面(2D/3D)结果",
+ "顶面(2D/3D)结果",
+ "底面(2D/3D)结果",
+ "底DE1结果",
+ "底DE2结果",
+ "底DE3结果",
+ "底DE4结果",
+ "中ME1结果",
+ "中ME2结果",
+ "中ME3结果",
+ "中ME4结果",
+ "极柱(POS/NEG)结果",
+ "防爆阀(PRO)结果"
+ };
+ int Result = 1;
+ OK_NG = "OK";
+ for (int i = 0; i < 16; i++)
+ {
+ if (B[C,i] !=1)
+ {
+ //1OK,2扫码NG,3MES反馈NG,4其他NG
+ Result = 4;
+ OK_NG = "NG";
+ NG_Type += $"{ngType[i]}(NG),";
+ }
+ }
+ if (A == 2)
+ {
+ NG_Type += "无条码,";
+ Result = 2;
+ OK_NG = "NG";
+ }
+
+ return Result;
+ }
+ private int JudgmentThickNessResult(int[,] B, int C,int ccdResult =1)
+ {
+ var ngType = new string[3] {"厚度1结果",
+ "厚度2结果",
+ "厚度3结果"
+ };
+ int Result = ccdResult;
+ for (int i = 0; i < 3; i++)
+ {
+ if (B[C, i] != 1)
+ {
+ //1OK,2扫码NG,3MES反馈NG,4其他NG
+ Result = 4;
+ OK_NG = "NG";
+ NG_Type += $"{ngType[i]}(NG),";
+ }
+ }
+
+ return Result;
+ }
+ #region 上料工位(数据处理)
+ ///
+ /// 上料工位
+ ///
+ int JXCount = 0;
+
+ Stopwatch sw2 = new Stopwatch();
+ //上料解析
+ private void FeedingStation(JYResult bArrays, object plcModel)
+ {
+ Group pf = plcModel as Group;
+ if (bArrays == null)
+ {
+ CommonMethods.PlcLink.WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
+ CommonMethods.AddLog(false, $"电芯进站PLC有触发信号,但无数据!");//存系统日志
+ LoggerHelp.WriteLog($"电芯进站PLC有触发信号,但无数据!", "Info");
+ }
+ if (bArrays.IsSuccess && bArrays.Content != null)
+ {
+
+
+ sw2.Restart();
+ //解析数据
+ //1257 3个条码
+ List list = new List();//实体
+ List listBarCode = GetList(3, "");//电芯条码
+ //List listNum = GetList(1, "");//进站磁悬浮动子编号
+ List listRes = GetList(3, 0);//进站电芯反馈结果
+
+ byte[] bytes = bArrays.Content.ByteReverse();//高低位转换
+
+ // 从D2200开始
+ #region 数据解析
+
+ //电芯条码
+ //从bytes读取第二位参数到第三位参数的内容 0-19 第四位参数为格式 第五位为规则
+ //listBarCode[0] = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 200, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ //listBarCode[1] = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 240, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ //listBarCode[2] = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 280, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ //listBarCode[3] = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 320, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ listBarCode[0] = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ listBarCode[1] = StringLib.GetStringFromByteArrayByEncoding(bytes, 40, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ listBarCode[2] = StringLib.GetStringFromByteArrayByEncoding(bytes, 80, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+
+ //listBarCode[0] = "TEST";
+ //listBarCode[1] = "TEST";
+ //listBarCode[2] = "TEST";
+ //listBarCode[3] = "TEST";
+
+ for (int i = 0; i < 3; i++)
+ {
+ //有无条码标志
+ int CodeFlag = 1;
+ //极限件标志
+ int ChallengeFlag = 0;
+ AGearEntity m = new AGearEntity();
+ try
+ {
+ //判断条码是否为空
+ if (listBarCode[i] == null || listBarCode[i] == "" || listBarCode[i] == "ERROR")
+ {
+ CodeFlag = 0;
+ //continue;
+ }
+ m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ m.BarCode = listBarCode[i];
+
+ //判断是否极限件 查询极限件数据
+ var EX = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetChallengeCode(listBarCode[i]));
+ for (int j = 0; j < EX.Count; j++)
+ {
+ if (string.Compare(EX[j].ChallengeBarCode, listBarCode[i]) == 0)
+ {
+ m.Remark += "(极限件," + EX[j].CodeMessage + "," + EX[j].WeldingCCD + ")";
+ ChallengeFlag = 1;
+ }
+ }
+
+ if (CodeFlag == 1)
+ {
+ List MesMessage = new List();
+ List mesResType = new List();
+ if (CommonMethods.mesConfig.isUpMes)
+ {
+ string url = CommonMethods.mesConfig.InPutStationMesUrl;
+ string siteCode = CommonMethods.mesConfig.siteCode;
+ string lineCode = CommonMethods.mesConfig.lineCode;
+ string equipNum = CommonMethods.mesConfig.equipNum;
+ string materialCode = CommonMethods.mesConfig.MaterialCode;
+ string userName = CommonMethods.mesConfig.mesUserName;
+ string MesMessage1 = "";
+ MesResType mesResType1 = MesResType.A;
+
+ bool Res = CommonMethods.hbgMes.SingleCellInStation(url, siteCode, lineCode, equipNum, materialCode, userName, listBarCode[i], ref MesMessage1, ref mesResType1);
+
+ if (MesMessage1.Contains("发生一个或多个错误"))
+ {
+ MesMessage1 = "上传失败";
+ }
+ else
+ {
+ m.Flag = 1;
+ }
+
+ if (Res)
+ {
+ m.Result = "OK";
+ listRes[i] = 1;
+ m.Remark += MesMessage1;
+ }
+ else
+ {
+ m.Result = "NG";
+ switch (mesResType1)
+ {
+ case MesResType.A:// 停线,设备报警停机
+ //listRes[i] = 10;
+ listRes[i] = 3;
+ m.Remark += "MES NG";
+ break;
+ case MesResType.B:
+ //listRes[i] = 9;
+ listRes[i] = 3;
+ m.Remark += "MES NG";
+ break;
+ case MesResType.C:
+ //listRes[i] = 1;
+ listRes[i] = 3;
+ m.Remark += "MES NG";
+ break;
+ case MesResType.D:
+ listRes[i] = 1;
+ m.Remark += "MES OK";
+ break;
+ default:
+ listRes[i] = 3;
+ m.Remark += "MES NG";
+ break;
+ }
+ if (CommonMethods.sysConfig.OKSwitching)
+ {
+ //调试发OK
+ listRes[i] = 1;
+ //m.Result = "OK";
+ }
+ m.Remark += MesMessage1;
+ }
+ }
+ else
+ {
+ m.Flag = 0;
+ m.ID = i + 1;
+ m.CNum = m.ID.ToString();
+ //电芯反馈结果
+ listRes[i] = 1;
+ m.Result = "OK";
+ m.Remark += "本地存储";
+ m.UpState = "未上传";
+
+ // m.Remark = "本地存储";
+
+ //if (CommonMethods.sysConfig.OKSwitching)
+ //{
+ // //调试发OK
+ // listRes[j] = 1;
+ // m.Result = "OK";
+ //}
+ //list.Add(m);
+ }
+ }
+ else
+ {
+ //无条码不上传
+ m.Flag = 0;
+ m.Result = "NG";
+ listRes[i] = 2;
+ m.Remark += "无条码";
+ }
+
+ //极限件发3给PLC
+ //需要沟通极限 发多少给plc
+ if (ChallengeFlag == 1)
+ {
+ if (string.Compare(EX[0].WeldingCCD, "焊前CCD") == 0)
+ {
+ listRes[i] = 3;
+ }
+ if (string.Compare(EX[0].WeldingCCD, "焊后CCD") == 0)
+ {
+ listRes[i] = 4;
+ }
+ }
+
+ if (m.Flag == 1)
+ m.UpState = "已上传";
+ else
+ m.UpState = "未上传";
+
+ list.Add(m);
+ }
+ catch (Exception ex)
+ {
+ LoggerHelp.WriteLog($"外观检测进站线程数据解析:{ex}", "SysErrorLog");
+ }
+
+
+ }
+ #endregion
+
+
+ //if (CommonMethods.sysConfig.OKSwitching)
+ //{
+ // //调试发OK
+ // listRes[0] = 1;
+ // listRes[1] = 1;
+ // listRes[2] = 1;
+ // listRes[3] = 1;
+ // //m.Result = "OK";
+ //}
+ JYResult result = CommonMethods.PlcLink.WriteValue("D2100", listRes[0], Data_Type.Short);//调试结果写入PLC
+ CommonMethods.PlcLink.WriteValue("D2101", listRes[1], Data_Type.Short);//调试结果写入PLC
+ CommonMethods.PlcLink.WriteValue("D2102", listRes[2], Data_Type.Short);//调试结果写入PLC
+ //CommonMethods.PlcLink.WriteValue("D2103", listRes[3], Data_Type.Short);//调试结果写入PLC
+ //CommonMethods.PlcLink.WriteInt16("D2100", listRes[0]);//调试结果OK写入PLC
+ if (result != null)
+ {
+ string strres = $"外观检工位发送给PLC: D2100={listRes[0]},D2101={listRes[1]},D2102={listRes[2]},";
+ CommonMethods.AddDataMonitorLog(0, strres);
+ }
+
+ //写入·结果反馈
+ //JYResult result = CommonMethods.PlcLink.WriteValue("D2100", listRes.ToArray(), Data_Type.ArrShort);//判断结果写入PLC
+ //JYResult result = CommonMethods.PlcLink.WriteValue("D2100", listRes.ToArray(), Data_Type.ArrShort);//调试结果OK写入PLC
+
+ Task.Run(() => { SendDateMQTT.Instance.EnterandExitSendMessge(0); });
+ //读取结果显示
+ //数据存储 -异步处理
+ Task.Run(() => { SaveFeedingData(list); });
+ CommonMethods.PlcLink.WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
+
+ sw2.Stop();
+ ////输出上料数据处理耗时:
+ CommonMethods.AddDataMonitorLog(0, $"外观检测进站共耗时:{sw2.Elapsed.TotalMilliseconds}ms");
+
+ }
+ }
+
+
+
+ #region 保存上料数据
+ ///
+ /// 保存上料数据到数据
+ ///
+ ///
+ private void SaveFeedingData(List list)
+ {
+ //数据的保存
+ try
+ {
+ if (list != null && list.Count > 0)
+ {
+ //数据显示
+ List Blist = list;
+ int i = 0;
+ string strRes = "";
+ foreach (AGearEntity m in list)
+ {
+ if (true)
+ {
+ //int b1 = CommonMethods.dbServer.Delete(it => it.containerCode == m.DiRFID);
+ Thread.Sleep(10);
+ //int b2 = CommonMethods.dbServer.Delete(it => it.containerCode == m.GaoRFID);
+
+ //int b1 = CommonMethods.dbServer.Delete(it => it.containerCode == m.BarCode);
+
+ bool b = CommonMethods.db.AddReturnBool(m);
+
+ //strRes = b1 > 0 ? ",远删Yes" : ",远删No";
+ strRes += b;
+
+ DataTurnover server = new DataTurnover
+ {
+ equipNum = CommonMethods.mesConfig.equipNum,
+ containerCode = m.BarCode,
+ identification = m.BarCode,
+ message = m.Result,
+ Time = DateTime.Now,
+ };
+
+ try
+ {
+ //bool res = CommonMethods.dbServer.AddReturnBool(server);
+ //strRes += res == true ? ",远存Yes" : ",远存No";
+ }
+ catch (Exception ex)
+ {
+ JYResult result = CommonMethods.PlcLink.WriteValue("D80", 1, Data_Type.Short);//反馈PLC结果
+ CommonMethods.AddDataMonitorLog(1, $"服务器连接失败!解决办法:1、请检查MES网络,2、查看服务器是否正常!!");
+ LoggerHelp.WriteLog($"服务器连接失败:{ex}", "系统报错");
+ }
+ }
+ else
+ {
+ strRes = ",不存储";
+ }
+ //m.Remark = m.Remark + strRes;
+ Blist[i].Remark = m.Remark;
+ i++;
+ }
+ //数据显示
+ CommonMethods.ShowFeedingDelegate.Invoke(Blist);
+ }
+ else
+ {
+ LoggerHelp.WriteLog($"电芯进站数据List为空", "SysErrorLog");
+ }
+
+ }
+ catch (Exception ex)
+ {
+ LoggerHelp.WriteLog($"外观检测上料保存处理异常:{ex}", "SysErrorLog");
+ }
+ }
+ #endregion
+
+ #endregion
+
+ //NG出站解析
+ private void NGStation(JYResult bArrays, object plcModel)
+ {
+ Group pf = plcModel as Group;
+ if (bArrays == null)
+ {
+ CommonMethods.PlcLink.WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
+ CommonMethods.AddLog(false, $"NG出站PLC有触发信号,但无数据!");
+ LoggerHelp.WriteLog($"NG出站PLC有触发信号,但无数据!", "SysErrorLog");
+ }
+ #region 预焊机
+ //if (bArrays.IsSuccess && bArrays.Content != null)
+ //{
+ // Random random = new Random();
+ // //解析数据
+ // sw2.Restart();
+ // #region 数据变量定义
+ // List list = new List();//实体
+ // int[] MyRes = new int[2];//AB反馈结果
+
+ // #endregion
+ // //高低位转换
+ // byte[] bytes = bArrays.Content.ByteReverse();
+ // byte[] bytes1 = bArrays.Content;
+ // //反馈结果
+ // #region 电芯解析
+ // //D3100起
+ // //电芯解析
+ // #region 上传MES
+
+ // for (int i = 0; i < 2; i++)
+ // {
+ // try
+ // {
+ // int ChallengeFlag = 0;
+ // BGearEntity m = new BGearEntity();
+ // AGearEntity TT = new AGearEntity();
+ // if (i == 0)
+ // {
+ // m.A_B = "A芯包";
+ // //A_NG芯包信息1 D2442~D2446
+ // for (int j = 0; j < 5; j++)
+ // {
+ // m.NG_Data1[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 84 + j * 2, DataFormat.CDAB);
+ // }
+
+ // //A_NG芯包信息2 D2452~D2468
+ // for (int j = 0; j < 9; j++)
+ // {
+ // m.NG_Data2[i, j] = FloatLib.GetFloatFromByteArray(bArrays.Content, 104 + j * 4, DataFormat.CDAB);
+ // }
+ // }
+ // else
+ // {
+ // m.A_B = "B芯包";
+ // //B_NG芯包信息1 D2447~D2451
+ // for (int j = 0; j < 5; j++)
+ // {
+ // m.NG_Data1[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 94 + j * 2, DataFormat.CDAB);
+ // }
+
+ // //B_NG芯包信息2 D2470~D2486
+ // for (int j = 0; j < 9; j++)
+ // {
+ // m.NG_Data2[i, j] = FloatLib.GetFloatFromByteArray(bArrays.Content, 140 + j * 4, DataFormat.CDAB);
+ // }
+ // }
+
+ // //芯包条码 D2400~D3239
+ // m.CSBYHCODEA = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 40 * i, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ // //m.CSBYHCODEA = "TEST";
+ // //判断是否极限件 查询极限件数据
+ // var EX = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetChallengeCode(m.CSBYHCODEA));
+ // for (int j = 0; j < EX.Count; j++)
+ // {
+ // if (string.Compare(EX[j].ChallengeBarCode, m.CSBYHCODEA) == 0)
+ // {
+ // m.Remark += "(极限件," + EX[j].CodeMessage + "," + EX[j].WeldingCCD + ")";
+ // ChallengeFlag = 1;
+ // }
+ // }
+
+ // //查询进站时间数据
+ // var w = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetInTime(m.CSBYHCODEA));
+ // //获取最新一行数据
+ // if (w.Count > 0)
+ // TT = w[w.Count - 1];
+ // if (TT.TestTime != null)
+ // m.ScanTime[0] = TT.TestTime;
+ // else
+ // m.ScanTime[0] = "";
+ // //芯包出站时间
+ // m.ScanTime[1] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ // int Code_NG = 0;//条码有无标志 1为有,2为无
+ // //判断有无条码
+ // if (m.CSBYHCODEA != null && m.CSBYHCODEA != "")
+ // Code_NG = 1;
+ // else
+ // Code_NG = 2;
+
+ // //m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+
+ // //不良代码判定
+ // List NGcodeList = new List();
+ // NGcodeList = NGCarcode(m.NG_Data1[i, 1], m.NG_Data1[i, 3], m.NG_Data1[i, 4]);
+
+ // //芯包重量1判定结果
+ // if (m.NG_Data1[i, 1] == 1)
+ // m.CSBYHWEIGHTRESULTA1 = "OK";
+ // else if (m.NG_Data1[i, 1] == 2)
+ // m.CSBYHWEIGHTRESULTA1 = "NG";
+ // else
+ // m.CSBYHWEIGHTRESULTA1 = "无";
+ // //芯包侧厚判定结果
+ // if (m.NG_Data1[i, 3] == 1)
+ // m.CSBYHTHICKNESSTESTJUDGERESULTA = "OK";
+ // else if (m.NG_Data1[i, 3] == 2)
+ // m.CSBYHTHICKNESSTESTJUDGERESULTA = "NG";
+ // else
+ // m.CSBYHTHICKNESSTESTJUDGERESULTA = "无";
+ // //芯包CCD极性检测结果
+ // if (m.NG_Data1[i, 4] == 1)
+ // m.CSBYHPOLARITYRESULTA = "OK";
+ // else if (m.NG_Data1[i, 4] == 2)
+ // m.CSBYHPOLARITYRESULTA = "NG";
+ // else
+ // m.CSBYHPOLARITYRESULTA = "无";
+ // //电芯裁切粘连判定结果
+ // m.CSBYHCUTADHESIONJUDGERESULTA = "无";
+ // //电芯裁切毛刺判定结果
+ // m.CSBYHCUTBURRJUDGERESULTA = "无";
+ // //芯包焊印位置判定结果
+ // m.CSBYHSOLDERJUDGERESULTA = "无";
+ // m.CSBYHSOLDERJUDGERESULTA2 = "无";
+ // m.AluminiumWeldPositionResult1 = "无";
+ // m.AluminiumWeldPositionResult2 = "无";
+ // //芯包正面极耳撕裂判定结果
+ // m.CSBYHFRONTEARCRACKLEJUDGERESULTA = "无";
+ // //芯包背面极耳撕裂判定结果
+ // m.CSBYHBACKEARCRACKLEJUDGERESULTA = "无";
+ // //芯包正面极耳翻折检测结果
+ // m.CSBYHFRONTEARFLODINGRESULTA = "无";
+ // //芯包背面极耳翻折检测结果
+ // m.CSBYHBACKEARFLODINGRESULTA = "无";
+
+
+ // m.CSBYHASCANNINGTIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ // m.CSBYHWEIGHTNOA1 = m.NG_Data1[i, 2];
+ // m.CSBYHTHICKNESSTESTSTATIONNOA = m.NG_Data1[i, 4];
+ // m.CSBYHTOOLNOA = 0;
+ // m.CSBYHCUWELDINGSTATIONNOA1 = 0;
+ // m.CSBYHCUWELDINGSTATIONNOA2 = 0;
+ // m.CSBYHCUWELDINGSTATIONNOA3 = 0;
+ // m.CSBYHCUWELDHEADCOUNTA1 = 0;
+ // m.CSBYHCUWELDHEADCOUNTA2 = 0;
+ // m.CSBYHCUWELDHEADCOUNTA3 = 0;
+ // m.CSBYHCUWELDBASECOUNTA1 = 0;
+ // m.CSBYHCUWELDBASECOUNTA2 = 0;
+ // m.CSBYHCUWELDBASECOUNTA3 = 0;
+ // m.CSBYHALWELDINGSTATIONNOA1 = 0;
+ // m.CSBYHALWELDINGSTATIONNOA2 = 0;
+ // m.CSBYHALWELDINGSTATIONNOA3 = 0;
+ // m.CSBYHALWELDHEADCOUNTA1 = 0;
+ // m.CSBYHALWELDHEADCOUNTA2 = 0;
+ // m.CSBYHALWELDHEADCOUNTA3 = 0;
+ // m.CSBYHALWELDBASECOUNTA1 = 0;
+ // m.CSBYHALWELDBASECOUNTA2 = 0;
+ // m.CSBYHALWELDBASECOUNTA3 = 0;
+ // m.CSBYHCUTABCUTTERCOUNTA = 0;
+ // m.CSBYHALTABCUTTERCOUNTA = 0;
+
+ // m.CSBYHCUTABCUTTERNOA = 0;
+ // m.CSBYHALTABCUTTERNOA = 0;
+ // m.CSBYHPROCESSNAME = "超声波预焊接";
+ // m.CSBYHSCHEDULE = CommonMethods.strClass;
+ // m.CSBYHINSTATIONTIME = m.ScanTime[0];
+ // m.CSBYHOUTSTATIONTIME = m.ScanTime[1];
+ // //m.CSBYHABNORMALINFORMATION = m.list_Process[i, 4];
+ // m.CSBYHWEIGHTA1MAXSETTING = SaveTwoNum(m.NG_Data2[i, 0]);
+ // m.CSBYHWEIGHTA1MINSETTING = SaveTwoNum(m.NG_Data2[i, 1]);
+ // m.CSBYHWEIGHTA1 = SaveTwoNum(m.NG_Data2[i, 2]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMAXSETTINGA = SaveTwoNum(m.NG_Data2[i, 3]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMINSETTINGA = SaveTwoNum(m.NG_Data2[i, 4]);
+ // m.CSBYHTHICKNESSTESTPRESSUREA = SaveTwoNum(m.NG_Data2[i, 5]);
+ // m.CSBYHTHICKNESSTESTPRESSURESIZEA = SaveTwoNum(m.NG_Data2[i, 6]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMAXSIZEA = SaveTwoNum(m.NG_Data2[i, 7]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMINSIZEA = SaveTwoNum(m.NG_Data2[i, 8]);
+ // m.CSBYHCUWELDINGPRESSUREMAXSETTING1 = 0;
+ // m.CSBYHCUWELDINGPRESSUREMAXSETTING2 = 0;
+ // m.CSBYHCUWELDINGPRESSUREMAXSETTING3 = 0;
+ // m.CSBYHCUWELDINGPRESSUREMINSETTING = 0;//压力最小值
+ // m.CSBYHCUWELDINGPOWERMAXSETTING1 = 0;
+ // m.CSBYHCUWELDINGPOWERMAXSETTING2 = 0;
+ // m.CSBYHCUWELDINGPOWERMAXSETTING3 = 0;
+ // m.CSBYHCUWELDINGPOWERMINSETTING1 = 0;
+ // m.CSBYHCUWELDINGPOWERMINSETTING2 = 0;
+ // m.CSBYHCUWELDINGPOWERMINSETTING3 = 0;
+ // m.CSBYHCUWELDINGENERGYMAXSETTING1 = 0;
+ // m.CSBYHCUWELDINGENERGYMAXSETTING2 = 0;
+ // m.CSBYHCUWELDINGENERGYMAXSETTING3 = 0;
+ // m.CSBYHCUWELDINGENERGYMINSETTING1 = 0;
+ // m.CSBYHCUWELDINGENERGYMINSETTING2 = 0;
+ // m.CSBYHCUWELDINGENERGYMINSETTING3 = 0;
+ // m.CSBYHCUWELDINGAMPLITUDEMAXSETTING1 = 0;
+ // m.CSBYHCUWELDINGAMPLITUDEMAXSETTING2 = 0;
+ // m.CSBYHCUWELDINGAMPLITUDEMAXSETTING3 = 0;
+ // m.CSBYHCUWELDINGAMPLITUDEMINSETTING1 = 0;
+ // m.CSBYHCUWELDINGAMPLITUDEMINSETTING2 = 0;
+ // m.CSBYHCUWELDINGAMPLITUDEMINSETTING3 = 0;
+ // m.CSBYHCUPRESSUREA1 = 0;
+ // m.CSBYHCUPOWERA1 = 0;
+ // m.CSBYHCUENERGYA1 = 0;
+ // m.CSBYHCUAMPLITUDEA1 = 0;
+ // m.CSBYHCUTIMEA1 = 0;
+ // m.CSBYHCUPRESSUREA2 = 0;
+ // m.CSBYHCUPOWERA2 = 0;
+ // m.CSBYHCUENERGYA2 = 0;
+ // m.CSBYHCUAMPLITUDEA2 = 0;
+ // m.CSBYHCUTIMEA2 = 0;
+ // m.CSBYHCUPRESSUREA3 = 0;
+ // m.CSBYHCUPOWERA3 = 0;
+ // m.CSBYHCUENERGYA3 = 0;
+ // m.CSBYHCUAMPLITUDEA3 = 0;
+ // m.CSBYHCUTIMEA3 = 0;
+ // m.CSBYHALWELDINGPRESSUREMAXSETTING1 = 0;
+ // m.CSBYHALWELDINGPRESSUREMAXSETTING2 = 0;
+ // m.CSBYHALWELDINGPRESSUREMAXSETTING3 = 0;
+ // m.CSBYHALWELDINGPRESSUREMINSETTING = 0;
+ // m.CSBYHALWELDINGPOWERMAXSETTING1 = 0;
+ // m.CSBYHALWELDINGPOWERMAXSETTING2 = 0;
+ // m.CSBYHALWELDINGPOWERMAXSETTING3 = 0;
+ // m.CSBYHALWELDINGPOWERMINSETTING1 = 0;
+ // m.CSBYHALWELDINGPOWERMINSETTING2 = 0;
+ // m.CSBYHALWELDINGPOWERMINSETTING3 = 0;
+ // m.CSBYHALWELDINGENERGYMAXSETTING1 = 0;
+ // m.CSBYHALWELDINGENERGYMAXSETTING2 = 0;
+ // m.CSBYHALWELDINGENERGYMAXSETTING3 = 0;
+ // m.CSBYHALWELDINGENERGYMINSETTING1 = 0;
+ // m.CSBYHALWELDINGENERGYMINSETTING2 = 0;
+ // m.CSBYHALWELDINGENERGYMINSETTING3 = 0;
+ // m.CSBYHALWELDINGAMPLITUDEMAXSETTING1 = 0;
+ // m.CSBYHALWELDINGAMPLITUDEMAXSETTING2 = 0;
+ // m.CSBYHALWELDINGAMPLITUDEMAXSETTING3 = 0;
+ // m.CSBYHALWELDINGAMPLITUDEMINSETTING1 = 0;
+ // m.CSBYHALWELDINGAMPLITUDEMINSETTING2 = 0;
+ // m.CSBYHALWELDINGAMPLITUDEMINSETTING3 = 0;
+ // m.CSBYHALPRESSUREA1 = 0;
+ // m.CSBYHALPOWERA1 = 0;
+ // m.CSBYHALENERGYA1 = 0;
+ // m.CSBYHALAMPLITUDEA1 = 0;
+ // m.CSBYHALTIMEA1 = 0;
+ // m.CSBYHALPRESSUREA2 = 0;
+ // m.CSBYHALPOWERA2 = 0;
+ // m.CSBYHALENERGYA2 = 0;
+ // m.CSBYHALAMPLITUDEA2 = 0;
+ // m.CSBYHALTIMEA2 = 0;
+ // m.CSBYHALPRESSUREA3 = 0;
+ // m.CSBYHALPOWERA3 = 0;
+ // m.CSBYHALENERGYA3 = 0;
+ // m.CSBYHALAMPLITUDEA3 = 0;
+ // m.CSBYHALTIMEA3 = 0;
+ // m.CSBYHCUTABLENGTHA = 0;
+ // m.CSBYHCUTABWIDTHA = 0;
+ // m.CSBYHALTABLENGTHA = 0;
+ // m.CSBYHALTABWIDTHA = 0;
+ // m.CSBYHTOPTOSOLDERDISTANCEA = 0;
+ // m.CSBYHTOPTOSOLDERDISTANCEA2 = 0;
+ // m.AluminumToWeld1 = 0;
+ // m.AluminumToWeld2 = 0;
+ // m.CSBYHSOLDERTOEARDISTANCEA = 0;
+ // //MyRes[i] = JudgmentResult(Code_NG, m.list_Data1[i, 1], m.list_Data1[i, 4], m.list_Data1[i, 5], m.list_Data1[i, 15],
+ // // m.list_Data1[i, 16], m.list_Data1[i, 17], m.list_Data1[i, 18], m.list_Data1[i, 19],
+ // // m.list_Data1[i, 20], m.list_Data1[i, 21], m.list_Data2[i, 59], m.list_Data2[i, 60],
+ // // m.list_Data2[i, 63], m.list_Data2[i, 64]);
+
+ // //初值OK
+ // m.Result = m.listRes[i] = 1;
+ // m.CSBYHOUTSTATIONJUDGMENTRESULT = "OK";
+
+ // //优先级 :条码 MES 极性 重量 测厚压力 测厚位移 (焊前CCD 正面极耳撕裂和翻折)
+ // //无条码则无后面检测
+
+ // if (m.NG_Data1[i, 1] == 2 || m.NG_Data1[i, 3] == 2 || m.NG_Data1[i, 4] == 2)
+ // {
+ // m.Result = m.listRes[i] = 2;
+ // m.CSBYHOUTSTATIONJUDGMENTRESULT = "NG";
+ // }
+
+ // list.Add(m);
+
+ // string ur2 = CommonMethods.mesConfig.ResultProcessParamMesUrl;
+ // string siteCode1 = CommonMethods.mesConfig.siteCode;
+ // string lineCode1 = CommonMethods.mesConfig.lineCode;
+ // string equipNum1 = CommonMethods.mesConfig.equipNum;
+ // string materialCode1 = CommonMethods.mesConfig.MaterialCode;
+ // string userName1 = CommonMethods.mesConfig.mesUserName;
+ // MesUploadType unloadType = MesUploadType.DD;
+ // string Mesage = "";
+ // //加判断无条码不上传mes
+ // m.Remark += "NG小车1,";
+ // //芯包测厚(位移)判定结果
+ // if (m.NG_Data1[i, 3] == 2) { m.Remark += "芯包侧厚(位移)NG,"; }
+ // //芯包测厚(压力)判定结果 ()
+ // if (false) { m.Remark += "芯包侧厚(压力)NG,"; }
+ // //芯包重量1判定结果
+ // if (m.NG_Data1[i, 1] == 2) { m.Remark += "芯包重量NG,"; }
+ // //芯包CCD极性检测结果
+ // if (m.NG_Data1[i, 4] == 2) { m.Remark += "芯包CCD极性检测NG,"; }
+ // if (Code_NG == 1)
+ // {
+ // string MesMessage = "";
+ // MesResType mesResType = MesResType.C;
+
+ // //m.Result = MyRes[i] = m.listRes[i] = 2;
+ // //m.UpState = "未上传";
+ // //m.Remark = "出站前NG";
+
+
+ // if (CommonMethods.mesConfig.isUpMes)
+ // {
+ // string url = CommonMethods.mesConfig.OutStationMesUrl;
+ // string siteCode = CommonMethods.mesConfig.siteCode;
+ // string lineCode = CommonMethods.mesConfig.lineCode;
+ // string equipNum = CommonMethods.mesConfig.equipNum;
+ // string materialCode = CommonMethods.mesConfig.MaterialCode;
+ // string userName = CommonMethods.mesConfig.mesUserName;
+ // int type = 1;
+ // //int type = 1;
+ // //string materialLotCodeLocator = "";
+ // #region NG小车排料调出站
+ // bool Res = CommonMethods.hbgMes.OutboundInformations(url, siteCode, lineCode, equipNum, materialCode, userName, m, ref MesMessage, ref mesResType, NGcodeList);
+ // //bool Res = CommonMethods.hbgMes.SingleCellOutStation(url, siteCode, lineCode, equipNum, materialCode, userName, m,)
+ // if (MesMessage.Contains("发生一个或多个错误"))
+ // {
+ // MesMessage = "上传失败,";
+ // }
+ // else
+ // {
+ // m.Flag = 1;
+ // }
+
+
+ // //m.UpState = "已上传";
+ // if (Res)
+ // {
+ // m.Remark += MesMessage;
+ // }
+ // else
+ // {
+ // m.CSBYHOUTSTATIONJUDGMENTRESULT = "NG";
+ // switch (mesResType)
+ // {
+ // case MesResType.A:// 停线,设备报警停机
+ // m.listRes[i] = 2;
+ // MyRes[i] = m.listRes[i];
+ // break;
+ // case MesResType.B://不停机,MEs NG品要排出,要给PLC发NG信号
+ // m.listRes[i] = 2;
+ // MyRes[i] = m.listRes[i];
+ // break;
+ // case MesResType.C://可忽略
+ // m.listRes[i] = 2;
+ // MyRes[i] = m.listRes[i];
+ // break;
+ // default:
+ // m.listRes[i] = 2;
+ // MyRes[i] = m.listRes[i];
+ // break;
+
+ // }
+ // ////芯包测厚(位移)判定结果
+ // //if (m.NG_Data1[i, 3] == 2) { m.Remark += "芯包侧厚(位移)NG,"; }
+ // ////芯包测厚(压力)判定结果
+ // //if (false) { m.Remark += "芯包侧厚(压力)NG,"; }
+ // ////芯包重量1判定结果
+ // //if (m.NG_Data1[i, 1] == 2) { m.Remark += "芯包重量NG,"; }
+ // ////芯包CCD极性检测结果
+ // //if (m.NG_Data1[i, 4] == 2) { m.Remark += "芯包CCD极性检测NG,"; }
+ // m.Remark += MesMessage;
+ // }
+ // #endregion
+
+
+ // bool Res1 = CommonMethods.hbgMes.ProducResultParam(ur2, siteCode1, lineCode1, equipNum1, materialCode1, userName1, m, unloadType, ref Mesage);
+
+ // if (m.Flag == 1)
+ // m.UpState = "已上传";
+ // else
+ // m.UpState = "未上传";
+
+
+ // }
+ // else
+ // {
+ // m.CSBYHOUTSTATIONJUDGMENTRESULT = "NG";
+ // m.Result = MyRes[i] = m.listRes[i] = 2;
+ // m.UpState = "未上传";
+ // ////芯包测厚(位移)判定结果
+ // //if (m.NG_Data1[i, 3] == 2) { m.Remark += "芯包侧厚(位移)NG,"; }
+ // ////芯包测厚(压力)判定结果
+ // //if (false) { m.Remark += "芯包侧厚(压力)NG,"; }
+ // ////芯包重量1判定结果
+ // //if (m.NG_Data1[i, 1] == 2) { m.Remark += "芯包重量NG,"; }
+ // ////芯包CCD极性检测结果
+ // //if (m.NG_Data1[i, 4] == 2) { m.Remark += "芯包CCD极性检测NG,"; }
+ // }
+
+ // }
+ // else
+ // {
+ // m.CSBYHOUTSTATIONJUDGMENTRESULT = "NG";
+ // m.Result = MyRes[i] = m.listRes[i] = 2;
+ // m.Remark += "无条码,本地存储";
+ // //正常无条码,以下不会NG不会出现
+ // ////芯包重量1判定结果
+ // //if (m.NG_Data1[i, 1] == 2) { m.Remark += ",芯包重量NG"; }
+ // ////芯包侧厚判定结果
+ // //if (m.NG_Data1[i, 3] == 2) { m.Remark += ",芯包侧厚NG"; }
+ // ////芯包CCD极性检测结果
+ // //if (m.NG_Data1[i, 4] == 2) { m.Remark += ",芯包CCD极性检测NG"; }
+ // m.UpState = "未上传";
+ // }
+
+ // //极限件发3给PLC
+ // //if (ChallengeFlag == 1)
+ // //{
+ // // if (string.Compare(EX[0].WeldingCCD, "焊前CCD") == 0)
+ // // {
+ // // MyRes[i] = 3;
+ // // }
+ // // if (string.Compare(EX[0].WeldingCCD, "焊后CCD") == 0)
+ // // {
+ // // MyRes[i] = 4;
+ // // }
+ // //}
+
+ // Task.Run(() => { SendDateMQTT.Instance.EnterandExitSendMessge(1); });
+
+ // }
+ // catch (Exception ex)
+ // {
+ // LogHelper.Instance.WriteError($"外观检测出站线程数据解析:{ex}", "SysErrorLog");
+ // }
+ // }
+
+ // #endregion
+ // JYResult result1 = null;
+ // JYResult result2 = null;
+ // if (pf.IsFeedbackPlc)
+ // {
+ // //result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC
+ // //result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC
+ // }
+ // JYResult result3 = CommonMethods.PlcLink.WriteValue(pf.VarList[0].VarAddress, 0);//置位0
+ // //CommonMethods.AddDataMonitorLog(0, $"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]}");
+ // //LogHelper.Instance.WriteLog($"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]}");
+
+ // //数据存储 - 异步处理
+ // Task.Run(() =>
+ // {
+ // SaveBlankingData(list);
+ // });
+
+ // sw2.Stop();
+ // ////输出下料数据处理耗时:
+ // CommonMethods.AddDataMonitorLog(0, $"NG出站共耗时:{sw2.Elapsed.TotalMilliseconds}ms");
+ //}
+ #endregion
+ }
+
+
+ #region 下料工位(数据处理)
+ //int OutCount = 0;
+ #region //下料解析 预焊检
+ //private void BlankingStation_YHJ(JYResult bArrays, object plcModel)
+ //{
+ // Group pf = plcModel as Group;
+ // if (bArrays == null)
+ // {
+ // CommonMethods.PlcLink.WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
+ // CommonMethods.AddLog(false, $"电芯出站PLC有触发信号,但无数据!");
+ // LogHelper.Instance.WriteLog($"电芯出站PLC有触发信号,但无数据!", "SysErrorLog");
+ // }
+ // if (bArrays.IsSuccess && bArrays.Content != null)
+ // {
+ // Random random = new Random();
+ // //解析数据
+ // sw2.Restart();
+ // #region 数据变量定义
+ // List list = new List();//实体
+ // //int[] MyRes = new int[2];//AB反馈结果
+ // int[] MyRes = new int[3];//三个外观检测反馈结果
+ // #endregion
+ // //高低位转换
+ // byte[] bytes = bArrays.Content.ByteReverse();
+ // byte[] bytes1 = bArrays.Content;
+
+ // List listBarCode = GetList(3, "");//电芯条码
+ // //List listNum = GetList(1, "");//进站磁悬浮动子编号
+ // List listRes = GetList(3, 0);//出站电芯反馈结果
+ // //反馈结果
+ // #region 电芯解析
+ // //电芯解析 从3200 开始
+ // listBarCode[0] = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 0, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ // listBarCode[1] = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 40, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ // listBarCode[2] = StringLib.GetStringFromByteArrayByEncoding(bArrays.Content, 80, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ // #region 上传MES
+ // //D3100起
+ // for (int i = 0; i < 3; i++)
+ // {
+ // try
+ // {
+ // BGearEntity m = new BGearEntity();
+ // AGearEntity TT = new AGearEntity();
+ // //极限件标志
+ // int ChallengeFlag = 0;
+ // if (i == 0)
+ // {
+ // //为了同时上传AB消息而增加,后续可能不需要
+ // UpAB(ref m);
+
+ // m.A_B = "A芯包";
+ // //芯包信息1 D3300~D3326
+ // for (int j = 0; j < 27; j++)
+ // {
+ // m.list_Data1[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 280 + j * 2, DataFormat.CDAB);
+ // }
+ // //芯包信息2 D3330~D3356
+ // for (int j = 0; j < 27; j++)
+ // {
+ // m.list_Data2[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 280 + j * 2, DataFormat.CDAB);
+ // }
+ // //芯包信息3 D3360~D3386
+ // for (int j = 0; j < 27; j++)
+ // {
+ // m.list_Data3[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 280 + j * 2, DataFormat.CDAB);
+ // }
+
+
+
+
+
+
+ // //A芯包信息1 D3240~D3262
+ // for (int j = 0; j < 28; j++)
+ // {
+ // m.list_Data1[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 280 + j * 2, DataFormat.CDAB);
+ // }
+ // //A芯包信息2(焊机相关次数) D3300~D3326
+ // for (int j = 0; j < 19; j++)
+ // {
+ // m.list_Data2[i, j] = IntLib.GetIntFromByteArray(bArrays.Content, 400 + j * 4, DataFormat.CDAB);
+ // }
+ // //A芯包信息3(设定值) D3400~D3506
+ // for (int j = 0; j < 54; j++)
+ // {
+ // m.list_Data3[i, j] = FloatLib.GetFloatFromByteArray(bArrays.Content, 600 + j * 4, DataFormat.CDAB);
+ // }
+
+ // //A芯包信息4(实际值) D3550~D3634
+ // for (int j = 0; j < 47; j++)
+ // {
+ // m.list_Data4[i, j] = FloatLib.GetFloatFromByteArray(bArrays.Content, 900 + j * 4, DataFormat.CDAB);
+ // }
+ // for (int j = 0; j <1; j++)
+ // {
+ // m.list_pan[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content,1088 + j * 2, DataFormat.CDAB);
+ // }
+
+ // }
+ // else
+ // {
+ // m.A_B = "B芯包";
+ // //B芯包信息1 D3740~D3762
+ // for (int j = 0; j < 28; j++)
+ // {
+ // m.list_Data1[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 1280 + j * 2, DataFormat.CDAB);
+ // }
+ // //B芯包信息2(焊机相关次数) D3800~D3826
+ // for (int j = 0; j < 19; j++)
+ // {
+ // m.list_Data2[i, j] = IntLib.GetIntFromByteArray(bArrays.Content, 1400 + j * 4, DataFormat.CDAB);
+ // }
+ // //B芯包信息3(设定值) D3900~D4006
+ // for (int j = 0; j < 54; j++)
+ // {
+ // m.list_Data3[i, j] = FloatLib.GetFloatFromByteArray(bArrays.Content, 1600 + j * 4, DataFormat.CDAB);
+ // }
+
+ // //B芯包信息4(实际值) D4050~D4134
+ // for (int j = 0; j < 47; j++)
+ // {
+ // m.list_Data4[i, j] = FloatLib.GetFloatFromByteArray(bArrays.Content, 1900 + j * 4, DataFormat.CDAB);
+ // }
+ // for (int j = 0; j < 1; j++)
+ // {
+ // m.list_pan[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 1188 + j * 2, DataFormat.CDAB);
+ // }
+ // }
+ // //芯包扫码时间
+ // //m.ScanTime[i] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ // //芯包条码 D3200~D3239
+ // m.CSBYHCODEA = StringLib.GetStringFromByteArrayByEncoding(bytes1, 200 + 40 * i, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ // //m.CSBYHCODEA = "TEST";
+
+ // var EX = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetChallengeCode(m.CSBYHCODEA));
+ // for (int j = 0; j < EX.Count; j++)
+ // {
+ // if (string.Compare(EX[j].ChallengeBarCode, m.CSBYHCODEA) == 0)
+ // {
+ // m.Remark += "(极限件," + EX[j].CodeMessage + "," + EX[j].WeldingCCD + ")";
+ // ChallengeFlag = 1;
+ // }
+ // }
+ // //查询进站时间数据
+ // var w = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetInTime(m.CSBYHCODEA));
+ // //获取新一行数据
+ // if (w.Count > 0)
+ // TT = w[w.Count - 1];
+ // //
+ // //if (w.Count > 0)
+ // // TT = w[0];
+ // if (TT.TestTime != null)
+ // m.ScanTime[0] = TT.TestTime;
+ // else
+ // m.ScanTime[0] = "";
+ // //芯包出站时间
+ // m.ScanTime[1] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+
+ // //复投次数
+ // m.RethrowNum = 0;
+ // if (w.Count > 0)
+ // {
+ // int cccc = w.Count;
+ // m.RethrowNum = cccc - 1;
+ // }
+
+ // int Code_NG = 0;//条码有无标志 1为有,2为无
+ // //判断有无条码
+ // if (m.CSBYHCODEA != null && m.CSBYHCODEA != "" && m.CSBYHCODEA != "ERROR")
+ // Code_NG = 1;
+ // else
+ // Code_NG = 2;
+
+ // //m.ChannelNo = m.MyNo[i];
+ // //m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+
+ // //不良代码判定
+ // List NGcodeList = new List();
+ // NGcodeList = NGcode(m.list_Data1[i, 10], m.list_Data1[i, 11], m.list_Data1[i, 12], m.list_Data1[i, 15], m.list_Data1[i, 26], m.list_Data1[i, 16]
+ // , m.list_Data1[i, 17], m.list_Data1[i, 18], m.list_Data1[i, 19], m.list_Data1[i, 23], m.list_Data1[i, 24], m.list_Data1[i, 25], m.list_Data1[i, 27]);
+
+ // //芯包重量1判定结果
+ // if (m.list_Data1[i, 10] == 1)
+ // m.CSBYHWEIGHTRESULTA1 = "OK";
+ // else if (m.list_Data1[i, 10] == 2)
+ // m.CSBYHWEIGHTRESULTA1 = "NG";
+ // else
+ // m.CSBYHWEIGHTRESULTA1 = "OK";
+ // //芯包侧厚判定结果
+ // if (m.list_Data1[i, 11] == 1)
+ // m.CSBYHTHICKNESSTESTJUDGERESULTA = "OK";
+ // else if (m.list_Data1[i, 11] == 2)
+ // m.CSBYHTHICKNESSTESTJUDGERESULTA = "NG";
+ // else
+ // m.CSBYHTHICKNESSTESTJUDGERESULTA = "OK";
+ // //芯包CCD极性检测结果
+ // if (m.list_Data1[i, 12] == 1)
+ // m.CSBYHPOLARITYRESULTA = "OK";
+ // else if (m.list_Data1[i, 12] == 2)
+ // m.CSBYHPOLARITYRESULTA = "NG";
+ // else
+ // m.CSBYHPOLARITYRESULTA = "OK";
+ // //电芯裁切粘连判定结果
+ // if (m.list_Data1[i, 13] == 1)
+ // m.CSBYHCUTADHESIONJUDGERESULTA = "OK";
+ // else if (m.list_Data1[i, 13] == 2)
+ // m.CSBYHCUTADHESIONJUDGERESULTA = "NG";
+ // else
+ // m.CSBYHCUTADHESIONJUDGERESULTA = "OK";
+ // //电芯裁切毛刺判定结果
+ // if (m.list_Data1[i, 14] == 1)
+ // m.CSBYHCUTBURRJUDGERESULTA = "OK";
+ // else if (m.list_Data1[i, 14] == 2)
+ // m.CSBYHCUTBURRJUDGERESULTA = "NG";
+ // else
+ // m.CSBYHCUTBURRJUDGERESULTA = "OK";
+ // //芯包铜焊印位置判定结果1
+ // if (m.list_Data1[i, 15] == 1)
+ // {
+ // m.CSBYHSOLDERJUDGERESULTA = "OK";
+ // }
+ // else if (m.list_Data1[i, 15] == 2)
+ // {
+ // m.CSBYHSOLDERJUDGERESULTA = "NG";
+ // }
+ // else
+ // {
+ // m.CSBYHSOLDERJUDGERESULTA = "OK";
+ // }
+ // //芯包铜焊印位置判定结果2
+ // if (m.list_Data1[i, 26] == 1)
+ // {
+ // m.CSBYHSOLDERJUDGERESULTA2 = "OK";
+ // }
+ // else if (m.list_Data1[i, 26] == 2)
+ // {
+ // m.CSBYHSOLDERJUDGERESULTA2 = "NG";
+ // }
+ // else
+ // {
+ // m.CSBYHSOLDERJUDGERESULTA2 = "OK";
+ // }
+ // //芯包正面极耳撕裂判定结果
+ // if (m.list_Data1[i, 16] == 1)
+ // m.CSBYHFRONTEARCRACKLEJUDGERESULTA = "OK";
+ // else if (m.list_Data1[i, 16] == 2)
+ // m.CSBYHFRONTEARCRACKLEJUDGERESULTA = "NG";
+ // else
+ // m.CSBYHFRONTEARCRACKLEJUDGERESULTA = "OK";
+ // //芯包背面极耳撕裂判定结果
+ // if (m.list_Data1[i, 17] == 1)
+ // m.CSBYHBACKEARCRACKLEJUDGERESULTA = "OK";
+ // else if (m.list_Data1[i, 17] == 2)
+ // m.CSBYHBACKEARCRACKLEJUDGERESULTA = "NG";
+ // else
+ // m.CSBYHBACKEARCRACKLEJUDGERESULTA = "OK";
+ // //芯包正面极耳翻折检测结果
+ // if (m.list_Data1[i, 18] == 1)
+ // m.CSBYHFRONTEARFLODINGRESULTA = "OK";
+ // else if (m.list_Data1[i, 18] == 2)
+ // m.CSBYHFRONTEARFLODINGRESULTA = "NG";
+ // else
+ // m.CSBYHFRONTEARFLODINGRESULTA = "OK";
+ // //芯包背面极耳翻折检测结果
+ // if (m.list_Data1[i, 19] == 1)
+ // m.CSBYHBACKEARFLODINGRESULTA = "OK";
+ // else if (m.list_Data1[i, 19] == 2)
+ // m.CSBYHBACKEARFLODINGRESULTA = "NG";
+ // else
+ // m.CSBYHBACKEARFLODINGRESULTA = "OK";
+
+ // //电芯测厚压力结果
+ // if (m.list_Data1[i, 23] == 1)
+ // m.ThicknessPressureResult = "OK";
+ // else if (m.list_Data1[i, 23] == 2)
+ // m.ThicknessPressureResult = "NG";
+ // else
+ // m.ThicknessPressureResult = "OK";
+ // //芯包焊前CCD检测结果
+ // if (m.list_Data1[i, 24] == 1)
+ // m.PreweldResult = "OK";
+ // else if (m.list_Data1[i, 24] == 2)
+ // m.PreweldResult = "NG";
+ // else
+ // m.PreweldResult = "OK";
+ // //芯包铝焊印位置判定结果1
+ // if (m.list_Data1[i, 25] == 1)
+ // {
+ // m.AluminiumWeldPositionResult1 = "OK";
+ // }
+ // else if (m.list_Data1[i, 25] == 2)
+ // {
+ // m.AluminiumWeldPositionResult1 = "NG";
+ // }
+ // else
+ // {
+ // m.AluminiumWeldPositionResult1 = "OK";
+ // }
+ // //芯包铝焊印位置判定结果2
+ // if (m.list_Data1[i, 27] == 1)
+ // {
+ // m.AluminiumWeldPositionResult2 = "OK";
+ // }
+ // else if (m.list_Data1[i, 27] == 2)
+ // {
+ // m.AluminiumWeldPositionResult2 = "NG";
+ // }
+ // else
+ // {
+ // m.AluminiumWeldPositionResult2 = "OK";
+ // }
+
+ // m.CSBYHASCANNINGTIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ // //m.RingA = m.list_Data1[i, 0];//无环轨编号,不显示
+ // m.CSBYHWEIGHTNOA1 = m.list_Data1[i, 1];
+ // m.CSBYHTHICKNESSTESTSTATIONNOA = m.list_Data1[i, 2];
+ // m.CSBYHTOOLNOA = m.list_Data1[i, 3];
+ // m.CSBYHCUWELDINGSTATIONNOA1 = m.list_Data1[i, 4];
+ // m.CSBYHCUWELDINGSTATIONNOA2 = m.list_Data1[i, 5];
+ // m.CSBYHCUWELDINGSTATIONNOA3 = m.list_Data1[i, 6];
+ // m.CSBYHALWELDINGSTATIONNOA1 = m.list_Data1[i, 7];
+ // m.CSBYHALWELDINGSTATIONNOA2 = m.list_Data1[i, 8];
+ // m.CSBYHALWELDINGSTATIONNOA3 = m.list_Data1[i, 9];
+ // m.CSBYHCUTABCUTTERNOA = m.list_Data1[i, 21];
+ // m.CSBYHALTABCUTTERNOA = m.list_Data1[i, 22];
+
+ // m.CSBYHCUWELDHEADCOUNTA1 = m.list_Data2[i, 0];
+ // m.CSBYHCUWELDHEADCOUNTA2 = m.list_Data2[i, 2];
+ // m.CSBYHCUWELDHEADCOUNTA3 = m.list_Data2[i, 4];
+ // m.CSBYHCUWELDBASECOUNTA1 = m.list_Data2[i, 1];
+ // m.CSBYHCUWELDBASECOUNTA2 = m.list_Data2[i, 3];
+ // m.CSBYHCUWELDBASECOUNTA3 = m.list_Data2[i, 5];
+
+ // m.CSBYHALWELDHEADCOUNTA1 = m.list_Data2[i, 6];
+ // m.CSBYHALWELDHEADCOUNTA2 = m.list_Data2[i, 8];
+ // m.CSBYHALWELDHEADCOUNTA3 = m.list_Data2[i, 10];
+ // m.CSBYHALWELDBASECOUNTA1 = m.list_Data2[i, 7];
+ // m.CSBYHALWELDBASECOUNTA2 = m.list_Data2[i, 9];
+ // m.CSBYHALWELDBASECOUNTA3 = m.list_Data2[i, 11];
+ // m.CSBYHCUTABCUTTERCOUNTA = m.list_Data2[i, 12];
+ // m.CSBYHALTABCUTTERCOUNTA = m.list_Data2[i, 13];
+ // m.CopperWeldHeadLife = m.list_Data2[i, 14];
+ // m.CopperWeldSeatLife = m.list_Data2[i, 15];
+ // m.AluminiumWeldHeadLife = m.list_Data2[i, 16];
+ // m.AluminiumWeldSeatLife = m.list_Data2[i, 17];
+ // m.CuttingKnifeLife = m.list_Data2[i, 18];
+
+ // m.CSBYHPROCESSNAME = "超声波预焊接";
+ // m.CSBYHSCHEDULE = CommonMethods.strClass;
+ // m.CSBYHINSTATIONTIME = m.ScanTime[0];
+ // m.CSBYHOUTSTATIONTIME = m.ScanTime[1];
+
+ // m.CSBYHWEIGHTA1MAXSETTING = SaveTwoNum(m.list_Data3[i, 0]);
+ // m.CSBYHWEIGHTA1MINSETTING = SaveTwoNum(m.list_Data3[i, 1]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMAXSETTINGA = SaveTwoNum(m.list_Data3[i, 2]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMINSETTINGA = SaveTwoNum(m.list_Data3[i, 3]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMAXSIZEA = SaveTwoNum(m.list_Data3[i, 4]);
+ // m.CSBYHTHICKNESSTESTPRESSUREMINSIZEA = SaveTwoNum(m.list_Data3[i, 5]);
+ // m.CSBYHCUWELDINGPRESSUREMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 6]);//压力最大
+ // m.CSBYHCUWELDINGPRESSUREMINSETTING = SaveTwoNum(m.list_Data3[i, 7]);//压力最小值
+ // m.CSBYHCUWELDINGPRESSUREMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 14]);//压力只有一个设定值,显示该值
+ // m.CSBYHCUWELDINGPRESSUREMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 22]);//压力只有一个设定值,显示该值
+ // m.CSBYHCUWELDINGPOWERMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 8]);
+ // m.CSBYHCUWELDINGPOWERMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 16]);
+ // m.CSBYHCUWELDINGPOWERMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 24]);
+ // m.CSBYHCUWELDINGPOWERMINSETTING1 = SaveTwoNum(m.list_Data3[i, 9]);
+ // m.CSBYHCUWELDINGPOWERMINSETTING2 = SaveTwoNum(m.list_Data3[i, 17]);
+ // m.CSBYHCUWELDINGPOWERMINSETTING3 = SaveTwoNum(m.list_Data3[i, 25]);
+ // m.CSBYHCUWELDINGENERGYMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 10]);
+ // m.CSBYHCUWELDINGENERGYMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 18]);
+ // m.CSBYHCUWELDINGENERGYMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 26]);
+ // m.CSBYHCUWELDINGENERGYMINSETTING1 = SaveTwoNum(m.list_Data3[i, 11]);
+ // m.CSBYHCUWELDINGENERGYMINSETTING2 = SaveTwoNum(m.list_Data3[i, 19]);
+ // m.CSBYHCUWELDINGENERGYMINSETTING3 = SaveTwoNum(m.list_Data3[i, 27]);
+ // m.CSBYHCUWELDINGAMPLITUDEMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 12]);
+ // m.CSBYHCUWELDINGAMPLITUDEMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 20]);
+ // m.CSBYHCUWELDINGAMPLITUDEMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 28]);
+ // m.CSBYHCUWELDINGAMPLITUDEMINSETTING1 = SaveTwoNum(m.list_Data3[i, 13]);
+ // m.CSBYHCUWELDINGAMPLITUDEMINSETTING2 = SaveTwoNum(m.list_Data3[i, 21]);
+ // m.CSBYHCUWELDINGAMPLITUDEMINSETTING3 = SaveTwoNum(m.list_Data3[i, 29]);
+
+ // m.CSBYHALWELDINGPRESSUREMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 30]);//
+ // m.CSBYHALWELDINGPRESSUREMINSETTING = SaveTwoNum(m.list_Data3[i, 31]);//
+ // m.CSBYHALWELDINGPRESSUREMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 38]);//
+ // m.CSBYHALWELDINGPRESSUREMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 46]);//
+ // m.CSBYHALWELDINGPOWERMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 32]);
+ // m.CSBYHALWELDINGPOWERMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 40]);
+ // m.CSBYHALWELDINGPOWERMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 48]);
+ // m.CSBYHALWELDINGPOWERMINSETTING1 = SaveTwoNum(m.list_Data3[i, 33]);
+ // m.CSBYHALWELDINGPOWERMINSETTING2 = SaveTwoNum(m.list_Data3[i, 41]);
+ // m.CSBYHALWELDINGPOWERMINSETTING3 = SaveTwoNum(m.list_Data3[i, 49]);
+ // m.CSBYHALWELDINGENERGYMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 34]);
+ // m.CSBYHALWELDINGENERGYMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 42]);
+ // m.CSBYHALWELDINGENERGYMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 50]);
+ // m.CSBYHALWELDINGENERGYMINSETTING1 = SaveTwoNum(m.list_Data3[i, 35]);
+ // m.CSBYHALWELDINGENERGYMINSETTING2 = SaveTwoNum(m.list_Data3[i, 43]);
+ // m.CSBYHALWELDINGENERGYMINSETTING3 = SaveTwoNum(m.list_Data3[i, 51]);
+ // m.CSBYHALWELDINGAMPLITUDEMAXSETTING1 = SaveTwoNum(m.list_Data3[i, 36]);
+ // m.CSBYHALWELDINGAMPLITUDEMAXSETTING2 = SaveTwoNum(m.list_Data3[i, 44]);
+ // m.CSBYHALWELDINGAMPLITUDEMAXSETTING3 = SaveTwoNum(m.list_Data3[i, 52]);
+ // m.CSBYHALWELDINGAMPLITUDEMINSETTING1 = SaveTwoNum(m.list_Data3[i, 37]);
+ // m.CSBYHALWELDINGAMPLITUDEMINSETTING2 = SaveTwoNum(m.list_Data3[i, 45]);
+ // m.CSBYHALWELDINGAMPLITUDEMINSETTING3 = SaveTwoNum(m.list_Data3[i, 53]);
+ // //m.pan = m.list_pan[i, 0];
+ // m.CSBYHWEIGHTA1 = SaveTwoNum(m.list_Data4[i, 0]);
+ // m.CSBYHTHICKNESSTESTPRESSUREA = SaveTwoNum(m.list_Data4[i, 1]);
+ // m.CSBYHTHICKNESSTESTPRESSURESIZEA = SaveTwoNum(m.list_Data4[i, 2]);
+ // m.CSBYHCUTABLENGTHA = SaveTwoNum(m.list_Data4[i, 3]);
+ // m.CSBYHCUTABWIDTHA = SaveTwoNum(m.list_Data4[i, 4]);
+ // m.CSBYHALTABLENGTHA = SaveTwoNum(m.list_Data4[i, 5]);
+ // m.CSBYHALTABWIDTHA = SaveTwoNum(m.list_Data4[i, 6]);
+ // m.CSBYHCUTADHESIONRESULTA = SaveTwoNum(m.list_Data4[i, 7]);
+ // m.CSBYHCUTBURRRESULTA = SaveTwoNum(m.list_Data4[i, 8]);
+ // m.CSBYHTOPTOSOLDERDISTANCEA = SaveTwoNum(m.list_Data4[i, 9]);
+ // m.CSBYHTOPTOSOLDERDISTANCEA2 = SaveTwoNum(m.list_Data4[i, 45]);
+ // m.CSBYHSOLDERTOEARDISTANCEA = SaveTwoNum(m.list_Data4[i, 10]);
+ // m.CSBYHFRONTEARCRACKLERESULTA = SaveTwoNum(m.list_Data4[i, 11]);
+ // m.CSBYHBACKEARCRACKLERESULTA = SaveTwoNum(m.list_Data4[i, 12]);
+ // m.AluminumToWeld1 = SaveTwoNum(m.list_Data4[i, 44]);
+ // m.AluminumToWeld2 = SaveTwoNum(m.list_Data4[i, 46]);
+
+ // m.CSBYHCUPRESSUREA1 = SaveTwoNum(m.list_Data4[i, 13]);
+ // m.CSBYHCUPOWERA1 = SaveTwoNum(m.list_Data4[i, 14]);
+ // m.CSBYHCUENERGYA1 = SaveTwoNum(m.list_Data4[i, 15]);
+ // m.CSBYHCUAMPLITUDEA1 = SaveTwoNum(m.list_Data4[i, 16]);
+ // m.CSBYHCUTIMEA1 = SaveTwoNum(m.list_Data4[i, 17]);
+ // m.CSBYHCUPRESSUREA2 = SaveTwoNum(m.list_Data4[i, 18]);
+ // m.CSBYHCUPOWERA2 = SaveTwoNum(m.list_Data4[i, 19]);
+ // m.CSBYHCUENERGYA2 = SaveTwoNum(m.list_Data4[i, 20]);
+ // m.CSBYHCUAMPLITUDEA2 = SaveTwoNum(m.list_Data4[i, 21]);
+ // m.CSBYHCUTIMEA2 = SaveTwoNum(m.list_Data4[i, 22]);
+ // m.CSBYHCUPRESSUREA3 = SaveTwoNum(m.list_Data4[i, 23]);
+ // m.CSBYHCUPOWERA3 = SaveTwoNum(m.list_Data4[i, 24]);
+ // m.CSBYHCUENERGYA3 = SaveTwoNum(m.list_Data4[i, 25]);
+ // m.CSBYHCUAMPLITUDEA3 = SaveTwoNum(m.list_Data4[i, 26]);
+ // m.CSBYHCUTIMEA3 = SaveTwoNum(m.list_Data4[i, 27]);
+
+ // m.CSBYHALPRESSUREA1 = SaveTwoNum(m.list_Data4[i, 28]);
+ // m.CSBYHALPOWERA1 = SaveTwoNum(m.list_Data4[i, 29]);
+ // m.CSBYHALENERGYA1 = SaveTwoNum(m.list_Data4[i, 30]);
+ // m.CSBYHALAMPLITUDEA1 = SaveTwoNum(m.list_Data4[i, 31]);
+ // m.CSBYHALTIMEA1 = SaveTwoNum(m.list_Data4[i, 32]);
+ // m.CSBYHALPRESSUREA2 = SaveTwoNum(m.list_Data4[i, 33]);
+ // m.CSBYHALPOWERA2 = SaveTwoNum(m.list_Data4[i, 34]);
+ // m.CSBYHALENERGYA2 = SaveTwoNum(m.list_Data4[i, 35]);
+ // m.CSBYHALAMPLITUDEA2 = SaveTwoNum(m.list_Data4[i, 36]);
+ // m.CSBYHALTIMEA2 = SaveTwoNum(m.list_Data4[i, 37]);
+ // m.CSBYHALPRESSUREA3 = SaveTwoNum(m.list_Data4[i, 38]);
+ // m.CSBYHALPOWERA3 = SaveTwoNum(m.list_Data4[i, 39]);
+ // m.CSBYHALENERGYA3 = SaveTwoNum(m.list_Data4[i, 40]);
+ // m.CSBYHALAMPLITUDEA3 = SaveTwoNum(m.list_Data4[i, 41]);
+ // m.CSBYHALTIMEA3 = SaveTwoNum(m.list_Data4[i, 42]);
+ // m.ThicknessMeasureDisplacement = m.list_Data4[i, 43];
+
+ // //条码,芯包重量,芯包侧厚,芯包CCD极性检测,电芯裁切粘连,电芯裁切毛刺,芯包焊印位置,
+ // //芯包正面极耳撕裂,芯包背面极耳撕裂,芯包正面极耳翻折,芯包背面极耳翻折
+ // MyRes[i] = JudgmentResult(Code_NG, m.list_Data1[i, 10], m.list_Data1[i, 11],
+ // m.list_Data1[i, 12], m.list_Data1[i, 13], m.list_Data1[i, 14], m.list_Data1[i, 15],
+ // m.list_Data1[i, 16], m.list_Data1[i, 17], m.list_Data1[i, 18], m.list_Data1[i, 19],
+ // m.list_Data1[i, 23], m.list_Data1[i, 24], m.list_Data1[i, 25]);
+
+ // m.Result = MyRes[i];
+
+ // m.CSBYHOUTSTATIONJUDGMENTRESULT = m.judgment_result[i] = OK_NG; ;
+
+ // m.Remark += NG_Type;
+
+ // NG_Type = "";//清除上一次不良字符串
+ // OK_NG = ""; //清除上一次结果
+
+ // list.Add(m);
+
+ // string ur2 = CommonMethods.mesConfig.ResultProcessParamMesUrl;
+ // string siteCode1 = CommonMethods.mesConfig.siteCode;
+ // string lineCode1 = CommonMethods.mesConfig.lineCode;
+ // string equipNum1 = CommonMethods.mesConfig.equipNum;
+ // string materialCode1 = CommonMethods.mesConfig.MaterialCode;
+ // string userName1 = CommonMethods.mesConfig.mesUserName;
+ // MesUploadType unloadType = MesUploadType.DD;
+ // string Mesage = "";
+ // //加判断无条码不上传mes 1为有条码
+ // if (Code_NG == 1)
+ // {
+ // string MesMessage = "";
+ // MesResType mesResType = MesResType.C;
+ // if (CommonMethods.mesConfig.isUpMes)
+ // {
+ // string url = CommonMethods.mesConfig.OutStationMesUrl;
+ // string siteCode = CommonMethods.mesConfig.siteCode;
+ // string lineCode = CommonMethods.mesConfig.lineCode;
+ // string equipNum = CommonMethods.mesConfig.equipNum;
+ // string materialCode = CommonMethods.mesConfig.MaterialCode;
+ // string userName = CommonMethods.mesConfig.mesUserName;
+ // int type = 1;
+ // //int type = 1;
+ // //string materialLotCodeLocator = "";
+
+ // bool Res = CommonMethods.hbgMes.OutboundInformations(url, siteCode, lineCode, equipNum, materialCode, userName, m, ref MesMessage, ref mesResType, NGcodeList);
+ // //bool Res = CommonMethods.hbgMes.SingleCellOutStation(url, siteCode, lineCode, equipNum, materialCode, userName, m,)
+ // if (MesMessage.Contains("发生一个或多个错误"))
+ // {
+ // MesMessage = "上传失败,";
+ // }
+ // else
+ // {
+ // m.Flag = 1;
+ // }
+ // if (Res)
+ // {
+ // //MES出站判定结果
+ // m.Result = MyRes[i];
+ // //芯包重量1判定结果
+ // if (m.list_Data1[i, 10] == 2) { m.Remark += "芯包重量NG,"; }
+ // //芯包侧厚判定结果
+ // if (m.list_Data1[i, 11] == 2) { m.Remark += "芯包侧厚NG,"; }
+ // //芯包CCD极性检测结果
+ // if (m.list_Data1[i, 12] == 2) { m.Remark += "芯包CCD极性检测NG,"; }
+ // m.Remark += MesMessage;
+ // }
+ // else
+ // {
+ // switch (mesResType)
+ // {
+ // case MesResType.A:// 停线,设备报警停机
+ // //m.listRes[i] = 10;
+ // m.Result = MyRes[i] = 2;
+ // //m.Remark = MesMessage[i];
+ // break;
+ // case MesResType.B://不停机,MEs NG品要排出,要给PLC发NG信号
+ // //m.listRes[i] = 9;
+ // m.Result = MyRes[i] = 2;
+ // //m.Remark = MesMessage[i];
+ // break;
+ // case MesResType.C://可忽略
+ // //m.listRes[i] = 1;
+ // m.Result = MyRes[i] = 2;
+ // //m.Remark = MesMessage[i];
+ // break;
+ // default:
+ // m.Result = MyRes[i] = 2;
+ // break;
+ // }
+ // //芯包重量1判定结果
+ // if (m.list_Data1[i, 10] == 2) { m.Remark += "芯包重量NG,"; }
+ // //芯包侧厚判定结果
+ // if (m.list_Data1[i, 11] == 2) { m.Remark += "芯包侧厚NG,"; }
+ // //芯包CCD极性检测结果
+ // if (m.list_Data1[i, 12] == 2) { m.Remark += "芯包CCD极性检测NG,"; }
+ // m.Remark += MesMessage;
+ // }
+
+ // bool Res1 = CommonMethods.hbgMes.ProducResultParam(ur2, siteCode1, lineCode1, equipNum1, materialCode1, userName1, m, unloadType, ref Mesage);
+
+
+ // if (m.Flag == 1)
+ // m.UpState = "已上传";
+ // else
+ // m.UpState = "未上传";
+ // }
+ // else
+ // {
+ // m.Result = MyRes[i];
+ // m.Remark += "本地存储";
+ // m.UpState = "未上传";
+ // }
+ // if (CommonMethods.sysConfig.OKSwitching)
+ // {
+ // //调试发OK
+ // m.Result = MyRes[i] = 1;
+ // //m.Result = "OK";
+ // }
+ // }
+ // else
+ // {
+ // m.Result = MyRes[i] = 2;
+ // m.Remark += "本地存储";
+ // //芯包重量1判定结果
+ // if (m.list_Data1[i, 10] == 2) { m.Remark += ",芯包重量NG"; }
+ // //芯包侧厚判定结果
+ // if (m.list_Data1[i, 11] == 2) { m.Remark += ",芯包侧厚NG"; }
+ // //芯包CCD极性检测结果
+ // if (m.list_Data1[i, 12] == 2) { m.Remark += ",芯包CCD极性检测NG"; }
+ // m.UpState = "未上传";
+ // }
+ // //极限件发3给PLC
+ // if (ChallengeFlag == 1)
+ // {
+ // if (string.Compare(EX[0].WeldingCCD, "焊前CCD") == 0 || string.Compare(EX[0].WeldingCCD, "焊前ccd") == 0)
+ // {
+ // MyRes[i] = 3;
+ // }
+ // if (string.Compare(EX[0].WeldingCCD, "焊后CCD") == 0 || string.Compare(EX[0].WeldingCCD, "焊后ccd") == 0)
+ // {
+ // MyRes[i] = 4;
+ // }
+ // }
+ // }
+ // catch (Exception ex)
+ // {
+ // LogHelper.Instance.WriteError($"外观检测出站线程数据解析:{ex}", "SysErrorLog");
+ // }
+ // }
+
+ // #endregion
+ // JYResult result1 = null;
+ // JYResult result2 = null;
+ // if (pf.IsFeedbackPlc)
+ // {
+ // //result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC
+ // //result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC
+ // //if (CommonMethods.sysConfig.OKSwitching)
+ // {
+ // //调试发OK
+ // //MyRes[0] = 1;
+ // //MyRes[1] = 1;
+ // Thread.Sleep(500);
+ // result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC
+ // result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC
+ // }
+ // //else
+ // //{
+ // // //将mes反馈的结果发给PLC
+ // // Thread.Sleep(500);
+ // // result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC
+ // // result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC
+ // //}
+ // }
+ // JYResult result3 = CommonMethods.PlcLink.WriteValue(pf.VarList[0].VarAddress, 0);//置位0
+ // CommonMethods.AddDataMonitorLog(0, $"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]}");
+ // LogHelper.Instance.WriteLog($"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]}");
+
+ // Task.Run(() => { SendDateMQTT.Instance.EnterandExitSendMessge(1); });
+ // //数据存储 - 异步处理
+ // Task.Run(() =>
+ // {
+ // SaveBlankingData(list);
+ // });
+
+ // sw2.Stop();
+ // ////输出下料数据处理耗时:
+ // CommonMethods.AddDataMonitorLog(0, $"外观检测出站共耗时:{sw2.Elapsed.TotalMilliseconds}ms");
+ // }
+ //}
+ #endregion
+ //下料解析 外观检
+ private void BlankingStation(JYResult bArrays, object plcModel)
+ {
+ Group pf = plcModel as Group;
+ if (bArrays == null)
+ {
+ CommonMethods.PlcLink.WriteInt16(pf.VarList[0].VarAddress, 0);//置位0
+ CommonMethods.AddLog(false, $"电芯出站PLC有触发信号,但无数据!");
+ LoggerHelp.WriteLog($"电芯出站PLC有触发信号,但无数据!", "SysErrorLog");
+ }
+ if (bArrays.IsSuccess && bArrays.Content != null)
+ {
+ Random random = new Random();
+ //解析数据
+ sw2.Restart();
+ #region 数据变量定义
+ List list = new List();//实体
+ //int[] MyRes = new int[2];//AB反馈结果
+ int[] MyRes = new int[3];//三个外观检测反馈结果
+ #endregion
+ //高低位转换
+ byte[] bytes = bArrays.Content.ByteReverse();
+ byte[] bytes1 = bArrays.Content;
+
+ List listBarCode = GetList(3, "");//电芯条码
+ //List listNum = GetList(1, "");//进站磁悬浮动子编号
+ List listRes = GetList(3, 0);//出站电芯反馈结果
+ //反馈结果
+ #region 电芯解析
+ //电芯解析 从3200 开始
+ listBarCode[0] = StringLib.GetStringFromByteArrayByEncoding(bytes, 0, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ listBarCode[1] = StringLib.GetStringFromByteArrayByEncoding(bytes, 40, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ listBarCode[2] = StringLib.GetStringFromByteArrayByEncoding(bytes, 80, 40, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
+ #region 上传MES
+ //D3200起
+ for (int i = 0; i < 3; i++)
+ {
+ try
+ {
+ BGearEntity m = new BGearEntity();
+ AGearEntity TT = new AGearEntity();
+ //极限件标志
+ int ChallengeFlag = 0;
+ //芯包信息1 D3300~D3326
+ //芯包信息2 D3330~D3356
+ //芯包信息3 D3360~D3386
+ for (int j = 0; j < 16; j++)
+ {
+ m.CCD_Data[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 200 + i * 30 * 2 + j * 2, DataFormat.CDAB);
+ }
+ //厚度3400
+ for (int j = 0; j < 3; j++)
+ {
+ m.Thickness_Data[i, j] = FloatLib.GetFloatFromByteArray(bArrays.Content, 400 + i * 30 * 2 + j * 4, DataFormat.CDAB);
+ }
+ //厚度plc 3500
+ for (int j = 0; j < 3; j++)
+ {
+ m.Thickness_PLCData[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 500 + i * 30 * 2 + j * 2, DataFormat.CDAB);
+ }
+ //不良ng编号4300
+ for (int j = 0; j < 16; j++)
+ {
+ m.CCD_NgNo[i, j] = ShortLib.GetShortFromByteArray(bArrays.Content, 2200 + i * 30 * 2 + j * 2, DataFormat.CDAB);
+ }
+
+
+ //芯包扫码时间
+ //m.ScanTime[i] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ m.BarCode = listBarCode[i];
+ //m.CSBYHCODEA = "TEST";
+ #region 极限件查询
+ //var EX = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetChallengeCode(m.BarCode));
+ //for (int j = 0; j < EX.Count; j++)
+ //{
+ // if (string.Compare(EX[j].ChallengeBarCode, m.BarCode) == 0)
+ // {
+ // m.Remark += "(极限件," + EX[j].CodeMessage + "," + EX[j].WeldingCCD + ")";
+ // ChallengeFlag = 1;
+ // }
+ //}
+ #endregion
+ //查询进站时间数据
+ var w = CommonMethods.db.QuerySqlList(CommonMethods.dBSQL.GetInTime(m.BarCode));
+ //获取新一行数据
+ if (w.Count > 0)
+ TT = w[w.Count - 1];
+ //
+ //if (w.Count > 0)
+ // TT = w[0];
+ if (TT.TestTime != null)
+ m.ScanTime[0] = TT.TestTime;
+ else
+ m.ScanTime[0] = "";
+ //芯包出站时间
+ m.ScanTime[1] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+
+ //复投次数
+ m.RethrowNum = 0;
+ if (w.Count > 0)
+ {
+ int cccc = w.Count;
+ m.RethrowNum = cccc - 1;
+ }
+
+ int Code_NG = 0;//条码有无标志 1为有,2为无
+ //判断有无条码
+ if (m.BarCode != null && m.BarCode != "" && m.BarCode != "ERROR")
+ Code_NG = 1;
+ else
+ Code_NG = 2;
+
+ //m.ChannelNo = m.MyNo[i];
+ //m.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+
+ //不良代码判定
+ //List NGcodeList = new List();
+ //NGcodeList = NGcode(m.list_Data1[i, 10], m.list_Data1[i, 11], m.list_Data1[i, 12], m.list_Data1[i, 15], m.list_Data1[i, 26], m.list_Data1[i, 16]
+ // , m.list_Data1[i, 17], m.list_Data1[i, 18], m.list_Data1[i, 19], m.list_Data1[i, 23], m.list_Data1[i, 24], m.list_Data1[i, 25], m.list_Data1[i, 27]);
+ // var (NGcodeList, NGmessage) = NGWGJcode(m.CCD_Data, i);
+
+ //电芯CCD判定结果
+ #region //电芯CCD判定结果 1 0K 0NG 2缺图
+ m.CCDResult1 = m.CCD_Data[i, 0] == 1 ? "OK" : (m.CCD_Data[i, 0] == 0 ? "NG" : "缺图");
+ m.CCDResult2 = m.CCD_Data[i, 1] == 1 ? "OK" : (m.CCD_Data[i, 1] == 0 ? "NG" : "缺图");
+ m.CCDResult3 = m.CCD_Data[i, 2] == 1 ? "OK" : (m.CCD_Data[i, 2] == 0 ? "NG" : "缺图");
+ m.CCDResult4 = m.CCD_Data[i, 3] == 1 ? "OK" : (m.CCD_Data[i, 3] == 0 ? "NG" : "缺图");
+ m.CCDResult5 = m.CCD_Data[i, 4] == 1 ? "OK" : (m.CCD_Data[i, 4] == 0 ? "NG" : "缺图");
+ m.CCDResult6 = m.CCD_Data[i, 5] == 1 ? "OK" : (m.CCD_Data[i, 5] == 0 ? "NG" : "缺图");
+ m.CCDResult7 = m.CCD_Data[i, 6] == 1 ? "OK" : (m.CCD_Data[i, 6] == 0 ? "NG" : "缺图");
+ m.CCDResult8 = m.CCD_Data[i, 7] == 1 ? "OK" : (m.CCD_Data[i, 7] == 0 ? "NG" : "缺图");
+ m.CCDResult9 = m.CCD_Data[i, 8] == 1 ? "OK" : (m.CCD_Data[i, 8] == 0 ? "NG" : "缺图");
+ m.CCDResult10 = m.CCD_Data[i, 9] == 1 ? "OK" : (m.CCD_Data[i, 9] == 0 ? "NG" : "缺图");
+ m.CCDResult11 = m.CCD_Data[i, 10] == 1 ? "OK" : (m.CCD_Data[i, 10] == 0 ? "NG" : "缺图");
+ m.CCDResult12 = m.CCD_Data[i, 11] == 1 ? "OK" : (m.CCD_Data[i, 11] == 0 ? "NG" : "缺图");
+ m.CCDResult13 = m.CCD_Data[i, 12] == 1 ? "OK" : (m.CCD_Data[i, 12] == 0 ? "NG" : "缺图");
+ m.CCDResult14 = m.CCD_Data[i, 13] == 1 ? "OK" : (m.CCD_Data[i, 13] == 0 ? "NG" : "缺图");
+ m.CCDResult15 = m.CCD_Data[i, 14] == 1 ? "OK" : (m.CCD_Data[i, 14] == 0 ? "NG" : "缺图");
+ m.CCDResult16 = m.CCD_Data[i, 15] == 1 ? "OK" : (m.CCD_Data[i, 15] == 0 ? "NG" : "缺图");
+ #endregion
+ #region //厚度判定结果
+ m.ThicknessResult1 = m.Thickness_PLCData[i, 0] == 1 ? "OK" : (m.Thickness_PLCData[i, 0] == 0 ? "NG" : "缺测");
+ m.ThicknessResult2 = m.Thickness_PLCData[i, 1] == 1 ? "OK" : (m.Thickness_PLCData[i, 1] == 0 ? "NG" : "缺测");
+ m.ThicknessResult3 = m.Thickness_PLCData[i, 2] == 1 ? "OK" : (m.Thickness_PLCData[i, 2] == 0 ? "NG" : "缺测");
+ #endregion
+ m.CSBYHASCANNINGTIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ m.CSBYHPROCESSNAME = "外观检测";
+ m.CSBYHSCHEDULE = CommonMethods.strClass;
+ m.CSBYHINSTATIONTIME = m.ScanTime[0];
+ m.CSBYHOUTSTATIONTIME = m.ScanTime[1];
+
+ m.Thickness1 = SaveTwoNum(m.Thickness_Data[i, 0]);
+ m.Thickness2 = SaveTwoNum(m.Thickness_Data[i, 1]);
+ m.Thickness3 = SaveTwoNum(m.Thickness_Data[i, 2]);
+ m.ChannelNo = i + 1;
+ //条码,芯包重量,芯包侧厚,芯包CCD极性检测,电芯裁切粘连,电芯裁切毛刺,芯包焊印位置,
+ //芯包正面极耳撕裂,芯包背面极耳撕裂,芯包正面极耳翻折,芯包背面极耳翻折
+ if (Code_NG == 1)
+ {
+ for (int ii = 0; ii < 16; ii++)
+ {
+ if (m.CCD_Data[i, ii] != 1)
+ {
+ //1OK,2扫码NG,3MES反馈NG,4其他NG
+ MyRes[i] = 4;
+ break;
+ }
+
+ }
+ }
+ else
+ MyRes[i] = 2;//扫码NG
+ MyRes[i] = JudgmentCCDResult(Code_NG, m.CCD_Data,i);
+ MyRes[i] = JudgmentThickNessResult(m.Thickness_PLCData, i, MyRes[i]);
+ m.Result = MyRes[i];
+
+ m.CSBYHOUTSTATIONJUDGMENTRESULT = m.judgment_result[i] = OK_NG;
+
+ m.Remark += NG_Type;
+ m.MaterialCode = CommonMethods.mesConfig.MaterialCode;
+ NG_Type = "";//清除上一次不良字符串
+ OK_NG = ""; //清除上一次结果
+
+ list.Add(m);
+
+ string ur2 = CommonMethods.mesConfig.ResultProcessParamMesUrl;
+ string siteCode1 = CommonMethods.mesConfig.siteCode;
+ string lineCode1 = CommonMethods.mesConfig.lineCode;
+ string equipNum1 = CommonMethods.mesConfig.equipNum;
+ string materialCode1 = CommonMethods.mesConfig.MaterialCode;
+ string userName1 = CommonMethods.mesConfig.mesUserName;
+ MesUploadType unloadType = MesUploadType.DD;
+ string Mesage = "";
+ //加判断无条码不上传mes 1为有条码
+ if (Code_NG == 1)
+ {
+ string MesMessage = "";
+ MesResType mesResType = MesResType.C;
+ if (CommonMethods.mesConfig.isUpMes)
+ {
+ string url = CommonMethods.mesConfig.OutStationMesUrl;
+ string siteCode = CommonMethods.mesConfig.siteCode;
+ string lineCode = CommonMethods.mesConfig.lineCode;
+ string equipNum = CommonMethods.mesConfig.equipNum;
+ string materialCode = CommonMethods.mesConfig.MaterialCode;
+ string userName = CommonMethods.mesConfig.mesUserName;
+ int type = 1;
+ //int type = 1;
+ //string materialLotCodeLocator = "";
+ var (NGcodeList, NGmessage) = NGWGJcode(m.CCD_NgNo, i);
+ bool Res = CommonMethods.hbgMes.OutboundInformations(url, siteCode, lineCode, equipNum, materialCode, userName, m, ref MesMessage, ref mesResType, NGcodeList, NGmessage);
+ //bool Res = CommonMethods.hbgMes.SingleCellOutStation(url, siteCode, lineCode, equipNum, materialCode, userName, m,)
+ if (MesMessage.Contains("发生一个或多个错误"))
+ {
+ MesMessage = "上传失败,";
+ }
+ else
+ {
+ m.Flag = 1;
+ }
+ if (Res)
+ {
+ //MES出站判定结果
+ m.Result = MyRes[i];
+ ////芯包重量1判定结果
+ //if (m.list_Data1[i, 10] == 2) { m.Remark += "芯包重量NG,"; }
+ ////芯包侧厚判定结果
+ //if (m.list_Data1[i, 11] == 2) { m.Remark += "芯包侧厚NG,"; }
+ ////芯包CCD极性检测结果
+ //if (m.list_Data1[i, 12] == 2) { m.Remark += "芯包CCD极性检测NG,"; }
+ m.Remark += MesMessage;
+ }
+ else
+ {
+ switch (mesResType)
+ {
+ case MesResType.A:// 停线,设备报警停机
+ //m.listRes[i] = 10;
+ // m.Result = MyRes[i] = 2;
+ m.Result = MyRes[i] = 3;
+ m.Remark += "MES NG";
+ break;
+ case MesResType.B://不停机,MEs NG品要排出,要给PLC发NG信号
+ //m.listRes[i] = 9;
+ // m.Result = MyRes[i] = 2;
+ m.Result = MyRes[i] = 3;
+ m.Remark += "MES NG";
+ break;
+ case MesResType.C://可忽略
+ //m.listRes[i] = 1;
+ // m.Result = MyRes[i] = 2;
+ m.Result = MyRes[i] = 1;
+ m.Remark += "MES Alerm OK";
+ break;
+ case MesResType.D://可忽略
+ //m.listRes[i] = 1;
+ // m.Result = MyRes[i] = 2;
+ m.Result = MyRes[i] = 1;
+ m.Remark += "MES OK";
+ break;
+ default:
+ m.Remark += "MES NG";
+ m.Result = MyRes[i] = 3;
+ break;
+ }
+ ////芯包重量1判定结果
+ //if (m.list_Data1[i, 10] == 2) { m.Remark += "芯包重量NG,"; }
+ ////芯包侧厚判定结果
+ //if (m.list_Data1[i, 11] == 2) { m.Remark += "芯包侧厚NG,"; }
+ ////芯包CCD极性检测结果
+ //if (m.list_Data1[i, 12] == 2) { m.Remark += "芯包CCD极性检测NG,"; }
+ m.Remark += MesMessage;
+ }
+ //发送产品结果参数给MES
+ bool Res1 = CommonMethods.hbgMes.ProducResultParam(ur2, siteCode1, lineCode1, equipNum1, materialCode1, userName1, m, unloadType, ref Mesage);
+
+
+ if (m.Flag == 1)
+ m.UpState = "已上传";
+ else
+ m.UpState = "未上传";
+ }
+ else
+ {
+ m.Result = MyRes[i];
+ m.Remark += "本地存储";
+ m.UpState = "未上传";
+ }
+ if (CommonMethods.sysConfig.OKSwitching)
+ {
+ //调试发OK
+ m.Result = MyRes[i] = 1;
+ //m.Result = "OK";
+ }
+ }
+ else
+ {
+ m.Result = MyRes[i] = 2;
+ m.Remark += "本地存储";
+ ////芯包重量1判定结果
+ //if (m.list_Data1[i, 10] == 2) { m.Remark += ",芯包重量NG"; }
+ ////芯包侧厚判定结果
+ //if (m.list_Data1[i, 11] == 2) { m.Remark += ",芯包侧厚NG"; }
+ ////芯包CCD极性检测结果
+ //if (m.list_Data1[i, 12] == 2) { m.Remark += ",芯包CCD极性检测NG"; }
+ m.UpState = "未上传";
+ }
+ #region//极限件发3给PLC
+ //if (ChallengeFlag == 1)
+ //{
+ // if (string.Compare(EX[0].WeldingCCD, "焊前CCD") == 0 || string.Compare(EX[0].WeldingCCD, "焊前ccd") == 0)
+ // {
+ // MyRes[i] = 3;
+ // }
+ // if (string.Compare(EX[0].WeldingCCD, "焊后CCD") == 0 || string.Compare(EX[0].WeldingCCD, "焊后ccd") == 0)
+ // {
+ // MyRes[i] = 4;
+ // }
+ //}
+ #endregion
+ }
+ catch (Exception ex)
+ {
+ LoggerHelp.WriteLog($"外观检测出站线程数据解析:{ex}", "SysErrorLog");
+ }
+ }
+
+ #endregion
+ JYResult result1 = null;
+ JYResult result2 = null;
+ JYResult result3 = null;
+ if (pf.IsFeedbackPlc)
+ {
+ //result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC
+ //result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC
+ // if (CommonMethods.sysConfig.OKSwitching)
+ {
+ //调试发OK
+ //MyRes[0] = 1;
+ //MyRes[1] = 1;
+ Thread.Sleep(500);
+ result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC
+ result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC
+ result3 = CommonMethods.PlcLink.WriteValue(pf.VarList[4].VarAddress, MyRes[2], Data_Type.Short);//判断结果写入PLC
+ }
+ //else
+ //{
+ // //将mes反馈的结果发给PLC
+ // Thread.Sleep(500);
+ // result1 = CommonMethods.PlcLink.WriteValue(pf.VarList[2].VarAddress, MyRes[0], Data_Type.Short);//判断结果写入PLC
+ // result2 = CommonMethods.PlcLink.WriteValue(pf.VarList[3].VarAddress, MyRes[1], Data_Type.Short);//判断结果写入PLC
+ //}
+ }
+ JYResult result4 = CommonMethods.PlcLink.WriteValue(pf.VarList[0].VarAddress, 0);//置位0
+ CommonMethods.AddDataMonitorLog(0, $"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]},{MyRes[2]}");
+ LoggerHelp.WriteLog($"发送信息给PLC:{result1.IsSuccess},{MyRes[0]},{MyRes[1]},{MyRes[2]}");
+
+ Task.Run(() => { SendDateMQTT.Instance.EnterandExitSendMessge(1); });
+ //数据存储 - 异步处理
+ Task.Run(() =>
+ {
+ SaveBlankingData(list);
+ });
+
+ sw2.Stop();
+ ////输出下料数据处理耗时:
+ CommonMethods.AddDataMonitorLog(0, $"外观检测出站共耗时:{sw2.Elapsed.TotalMilliseconds}ms");
+ }
+ }
+ ///
+ /// 电池结果判断
+ ///
+ ///
+ ///
+ ///
+ private ushort GetResult(AGearEntity m, ref string strErr)
+ {
+ //strErr = "";
+ //bool b = m.YaLiValue <= 2 ? true : false;//压力值结果NG
+ //if (b)
+ //{
+ // strErr = "良品";
+ // return 1;
+ //}
+ //if (!b)
+ //{
+ // strErr = "压力值NG";
+ // return 5;
+ //}
+
+ return 1;
+ }
+
+ #region 保存下料数据
+ ///
+ /// 保存下料数据到数据
+ ///
+ ///
+ private void SaveBlankingData(List list)
+ {
+ //数据的保存
+ try
+ {
+ if (list != null && list.Count > 0)
+ {
+ //数据显示
+ List Blist = list;
+ int i = 0;
+ string strRes = "";
+ foreach (BGearEntity m in list)
+ {
+ bool b = CommonMethods.db.AddReturnBool(m);
+
+ if(!b)
+ {
+ strRes = ",不存储";
+ }
+ m.Remark = m.Remark + strRes;
+ Blist[i].Remark = m.Remark;
+ i++;
+ }
+
+ //数据显示
+ CommonMethods.ShowBlankingDelegate.Invoke(Blist);
+ }
+ else
+ {
+ LoggerHelp.WriteLog($"电芯出站数据List为空", "SysErrorLog");
+ }
+ }
+ catch (Exception ex)
+ {
+ LoggerHelp.WriteLog($"电芯出站数据保存异常:{ex}", "SysErrorLog");
+ }
+ }
+ #endregion
+
+ #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
+
+ #region 下料不良代码
+ public List NGcode(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m)
+ {
+ //芯包重量、测厚位移、极性、铜焊印位置1、铜焊印位置2、正面极耳撕裂、背面极耳撕裂、
+ //正面极耳翻折、背面极耳翻折、测厚压力、焊前CCD、铝焊印位置1、铝焊印位置2
+ List NGcodelist = new List();
+ if (a == 2 || b == 2) NGcodelist.Add("ETPP120");
+ if (j == 2) NGcodelist.Add("ETPP119");
+ if (c == 2) NGcodelist.Add("ETPP005");
+ if (d == 2 || e == 2 || l == 2 || m == 2) NGcodelist.Add("ETPP118");
+ if (f == 2 || g == 2) NGcodelist.Add("ETPP106");
+ if (h == 2 || i == 2) NGcodelist.Add("ETPP108");
+ if (k == 2) NGcodelist.Add("ETPA111");
+
+ return NGcodelist;
+ }
+ //下料不良代码 外观检
+ public (List, List) NGWGJcode(int[,] lstResult, int index)
+ {
+
+ List NGcodelist = new List();
+ List NGmessagelist = new List();
+ for (int i = 0; i < 16; i++)
+ {
+ if (lstResult[index, i] != 0)
+ {
+ var strCode = lstResult[index, i].ToString().PadLeft(3, '0');
+ NGcodelist.Add($"PFVA{strCode}");
+ var codeEntity = CommonMethods.listNgCodeEntity.FirstOrDefault(x => strCode == x.ngCode);
+ if (codeEntity != null)
+ {
+ NGmessagelist.Add(codeEntity.ngMessage);
+ }
+ else
+ {
+ NGmessagelist.Add("未知错误");
+ }
+ }
+ }
+
+ return (NGcodelist, NGmessagelist);
+ }
+
+ #endregion
+
+ #region NG下料不良代码
+ public List NGCarcode(int a, int b, int c)
+ {
+ //芯包重量、测厚位移、极性
+ List NGcodelist = new List();
+ if (a == 2) NGcodelist.Add("ETPP120");
+ if (b == 2) NGcodelist.Add("ETPP120");
+ if (c == 2) NGcodelist.Add("ETPP105");
+
+ return NGcodelist;
+ }
+ #endregion
+ }
+}
+#endregion
+#endregion
diff --git a/JinYuan.ControlCenter/ControlCenter_Total.cs b/JinYuan.ControlCenter/ControlCenter_Total.cs
new file mode 100644
index 0000000..fb6e632
--- /dev/null
+++ b/JinYuan.ControlCenter/ControlCenter_Total.cs
@@ -0,0 +1,467 @@
+using HslCommunication.ModBus;
+using JinYuan.CommunicationLib.Enum;
+using JinYuan.DataConvertLib;
+using JinYuan.Helper;
+using JinYuan.MES.Models;
+using JinYuan.Models;
+using JinYuan.VirtualDataLibrary;
+using PLCCommunication;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace JinYuan.ControlCenters
+{
+ public partial class ControlCenter
+ {
+ #region 刷新12小时产能
+ public void Refresh12HourProdQty()
+ {
+ List chart12Hours = new List();
+ int j = 0;
+ int m = 0;
+ int n = 0;
+ DateTime dtTime = DateTime.Now;
+ string strDate = dtTime.ToString("yyyy-MM-dd");
+ int Hour = GetHour();
+ var listTotal = CommonMethods.db.QueryWhereList(t => t.FDate == strDate);// 查询稼动率表中total数据
+ if (listTotal != null && listTotal.Count > 0)
+ {
+ for (int i = 1; i < 13; i++)
+ {
+ #region X轴数据
+
+ if (CommonMethods.strClass != "白班")
+ {
+ j = i + 21;
+
+ if (j >= 25 && j < 26)
+ {
+ m = j - 2;
+ n = j - 25;
+ }
+ else if (j >= 26)
+ {
+ m = j - 26;
+ n = j - 25;
+ }
+ else
+ {
+ m = j - 2;
+ n = j - 1;
+ }
+ }
+ else
+ {
+ j = i + 9;
+ m = j - 2;
+ n = j - 1;
+ }
+ #endregion
+
+ int Fhour = Convert.ToInt32(m);
+ var hour1 = listTotal.Where(p => p.FHour == Fhour).FirstOrDefault();
+ int ProdALLQty = 0;
+ int ProdOKQty = 0;
+ int ProdNGQty = 0;
+ string strOkRatio = "0.00";
+
+ if (hour1 != null)
+ {
+ ProdALLQty += hour1.ProdIn;
+ ProdOKQty += hour1.ProdOut;
+ }
+
+ ProdNGQty = ProdALLQty - ProdOKQty;
+ if (ProdOKQty >= 0 && ProdALLQty > 0)
+ {
+ strOkRatio = (Math.Round(decimal.Parse(ProdOKQty.ToString()) / decimal.Parse(ProdALLQty.ToString()), 4)).ToString();
+ }
+ else
+ {
+ strOkRatio = "0.00";
+ }
+
+ chart12Hours.Add(new Chart12HourData()
+ {
+ DisplayTime = m + ":30~" + (n) + ":30",
+ ProdIn = ProdALLQty,
+ ProdOut = ProdOKQty,
+ ProdNg = ProdNGQty,
+ OKRatio = strOkRatio
+ });
+ }
+ }
+ else
+ {
+ for (int i = 1; i < 13; i++)
+ {
+ #region X轴数据
+
+ if (CommonMethods.strClass != "白班")
+ {
+ j = i + 21;
+
+ if (j >= 25 && j < 26)
+ {
+ m = j - 2;
+ n = j - 25;
+ }
+ else if (j >= 26)
+ {
+ m = j - 26;
+ n = j - 25;
+ }
+ else
+ {
+ m = j - 2;
+ n = j - 1;
+ }
+
+ }
+ else
+ {
+ j = i + 9;
+ m = j - 2;
+ n = j - 1;
+ }
+ #endregion
+
+ Random rand = new Random();
+ int ranOK = rand.Next(1000, 3000);
+ int ranNG = rand.Next(400, 1200);
+ int total = ranOK + ranNG;
+
+ chart12Hours.Add(new Chart12HourData()
+ {
+ DisplayTime = m + ":30~" + n + ":30",
+ ProdIn = ranOK + ranNG,
+ ProdOut = ranOK,
+ ProdNg = ranNG,
+ OKRatio = (Math.Round(decimal.Parse(ranOK.ToString()) / decimal.Parse(total.ToString()) * 0.01m, 2) * 100).ToString()
+ });
+ }
+
+ }
+
+
+ if (chart12Hours != null)
+ {
+ CommonMethods.Lst_Prod12HourData = chart12Hours;
+ }
+ }
+
+
+ public int GetHour()
+ {
+ DateTime now = DateTime.Now;
+ int nowHour = Convert.ToInt32($"{now.Hour}30");
+ int hour = 0;
+ if (CommonMethods.LastHour != nowHour)
+ {
+ hour = Convert.ToInt32($"{now.Hour - 1}30");
+ if (now.Hour == 0)
+ {
+ hour = 2330;
+ }
+ }
+ else
+ {
+ hour = Convert.ToInt32($"{now.Hour}30");
+ }
+ return hour;
+ }
+
+
+ #endregion
+
+ #region 检测项不良
+ ///
+ /// 读取检测项不良
+ ///
+ private void GetDefectTypeQty()
+ {
+
+ try
+ {
+ if (CommonMethods.Lst_DefectTypeQty.Count <= 0)
+ {
+ //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "极性检测不良", DataCount = 0 });
+ //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "称重不良", DataCount = 0 });
+ //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "铜极耳剪切不良", DataCount = 0 });
+ //CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "铝极耳剪切不良", DataCount = 0 });
+
+ CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "扫码不良", DataCount = 0 });
+ CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "MES不良", DataCount = 0 });
+ CommonMethods.Lst_DefectTypeQty.Add(new ChartDataType { DataType = "其他不良", DataCount = 0 });
+
+ }
+ else //读取PLC数据
+ {
+ if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ {
+ Task.Run(() =>
+ {
+ try
+ {
+ int ProdDRFIDNgQty = CommonMethods.PlcLink.ReadInt16("D1000");//扫码不良
+ int ProdDXNgQty = CommonMethods.PlcLink.ReadInt16("D1001");//MES不良
+ int ProdGRFIDNgQty = CommonMethods.PlcLink.ReadInt16("D1002");//其他不良
+
+ ////從PLC讀取數據賦值給到NGList
+ //CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "极性检测不良").FirstOrDefault().DataCount = ProdDRFIDNgQty;
+ //CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "称重不良").FirstOrDefault().DataCount = ProdDXNgQty;
+ //CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "铜极耳剪切不良").FirstOrDefault().DataCount = ProdGRFIDNgQty;
+ //CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "铝极耳剪切不良").FirstOrDefault().DataCount = ProdYLZNgQty;
+ //從PLC讀取數據賦值給到NGList
+ CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "扫码不良").FirstOrDefault().DataCount = ProdDRFIDNgQty;
+ CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "MES不良").FirstOrDefault().DataCount = ProdDXNgQty;
+ CommonMethods.Lst_DefectTypeQty.Where(p => p.DataType == "其他不良").FirstOrDefault().DataCount = ProdGRFIDNgQty;
+ }
+ catch (Exception ex)
+ {
+ LoggerHelp.WriteEX(ex);
+ }
+ });
+
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LoggerHelp.WriteEX(ex);
+ }
+ }
+ #endregion
+
+ #region 智能电表 ---默认D1100开始
+ public void GetEnergyData()
+ {
+ ModbusRtu busRtuClient = new ModbusRtu();
+ if (CommonMethods.plcDevice != null && CommonMethods.plcDevice.IsConnected)
+ {
+
+ List listM = new List();
+ List ListF = new List();
+ List listAddre = new List()
+ {
+ "D1100","D1102","D1104","D1106","D1108","D1110","D1112","D1114","D1116","D1118","D1120","D1122","D1124","D1126"
+ };
+ try
+ {
+ busRtuClient.SerialPortInni(sp =>
+ {
+ sp.PortName = "COM1";
+ sp.BaudRate = 9600;
+ sp.DataBits = 8;
+ sp.StopBits = System.IO.Ports.StopBits.One;
+ sp.Parity = System.IO.Ports.Parity.None;
+ });
+ busRtuClient.DataFormat = HslCommunication.Core.DataFormat.CDAB;
+ busRtuClient.Open(); // 打开
+ if (busRtuClient.IsOpen())
+ {
+ // 读取数据
+ HslCommunication.OperateResult readResult = busRtuClient.Read("35", 30);
+ HslCommunication.OperateResult readResult1 = busRtuClient.Read("3", 2);
+ if (readResult.IsSuccess && readResult1.IsSuccess)
+ {
+ //DPT
+ Byte DptH = busRtuClient.ByteTransform.TransByte(readResult.Content, 0);//高8位
+ Byte DptL = busRtuClient.ByteTransform.TransByte(readResult.Content, 1);//低8位
+ //DPQ
+ Byte DpqH = busRtuClient.ByteTransform.TransByte(readResult.Content, 2);//高8位
+ Byte DpqL = busRtuClient.ByteTransform.TransByte(readResult.Content, 3);//低8位
+
+ ElectricEnergy m = new ElectricEnergy();
+ Decimal q = busRtuClient.ByteTransform.TransUInt16(readResult.Content, 56);
+ Decimal w = busRtuClient.ByteTransform.TransUInt16(readResult.Content, 58);
+
+ m.pt = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult1.Content, 0)); //电压变比 D1124
+ m.ct = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult1.Content, 2)); //电流变比 D1126
+ Decimal Power = (q * 65536 + w) / 1000;
+ m.AccumulatedElectricity = Convert.ToDecimal(Power * m.pt * m.ct); //有功电能(累计电能)D1100
+ ListF.Add((float)m.AccumulatedElectricity.Value);
+ //电压
+ m.PhaseVoltageA = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 4) * Math.Pow(10, DptH - 4)); //A相电压 D1102
+ m.PhaseVoltageB = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 6) * Math.Pow(10, DptH - 4));//B相电压 D1104
+ m.PhaseVoltageC = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 8) * Math.Pow(10, DptH - 4));//C相电压 D1106
+ ListF.Add((float)m.PhaseVoltageA.Value);
+ ListF.Add((float)m.PhaseVoltageB.Value);
+ ListF.Add((float)m.PhaseVoltageC.Value);
+
+ //电流
+ m.PhaseCurrentA = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 16) * Math.Pow(10, DptL - 4)); //电流IA D1108
+ m.PhaseCurrentB = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 18) * Math.Pow(10, DptL - 4));//电流IB D1110
+ m.PhaseCurrentC = Convert.ToDecimal(busRtuClient.ByteTransform.TransUInt16(readResult.Content, 20) * Math.Pow(10, DptL - 4));//电流IC D1112
+ ListF.Add((float)m.PhaseCurrentA.Value);
+ ListF.Add((float)m.PhaseCurrentB.Value);
+ ListF.Add((float)m.PhaseCurrentC.Value);
+
+ //有功功率
+ m.PhasePowerA = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 22) * Math.Pow(10, DpqH - 4)); //A相有功功率 D1114
+ m.PhasePowerB = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 24) * Math.Pow(10, DpqH - 4)); //B相有功功率 D1116
+ m.PhasePowerC = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 26) * Math.Pow(10, DpqH - 4));//C相有功功率 D1118
+ m.ActivePower = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 28) * Math.Pow(10, DpqH - 4)); //总有功功率 D1120
+ ListF.Add((float)m.PhasePowerA.Value);
+ ListF.Add((float)m.PhasePowerB.Value);
+ ListF.Add((float)m.PhasePowerC.Value);
+ ListF.Add((float)m.ActivePower.Value);
+ m.PowerFactor = Convert.ToDecimal(busRtuClient.ByteTransform.TransInt16(readResult.Content, 44)) / 1000; //总功率因数 D1122
+ ListF.Add((float)m.PowerFactor.Value);
+ ListF.Add((float)m.pt.Value);
+ ListF.Add((float)m.ct.Value);
+
+ for (int i = 0; i < ListF.Count; i++)
+ {
+ CommonMethods.PlcLink.WriteFloat(listAddre[i], ListF[i]);
+ }
+ listM.Add(m);
+ CommonMethods.listElectricEnergy = listM;
+
+ }
+ else
+ {
+ TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "智能电表:读取数据失败");
+ }
+ }
+ else
+ {
+ TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "智能电表:串口打开失败");
+ }
+ }
+ catch (Exception ex)
+ {
+ TxtHelper.WriteTxt($@"D:\APILog\Logs\智能电表信息\{DateTime.Now.ToString("yyyy-MM-dd")}.txt", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + $"智能电表:{ex}");
+ }
+ finally
+ {
+ if (busRtuClient.IsOpen())
+ {
+ busRtuClient.Close();
+ }
+ }
+
+ }
+ }
+
+ ///
+ /// 能耗上传MES
+ ///
+ public void UploadEquEnergy()
+ {
+ if (CommonMethods.listElectricEnergy.Count > 0)
+ {
+ if (CommonMethods.mesConfig.isUpMes)
+ {
+ string msg = string.Empty;
+ DateTime nowDate = DateTime.Now;
+ string filePath = string.Empty;
+ string fileName = string.Empty;
+ string fileTitle = string.Empty;
+ string fileContent = string.Empty;
+ List listP = new List();
+ int i = 0;
+ foreach (ElectricEnergy m in CommonMethods.listElectricEnergy)
+ {
+ WattrMeter param = new WattrMeter();
+ param.siteCode = CommonMethods.mesConfig.siteCode;
+ param.lineCode = CommonMethods.mesConfig.lineCode;
+ param.equipNum = CommonMethods.mesConfig.equipNum;
+ param.userName = CommonMethods.mesConfig.mesUserName;
+ param.electricMeterNum = CommonMethods.mesConfig.electricMeterNum[i];
+ param.recordDate = nowDate.ToString("yyyy-MM-dd HH:mm:ss");
+ param.accumulatedElectricity = (decimal)m.AccumulatedElectricity;
+ param.phaseVoltageA = (decimal)m.PhaseVoltageA;
+ param.phaseVoltageB = (decimal)m.PhaseVoltageB;
+ param.phaseVoltageC = (decimal)m.PhaseVoltageC;
+ param.phaseCurrentA = (decimal)m.PhaseCurrentA;
+ param.phaseCurrentB = (decimal)m.PhaseCurrentB;
+ param.phaseCurrentC = (decimal)m.PhaseCurrentC;
+ param.phasePowerA = (decimal)m.PhasePowerA;
+ param.phasePowerB = (decimal)m.PhasePowerB;
+ param.phasePowerC = (decimal)m.PhasePowerC;
+ param.activePower = (decimal)m.ActivePower;
+ param.powerFactor = (decimal)m.PowerFactor;
+ param.pt = (decimal)m.pt;
+ param.ct = (decimal)m.ct;
+
+ listP.Add(param);
+ i++;
+
+ // 写csv文件
+ string productName = string.Empty;
+
+ filePath = $@"{CommonMethods.strWattrMeterpath}\{nowDate.Year}\{nowDate.Month}";
+ fileName = $@"{nowDate.Day}.csv";
+ fileTitle = "工序名称,生产机台编号,拉线,型号,物料编号,操作人员,班次,电表编号,采集时间,有功电能(累计电能)KwH,A相电压 V,B相电压 V,C相电压 V,A相电流 A,B相电流 A,C相电流 A,A相功率 Kw,B相功率 Kw,C相功率 Kw,总有功功率 Kw,总功率因数 %,电压变比,电流变比";
+ fileContent = $"外观检工序,{CommonMethods.mesConfig.equipNum},{CommonMethods.mesConfig.lineCode},{productName},{CommonMethods.mesConfig.MaterialCode},{CommonMethods.mesConfig.mesUserName},{CommonMethods.strClass},{param.electricMeterNum},{nowDate.ToString("yyyy-MM-dd HH:mm:ss")}," +
+ $"{param.accumulatedElectricity},{param.phaseVoltageA},{param.phaseVoltageB},{param.phaseVoltageC},{param.phaseCurrentA},{param.phaseCurrentB},{param.phaseCurrentC}," +
+ $"{param.phasePowerA},{param.phasePowerB},{param.phasePowerC},{param.activePower},{param.powerFactor},{param.pt},{param.ct}";
+ CSVHelper