using System; using System.Collections.Generic; using System.ComponentModel; using System.Configuration; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading; using System.Windows.Forms; using MESClassLibrary.BLL.Log; using MESClassLibrary.BLL.PunchAndWeld; using OPCAutomation; using PunchAndWeld.DataSouce; namespace PunchAndWeld { public partial class FrmLaser : Form { public FrmLaser() { InitializeComponent(); } public static string workClass = ""; OPCHelper opcHelper = new OPCHelper(); private string strHostIP = ""; private int deviceState_A = 0, deviceState_B = 0; private bool lFlag_A = false, rFlag_A = false, lFlag_B = false, rFlag_B = false; private void FrmLaser_Load(object sender, EventArgs e) { string stationNo = ConfigurationManager.AppSettings["StationNo"]; label1.Text = ProScreenFunc.GetStation(stationNo); Control.CheckForIllegalCrossThreadCalls = false; Thread t = new Thread(new ThreadStart(TimeGo)); t.Start(); textBox1.TabIndex = 0; textBox1.Select(); GetWorkClass(); ProScreenFunc.GetScanCountByClass(workClass); InitList(); PunchAdressBLL bll = new PunchAdressBLL(); try { if (opcHelper.CreateServer()) { if (opcHelper.ConnectServer(strHostIP, "Kepware.KEPServerEX.V6")) { opcHelper.Connected = true; opcHelper.opcGroups = opcHelper.opcServer.OPCGroups; opcHelper.opcGroup1 = opcHelper.opcGroups.Add("DeviceRead"); opcHelper.opcGroup2 = opcHelper.opcGroups.Add("DeviceWrite"); opcHelper.SetGroupProperty(opcHelper.opcGroup1, 500); opcHelper.SetGroupProperty(opcHelper.opcGroup2, 500); opcHelper.opcItems1 = opcHelper.opcGroup1.OPCItems; opcHelper.opcItems1.DefaultIsActive = true; DataTable dt = bll.SearchInfo(ConfigurationManager.AppSettings["DeviceNo"], 0); if (dt != null && dt.Rows.Count > 0) { opcHelper.opcItemm1 = new OPCItem[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++) { opcHelper.opcItemm1[i] = opcHelper.opcItems1.AddItem(dt.Rows[i]["Address"].ToString(), i); } } opcHelper.opcItems2 = opcHelper.opcGroup2.OPCItems; opcHelper.opcItems2.DefaultIsActive = true; DataTable dt1 = bll.SearchInfo(ConfigurationManager.AppSettings["DeviceNo"], 1); if (dt1 != null && dt1.Rows.Count > 0) { opcHelper.opcItemm2 = new OPCItem[dt1.Rows.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { opcHelper.opcItemm2[i] = opcHelper.opcItems2.AddItem(dt1.Rows[i]["Address"].ToString(), i); } } opcHelper.opcGroup1.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup1_DataChange); deviceState_A = opcHelper.ReadSingleValueFromOPC2(0); textBox2.Text = deviceState_A == 1 ? "运行中" : "准备OK"; lFlag_A = opcHelper.ReadSingleValueFromOPC3(0).ToLower() == "true" ? true : false; rFlag_A = opcHelper.ReadSingleValueFromOPC3(1).ToLower() == "true" ? true : false; deviceState_B = opcHelper.ReadSingleValueFromOPC2(1); textBox3.Text = deviceState_B == 1 ? "运行中" : "准备OK"; lFlag_B = opcHelper.ReadSingleValueFromOPC3(2).ToLower() == "true" ? true : false; rFlag_B = opcHelper.ReadSingleValueFromOPC3(3).ToLower() == "true" ? true : false; } } else { MessageBox.Show("创建OPC服务失败!", "提示", MessageBoxButtons.OK); opcHelper.Connected = false; LogHelper.WriteErrLogBase("工位:" + label1.Text + "创建OPC服务失败!", MethodBase.GetCurrentMethod().Name); return; } } catch (Exception ex) { LogHelper.WriteErrLogBase(ex.ToString(), MethodBase.GetCurrentMethod().Name); } } void opcGroup1_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps) { try { for (int i = 1; i <= NumItems; i++) { int handle = Convert.ToInt32(ClientHandles.GetValue(i).ToString().Trim()); string value = ItemValues.GetValue(i).ToString(); string address = opcHelper.opcItemm1[(Convert.ToInt32(ClientHandles.GetValue(i)))].ItemID; if (handle == 0) { deviceState_A = Convert.ToInt32(value); textBox2.Text = deviceState_A == 1 ? "运行中" : "准备OK"; } if (handle == 1) { deviceState_B = Convert.ToInt32(value); textBox3.Text = deviceState_B == 1 ? "运行中" : "准备OK"; } } } catch (Exception ex) { LogErrBLL.AddInfo(ex.ToString(),MethodBase.GetCurrentMethod()); } } private void TimeGo() { System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 10; timer.Enabled = true; timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Tick); } private void timer_Tick(object sender, EventArgs e) { label9.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); GetWorkClass(); label3.Text= ProScreenFunc.GetScanCountByClass(workClass); Thread.Sleep(500); } private void GetWorkClass() { if (DateTime.Now > DateTime.Parse(DateTime.Now.ToShortDateString() + " 07:30:00") && DateTime.Now < DateTime.Parse(DateTime.Now.ToShortDateString() + " 19:30:00")) { workClass = "白班"; } if (DateTime.Now > DateTime.Parse(DateTime.Now.ToShortDateString() + " 19:30:00") && DateTime.Now < DateTime.Parse(DateTime.Now.ToShortDateString() + " 23:59:59")) { workClass = "夜班"; } if (DateTime.Now > DateTime.Parse(DateTime.Now.ToShortDateString() + " 00:00:00") && DateTime.Now < DateTime.Parse(DateTime.Now.ToShortDateString() + " 07:30:00")) { workClass = "夜班"; } workClass = "夜班"; //} } private void textBox1_KeyDown(object sender, KeyEventArgs e) { try { if (e.KeyCode == Keys.Enter) { if (string.IsNullOrWhiteSpace(textBox1.Text)) { MessageBox.Show("条码不能为空", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } string barcode = textBox1.Text.Trim(); if (barcode.Contains(".")) { barcode = ProScreenFunc.UniteBarCodeToOne(barcode); } if (ProScreenFunc.SjBarCodeIsInStockIn(barcode) == false) { MessageBox.Show($"扫描条码[{barcode}]不存在喷涂下线记录,请更换其他油漆件重新操作!"); textBox1.Text = ""; return; } string oneBarCode = barcode; if (barcode.Length != 20) { MessageBox.Show("条码长度有误", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } if (ProScreenFunc.IsScan(oneBarCode)) { MessageBox.Show("此条码已被扫描过", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } lFlag_A = opcHelper.ReadSingleValueFromOPC3(0).ToLower() == "true" ? true : false; rFlag_A = opcHelper.ReadSingleValueFromOPC3(1).ToLower() == "true" ? true : false; lFlag_B = opcHelper.ReadSingleValueFromOPC3(2).ToLower() == "true" ? true : false; rFlag_B = opcHelper.ReadSingleValueFromOPC3(3).ToLower() == "true" ? true : false; if (barcode.Substring(0, 10) == "6000000175" || barcode.Substring(0, 10) == "6000000176") { if (deviceState_A != 2) { MessageBox.Show("214设备未准备OK,无法扫描", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } if (!rFlag_A && !lFlag_A) { if (ProScreenFunc.GetPartNameByStock(barcode.Substring(0, 10)).Contains("左")) { opcHelper.opcItemm2[0].Write(1); } else { opcHelper.opcItemm2[1].Write(1); } } else { if (ProScreenFunc.GetPartNameByStock(barcode.Substring(0, 10)).Contains("左") ) { if (lFlag_A) { MessageBox.Show("当前应扫描214右侧门槛", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } opcHelper.opcItemm2[0].Write(1); } if (ProScreenFunc.GetPartNameByStock(barcode.Substring(0, 10)).Contains("右") ) { if (rFlag_A) { MessageBox.Show("当前应扫描214左侧门槛", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } opcHelper.opcItemm2[1].Write(1); } } } else if (barcode.Substring(0, 10) == "1230007081" || barcode.Substring(0, 10) == "1230007094") { if (deviceState_B != 2) { MessageBox.Show("294设备未准备OK,无法扫描", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } if (!rFlag_B && !lFlag_B) { if (ProScreenFunc.GetPartNameByStock(barcode.Substring(0, 10)).Contains("左")) { opcHelper.opcItemm2[2].Write(1); } else { opcHelper.opcItemm2[3].Write(1); } } else { if (ProScreenFunc.GetPartNameByStock(barcode.Substring(0, 10)).Contains("左")) { if (lFlag_B) { MessageBox.Show("当前应扫描294右侧门槛", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } opcHelper.opcItemm2[2].Write(1); } if (ProScreenFunc.GetPartNameByStock(barcode.Substring(0, 10)).Contains("右")) { if (rFlag_B) { MessageBox.Show("当前应扫描294左侧门槛", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } opcHelper.opcItemm2[3].Write(1); } } } else { MessageBox.Show("条码有误!", "提示", MessageBoxButtons.OK); textBox1.SelectAll(); textBox1.Focus(); return; } ProScreenFunc.AddScanRecord(oneBarCode); textBox1.SelectAll(); textBox1.Focus(); InitList(); } } catch (Exception ex) { LogHelper.WriteErrLogBase(ex.ToString(), MethodBase.GetCurrentMethod().Name); } } private void InitList() { try { listView1.Columns.Clear(); listView1.Clear(); listView1.Columns.Add("条码", 350, HorizontalAlignment.Left); listView1.Columns.Add("扫描时间", 305, HorizontalAlignment.Left); DataTable dt = ProScreenFunc.GetScanRecord(workClass); if (dt != null && dt.Rows.Count > 0) { label3.Text = dt.Rows.Count.ToString(); for (int i = 0; i < dt.Rows.Count; i++) { ListViewItem lvi = new ListViewItem(dt.Rows[i]["BarCode"].ToString()); lvi.SubItems.Add(dt.Rows[i]["ScanTime"].ToString()); //后面添加的Item都为SubItems ,即为子项 listView1.Items.Add(lvi); } } } catch (Exception ex) { LogHelper.WriteErrLogBase(ex.ToString(), MethodBase.GetCurrentMethod().Name); } } private void label9_Click(object sender, EventArgs e) { Environment.Exit(0); } private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) { //Brush s = new SolidBrush(Color.FromArgb(39, 46, 64)); //e.Graphics.FillRectangle(s, e.Bounds);//采⽤特定颜⾊绘制标题列 //e.DrawText();//采⽤默认⽅式绘制标题⽂本 } private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { //e.DrawDefault = true;//采⽤系统默认⽅式绘制项 } private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) { //e.DrawDefault = true;//采⽤系统默认⽅式绘制项 } } }