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