using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Threading; using System.Net; using System.Net.Sockets; using HalconDotNet; using EventTool; using SperateData; using System.Diagnostics; using System.Xml.Serialization; using System.Runtime.Serialization; using System.Threading.Tasks; using System.Configuration; using System.Globalization; namespace M423project { public partial class MainForm : Form { private DetectionData detectionData; private DetectionDataUpload detectionDataUpload; private List productTestCollection;//产品检测队列 private HeightDetection heightDetection; //高度检测对象,异步执行 private SizeDetection sizeDetection; //尺寸检测对像,异步执行 private UpLoadDetection uploadDetection; //上料检测对像,由线程执行 private UnLoadDetection unloadDetection; private ImageProcess imageProcess; //图象操作对象 private OPC opc; private ConfigStruct opcConfig = new ConfigStruct(); private DetectCompensation detectCompensation = new DetectCompensation(""); private DateTime unloadTime = DateTime.MaxValue; private int plateID = 0; //盘内编号 public int PlateID { get { return plateID; } } public BindingList ProductBindingList; public DetectionData DetectData { get { return detectionData; } } public delegate void DetectionProcesser(); //检查执行代理 public TextBox InfoInspect { get { return tbSystemInfo; } } public ToolKit.FileToolkit.SerializeFileTool sftConfig = new ToolKit.FileToolkit.SerializeFileTool(); public MeasureResultTTL measureResultTTL; public string sendStr = string.Empty; private object _turndisktimelock = new object(); private DateTime _turnDiskReadyTime = DateTime.Now; public DateTime TurnDiskReadyTime { get { lock (_turndisktimelock) { return _turnDiskReadyTime; } } set { lock (_turndisktimelock) { _turnDiskReadyTime = value; } } } private string _solution; private DateTime? _plateChangeTime; private int _downTimeNoAction; private List _tempDownTimeList = new List(); public MainForm() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; //cBarcodeCtrl.Dock = DockStyle.Right; //gbHandTest.Controls.Add(cBarcodeCtrl); //this.KeyPreview = true; //this.KeyPress += MainForm_KeyPress; CommonUtil.mainForm = this; MessageHandler.MessageHandlerInstance.Open(); detectionData = new DetectionData(); detectionData.CleanData(); productTestCollection = new List(); ProductBindingList = new BindingList(productTestCollection); dgvNG.DataSource = ProductBindingList; detectionDataUpload = new DetectionDataUpload(detectionData, opcConfig); measureResultTTL = RestoreMeasureTTL(); } private void MainForm_Load(object sender, EventArgs e) { rm.ReduceMemory(); SetControls(); DisplayMeasureTTL(); CreateDetectiongReport(); Start(); #region add by Patrick 2018-07-13 SetCarrierBarcodeCtrl(); #endregion _downTimeNoAction = Convert.ToInt32(ConfigurationManager.AppSettings["DownTimeNoAction"]); Task.Factory.StartNew(() => { //检测是否已做标准块测试 if (CommonUtil.DetectionOption == DetectionOption.doProduct) { if (!detectionData.IsStandardCheck()) { lbDisplayState.BackColor = Color.Red; lbDisplayState.Text = "未做标准块检测"; opc.Write(OPCOutputTag.StandardCheck, false); } else { lbDisplayState.BackColor = Color.Green; lbDisplayState.Text = ""; opc.Write(OPCOutputTag.StandardCheck, true); } } //刷新抽检参数 SetCheckInfo(); //更新宕机时间 DownTimeData downTimeData = new DownTimeData(); downTimeData.UpdateDownTime(new DownTime { EndTime = DateTime.Now, Type = DownTimeType.Closed }); //清理宕机统计 downTimeData.CleanData(); //清理报警信息 WarningData warningData = new WarningData(); warningData.CleanData(); }); } #region add by Patrick 2018-07-13 private void SetCarrierBarcodeCtrl() { cBarcodeCtrl = new CarrierBarcodeCtrl(opc); cBarcodeCtrl.Dock = DockStyle.Right; gbHandTest.Controls.Add(cBarcodeCtrl); this.KeyPreview = true; this.KeyPress += MainForm_KeyPress; hcXyView.Focus(); } bool allowBarcodeFlag = true; CarrierBarcodeCtrl cBarcodeCtrl = null; private void MainForm_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 27) { hcXyView.Focus(); } else { if (allowBarcodeFlag) { cBarcodeCtrl.AddChar(e.KeyChar); } } } #endregion #region 清理内存 ReduceMemory.ReduceMemory rm = new ReduceMemory.ReduceMemory(); #endregion public void Start() { CommonUtil.WriteLog(LogType.Inf, "启动检测..."); string configFile = CommonUtil.ConfigDir + "\\M423Config.xml"; if (!File.Exists(configFile)) sftConfig.SetConfig(configFile, opcConfig); opcConfig = sftConfig.GetConfig(configFile); opc = new OPC(opcConfig.opcConfig); if (!opc.Connect()) return; if (!opc.CreateGroup()) return; UpdateOpc(); opc.listenEventCreater.ListenEvent += OPCEventHandler; InitParams(); imageProcess = new ImageProcess(); if (!imageProcess.OpenCameras()) return; heightDetection = new HeightDetection(opc, imageProcess, opcConfig, 2, DetectionType.Normal, hcZView.HalconWindow, hcBarcode.HalconWindow); sizeDetection = new SizeDetection(opc, imageProcess, opcConfig, 4, DetectionType.Normal, hcXyView.HalconWindow); //上料机械手臂监听取消 //uploadDetection = new UpLoadDetection(opcConfig, imageProcess); //if (!uploadDetection.OpenListener()) // return; //uploadDetection.Start(); //下料机械手臂监听取消 //unloadDetection = new UnLoadDetection(opc, opcConfig, productTestCollection); //if (!unloadDetection.OpenListener()) // return; //unloadDetection.Start(); DisplayMeasureTTL(); detectionDataUpload.Start(); CommonUtil.IsRunning = true; SetControls(); opc.Write(OPCOutputTag.DetectResult_OK, false); opc.Write(OPCOutputTag.DetectResult_NG, false); CommonUtil.WriteLog(LogType.Inf, "初始化下料NA"); //250表示启动时需要大复位报警 opc.Write(OPCOutputTag.Alarm, 250); CommonUtil.WriteLog(LogType.Inf, "软件启动大复位"); string continuousNGStr = ConfigurationManager.AppSettings["ContinuousNGThreshold"]; if (int.TryParse(continuousNGStr, out int temp)) { _continuousNGThreshold = temp; } else { _continuousNGThreshold = 999; } } public void Stop() { if (CommonUtil.IsRunning) { detectionDataUpload.Stop(); ProductBindingList.Clear(); //measureResultTTL.Clear(); //DisplayMeasureTTL(); opc.Close(); //uploadDetection.CloseListener(); //uploadDetection.Stop(); //uploadDetection = null; //unloadDetection.CloseListener(); //unloadDetection.Stop(); //unloadDetection = null; sizeDetection = null; heightDetection = null; imageProcess.CloseCameras(); imageProcess = null; productTestCollection = null; CommonUtil.IsRunning = false; SetControls(); GC.Collect(); } } public void SetControls() { switch (CommonUtil.IsRunning) { case false: //btnDetectionStart.Enabled = true; //btnDetectionStop.Enabled = false; break; case true: //btnDetectionStart.Enabled = false; //btnDetectionStop.Enabled = true; break; } gbHandTest.Enabled = ckAuto.Checked; } public void AppendDetectionData(string _productNo) { int detectID = detectionData.SaveProductDetection(_productNo, CommonUtil.DetectionOption == DetectionOption.doProduct ? 0 : 1, opc, lbDisplayState); CommonUtil.StepControl.AddProductStep(detectID); ProductBindingList.Insert(0, new ProductMeasureResult(_productNo, detectID)); } public void SetDetectionHeight(double height, double cellHeight, MeasureState heightResult, MeasureState cellHeightResult, MeasureState productNoResult) { int detectID = CommonUtil.StepControl.GetDetectHeightID(); if (detectID <= 0) { CommonUtil.WriteLog(LogType.Inf, "NO Detectid in Stepcontrol"); return; } var p = (from o in ProductBindingList where o.DetectID == detectID select o ).FirstOrDefault(); if (p == null) { CommonUtil.WriteLog(LogType.Inf, "NO Detectid in ProductBindingList"); return; } try { if (heightResult == MeasureState.NA) { productNoResult = MeasureState.NA; p.ProductNo = "NA"; } detectionData.SaveHeightData(p.DetectID, height, cellHeight, productNoResult, heightResult, cellHeightResult, p.ProductNo); p.ProductNoResult = productNoResult.ToString(); p.Height = height; p.HeightResult = heightResult.ToString(); p.CellHeight = cellHeight; p.CellHeightResult = cellHeightResult.ToString(); if (heightResult == MeasureState.NG || productNoResult == MeasureState.NG)//|| cellHeightResult == MeasureState.NG) p.ProductResult = MeasureState.NG.ToString(); //if (p.ProductNoResult == MeasureState.NG.ToString()) //{ // measureResultTTL.ProductNoFailQuantity++; //} dgvNG.Invalidate(); //if (heightResult == MeasureState.OK) // measureResultTTL.HeightPassQuntity++; //if (heightResult == MeasureState.NG) // measureResultTTL.HeightFailQuntity++; DisplayMeasureTTL(); } catch (Exception ex) { CommonUtil.WriteLog(LogType.Inf, "记录OK与NG异常:" + ex.ToString()); } } //public void SetDetectionSize(double length, double width, double cellWidth, // MeasureState lengthMeasureState, MeasureState widthMeasureState, int _plateID, string _imageFile, bool isSpotCheck) //{ // try // { // int detectID = CommonUtil.StepControl.GetDetectSizeStepID(); // if (detectID < 0) // { // CommonUtil.WriteLog(LogType.Inf, string.Format("no detectid WHEN set size, stepcontrol:{0}", CommonUtil.StepControl.ToString())); // return; // } // var p = (from x in ProductBindingList // where x.DetectID == detectID // select x // ).FirstOrDefault(); // if (p == null) // { // CommonUtil.WriteLog(LogType.Inf, string.Format("no detectid when setsize in ProductBindingList:{0}", detectID)); // return; // } // p.Length = length; // p.Width = width; // p.PlateID = _plateID; // p.LengthResult = lengthMeasureState.ToString(); // p.WidthResult = widthMeasureState.ToString(); // p.IsSpotCheck = isSpotCheck; // measureResultTTL.ProductQuntity++; // if (p.HeightResult == MeasureState.OK.ToString()) // measureResultTTL.HeightPassQuntity++; // if (p.HeightResult == MeasureState.NG.ToString() && p.LengthResult != MeasureState.NA.ToString()) // measureResultTTL.HeightFailQuntity++; // if (p.ProductNoResult == MeasureState.NG.ToString() && p.LengthResult != MeasureState.NA.ToString()) // { // measureResultTTL.ProductNoFailQuantity++; // } // if (lengthMeasureState == MeasureState.OK && widthMeasureState == MeasureState.OK) // measureResultTTL.SizePassQuantity++; // if (lengthMeasureState == MeasureState.NG || widthMeasureState == MeasureState.NG) // measureResultTTL.SizeFailQuantity++; // if (p.LengthResult == MeasureState.OK.ToString() && p.WidthResult == MeasureState.OK.ToString() // && p.HeightResult == MeasureState.OK.ToString() //&& p.CellHeightResult == MeasureState.OK.ToString() // && p.ProductNoResult == MeasureState.OK.ToString()) // { // p.ProductResult = MeasureState.OK.ToString(); // measureResultTTL.PassQuntity++; // lbOKNG.Text = "OK"; // lbOKNG.ForeColor = Color.Green; // } // else // { // if (p.LengthResult == MeasureState.NA.ToString() || p.WidthResult == MeasureState.NA.ToString()) // { // p.ProductResult = MeasureState.NA.ToString(); // measureResultTTL.EmptyQuantity++; // lbOKNG.Text = "NA"; // lbOKNG.ForeColor = Color.Gray; // } // else // { // p.ProductResult = MeasureState.NG.ToString(); // measureResultTTL.FailQuntity++; // lbOKNG.Text = "NG"; // lbOKNG.ForeColor = Color.Red; // } // } // detectionData.SaveSizeData(p.DetectID, length, width, cellWidth, p.ProductResult, p.PlateID, _imageFile, p.LengthResult, p.WidthResult); // detectionData.SaveToCsv(p); // dgvNG.Invalidate(); // DisplayMeasureTTL(); // FormCheck._detail = new SpotCheckDetail(); // FormCheck._detail.ProductNo = p.ProductNo; // FormCheck._detail.ProductLength = p.Length; // FormCheck._detail.ProductWidth = p.Width; // FormCheck._detail.ProductHeight = p.Height; // FormCheck._detail.PickTime = DateTime.Now; // } // catch (Exception) // { // } //} public void SetDetectionSize(double length, double width, double cellWidth, MeasureState lengthMeasureState, MeasureState widthMeasureState, int _plateID, string _imageFile, bool isSpotCheck) { try { int detectID = CommonUtil.StepControl.GetDetectSizeStepID(); if (detectID < 0) { CommonUtil.WriteLog(LogType.Inf, string.Format("no detectid WHEN set size, stepcontrol:{0}", CommonUtil.StepControl.ToString())); return; } var p = (from x in ProductBindingList where x.DetectID == detectID select x ).FirstOrDefault(); if (p == null) { CommonUtil.WriteLog(LogType.Inf, string.Format("no detectid when setsize in ProductBindingList:{0}", detectID)); return; } p.Length = length; p.Width = width; p.PlateID = _plateID; p.LengthResult = lengthMeasureState.ToString(); p.WidthResult = widthMeasureState.ToString(); p.IsSpotCheck = isSpotCheck; measureResultTTL.ProductQuntity++; if (p.HeightResult == MeasureState.OK.ToString()) measureResultTTL.HeightPassQuntity++; if (p.HeightResult == MeasureState.NG.ToString() && p.LengthResult != MeasureState.NA.ToString()) measureResultTTL.HeightFailQuntity++; if (p.ProductNoResult == MeasureState.NG.ToString() && p.LengthResult != MeasureState.NA.ToString()) { measureResultTTL.ProductNoFailQuantity++; } if (lengthMeasureState == MeasureState.OK && widthMeasureState == MeasureState.OK) measureResultTTL.SizePassQuantity++; if (lengthMeasureState == MeasureState.NG || widthMeasureState == MeasureState.NG) measureResultTTL.SizeFailQuantity++; //Task.Factory.StartNew(() => //{ DisplayResult(length, width, cellWidth, _imageFile, p); //}); } catch (Exception) { } finally { //opc.Write(OPCOutputTag.DetectionOK4, true); } } private void DisplayResult(double length, double width, double cellWidth, string _imageFile, ProductMeasureResult p) { if (this.InvokeRequired) { this.Invoke(new Action(() => DisplayResult(length, width, cellWidth, _imageFile, p))); } else { //if (p.LengthResult == MeasureState.OK.ToString() && p.WidthResult == MeasureState.OK.ToString() // && p.HeightResult == MeasureState.OK.ToString() //&& p.CellHeightResult == MeasureState.OK.ToString() // && p.ProductNoResult == MeasureState.OK.ToString()) //{ // p.ProductResult = MeasureState.OK.ToString(); // measureResultTTL.PassQuntity++; // lbOKNG.Text = "OK"; // lbOKNG.ForeColor = Color.Green; //} //else //{ // if (p.LengthResult == MeasureState.NA.ToString() || p.WidthResult == MeasureState.NA.ToString()) // { // p.ProductResult = MeasureState.NA.ToString(); // measureResultTTL.EmptyQuantity++; // lbOKNG.Text = "NA"; // lbOKNG.ForeColor = Color.Gray; // } // else // { // p.ProductResult = MeasureState.NG.ToString(); // measureResultTTL.FailQuntity++; // lbOKNG.Text = "NG"; // lbOKNG.ForeColor = Color.Red; // } //} List results = new List() { p.measureSize.LengthResult, p.measureSize.WidthResult, p.productNoResult, p.measureHeight.HeightResult }; if (results.Contains(MeasureState.NA)) { p.ProductResult = MeasureState.NA.ToString(); measureResultTTL.EmptyQuantity++; lbOKNG.Text = "NA"; lbOKNG.ForeColor = Color.Gray; //NA时把条码结果置为NA p.ProductNo = "NA"; p.productNoResult = MeasureState.NA; } else if (results.Contains(MeasureState.NG)) { p.ProductResult = MeasureState.NG.ToString(); measureResultTTL.FailQuntity++; lbOKNG.Text = "NG"; lbOKNG.ForeColor = Color.Red; } else { p.ProductResult = MeasureState.OK.ToString(); measureResultTTL.PassQuntity++; lbOKNG.Text = "OK"; lbOKNG.ForeColor = Color.Green; } detectionData.SaveSizeData(p.DetectID, length, width, cellWidth, p.ProductResult, p.PlateID, _imageFile, p.LengthResult, p.WidthResult, p.ProductNo, p.ProductNoResult); detectionData.SaveToCsv(p); dgvNG.Invalidate(); DisplayMeasureTTL(); FormCheck._detail = new SpotCheckDetail(); FormCheck._detail.ProductNo = p.ProductNo; FormCheck._detail.ProductLength = p.Length; FormCheck._detail.ProductWidth = p.Width; FormCheck._detail.ProductHeight = p.Height; FormCheck._detail.PickTime = DateTime.Now; } } public void RemoveDetectedItem(int detectID) { try { var x = (from d in ProductBindingList where d.DetectID == detectID select d).FirstOrDefault(); if (x != default(ProductMeasureResult)) { ProductBindingList.Remove(x); dgvNG.Invalidate(); } } catch (Exception e) { CommonUtil.WriteLog(LogType.Err, string.Format("删除检测结果发生异常:{0}", e.Message)); } } public void DisplayHeightImage(HObject hImage) { VisionDetect.DisplayImage(hImage, hcZView.HalconWindow); } public void DisplaySizeImage(HObject hImage) { VisionDetect.DisplayImage(hImage, hcXyView.HalconWindow); } public void DisplayMeasureTTL() { lblProductQuantity.Text = measureResultTTL.ProductQuntity.ToString(); lblPassQuantity.Text = measureResultTTL.PassQuntity.ToString(); lblFailQuantity.Text = measureResultTTL.FailQuntity.ToString(); lblPassRate.Text = measureResultTTL.PassRate; lblHeightPassQuantity.Text = measureResultTTL.HeightPassQuntity.ToString(); lblHeightFailQuantity.Text = measureResultTTL.HeightFailQuntity.ToString(); lblSizePassQuantity.Text = measureResultTTL.SizePassQuantity.ToString(); lblSizeFailQuantity.Text = measureResultTTL.SizeFailQuantity.ToString(); lblProductNoFailQuantity.Text = measureResultTTL.ProductNoFailQuantity.ToString(); lblEmptyQuantity.Text = measureResultTTL.EmptyQuantity.ToString(); } int _continuousNGThreshold = 999; int _continuousNG = 0; #region PLC 监听 void OPCEventHandler(object sender, EventTool.ListenEventArgs e) { string timeStr = DateTime.Now.ToString("hh:mm:ss fff"); OPC.Item item = (OPC.Item)e.IData.Data; //CommonUtil.WriteLog(LogType.Inf, string.Format("接收到PLC信号:{0},时间:{1}", item.name, timeStr)); switch (item.name) { case OPCInputTag.TurnDiskReady: TurnDiskReadyTime = DateTime.Now; if ((bool)item.value) { opc.Write(OPCOutputTag.SpotCheck, false); CommonUtil.StepControl.IncStep(); //bool isOk = false; MeasureState pState = MeasureState.NA; int detectID = CommonUtil.StepControl.GetUnloadStepID(); ProductMeasureResult x = null; if (detectID > 0) { x = (from t in productTestCollection where t.DetectID == detectID select t ).FirstOrDefault(); if (x != default(ProductMeasureResult)) { pState = (MeasureState)Enum.Parse(typeof(MeasureState), x.ProductResult); if (pState == MeasureState.OK) //if (x.ProductResult == MeasureState.OK.ToString()) { if (x.IsSpotCheck) { //取消抽检时放入NG料盘,更新数据库抽检标志 //isOk = false; //isOk = true; detectionData.SaveSpotCheck(detectID); detectionData.SaveTrayBarcode(detectID); //opc.Write(OPCOutputTag.SpotCheck, true); } else { //isOk = true; //opc.Write(OPCOutputTag.SpotCheck, false); } } } } #region add by Patrick 2019-12-20 switch (pState) { case MeasureState.OK: opc.Write(OPCOutputTag.DetectResult_OK, true); opc.Write(OPCOutputTag.DetectResult_NG, false); CommonUtil.WriteLog(LogType.Inf, $"{x?.DetectID}|{x?.ProductNo}产品应放入OK Tray"); _continuousNG = 0; break; case MeasureState.NG: opc.Write(OPCOutputTag.DetectResult_OK, false); opc.Write(OPCOutputTag.DetectResult_NG, true); CommonUtil.WriteLog(LogType.Inf, $"{x?.DetectID}|{x?.ProductNo}产品应放入NG Tray"); CommonUtil.StepControl.RemoveById(detectID); _continuousNG++; break; default: opc.Write(OPCOutputTag.DetectResult_OK, false); opc.Write(OPCOutputTag.DetectResult_NG, false); CommonUtil.WriteLog(LogType.Inf, $"{x?.DetectID}|{x?.ProductNo}产品应放入NA Tray"); CommonUtil.StepControl.RemoveById(detectID); _continuousNG = 0; break; } #endregion //转盘信号调整到结果之后给出 opc.Write(OPCOutputTag.TurnDiskReadyConfirm, true); //opc.Write(OPCOutputTag.DetectResult, isOk); //if (!isOk) //{ // CommonUtil.StepControl.RemoveById(detectID); //} RemoveDetectedItem(detectID); CommonUtil.WriteLog(LogType.Inf, string.Format("{0}, {1}", detectID, pState.ToString())); if (unloadTime != DateTime.MaxValue) { TimeSpan ts = DateTime.Now - unloadTime; DisplayCycleTime((int)Math.Round(ts.TotalMilliseconds)); } unloadTime = DateTime.Now; if (_continuousNG >= _continuousNGThreshold) { //脚本中设置报警码2000表示连续NG次数到达设定报警上限 opc.Write(OPCOutputTag.Alarm, 2000); CommonUtil.WriteLog(LogType.Inf, $"产品连续NG{_continuousNG}次,报警提示"); _continuousNG = 0; } // } break; case OPCInputTag.DetectionStart2: if ((bool)item.value) { DetectionProcesser hp = heightDetection.Execute; IAsyncResult ar = hp.BeginInvoke(null, null); } break; case OPCInputTag.DetectionStart4: if ((bool)item.value) { //if (FormCheck._totalQty - FormCheck._finishedQty > 0 && FormCheck._pickCount > 0) //{ // if (FormCheck._lastProductQty + FormCheck._pickCount < measureResultTTL.ProductQuntity + FormCheck._lastBreakProductQty) // { // FormCheck._lastProductQty = measureResultTTL.ProductQuntity + FormCheck._lastBreakProductQty; // } // if (measureResultTTL.ProductQuntity + FormCheck._lastBreakProductQty == FormCheck._lastProductQty + FormCheck._pickCount) // { // string productNo = sizeDetection.GetProductNo(CommonUtil.StepControl.GetDetectSizeStepID()); // if (productNo!="NA" && WeekCompare(productNo)) // { // sizeDetection.isPick = true; // FormCheck._lastProductQty = measureResultTTL.ProductQuntity + FormCheck._lastBreakProductQty; // } // } //} Task.Factory.StartNew(() => { sizeDetection.Execute(measureResultTTL.ProductQuntity); }); } break; case OPCInputTag.Auto: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.Auto + "," + item.value.ToString() + "\r\n" + tbPLCMsg.Text; ckAuto.Text = (bool)item.value ? "手動" : "自動"; ckAuto.Checked = (bool)item.value; gbHandTest.Enabled = ckAuto.Checked; break; case OPCInputTag.PLCInitialized: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.PLCInitialized + "," + item.value.ToString() + "\r\n" + tbPLCMsg.Text; if ((bool)item.value) { opc.Write(OPCOutputTag.PCInitialized, true); lbDisplayState.Text = "初始化完成"; Thread.Sleep(10); } break; //case OPCInputTag.RunStatus: // switch (item.value.ToString()) // { // case "1": // lbDisplayState.Text = "急停"; // break; // case "2": // lbDisplayState.Text = "復位"; // break; // case "3": // lbDisplayState.Text = "運行"; // break; // case "4": // lbDisplayState.Text = "停止"; // break; // } // break; case OPCInputTag.EmergencyStop: ProductBindingList.Clear(); productTestCollection.Clear(); CommonUtil.StepControl.Clear(); DisplayMeasureTTL(); imageProcess.ClearBarcodeImage(); //Thread.Sleep(1000); //imageProcess.CloseCameras(); //Thread.Sleep(1000); //imageProcess.OpenCameras(); CommonUtil.WriteLog(LogType.Inf, "系统急停"); //抽检参数的刷新 SetCheckInfo(); break; case OPCInputTag.Alarm: int val = int.Parse(item.value.ToString()); Task.Factory.StartNew(() => { UpdateAlarm(val); WarningData warningData = new WarningData(); DownTimeData downTimeData = new DownTimeData(); DateTime now = DateTime.Now; if (val == 0) { //更新报警 warningData.UpdateWarning(); //更新因报警引起的宕机 downTimeData.UpdateDownTime(new DownTime { EndTime = now, Type = DownTimeType.Warning }); } else { //保存报警 warningData.SaveWarning(val); //结束上一个报警并记录下一个报警 downTimeData.UpdateDownTime(new DownTime { EndTime = now, Type = DownTimeType.Warning }); downTimeData.SaveDownTime(new DownTime { BeginTime = now, Type = DownTimeType.Warning }); } _tempDownTimeList.Add(now); }); break; //UpdateAlarm(int.Parse(item.value.ToString())); //break; case OPCInputTag.UploadSignalRequire: if ((bool)item.value) { UpdateAlarm(101); } break; case OPCInputTag.X1axisLocalPos: tbX1axisLoPos.Text = item.value.ToString(); break; case OPCInputTag.Y1axisLocalPos: tbY1axisLoPos.Text = item.value.ToString(); break; case OPCInputTag.X2axisLocalPos: tbX2axisLoPos.Text = item.value.ToString(); break; case OPCInputTag.Y2axisLocalPos: tbY2axisLoPos.Text = item.value.ToString(); break; case OPCInputTag.TestResult: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.TestResult + "," + item.value.ToString() + "\r\n" + tbPLCMsg.Text; if ((bool)item.value) { //判断OKNG opc.Write(OPCOutputTag.TestResult, false); //OK_NG(); } break; case OPCInputTag.PPGJceFbPW: plateID = (int)item.value; //保存因上下料、料盘满未作处理引起的宕机 Task.Factory.StartNew(() => { DateTime now = DateTime.Now; //判断当前无报警并且时间超出设置的时长 if (string.IsNullOrEmpty(tsslWarnMsg.Text) && _plateChangeTime != null && (now - _plateChangeTime.Value).TotalSeconds > _downTimeNoAction) { DownTimeData downTimeData = new DownTimeData(); //判断设置时长内有无报警 if (_tempDownTimeList.Count > 0) { if ((now - _tempDownTimeList[_tempDownTimeList.Count - 1]).TotalSeconds > _downTimeNoAction) { if (_tempDownTimeList[_tempDownTimeList.Count - 1] > _plateChangeTime) { downTimeData.SaveDownTime(new DownTime { BeginTime = _tempDownTimeList[_tempDownTimeList.Count - 1], EndTime = now, Type = DownTimeType.NoAction }); } else { downTimeData.SaveDownTime(new DownTime { BeginTime = _plateChangeTime, EndTime = now, Type = DownTimeType.NoAction }); } } } else { downTimeData.SaveDownTime(new DownTime { BeginTime = _plateChangeTime, EndTime = now, Type = DownTimeType.NoAction }); } } _plateChangeTime = now; }); break; case OPCInputTag.UploadFinished: if ((bool)item.value) { TimeSpan tsUpload = DateTime.Now - TurnDiskReadyTime; tbUploadTime.Text = string.Format("{0:0.00}", tsUpload.TotalMilliseconds / 1000); tbUploadTime.Invalidate(); } break; case OPCInputTag.UnloadFinished: if ((bool)item.value) { TimeSpan tsUnload = DateTime.Now - TurnDiskReadyTime; tbUnloadTime.Text = string.Format("{0:0.00}", tsUnload.TotalMilliseconds / 1000); tbUnloadTime.Invalidate(); } break; #region add by Patrick 2018-07-12 case OPCInputTag.UnloadBatteryDone: //电池下料到位时,绑定载具条码 if ((bool)item.value) { //opc.Write(OPCInputTag.UnloadBatteryDone, false); int batteryId = CommonUtil.StepControl.GetUnloadBatteryID(); CommonUtil.WriteLog(LogType.Inf, $"电池下料到位,Id:{batteryId}"); CommonUtil.StepControl.RemoveById(batteryId); detectionData.SaveTrayBarcode(batteryId); } break; case OPCInputTag.UnloadTrayMoveToOP: //当下料载具回到OP端,清空载具条码 if ((bool)item.value) { //opc.Write(OPCInputTag.UnloadTrayMoveToOP, false); allowBarcodeFlag = true; //CarrierBarcodeCtrl.GlobalCarrierBarcode = string.Empty; cBarcodeCtrl.CarrierBarcode = string.Empty; Task.Factory.StartNew(() => { detectionDataUpload.UploadData(); }); } break; case OPCInputTag.UnloadTrayReady://当下料载具就绪,不允许输入条码 if ((bool)item.value) { //opc.Write(OPCInputTag.UnloadTrayReady, false); allowBarcodeFlag = false; } break; #endregion } } #endregion #region OPC操作 private void UpdateOpc() { Thread.Sleep(1000); foreach (KeyValuePair item in opc.itemReadDict) { object status = new object(); opc.ReadOneItem_Wrapper(item.Key, ref status); if (status == null) return; switch (item.Key) { case OPCInputTag.PLCInitialized: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.PLCInitialized + "," + status.ToString() + "\r\n" + tbPLCMsg.Text; if ((bool)status) { opc.Write(OPCOutputTag.PCInitialized, true); lbDisplayState.Text = "初始化完成"; Thread.Sleep(10); } break; case OPCInputTag.Alarm: UpdateAlarm((int)status); break; case OPCInputTag.X1axisLocalPos: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.X1axisLocalPos + "," + status.ToString() + "\r\n" + tbPLCMsg.Text; tbX1axisLoPos.Text = status.ToString(); break; case OPCInputTag.Y1axisLocalPos: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.Y1axisLocalPos + "," + status.ToString() + "\r\n" + tbPLCMsg.Text; tbY1axisLoPos.Text = status.ToString(); break; case OPCInputTag.X2axisLocalPos: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.X2axisLocalPos + "," + status.ToString() + "\r\n" + tbPLCMsg.Text; tbX2axisLoPos.Text = status.ToString(); break; case OPCInputTag.Y2axisLocalPos: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCInputTag.Y2axisLocalPos + "," + status.ToString() + "\r\n" + tbPLCMsg.Text; tbY2axisLoPos.Text = status.ToString(); break; default: break; } } foreach (KeyValuePair item in opc.itemWriteDict) { object status = new object(); opc.ReadOneItem_Wrapper(item.Key, ref status); switch (item.Key) { case OPCOutputTag.PCInitialized: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCOutputTag.PCInitialized + "," + status.ToString() + "\r\n" + tbPLCMsg.Text; break; case OPCOutputTag.Auto: tbPLCMsg.Text = DateTime.Now.ToString("HH:mm:ss") + ":" + OPCOutputTag.Auto + "," + status.ToString() + "\r\n" + tbPLCMsg.Text; ckAuto.Checked = (bool)status; ckAuto.Text = (bool)status ? "手動" : "自動"; break; case OPCOutputTag.TestResult: opc.Write(OPCOutputTag.TestResult, false); break; default: break; } } } public void UpdateAlarm(int val) { string info = ""; int type = 0; if (val != 0) { WarningData warningData = new WarningData(); var list = warningData.GetWarningType(val); if (list.Count > 0) { info = list[0].Content; _solution = list[0].Solution; type = list[0].Type; } } if (!string.IsNullOrEmpty(info)) { if (type == 1) { tsslWarnMsg.BackColor = Color.Red; } if (type == 2) { tsslWarnMsg.BackColor = Color.Green; } } else { tsslWarnMsg.BackColor = SystemColors.Window; } tsslWarnMsg.Text = info; MessageHandler.MessageHandlerInstance.NewMessage(info); } #endregion #region 初始化操作 private void InitParams() { textBox10.Text = opcConfig.batteryLengthLimit.Min.ToString(); textBox7.Text = opcConfig.batteryLengthLimit.Max.ToString(); textBox15.Text = opcConfig.batteryWidthLimit.Min.ToString(); textBox9.Text = opcConfig.batteryWidthLimit.Max.ToString(); textBox1.Text = opcConfig.batteryHeightLimit.Min.ToString(); textBox2.Text = opcConfig.batteryHeightLimit.Max.ToString(); textBox16.Text = opcConfig.batteryBMULimit.Min.ToString(); textBox11.Text = opcConfig.batteryBMULimit.Max.ToString(); } #endregion #region 事件 private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { Stop(); SaveMeasureTTL(); Task.Factory.StartNew(() => { SpotCheckData data = new SpotCheckData(); data.UpdateLastBreakProductQty(measureResultTTL.ProductQuntity); DownTimeData downTimeData = new DownTimeData(); DownTime downTime = new DownTime() { BeginTime = DateTime.Now, Type = DownTimeType.Closed }; downTimeData.SaveDownTime(downTime); }); MessageHandler.MessageHandlerInstance.Close(); } private void btnConfig_Click(object sender, EventArgs e) { ConfigPassword cp = new ConfigPassword(opcConfig.configPassword); if (cp.ShowDialog() != DialogResult.OK) return; ConfigForm cf = new ConfigForm(opc, opcConfig); if (cf.ShowDialog() != DialogResult.OK) return; opcConfig = sftConfig.GetConfig(CommonUtil.ConfigDir + @"\M423Config.xml"); //cp.Dispose(); } private void btnImageProcess_Click(object sender, EventArgs e) { ImagePassWord ip = new ImagePassWord(opcConfig.imagePassword); if (ip.ShowDialog() != DialogResult.OK) return; //CloseCameras(); ImageForm iform = new ImageForm(opc, opcConfig); if (iform.ShowDialog() != DialogResult.OK) return; //InitCameras(); opcConfig = sftConfig.GetConfig(CommonUtil.ConfigDir + @"\M423Config.xml"); ip.Dispose(); } private void ckAuto_CheckedChanged(object sender, EventArgs e) { opc.Write(OPCOutputTag.Auto, ckAuto.Checked); ckAuto.Text = ckAuto.Checked ? "手動" : "自動"; } //GRR导出 private void button1_Click(object sender, EventArgs e) { imageProcess.GrapSizeAsync(); HObject hImage = null; int waitCount = 0; while (imageProcess.BarcodeImageCount <= 0 && waitCount < 10) { Thread.Sleep(50); waitCount++; } if (imageProcess.BarcodeImageCount > 0) { hImage = imageProcess.DequeueBarcodeImage(); VisionDetect.DisplayImage(hImage, hcZView.HalconWindow); } } private void btnStart_Click(object sender, EventArgs e) { Start(); } private void btnStop_Click(object sender, EventArgs e) { Stop(); } private void btnTableAction_Click(object sender, EventArgs e) { opc.Write(OPCOutputTag.ZhPanAction, true); } private void btnStation2_Click(object sender, EventArgs e) { opc.Write(OPCOutputTag.Station2Move, true); } private void btnStation4_Click(object sender, EventArgs e) { opc.Write(OPCOutputTag.Station4Move, true); } private void cbHandXi_CheckedChanged(object sender, EventArgs e) { opc.Write(OPCOutputTag.HandXi, cbHandXi.Checked); } //保存测量尺寸上下限 private void btnSaveConfig_Click(object sender, EventArgs e) { opcConfig.batteryLengthLimit.Min = Convert.ToDouble(textBox10.Text); opcConfig.batteryLengthLimit.Max = Convert.ToDouble(textBox7.Text); opcConfig.batteryWidthLimit.Min = Convert.ToDouble(textBox15.Text); opcConfig.batteryWidthLimit.Max = Convert.ToDouble(textBox9.Text); opcConfig.batteryHeightLimit.Min = Convert.ToDouble(textBox1.Text); opcConfig.batteryHeightLimit.Max = Convert.ToDouble(textBox2.Text); opcConfig.batteryBMULimit.Min = Convert.ToDouble(textBox16.Text); opcConfig.batteryBMULimit.Max = Convert.ToDouble(textBox11.Text); sftConfig.SetConfig(CommonUtil.ConfigDir + @"\M423Config.xml", opcConfig); } #endregion private void button2_Click(object sender, EventArgs e) { if (MessageBox.Show("清空产品检测结果不会删除已经检测的明细数据。但是如果当前正在进行检测,可能造成正在检测的产品数据丢失", "提示", MessageBoxButtons.OKCancel) == DialogResult.OK) { ProductBindingList.Clear(); productTestCollection.Clear(); measureResultTTL.Clear(); DisplayMeasureTTL(); CommonUtil.StepControl.Clear(); imageProcess.ClearBarcodeImage(); } } private void button6_Click(object sender, EventArgs e) { FormDetectionResult dr = new FormDetectionResult(opcConfig); dr.ShowDialog(); } private void btnDetectionStart_Click(object sender, EventArgs e) { Start(); } private void btnDetectionStop_Click(object sender, EventArgs e) { Stop(); } private void btnSetupRunMode_Click(object sender, EventArgs e) { SystemRunMode rm = new SystemRunMode(); object b = new bool(); rm.runMode = opc.ReadOneItem_Wrapper(OPCOutputTag.RunMode, ref b) ? (bool)b : false; object i = new int(); int runtimes = opc.ReadOneItem_Wrapper(OPCOutputTag.RunTimes, ref i) ? (int)i : 5; rm.runTimes = (ushort)runtimes; bool repeat = opc.ReadOneItem_Wrapper(OPCOutputTag.Repeat, ref b) ? (bool)b : false; using (FormGetRunMode form = new FormGetRunMode(rm, repeat)) { if (form.ShowDialog() == System.Windows.Forms.DialogResult.OK) { rm = form.RunMode; opc.Write(OPCOutputTag.RunMode, rm.runMode); opc.Write(OPCOutputTag.RunTimes, rm.runTimes); //重复性 opc.Write(OPCOutputTag.Repeat, rm.Repeat); } } } private void dgvNG_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.RowIndex >= 0) { Color backColor = e.CellStyle.BackColor; try { if (e.Value != null) { if (dgvNG.Columns["ProductNo"].Index == e.ColumnIndex) { string val = (string)e.Value; backColor = val.Trim().Length == CommonUtil.ProductNoLength ? backColor : Color.Red; } if (dgvNG.Columns["Height"].Index == e.ColumnIndex) { double val = (double)e.Value; if (CommonUtil.DetectionOption == DetectionOption.doProduct) { backColor = (val >= opcConfig.batteryHeightLimit.Min && val <= opcConfig.batteryHeightLimit.Max) || Math.Abs(val) < 0.000001 ? backColor : Color.Red; } else { backColor = (val >= opcConfig.standardHeightLimit.Min && val <= opcConfig.standardHeightLimit.Max) || Math.Abs(val) < 0.000001 ? backColor : Color.Red; } } /* if (dgvNG.Columns["CellHeight"].Index == e.ColumnIndex) { double val = (double)e.Value; backColor = (val >= opcConfig.batteryHeightLimit.Min && val <= opcConfig.batteryHeightLimit.Max) || Math.Abs(val) < 0.000001 ? backColor : Color.Red; }*/ if (dgvNG.Columns["Length"].Index == e.ColumnIndex) { double val = (double)e.Value; if (CommonUtil.DetectionOption == DetectionOption.doProduct) { backColor = (val >= opcConfig.batteryLengthLimit.Min && val <= opcConfig.batteryLengthLimit.Max) || Math.Abs(val) < 0.000001 ? backColor : Color.Red; } else { backColor = (val >= opcConfig.standardLengthLimit.Min && val <= opcConfig.standardLengthLimit.Max) || Math.Abs(val) < 0.000001 ? backColor : Color.Red; } } if (dgvNG.Columns["Width"].Index == e.ColumnIndex) { double val = (double)e.Value; if (CommonUtil.DetectionOption == DetectionOption.doProduct) { backColor = (val >= opcConfig.batteryWidthLimit.Min && val <= opcConfig.batteryWidthLimit.Max) || Math.Abs(val) < 0.000001 ? backColor : Color.Red; } else { backColor = (val >= opcConfig.standardWidthLimit.Min && val <= opcConfig.standardWidthLimit.Max) || Math.Abs(val) < 0.000001 ? backColor : Color.Red; } } if (dgvNG.Columns["ProductResult"].Index == e.ColumnIndex) { string val = (string)e.Value; if (val == "NG") backColor = Color.Red; else if (val == "OK") backColor = Color.Green; } } } catch (Exception) { ;// CommonUtil.WriteLog(LogType.Exc, string.Format("GDI ERROR:{0}", ex.Message)); } e.CellStyle.BackColor = backColor; } } private void cbUploadDataEnable_CheckedChanged(object sender, EventArgs e) { //CommonUtil.UploadDataEnable = cbUploadDataEnable.Checked; } private void timer1_Tick(object sender, EventArgs e) { SystemRunMode rm = new SystemRunMode(); object b = new bool(); rm.runMode = opc.ReadOneItem_Wrapper(OPCOutputTag.RunMode, ref b) ? (bool)b : false; if (rm.runMode) { opc.Write(OPCOutputTag.RunMode, true); opc.Write(OPCOutputTag.RunTimes, 10); } GC.Collect(); } private void rbProductOption_CheckedChanged(object sender, EventArgs e) { if (rbProductOption.Checked) { CommonUtil.DetectionOption = DetectionOption.doProduct; imageProcess.CloseSizeCamera(); Thread.Sleep(1000); imageProcess.OpenSizeCamera(true); } else { CommonUtil.DetectionOption = DetectionOption.doStandardBlock; imageProcess.CloseSizeCamera(); Thread.Sleep(1000); imageProcess.OpenSizeCamera(false); } } private void rbStandardBlock_CheckedChanged(object sender, EventArgs e) { if (rbProductOption.Checked) { CommonUtil.DetectionOption = DetectionOption.doProduct; imageProcess.CloseSizeCamera(); Thread.Sleep(1000); imageProcess.OpenSizeCamera(true); } else { CommonUtil.DetectionOption = DetectionOption.doStandardBlock; imageProcess.CloseSizeCamera(); Thread.Sleep(1000); imageProcess.OpenSizeCamera(false); } } public void DisplayCycleTime(int ms) { tbCT.Text = string.Format("{0:0.00}", ((float)ms) / 1000); } public MeasureResultTTL RestoreMeasureTTL() { string ttlFileName = CommonUtil.CurrentDir + @"\measureTTL.xml"; if (!File.Exists(ttlFileName)) return new MeasureResultTTL(); try { using (FileStream fs = new FileStream(ttlFileName, FileMode.Open)) { XmlSerializer xs = new XmlSerializer(typeof(MeasureResultTTL)); return (MeasureResultTTL)xs.Deserialize(fs); } } catch (Exception) { return new MeasureResultTTL(); ; } } public void SaveMeasureTTL() { string ttlFileName = CommonUtil.CurrentDir + @"\measureTTL.xml"; using (FileStream fs = new FileStream(ttlFileName, FileMode.OpenOrCreate)) { XmlSerializer xs = new XmlSerializer(typeof(MeasureResultTTL)); xs.Serialize(fs, measureResultTTL); } } public void CreateDetectiongReport() { try { DateTime dtBegin, dtEnd; string yestodayFileString = CommonUtil.DailyReport + "\\DailyReport" + DateTime.Today.AddDays(-1).ToString("yyyyMMdd") + ".csv"; string yestodayStandardFileString = CommonUtil.DailyReport + "\\Standard-DailyReport" + DateTime.Today.AddDays(-1).ToString("yyyyMMdd") + ".csv"; string yestodayString = DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"); dtBegin = DateTime.Parse(yestodayString + " 00:00:00"); dtEnd = DateTime.Parse(yestodayString + " 23:59:59"); if (!File.Exists(yestodayFileString)) { ExportToExcel(dtBegin, dtEnd, yestodayFileString); } //添加单独导出标准块检测结果 if (!File.Exists(yestodayStandardFileString)) { ExportStandardToExcel(dtBegin, dtEnd, yestodayStandardFileString); } string todayFileString = CommonUtil.DailyReport + "\\DailyReport" + DateTime.Today.ToString("yyyyMMdd") + ".csv"; string todayStandardFileString = CommonUtil.DailyReport + "\\Standard-DailyReport" + DateTime.Today.ToString("yyyyMMdd") + ".csv"; string todayString = DateTime.Now.ToString("yyyy-MM-dd"); dtBegin = DateTime.Parse(todayString + " 00:00:00"); dtEnd = DateTime.Parse(todayString + " 23:59:59"); ExportToExcel(dtBegin, dtEnd, todayFileString); //添加单独导出标准块检测结果 ExportStandardToExcel(dtBegin, dtEnd, todayStandardFileString); } catch (Exception e) { CommonUtil.WriteLog(LogType.Err, string.Format("生成检测报告出错:{0}", e.Message)); } } public void ExportToExcel(DateTime dtBegin, DateTime dtEnd, string fileName) { if (File.Exists(fileName)) File.Delete(fileName); StringBuilder sb = new StringBuilder(); System.Data.DataTable dt; sb.Append(string.Format( " SELECT [Time] = DetectTime " + " ,DataCode = ProductNo " + " ,StationNum = PlateID " + " ,FAI3 = ProductLength " + " ,FAI12 = ProductWidth " + " ,LengthResult = ProductLengthStatus " + " ,WidthResult = ProductWidthStatus " + " ,FAI9 = ProductHeight" + " ,HeightResult = ProductHeightStatus" + " ,ProductResult = ProductStatus,case when ISNULL(ProductType,0)=0 then N'产品' when ProductType=1 then N'标准块' end ProductType " + " FROM ProductDetectionDetail " + " WHERE DetectTime Between '{0}' AND '{1}' AND ProductType=0", dtBegin.ToString("yyyy-MM-dd HH:mm:ss"), dtEnd.ToString("yyyy-MM-dd HH:mm:ss"))); dt = CommonUtil.mainForm.DetectData.Query(sb.ToString()); IDataReader dr = dt.CreateDataReader(); FileStream myStream = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.UTF8); string columnTitle = ""; try { for (int i = 0; i < dt.Columns.Count; i++) { if (i > 0) { columnTitle += ","; } columnTitle += dt.Columns[i].ColumnName; } sw.WriteLine(columnTitle); while (dr.Read()) { string columnValue = ""; for (int k = 0; k < dt.Columns.Count; k++) { if (k > 0) { columnValue += ","; } if (dr.GetValue(k) == null) columnValue += ""; else columnValue += dr.GetValue(k).ToString().Trim(); } sw.WriteLine(columnValue); } } catch (Exception e) { CommonUtil.WriteLog(LogType.Err, string.Format("生成检测报告出错:{0}", e.Message)); } finally { dr.Close(); sw.Close(); myStream.Close(); } } public void ExportStandardToExcel(DateTime dtBegin, DateTime dtEnd, string fileName) { if (File.Exists(fileName)) File.Delete(fileName); StringBuilder sb = new StringBuilder(); System.Data.DataTable dt; sb.Append(string.Format( " SELECT [Time] = DetectTime " + " ,DataCode = ProductNo " + " ,StationNum = PlateID " + " ,FAI3 = ProductLength " + " ,FAI12 = ProductWidth " + " ,LengthResult = ProductLengthStatus " + " ,WidthResult = ProductWidthStatus " + " ,FAI9 = ProductHeight" + " ,HeightResult = ProductHeightStatus" + " ,ProductResult = ProductStatus,case when ISNULL(ProductType,0)=0 then N'产品' when ProductType=1 then N'标准块' end ProductType " + " FROM ProductDetectionDetail " + " WHERE DetectTime Between '{0}' AND '{1}' AND ProductType=1", dtBegin.ToString("yyyy-MM-dd HH:mm:ss"), dtEnd.ToString("yyyy-MM-dd HH:mm:ss"))); dt = CommonUtil.mainForm.DetectData.Query(sb.ToString()); IDataReader dr = dt.CreateDataReader(); FileStream myStream = new FileStream(fileName, FileMode.CreateNew, FileAccess.Write); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.UTF8); string columnTitle = ""; try { for (int i = 0; i < dt.Columns.Count; i++) { if (i > 0) { columnTitle += ","; } columnTitle += dt.Columns[i].ColumnName; } sw.WriteLine(columnTitle); while (dr.Read()) { string columnValue = ""; for (int k = 0; k < dt.Columns.Count; k++) { if (k > 0) { columnValue += ","; } if (dr.GetValue(k) == null) columnValue += ""; else columnValue += dr.GetValue(k).ToString().Trim(); } sw.WriteLine(columnValue); } } catch (Exception e) { CommonUtil.WriteLog(LogType.Err, string.Format("生成检测报告出错:{0}", e.Message)); } finally { dr.Close(); sw.Close(); myStream.Close(); } } private void btnCreateReport_Click(object sender, EventArgs e) { CreateDetectiongReport(); } private void btnPLCSignal_Click(object sender, EventArgs e) { FormPLCIO formPLCIO = new FormPLCIO(opc); formPLCIO.ShowDialog(); } public void SetHeightTime(int ms) { tbHeightTime.Text = string.Format("{0:0.00}", ((float)ms) / 1000); } public void SetSizeTime(int ms) { tbSizeTime.Text = string.Format("{0:0.00}", ((float)ms) / 1000); } public void DisplayMessage(string infoString) { InfoInspect.AppendText(infoString + "\r\n"); /* int n = InfoInspect.Lines.Count() - 100; if (n > 0) { int istart = InfoInspect.GetFirstCharIndexFromLine(0); int iend = InfoInspect.GetFirstCharIndexFromLine(n - 1); InfoInspect.Select(istart, iend); InfoInspect.SelectedText = ""; }*/ InfoInspect.ScrollToCaret(); } public void DisplaySoftwareAlarm(string alarmMsg) { tsslWarnMsg.Text = alarmMsg; } private void toolStripStatusLabel1_Click(object sender, EventArgs e) { FormWarning frm = new FormWarning(); frm.ShowDialog(); } private void tsslWarnMsg_Click(object sender, EventArgs e) { if (!string.IsNullOrEmpty(tsslWarnMsg.Text)) { if (string.IsNullOrEmpty(_solution)) { _solution = "未设置处理方法"; } WarningSolution solutionFrm = new WarningSolution(_solution); solutionFrm.ShowDialog(); } } private void btnPlcOperation_Click(object sender, EventArgs e) { FormPlcOperation frm = new FormPlcOperation(opc); frm.ShowDialog(); } private void btnCheck_Click(object sender, EventArgs e) { FormCheck frm = new FormCheck(); frm.ShowDialog(); } public void SetCheckInfo() { SpotCheckData checkData = new SpotCheckData(); DataTable dt = checkData.GetTodaySpotCheck(); if (dt.Rows.Count > 0) { FormCheck._pickCount = string.IsNullOrEmpty(dt.Rows[0]["PickCount"].ToString()) ? 0 : Convert.ToInt32(dt.Rows[0]["PickCount"].ToString()); FormCheck._totalQty = string.IsNullOrEmpty(dt.Rows[0]["TotalQty"].ToString()) ? 0 : Convert.ToInt32(dt.Rows[0]["TotalQty"].ToString()); FormCheck._finishedQty = string.IsNullOrEmpty(dt.Rows[0]["FinishedQty"].ToString()) ? 0 : Convert.ToInt32(dt.Rows[0]["FinishedQty"].ToString()); FormCheck._lastProductQty = string.IsNullOrEmpty(dt.Rows[0]["LastProductQty"].ToString()) ? 0 : Convert.ToInt32(dt.Rows[0]["LastProductQty"].ToString()); FormCheck._lastBreakProductQty = string.IsNullOrEmpty(dt.Rows[0]["LastBreakProductQty"].ToString()) ? 0 : Convert.ToInt32(dt.Rows[0]["LastBreakProductQty"].ToString()); if (FormCheck._lastBreakProductQty < FormCheck._lastProductQty) { FormCheck._lastBreakProductQty = FormCheck._lastProductQty; } } } private void btnDownTime_Click(object sender, EventArgs e) { FormDownTime form = new FormDownTime(); form.ShowDialog(); } private void label2_DoubleClick(object sender, EventArgs e) { gbxStatistics.Visible = gbxStatistics.Visible ? false : true; } } #region 检测结果类 public class DetectResult { public string datacodeStr = "N/A"; public double batteryLength; public double batteryWidth; public double cellHeight; public double insulationHeight; } #endregion public struct InitPosition { public double x1; public double y1; public double a1; public double x2; public double y2; public double a2; } }