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<ProductMeasureResult> 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<ProductMeasureResult> ProductBindingList;
|
public DetectionData DetectData { get { return detectionData; } }
|
public delegate void DetectionProcesser(); //检查执行代理
|
public TextBox InfoInspect { get { return tbSystemInfo; } }
|
public ToolKit.FileToolkit.SerializeFileTool<ConfigStruct> sftConfig = new ToolKit.FileToolkit.SerializeFileTool<ConfigStruct>();
|
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<DateTime> _tempDownTimeList = new List<DateTime>();
|
|
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<ProductMeasureResult>();
|
ProductBindingList = new BindingList<ProductMeasureResult>(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;
|
|
Trace.TraceInformation("键盘事件已加载");
|
|
hcXyView.Focus();
|
}
|
|
bool allowBarcodeFlag = true;
|
CarrierBarcodeCtrl cBarcodeCtrl = null;
|
private void MainForm_KeyPress(object sender, KeyPressEventArgs e)
|
{
|
try
|
{
|
if (e.KeyChar == 27)
|
{
|
hcXyView.Focus();
|
}
|
else
|
{
|
if (allowBarcodeFlag)
|
{
|
Trace.TraceInformation($"键盘输入:{e.KeyChar}");
|
cBarcodeCtrl.AddChar(e.KeyChar);
|
}
|
else
|
{
|
Trace.TraceInformation($"当前不允许按键输入:{e.KeyChar}");
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
Trace.TraceError($"键盘事件异常:{ex.Message}");
|
}
|
}
|
#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<MeasureState> results = new List<MeasureState>() { 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<string, OPC.Item> 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<string, OPC.Item> 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)
|
{
|
try
|
{
|
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();
|
}
|
catch (Exception ex)
|
{
|
Trace.TraceError($"界面关闭异常:{ex.Message}");
|
}
|
finally
|
{
|
lock (CommonUtil.UploadDataLock)
|
{
|
//CommonUtil.UploadDoneHandle.WaitOne();
|
CommonUtil.UploadDataEnable = false;
|
System.Environment.Exit(0);
|
}
|
}
|
}
|
|
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)
|
{
|
//if (new ConfigPassword("").ShowDialog() == DialogResult.OK)
|
{
|
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;
|
}
|
}
|