//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 ListUser = new List(); 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); /// /// 按钮状态委托 /// /// public delegate void ShowButtonHandler(string time); /// /// 数据库访问接口 /// private IDbHelper dbHelper = new OpSqlDataBase(); /// ///上料电芯数据采集显示委托 /// /// private delegate void ChangeFunctionWatthourMeter(List m); /// ///上料电芯数据采集显示委托 /// /// private delegate void ChangeFunctionHTestA(List m); /// ///下料电芯采集显示委托 /// /// private delegate void ChangeFunctionHTestB(List m); /// /// 绑定上料电芯数据 /// BindingList listTA = new BindingList(); /// /// 绑定空托盘 /// BindingList listTB = new BindingList(); 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 xData, List 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(); /// /// 用于电芯出站时向FMS上报出站及生产数据 /// string BarCodeOutUrl = ""; /// /// 报警数据上传 /// string UpAlarmUrl = ""; /// /// 设备状态上传 /// string UpStatuesUrl = ""; /// /// MES上传验证码 /// string authorization = ""; /// /// 不良统计项目 /// List NGList = new List(); //private readonly object lockObject = new object(); /// /// 报警原始数据 /// //List listAlamByte = new List(); //报警表单数据 List listAlarmForm = null; //PLC报警状态值 //List listAlarmStatus = null; /// /// PLC报警状态信号 /// public string AlamCode = "0"; public bool IsNoOrg = false; /// /// 欧姆龙网口链接标志 /// public bool startOmronUp = false; /// /// 串口链接标志 /// public bool startComUp = false; /// /// tcpIP链接通知 /// public bool startTCPUp = false; /// /// 通讯链接标志 /// internal static bool startup = false; /// /// 测试型号 /// public string strProdType;//测试型号 /// /// 员工号 /// public string strWorker = ""; /// /// 是否开启智能电表 /// public bool IsStartZNDB = false; /// /// 是否启用分档 /// public bool chkCkGrading = false; /// /// 班次 /// private int No = 0, ClassShift = 0; /// /// NG电池不分类排出 /// 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) { }; InitDgvBColumns(); //利用反射设置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; } private void InitDgvBColumns() { List colDefList = new List(); DataGridViewTextBoxColumn Column6 = new DataGridViewTextBoxColumn(); Column6.DataPropertyName = "TD"; Column6.HeaderText = "序号"; Column6.MinimumWidth = 6; Column6.Name = "Column6"; Column6.ReadOnly = true; Column6.Width = 52; colDefList.Add(Column6); DataGridViewTextBoxColumn Column8 = new DataGridViewTextBoxColumn(); Column8.DataPropertyName = "WorkShift"; Column8.HeaderText = "班次"; Column8.MinimumWidth = 6; Column8.Name = "Column8"; Column8.ReadOnly = true; Column8.Width = 52; colDefList.Add(Column8); DataGridViewTextBoxColumn Column31 = new DataGridViewTextBoxColumn(); Column31 = new System.Windows.Forms.DataGridViewTextBoxColumn(); Column31.DataPropertyName = "TDGroup"; Column31.HeaderText = "主道"; Column31.MinimumWidth = 8; Column31.Name = "Column31"; Column31.ReadOnly = true; Column31.Width = 52; colDefList.Add(Column31); DataGridViewTextBoxColumn Column26 = new DataGridViewTextBoxColumn(); Column26.DataPropertyName = "ArrivalBarCode"; Column26.HeaderText = "入站条码"; Column26.MinimumWidth = 8; Column26.Name = "Column26"; Column26.ReadOnly = true; Column26.Width = 64; colDefList.Add(Column26); DataGridViewTextBoxColumn Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn(); Column7.DataPropertyName = "DepartureBarCode"; Column7.HeaderText = "出站条码"; Column7.MinimumWidth = 6; Column7.Name = "Column7"; Column7.ReadOnly = true; Column7.Width = 64; colDefList.Add(Column7); DataGridViewTextBoxColumn Column27 = new System.Windows.Forms.DataGridViewTextBoxColumn(); Column27.DataPropertyName = "TMDB"; Column27.HeaderText = "条码对比"; Column27.MinimumWidth = 8; Column27.Name = "Column27"; Column27.ReadOnly = true; Column27.Width = 64; colDefList.Add(Column27); DataGridViewTextBoxColumn Column25 = new DataGridViewTextBoxColumn(); Column25.DataPropertyName = "OutTime"; Column25.HeaderText = "出站时间"; Column25.MinimumWidth = 6; Column25.Name = "Column25"; Column25.ReadOnly = true; Column25.Width = 64; colDefList.Add(Column25); #region CCD结果 foreach (var propName in ConstValue.CCD_SDict.Keys) { DataGridViewColumn col = new DataGridViewTextBoxColumn(); col.DataPropertyName = propName; col.HeaderText = ConstValue.CCD_SDict[propName]; col.MinimumWidth = 6; col.Name = $"Col_ccd_{propName}"; col.ReadOnly = true; colDefList.Add(col); } foreach (var propName in ConstValue.CCD_FDict.Keys) { DataGridViewColumn col = new DataGridViewTextBoxColumn(); col.DataPropertyName = propName; col.HeaderText = ConstValue.CCD_FDict[propName]; col.MinimumWidth = 6; col.Name = $"Col_ccd_{propName}"; col.ReadOnly = true; colDefList.Add(col); } foreach (var propName in ConstValue.CCD_IDict.Keys) { DataGridViewColumn col = new DataGridViewTextBoxColumn(); col.DataPropertyName = propName; col.HeaderText = ConstValue.CCD_IDict[propName]; col.MinimumWidth = 6; col.Name = $"Col_ccd_{propName}"; col.ReadOnly = true; colDefList.Add(col); } #endregion DataGridViewTextBoxColumn Column22 = new System.Windows.Forms.DataGridViewTextBoxColumn(); Column22.DataPropertyName = "Result"; Column22.HeaderText = "综合结果"; Column22.MinimumWidth = 6; Column22.Name = "Column22"; Column22.ReadOnly = true; Column22.Width = 64; colDefList.Add(Column22); DataGridViewTextBoxColumn Column24 = new System.Windows.Forms.DataGridViewTextBoxColumn(); Column24.DataPropertyName = "Remark"; Column24.HeaderText = "备注"; Column24.MinimumWidth = 6; Column24.Name = "Column24"; Column24.ReadOnly = true; Column24.Width = 52; colDefList.Add(Column24); this.dgvDataShow_B.Columns.AddRange(colDefList.ToArray()); } /// /// 单例 /// 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); //} /// /// 表格统计目录 /// //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 = "绝缘片污染不良" }); //} /// /// 获取图表数据 /// /// /// /// //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 xData = NGList.Select(c => c.DataType).ToList(); // List 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 xData, List 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(); string strFileName = Environment.CurrentDirectory + "\\欧姆龙报警寄存器对应表.csv"; listAlarmForm = CSVHelper.ReadCSV(strFileName,","); 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(); } } /// /// 读取INI配置文件 /// 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"); Global.systemConfig.EquipAlarmUrl = IniFileHelper.ReadIniData("MES配置", "EquipAlarmUrl"); Global.systemConfig.EquipStatusUrl = IniFileHelper.ReadIniData("MES配置", "EquipStatusUrl"); Global.systemConfig.TaskInterval = Convert.ToInt32(IniFileHelper.ReadIniData("MES配置", "TaskInterval")); try { Global.systemConfig.CollectItemCfgList = ExcelImporter.Import(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 result = new OperateResult(); 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; } /// /// 链接串口状态 /// /// 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 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 result = new OperateResult(); 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 resylt = GetListInt(13); List resylt_float = new List(); OperateResult result = new OperateResult(); 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); } } /// /// 清除智能电表显示数据 /// 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 /// /// 登录窗口 /// /// /// 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(); } } /// /// 历史数据查询 /// /// /// private void tsmiHistory_Click(object sender, EventArgs e) { if (CurrentInfo.autuority == Autuority.Empty) { MessageBox.Show("请先登录!", "系统提示"); return; } FrmHistoricalDataQuery frm = new FrmHistoricalDataQuery(); frm.ShowDialog(); } /// /// 报警信息查询 /// /// /// private void tsmiAlarmSearch_Click(object sender, EventArgs e) { if (CurrentInfo.autuority == Autuority.Empty) { MessageBox.Show("请先登录!", "系统提示"); return; } FrmAlamQuery frm = new FrmAlamQuery(); frm.ShowDialog(); } /// /// 打开统计页面 /// /// /// private void tsmiChart_Click(object sender, EventArgs e) { if (CurrentInfo.autuority == Autuority.Empty) { MessageBox.Show("请先登录!", "系统提示"); return; } FrmStatistics.Instance.ShowDialog(); } /// /// 打开换形页面 /// /// /// 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(); } /// /// 打开系统信息页面 /// /// /// private void tsmiAbout_Click(object sender, EventArgs e) { FrmHelper frm = new FrmHelper(); frm.ShowDialog(); } /// /// 打开PLC配置页面 /// /// /// 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(); } /// /// 打开数据库配置页面 /// /// /// private void tsmiDBConfig_Click(object sender, EventArgs e) { if (!CheckAdminOrEng()) { MessageBox.Show("权限不足", "系统提示"); return; } FrmDBbaseSet frm = new FrmDBbaseSet(); frm.ShowDialog(); } /// /// 打开MES参数配置页面 /// /// /// private void tsmiMESConfig_Click(object sender, EventArgs e) { if (!CheckAdminOrEng()) { MessageBox.Show("权限不足", "系统提示"); return; } FormMesDataSet frm = new FormMesDataSet(); if (frm.ShowDialog() == DialogResult.OK) { ReadIni(); } } /// /// 打开参数编辑页面 /// /// /// 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; //} } /// /// 打开用户配置页面 /// /// /// private void tsmiUserConfig_Click(object sender, EventArgs e) { //if (!CheckAdmin()) //{ // MessageBox.Show("权限不足", "系统提示"); // return; //} SetForm setForm = new SetForm(); setForm.ShowDialog(); } /// /// TCP通讯设置 /// /// /// 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(); } /// /// 统计清零 /// /// /// private void btSave_Click(object sender, EventArgs e) { if (CurrentInfo.autuority == Autuority.Empty) { MessageBox.Show("请先登录再进行操作!", "错误提示"); return; } IniFileHelper.WriteIniData("统计计数", "ProdAllQty", "0"); } /// /// 刷新页面时间 /// /// /// 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(); } /// /// 判断班次 /// 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 = "夜班"; } } } /// /// 登录时效检查 /// 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); } } /// /// 告诉PLC MES信息 /// 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); } } } /// /// CCD数据统计 /// /// /// private void tsmiCCDData_Click(object sender, EventArgs e) { if (!CheckAdmin()) { MessageBox.Show("权限不足", "系统提示"); return; } FrmCCDQuery frm = new FrmCCDQuery(); frm.ShowDialog(); } #endregion #region PLC读写 /// /// 初始化通讯接口委托事件 /// 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 } /// /// 消息悬浮提示 /// /// /// /// 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; } } } /// ///开始 /// /// /// 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; } } } /// /// 启动PLC连接 /// 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); } } /// /// 给PLC写入权限 /// 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进入管理员权限 } } /// /// 计算CheckSum /// /// /// 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 /// /// 设备心跳消息委托更新状态 /// /// 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; }); } } } /// /// 1#通讯块读取PLC信号 /// /// /// /// private void OmronRegEvent_Job1(int Index, string msg, OperateResult 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 上料数据 /// /// 1#通道读取异常条码数据 /// /// /// private void processA1(CancellationTokenSource mt, OperateResult resByte) { if (!mt.IsCancellationRequested) { if (resByte.IsSuccess && resByte != null) { try { sw.Restart(); List list = new List(); List listBar = StrUtil.GetListString(2, "NG"); List listResult = CollectionUtil.GetListUShort(2); //高低位取反 byte[] bytes = resByte.Content.ByteReverse(); //前面有\03\00 标识 占2个字节 int offset = 0; listBar[0] = omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.TransString(bytes, 0+ offset, 20*2, System.Text.Encoding.ASCII).Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim();//1# 条码 listBar[1] = omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.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) { // 进站数据上传 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); } } } } /// /// 上料电芯数据保存 /// /// 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(); List list = (List)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 data = new List(); data.Add(m); CSVHelper.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 下料数据 /// /// 下料数据 /// /// /// private void processA2(CancellationTokenSource mt, OperateResult resByte) { if (!mt.IsCancellationRequested) { if (resByte.IsSuccess && resByte != null) { try { sw.Restart(); var list = ProcessOutgoingBlankingData(resByte); //复位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); } } } } #region 出站数据处理 - 辅助方法 /// /// 处理出站(下料)数据的主入口 /// private List ProcessOutgoingBlankingData(OperateResult resByte) { var list = new List(); // 1. 初始化数据容器 var containers = InitializeOutgoingContainers(); var isCCDMask = omronPLCCom.lstMcUI[0].ReadshortDReg("W260"); // 2. 解析PLC字节数据到容器 ParsePlcOutgoingData(resByte.Content, containers); // 3. 获取FeedingData服务 var service = (FeedingDataService)IocConfig.Provider.GetService(); // 4. 逐个处理每个通道的出站数据 for (int i = 0; i < containers.ListBarOut.Count; i++) { var item = ProcessSingleOutgoingItem(i, containers, isCCDMask, service); list.Add(item.Data); // 5. 结果写回PLC omronPLCCom.lstMcUI[0].WriteDReg("W302" + i, item.ResultCode); } return list; } /// /// 出站数据容器 - 封装解析过程中使用的集合 /// private class OutgoingContainers { public List ListBarIn { get; set; } public List ListBarOut { get; set; } public List> ListCCDSResult { get; set; } public List> ListCCDFResult { get; set; } public List> ListCCDIResult { get; set; } public List ListResult { get; set; } } /// /// 初始化出站数据容器 /// private OutgoingContainers InitializeOutgoingContainers() { return new OutgoingContainers { ListBarIn = StrUtil.GetListString(2, "NG"), ListBarOut = StrUtil.GetListString(2, "NG"), ListCCDSResult = new List> { CollectionUtil.GetListUShort(ConstValue.CCD_SDict.Count), CollectionUtil.GetListUShort(ConstValue.CCD_SDict.Count), //CollectionUtil.GetListUShort(ConstValue.CCD_SDict.Count) }, ListCCDFResult = new List> { CollectionUtil.GetListFloat(ConstValue.CCD_FDict.Count), CollectionUtil.GetListFloat(ConstValue.CCD_FDict.Count), //CollectionUtil.GetListFloat(ConstValue.CCD_FDict.Count) }, ListCCDIResult = new List> { CollectionUtil.GetListInt(ConstValue.CCD_IDict.Count), CollectionUtil.GetListInt(ConstValue.CCD_IDict.Count), //CollectionUtil.GetListInt(ConstValue.CCD_IDict.Count) }, ListResult = CollectionUtil.GetListUShort(2) }; } /// /// 从PLC原始字节中解析出站条码、CCD结果等数据 /// private void ParsePlcOutgoingData(byte[] content, OutgoingContainers containers) { var bytes = content.ByteReverse(); JY.Utility.LogHelper.LogPLCData("电池出站数据", bytes); byte[] sByteArr = omronPLCCom.lstMcUI[0].Readbyte("W3400", 200)?.ByteReverse(); byte[] fByteArr = omronPLCCom.lstMcUI[0].Readbyte("W3500", 400)?.ByteReverse(); byte[] iByteArr = omronPLCCom.lstMcUI[0].Readbyte("W3600", 200)?.ByteReverse(); for (int i = 0; i < 2; i++) { // 出站条码: 偏移0, 每通道40字节(20字符) containers.ListBarOut[i] = omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.TransString( bytes, 0 + (i * 40 * 2), 20 * 2, System.Text.Encoding.ASCII) .Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); var lstBarResult = containers.ListCCDSResult[i]; // OK/NG结果: 3400-3415, 每通道偏移100字节/3450-3465 for (int j = 0; j < ConstValue.CCD_SDict.Count; j++) { int index = (i * 50 * 2) + j * 2; lstBarResult[j] = (short)omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.TransInt16(sByteArr, index); } // 浮点型结果: 3500起/3550 for (int k = 0; k < ConstValue.CCD_FDict.Count; k++) { int index = (i * 50 * 2) + k * 2 * 2; containers.ListCCDFResult[i][k] = omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.TransSingle(fByteArr, index); } // 整型结果: 3600起/3650 for (int k = 0; k < ConstValue.CCD_IDict.Count; k++) { int index = (i * 50 * 2) + k * 2; containers.ListCCDIResult[i][k] = omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.TransInt16(iByteArr, index); } // 进站条码: 偏移280(140*2), 每通道40字节 containers.ListBarIn[i] = omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.TransString( bytes, 140 * 2 + (i * 20 * 2), 20 * 2, System.Text.Encoding.ASCII) .Replace('\0', ' ').Replace('\r', ' ').Replace(" ", "").Trim(); } } /// /// 单个出站数据处理结果 /// private class OutgoingItemResult { public BlankingData Data { get; set; } public short ResultCode { get; set; } } /// /// 处理单个通道的出站数据:构建实体 → 判断结果 → 分档 → 返回 /// private OutgoingItemResult ProcessSingleOutgoingItem(int index, OutgoingContainers containers, short isCCDMask, FeedingDataService service) { // 1. 构建实体 var m = BuildBlankingEntity(index, containers, service); // 2. 映射CCD结果到实体属性 MapCcdResultsToEntity(m, containers, index); // 3. 判断扫码和CCD结果 string strErr = ""; var lstError = new List(); containers.ListResult[index] = GetResult(m, ref strErr, ref lstError); m.Result = containers.ListResult[index] == 1 ? ConstValue.CCD_OK : ConstValue.CCD_NG; m.Remark = strErr; // 4. 判断扫码NG与CCD NG var ccdOkNg = "OK"; if (containers.ListResult[index] == 2 || containers.ListResult[index] == 3) { m.Result = "扫码NG"; } else if (containers.ListResult[index] == 4) { ccdOkNg = "NG"; m.Result = "CCD结果NG"; } // 5. OK路径: MES分档(仅当扫码OK或CCD NG时触发) bool isOkGrading = false; string levelresult = null; short result = containers.ListResult[index]; if (containers.ListResult[index] == 1 || ccdOkNg == "NG") { HandleOkPathGrading(m, ref result, ref isOkGrading, ref levelresult, isCCDMask, ccdOkNg); containers.ListResult[index] = result; } // 6. NG路径: 拉带分档 if (m.Result.IndexOf("NG") >= 0 && !isOkGrading) { HandleNgPathGrading(m, ref result, lstError, levelresult); containers.ListResult[index] = result; } return new OutgoingItemResult { Data = m, ResultCode = containers.ListResult[index] }; } /// /// 构建BlankingData实体,填充基础字段和TDGroup /// private BlankingData BuildBlankingEntity(int index, OutgoingContainers containers, FeedingDataService service) { No = No + 1; var m = new BlankingData { TD = No, WorkShift = ClassShift == 0 ? "白班" : "夜班", ArrivalBarCode = containers.ListBarIn[index], DepartureBarCode = containers.ListBarOut[index], OutTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; // 通过进站条码查询TDGroup var listEntity = service.GetFeedingData(m.ArrivalBarCode); if (listEntity.Count() > 0) { m.TDGroup = listEntity.First().TDGroup; m.InTime = listEntity.First().CreateTime; m.IsRepeat = listEntity.Count > 1; } // 处理空条码 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); return m; } // 缓存属性信息 private static readonly Dictionary BlankingDataProps = typeof(BlankingData) .GetProperties() .ToDictionary(p => p.Name); /// /// 将CCD原始结果映射到实体的CCD1-CCD16属性(0=OK, 1=NG) /// private void MapCcdResultsToEntity(BlankingData m, OutgoingContainers containers, int orderIndex) { int index = 0; foreach (var propName in ConstValue.CCD_SDict.Keys) { if (BlankingDataProps.TryGetValue(propName, out var prop)) { prop.SetValue(m, containers.ListCCDSResult[orderIndex][index] == 1 ? "NG" : "OK"); index++; } } index = 0; foreach (var propName in ConstValue.CCD_FDict.Keys) { if (BlankingDataProps.TryGetValue(propName, out var prop)) { prop.SetValue(m, containers.ListCCDFResult[orderIndex][index]); } } foreach (var propName in ConstValue.CCD_IDict.Keys) { if (BlankingDataProps.TryGetValue(propName, out var prop)) { prop.SetValue(m, containers.ListCCDIResult[orderIndex][index]); } } } /// /// OK路径处理:扫码OK或CCD NG时,请求MES分档并判断档位 /// private void HandleOkPathGrading(BlankingData m, ref short listResult, ref bool isOkGrading, ref string levelresult, short isCCDMask, string ccdOkNg) { if (!Global.systemConfig.isUpMes || !chkCkGrading) { listResult = 80; return; } var resGrading = ToMesData.GetMesIn(m.DepartureBarCode, m.ArrivalBarCode); try { if (!resGrading.success) { if (resGrading.error == 9 || resGrading.error == 99) { omronPLCCom.lstMcUI[0].WriteDReg("W249", (short)1); LogManagerControl.AddLog($"出站条码[{m.DepartureBarCode}]访问MES异常", LogAddtype.local, Logtype.Error); } m.Result = "分档NG"; m.Remark = $"出站条码[{m.DepartureBarCode}]外观检MES分档请求失败,访问MES异常"; return; } if (resGrading.rows == null || resGrading.rows.Count == 0 || resGrading.rows[0].rank == null) { m.Result = "分档NG"; m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OK分档NG,MES未反馈正确档位"; return; } var rank = resGrading.rows[0].rank; // CCD屏蔽逻辑:检查配置的拉带CCD结果是否符合要求 ccdOkNg = ValidateCcdGradingMask(isCCDMask, ccdOkNg); rank += ccdOkNg; // 匹配MES反馈档位与系统配置 MatchMesRankToGradingSet(m, rank, resGrading, ccdOkNg, isCCDMask, ref listResult, ref isOkGrading); levelresult = resGrading.rows[0].level; } catch (Exception ex) { m.Result = "分档NG"; m.Remark = $"出站条码[{m.DepartureBarCode}]解析出站MES分档数据异常,分档NG"; LogManagerControl.AddLog("解析出站MES分档数据异常:" + ex.Message, LogAddtype.local, Logtype.Error); } } /// /// 验证CCD屏蔽状态,返回修正后的CCD结果字符串,必要时触发PLC报警 /// private string ValidateCcdGradingMask(short isCCDMask, string currentCcdOkNg) { var listGradingCCD = new List { Global.systemConfig.Grading1, Global.systemConfig.Grading2, Global.systemConfig.Grading3, Global.systemConfig.Grading4 }; if (isCCDMask == 9) { // CCD屏蔽开启,使用"不分类" currentCcdOkNg = "不分类"; var noClassCount = listGradingCCD.Count(x => x.Contains("不分类")); if (noClassCount <= 0) { omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2); } } else { // 校验至少有一个OK结果 var okCount = listGradingCCD.Count(x => x.Contains("OK")); if (okCount <= 0) { omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2); } // 校验NG结果是否都有对应的OK var ngList = listGradingCCD.Where(x => x.Contains("NG")).Distinct().ToList(); foreach (var ngItem in ngList) { var gradingBase = ngItem.Substring(0, ngItem.Length - 2); var okIndex = listGradingCCD.IndexOf(gradingBase + "OK"); if (okIndex < 0) { omronPLCCom.lstMcUI[0].WriteDReg("W261", (short)2); } } } return currentCcdOkNg; } /// /// 将MES反馈档位与系统配置的Grading1-4进行匹配 /// private void MatchMesRankToGradingSet(BlankingData m, string rank, MesResponse resGrading, string ccdOkNg, short isCCDMask, ref short listResult, ref bool isOkGrading) { if (rank.Equals(Global.systemConfig.Grading1)) { listResult = MESGradingSet[0]; m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; isOkGrading = true; } else if (rank.Equals(Global.systemConfig.Grading2)) { listResult = MESGradingSet[1]; m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; isOkGrading = true; } else if (rank.Equals(Global.systemConfig.Grading3)) { listResult = MESGradingSet[2]; m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; isOkGrading = true; } else if (rank.Equals(Global.systemConfig.Grading4)) { listResult = MESGradingSet[3]; m.Remark = $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD结果{ccdOkNg}"; isOkGrading = true; } else { m.Result = "分档NG"; m.Remark = isCCDMask == 9 ? $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}-CCD屏蔽状态" : $"出站条码[{m.DepartureBarCode}]外观检OKMES反馈档位:{resGrading.rows[0].rank}与设置档位不匹配NG"; } } /// /// NG路径处理:根据NG类型选择对应的拉带档位 /// private void HandleNgPathGrading(BlankingData m, ref short listResult, List lstError, string levelresult) { if (IsStartNGFL) { listResult = 99; m.Result = "NG不分类"; m.Remark = $"出站条码[{m.DepartureBarCode}],出站NG不分类"; return; } // 优先匹配扫码NG对应的拉带档位 var ngOkChannelNo = 0; var indexFD = strNgBound.ToList().FindIndex(x => x == m.Result); var smAndFdNg = false; if (indexFD >= 0) { listResult = (short)indexFD; var smNgGradingSet = NgGradingSet.ToList().FindIndex(x => x == (indexFD + 10)); if (smNgGradingSet >= 0) { listResult = NgGradingSet[smNgGradingSet]; smAndFdNg = true; ngOkChannelNo = smNgGradingSet; m.Remark = $"出站条码[{m.DepartureBarCode},{m.Result},通道[{ngOkChannelNo + 5}]出站NG拉带值{listResult},MES获取等级{levelresult}"; } } // 回退方案:按NG错误类型选择档位 if (!smAndFdNg) { var ngGradingIndices = new[] { lstError.FindIndex(x => x == NgGradingSet[0]), lstError.FindIndex(x => x == NgGradingSet[1]), lstError.FindIndex(x => x == NgGradingSet[2]) }; if (ngGradingIndices[0] >= 0) { listResult = NgGradingSet[0]; ngOkChannelNo = 0; } else if (ngGradingIndices[1] >= 0) { listResult = NgGradingSet[1]; ngOkChannelNo = 1; } else if (ngGradingIndices[2] >= 0) { listResult = 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 = NgGradingSet[smNgGradingSet]; ngOkChannelNo = smNgGradingSet; } else { listResult = 88; } } m.Remark = $"出站条码[{m.DepartureBarCode}],NG,通道[{ngOkChannelNo + 5}]出站NG拉带值{listResult},MES获取等级{levelresult}"; } } #endregion /// /// 结果加工参数上传 /// /// private void UpDataMES_Run(object obj) { try { List list = (List)obj; if (list != null) { foreach (BlankingData m in list) { if (m != null) { #region 3、产品结果加工参数 MesCallResult 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() { new AssembleLine() { Identification = m.ArrivalBarCode, QualityStatus = m.Result == ConstValue.CCD_OK ? ConstValue.CCD_OK : ConstValue.CCD_NG, // 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); } } /// 电池异常数据保存 /// /// 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(); List list = (List)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 data = new List(); data.Add(m); CSVHelper.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); } } } /// /// 结果判断 /// /// /// /// private short GetResult(BlankingData m, ref string strErr,ref List 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"; // CCD判断 bool isAllCCD = true; StringBuilder sb = new StringBuilder(); foreach (var propName in ConstValue.CCD_SDict.Keys) { if (BlankingDataProps.TryGetValue(propName, out var prop)) { string result = prop.GetValue(m).ToString(); if (result != "OK") { isAllCCD = false; sb.Append($",{ConstValue.CCD_SDict[propName]}不良"); } } } #endregion #region if (IsBarOK && bBar && isAllCCD) { 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 (!isAllCCD) { strErr = sb.ToString(); res = 4; lstError.Add(res); } return 0; #endregion } /// /// 获取进站条码 /// /// /// /// 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; } /// /// 判断字符串是否有特殊符号 /// /// /// public bool IsSpecialChar(string str) { Regex regExp = new Regex("[ \\[ \\] \\^ \\-_*×――(^)$%~!@@##$…&%¥—+=<>《》!!???::•`·、。,;,.;/\'\"{}()‘’“”-]"); if (regExp.IsMatch(str)) { return true; } return false; } /// /// /// /// /// public List GetListInt(int Num) { List list = new List(); for (int i = 0; i < Num; i++) { list.Add(1); } return list; } /// /// 生成byte List集合 /// /// /// public List GetListByte(int Num) { List list = new List(); for (int i = 0; i < Num; i++) { list.Add(0); } return list; } /// /// 判断分档是否都扫到条码 /// /// /// public bool IsListRes(List list) { HashSet hs = new HashSet(list); if (hs.Count == 1) { return true; } return false; } #region 设备状态报告 /// /// 间隔 /// /// /// string strStatues = ""; private void processModeStatus(CancellationTokenSource mt) { strStatues = ""; while (true) { SendStatus(); Thread.Sleep(1000); } } /// /// TODO 设备状态上传 上传时机 /// /// 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) { ReqEquipStatus req = new ReqEquipStatus() { SiteCode = Global.systemConfig.siteCode, LineCode = Global.systemConfig.lineCode, EquipNum = Global.systemConfig.equipCode, MaterialCode = Global.systemConfig.materialCode, UserName = Global.systemConfig.userName, SeatId = string.Empty, RecordDate = Status.recordDate, StatusCode = Status.statusCode, UploadTime = Status.uploadTime, Guid = Status.guid, FaultCodeList = new List() { new FaultCodeInfo() { FaultCode = string.Empty } } }; //string strJosn = JsonConvert.SerializeObject(req); // 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); MesCallResult result = new MESDataCombin().UpEquipStatus(req); swTime.Stop(); LogManagerControl.AddLog($"处理设备状态上报FMS耗时:{swTime.ElapsedMilliseconds}ms", LogAddtype.local, Logtype.Message); if (result != null) { string strRes = "code" + "[" + result?.OriResponse.Code + "]" + "success" + "[" + result?.OriResponse.Success + "]" + "message" + "[" + result?.OriResponse.Message + "]" + "category" + "[" + result?.OriResponse.Category + "]"; LogManagerControl.AddLog($"FMS->PC[MES_Status]:{strRes}", LogAddtype.MES); } else { LogManagerControl.AddLog($"设备状态上报MES出错", LogAddtype.local, Logtype.Message); } } #endregion // } } Task.Delay(1000); } } #endregion #region 报警信息读取 /// /// 报警信息读取 /// /// /// private void AlarmProcess(CancellationTokenSource mt, OperateResult 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]; // } // } //} byte[] res = null; List listAlamByte = new List(); foreach (var address in ConstValue.AlarmAddressDic.Keys) { ushort byteLen = (ushort)(ConstValue.AlarmAddressDic[address] * 10); res = omronPLCCom.lstMcUI[0].ReadByteFins($"D{address}", byteLen); if (res == null) { continue; } listAlamByte.AddRange(res); } //AddLog(0, "读取报警耗时:" + sw.ElapsedMilliseconds + "ms"); if (listAlamByte == null || listAlamByte.Count == 0) { return; } //string strFileName = Environment.CurrentDirectory + "\\欧姆龙报警寄存器对应表.csv"; //listAlarmForm = CSVHelper.ReadCSV(strFileName); //如果未配置报警地址信息返回 TODO if (listAlarmForm == null) { return; } //TODO 切换三菱和欧姆龙 List listAlarmStatus = PLCAlarmParse.OmronEIPByte2Status(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(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); ReqAlarm req = new ReqAlarm() { SiteCode = Global.systemConfig.siteCode, LineCode = Global.systemConfig.lineCode, EquipNum = Global.systemConfig.equipCode, MaterialCode = string.Empty, UserName = Global.systemConfig.userName, RecordDate = Alarm.recordDate, SeatId = Alarm.seatId, Guid = Alarm.guid, AlarmLineList = new List() { new AlarmLine() { AlarmEndTime = Alarm.alarmEndTime, AlarmType = Alarm.alarmType, AlarmName = Alarm.alarmName, AlarmStartTime = Alarm.alarmStartTime, FaultCode = Alarm.faultCode, } } }; Stopwatch swTime1 = new Stopwatch(); swTime1.Start(); //var AlarmResult = JY.MES.FMS.MesHelper_EVE.MES_Alarm(Alarm); MesCallResult AlarmResult = new MESDataCombin().UpAlarmData(req); swTime1.Stop(); LogManagerControl.AddLog($"处理报警上报FMS耗时:{swTime1.ElapsedMilliseconds}ms", LogAddtype.local, Logtype.Message); if (result != null) { string strRes = "code" + "[" + AlarmResult?.OriResponse?.Code + "]" + "success" + "[" + AlarmResult?.OriResponse?.Success + "]" + "message" + "[" + AlarmResult?.OriResponse?.Message + "]" + "category" + "[" + AlarmResult?.OriResponse?.Category + "]"; LogManagerControl.AddLog($"FMS->PC[MES_Alarm]:{strRes}", LogAddtype.MES); } else { LogManagerControl.AddLog($"报警上报Mes出错", LogAddtype.local, Logtype.Message); } } // } } } } catch (Exception ex) { LogManagerControl.AddLog("报警信息异常:" + ex.Message, LogAddtype.local, Logtype.Error); } //dbHelper.AddAlarmCacheData("tb_alarm", (List)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); } } } /// /// 保存和显示设备报警信息 /// /// public void SaveAlamDataEven_Run(List 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 /// /// 读取稼动率和PPM /// /// 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 异常播报处理 /// /// 读取异常播报信息 /// /// /// private void processA3(CancellationTokenSource mt, OperateResult resByte) { if (!mt.IsCancellationRequested) { if (resByte.IsSuccess && resByte != null) { try { sw.Restart(); string code = Convert.ToString(omronPLCCom.lstMcUI[0].omronCipNet.ByteTransform.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 通用方法 /// /// 获取鼠标光标的当前位置 /// /// /// [DllImport("user32.dll")] public static extern bool GetCursorPos(out Point pt); /// /// 用户登录超时检查 /// /// 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); } /// /// 检测是否是管理员账号 /// /// private bool CheckAdmin() { if (CurrentInfo.autuority == Autuority.管理员) { return true; } return false; } /// /// 检测是否是管理员或者是工程师账号 /// /// private bool CheckAdminOrEng() { if (CurrentInfo.autuority == Autuority.管理员 | CurrentInfo.autuority == Autuority.工程师) { return true; } return false; } /// /// 判断长度 /// /// /// 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; /// /// 更新工具栏按钮状态 /// /// 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); // } // } //} } /// /// 日期时间显示 /// /// private void UpdateDateTime(string _time) { timelabel.BeginInvoke((Action)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() { "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() { "123" }; //string p = JsonConvert.SerializeObject(gradingParam); List list = new List(); List listBarIn = StrUtil.GetListString(2, "04QCB6CJ68701JF6K0008815");//进站条码 List listBarOut = StrUtil.GetListString(2, "04QCB6CJ68701JF6K0008815");//出站条码 List listBar1Result = CollectionUtil.GetListUShort(14); List listBar2Result = CollectionUtil.GetListUShort(14); List 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(); 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); } }); } /// /// 一键降级 /// /// /// 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); } } }