Files
1440WGJ/JY.Inspection/HomeForm.cs
T

3796 lines
163 KiB
C#
Raw Normal View History

2026-07-14 13:55:17 +08:00
//19QTH 930方形外观检测 启东FMS接口开发文档 - 外观检测
using HslCommunication;
using HslCommunication.Core;
using HslCommunication.ModBus;
using JY.Common.Helper;
using JY.DAL;
using JY.DAL.Repository;
using JY.DAL.Service;
using JY.Inspection.Common;
using JY.Inspection.Entity;
using JY.Inspection.Frm;
using JY.Inspection.Mes;
using JY.MES;
using JY.MES.Entity;
2026-07-14 16:09:25 +08:00
using JY.MES.Enum;
2026-07-14 13:55:17 +08:00
using JY.MES.MES;
using JY.Model;
using JY.Model.Excel;
using JY.Utility;
using JYControl;
using log4net.Repository.Hierarchy;
using MetroFramework.Forms;
using Microsoft.Extensions.DependencyInjection;
using Modbus.Device;
using Newtonsoft.Json;
using NPOI.OpenXmlFormats.Shared;
using NPOI.OpenXmlFormats.Spreadsheet;
using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Utilities.Net;
using PLCCommunication;
using SimpleCommunication;
using SocketHelper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Speech.Synthesis;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
namespace JY.Inspection
{
public partial class HomeForm : MetroForm
{
//用双缓冲绘制窗口的所有控件
protected override CreateParams CreateParams
{
get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; }
}
private Stopwatch sw = new Stopwatch();
UserHelper helper = new UserHelper("");
List<User> ListUser = new List<User>();
SynchronizationContext syscContext;
private static IModbusMaster master;
private static SerialPort port;
private static ModbusTcpNet modbus;
MESDataCombin ToMesData = new MESDataCombin();
DateTime dtLogin;
//串口参数
private string portName;
private int baudRate;
private ushort[] registerBuffer;
private string modbusTcp;
private string modbusTcpPort;
private System.Timers.Timer timerWatt;
private double timejige = 2000;//2秒
private delegate void UpdateLog(int index, string log);
/// <summary>
/// 按钮状态委托
/// </summary>
/// <param name="time"></param>
public delegate void ShowButtonHandler(string time);
/// <summary>
/// 数据库访问接口
/// </summary>
private IDbHelper dbHelper = new OpSqlDataBase();
/// <summary>
///上料电芯数据采集显示委托
/// </summary>
/// <param name="m"></param>
private delegate void ChangeFunctionWatthourMeter(List<int> m);
/// <summary>
///上料电芯数据采集显示委托
/// </summary>
/// <param name="m"></param>
private delegate void ChangeFunctionHTestA(List<FeedingData> m);
/// <summary>
///下料电芯采集显示委托
/// </summary>
/// <param name="m"></param>
private delegate void ChangeFunctionHTestB(List<BlankingData> m);
/// <summary>
/// 绑定上料电芯数据
/// </summary>
BindingList<FeedingData> listTA = new BindingList<FeedingData>();
/// <summary>
/// 绑定空托盘
/// </summary>
BindingList<BlankingData> listTB = new BindingList<BlankingData>();
private Task[] mTaskA = new Task[4];
private Task[] mTaskC = new Task[1];
private string MelsecConfigPath = AppDomain.CurrentDomain.BaseDirectory + "Config\\PlcConfig.ini";
private string ConfigPath = AppDomain.CurrentDomain.BaseDirectory + "Config\\ComConfig.ini";
//private Thread thread = null;
internal static FrmOmronPLCCom omronPLCCom;
private int OmronCount;
ServiceLog serviceLog = new ServiceLog();
private bool isEnabled = false;
private delegate void UpdateDataChart3(List<string> xData, List<int> yData);
private CancellationTokenSource mctsA1 = new CancellationTokenSource();
private CancellationTokenSource mctsA2 = new CancellationTokenSource();
private CancellationTokenSource mctsA3 = new CancellationTokenSource();
private CancellationTokenSource mctsA4 = new CancellationTokenSource();
private CancellationTokenSource Amcts7 = new CancellationTokenSource();
private CancellationTokenSource mctsC1 = new CancellationTokenSource();
//private CancellationTokenSource mctsC2 = new CancellationTokenSource();
//private CancellationTokenSource mctsC3 = new CancellationTokenSource();
//public CancellationTokenSource mCTState = new CancellationTokenSource();
public CancellationTokenSource mCOMState = new CancellationTokenSource();
private ManualResetEvent resetEventRecv = new ManualResetEvent(true);
private ByteTransformBase TransformBase = new ByteTransformBase();
/// <summary>
/// 用于电芯出站时向FMS上报出站及生产数据
/// </summary>
string BarCodeOutUrl = "";
/// <summary>
/// 报警数据上传
/// </summary>
string UpAlarmUrl = "";
/// <summary>
/// 设备状态上传
/// </summary>
string UpStatuesUrl = "";
/// <summary>
/// MES上传验证码
/// </summary>
string authorization = "";
/// <summary>
/// 不良统计项目
/// </summary>
List<ChartDataType> NGList = new List<ChartDataType>();
/// <summary>
/// 报警原始数据
/// </summary>
List<byte> listAlamByte = new List<byte>();
//报警表单数据
List<AlarmForm> listAlarmForm = null;
//PLC报警状态值
List<AlarmStatus> listAlarmStatus = null;
/// <summary>
/// PLC报警状态信号
/// </summary>
public string AlamCode = "0";
public bool IsNoOrg = false;
/// <summary>
/// 欧姆龙网口链接标志
/// </summary>
public bool startOmronUp = false;
/// <summary>
/// 串口链接标志
/// </summary>
public bool startComUp = false;
/// <summary>
/// tcpIP链接通知
/// </summary>
public bool startTCPUp = false;
/// <summary>
/// 通讯链接标志
/// </summary>
internal static bool startup = false;
/// <summary>
/// 测试型号
/// </summary>
public string strProdType;//测试型号
/// <summary>
/// 员工号
/// </summary>
public string strWorker = "";
/// <summary>
/// 是否开启智能电表
/// </summary>
public bool IsStartZNDB = false;
/// <summary>
/// 是否启用分档
/// </summary>
public bool chkCkGrading = false;
/// <summary>
/// 班次
/// </summary>
private int No = 0, ClassShift = 0;
/// <summary>
/// NG电池不分类排出
/// </summary>
public bool IsStartNGFL = false;
public short[] MESGradingSet = new short[] { (short)1, (short)1, (short)1, (short)1 };
public short[] MESGradingCCDSet = new short[] { (short)1, (short)1, (short)1, (short)1 };
//新增 ng 拉带
public short[] NgGradingSet = new short[] { (short)1, (short)1, (short)1 };
public string[] strNgBound = new string[] { };
private SpeechSynthesizer _speech;//异常播报
public HomeForm()
{
//设置窗体的双缓冲
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();
InitializeComponent();
//掩耳盗铃线程控制UI控件
CheckForIllegalCrossThreadCalls = false;
//利用反射设置DataGridView的双缓冲
Type dgvType = this.dgvDataShow_A.GetType();
PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(this.dgvDataShow_A, true, null);
this.dgvDataShow_A.AutoGenerateColumns = false;
dgvDataShow_A.DataSource = listTA;
this.dgvDataShow_A.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { };
//利用反射设置DataGridView的双缓冲
Type dgvType1 = this.dgvDataShow_B.GetType();
PropertyInfo pi1 = dgvType1.GetProperty("DoubleBuffered",
BindingFlags.Instance | BindingFlags.NonPublic);
pi1.SetValue(this.dgvDataShow_B, true, null);
this.dgvDataShow_B.AutoGenerateColumns = false;
dgvDataShow_B.DataSource = listTB;
this.dgvDataShow_B.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { };
helper.CheckSupperUser("user.pt", ListUser);
syscContext = SynchronizationContext.Current;
//panel2.Location = new Point(2100, 8);//重新设定标签的位置,这个位置时相对于父控件的右上角
panel2.Location = new Point(this.Width - 450, 8);//重新设定标签的位置,这个位置时相对于父控件的右上角
// 尝试启用控制按钮(最大化/最小化/关闭)
this.ControlBox = true;
// 或设置窗口可调整大小
this.Resizable = true;
}
/// <summary>
/// 单例
/// </summary>
private static HomeForm _instance;
internal static HomeForm Instance
{
get
{
if (_instance == null)
_instance = new HomeForm();
return _instance;
}
}
#region 柱状图显示屏蔽
//private void chart()
//{
// chartNgShow.Series.Clear();
// chartNgShow.Titles.Clear();
// chartNgShow.ChartAreas[0].AxisY.Minimum = 0;
// chartNgShow.ChartAreas[0].AxisY.Maximum = 20000;
// foreach (var item in NGList)
// {
// ChartHelper.AddSeries(chartNgShow, item.DataType, SeriesChartType.Column, Color.Red, Color.Red, true);
// }
// ChartHelper.SetTitle(chartNgShow, "各不良项", new Font("微软雅黑", 22), Docking.Top, Color.Black);
// ChartHelper.SetStyle(chartNgShow, Color.White, Color.Black);
// ChartHelper.SetLegend(chartNgShow, Docking.Top, StringAlignment.Center, Color.White, Color.Black);
// ChartHelper.SetXY(chartNgShow, "不良项", "数值", StringAlignment.Far, Color.Black, Color.Black, AxisArrowStyle.None, 1, 2);
// ChartHelper.SetMajorGrid(chartNgShow, Color.White, 20, 2);
//}
/// <summary>
/// 表格统计目录
/// </summary>
//internal void SetProductionList()
//{
// //不良统计项目
// NGList.Add(new ChartDataType() { DataType = "蓝膜气泡不良" });
// NGList.Add(new ChartDataType() { DataType = "蓝膜凹凸点" });
// NGList.Add(new ChartDataType() { DataType = "蓝膜褶皱不良" });
// NGList.Add(new ChartDataType() { DataType = "蓝膜破损不良" });
// NGList.Add(new ChartDataType() { DataType = "蓝膜划痕不良" });
// NGList.Add(new ChartDataType() { DataType = "蓝膜重合宽度不良" });
// NGList.Add(new ChartDataType() { DataType = "蓝膜高度不良" });
// NGList.Add(new ChartDataType() { DataType = "包膜表面异物不良" });
// NGList.Add(new ChartDataType() { DataType = "包膜翘起不良" });
// NGList.Add(new ChartDataType() { DataType = "U型折耳不良" });
// NGList.Add(new ChartDataType() { DataType = "蓝膜手印不良" });
// NGList.Add(new ChartDataType() { DataType = "极柱划痕不良" });
// NGList.Add(new ChartDataType() { DataType = "极柱凹点不良" });
// NGList.Add(new ChartDataType() { DataType = "极柱焊渣不良" });
// NGList.Add(new ChartDataType() { DataType = "极柱污染不良" });
// NGList.Add(new ChartDataType() { DataType = "极柱残缺不良" });
// NGList.Add(new ChartDataType() { DataType = "极柱胶圈残缺不良" });
// NGList.Add(new ChartDataType() { DataType = "极柱倾斜不良" });
// NGList.Add(new ChartDataType() { DataType = "防爆阀不良" });
// NGList.Add(new ChartDataType() { DataType = "防爆阀PET膜不良" });
// NGList.Add(new ChartDataType() { DataType = "二维码不良" });
// NGList.Add(new ChartDataType() { DataType = "绝缘片翘起不良" });
// NGList.Add(new ChartDataType() { DataType = "绝缘片破损不良" });
// NGList.Add(new ChartDataType() { DataType = "绝缘片污染不良" });
//}
/// <summary>
/// 获取图表数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
///
//public void GetValue()
//{
// if (isEnabled)
// {
//Random r = new Random();
//a1 = r.Next(100, 1200); a2 = r.Next(100, 1300); a3 = r.Next(100, 1050); a4 = r.Next(100, 1090); a5 = r.Next(100, 2000); a6 = r.Next(100, 1000); a7 = r.Next(100, 1000); a8 = r.Next(100, 1000); a9 = r.Next(100, 1000); a10 = r.Next(100, 1000);
//a11 = r.Next(100, 10200); a12 = r.Next(500, 1000); a13 = r.Next(100, 5000); a14 = r.Next(100, 1000); a15 = r.Next(100, 1000); a16 = r.Next(100, 1000); a17 = r.Next(100, 1000); a18 = r.Next(100, 1000); a19 = r.Next(100, 1000);
//a20 = r.Next(100, 8000); a21 = r.Next(100, 7000); a22 = r.Next(100, 4000); a23 = r.Next(100, 10400); a24 = r.Next(100, 10050);
//NGList.Where(p => p.DataType == "蓝膜气泡不良").FirstOrDefault().DataCount = a1;
//NGList.Where(p => p.DataType == "蓝膜凹凸点").FirstOrDefault().DataCount = a2;
//NGList.Where(p => p.DataType == "蓝膜褶皱不良").FirstOrDefault().DataCount = a3;
//NGList.Where(p => p.DataType == "蓝膜破损不良").FirstOrDefault().DataCount = a4;
//NGList.Where(p => p.DataType == "蓝膜划痕不良").FirstOrDefault().DataCount = a5;
//NGList.Where(p => p.DataType == "蓝膜重合宽度不良").FirstOrDefault().DataCount = a6;
//NGList.Where(p => p.DataType == "蓝膜高度不良").FirstOrDefault().DataCount = a7;
//NGList.Where(p => p.DataType == "包膜表面异物不良").FirstOrDefault().DataCount = a8;
//NGList.Where(p => p.DataType == "包膜翘起不良").FirstOrDefault().DataCount = a9;
//NGList.Where(p => p.DataType == "U型折耳不良").FirstOrDefault().DataCount = a10;
//NGList.Where(p => p.DataType == "蓝膜手印不良").FirstOrDefault().DataCount = a11;
//NGList.Where(p => p.DataType == "极柱划痕不良").FirstOrDefault().DataCount = a12;
//NGList.Where(p => p.DataType == "极柱凹点不良").FirstOrDefault().DataCount = a13;
//NGList.Where(p => p.DataType == "极柱焊渣不良").FirstOrDefault().DataCount = a14;
//NGList.Where(p => p.DataType == "极柱污染不良").FirstOrDefault().DataCount = a15;
//NGList.Where(p => p.DataType == "极柱残缺不良").FirstOrDefault().DataCount = a16;
//NGList.Where(p => p.DataType == "极柱胶圈残缺不良").FirstOrDefault().DataCount = a17;
//NGList.Where(p => p.DataType == "极柱倾斜不良").FirstOrDefault().DataCount = a18;
//NGList.Where(p => p.DataType == "防爆阀不良").FirstOrDefault().DataCount = a19;
//NGList.Where(p => p.DataType == "防爆阀PET膜不良").FirstOrDefault().DataCount = a20;
//NGList.Where(p => p.DataType == "二维码不良").FirstOrDefault().DataCount = a21;
//NGList.Where(p => p.DataType == "绝缘片翘起不良").FirstOrDefault().DataCount = a22;
//NGList.Where(p => p.DataType == "绝缘片破损不良").FirstOrDefault().DataCount = a23;
//NGList.Where(p => p.DataType == "绝缘片污染不良").FirstOrDefault().DataCount = a24;
// ShowChartData();
// }
//}
//public void ShowChartData()
//{
// try
// {
// //不良类型统计
// List<string> xData = NGList.Select(c => c.DataType).ToList();
// List<int> yData = NGList.Select(c => c.DataCount).ToList();
// ShowNGChart(xData, yData); ;
// }
// catch (Exception ex)
// {
// MessageBox.Show(ex.Message, "系统异常", MessageBoxButtons.OK, MessageBoxIcon.Hand);
// }
//}
//private void ShowNGChart(List<string> xData, List<int> yData)
//{
// if (chartNgShow.InvokeRequired)
// {
// UpdateDataChart3 c = new UpdateDataChart3(ShowNGChart);
// this.Invoke(c, new object[] { xData, yData });
// }
// else
// {
// chartNgShow.Series[0].Points.DataBindXY(xData, yData);
// }
//}
#endregion
#region 页面事件
private void HomeForm_Load(object sender, EventArgs e)
{
txtlog.Controls.Add(LogManagerControl.Manager);//添加自定义日志控件
LogManagerControl.Manager.Dock = System.Windows.Forms.DockStyle.Fill;
timer_Clock.Enabled = true;
//SetProductionList();
//chart();
ReadIni();
CheckClassShift();
InitOmronCom();
CancellationToken token1 = mctsA1.Token;
CancellationToken token2 = mctsA2.Token;
CancellationToken token3 = mctsA3.Token;
CancellationToken token4 = mctsA4.Token;
//CancellationToken token11 = mCTState.Token;
CancellationToken token15 = mCOMState.Token;
CancellationToken token12 = mctsC1.Token;
//CancellationToken token13 = mctsC2.Token;
//CancellationToken token14 = mctsC3.Token;
CancellationToken tokenCOM = mCOMState.Token;
CancellationToken token7 = Amcts7.Token;
//mTaskC[0] = Task.Factory.StartNew(delegate
//{
// processModeStatus();
//}, mctsC1.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
Task sd = Task.Factory.StartNew(delegate
{
processModeStatus(Amcts7);
}, Amcts7.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
InitialAndConnect();
IsNoOrg = true;
//删除日志
serviceLog.Start();
_speech = new SpeechSynthesizer();
_speech.Volume = 100; //音量
CultureInfo keyboardCulture = InputLanguage.CurrentInputLanguage.Culture;
InstalledVoice neededVoice = _speech.GetInstalledVoices(keyboardCulture).FirstOrDefault();
if (neededVoice != null)
{
_speech.SelectVoice(neededVoice.VoiceInfo.Name);
}
IocConfig.Initialize();
LogManagerControl.AddLog("程序已启动", LogAddtype.local);
}
public void InitialAndConnect()
{
Task RecvTask = Task.Factory.StartNew(delegate { UpdateDianBiaoByModbus(); }, mCOMState.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
if (!isEnabled)
{
resetEventRecv.Reset();
}
}
/// <summary>
/// 读取INI配置文件
/// </summary>
public void ReadIni()
{
authorization = IniFileHelper.ReadIniData("MES配置", "authorization");
BarCodeOutUrl = IniFileHelper.ReadIniData("MES配置", "BarCodeOutUrl");
UpAlarmUrl = IniFileHelper.ReadIniData("MES配置", "UpAlarmUrl");
UpStatuesUrl = IniFileHelper.ReadIniData("MES配置", "UpStatuesUrl");
//MES信息
Global.systemConfig.siteCode = IniFileHelper.ReadIniData("MES配置", "siteCode");
Global.systemConfig.lineCode = IniFileHelper.ReadIniData("MES配置", "lineCode");
Global.systemConfig.equipCode = IniFileHelper.ReadIniData("MES配置", "equipCode");
Global.systemConfig.materialCode = IniFileHelper.ReadIniData("MES配置", "materialCode");
Global.systemConfig.productType = IniFileHelper.ReadIniData("MES配置", "productType");
Global.systemConfig.GradingMesUrl = IniFileHelper.ReadIniData("MES配置", "GradingMesUrl");
Global.systemConfig.ResultProcessMesUrl = IniFileHelper.ReadIniData("MES配置", "ResultProcessMesUrl");
Global.systemConfig.StationArrivalUrl = IniFileHelper.ReadIniData("MES配置", "StationArrivalUrl");
Global.systemConfig.StationExitUrl = IniFileHelper.ReadIniData("MES配置", "StationExitUrl");
try
{
Global.systemConfig.CollectItemCfgList = ExcelImporter.Import<CollectItemCfg>(Global.CollectItemCfgPath);
}
catch (Exception)
{
LogManagerControl.AddLog("读取采集参照表", LogAddtype.local);
}
Global.systemConfig.LoginTime = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "LoginTime"));
Global.systemConfig.MesRequestTime = Convert.ToDouble(IniFileHelper.ReadIniData("MES配置", "MesRequestTime"));
txtsiteCode.Text = Global.systemConfig.siteCode;
txtlineCode.Text = Global.systemConfig.lineCode;
txtequipCode.Text = Global.systemConfig.equipCode;
txtmaterialCode.Text = Global.systemConfig.materialCode;
//分档ok档 ccd结果
string[] boundCCD = IniFileHelper.ReadIniData("MES配置", "CCDResultMessage").Split(',');
txtTensionStrapCCD1.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut1"))];
txtTensionStrapCCD2.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut2"))];
txtTensionStrapCCD3.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut3"))];
txtTensionStrapCCD4.Text = boundCCD[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrapCCDReslut4"))];
//分档配置信息
string[] bound = IniFileHelper.ReadIniData("MES配置", "NGMessage").Split(',');
txtgrading1.Text = IniFileHelper.ReadIniData("MES配置", "Grading1");
txtgrading2.Text = IniFileHelper.ReadIniData("MES配置", "Grading2");
txtgrading3.Text = IniFileHelper.ReadIniData("MES配置", "Grading3");
txtgrading4.Text = IniFileHelper.ReadIniData("MES配置", "Grading4");
Global.systemConfig.Grading1 = txtgrading1.Text + txtTensionStrapCCD1.Text;
Global.systemConfig.Grading2 = txtgrading2.Text + txtTensionStrapCCD2.Text;
Global.systemConfig.Grading3 = txtgrading3.Text + txtTensionStrapCCD3.Text;
Global.systemConfig.Grading4 = txtgrading4.Text + txtTensionStrapCCD4.Text;
MESGradingSet[0] = (short)1;
if (Global.systemConfig.Grading2.Equals(Global.systemConfig.Grading1))
MESGradingSet[1] = MESGradingSet[0];
else
MESGradingSet[1] = (short)(MESGradingSet[0] + 1);
if (Global.systemConfig.Grading3.Equals(Global.systemConfig.Grading1))
MESGradingSet[2] = MESGradingSet[0];
else
{
if (Global.systemConfig.Grading3.Equals(Global.systemConfig.Grading2))
MESGradingSet[2] = MESGradingSet[1];
else
MESGradingSet[2] = (short)(MESGradingSet[1] + 1);
}
if (Global.systemConfig.Grading4.Equals(Global.systemConfig.Grading1))
MESGradingSet[3] = MESGradingSet[0];
else
{
if (Global.systemConfig.Grading4.Equals(Global.systemConfig.Grading2))
MESGradingSet[3] = MESGradingSet[1];
else
{
if (Global.systemConfig.Grading4.Equals(Global.systemConfig.Grading3))
MESGradingSet[3] = MESGradingSet[2];
else
MESGradingSet[3] = (short)(MESGradingSet[2] + 1);
}
}
if (txtTensionStrapCCD1.Text.ToUpper() == "NG")
{
MESGradingSet[0] = (short)(30 + MESGradingSet[0]);
}
if (txtTensionStrapCCD2.Text.ToUpper() == "NG")
{
MESGradingSet[1] = (short)(30 + MESGradingSet[1]);
}
if (txtTensionStrapCCD3.Text.ToUpper() == "NG")
{
MESGradingSet[2] = (short)(30 + MESGradingSet[2]);
}
if (txtTensionStrapCCD4.Text.ToUpper() == "NG")
{
MESGradingSet[3] = (short)(30 + MESGradingSet[3]);
}
txtTensionStrap1.Text = bound[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap1"))];
txtTensionStrap2.Text = bound[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap2"))];
txtTensionStrap3.Text = bound[Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap3"))];
NgGradingSet[0] = (short)(Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap1")) +10);
NgGradingSet[1] = (short)(Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap2"))+10);
NgGradingSet[2] = (short)(Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap3"))+10);
strNgBound = IniFileHelper.ReadIniData("MES配置", "NGMessage").Split(',');
//出站计数
No = Convert.ToInt32(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "No"));
ClassShift = Convert.ToInt32(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "ClassShift"));
//是否启用分档
chkCkGrading = IniFileHelper.ReadIniData("MES配置", "Grading") == "1" ? true : false;
chkIsGarding.Checked = chkCkGrading;
//不分类排除
IsStartNGFL = IniFileHelper.ReadIniData("MES配置", "StartNGFL") == "1" ? true : false;
chkStartNGFL.Checked = IsStartNGFL;
listAlamByte = GetListByte(200);
Global.systemConfig.isUpMes = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "IsMesUP") == "1" ? true : false;
txtTcpClicet.Text = Global.systemConfig.isUpMes ? "MES在线" : "MES离线";
if (Global.systemConfig.isUpMes)
{
chkIsGarding.Visible = true;
}
else
{
chkIsGarding.Visible = false;
}
//电表
portName = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "portName");
baudRate = int.Parse(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "baudRate"));
IsStartZNDB = IniFileHelper.ReadIniData("MES配置", "StartZNDB") == "1" ? true : false;
modbusTcp = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "TCP_IP");
modbusTcpPort = IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "TCP_Port");
ckStartZNDB.Checked = IsStartZNDB;
Global.Instructions.Clear();
Global.Instructions.Add("0x25");//相电压UA
Global.Instructions.Add("0x26");//相电压UB
Global.Instructions.Add("0x27");//相电压UC
Global.Instructions.Add("0x28");//线电压UAB
Global.Instructions.Add("0x29");//线电压UBC
Global.Instructions.Add("0x2A");//线电压UAC
Global.Instructions.Add("0x2B");//电流IA
Global.Instructions.Add("0x2C");//电流IB
Global.Instructions.Add("0x2D");//电流IC
Global.Instructions.Add("0x31");//A相有功功率
Global.Instructions.Add("0x35");//B相有功功率
Global.Instructions.Add("0x39");//C相有功功率
Global.Instructions.Add("0x05");//总有功功率
}
#region 串口初始化
private SerialPort InitSerialPortParameter()
{
return port;
}
public bool InitSerialPort(ref string strErr)
{
//return InitSerialPort_TCP( ref strErr);
try
{
if (port == null)
{
if (!string.IsNullOrEmpty(portName))
{
port = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
port.ReadTimeout = 500;
port.Open();
if (port.IsOpen)
{
master = ModbusSerialMaster.CreateRtu(port);
registerBuffer = master.ReadHoldingRegisters((byte)1, (ushort)0, (ushort)2);
if (registerBuffer == null)
{
strErr = "与智能电表通讯异常,请检查串口线路!!!";
return false;
}
strErr = $"[{registerBuffer[0]}],与智能电表通讯正常!!";
COMStart(true);
isEnabled = true;
return true;
}
}
}
else
{
COMStart(true);
isEnabled = true;
return true;
}
}
catch (Exception ex)
{
port.Close();
port.Dispose();
port = null;
COMStart(false);
isEnabled = false;
CleardbData();
strErr = $"初始化串口异常!原因:{ex.Message}\r\n 请检查串口线路!!!";
}
return false;
}
public bool InitSerialPort_TCP(ref string strErr)
{
try
{
modbus = new ModbusTcpNet();
modbus.Station = 1;
modbus.IsStringReverse = false;
modbus.DataFormat = DataFormat.CDAB;
modbus.IpAddress = modbusTcp;
modbus.Port = Convert.ToInt32(modbusTcpPort);
modbus.ConnectTimeOut = 5000;
modbus.ReceiveTimeOut = 10000;
modbus.ConnectServer();
OperateResult<ushort[]> result = new OperateResult<ushort[]>();
var task = Task.Run(async () => { result = await modbus.ReadUInt16Async("0", 68); });
task.Wait();
if (result.IsSuccess)
{
COMStart(true);
isEnabled = true;
return true;
}
}
catch (Exception ex)
{
modbus.ConnectClose();
COMStart(false);
isEnabled = false;
CleardbData();
strErr = $"初始化ModbusTCP异常!原因:{ex.Message}\r\n 请检查串口线路!!!";
}
return false;
}
/// <summary>
/// 链接串口状态
/// </summary>
/// <param name="status"></param>
public void COMStart(bool status)
{
if (status)
{
resetEventRecv.Set();
}
else
{
resetEventRecv.Reset();
}
}
private void UpdateDianBiao()
{
while (true)
{
if (mCOMState.Token.IsCancellationRequested)
{
return;
}
resetEventRecv.WaitOne();
if (isEnabled)
{
if (modbus != null && !string.IsNullOrEmpty(modbus.ConnectionId))
{
try
{
List<int> resylt = GetListInt(17);
//for (int i = 0; i < Global.Instructions.Count; i++)
//{
// ushort startAddress = (ushort)System.Convert.ToInt32(Global.Instructions[i], 16);
// registerBuffer = master.ReadHoldingRegisters((byte)1, startAddress, (ushort)1);
// resylt[i] = registerBuffer[0];
//}
OperateResult<ushort[]> result = new OperateResult<ushort[]>();
while (!result.IsSuccess)
{
var task = Task.Run(async () => { result = await modbus.ReadUInt16Async("0", 68); });
task.Wait();
if (result.IsSuccess)
{
for (int i = 0; i < 17; i++)
{
resylt[i] = result.Content[i];
}
}
}
if (resylt != null)
{
if (startup)
{
for (int i = 0; i < resylt.Count; i++)
{
omronPLCCom.lstMcUI[0].WriteDReg($"W4000[{i.ToString()}]", resylt[i]);
}
}
this.Invoke(new Action(() =>
{
var index = 0;
//相电压UA
txtPhaseVolUA.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1");
//相电压UB
txtPhaseVolUB.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1");
//相电压UC
txtPhaseVolUC.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1");
//线电压UAB
txtLineVolUAB.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1");
//线电压UBC
txtLineVolUBC.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1");
//线电压UAC
txtLineVolUAC.Text = (Convert.ToDouble(resylt[index++]) / 10).ToString("F1");
//电流IA
txtIA.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3");
//电流IB
txtIB.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3");
//电流IC
txtIC.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3");
//A相有功功率
index++;
txtPowerA.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3");
//B相有功功率
index++;
txtPowerB.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3");
//C相有功功率
index++;
txtPowerC.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3");
//总有功功率
index++;
txtTotalPower.Text = (Convert.ToDouble(resylt[index++]) / 1000).ToString("F3");
}));
}
}
catch (Exception ex)
{
CleardbData();
LogManagerControl.AddLog("智能电表通讯异常,请检查串口线路\r\n " + ex.Message, LogAddtype.local, Logtype.Error);
}
}
else
{
// port.Close();
// port.Dispose();
modbus.ConnectClose();
Thread.Sleep(3000);
string strErr = "";
InitSerialPort(ref strErr);
}
}
Thread.Sleep(1000);
}
}
private void UpdateDianBiaoByModbus()
{
while (true)
{
if (mCOMState.Token.IsCancellationRequested)
{
return;
}
resetEventRecv.WaitOne();
if (isEnabled)
{
if (master !=null)
{
try
{
List<int> resylt = GetListInt(13);
List<double> resylt_float = new List<double>();
OperateResult<ushort[]> result = new OperateResult<ushort[]>();
for (int i = 0; i < Global.Instructions.Count; i++)
{
ushort startAddress = (ushort)System.Convert.ToInt32(Global.Instructions[i], 16);
registerBuffer = master.ReadHoldingRegisters((byte)1, startAddress, (ushort)1);
//var registerBuffer2 = master.ReadHoldingRegisters((byte)1, 0, (ushort)100);
resylt[i] = registerBuffer[0];
}
if (resylt != null)
{
// toFloat
{
var index = 0;
//相电压UA
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10));
//相电压UB
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10));
//相电压UC
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10));
//线电压UAB
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10));
//线电压UBC
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10));
//线电压UAC
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 10));
;
//电流IA
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000));
//电流IB
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000));
//电流IC
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000));
//A相有功功率
//index++;
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000));
//B相有功功率
// index++;
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000));
//C相有功功率
// index++;
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000));
//总有功功率
// index++;
resylt_float.Add((Convert.ToDouble(resylt[index++]) / 1000));
}
//
if (startup)
{
for (int i = 0; i < resylt.Count; i++)
{
omronPLCCom.lstMcUI[0].WriteDReg($"W380[{i.ToString()}]", (float)resylt_float[i]);
}
}
this.Invoke(new Action(() =>
{
var index =0;
//相电压UA
txtPhaseVolUA.Text = resylt_float[index++].ToString("F1");
//相电压UB
txtPhaseVolUB.Text = resylt_float[index++].ToString("F1");
//相电压UC
txtPhaseVolUC.Text = resylt_float[index++].ToString("F1");
//线电压UAB
txtLineVolUAB.Text = resylt_float[index++].ToString("F1");
//线电压UBC
txtLineVolUBC.Text = resylt_float[index++].ToString("F1");
//线电压UAC
txtLineVolUAC.Text = resylt_float[index++].ToString("F1");
//电流IA
txtIA.Text = resylt_float[index++].ToString("F3");
//电流IB
txtIB.Text = resylt_float[index++].ToString("F3");
//电流IC
txtIC.Text = resylt_float[index++].ToString("F3");
//A相有功功率
//index++;
txtPowerA.Text = resylt_float[index++].ToString("F3");
//B相有功功率
// index++;
txtPowerB.Text = resylt_float[index++].ToString("F3");
//C相有功功率
// index++;
txtPowerC.Text = resylt_float[index++].ToString("F3");
//总有功功率
// index++;
txtTotalPower.Text = resylt_float[index++].ToString("F3");
}));
}
}
catch (Exception ex)
{
CleardbData();
LogManagerControl.AddLog("智能电表通讯异常,请检查串口线路\r\n " + ex.Message, LogAddtype.local, Logtype.Error);
}
}
else
{
// port.Close();
// port.Dispose();
modbus.ConnectClose();
Thread.Sleep(3000);
string strErr = "";
InitSerialPort(ref strErr);
}
}
Thread.Sleep(1000);
}
}
/// <summary>
/// 清除智能电表显示数据
/// </summary>
public void CleardbData()
{
this.Invoke(new Action(() =>
{
//相电压UA
txtPhaseVolUA.Text = "0";
//相电压UB
txtPhaseVolUB.Text = "0";
//相电压UC
txtPhaseVolUC.Text = "0";
//线电压UAB
txtLineVolUAB.Text = "0";
//线电压UBC
txtLineVolUBC.Text = "0";
//线电压UAC
txtLineVolUAC.Text = "0";
//电流IA
txtIA.Text = "0";
//电流IB
txtIB.Text = "0";
//电流IC
txtIC.Text = "0";
//A相有功功率
txtPowerA.Text = "0";
//B相有功功率
txtPowerB.Text = "0";
//C相有功功率
txtPowerC.Text = "0";
//总有功功率
txtTotalPower.Text = "0";
}));
}
#endregion
/// <summary>
/// 登录窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiLogin_Click(object sender, EventArgs e)
{
if (CurrentInfo.autuority == Autuority.Empty)
{
LoginForm frm = new LoginForm();
frm.sendLogin += Login;
frm.ShowDialog();
txtTcpClicet.Text = Global.systemConfig.isUpMes ? "MES在线" : "MES离线";
}
else
{
LoginOut();
}
}
/// <summary>
/// 历史数据查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiHistory_Click(object sender, EventArgs e)
{
if (CurrentInfo.autuority == Autuority.Empty)
{
MessageBox.Show("请先登录!", "系统提示");
return;
}
FrmHistoricalDataQuery frm = new FrmHistoricalDataQuery();
frm.ShowDialog();
}
/// <summary>
/// 报警信息查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiAlarmSearch_Click(object sender, EventArgs e)
{
if (CurrentInfo.autuority == Autuority.Empty)
{
MessageBox.Show("请先登录!", "系统提示");
return;
}
FrmAlamQuery frm = new FrmAlamQuery();
frm.ShowDialog();
}
/// <summary>
/// 打开统计页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiChart_Click(object sender, EventArgs e)
{
if (CurrentInfo.autuority == Autuority.Empty)
{
MessageBox.Show("请先登录!", "系统提示");
return;
}
FrmStatistics.Instance.ShowDialog();
}
/// <summary>
/// 打开换形页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiChangeModel_Click(object sender, EventArgs e)
{
if (!CheckAdminOrEng())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
if (!startup)
{
MessageBox.Show("请在联机状态下操作换型", "系统提示");
return;
}
//FrmChangeModel frm = new FrmChangeModel(omronPLCCom, cmbProductModel.Text.Trim());
FrmChangeModel frm = new FrmChangeModel(omronPLCCom, "");
frm.ShowDialog();
}
/// <summary>
/// 打开系统信息页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiAbout_Click(object sender, EventArgs e)
{
FrmHelper frm = new FrmHelper();
frm.ShowDialog();
}
/// <summary>
/// 打开PLC配置页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiPLCConfig_Click(object sender, EventArgs e)
{
if (!CheckAdminOrEng())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
//FrmPwd frm = new FrmPwd();
//if (frm.ShowDialog() == DialogResult.Cancel)
//{
// return;
//}
if (omronPLCCom != null)
{
omronPLCCom.Show();
return;
}
omronPLCCom = new FrmOmronPLCCom(MelsecConfigPath);
omronPLCCom.Show();
}
/// <summary>
/// 打开数据库配置页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiDBConfig_Click(object sender, EventArgs e)
{
if (!CheckAdminOrEng())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
FrmDBbaseSet frm = new FrmDBbaseSet();
frm.ShowDialog();
}
/// <summary>
/// 打开MES参数配置页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiMESConfig_Click(object sender, EventArgs e)
{
if (!CheckAdminOrEng())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
FormMesDataSet frm = new FormMesDataSet();
if (frm.ShowDialog() == DialogResult.OK)
{
ReadIni();
}
}
/// <summary>
/// 打开参数编辑页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiParaConfig_Click(object sender, EventArgs e)
{
if (!CheckAdminOrEng())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
IsNoOrg = false;
//FrmParaConfig frmPara = new FrmParaConfig();
//frmPara.sendParamIN += SetCombOrg;
//if (frmPara.ShowDialog() == DialogResult.OK)
//{
// IsNoOrg = true;
//}
}
/// <summary>
/// 打开用户配置页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiUserConfig_Click(object sender, EventArgs e)
{
if (!CheckAdmin())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
SetForm setForm = new SetForm();
setForm.ShowDialog();
}
/// <summary>
/// TCP通讯设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiSerialPortConfig_Click(object sender, EventArgs e)
{
if (!CheckAdmin())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
//FrmPwd frm = new FrmPwd();
//if (frm.ShowDialog() == DialogResult.Cancel)
//{
// return;
//}
//com.Show();
}
/// <summary>
/// 统计清零
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btSave_Click(object sender, EventArgs e)
{
if (CurrentInfo.autuority == Autuority.Empty)
{
MessageBox.Show("请先登录再进行操作!", "错误提示");
return;
}
IniFileHelper.WriteIniData("统计计数", "ProdAllQty", "0");
}
/// <summary>
/// 刷新页面时间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer_Clock_Tick(object sender, EventArgs e)
{
string time = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
ShowButtonHandler handler = ShowButtonEven_Run;
IAsyncResult result = handler.BeginInvoke(time, null, handler);
string timenow = DateTime.Now.ToString("HH:mm:ss");
CheckClassShift();
AgeingCheck();
GetMESinfo();
}
/// <summary>
/// 判断班次
/// </summary>
public void CheckClassShift()
{
TimeSpan dsp3 = DateTime.Now.TimeOfDay;
if (dsp3 > DateTime.Parse("08:30").TimeOfDay && dsp3 <= DateTime.Parse("20:30").TimeOfDay)
{
if (ClassShift == 1)
No = 0;
ClassShift = 0;
if (this.InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(delegate
{
txtClassShift.Text = "白班";
}));
}
else
{
txtClassShift.Text = "白班";
}
}
else
{
if (ClassShift == 0)
No = 0;
ClassShift = 1;
if (this.InvokeRequired)
{
this.BeginInvoke(new MethodInvoker(delegate
{
txtClassShift.Text = "夜班";
}));
}
else
{
txtClassShift.Text = "夜班";
}
}
}
/// <summary>
/// 登录时效检查
/// </summary>
public void AgeingCheck()
{
if (CheckAdminOrEng() && (DateTime.Now - dtLogin).TotalMinutes > Global.systemConfig.LoginTime)
{
CurrentInfo.autuority = Autuority.操作员;
lblAuthority.Text = "操作员";
if (startup)//plc链接成功
// omronPLCCom.lstMcUI[0].WriteDReg("W50", (short)1);//提示PLC进入操作员权限
omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)1);//提示PLC进入操作员权限
LogManagerControl.AddLog("管理员登录时效过期已自动降级为操作员权限,请重新登录获取管理员权限。", LogAddtype.local, Logtype.Warning);
}
}
/// <summary>
/// 告诉PLC MES信息
/// </summary>
public void GetMESinfo()
{
if (startup)
{
if (Global.systemConfig.isUpMes)
{
omronPLCCom.lstMcUI[0].WriteDReg("W250", (short)1);
if (chkCkGrading)
{
omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)1);
}
else
{
omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)2);
}
}
else
{
omronPLCCom.lstMcUI[0].WriteDReg("W250", (short)2);
omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)2);
}
}
}
/// <summary>
/// CCD数据统计
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tsmiCCDData_Click(object sender, EventArgs e)
{
if (!CheckAdmin())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
FrmCCDQuery frm = new FrmCCDQuery();
frm.ShowDialog();
}
#endregion
#region PLC读写
/// <summary>
/// 初始化通讯接口委托事件
/// </summary>
public void InitOmronCom()
{
#region 欧姆龙MC协议网口
PLCCommunication.IniHelper iniMelse = new PLCCommunication.IniHelper(MelsecConfigPath);
OmronCount = Convert.ToInt16(iniMelse.IniReadValue("SystemConfig", "ComCount"));
omronPLCCom = new FrmOmronPLCCom(MelsecConfigPath);
for (int i = 0; i < OmronCount; i++)
{
switch (i)
{
case 0:
//外观设备心跳消息接受委托事件
omronPLCCom.lstMcUI[i].UpHeartBeatEvent += TriggerHeartEvent;
//外观设备数据接收委托事件
omronPLCCom.lstMcUI[i].ReceiveEvent += OmronRegEvent_Job1;
break;
}
}
#endregion
#region TCPIP协议网口
//SimpleCommunication.IniHelper iniCom = new SimpleCommunication.IniHelper(ConfigPath);
//TcpCount = Convert.ToInt16(iniCom.IniReadValue("SystemConfig", "ComCount"));
//com = new FrmCommunication(ConfigPath);
//for (int i = 0; i < TcpCount; i++)
//{
// switch (i)
// {
// case 0:
// //信息接受委托事件
// com.lstUI[i].TcoComInfoMsgEvent += InfoEvent_Job;
// com.lstUI[i].TCPOpen();
// //信息接受委托事件
// com.lstUI[i].TcoComRecvMsgEvent += RegEvent_Job;
// break;
// case 1:
// //信息接受委托事件
// com.lstUI[i].TcoComInfoMsgEvent += InfoEvent_Job1;
// com.lstUI[i].TCPOpen();
// //信息接受委托事件
// com.lstUI[i].TcoComRecvMsgEvent += RegEvent_Job1;
// break;
// }
//}
#endregion
}
/// <summary>
/// 消息悬浮提示
/// </summary>
/// <param name="str"></param>
/// <param name="time"></param>
///
public void ShowMsg(Logstype logType, string str, int time)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new ThreadStart(delegate ()
{
switch (logType)
{
case Logstype.Message:
MessageTip.ShowOk($"{str}", decimal.ToInt32(time));
break;
case Logstype.Warning:
MessageTip.ShowWarning($"{str}", decimal.ToInt32(time));
break;
case Logstype.Error:
MessageTip.ShowError($"{str}", decimal.ToInt32(time));
break;
default:
break;
}
}));
}
else
{
switch (logType)
{
case Logstype.Message:
MessageTip.ShowOk($"{str}", decimal.ToInt32(time));
break;
case Logstype.Warning:
MessageTip.ShowWarning($"{str}", decimal.ToInt32(time));
break;
case Logstype.Error:
MessageTip.ShowError($"{str}", decimal.ToInt32(time));
break;
default:
break;
}
}
}
/// <summary>
///开始
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btStart_Click(object sender, EventArgs e)
{
if (CurrentInfo.autuority == Autuority.Empty)
{
MessageBox.Show("请先登录再进行操作!", "错误提示");
return;
}
ReadIni();
if (IsStartZNDB)
{
string strErr = "";
bool b1 = InitSerialPort(ref strErr);
if (!b1)
{
MessageBox.Show(strErr, "错误提示");
return;
}
}
if (!startup)
{
SystemStart();
return;
}
startup = false;
Invoke((Action)delegate
{
btnStart.ButtonCenterColorStart = Color.Red;
btnStart.ButtonCenterColorEnd = Color.Salmon;
lblMsg.Text = "启动联机";
lblLinkPLCState.IsFlash = false;
lblLinkPLCState.LedStatus = false;
});
COMStart(false);
isEnabled = false;
CleardbData();
for (int i = 0; i < OmronCount; i++)
{
if (omronPLCCom.lstMcUI[i].IsRun)
{
omronPLCCom.lstMcUI[i].ConnectClose();
omronPLCCom.lstMcUI[i].OmronStart(false);
omronPLCCom.lstMcUI[i].IsRun = false;
omronPLCCom.lstMcUI[i].btnStart.Text = "启动";
omronPLCCom.lstMcUI[i].HeartBeat = false;
}
}
}
/// <summary>
/// 启动PLC连接
/// </summary>
private void SystemStart()
{
for (int i = 0; i < OmronCount; i++)
{
if (!omronPLCCom.lstMcUI[i].IsRun)
{
bool b = omronPLCCom.lstMcUI[i].Connect();
if (b)
{
startOmronUp = true;
omronPLCCom.lstMcUI[i].OmronStart(true);
omronPLCCom.lstMcUI[i].IsRun = true;
omronPLCCom.lstMcUI[i].btnStart.Text = "停止";
omronPLCCom.lstMcUI[i].HeartBeat = true;
}
else
{
startOmronUp = false;
}
}
}
if (startOmronUp)
{
startup = true;
}
if (startup)
{
SendAuthorityToPLC();
//SetProductModelEnable(false);
btnStart.ButtonCenterColorStart = Color.OliveDrab;
btnStart.ButtonCenterColorEnd = Color.OliveDrab;
lblMsg.Text = "停止联机";
#region 开机前告诉PLC当前挡位设置
//开机前告诉PLC当前挡位设置
MESGradingSet[0] = (short)1;
if ((txtgrading2.Text.Trim()+ txtTensionStrapCCD2.Text).Equals(txtgrading1.Text.Trim() + txtTensionStrapCCD1.Text))
MESGradingSet[1] = MESGradingSet[0];
else
MESGradingSet[1] = (short)(MESGradingSet[0] + 1);
if ((txtgrading3.Text.Trim() + txtTensionStrapCCD3.Text).Equals(txtgrading1.Text.Trim() + txtTensionStrapCCD1.Text))
MESGradingSet[2] = MESGradingSet[0];
else
{
if ((txtgrading3.Text.Trim() + txtTensionStrapCCD3.Text).Equals(txtgrading2.Text.Trim()+txtTensionStrapCCD2.Text))
MESGradingSet[2] = MESGradingSet[1];
else
MESGradingSet[2] = (short)(MESGradingSet[1] + 1);
}
if ((txtgrading4.Text.Trim() + txtTensionStrapCCD4.Text).Equals(txtgrading1.Text.Trim() + txtTensionStrapCCD1.Text))
MESGradingSet[3] = MESGradingSet[0];
else
{
if ((txtgrading4.Text.Trim() + txtTensionStrapCCD4.Text).Equals(txtgrading2.Text.Trim() + txtTensionStrapCCD2.Text))
MESGradingSet[3] = MESGradingSet[1];
else
{
if ((txtgrading4.Text.Trim() + txtTensionStrapCCD4.Text).Equals(txtgrading3.Text.Trim() + txtTensionStrapCCD3.Text))
MESGradingSet[3] = MESGradingSet[2];
else
MESGradingSet[3] = (short)(MESGradingSet[2] + 1);
}
}
//
if (txtTensionStrapCCD1.Text.ToUpper() == "NG")
{
MESGradingSet[0] = (short)(30 + MESGradingSet[0]);
}
if (txtTensionStrapCCD2.Text.ToUpper() == "NG")
{
MESGradingSet[1] = (short)(30 + MESGradingSet[1]);
}
if (txtTensionStrapCCD3.Text.ToUpper() == "NG")
{
MESGradingSet[2] = (short)(30 + MESGradingSet[2]);
}
if (txtTensionStrapCCD4.Text.ToUpper() == "NG")
{
MESGradingSet[3] = (short)(30 + MESGradingSet[3]);
}
int TensionStrap1 = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap1"));
int TensionStrap2 = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap2"));
int TensionStrap3 = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TensionStrap3"));
int Grading = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "Grading"));
int IsMesUP = Convert.ToInt32(IniFileHelper.ReadIniData("SYSTEM_CONFIGURE", "IsMesUP"));
//告诉PLC当前OK与NG拉带设置挡位
omronPLCCom.lstMcUI[0].WriteDReg("W241", MESGradingSet[0]);
omronPLCCom.lstMcUI[0].WriteDReg("W242", MESGradingSet[1]);
omronPLCCom.lstMcUI[0].WriteDReg("W243", MESGradingSet[2]);
omronPLCCom.lstMcUI[0].WriteDReg("W244", MESGradingSet[3]);
omronPLCCom.lstMcUI[0].WriteDReg("W245", (short)(TensionStrap1==0?99: TensionStrap1 + 10));
omronPLCCom.lstMcUI[0].WriteDReg("W246", (short)(TensionStrap2==0?99: TensionStrap2 + 10));
omronPLCCom.lstMcUI[0].WriteDReg("W247", (short)(TensionStrap3==0?99: TensionStrap3 + 10));
//omronPLCCom.lstMcUI[0].WriteDReg("W245", 5);
//omronPLCCom.lstMcUI[0].WriteDReg("W246", 6);
//omronPLCCom.lstMcUI[0].WriteDReg("W247", 7);
omronPLCCom.lstMcUI[0].WriteDReg("W248", (short)Grading);
omronPLCCom.lstMcUI[0].WriteDReg("W250", (short)IsMesUP);
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前一档,W241[值:{MESGradingSet[0]}-档位:{txtgrading1.Text.Trim()}-{txtTensionStrapCCD1.Text}]", LogAddtype.local, Logtype.Message);
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前二档,W242[值:{MESGradingSet[1]}-档位:{txtgrading2.Text.Trim()}-{txtTensionStrapCCD2.Text}]", LogAddtype.local, Logtype.Message);
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前三档,W243[值:{MESGradingSet[2]}-档位:{txtgrading3.Text.Trim()}-{txtTensionStrapCCD3.Text}]", LogAddtype.local, Logtype.Message);
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前四档,W244[值:{MESGradingSet[3]}-档位:{txtgrading4.Text.Trim()}-{txtTensionStrapCCD4.Text}]", LogAddtype.local, Logtype.Message);
var ng1 = (short)(TensionStrap1 == 0 ? 99 : TensionStrap1 + 10);
var ng2 = (short)(TensionStrap2 == 0 ? 99 : TensionStrap2 + 10);
var ng3 = (short)(TensionStrap3 == 0 ? 99 : TensionStrap3 + 10);
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前NG拉带1,W245[值:{ng1}-档位:{txtTensionStrap1.Text.Trim()}]", LogAddtype.local, Logtype.Message);
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前NG拉带2,W246[值:{ng2}-档位:{txtTensionStrap2.Text.Trim()}]", LogAddtype.local, Logtype.Message);
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}]当前NG拉带3,W247[值:{ng3}-档位:{txtTensionStrap3.Text.Trim()}]", LogAddtype.local, Logtype.Message);
if ((short)IsMesUP == 1)
{
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W250[值:{(short)IsMesUP}-启用MES模式]", LogAddtype.local, Logtype.Message);
if ((short)Grading == 1)
{
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W248[值:{(short)Grading}-启用分档模式]", LogAddtype.local, Logtype.Message);
}
else
{
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W248[值:{(short)Grading}-关闭分档模式]", LogAddtype.local, Logtype.Message);
}
}
else
{
LogManagerControl.AddLog($"用户[{Global.systemConfig.userName}],当前W250[值:{(short)IsMesUP}-关闭MES模式]", LogAddtype.local, Logtype.Message);
}
#endregion
}
else
{
COMStart(false);
isEnabled = false;
CleardbData();
Invoke((Action)delegate
{
lblLinkPLCState.IsFlash = false;
lblLinkPLCState.LedStatus = false;
});
startup = false;
btnStart.ButtonCenterColorStart = Color.Red;
btnStart.ButtonCenterColorEnd = Color.Salmon;
lblMsg.Text = "启动联机";
MessageBox.Show("PLC通讯未连接!", "系统程序运行错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
}
}
/// <summary>
/// 给PLC写入权限
/// </summary>
private void SendAuthorityToPLC()
{
if (lblAuthority.Text == "操作员")
{
omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)1);//提示PLC进入操作员权限
}
else if (lblAuthority.Text == "工程师")
{
omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)2);//提示PLC进入工程师权限
}
else
{
omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)3);//提示PLC进入管理员权限
}
}
/// <summary>
/// 计算CheckSum
/// </summary>
/// <param name="st"></param>
/// <returns></returns>
public static string GetCheckSum(string st)
{
//ASCII字符转10进制byte
string res = "";
try
{
int result = 0;
byte[] ba = System.Text.ASCIIEncoding.Default.GetBytes(st);
for (int i = 0; i < ba.Length; i++)
{
result += ba[i];
}
string dfd = result.ToString();
if (dfd.Length >= 2)
{
res = dfd.Substring(dfd.Length - 2);
}
else
{
res = "0" + dfd;
}
}
catch (Exception) { }
return res;
}
#endregion
/// <summary>
/// 设备心跳消息委托更新状态
/// </summary>
/// <param name="b"></param>
private void TriggerHeartEvent(bool b)
{
if (!startup)
{
return;
}
if (this.InvokeRequired)
{
if (b)
{
Invoke((Action)delegate
{
lblLinkPLCState.IsFlash = true;
lblLinkPLCState.LedStatus = true;
});
}
else
{
Invoke((Action)delegate
{
lblLinkPLCState.IsFlash = false;
lblLinkPLCState.LedStatus = false;
});
}
}
}
/// <summary>
/// 1#通讯块读取PLC信号
/// </summary>
/// <param name="Index"></param>
/// <param name="msg"></param>
/// <param name="resByte"></param>
private void OmronRegEvent_Job1(int Index, string msg, OperateResult<byte[]> resByte)
{
if (!startup)
{
return;
}
if (omronPLCCom.lstMcUI[0].IsConnected)
{
switch (Index)
{
case 1: //1#上料
if (omronPLCCom.lstMcUI[0].lstTrgUI[0].TrgParams.TriggerCmd == msg)
{
omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[0].TrgParams.TriggerAddr, (short)2);
mTaskA[0] = Task.Factory.StartNew(delegate
{
processA1(mctsA1, resByte);
});
}
break;
case 2: //2#下料
if (omronPLCCom.lstMcUI[0].lstTrgUI[1].TrgParams.TriggerCmd == msg)
{
omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[1].TrgParams.TriggerAddr, (short)2);
mTaskA[1] = Task.Factory.StartNew(delegate
{
processA2(mctsA2, resByte);
});
}
break;
//case 3://3#报警
// if (msg == "1" || msg == "2")
// {
// AlamCode = msg;
// omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[2].TrgParams.TriggerAddr, (short)3);
// mTaskA[2] = Task.Factory.StartNew(delegate
// {
// AlarmProcess(mctsA3, resByte);
// });
// }
// break;
//case 4: //4#异常播报
// if (omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.TriggerCmd == msg)
// {
// omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.TriggerAddr, (short)2);
// mTaskA[3] = Task.Factory.StartNew(delegate
// {
// processA3(mctsA4, resByte);
// });
// }
// break;
}
}
else
{
Invoke((Action)delegate
{
lblLinkPLCState.IsFlash = false;
lblLinkPLCState.LedStatus = false;
});
}
}
#region 上料数据
/// <summary>
/// 1#通道读取异常条码数据
/// </summary>
/// <param name="mt"></param>
/// <param name="msg"></param>
private void processA1(CancellationTokenSource mt, OperateResult<byte[]> resByte)
{
if (!mt.IsCancellationRequested)
{
if (resByte.IsSuccess && resByte != null)
{
try
{
sw.Restart();
List<FeedingData> list = new List<FeedingData>();
List<string> listBar = StrUtil.GetListString(2, "NG");
List<short> listResult = CollectionUtil.GetListUShort(2);
//高低位取反
byte[] bytes = resByte.Content.ByteReverse();
//前面有\03\00 标识 占2个字节
int offset = 0;
listBar[0] = TransformBase.TransString(bytes, 0+ offset, 20*2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//1# 条码
listBar[1] = TransformBase.TransString(bytes, 40+ offset, 20*2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//2# 条码
// listBar[2] = TransformBase.TransString(bytes, 80+ offset, 20 * 2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//3# 条码
//新增 左右通道
var dtGroup = 0;
try
{
dtGroup = omronPLCCom.lstMcUI[0].ReadshortDReg("W2023");
}
catch (Exception)
{
dtGroup = 0;
}
for (int i = 0; i < listBar.Count; i++)
{
FeedingData m = new FeedingData();
// m.TD = i + 1;
m.TD = i * 2 + dtGroup;// 主道 =1 通道改为 1,3 主道=2 时 通道该为 2,4
m.BarCode = listBar[i];
m.TDGroup = dtGroup;
m.CreateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
if (String.IsNullOrEmpty(m.BarCode) || m.BarCode.Trim() == "ERROR")
{
m.BarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8);
m.Result = "NG";
m.Remark = "扫码不良";
listResult[i] = 2;
}
else
{
m.Result = "OK";
m.Remark = "良品";
#region 947 MES
if (Global.systemConfig.isUpMes)
{
// TODO 进站数据上传
ReqArrivalStation req = new ReqArrivalStation()
{
SiteCode = Global.systemConfig.siteCode,
LineCode = Global.systemConfig.lineCode,
EquipNum = Global.systemConfig.equipCode,
MaterialCode = Global.systemConfig.materialCode,
UserName = "Test_HC",
Identification = m.BarCode,
ProductType = Global.systemConfig.productType
};
Task.Run(() => {
var resp = new MESDataCombin().PostProductArrivalStationData(req);
if (!resp.Success)
{
string errMsg = $"进站数据上传MES失败, 错误代码: {resp.Code}, 错误消息:{resp.Message}, 报错消息类型: {resp.Category}";
LogManagerControl.AddLog(errMsg, LogAddtype.MES, Logtype.Error);
}
});
}
#endregion
}
list.Add(m);
//电芯判断结果返回PLC
omronPLCCom.lstMcUI[0].WriteDReg("W202" + i.ToString(), listResult[i]);
}
//复位PLC信号
omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[0].TrgParams.TriggerAddr, VarType.Short);
sw.Stop();
LogManagerControl.AddLog("上料数据处理耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local);
//显示数据库
Task.Run(() =>
{
SaveDataEven1_Run(list);
});
}
catch (Exception ex)
{
LogManagerControl.AddLog("读取上料数据异常:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
}
}
/// <summary>
/// 上料电芯数据保存
/// </summary>
/// <param name="obj"></param>
private void SaveDataEven1_Run(object obj)
{
if (!startup)
{
return;
}
if (dgvDataShow_A.InvokeRequired)
{
ChangeFunctionHTestA a = new ChangeFunctionHTestA(SaveDataEven1_Run);
this.Invoke(a, new object[] { obj });
}
else
{
try
{
Repository<FeedingData> repository = new Repository<FeedingData>();
var feedingService = new FeedingDataService(repository);
List<FeedingData> list = (List<FeedingData>)obj;
if (list != null)
{
foreach (FeedingData m in list)
{
string strRes = "";
int addCout = feedingService.AddFeedingData(m);
//var result = dbHelper.AddFeedingData(m, ref strErr);//保存本地数据
//strRes = strErr == "" ? ",本地存储OK" : ",本地存储NG" + strErr;
strRes = addCout > 0 ? ",本地存储OK" : ",本地存储NG";
m.Remark += strRes;
// 文件形式保存到本地
List<FeedingData> data = new List<FeedingData>();
data.Add(m);
CSVHelper<FeedingData>.WriteCSV("", data, 1);
if (listTA.Count > 50)
{
listTA.RemoveAt(0);
}
listTA.Add(m);
}
}
if (dgvDataShow_A.Rows.Count > 0)
{
dgvDataShow_A.CurrentCell = dgvDataShow_A.Rows[this.dgvDataShow_A.Rows.Count - 1].Cells[0];
}
}
catch (Exception ex)
{
LogManagerControl.AddLog("进站条码保存数据失败:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
}
#endregion
#region 下料数据
/// <summary>
/// 下料数据
/// </summary>
/// <param name="mt"></param>
/// <param name="resByte"></param>
private void processA2(CancellationTokenSource mt, OperateResult<byte[]> resByte)
{
if (!mt.IsCancellationRequested)
{
if (resByte.IsSuccess && resByte != null)
{
try
{
sw.Restart();
List<BlankingData> list = new List<BlankingData>();
List<string> listBarIn = StrUtil.GetListString(2, "NG");//进站条码
List<string> listBarOut = StrUtil.GetListString(2, "NG");//出站条码
List<List<short>> listBarResult = new List<List<short>>(); //CCD结果
List<short> listBar1Result = CollectionUtil.GetListUShort(16);
List<short> listBar2Result = CollectionUtil.GetListUShort(16);
List<short> listBar3Result = CollectionUtil.GetListUShort(16);
listBarResult.Add(listBar1Result);
listBarResult.Add(listBar2Result);
listBarResult.Add(listBar3Result);
List<short> listResult = CollectionUtil.GetListUShort(2);
//读取plc地址W260。1 是开启屏蔽。2 是默认不开启。 反馈地址w261。 1 是正常不报警。 2 是报警。
var isCCDMask = omronPLCCom.lstMcUI[0].ReadshortDReg("W260");
int id = 0;
byte[] bytes = resByte.Content.ByteReverse();
//前面有2个占位标识 04
int offset = 0;
for (int i = 0; i < 2; i++)
{
listBarOut[i] = TransformBase.TransString(bytes, 0 + offset + (i*40 *2), 20 *2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//1# 出站条码
var lstBarResult = listBarResult[i];
for (int j = 0; j < 16; j++)
{
// var okNg = TransformBase.TransString(bytes, 40 + offset + (i * 40*2) + j *2, 1*2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();
int ccdDefault = TransformBase.TransInt16(resByte.Content, 40 + offset + (i * 40 * 2) + j * 2);
// int.TryParse(okNg,out ccdDefault);
lstBarResult[j] = (short)ccdDefault;
// TransformBase.TransInt16(resByte.Content, 20 + offset+(i * 40)+j,1);//1#CCD1结果CCD给0是OK,1是NG
}
listBarIn[i] = TransformBase.TransString(bytes, 140 * 2 + offset + (i * 20*2), 20 * 2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//
// listBarIn[i] = listBarOut[i];
///1# 进站条码
}
Repository<FeedingData> repository = new Repository<FeedingData>();
FeedingDataService service = new FeedingDataService(repository);
for (int i = 0; i < listBarOut.Count; i++)
{
BlankingData m = new BlankingData();
id = i + 1;
No = No + 1;
m.TD = No;
m.WorkShift = ClassShift == 0 ? "白班" : "夜班";
m.ArrivalBarCode = listBarIn[i];
m.DepartureBarCode = listBarOut[i];
m.OutTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var listEntity = service.GetFeedingData(m.ArrivalBarCode);
if (listEntity.Count() > 0)
{
m.TDGroup = listEntity.First().TDGroup;
}
var lstBarResult = listBarResult[i];
#region CCD结果 0 ok ;1 ng
m.CCD1 = lstBarResult[0] == 1 ? "OK" : "NG";
m.CCD2 = lstBarResult[1] == 1 ? "OK" : "NG";
m.CCD3 = lstBarResult[2] == 1 ? "OK" : "NG";
m.CCD4 = lstBarResult[3] == 1 ? "OK" : "NG";
m.CCD5 = lstBarResult[4] == 1 ? "OK" : "NG";
m.CCD6 = lstBarResult[5] == 1 ? "OK" : "NG";
m.CCD7 = lstBarResult[6] == 1 ? "OK" : "NG";
m.CCD8 = lstBarResult[7] == 1 ? "OK" : "NG";
m.CCD9 = lstBarResult[8] == 1 ? "OK" : "NG";
m.CCD10 = lstBarResult[9] == 1 ? "OK" : "NG";
m.CCD11 = lstBarResult[10] == 1 ? "OK" : "NG";
m.CCD12 = lstBarResult[11] == 1 ? "OK" : "NG";
m.CCD13 = lstBarResult[12] == 1 ? "OK" : "NG";
m.CCD14 = lstBarResult[13] == 1 ? "OK" : "NG";
m.CCD15 = lstBarResult[14] == 1 ? "OK" : "NG";
m.CCD16 = lstBarResult[15] == 1 ? "OK" : "NG";
var cfgList = Global.systemConfig.CollectItemCfgList
.Where(it => it.IsEnable && it.PLCRelAddress != null)
.OrderBy(it => it.PLCRelAddress).ToList();
for (int k = 0; k < cfgList.Count; k++)
{
var item = cfgList[k];
int index = (int)item.PLCRelAddress - 1;
if (index < listBar2Result.Count)
{
var code = listBar2Result[index] == 1 ? "OK" : "NG";
m.PLCValDic.Add((int)item.PLCRelAddress, code);
}
}
#endregion
string levelresult = null;
string strErr = "";
//入站条码判断
if (String.IsNullOrEmpty(m.ArrivalBarCode) || m.ArrivalBarCode.Trim() == "ERROR")
m.ArrivalBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8);
//出站条码判断
if (String.IsNullOrEmpty(m.DepartureBarCode) || m.DepartureBarCode.Trim() == "ERROR")
m.DepartureBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8);
var lstError = new List<short>();
listResult[i] = GetResult(m, ref strErr,ref lstError);
m.Result = listResult[i] == 1 ? "OK" : "NG";
m.Remark = strErr;
//扫码不良 进出站扫码不对应 不需要上传MES
var scanCount = lstError.Count(x => x == 2 || x == 3);
var ccdOkNg = "OK"; //ccd总结果 ok ng
if (scanCount > 0)
{
m.Result = "扫码NG";
}
else
{
//扫码ng 另一分支ccd NG
var ccdNgCount = lstError.Count(x => x > 10);
if(ccdNgCount >0)
{
ccdOkNg = "NG";
m.Result = "CCD结果NG";
}
}
//OK
//扫码ng的不进行mes分档,CCD NG的也进行mes分档
var isOkGrading = false; //是否已经完成OK挡位的分档成功
if (listResult[i] == 1 || ccdOkNg =="NG")
{
if (Global.systemConfig.isUpMes && chkCkGrading)
{
//分档接口
//21~24 OK挡位
MesResponse resGrading = ToMesData.GetMesIn(m.DepartureBarCode, m.ArrivalBarCode);//分档查询
try
{
//listResult[i] = (short)(88);//默认分档NG
//m.Remark = "外观检OK分档NG";
if (resGrading.success)
{
if (resGrading.rows != null && resGrading.rows.Count > 0 && resGrading.rows[0].rank != null)
{
var rank = resGrading.rows[0].rank;
//不分类
// 读取plc地址W260。9 是开启屏蔽 使用不分类。1 是默认不开启。 反馈地址w261。 1 是正常不报警。 2 是报警。
#region //CCD屏蔽被修改 报警
var listGradingCCD = new List<string>();
listGradingCCD.Add(Global.systemConfig.Grading1);//k77_ok
listGradingCCD.Add(Global.systemConfig.Grading2);
listGradingCCD.Add(Global.systemConfig.Grading3);
listGradingCCD.Add(Global.systemConfig.Grading4);
if (isCCDMask == 9)
{
ccdOkNg = "不分类";
var gradingCCD_NoClassCount = listGradingCCD.Count(x => x.Contains("不分类"));
if (gradingCCD_NoClassCount <= 0)
{
//CCD屏蔽被修改 报警
omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2);
}
}
else
{
//必须有一个OK ccd结果拉带
var gradingCCD_OKCount = listGradingCCD.Count(x => x.Contains("OK"));
if (gradingCCD_OKCount <= 0)
{
//CCD屏蔽被修改 报警
omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2);
}
var lstGradingCCD_NG = listGradingCCD.Where(x => x.Contains("NG")).Distinct().ToList();
foreach (var item_NG in lstGradingCCD_NG)
{
var grading_array = item_NG.Substring(0,item_NG.Length-2);
var indexGrading = listGradingCCD.IndexOf(grading_array + "OK");
if (indexGrading < 0)
{
//CCD屏蔽被修改 报警
omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2);
}
}
}
#endregion
rank += ccdOkNg;
//k77 + 不分类 ng ok
if (rank.Equals(Global.systemConfig.Grading1) )
{
listResult[i] = (short)(MESGradingSet[0]);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}";
isOkGrading = true;
}
else if (rank.Equals(Global.systemConfig.Grading2) )
{
listResult[i] = (short)(MESGradingSet[1]);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}";
isOkGrading = true;
}
else if (rank.Equals(Global.systemConfig.Grading3) )
{
listResult[i] = (short)(MESGradingSet[2]);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}";
isOkGrading = true;
}
else if (rank.Equals(Global.systemConfig.Grading4))
{
listResult[i] = (short)(MESGradingSet[3]);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}";
isOkGrading = true;
}
else
{
if (isCCDMask == 9)
{
m.Result = "分档NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD屏蔽状态";
}
else
{
m.Result = "分档NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}与设置档位不匹配NG";
}
}
levelresult = resGrading.rows[0].level;
}
else
{
m.Result = "分档NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OK分档NG,MES未反馈正确档位";
}
}
else
{
if (resGrading.error == 9 || resGrading.error == 99)
{
omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1);//MES网络异常
LogManagerControl.AddLog($"出站条码[{m.DepartureBarCode}]访问MES异常", LogAddtype.local, Logtype.Error);
}
m.Result = "分档NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检MES分档请求失败,访问MES异常";
}
}
catch (Exception ex)
{
m.Result = "分档NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]解析出站MES分档数据异常,分档NG";
LogManagerControl.AddLog("解析出站MES分档数据异常:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
else
{
listResult[i] = 80;//不开启分档
}
//
}
//NG
if (m.Result.IndexOf("NG") >= 0 && !isOkGrading)
{
if (IsStartNGFL)
{
listResult[i] = 99;
m.Result = "NG不分类";
m.Remark = $"出站条码[{m.DepartureBarCode}],出站NG不分类";
}
else
{
var NgOkChannelNo = 0;
var NgOkChannelValue = "";
var indexFD = strNgBound.ToList().FindIndex(x => x == m.Result);
var smAndFdNg = false;
if (indexFD >= 0)
{
listResult[i] = (short)indexFD;
// m.Remark = $"出站条码[{m.DepartureBarCode},{m.Result}]";
//
var smNgGradingSet = NgGradingSet.ToList().FindIndex(x => x == (indexFD+10));
if(smNgGradingSet >= 0)
{
listResult[i] = (short)(NgGradingSet[smNgGradingSet]);
smAndFdNg = true;
NgOkChannelNo = smNgGradingSet;
m.Remark = $"出站条码[{m.DepartureBarCode},{m.Result},通道[{NgOkChannelNo + 5}]出站NG拉带值{listResult[i]},MES获取等级{levelresult}";
}
}
if(!smAndFdNg)
{
var NgGrading1 = lstError.FindIndex(x => x == NgGradingSet[0]);
var NgGrading2 = lstError.FindIndex(x => x == NgGradingSet[1]);
var NgGrading3 = lstError.FindIndex(x => x == NgGradingSet[2]);
if (NgGrading1 >= 0)
{
listResult[i] = (short)(NgGradingSet[0]);
NgOkChannelNo = 0;
}
else if (NgGrading2 >= 0)
{
listResult[i] = (short)(NgGradingSet[1]);
NgOkChannelNo = 1;
}
else if (NgGrading3 >= 0)
{
listResult[i] = (short)(NgGradingSet[2]);
NgOkChannelNo = 2;
}
else
{
var indexQT = strNgBound.ToList().FindIndex(x => x == "其他");
var smNgGradingSet = NgGradingSet.ToList().FindIndex(x => x == (indexQT+10));
if (smNgGradingSet >= 0)
{
listResult[i] = NgGradingSet[smNgGradingSet];
NgOkChannelNo = smNgGradingSet;
}
else
{
listResult[i] = 88;
}
}
m.Remark = $"出站条码[{m.DepartureBarCode}],NG,通道[{NgOkChannelNo + 5}]出站NG拉带值{listResult[i]},MES获取等级{levelresult}";
}
}
}
list.Add(m);
//电芯判断结果返回PLC
omronPLCCom.lstMcUI[0].WriteDReg("W302" + i.ToString(), listResult[i]);
}
//复位PLC信号
omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[1].TrgParams.TriggerAddr, VarType.Short);
sw.Stop();
LogManagerControl.AddLog("出站数据处理耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local);
//显示数据库
Task.Run(() =>
{
SaveDataEven2_Run(list);
if (Global.systemConfig.isUpMes)
{
UpDataMES_Run(list);
}
});
}
catch (Exception ex)
{
LogManagerControl.AddLog("读取出站数据异常:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
}
}
/// <summary>
/// 结果加工参数上传
/// </summary>
/// <param name="obj"></param>
private void UpDataMES_Run(object obj)
{
try
{
List<BlankingData> list = (List<BlankingData>)obj;
if (list != null)
{
foreach (BlankingData m in list)
{
if (m != null)
{
#region 3、产品结果加工参数
2026-07-14 16:09:25 +08:00
MesCallResult<RespProductResult> resMes = ToMesData.ProductResultParameters(m);
if (!resMes.IsSuccess)
2026-07-14 13:55:17 +08:00
{
2026-07-14 16:09:25 +08:00
if (resMes.ErrorType == MesErrorType.NetworkError || resMes.ErrorType == MesErrorType.NetworkTimeout)
2026-07-14 13:55:17 +08:00
{
omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1);//MES网络异常
LogManagerControl.AddLog("结果数据上传MES超时或无法访问MES服务器", LogAddtype.local, Logtype.Error);
}
else
{
2026-07-14 16:09:25 +08:00
LogManagerControl.AddLog("结果数据上传MES失败NG" + resMes.OriResponse.Message, LogAddtype.local, Logtype.Error);
2026-07-14 13:55:17 +08:00
}
}
#endregion
#region 电池出站
ReqExitStation req = new ReqExitStation()
{
SiteCode = Global.systemConfig.siteCode,
LineCode = Global.systemConfig.lineCode,
EquipNum = Global.systemConfig.equipCode,
UserName = Global.systemConfig.userName,
ContainerCode = string.Empty,
AssembleLineList = new List<AssembleLine>() {
new AssembleLine() {
Identification = m.ArrivalBarCode,
QualityStatus = m.Result,
// TODO NG编码
QrCode = string.Empty,
NgCode = new string[] { string.Empty },
// NG错误信息
NgMessage = string.Empty
}
}
};
2026-07-14 16:09:25 +08:00
RespExitStation resp = ToMesData.PostProductExitStationData(req);
2026-07-14 13:55:17 +08:00
if (resp == null || !resp.Success)
{
string errMsg = $"出站数据上传MES失败, 错误代码: {resp?.Code}, 错误消息:{resp?.Message}, 报错消息类型: {resp?.Category}";
LogManagerControl.AddLog(errMsg, LogAddtype.local, Logtype.Error);
}
#endregion
}
}
}
}
catch (System.Exception ex)
{
LogManagerControl.AddLog("上传出站结果参数异常:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
/// 电池异常数据保存
/// </summary>
/// <param name="obj"></param>
private void SaveDataEven2_Run(object obj)
{
//if (!startup)
//{
// return;
//}
if (dgvDataShow_B.InvokeRequired)
{
ChangeFunctionHTestB c = new ChangeFunctionHTestB(SaveDataEven2_Run);
this.Invoke(c, new object[] { obj });
}
else
{
try
{
//BlankingDataService service = IocConfig.Provider.GetService<BlankingDataService>();
Repository<BlankingData> repository = new Repository<BlankingData>();
var service = new BlankingDataService(repository);
List<BlankingData> list = (List<BlankingData>)obj;
if (list != null)
{
foreach (BlankingData m in list)
{
//string strErr = "";
string strRes = "";
// TODO 使用service操作
int addCount = service.AddBlankData(m);
//var result = dbHelper.AddBlankingData(m, ref strErr);//保存本地数据
strRes = addCount > 0 ? ",本地存储OK" : ",本地存储NG";
m.Remark += strRes;
// 文件形式保存到本地
List<BlankingData> data = new List<BlankingData>();
data.Add(m);
CSVHelper<BlankingData>.WriteCSV("", data, 2);
if (listTB.Count > 50)
{
listTB.RemoveAt(0);
}
listTB.Add(m);
}
}
if (dgvDataShow_B.Rows.Count > 0)
{
dgvDataShow_B.CurrentCell = dgvDataShow_B.Rows[this.dgvDataShow_B.Rows.Count - 1].Cells[0];
IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "ClassShift", ClassShift.ToString());
IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "No", No.ToString());
}
}
catch (Exception ex)
{
LogManagerControl.AddLog("下料保存数据失败:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
}
/// <summary>
/// 结果判断
/// </summary>
/// <param name="list"></param>
/// <param name="NGType"></param>
/// <param name="strBoiData"></param>
private short GetResult(BlankingData m, ref string strErr,ref List<short> lstError)
{
short res = 0;
strErr = "";
#region 判断各项参数
//入站条码判断
bool IsBarInOK = !m.ArrivalBarCode.Contains("ERROR");
//出站条码判断
bool IsBarOK = !m.DepartureBarCode.Contains("ERROR");
//判断条码是否一致
bool bBar = true;
if (m.ArrivalBarCode.Trim() != m.DepartureBarCode.Trim())
bBar = false;
m.TMDB = bBar ? "OK" : "NG";
bool[] b0 = new bool[16] { true, true, true, true, true, true, true, true, true, true, true, true, true, true,true,true };
b0[0] = m.CCD1 == "OK" ? true : false;
b0[1] = m.CCD2 == "OK" ? true : false;
b0[2] = m.CCD3 == "OK" ? true : false;
b0[3] = m.CCD4 == "OK" ? true : false;
b0[4] = m.CCD5 == "OK" ? true : false;
b0[5] = m.CCD6 == "OK" ? true : false;
b0[6] = m.CCD7 == "OK" ? true : false;
b0[7] = m.CCD8 == "OK" ? true : false;
b0[8] = m.CCD9 == "OK" ? true : false;
b0[9] = m.CCD10 == "OK" ? true : false;
b0[10] = m.CCD11 == "OK" ? true : false;
b0[11] = m.CCD12 == "OK" ? true : false;
b0[12] = m.CCD13 == "OK" ? true : false;
b0[13] = m.CCD14 == "OK" ? true : false;
b0[14] = m.CCD15 == "OK" ? true : false;
b0[15] = m.CCD16 == "OK" ? true : false;
#endregion
#region
if ( IsBarOK && bBar && b0[0] && b0[1] && b0[2] && b0[3] && b0[4] && b0[5] && b0[6] && b0[7] && b0[8] && b0[9] && b0[10] && b0[11] && b0[12] && b0[13] && b0[14] && b0[15])
{
strErr = "良品";
res = 1;
lstError.Add(res);
return 1;
}
//if (!IsBarInOK)
//{
// strErr = "入站扫码不良,入站条码:" + m.ArrivalBarCode;
// return 2;
//}
if (!IsBarOK)
{
strErr = "出站扫码不良,出站条码:" + m.DepartureBarCode;
res = 2;
lstError.Add(res);
}
if (!bBar)
{
strErr = "入站与出站条码不一致";
res = 3;
lstError.Add(res);
}
if (!b0[0])
{
strErr = "正面(2D/3D)不良";
res = 11;
lstError.Add(res);
}
if (!b0[1])
{
strErr = "反面(2D/3D)不良";
res = 12;
lstError.Add(res);
}
if (!b0[2])
{
strErr = "左侧面(2D/3D)不良";
res =13;
lstError.Add(res);
}
if (!b0[3])
{
strErr = "右侧面(2D/3D)不良";
res = 14;
lstError.Add(res);
}
if (!b0[4])
{
strErr = "顶面(2D/3D)不良";
res = 15;
lstError.Add(res);
}
if (!b0[5])
{
strErr = "底面(2D/3D)不良";
res = 16;
lstError.Add(res);
}
if (!b0[6])
{
strErr = "底WE1不良";
res = 17;
lstError.Add(res);
}
if (!b0[7])
{
strErr = "底WE2不良";
res = 18;
lstError.Add(res);
}
if (!b0[8])
{
strErr = "底WE3不良";
res = 19;
lstError.Add(res);
}
if (!b0[9])
{
strErr = "底WE4不良";
res = 20;
lstError.Add(res);
}
if (!b0[10])
{
strErr = "中ME1不良";
res = 21;
lstError.Add(res);
}
if (!b0[11])
{
strErr = "中ME2不良";
res = 22;
lstError.Add(res);
}
if (!b0[12])
{
strErr = "中ME3不良";
res = 23;
lstError.Add(res);
}
if (!b0[13])
{
strErr = "中ME4不良";
res = 24;
lstError.Add(res);
}
if (!b0[14])
{
strErr = "极柱(POS/NEG)不良";
res = 25;
lstError.Add(res);
}
if (!b0[15])
{
strErr = "防爆阀(PRO)不良";
res = 26;
lstError.Add(res);
}
return 0;
#endregion
}
/// <summary>
/// 获取进站条码
/// </summary>
/// <param name="strBar"></param>
/// <param name="strErr"></param>
/// <returns></returns>
public string GetInTime(string strBar, ref string strErr)
{
string strTime = "";
strErr = "";
try
{
if (strBar != "")
{
var result = dbHelper.GetBarInTime(strBar);//保存本地数据
if (result != null && result.Rows.Count > 0)
{
strTime = result.Rows[0]["进站时间"].ToString();
//dbHelper.UparInTime(strBar);
}
}
}
catch (Exception ex)
{
strErr = ex.Message;
}
return strTime;
}
/// <summary>
/// 判断字符串是否有特殊符号
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public bool IsSpecialChar(string str)
{
Regex regExp = new Regex("[ \\[ \\] \\^ \\-_*×――(^)$%~!@@##$…&%¥—+=<>《》!!???::•`·、。,;,.;/\'\"{}()‘’“”-]");
if (regExp.IsMatch(str))
{
return true;
}
return false;
}
/// <summary>
///
/// </summary>
/// <param name="Num"></param>
/// <returns></returns>
public List<int> GetListInt(int Num)
{
List<int> list = new List<int>();
for (int i = 0; i < Num; i++)
{
list.Add(1);
}
return list;
}
/// <summary>
/// 生成byte List集合
/// </summary>
/// <param name="Num"></param>
/// <returns></returns>
public List<byte> GetListByte(int Num)
{
List<byte> list = new List<byte>();
for (int i = 0; i < Num; i++)
{
list.Add(0);
}
return list;
}
/// <summary>
/// 判断分档是否都扫到条码
/// </summary>
/// <param name="list"></param>
/// <returns></returns>
public bool IsListRes(List<string> list)
{
HashSet<string> hs = new HashSet<string>(list);
if (hs.Count == 1)
{
return true;
}
return false;
}
#region 设备状态报告
/// <summary>
/// 间隔
/// </summary>
/// <param name="mt"></param>
///
string strStatues = "";
private void processModeStatus(CancellationTokenSource mt)
{
strStatues = "";
while (true)
{
//SendStatus();
Thread.Sleep(1000);
}
}
/// <summary>
/// 设备状态上传
/// </summary>
/// <param name="mt"></param>
private void SendStatus()
{
//size1 0:OFF, 1:Vacancy, 2:Tray In, 3:Running, 4:End, 5:Error, 6: Ready, 9: Red Ready -托盘接受到入库预约但是无法进入(5分钟) / 트레이 정보 응답을 못받은 경우(5분)
//size2 0: Auto, 1: Local
//先确定设备是在自动还是手动状态下
if (startup)
{
string Size1 = "0";
string Size2 = "1";
Size1 = omronPLCCom.lstMcUI[0].ReadshortDReg("W10").ToString();
Size2 = omronPLCCom.lstMcUI[0].ReadBoolDReg("W12").ToString() == "True" ? "0" : "1";
if (Size1 != strStatues)
{
strStatues = Size1;
#region 上传mes
//if (Global.systemConfig.isUpMes)
//{
string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
JY.MES.FMS.FMS_Status Status = new JY.MES.FMS.FMS_Status();
Status.seatId = "";
Status.recordDate = currentTime;
//Status.statusCode = "";
Status.uploadTime = currentTime;
Status.guid = Guid.NewGuid().ToString();
switch (strStatues)
{
case "1":
Status.statusCode = "Run";//正常运行
LogManagerControl.AddLog("当前状态:正常运行", LogAddtype.local, Logtype.Message);
break;
case "2":
Status.statusCode = "Idle";//待机状态
LogManagerControl.AddLog("当前状态:闲置待机", LogAddtype.local, Logtype.Message);
break;
case "3":
Status.statusCode = "Alert";//故障调试
LogManagerControl.AddLog("当前状态:故障调试", LogAddtype.local, Logtype.Message);
break;
case "4":
Status.statusCode = "Maintain";//停机
LogManagerControl.AddLog("当前状态:停止运行", LogAddtype.local, Logtype.Message);
break;
// default:
//Status.statusCode = "Idle";//待机状态
//break;
}
if (Global.systemConfig.isUpMes)
{
string strJosn = JsonConvert.SerializeObject(Status);
// LogManagerControl.AddLog($"PC->FMS[MES_Status]:{strJosn}", LogAddtype.MES);
//TxtHelper.WriteTxt($@"{Global.strMesLogspath}\{DateTime.Now.ToString("yyyyMMdd")}\设备运行状态\{DateTime.Now.ToString("HH")}.txt", strJosn);
Stopwatch swTime = new Stopwatch();
swTime.Start();
var result = JY.MES.FMS.MesHelper_EVE.MES_Status(Status);
swTime.Stop();
LogManagerControl.AddLog($"处理设备状态上报FMS耗时:{swTime.ElapsedMilliseconds}ms", LogAddtype.local, Logtype.Message);
if (result != null)
{
string strRes = "code" + "[" + result.code + "]" + "success" + "[" + result.success + "]" + "message" + "[" + result.message + "]" + "category" + "[" + result.category + "]";
LogManagerControl.AddLog($"FMS->PC[MES_Status]:{strRes}", LogAddtype.MES);
}
else
{
LogManagerControl.AddLog($"设备状态上报FMS出错", LogAddtype.local, Logtype.Message);
}
}
#endregion
// }
}
Task.Delay(1000);
}
}
#endregion
#region 报警信息读取
/// <summary>
/// 报警信息读取
/// </summary>
/// <param name="mt"></param>
/// <param name="resByte"></param>
private void AlarmProcess(CancellationTokenSource mt, OperateResult<byte[]> resByte)
{
if (!mt.IsCancellationRequested)
{
sw.Restart();
byte[] res = new byte[2];
for (int i = 0; i < 30; i++)
{
res = omronPLCCom.lstMcUI[0].Readbyte("W6100[" + i + "].Word区", 1);
if (res != null)
{
for (int j = i; j < res.Length + i; j++)
{
listAlamByte[i + j] = res[j - i];
}
}
}
//AddLog(0, "读取报警耗时:" + sw.ElapsedMilliseconds + "ms");
if (listAlamByte == null) { return; }
string strFileName = Environment.CurrentDirectory + "\\欧姆龙报警寄存器对应表.csv";
listAlarmForm = CSVHelper<AlarmForm>.ReadCSV(strFileName);
//如果未配置报警地址信息返回 TODO
if (listAlarmForm == null) { return; }
int startPlcAddr = 0;//TODO 读取起始地址
//3.公用方法解析byte[]数据 => List<AlarmStatus>
if (listAlamByte == null) { return; } //如果未配置报警地址信息返回
//TODO 切换三菱和欧姆龙
listAlarmStatus = PLCAlarmParse.OmronEIPByte2Status(startPlcAddr, listAlamByte);
//4.判定有不良后,关联AlarmStatus 和AlarmForm
if (listAlarmStatus == null) { return; } //状态信息为空返回
//如果有报警,获取报警信息
if (listAlarmStatus.Any(p => p.Status))
{
#region 屏蔽
////从PLC读取读取开机时间
//string starHourtTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_开机时间_H").ToString();
//string starMinuteTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_开机时间_M").ToString();
//string startSecondTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_开机时间_S").ToString();
//string strStartTime = starHourtTime + ":" + starMinuteTime + ":" + startSecondTime;
//DateTime startTime = Convert.ToDateTime(strStartTime);
////从PLC读取读取运行时间
//string runHourtTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_运行时间_H").ToString();
//string runMinuteTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_运行时间_H").ToString();
//string runSecondTime = omronPLCCom.lstMcUI[0].ReadIntDReg("HMI_运行时间_H").ToString();
//string strRunTime = runHourtTime + ":" + runMinuteTime + ":" + runSecondTime;
//DateTime runTime1 = Convert.ToDateTime(strRunTime);
#endregion
//关联表单数据和报警记录,获取报警信息
var result = listAlarmStatus.Where(s => s.Status).Join(listAlarmForm, s => s.PLCAdress, f => f.PLCAdress, (s, f) => new AlarmData()
{
AlarmGuid = Guid.NewGuid().ToString(),
PLCAdress = s.PLCAdress,
AlarmCode = f.AlarmCode,
AlarmContent = f.AlarmContent,
AlarmType = "停机报警",
AlarmDesc = f.AlarmContent,
AlarmState = "1",
StartTime = DateTime.Now,
EndTime = DateTime.Now,
Flag = 0,
}).ToList();
if (result != null && result.Count > 0 && Global.systemConfig.isUpMes)
{
try
{
foreach (var item in result)
{
if (item.AlarmCode != "")
{
#region 屏蔽
//AlarmMesData alarmMesData = new AlarmMesData();
//alarmMesData.deviceNo = Eqp_code;
//alarmMesData.alarmCode = item.AlarmCode;
//alarmMesData.alarmType = item.AlarmType;
//alarmMesData.alarmName = item.AlarmContent;
//alarmMesData.createTime = item.StartTime;
//string strJosn = JsonConvert.SerializeObject(uploadAlarm);
//LogManagerControl.AddLog($"PC->FMS[报警状态]:{strJosn}", LogAddtype.MES);
//string strRecJosn = MESApiHelper.HttpPostJsonAPI(UpAlarmUrl, authorization, strJosn);
//var result1 = JsonConvert.DeserializeObject<UploadAlarmResult>(strRecJosn);
//LogManagerControl.AddLog($"FMS->PC[报警状态]:{strRecJosn}", LogAddtype.MES);
#endregion
//if (Global.systemConfig.isUpMes)
//{
string currentTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
JY.MES.FMS.FMS_Alarm Alarm = new JY.MES.FMS.FMS_Alarm();
Alarm.seatId = "";
Alarm.recordDate = currentTime;
Alarm.guid = item.AlarmGuid;
Alarm.alarmEndTime = item.EndTime.ToString("yyyy-MM-dd HH:mm:ss");
Alarm.alarmType = item.AlarmType;
Alarm.alarmName = item.AlarmContent;
//string strOCVStart = m.StartTime.Substring(0, 18);
//strOCVStart = strOCVStart.Replace("/", "-");
//Alarm.alarmStartTime = strOCVStart;
Alarm.alarmStartTime = item.StartTime.ToString("yyyy-MM-dd HH:mm:ss");
Alarm.faultCode = item.AlarmCode;
if (Global.systemConfig.isUpMes)
{
string strJosn = JsonConvert.SerializeObject(Alarm);
// LogManagerControl.AddLog($"PC->FMS[MES_Alarm]:{strJosn}", LogAddtype.MES);
//TxtHelper.WriteTxt($@"{Global.strMesLogspath}\{DateTime.Now.ToString("yyyyMMdd")}\设备报警\{DateTime.Now.ToString("HH")}.txt", strJosn);
Stopwatch swTime1 = new Stopwatch();
swTime1.Start();
var AlarmResult = JY.MES.FMS.MesHelper_EVE.MES_Alarm(Alarm);
swTime1.Stop();
LogManagerControl.AddLog($"处理报警上报FMS耗时:{swTime1.ElapsedMilliseconds}ms", LogAddtype.local, Logtype.Message);
if (result != null)
{
string strRes = "code" + "[" + AlarmResult.code + "]" + "success" + "[" + AlarmResult.success + "]" + "message" + "[" + AlarmResult.message + "]" + "category" + "[" + AlarmResult.category + "]";
LogManagerControl.AddLog($"FMS->PC[MES_Alarm]:{strRes}", LogAddtype.MES);
}
else
{
LogManagerControl.AddLog($"报警上报FMS出错", LogAddtype.local, Logtype.Message);
}
}
// }
}
}
}
catch (Exception ex)
{
LogManagerControl.AddLog("报警信息异常:" + ex.Message, LogAddtype.local, Logtype.Error);
}
//dbHelper.AddAlarmCacheData("tb_alarm", (List<Model.AlarmData>)result);
sw.Stop();
LogManagerControl.AddLog("设备报警信息耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local);
}
Task.Run(() =>
{
SaveAlamDataEven_Run(result);
});
//复位PLC信号
omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[2].TrgParams.TriggerAddr, VarType.Short);
}
}
}
/// <summary>
/// 保存和显示设备报警信息
/// </summary>
/// <param name="list"></param>
public void SaveAlamDataEven_Run(List<AlarmData> list)
{
if (!startup)
{
return;
}
this.BeginInvoke((EventHandler)delegate
{
try
{
string strAlam = "";
if (list != null)
{
foreach (AlarmData m in list)
{
var result = dbHelper.AddAlarmData(m);//保存本地数据
strAlam += m.AlarmContent + ',';
}
//AddLog(2, "设备报警----->" + strAlam);
}
}
catch (Exception ex)
{
LogManagerControl.AddLog("保存异常数据失败:" + ex.Message, LogAddtype.local, Logtype.Error);
//AddLog(2, ex.Message);
//LogHelper.Error(ex.Message, new Exception("异常信息"));
}
});
}
#endregion
/// <summary>
/// 读取稼动率和PPM
/// </summary>
///
private void UpdatePPM()
{
try
{
if (startup)
{
float Capacit = Convert.ToSingle(omronPLCCom.lstMcUI[0].ReadFloatDReg("W14").ToString("f2"));//稼动率
int PPM = omronPLCCom.lstMcUI[0].ReadIntDReg("W16");//PPM
int ToalQty = omronPLCCom.lstMcUI[0].ReadIntDReg("W18");//生产总数
int OKQty = omronPLCCom.lstMcUI[0].ReadIntDReg("W20");//良品数
//float AntiDustAirSpeed = Convert.ToSingle(omronPLCCom.lstMcUI[0].ReadFloatDReg("D16").ToString("f2"));
Invoke((Action)delegate
{
RPimpacting.Value = Capacit;
RPPPM.Progress = PPM;
crToalQty.CountValue = ToalQty;
cvOKQty.CountValue = OKQty;
bool flag = ToalQty == 0L;
if (flag)
{
prYield.Value = 0L;
}
else
{
prYield.Value = Convert.ToSingle((Convert.ToDouble(OKQty) / Convert.ToDouble(ToalQty)).ToString("f2"));
}
});
}
}
catch (Exception ex)
{
LogManagerControl.AddLog("电池ppm与稼动率" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
#endregion
#region 异常播报处理
/// <summary>
/// 读取异常播报信息
/// </summary>
/// <param name="mt"></param>
/// <param name="resByte"></param>
private void processA3(CancellationTokenSource mt, OperateResult<byte[]> resByte)
{
if (!mt.IsCancellationRequested)
{
if (resByte.IsSuccess && resByte != null)
{
try
{
sw.Restart();
string code = Convert.ToString(TransformBase.TransInt16(resByte.Content, 0));//读取工位编码,W7010
omronPLCCom.lstMcUI[0].WriteDReg(omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.ResultAddr, 1);//结果返回PLC,W7100
omronPLCCom.lstMcUI[0].ClearReg(omronPLCCom.lstMcUI[0].lstTrgUI[3].TrgParams.TriggerAddr, VarType.Short);//复位PLC信号,W7000
sw.Stop();
LogManagerControl.AddLog("读取异常播报数据处理耗时:" + sw.ElapsedMilliseconds + "ms", LogAddtype.local);
//查找对应数据,播放内容
Task.Run(() =>
{
string remark = dbHelper.GetAbnormalVoice(code, true);
if (_speech != null)
{
_speech.SpeakAsync(remark);
}
});
}
catch (Exception ex)
{
LogManagerControl.AddLog("读取异常播报数据异常:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
}
}
#endregion
#region 通用方法
/// <summary>
/// 获取鼠标光标的当前位置
/// </summary>
/// <param name="pt"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out Point pt);
/// <summary>
/// 用户登录超时检查
/// </summary>
/// <param name="secTime"></param>
private void UserTimeOut(int secTime)
{
Task task = Task.Run(() =>
{
for (int i = 0; i < secTime; i++)
{
GetCursorPos(out Point sourcePoint);
System.Threading.Thread.Sleep(1000);
GetCursorPos(out Point currentPoint);
if (sourcePoint.X != currentPoint.X | sourcePoint.Y == currentPoint.Y)
{
i = 0;
}
if (CurrentInfo.LoginOut)
{
break;
}
}
LoginOut();
});
}
private void LoginOut()
{
LogManagerControl.AddLog(lblUser.Text + "-退出", LogAddtype.local);
CurrentInfo.autuority = Autuority.Empty;
lblUser.Invoke(new Action(() => lblUser.Text = "No User"
));
CurrentInfo.LoginOut = true;
}
private void Login(User user)
{
lblUser.Text = user.UserName;
Global.systemConfig.userName = user.UserName;
lblAuthority.Text = user.Level.ToString();
CurrentInfo.autuority = user.Level;
CurrentInfo.LoginOut = false;
dtLogin = DateTime.Now;
LogManagerControl.AddLog(user.UserName + "-登录成功!", LogAddtype.local);
txtTcpClicet.Text = Global.systemConfig.isUpMes ? "MES在线" : "MES离线";
if (startup)
{
SendAuthorityToPLC();
}
//ShowEnabled(true);
UserTimeOut(30);
}
/// <summary>
/// 检测是否是管理员账号
/// </summary>
/// <returns></returns>
private bool CheckAdmin()
{
if (CurrentInfo.autuority == Autuority.管理员)
{
return true;
}
return false;
}
/// <summary>
/// 检测是否是管理员或者是工程师账号
/// </summary>
/// <returns></returns>
private bool CheckAdminOrEng()
{
if (CurrentInfo.autuority == Autuority.管理员 | CurrentInfo.autuority == Autuority.工程师)
{
return true;
}
return false;
}
/// <summary>
/// 判断长度
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public string GetDataLenth(string str)
{
string strLenth = "";
int lenth2 = str.Length;
int lenth = lenth2.ToString().Length;
if (lenth == 1)
{
strLenth = $" {lenth2}";
}
if (lenth == 2)
{
strLenth = $" {lenth2}";
}
if (lenth == 3)
{
strLenth = $" {lenth2}";
}
if (lenth == 4)
{
strLenth = $" {lenth2}";
}
if (lenth == 5)
{
strLenth = $" {lenth2}";
}
if (lenth == 6)
{
strLenth = $"{lenth2}";
}
return strLenth;
}
int HeartCount = 0;
/// <summary>
/// 更新工具栏按钮状态
/// </summary>
/// <param name="time"></param>
private void ShowButtonEven_Run(string time)
{
HeartCount++;
UpdateDateTime(time);
UpdatePPM();
//if (isClient8321OK)
//{
// if (HeartCount < 1 || HeartCount > 60) //1分钟发送一次
// {
// HeartCount = 0;
// string Send925 = $"1{bObjID}1925{nSeqNo}9";
// try
// {
// LogManagerControl.AddLog($"PC->FMS[925][DataLength:{Send925.Length}]:{Send925}", LogAddtype.MES);
// SendMsg(Send925);
// //string str = ReadSpurtCode(Send925, ref strErr);
// }
// catch (Exception ex)
// {
// LogManagerControl.AddLog(ex.Message, LogAddtype.local, Logtype.Error);
// }
// }
//}
}
/// <summary>
/// 日期时间显示
/// </summary>
/// <param name="_time"></param>
private void UpdateDateTime(string _time)
{
timelabel.BeginInvoke((Action<string>)delegate
{
timelabel.Text = _time;
}, _time);
}
#endregion
private void LinkTCPEven_Run(string _time)
{
UpdateCommStatus();
}
private void UpdateCommStatus()
{
if (this.InvokeRequired)
{
BeginInvoke(new Action(UpdateCommStatus));
return;
}
try
{
//if (com != null && com.lstUI[0] != null)
//{
// if (com.lstUI[0].tcpClient.IsConnected)
// {
// if (com.lstUI[0].tcpClient.tcpclient.Client.Poll(10, SelectMode.SelectRead))
// {
// LogManagerControl.AddLog(com.lstUI[0].tcpClient.tcpclient.Client.RemoteEndPoint.ToString() + "链接断开了…………", LogAddtype.local, Logtype.Error);
// com.lstUI[0].btnStart_Click(null, null);
// }
// else if (com.lstUI[0].info_Lab.Text == "未连接")
// {
// com.lstUI[0].btnStart_Click(null, null);
// }
// }
// else
// {
// com.lstUI[0].btnStart_Click(null, null);
// }
//}
}
catch (Exception)
{
//try
//{
// com.lstUI[0].btnStart_Click(null, null);
//}
//catch (System.Exception)
//{
//}
}
}
private void HomeForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("是否退出程序?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
{
mCOMState.Cancel();
isEnabled = false;
mctsA1.Cancel();
mctsA2.Cancel();
mctsA3.Cancel();
IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "No", No.ToString());
IniFileHelper.WriteIniData("SYSTEM_CONFIGURE", "ClassShift", ClassShift.ToString());
if (port != null && port.IsOpen)
{
port.Close();
port.Dispose();
}
if (omronPLCCom != null)
{
for (int i = 0; i < OmronCount; i++)
{
omronPLCCom.lstMcUI[i].Shutdown();
omronPLCCom.lstMcUI[i].Dispose();
}
}
if (_speech != null)
{
if (_speech.State == SynthesizerState.Speaking)
{
_speech.Pause();
_speech.Dispose();
}
}
GC.Collect();
}
else
{
e.Cancel = true;
}
}
private void HomeForm_FormClosed(object sender, FormClosedEventArgs e)
{
Process.GetCurrentProcess().Kill();
}
private void dgvDataShow_A_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex >= dgvDataShow_A.Rows.Count - 1)
return;
DataGridViewRow dr = (sender as DataGridView).Rows[e.RowIndex];
try
{
if (dr.Cells["Column4"].Value.Equals("OK"))
{
// 设置单元格的背景色
dr.Cells["Column4"].Style.BackColor = Color.LightGreen;
// 设置单元格的前景色
dr.Cells["Column4"].Style.ForeColor = Color.Black;
}
else
{
dr.Cells["Column4"].Style.BackColor = Color.Red;
dr.Cells["Column4"].Style.ForeColor = Color.White;
}
}
catch (Exception ex)
{
LogManagerControl.AddLog($"上料数据显示:[{ex.Message}]", LogAddtype.local, Logtype.Error);
}
}
private void dgvDataShow_B_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (e.RowIndex >= dgvDataShow_B.Rows.Count - 1)
return;
DataGridViewRow dr = (sender as DataGridView).Rows[e.RowIndex];
try
{
if (dr.Cells["Column22"].Value.Equals("OK"))
{
// 设置单元格的背景色
dr.Cells["Column22"].Style.BackColor = Color.LightGreen;
// 设置单元格的前景色
dr.Cells["Column22"].Style.ForeColor = Color.Black;
}
else
{
dr.Cells["Column22"].Style.BackColor = Color.Red;
dr.Cells["Column22"].Style.ForeColor = Color.White;
}
}
catch (Exception ex)
{
LogManagerControl.AddLog($"下料数据显示:[{ex.Message}]", LogAddtype.local, Logtype.Error);
}
}
private void tsmiAbnormalVoice_Click(object sender, EventArgs e)
{
if (!CheckAdmin())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
FrmAbnormalVoice frm = new FrmAbnormalVoice();
frm.ShowDialog();
}
private void button1_Click(object sender, EventArgs e)
{
//GradingParam gradingParam = new GradingParam
//{
// siteCode = "1",
// lineCode = "2",
// userName = "admin",
// equipCode = "3",
// recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
// qty = 1,
// containerCode = "",
// materialCode = "4",
// materiallotCodeList = new List<string>() { "ABC" }
//};
//string p = JsonConvert.SerializeObject(gradingParam);
//GradingParam gradingParam = new GradingParam();
//gradingParam.siteCode = "1";
//gradingParam.lineCode = "1";
//gradingParam.equipCode = "1";
//gradingParam.userName = "123";
//gradingParam.qty = 1;
//gradingParam.containerCode = "";
//gradingParam.materialCode = "1";
//gradingParam.recordDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
//gradingParam.materiallotCodeList = new List<string>() { "123" };
//string p = JsonConvert.SerializeObject(gradingParam);
List<BlankingData> list = new List<BlankingData>();
List<string> listBarIn = StrUtil.GetListString(2, "04QCB6CJ68701JF6K0008815");//进站条码
List<string> listBarOut = StrUtil.GetListString(2, "04QCB6CJ68701JF6K0008815");//出站条码
List<short> listBar1Result = CollectionUtil.GetListUShort(14);
List<short> listBar2Result = CollectionUtil.GetListUShort(14);
List<short> listResult = CollectionUtil.GetListUShort(2);
int id = 0;
for (int i = 0; i < listBarOut.Count; i++)
{
BlankingData m = new BlankingData();
id = i + 1;
No = No + 1;
m.TD = No;
m.WorkShift = ClassShift == 0 ? "白班" : "夜班";
m.ArrivalBarCode = listBarIn[i];
m.DepartureBarCode = listBarOut[i];
m.OutTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
#region CCD结果
if (id == 1)
{
m.CCD1 = "NG";
m.CCD2 = listBar1Result[1] == 1 ? "OK" : "NG";
m.CCD3 = listBar1Result[2] == 1 ? "OK" : "NG";
m.CCD4 = listBar1Result[3] == 1 ? "OK" : "NG";
m.CCD5 = listBar1Result[4] == 1 ? "OK" : "NG";
m.CCD6 = listBar1Result[5] == 1 ? "OK" : "NG";
m.CCD7 = listBar1Result[6] == 1 ? "OK" : "NG";
m.CCD8 = listBar1Result[7] == 1 ? "OK" : "NG";
m.CCD9 = listBar1Result[8] == 1 ? "OK" : "NG";
m.CCD10 = listBar1Result[9] == 1 ? "OK" : "NG";
m.CCD11 = listBar1Result[10] == 1 ? "OK" : "NG";
m.CCD12 = listBar1Result[11] == 1 ? "OK" : "NG";
m.CCD13 = listBar1Result[12] == 1 ? "OK" : "NG";
m.CCD14 = listBar1Result[13] == 1 ? "OK" : "NG";
}
else
{
m.CCD1 = listBar2Result[0] == 1 ? "OK" : "NG";
m.CCD2 = listBar2Result[1] == 1 ? "OK" : "NG";
m.CCD3 = listBar2Result[2] == 1 ? "OK" : "NG";
m.CCD4 = listBar2Result[3] == 1 ? "OK" : "NG";
m.CCD5 = listBar2Result[4] == 1 ? "OK" : "NG";
m.CCD6 = listBar2Result[5] == 1 ? "OK" : "NG";
m.CCD7 = listBar2Result[6] == 1 ? "OK" : "NG";
m.CCD8 = listBar2Result[7] == 1 ? "OK" : "NG";
m.CCD9 = listBar2Result[8] == 1 ? "OK" : "NG";
m.CCD10 = listBar2Result[9] == 1 ? "OK" : "NG";
m.CCD11 = listBar2Result[10] == 1 ? "OK" : "NG";
m.CCD12 = listBar2Result[11] == 1 ? "OK" : "NG";
m.CCD13 = listBar2Result[12] == 1 ? "OK" : "NG";
m.CCD14 = listBar2Result[13] == 1 ? "OK" : "NG";
}
var cfgList = Global.systemConfig.CollectItemCfgList
.Where(it => it.IsEnable && it.PLCRelAddress != null)
.OrderBy(it => it.PLCRelAddress).ToList();
for (int k = 0; k < cfgList.Count; k++)
{
var item = cfgList[k];
int index = (int)item.PLCRelAddress - 1;
if (index < listBar2Result.Count)
{
var code = listBar2Result[index] == 1 ? "OK" : "NG";
m.PLCValDic.Add((int)item.PLCRelAddress, code);
}
}
#endregion
string strErr = "";
//入站条码判断
if (String.IsNullOrEmpty(m.ArrivalBarCode) || m.ArrivalBarCode.Trim() == "ERROR")
m.ArrivalBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8);
//出站条码判断
if (String.IsNullOrEmpty(m.DepartureBarCode) || m.DepartureBarCode.Trim() == "ERROR")
m.DepartureBarCode = "ERROR" + Guid.NewGuid().ToString("N").Substring(0, 8);
var listNgError = new List<short>();
listResult[i] = GetResult(m, ref strErr,ref listNgError);
m.Result = listResult[i] == 1 ? "OK" : "NG";
m.Remark = strErr;
if (Global.systemConfig.isUpMes)
{
if (listResult[i] == 1 && chkCkGrading)
{
//分档接口
//21~24 OK挡位
MesResponse resGrading = ToMesData.GetMesIn(m.DepartureBarCode, m.ArrivalBarCode);//分档查询
try
{
listResult[i] = (short)25;//默认分档NG
m.Remark = "外观检OK分档NG";
if (resGrading.success)
{
if (resGrading.rows != null && resGrading.rows.Count > 0 && resGrading.rows[0].rank != null)
{
if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading1))
{
listResult[i] = (short)(MESGradingSet[0] + 20);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}";
}
else if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading2))
{
listResult[i] = (short)(MESGradingSet[1] + 20);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}";
}
else if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading3))
{
listResult[i] = (short)(MESGradingSet[2] + 20);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}";
}
else if (resGrading.rows[0].rank.Equals(Global.systemConfig.Grading4))
{
listResult[i] = (short)(MESGradingSet[3] + 20);
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}";
}
else
{
m.Result = "NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}与设置档位不匹配NG";
}
}
else
{
m.Result = "NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OK分档NG,MES未反馈正确档位";
}
}
else
{
if (resGrading.error == 9 || resGrading.error == 99)
{
omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1);//MES网络异常
LogManagerControl.AddLog($"出站条码[{m.DepartureBarCode}]访问MES异常", LogAddtype.local, Logtype.Error);
}
m.Result = "NG";
m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES分档请求失败,分档NG";
}
}
catch (Exception ex)
{
LogManagerControl.AddLog("解析出站MES分档数据异常:" + ex.Message, LogAddtype.local, Logtype.Error);
}
}
}
if (IsStartNGFL && m.Result == "NG")
{
listResult[i] = (short)26;
m.Result = "NG";
m.Remark = $"出站条码[{m.DepartureBarCode}],出站NG不分类";
}
list.Add(m);
}
Task.Run(() =>
{
SaveDataEven2_Run(list);
if (Global.systemConfig.isUpMes)
{
UpDataMES_Run(list);
}
});
}
/// <summary>
/// 一键降级
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_YJJJ_Click(object sender, EventArgs e)
{
CurrentInfo.autuority = Autuority.操作员;
lblAuthority.Text = "操作员";
if (startup)//plc链接成功
omronPLCCom.lstMcUI[0].WriteDReg("D21", (short)1);//提示PLC进入操作员权限
LogManagerControl.AddLog($"管理员{Global.systemConfig.userName}点击一键降级,为操作员权限,请重新登录获取管理员权限。", LogAddtype.local, Logtype.Warning);
}
private void tsmiTestCode_Click(object sender, EventArgs e)
{
FrmTest form = new FrmTest();
form.ShowDialog();
}
private void mES分档设置ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (!CheckAdminOrEng())
{
MessageBox.Show("权限不足", "系统提示");
return;
}
if (!startup)
{
MessageBox.Show("请先开启联机再进行操作!", "错误提示");
return;
}
FormMesGradingSet frm = new FormMesGradingSet(omronPLCCom);
if (frm.ShowDialog() == DialogResult.OK)
{
ReadIni();
}
//LogManagerControl.AddLog($"用户[{Global.mesConfig.userName}]点击了档位设置", LogAddtype.local, FilePathType.Local, Logtype.Message);
}
}
}