using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.IO; using System.Threading; using HalconDotNet; using HalconTools; using PointGreyAndHalcon; using System.Diagnostics; using SuperDog; using Microsoft.Win32; namespace LLMF { public partial class frmMain : Form { #region 定义 //private LogHelper log = LogHelper.GetInstance(); string configPath = Application.StartupPath + "\\Config.xml"; ConfigStruct config; ToolKit.FileToolkit.SerializeFileTool sft = new ToolKit.FileToolkit.SerializeFileTool(); OPC opc; string camConfigPath = Application.StartupPath + "\\camConfig.xml"; PointGreyAndHalcon.PointGreyAndHalcon cam; PointGreyAndHalcon.PointGreyAndHalcon cam_left; HalconTool ht = new HalconTool(); HalconTool ht_left = new HalconTool(); RunStatus runStatus = RunStatus.Normal; RunStatus runStatus_left = RunStatus.Normal; double initAngle = 0; double finalAngle = 0; double initAngle_left = 0; double finalAngle_left = 0; bool booltemAngle = false; Stopwatch sw = new Stopwatch(); HTuple ImageHeight = new HTuple(); HTuple ImageWidth = new HTuple(); bool isLeftCameraOpen = false; bool isRightCameraOpen = false; bool isDoorOpen = false; //bool isCylinderLoosen = false; //bool isCylinder2Loosen = false; bool isUUTOut = false; bool isRealyOK = false; #endregion WelcomeUser m_WelcomeForm = new WelcomeUser(); //欢迎界面 public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { m_WelcomeForm.Show(); //显示欢迎界面 // m_WelcomeForm.ProgressBar1.Value = 0; //欢迎界面进度条 Application.DoEvents(); //处理所有的当前在消息队列中的Windows消息。 Log.WriteLog("App main form loading"); initConfig(); if (config.leftUsed) { Log.WriteLog("App main form load leftUsed"); tabPage2.Parent = null; initCam_Left(); initHalconTool_Left(); tabControl1.TabPages[0].Select(); } if (config.rightUsed) { Log.WriteLog("App main form load rightUsed"); tabPage1.Parent = null; initCam_Right(); initHalconTool(); tabControl1.TabPages[0].Select(); } initOPC(); m_WelcomeForm.Close();// m_WelcomeForm = null; //清空内存 } /// /// 建立Tag与Control之间的联系 /// private void MapTagToControl() { Log.WriteLog("MapTagToControl Enter"); opc.itemReadDict[InputTag.X_JinDian].control = lblX_JinDian; opc.itemReadDict[InputTag.Z_JinDian].control =lblZ_JinDian; opc.itemReadDict[InputTag.X_Alarm].control =lblX_Alarm; opc.itemReadDict[InputTag.Z_Alarm].control = lblZ_Alarm; opc.itemReadDict[InputTag.X_CW].control = lblX_CW; opc.itemReadDict[InputTag.X_CCW].control = lblX_CCW; opc.itemReadDict[InputTag.Z_CW].control = lblZ_CW; opc.itemReadDict[InputTag.Z_CCW].control =lblZ_CCW; opc.itemReadDict[InputTag.DingWei_CW].control = lblDingWei_CW; opc.itemReadDict[InputTag.DingWei_CCW].control = lblDingWei_CCW; opc.itemReadDict[InputTag.DingWei_JinDian].control = lblDingWei_JinDian; opc.itemReadDict[InputTag.DingWei_Alarm].control = lblDingWei_Alarm; opc.itemReadDict[InputTag.Start1].control = lblStart1; opc.itemReadDict[InputTag.Start2].control = lblStart2; opc.itemReadDict[InputTag.Reset].control = lblReset; opc.itemReadDict[InputTag.E_Stop].control = lblE_Stop; opc.itemReadDict[InputTag.SafeCurtain].control = lblSafeCurtain; opc.itemReadDict[InputTag.OpenJieJin].control = lblOpenJieJin; opc.itemReadDict[InputTag.CeBianQian].control =lblCeBianQian; opc.itemReadDict[InputTag.CeBianHou].control = lblCeBianHou; opc.itemReadDict[InputTag.WuGanQian].control = lblWuGanQian; opc.itemReadDict[InputTag.WuGanHou].control = lblWuGanHou; //OutPut I/O界面显示 opc.itemWriteDict[OutputTag.CeBianCylider].control = lblCeBianCylider; opc.itemWriteDict[OutputTag.ZhengBianCylider].control = lblZhengBianCylider; opc.itemWriteDict[OutputTag.WuGanCylider].control = lblWuGanCylider; opc.itemWriteDict[OutputTag.HuaTaiCylider].control = lblHuaTaiCylider; opc.itemWriteDict[OutputTag.SiFuPowerOn].control = lblSiFuPowerOn; opc.itemWriteDict[OutputTag.X_SRV_ON].control = lblX_SRV_ON; opc.itemWriteDict[OutputTag.Z_SRV_ON].control = lblZ_SRV_ON; opc.itemWriteDict[OutputTag.DingWei_SRV_ON].control = lblDingWei_SRV_ON; opc.itemWriteDict[OutputTag.Red].control = lblRed; opc.itemWriteDict[OutputTag.Yellow].control = lblYellow; opc.itemWriteDict[OutputTag.Green].control = lblGreen; opc.itemWriteDict[OutputTag.Buzzer].control = lblBuzzer; opc.itemWriteDict[OutputTag.Z_ShaChe].control = lblZ_ShaChe; opc.itemWriteDict[OutputTag.ForApple].control = lblForApple; opc.itemWriteDict[OutputTag.CameraLighto].control = lblCameraLighto; opc.itemWriteDict[OutputTag.WuGanCylider2].control = lblWuGanCylider2; Log.WriteLog("MapTagToControl Leave"); } #region 初始化 /// /// 加载配置文件 /// private void initConfig() { Log.WriteLog("InitConfig configpath: " + configPath); if (File.Exists(configPath)) { config = sft.GetConfig(configPath); } else { config = new ConfigStruct(); config.angleOffset = 0; config.opcConfig.itmHandleClient = 1234; config.opcConfig.serverIP = "127.0.0.1"; config.opcConfig.serverName = "KEPware.KEPServerEx.V4"; config.opcConfig.groupProperty.defaultGroupDeadband = 0; config.opcConfig.groupProperty.defaultGroupIsActive = true; config.opcConfig.groupProperty.isActive = true; config.opcConfig.groupProperty.isSubscribed = true; config.opcConfig.groupProperty.updateRate = 300; config.title = "LLMF V1.1"; config.cams = new CamerasConfig(); config.cams.SerialNumber = new uint[1]; config.cams.SerialNumber[0] = 11111111; config.password = "1"; config.minAngle = 119; config.maxAngle = 121; config.pulsePerDegree = 500; config.calAngle = 120; config.saveImage = true; sft.SetConfig(configPath, config); } this.tsplabelProductName.Text = config.title; this.txtCalAngle.Text = config.calAngle.ToString(); this.txtCalAngle_left.Text = config.calAngle.ToString(); this.ckbSaveImage.Checked = config.saveImage; List list = new List(); list.Add("inch13"); list.Add("inch15"); list.Add("inch16"); if (config.leftUsed) { cboSize_Left.DataSource = list; cboSize_Left.SelectedIndex = config.selectedSizeIndex; } if (config.rightUsed) { cboSize.DataSource = list; cboSize.SelectedIndex = config.selectedSizeIndex; } } /// /// 加载相机 /// private void initCam_Right() { Log.WriteLog("initCam_Right Enter"); cam = new PointGreyAndHalcon.PointGreyAndHalcon(); isRightCameraOpen = cam.OpenCamera(config.cams.SerialNumber[1]); cam.GrabImageDone += new GrabImageDoneDelegate(cam_GrabImageDone); Log.WriteLog("initCam_Right Leave"); } /// /// 加载HalconTool /// private void initHalconTool() { Log.WriteLog("initHalconTool Enter"); ht.LoadJobs(); ht.resultCreater.ListenEvent += new EventHandler(resultCreater_ListenEvent); Log.WriteLog("initHalconTool Leave"); } /// /// 加载OPC /// private void initOPC() { Log.WriteLog("initOPC Enter"); ConnectToOpc(); UpdateOPC(); MapTagToControl(); opc.listenEventCreater.ListenEvent += new EventHandler(listenEventCreater_ListenEvent); opc.listenEventCreater.ListenEvent += new EventHandler(listenOutTageEventCreater_ListenEvent); Log.WriteLog("initOPC Leave"); } #endregion #region 各种事件 void cam_GrabImageDone(string recData, HImage recImage) { Log.WriteLog("cam_GrabImageDone Enter"); Log.WriteLog("cam_GrabImageDone recData: " + runStatus.ToString()); lock (GetMutexLock_Right()) { Log.WriteLog("cam_GrabImageDone lock GetMutexLock_Right enter"); this.BeginInvoke(new MethodInvoker(delegate { Log.WriteLog("cam_GrabImageDone ui thread proccess begin"); switch (recData) { case "GrabSuccess": //cam.image = recImage; Log.WriteLog("cam_GrabImageDone GrabSuccess begin"); Log.WriteLog("cam_GrabImageDone GrabSuccess updateImage"); cam.UpdateImage(viewPort); Log.WriteLog("cam_GrabImageDone GrabSuccess save image file"); if (runStatus != RunStatus.continueCapture) { #region 保存图片 string FolderPath = "D:\\Image\\" + DateTime.Now.ToString("yyyyMMdd"); string fileName = txtSN.Text.Trim() + "-" + DateTime.Now.ToString("HHmmssffff"); if (!Directory.Exists(FolderPath)) Directory.CreateDirectory(FolderPath); cam.SaveImage(FolderPath, fileName); #endregion } ht.JobImage.Dispose(); Log.WriteLog("cam_GrabImageDone GrabSuccess getimage info"); ht.JobImage = recImage.CopyImage(); HOperatorSet.GetImageSize(ht.JobImage, out ImageWidth, out ImageHeight); ht.JobResults.Clear(); Log.WriteLog("cam_GrabImageDone GrabSuccess run JobLLMF"); ht.Run("JobLLMF"); Log.WriteLog("cam_GrabImageDone GrabSuccess end"); break; case "GrabFail": Log.WriteLog("cam_GrabImageDone GrabFail"); break; } recImage.Dispose(); Log.WriteLog("cam_GrabImageDone ui thread proccess end"); })); GC.Collect();//c#回收系统 } Log.WriteLog("cam_GrabImageDone Leave"); } void cam_left_GrabImageDone(string recData, HImage recImage) { Log.WriteLog("cam_left_GrabImageDone Enter"); Log.WriteLog("cam_left_GrabImageDone recData: " + runStatus.ToString()); lock (GetMutexLock_Left()) { Log.WriteLog("cam_left_GrabImageDone lock GetMutexLock_Left enter"); this.BeginInvoke(new MethodInvoker(delegate { Log.WriteLog("cam_left_GrabImageDone ui thread proccess begin"); switch (recData) { case "GrabSuccess": //cam_left.image = recImage.CopyImage(); Log.WriteLog("cam_left_GrabImageDone GrabSuccess begin"); Log.WriteLog("cam_left_GrabImageDone GrabSuccess updateImage"); cam_left.UpdateImage(viewPort_left); Log.WriteLog("cam_left_GrabImageDone GrabSuccess save image file"); if (runStatus_left != RunStatus.continueCapture) { #region 保存图片 string FolderPath = "D:\\Image\\" + DateTime.Now.ToString("yyyyMMdd") + "-left"; string fileName = txtSN.Text.Trim() + "-" + DateTime.Now.ToString("HHmmssffff"); if (!Directory.Exists(FolderPath)) Directory.CreateDirectory(FolderPath); cam_left.SaveImage(FolderPath, fileName); #endregion } ht_left.JobImage.Dispose(); Log.WriteLog("cam_left_GrabImageDone GrabSuccess getimage info"); ht_left.JobImage = recImage.CopyImage(); HOperatorSet.GetImageSize(ht_left.JobImage, out ImageWidth, out ImageHeight); ht_left.JobResults.Clear(); Log.WriteLog("cam_left_GrabImageDone GrabSuccess run JobLLMF"); ht_left.Run("JobLLMF"); Log.WriteLog("cam_left_GrabImageDone GrabSuccess end"); break; case "GrabFail": Log.WriteLog("cam_left_GrabImageDone GrabFail"); break; } recImage.Dispose(); Log.WriteLog("cam_left_GrabImageDone ui thread proccess end"); })); GC.Collect(); } Log.WriteLog("cam_left_GrabImageDone Leave"); } void resultCreater_ListenEvent(object sender, HalconTools.ListenEventArgs e) { Log.WriteLog("resultCreater_ListenEvent Enter"); this.BeginInvoke(new MethodInvoker(delegate { Log.WriteLog("resultCreater_ListenEvent UI, data:" + e.IData.Data.ToString()+ ", runStatus:" + runStatus); string s = e.IData.Data.ToString(); if (!s.Equals("JobLLMF_Done")) { if (runStatus == RunStatus.firstCapture || runStatus == RunStatus.adjustMent) { Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.CaptureFail_Right true begin"); opc.Write(OutputTag.CaptureFail_Right, true); Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.CaptureFail_Right true end"); return; } } Log.WriteLog("resultCreater_ListenEvent UI, jobresults count: " + ht.JobResults.Count.ToString()); JobResult r = new JobResult(); if (ht.JobResults.Count > 0) { r = ht.JobResults[0].results[0]; string logstr = (null == r.fitLineResult) ? "null" : "exists"; Log.WriteLog("resultCreater_ListenEvent UI, jobresults count r.fitLineResult:" + logstr); if (r.fitLineResult == null) { ShowDisplayAngle("-"); return; } } else { ShowDisplayAngle("-"); return; } Log.WriteLog("resultCreater_ListenEvent UI, DrawLine"); DrawLine(viewPort, r.fitLineResult); double tmpAngle = 180 - ht.AngleLine2HorizontialAxis(r.fitLineResult) + config.angleOffset; Log.WriteLog("resultCreater_ListenEvent UI, ShowDisplayAngle angle: " + tmpAngle.ToString()); ShowDisplayAngle(tmpAngle.ToString("0.00")); if(booltemAngle==true) { Log.WriteLog("Camera Get The Alignment tmpAangle"+tmpAngle.ToString()); } if (runStatus == RunStatus.calibration) //标定 { this.btnCalibration.Enabled = true; return; } if (runStatus == RunStatus.continueCapture) //连续拍照 { return; } if (runStatus == RunStatus.firstCapture || runStatus == RunStatus.adjustMent) { if (runStatus == RunStatus.firstCapture) { initAngle = tmpAngle; //记录初始角度 //Janhans 增加界面角度log记载的Flage 变量 booltemAngle booltemAngle = true; Log.WriteLog("Camera Get The InitAngle "+initAngle.ToString()); } if (tmpAngle >= config.minAngle && tmpAngle <= config.maxAngle) { string str; finalAngle = tmpAngle; sw.Stop(); Log.WriteLog("Camera Get The FinalAngle" + finalAngle); str=sw.ElapsedMilliseconds.ToString(); Log.WriteLog("Aangle_Alignment_Time"+str+"ms"); sw.Restart(); Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_OK true begin"); opc.Write(OutputTag.Move_OK, true); Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_OK true end"); Log.WriteLog("-------角度调整完成,继电器上电, PC给出信号至Macmin-----"); Log.WriteLog("--------Relay turn on------"); isRealyOK = true; Log.WriteLog("RunEnd Enter"); txtResultInitAngle.Text = initAngle.ToString("0.00"); txtResultFinalAngle.Text = finalAngle.ToString("0.00"); booltemAngle = false;//界面角度log记载的Flage 变量 booltemAngle //RunEnd(); //Log.WriteLog("resultCreater_ListenEvent UI, RunEnd"); return; } //告诉PLC走多少 int tmpDis = (int)(((config.maxAngle + config.minAngle) / 2 - tmpAngle) * config.pulsePerDegree); Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_Distance: " + tmpDis.ToString()); opc.Write(OutputTag.Move_Distance, tmpDis); Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move begin"); Thread.Sleep(100); opc.Write(OutputTag.Move, true); Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move end"); } })); Log.WriteLog("resultCreater_ListenEvent Leave"); } void resultCreater_left_ListenEvent(object sender, HalconTools.ListenEventArgs e) { Log.WriteLog("resultCreater_left_ListenEvent Enter"); this.BeginInvoke(new MethodInvoker(delegate { Log.WriteLog("resultCreater_left_ListenEvent UI, data:"+ e.IData.Data.ToString() + " runStatus: " + runStatus); string s = e.IData.Data.ToString(); if (!s.Equals("JobLLMF_Done")) { if (runStatus_left == RunStatus.firstCapture || runStatus_left == RunStatus.adjustMent) { Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.CaptureFail_left true begin"); opc.Write(OutputTag.CaptureFail_left, true); Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.CaptureFail_left true end"); return; } } JobResult r = new JobResult(); Log.WriteLog("resultCreater_left_ListenEvent UI, jobresults count:" + ht_left.JobResults.Count.ToString()); if (ht_left.JobResults.Count > 0) { r = ht_left.JobResults[0].results[0]; string logstr = (null == r.fitLineResult) ? "null" : "exists"; Log.WriteLog("resultCreater_left_ListenEvent UI, jobresults count r.fitLineResult: " + logstr); if (r.fitLineResult == null) { ShowDisplayAngle_left("-"); return; } } else { ShowDisplayAngle_left("-"); return; } Log.WriteLog("resultCreater_left_ListenEvent UI, DrawLine"); DrawLine(viewPort_left, r.fitLineResult); double tmpAngle = 180 - ht_left.AngleLine2HorizontialAxis(r.fitLineResult) + config.angleOffset_Left; Log.WriteLog("resultCreater_left_ListenEvent UI, ShowDisplayAngle angle: " + tmpAngle.ToString()); ShowDisplayAngle_left(tmpAngle.ToString("0.00")); if (runStatus_left == RunStatus.calibration) //标定 { this.btnCalibration_left.Enabled = true; return; } if (runStatus_left == RunStatus.continueCapture) //连续拍照 { return; } if (runStatus_left == RunStatus.firstCapture || runStatus_left == RunStatus.adjustMent) { if (runStatus_left == RunStatus.firstCapture) { initAngle_left = tmpAngle; //记录初始角度 } if (tmpAngle >= config.minAngle && tmpAngle <= config.maxAngle) { finalAngle_left = tmpAngle; Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_OK_left true begin"); opc.Write(OutputTag.Move_OK_left, true); Log.WriteLog("-------角度调整完成,PC给出继电器信号至Macmin-----"); Log.WriteLog("--------Relay turn on------"); Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_OK_left true end"); RunEnd_Left(); Log.WriteLog("resultCreater_left_ListenEvent UI, RunEnd_Left"); return; } //告诉PLC走多少 int tmpDis = (int)(((config.maxAngle + config.minAngle) / 2 - tmpAngle) * config.pulsePerDegree_Left); Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_Distance_left:" + tmpDis.ToString()); opc.Write(OutputTag.Move_Distance_left, tmpDis); Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_Distance_left begin"); Thread.Sleep(100); opc.Write(OutputTag.Move_left, true); Log.WriteLog("resultCreater_left_ListenEvent UI, opc write OutputTag.Move_left end"); } })); Log.WriteLog("resultCreater_left_ListenEvent Leave"); } void listenEventCreater_ListenEvent(object sender, EventTool.ListenEventArgs e) { // Log.WriteLog("listenEventCreater_ListenEvent Enter"); this.BeginInvoke(new MethodInvoker(delegate { OPC.Item item = (OPC.Item)e.IData.Data; string logstr = (null == item.value) ? "null" : item.value.ToString(); Log.WriteLog("listenEventCreater_ListenEvent item.name:" + item.name + " item.value: " + logstr); switch (item.name) { case InputTag.Capture: if ((bool)item.value) { if (!Effective()) { break; } if (runStatus == RunStatus.Normal) { runStatus = RunStatus.firstCapture; } else if (runStatus == RunStatus.firstCapture) { runStatus = RunStatus.adjustMent; } Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture cam.GrabImage begin"); cam.GrabImage(""); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture cam.GrabImage end"); } break; case InputTag.Position: Log.WriteLog("listenEventCreater_ListenEvent InputTag.Position"); tsslPosition.Text = ((int)item.value).ToString(); break; case InputTag.Start: if ((bool)item.value) { Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start StopRightCamera begin"); Log.WriteLog("------双手启动完成,产品送料开始,相机准备拍照----"); //双手启动,产品送料开始 sw.Start(); StopRightCamera(); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start opc write OutputTag.Start"); opc.Write(OutputTag.Start, false); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start initTest"); initTest(); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start ShowDisplay"); ShowDisplay("开始检测", Color.Blue, Color.Lime); } break; case InputTag.Capture_left: if ((bool)item.value) { if (!Effective()) { break; } if (runStatus_left == RunStatus.Normal) { runStatus_left = RunStatus.firstCapture; } else if (runStatus_left == RunStatus.firstCapture) { runStatus_left = RunStatus.adjustMent; } Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture_left cam_left.GrabImage begin"); cam_left.GrabImage(""); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Capture_left cam_left.GrabImage end"); } break; case InputTag.Position_left: Log.WriteLog("listenEventCreater_ListenEvent InputTag.Position_left"); tsslPosition_left.Text = ((int)item.value).ToString(); break; case InputTag.Start_left: if ((bool)item.value) { Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left StopLeftCamera begin"); Log.WriteLog("------双手启动完成,产品送料开始,相机准备拍照----"); StopLeftCamera(); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left opc write OutputTag.Start_left"); opc.Write(OutputTag.Start_left, false); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left initTest_Left"); initTest_Left(); Log.WriteLog("listenEventCreater_ListenEvent InputTag.Start_left ShowDisplay_left"); ShowDisplay_left("开始检测", Color.Blue, Color.Lime); } break; case InputTag.Alarm: Log.WriteLog("listenEventCreater_ListenEvent InputTag.Alarm"); AlarmDisplay((int)item.value, this.tsslAlarm); break; case InputTag.Alarm_left: Log.WriteLog("listenEventCreater_ListenEvent InputTag.Alarm_left"); AlarmDisplay((int)item.value, this.tsslAlarm_Left); break; } })); // Log.WriteLog("listenEventCreater_ListenEvent Leave"); } void listenOutTageEventCreater_ListenEvent(object sender, EventTool.ListenEventArgs e) { // Log.WriteLog("listenEventCreater_ListenEvent Enter"); this.BeginInvoke(new MethodInvoker(delegate { OPC.Item item = (OPC.Item)e.IData.Data; string logstr = (null == item.value) ? "null" : item.value.ToString(); Log.WriteLog("listenEventCreater_ListenEvent item.name:" + item.name + " item.value: " + logstr); switch (item.name) { case OutputTag.ForApple: if (config.rightUsed == true) { btnDisplay.Text = (bool)item.value ? "继电器上电并保持" : "继电器断电"; } else { btnDisplay_left.Text = (bool)item.value ? "继电器上电并保持" : "继电器断电"; } if ((bool)item.value && isRealyOK) { //Log.WriteLog("--------角度调整完成,继电器上电------"); } else if (!((bool)item.value) && isRealyOK) { Log.WriteLog("--------产品检测完成,OP复位操作,继电器断电------"); Log.WriteLog("--------Relay turn off------"); isRealyOK = false; Log.WriteLog("--------产品检测结束------"); Thread.Sleep(3000); Log.WriteLog("resultCreater_ListenEvent UI, opc write OutputTag.Move_OK true end"); RunEnd(); Log.WriteLog("resultCreater_ListenEvent UI, RunEnd"); } break; } })); // Log.WriteLog("listenEventCreater_ListenEvent Leave"); } #endregion #region OPC操作 /// /// 连接到OPC Server /// 保持此前的手动/自动模式 /// private void ConnectToOpc() { Log.WriteLog("ConnectToOpc Enter"); opc = new OPC(config.opcConfig); if (opc.Connect()) { Log.WriteLog("ConnectToOpc connect succeed"); tsslOPC.Text = "OPC Connection Succeed !"; // 进行如下操作 opc.CreateGroup(); // 创建Group //PlcRunMode(RunMode.Manual); } else { Log.WriteLog("ConnectToOpc connect fail"); tsslOPC.Text = "OPC Connection Failed !"; /* 连接不上时的异常处理 */ } Log.WriteLog("ConnectToOpc Leave"); } /// /// 遍历OPC所有点位,得到值 /// private void UpdateOPC() { Log.WriteLog("UpdateOPC Enter"); Thread.Sleep(5000); foreach (KeyValuePair item in opc.itemReadDict) { object status = new Object(); opc.ReadOneItem_Wrapper(item.Key, ref status); string logstr = (null == item.Value) ? "null" : item.Value.ToString(); Log.WriteLog("UpdateOPC itemReadDict key: " + item.Key + " value:" + logstr); switch (item.Key) { case InputTag.Capture : break; case InputTag.Position: tsslPosition.Text = ((int)item.Value.value).ToString(); break; case InputTag.Position_left: tsslPosition_left.Text = ((int)item.Value.value).ToString(); break; case InputTag.Alarm: //AlarmDisplay((int)item.Value.value); AlarmDisplay((int)item.Value.value, this.tsslAlarm); break; case InputTag.Alarm_left: AlarmDisplay((int)item.Value.value, this.tsslAlarm_Left); break; } } foreach (KeyValuePair item in opc.itemWriteDict) { object status = new Object(); opc.ReadOneItem_Wrapper(item.Key, ref status); string logstr =(null == item.Value) ? "null" : item.Value.ToString(); Log.WriteLog("UpdateOPC itemWriteDict key: " + item.Key + " value:" + logstr); switch (item.Key) { case OutputTag.Move: break; case OutputTag.CameraLight: ckbCameraLight.Checked = (bool)item.Value.value; ckbCameraLight.Text = ckbCameraLight.Checked ? "光源关" : "光源开"; break; case OutputTag.CameraLight_left: ckbCameraLight_left.Checked = (bool)item.Value.value; ckbCameraLight_left.Text = ckbCameraLight_left.Checked ? "光源关" : "光源开"; break; //case OutputTag.ForApple: // if (config.rightUsed == true ) // { // btnDisplay.Text = (bool)item.Value.value ? "继电器上电" : "继电器断电"; // } // else // { // btnDisplay_left.Text = (bool)item.Value.value ? "继电器上电" : "继电器断电"; // } // if ((bool)item.Value.value && isRealyOK) // { // Log.WriteLog("--------角度调整完成,继电器上电------"); // } // if (!((bool)item.Value.value) && isRealyOK) // { // Log.WriteLog("--------产品检测完成,OP复位操作,继电器断电------"); // } // isRealyOK = false; // break; } } Log.WriteLog("UpdateOPC Leave"); } #endregion #region 各种方法 /// /// 初始化新的检测 /// private void initTest() { runStatus = RunStatus.Normal; txtResultInitAngle.Text = ""; txtResultFinalAngle.Text = ""; } /// /// 左初始化新的检测 /// private void initTest_Left() { runStatus_left = RunStatus.Normal; txtResultInitAngle.Text = ""; txtResultFinalAngle.Text = ""; } /// /// 报警信息 /// /// 编号 private void AlarmDisplay(int k) { tsslAlarm.ForeColor = (k == 0) ? Color.Black : Color.Red; switch (k) { case 0: tsslAlarm.Text = "无报警!"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 1: tsslAlarm.Text = "调整伺服电机驱动器报警"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 3: tsslAlarm.Text = "调整伺服脉冲异常"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 5: tsslAlarm.Text = "相机抓取角度失败"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 11: tsslAlarm.Text = "送料伺服电机驱动器报警"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 12: tsslAlarm.Text = "门伺服电机驱动器报警"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 13: tsslAlarm.Text = "送料伺服脉冲异常"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 14: tsslAlarm.Text = "门伺服脉冲异常"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 20: tsslAlarm.Text = "产品初始角度未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 21: tsslAlarm.Text = "侧边气缸夹紧未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 22: tsslAlarm.Text = "正边气缸夹紧未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 23: tsslAlarm.Text = "无杆气缸推送未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 24: tsslAlarm.Text = "滑台气缸退位未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 26: tsslAlarm.Text = "无杆气缸回初始位未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 27: tsslAlarm.Text = "侧边气缸回初始位未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 28: tsslAlarm.Text = "正边气缸回初始位未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 29: tsslAlarm.Text = "滑台气缸回初始位未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 30: tsslAlarm.Text = "光幕触发报警,请确认无异常状态并复位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 31: tsslAlarm.Text = "无杆气缸回原点未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 32: tsslAlarm.Text = "侧边气缸回原点未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 33: tsslAlarm.Text = "正边气缸回原点未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 34: tsslAlarm.Text = "滑台气缸回原点未到位"; Log.WriteLog(tsslAlarm.Text.ToString()); break; case 35: tsslAlarm.Text = "调整伺服触发极限位,请检查产品打开的初始角度"; sw.Stop(); sw.Reset(); Log.WriteLog(tsslAlarm.Text.ToString()); break; case 36: tsslAlarm.Text = "定位相机光源未打开,请检查相机光源状态并急停复位"; sw.Stop(); sw.Reset(); Log.WriteLog(tsslAlarm.Text.ToString()); break; case 37: tsslAlarm.Text = "相机未拍照,请重启程序或检查PLC状态"; sw.Stop(); sw.Reset(); Log.WriteLog(tsslAlarm.Text.ToString()); break; case 38: tsslAlarm.Text = "初始化未完成,请急停复位并检查程序工作状态"; sw.Reset(); Log.WriteLog(tsslAlarm.Text.ToString()); break; } } /// /// 报警信息 /// /// 编号 private void AlarmDisplay(int k, ToolStripStatusLabel alarm) { alarm.ForeColor = (k == 0) ? Color.Black : Color.Red; switch (k) { case 0: alarm.Text = "无报警!"; Log.WriteLog(alarm.Text.ToString()); break; case 1: alarm.Text = "调整伺服电机驱动器报警"; Log.WriteLog(alarm.Text.ToString()); break; case 3: alarm.Text = "调整伺服脉冲异常"; Log.WriteLog(alarm.Text.ToString()); break; case 5: alarm.Text = "相机抓取角度失败,请检查产品LCD边框是否贴有异物"; Log.WriteLog(alarm.Text.ToString()); break; case 7: alarm.Text = "产品初始角度过大,请急停复位后重新打开产品再次测量"; Log.WriteLog(alarm.Text.ToString()); if (alarm.Name.Contains("_Left")) { SaveinitAngle_Left(); } else { SaveinitAngle_Right(); } break; case 10: alarm.Text = "急停中,请复位!"; Log.WriteLog(alarm.Text.ToString()); break; case 11: alarm.Text = "送料伺服电机驱动器报警"; Log.WriteLog(alarm.Text.ToString()); break; case 12: alarm.Text = "门伺服电机驱动器报警"; Log.WriteLog(alarm.Text.ToString()); break; case 13: alarm.Text = "送料伺服脉冲异常"; Log.WriteLog(alarm.Text.ToString()); break; case 14: alarm.Text = "门伺服脉冲异常"; Log.WriteLog(alarm.Text.ToString()); break; case 20: alarm.Text = "产品初始角度未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 21: alarm.Text = "侧边气缸夹紧未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 22: alarm.Text = "正边气缸夹紧未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 23: alarm.Text = "无杆气缸推送未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 24: alarm.Text = "滑台气缸退位未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 26: alarm.Text = "无杆气缸回初始位未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 27: alarm.Text = "侧边气缸回初始位未到位"; break; case 28: alarm.Text = "正边气缸回初始位未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 29: alarm.Text = "滑台气缸回初始位未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 30: alarm.Text = "光幕触发报警,请确认无异常状态并复位"; Log.WriteLog(alarm.Text.ToString()); break; case 31: alarm.Text = "无杆气缸回原点未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 32: alarm.Text = "侧边气缸回原点未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 33: alarm.Text = "正边气缸回原点未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 34: alarm.Text = "滑台气缸回原点未到位"; Log.WriteLog(alarm.Text.ToString()); break; case 35: alarm.Text = "调整伺服触发极限位,请检查产品打开的初始角度"; sw.Stop(); sw.Reset(); Log.WriteLog(alarm.Text.ToString()); break; case 36: alarm.Text = "定位相机光源未打开,请检查相机光源状态并急停复位"; sw.Stop(); sw.Reset(); Log.WriteLog(alarm.Text.ToString()); break; case 37: alarm.Text = "相机未拍照,请重启程序或检查PLC状态"; sw.Stop(); sw.Reset(); Log.WriteLog(alarm.Text.ToString()); break; case 38: alarm.Text = "初始化未完成,请急停复位并检查程序工作状态"; sw.Stop(); sw.Reset(); Log.WriteLog(alarm.Text.ToString()); break; } } /// /// 按钮显示 /// /// 内容 /// 文字颜色 /// 背景色 private void ShowDisplay(string s, Color foreColor, Color backColor) { btnDisplay.Text = s; btnDisplay.ForeColor = foreColor; btnDisplay.BackColor = backColor; } /// /// 左按钮显示 /// /// 内容 /// 文字颜色 /// 背景色 private void ShowDisplay_left(string s, Color foreColor, Color backColor) { btnDisplay_left.Text = s; btnDisplay_left.ForeColor = foreColor; btnDisplay_left.BackColor = backColor; } /// /// 再控件上画直线 /// /// /// private void DrawLine(HWindowControl viewport, FitLineResult line) { HOperatorSet.SetColor(viewport.HalconWindow, "green"); HOperatorSet.SetLineWidth(viewport.HalconWindow, 2); HOperatorSet.SetPart(viewport.HalconWindow, 0, 0, ImageHeight - 1, ImageWidth - 1); HOperatorSet.DispLine(viewport.HalconWindow, line.mRowStart, line.mColumnStart, line.mRowEnd, line.mColumnEnd); } /// /// 保存数据 /// private void SaveResult() { Log.WriteLog("SaveResult Enter"); string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd"); if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); filePath += "\\result.csv"; string tmpS = ""; if (!File.Exists(filePath)) { tmpS = "SN,time,initAngle,finalAngle,\r\n"; File.AppendAllText(filePath, tmpS); } tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle.ToString() + "," + finalAngle.ToString() + ",\r\n"; File.AppendAllText(filePath, tmpS); Log.WriteLog("SaveResult Leave"); } /// /// 右初始角度保存数据 /// private void SaveinitAngle_Right() { Log.WriteLog("SaveinitAngle_Right Enter"); string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd"); if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); filePath += "\\result.csv"; string tmpS = ""; if (!File.Exists(filePath)) { tmpS = "SN,time,initAngle,finalAngle,\r\n"; File.AppendAllText(filePath, tmpS); } tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle.ToString() + "," + "" + ",\r\n"; File.AppendAllText(filePath, tmpS); Log.WriteLog("SaveinitAngle_Right Leave"); } /// /// 左保存数据 /// private void SaveResult_Left() { Log.WriteLog("SaveResult_Left Enter"); string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd") + "-Left"; if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); filePath += "\\result.csv"; string tmpS = ""; if (!File.Exists(filePath)) { tmpS = "SN,time,initAngle,finalAngle,\r\n"; File.AppendAllText(filePath, tmpS); } tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle_left.ToString() + "," + finalAngle_left.ToString() + ",\r\n"; File.AppendAllText(filePath, tmpS); Log.WriteLog("SaveResult_Left Leave"); } /// /// 左初始角度保存数据 /// private void SaveinitAngle_Left() { Log.WriteLog("SaveinitAngle_Left Enter"); string filePath = "D:\\Data\\" + DateTime.Now.ToString("yyyyMMdd") + "-Left"; if (!Directory.Exists(filePath)) Directory.CreateDirectory(filePath); filePath += "\\result.csv"; string tmpS = ""; if (!File.Exists(filePath)) { tmpS = "SN,time,initAngle,finalAngle,\r\n"; File.AppendAllText(filePath, tmpS); } tmpS = txtSN.Text.Trim() + "," + DateTime.Now.ToString("HH:mm:ss") + "," + initAngle_left.ToString() + "," + "" + ",\r\n"; File.AppendAllText(filePath, tmpS); Log.WriteLog("SaveinitAngle_Left Leave"); } /// /// 运算结束操作 /// private void RunEnd() { Log.WriteLog("RunEnd Enter"); runStatus = RunStatus.Normal; SaveResult(); txtResultInitAngle.Text = initAngle.ToString("0.00"); txtResultFinalAngle.Text = finalAngle.ToString("0.00"); ShowDisplay("视觉检测完成", Color.Blue, Color.Lime); Log.WriteLog("RunEnd Leave"); } /// /// 左运算结束操作 /// private void RunEnd_Left() { Log.WriteLog("RunEnd_Left Enter"); runStatus_left = RunStatus.Normal; SaveResult_Left(); txtResultInitAngle.Text = initAngle_left.ToString("0.00"); txtResultFinalAngle.Text = finalAngle_left.ToString("0.00"); ShowDisplay("视觉检测完成", Color.Blue, Color.Lime); Log.WriteLog("RunEnd_Left Leave"); } /// /// 显示角度 /// /// 角度 private void ShowDisplayAngle(string s) { this.lblAngleDisplay.Text = s; } /// /// 显示左角度 /// /// 角度 private void ShowDisplayAngle_left(string s) { this.lblAngleDisplay_left.Text = s; } #endregion #region 控件事件 private void btnHalconTool_Click(object sender, EventArgs e) { Log.WriteLog("btnHalconTool_Click Enter"); frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) { HalconTools.frmMain main = new HalconTools.frmMain(); main.ShowDialog(); if (config.rightUsed) ht.LoadJobs(); if (config.leftUsed) ht_left.LoadJobs(); } Log.WriteLog("btnHalconTool_Click Leave"); } private void btnHalconTool_left_Click(object sender, EventArgs e) { Log.WriteLog("btnHalconTool_left_Click Enter"); frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) { HalconTools.frmMain main = new HalconTools.frmMain(); main.ShowDialog(); if (config.rightUsed) ht.LoadJobs(); if (config.leftUsed) ht_left.LoadJobs(); } Log.WriteLog("btnHalconTool_left_Click Leave"); } private void btnCapture_Click(object sender, EventArgs e) { Log.WriteLog("btnCapture_Click Enter"); runStatus = RunStatus.calibration; cam.GrabImage(""); Log.WriteLog("btnCapture_Click Leave"); } private void btnCapture_left_Click(object sender, EventArgs e) { Log.WriteLog("btnCapture_left_Click Enter"); runStatus_left = RunStatus.calibration; cam_left.GrabImage(""); Log.WriteLog("btnCapture_left_Click Leave"); } private void btnCalibration_Click(object sender, EventArgs e) { Log.WriteLog("btnCalibration_Click Enter"); double calAngle, nowAngle; try { calAngle = Convert.ToDouble(txtCalAngle.Text); nowAngle = Convert.ToDouble(lblAngleDisplay.Text); } catch (Exception ex) { Log.WriteLog("btnCalibration_Click Exception Leave"); MessageBox.Show("角度检测错误或标定角度输入错误!"); return; } config.angleOffset = calAngle - (nowAngle - config.angleOffset); sft.SetConfig(configPath, config); MessageBox.Show("标定成功"); runStatus = RunStatus.Normal; btnCalibration.Enabled = false; gbxCalibration.Enabled = false; Log.WriteLog("btnCalibration_Click Leave"); } private void btnCalibration_left_Click(object sender, EventArgs e) { Log.WriteLog("Error: btnCalibration_left_Click Enter"); double calAngle, nowAngle; try { calAngle = Convert.ToDouble(txtCalAngle_left.Text); nowAngle = Convert.ToDouble(lblAngleDisplay_left.Text); } catch (Exception ex) { Log.WriteLog("Error: btnCalibration_left_Click Exception Leave"); MessageBox.Show("角度检测错误或标定角度输入错误!"); return; } config.angleOffset_Left = calAngle - (nowAngle - config.angleOffset_Left); sft.SetConfig(configPath, config); MessageBox.Show("标定成功"); runStatus_left = RunStatus.Normal; btnCalibration_left.Enabled = false; gbxCalibration_left.Enabled = false; Log.WriteLog("btnCalibration_left_Click Leave"); } private void btnCanCalibration_Click(object sender, EventArgs e) { Log.WriteLog("btnCanCalibration_Click Enter"); if (gbxCalibration.Enabled == false) { frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) gbxCalibration.Enabled = true; } else { gbxCalibration.Enabled = false; } Log.WriteLog("btnCanCalibration_Click Leave"); } private void btnCanCalibration_left_Click(object sender, EventArgs e) { Log.WriteLog("btnCanCalibration_left_Click Enter"); if (gbxCalibration_left.Enabled == false) { frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) gbxCalibration_left.Enabled = true; } else { gbxCalibration_left.Enabled = false; } Log.WriteLog("btnCanCalibration_left_Click Leave"); } private void tVideo_Tick(object sender, EventArgs e) { Log.WriteLog("tVideo_Tick Enter"); cam.GrabImage(""); Log.WriteLog("tVideo_Tick Leave"); } private void tVideo_left_Tick(object sender, EventArgs e) { Log.WriteLog("tVideo_left_Tick Enter"); cam_left.GrabImage(""); Log.WriteLog("tVideo_left_Tick Leave"); } private void btnContinueCapture_Click(object sender, EventArgs e) { Log.WriteLog("btnContinueCapture_Click Enter"); runStatus = RunStatus.continueCapture; tVideo.Enabled = true; this.btnContinueCapture.Enabled = false; this.btnStopCapture.Enabled = true; Log.WriteLog("btnContinueCapture_Click Leave"); } private void btnContinueCapture_left_Click(object sender, EventArgs e) { Log.WriteLog("btnContinueCapture_left_Click Enter"); runStatus_left = RunStatus.continueCapture; tVideo_left.Enabled = true; this.btnContinueCapture_left.Enabled = false; this.btnStopCapture_left.Enabled = true; Log.WriteLog("btnContinueCapture_left_Click Leave"); } private void btnStopCapture_Click(object sender, EventArgs e) { Log.WriteLog("btnStopCapture_Click Enter"); StopRightCamera(); Log.WriteLog("btnStopCapture_Click Leave"); } private void StopRightCamera() { Log.WriteLog("StopRightCamera Enter"); tVideo.Enabled = false; runStatus = RunStatus.Normal; this.btnContinueCapture.Enabled = true; this.btnStopCapture.Enabled = false; Log.WriteLog("StopRightCamera Leave"); } private void btnStopCapture_left_Click(object sender, EventArgs e) { Log.WriteLog("btnStopCapture_left_Click Enter"); StopLeftCamera(); Log.WriteLog("btnStopCapture_left_Click Leave"); } private void StopLeftCamera() { Log.WriteLog("StopLeftCamera Enter"); tVideo_left.Enabled = false; runStatus_left = RunStatus.Normal; this.btnContinueCapture_left.Enabled = true; this.btnStopCapture_left.Enabled = false; Log.WriteLog("StopLeftCamera Leave"); } private void btnTestMove_Click(object sender, EventArgs e) { Log.WriteLog("btnTestMove_Click Enter"); int tmpD = Convert.ToInt32(txtTestPulse.Text); opc.Write(OutputTag.Move_Distance, tmpD); Thread.Sleep(100); opc.Write(OutputTag.Move_Test, true); Log.WriteLog("btnTestMove_Click Leave"); } private void btnTestMove_left_Click(object sender, EventArgs e) { Log.WriteLog("btnTestMove_left_Click Enter"); int tmpD = Convert.ToInt32(txtTestPulse_left.Text); opc.Write(OutputTag.Move_Distance_left, tmpD); Thread.Sleep(100); opc.Write(OutputTag.Move_Test_left, true); Log.WriteLog("btnTestMove_left_Click Leave"); } private void cbxTest_CheckedChanged(object sender, EventArgs e) { Log.WriteLog("cbxTest_CheckedChanged Enter"); if (cbxTest.Checked) { Log.WriteLog("cbxTest_CheckedChanged cbxTest.Checked = true"); frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) { gbxTest.Enabled = cbxTest.Checked; runStatus = RunStatus.testMent; } } else { Log.WriteLog("cbxTest_CheckedChanged cbxTest.Checked = false"); gbxTest.Enabled = cbxTest.Checked; tVideo.Enabled = false; runStatus = RunStatus.Normal; } Log.WriteLog("cbxTest_CheckedChanged Leave"); } private void cbxTest_left_CheckedChanged(object sender, EventArgs e) { Log.WriteLog("cbxTest_left_CheckedChanged Enter"); if (cbxTest_left.Checked) { Log.WriteLog("cbxTest_CheckedChanged cbxTest_left.Checked = true"); frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) { gbxTest_left.Enabled = cbxTest_left.Checked; runStatus_left = RunStatus.testMent; } } else { Log.WriteLog("cbxTest_left_CheckedChanged cbxTest_left.Checked = false"); gbxTest_left.Enabled = cbxTest_left.Checked; tVideo_left.Enabled = false; runStatus_left = RunStatus.Normal; } Log.WriteLog("cbxTest_left_CheckedChanged Leave"); } private void btnConfig_Click(object sender, EventArgs e) { Log.WriteLog("btnConfig_Click Enter"); frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) { frmConfig tmpCon = new frmConfig(opc, config,"Right"); tmpCon.ShowDialog(); } Log.WriteLog("btnConfig_Click Leave"); } private void btnConfig_left_Click(object sender, EventArgs e) { Log.WriteLog("btnConfig_left_Click Enter"); frmPassword frmp = new frmPassword(config.password); frmp.ShowDialog(); if (frmp.isOK) { frmConfig tmpCon = new frmConfig(opc, config,"Left"); tmpCon.ShowDialog(); } Log.WriteLog("btnConfig_left_Click Leave"); } private void ckbCameraLight_CheckedChanged(object sender, EventArgs e) { Log.WriteLog("ckbCameraLight_CheckedChanged Enter"); opc.Write(OutputTag.CameraLight, ckbCameraLight.Checked); ckbCameraLight.Text = ckbCameraLight.Checked ? "光源关" : "光源开"; Log.WriteLog("ckbCameraLight_CheckedChanged Leave"); } private void ckbCameraLight_left_CheckedChanged(object sender, EventArgs e) { Log.WriteLog("ckbCameraLight_left_CheckedChanged Enter"); opc.Write(OutputTag.CameraLight_left, ckbCameraLight_left.Checked); ckbCameraLight_left.Text = ckbCameraLight_left.Checked ? "光源关" : "光源开"; Log.WriteLog("ckbCameraLight_left_CheckedChanged Leave"); } private void btnORI_Click(object sender, EventArgs e) { Log.WriteLog("btnORI_Click Enter"); opc.Write(OutputTag.ORI, true); Log.WriteLog("btnORI_Click Leave"); } private void btnORI_left_Click(object sender, EventArgs e) { Log.WriteLog("btnORI_left_Click Enter"); opc.Write(OutputTag.ORI_left, true); Log.WriteLog("btnORI_left_Click Leave"); } #endregion private static System.Threading.Mutex _mutex_Right; private System.Threading.Mutex GetMutexLock_Right() { System.Threading.Interlocked.CompareExchange(ref _mutex_Right, new System.Threading.Mutex(), null); return _mutex_Right; } private static System.Threading.Mutex _mutex_Left; private System.Threading.Mutex GetMutexLock_Left() { System.Threading.Interlocked.CompareExchange(ref _mutex_Left, new System.Threading.Mutex(), null); return _mutex_Left; } #region 左 private void button2_Click(object sender, EventArgs e) { opc.Write(OutputTag.Manual_left, true); } private void button4_Click(object sender, EventArgs e) { opc.Write(OutputTag.qigangjiajin_left, true); } private void button5_Click(object sender, EventArgs e) { opc.Write(OutputTag.qigangsongkai_left, true); } private void btnCloseDor_Click(object sender, EventArgs e) { opc.Write(OutputTag.guanmen_left, true); } private void btnOpenDor_Click(object sender, EventArgs e) { opc.Write(OutputTag.kaimen_left, true); } private void button1_Click(object sender, EventArgs e) { opc.Write(OutputTag.huataiqigang_left, true); } private void button3_Click(object sender, EventArgs e) { opc.Write(OutputTag.songliao_left, true); } private void btnOut_Click(object sender, EventArgs e) { opc.Write(OutputTag.chuliao_left, true); } private void button6_Click(object sender, EventArgs e) { if (runStatus_left == RunStatus.Normal) { if (MessageBox.Show("确定进行手动定位?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { opc.Write(OutputTag.shoudongdingwei_left, true); } } else { MessageBox.Show("测试状态下无法手动定位!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked) { if ((runStatus_left == RunStatus.Normal)) { button6.Enabled = true; } else { checkBox1.Checked = false; button6.Enabled = false; MessageBox.Show("测试状态下无法手动定位!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { button6.Enabled = false; } } #endregion #region 右 private void button10_Click(object sender, EventArgs e) { opc.Write(OutputTag.Manual, true); } private void button8_Click(object sender, EventArgs e) { opc.Write(OutputTag.qigangjiajin, true); } private void button7_Click(object sender, EventArgs e) { opc.Write(OutputTag.qigangsongkai, true); } private void button13_Click(object sender, EventArgs e) { opc.Write(OutputTag.guanmen, true); //if (isUUTOut == false) //{ // opc.Write(OutputTag.guanmen, true); // isDoorOpen = false; //} //else //{ // MessageBox.Show("请先送料!"); //} } private void button14_Click(object sender, EventArgs e) { opc.Write(OutputTag.kaimen, true); //isDoorOpen = true; } private void button11_Click(object sender, EventArgs e) { opc.Write(OutputTag.huataiqigang, true); } private void button9_Click(object sender, EventArgs e) { opc.Write(OutputTag.songliao, true); //if (isDoorOpen == true) //{ // opc.Write(OutputTag.songliao, true); // isUUTOut = false; //} //else //{ // MessageBox.Show("请先开门!"); //} } private void button12_Click(object sender, EventArgs e) { opc.Write(OutputTag.chuliao, true); //isUUTOut = true; } private void button15_Click(object sender, EventArgs e) { if (runStatus == RunStatus.Normal) { if (MessageBox.Show("确定进行手动定位?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { opc.Write(OutputTag.shoudongdingwei, true); } } else { MessageBox.Show("测试状态下无法手动定位!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void checkBox2_CheckedChanged(object sender, EventArgs e) { if (checkBox2.Checked) { if ((runStatus == RunStatus.Normal)) { button15.Enabled = true; } else { checkBox2.Checked = false; button15.Enabled = false; MessageBox.Show("测试状态下无法手动定位!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { button15.Enabled = false; } } #endregion private void frmMain_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("确定退出程序?", "系统提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { e.Cancel = false; if (isRightCameraOpen == true) { cam.CloseCamera(); } if (isLeftCameraOpen == true) { cam_left.CloseCamera(); } } else { e.Cancel = true; } } #region 左相机相关 /// /// 加载左相机 /// private void initCam_Left() { Log.WriteLog("initCam_Left Enter"); cam_left = new PointGreyAndHalcon.PointGreyAndHalcon(); isLeftCameraOpen = cam_left.OpenCamera(config.cams.SerialNumber[0]); cam_left.GrabImageDone += new GrabImageDoneDelegate(cam_left_GrabImageDone); Log.WriteLog("initCam_Left Leave"); } /// /// 加载HalconTool_Left /// private void initHalconTool_Left() { Log.WriteLog("initHalconTool_Left Enter"); ht_left.LoadJobs(); ht_left.resultCreater.ListenEvent += new EventHandler(resultCreater_left_ListenEvent); Log.WriteLog("initHalconTool_Left Leave"); } #endregion private void tspbtnExit_Click(object sender, EventArgs e) { this.Close(); } private void ckbSaveImage_CheckedChanged(object sender, EventArgs e) { if (ckbSaveImage.Checked) { config.saveImage=true; sft.SetConfig(configPath, config); } else { config.saveImage = false; sft.SetConfig(configPath, config); } } public bool Effective() { string defaultScope = ""; DogFeature feature = new DogFeature(1); using (var dog = new Dog(feature)) { string vendorcodes = "tn+2bpxTE0MhQDarbNvbJEPpez6LfT6oB2DjZLKQMs0H2ap3YfmDIzYaLqDsZliOKL677L28ZbDhxwdP3Mq2xIbi/5zkXQ7ybvG9HLKaYXN3ql8yY5XJ1WHn7ISI+m7M9t1SzzQaUwnW/NV2VUslx/PdI5hZ1VVwsIaus042E5u8QGCSPJcDOXBeGIJeJSezvM+scip87hDujXsrubV0n+xCAdrTAs/WU5O1JwpgYNArqrFCpYSV4nO5ZveQRcPchUuED+gaNpHfsKZYAtW/43ud3IYcnTg6HuQPo+9fRu8iDpi18+j8USasj6M8EY9g7x3YjwO1DHCPpNEWB3IrHA0rhWG+c2emcCc3q8r8Qx8yHBCAUdZV7F8CTar/co5NbVv3FNObKULZxqrESWkPhoIKBtuCutspoGkTBHger+2A5qtfEMy6ZHt6MRvmgmiIO23AQGQ3yXKHXkq6HsDtrl1P+8coQTFnqopDOGaPi6C+Pb7qIqCJx+IBnWnjuZEfawKMcR+1hB9m1rSfhY+UQ0crh8jYr5a+tOAbSU9tPw3ZmKLQYbm6m8gLAHIv+EOq1rRfH5XxhUUbL4Lv4mrTFcmWl1Ibnaiz7140PqVqaquI8h8Mj4tL/5u/f1iJTKvnUywmPUDZXAecu6FmwDeQpvGJwa+q1Fgn3WXqBitT/lnEox7pp8deMpT/ol0wpcmlU40Cq5XsvnLmbGdK/qcXYBa+ZYhLYnXpzTe4XUDbatIFKfNVwZsSgXaMPpRLghEMQupv/H9uJ2vtlRYjt0ysoFDgzb3W0qr3bK7T55a8bhiptfh/dq7Q5hHZUolRprjXTbcUlmyhjzrH+bAz+BdmwiHJInx/najqyflknUUuOdO8IrMFAh0zWiICkijghbvWUwjg/DTpLKRO2e6hTaWtvCHTBHfBRV0/0EVW0kMmdx/huL1k1BBo11Fv/X7feCskl0m5rot1ubw/T/shAAvVBg=="; var status = dog.Login(vendorcodes, defaultScope); if (status != DogStatus.StatusOk) { if (status == DogStatus.TimeError) { if (config.leftUsed) { btnDisplay_left.Text = "禁止篡改时间"; } else { btnDisplay.Text = "禁止篡改时间"; } return false; } else { if (config.leftUsed) { btnDisplay_left.Text = "请插入有效的加密狗"; } else { btnDisplay.Text = "请插入有效的加密狗"; } return false; } } } return true; } private void cboSize_Left_SelectionChangeCommitted(object sender, EventArgs e) { config.selectedSizeIndex = cboSize_Left.SelectedIndex; sft.SetConfig(configPath, config); long value = config.inch13; if (cboSize_Left.SelectedValue.ToString() == "inch15") { value = config.inch15; } if (cboSize_Left.SelectedValue.ToString() == "inch16") { value = config.inch16; } opc.Write(OutputTag.X_Work, value); } private void cboSize_SelectionChangeCommitted(object sender, EventArgs e) { config.selectedSizeIndex = cboSize.SelectedIndex; sft.SetConfig(configPath, config); long value = config.inch13; if (cboSize.SelectedValue.ToString() == "inch15") { value = config.inch15; } if (cboSize.SelectedValue.ToString() == "inch16") { value = config.inch16; } opc.Write(OutputTag.X_Work, value); } } }