Files
1440WGJ/JY.Inspection/HomeForm.cs
T
2026-07-21 19:37:29 +08:00

3784 lines
163 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//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.Enums;
using JY.Inspection.Frm;
using JY.Inspection.Mes;
using JY.MES;
using JY.MES.Entity;
using JY.MES.Enum;
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);
}
InitTaskScheduler();
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");
Global.systemConfig.LoginMesUrl = IniFileHelper.ReadIniData("MES配置", "LoginMesUrl");
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 = Global.systemConfig.userName,
Identification = m.BarCode,
ProductType = Global.systemConfig.productType
};
Task.Run(() => {
var resp = new MESDataCombin().PostProductArrivalStationData(req);
if (resp == null || !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
{
FeedingDataService feedingService = (FeedingDataService)IocConfig.Provider.GetService<IFeedingDataService>();
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# 进站条码
}
FeedingDataService service = (FeedingDataService)IocConfig.Provider.GetService<IFeedingDataService>();
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、产品结果加工参数
MesCallResult<RespProductResult> resMes = ToMesData.ProductResultParameters(m);
if (!resMes.IsSuccess)
{
if (resMes.ErrorType == MesErrorType.NetworkError || resMes.ErrorType == MesErrorType.NetworkTimeout)
{
omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1);//MES网络异常
LogManagerControl.AddLog("结果数据上传MES超时或无法访问MES服务器", LogAddtype.local, Logtype.Error);
}
else
{
string errMsg = resMes.OriResponse == null ? resMes.ErrorMessage : resMes.OriResponse.ToString();
LogManagerControl.AddLog("结果数据上传MES失败NG," + errMsg, LogAddtype.local, Logtype.Error);
}
}
#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
}
}
};
RespExitStation resp = ToMesData.PostProductExitStationData(req);
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 =
(BlankingDataService)IocConfig.Provider.GetService<IBlankingDataService>();
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);
}
}
}