/// <summary> /// 测试、取消 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tsbCamera_Click(object sender, EventArgs e) { if (CommHandle.Instance.IsLink) { Util.Notify(Level.Err, "正在运行中不能测试!"); return; } if (StatusManger.Instance.TestInitFinish == false) { MessageBox.Show("请等待初始化完成", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } Tools.CreateImage.CreateImageTool createImageTool = ToolsFactory.GetToolList(currentSettingIndex)[0] as Tools.CreateImage.CreateImageTool; int cameraIndex = createImageTool.CameraIndex; //如果是连续拍照,则停止连续拍照并返回。 if (CameraManger.CameraDic.ContainsKey(cameraIndex)) { if (CameraManger.CameraDic[cameraIndex].IsContinuousShot) { CameraManger.CameraDic[cameraIndex].ContinuousShotStop(); isTestMode = false; toolShowUnit1.IsRunning = false; timerContinuousShotEnd.Stop(); //tscobToolGroupsSelect.Enabled = true; return; } } //判断是否是离线测试。判断对应相机对应runTheadData是否是离线测试模式。如果已处于离线测试模式,则停止离线测试。如不是则判断对应路径是否有图片,有则运行离线图片测试。 if (ToolsFactory.ToolsDic.ContainsKey(currentSettingIndex)) { if (createImageTool != null && createImageTool.OffLineMode == true) { if (runTheadDataDic.ContainsKey(cameraIndex)) { if (runTheadDataDic[cameraIndex].IsOffLineMode) //表示已经开始执行离线程序,这时要执行关闭离线执行。 { runTheadDataDic[cameraIndex].IsOffLineMode = false; createImageTool.IsStopOffLineTest = true; return; } else //表示还没有开始执行离线模式,这时执行之前,要判断图像列表是否为空。 { if (createImageTool.GetOffLineImageFileSum() == 0) { Util.Notify(Level.Err, string.Format("工具组{0}没有加载离线图像文件", currentSettingIndex)); return; } createImageTool.AllReadFinish = false; createImageTool.IsStopOffLineTest = false; runTheadDataDic[cameraIndex].TrigerRun(currentSettingIndex, true); //开始执行离线模式触发。 return; } } else { Util.Notify(Level.Err, string.Format("工具组{0}对应相机没有分配显示窗口!", currentSettingIndex)); return; } } } //在线测试模式,相机已连接,连续拍照,放大窗口,开启计时。 if (CameraManger.CameraDic.ContainsKey(cameraIndex)) { if (CameraManger.CameraDic[cameraIndex].IsLink) { if (CameraManger.CameraDic[cameraIndex].IsContinuousShot == false) { //runTheadDataDic[currentSettingIndex].TrigerRun(currentSettingIndex, false);//单次测试触发运行用,这时cameraSelect.ContinuousShot()要注释掉 tscobCameraSelect.SelectedIndex = cameraIndex - 1; CameraManger.CameraDic[cameraIndex].ContinuousShot(); isTestMode = true; toolShowUnit1.IsRunning = true; //tscobToolGroupsSelect.Enabled = false; if (timerContinuousShotEnd.Enabled == false) { timerContinuousShotEnd.Start(); } } } else { Util.Notify(Level.Err, string.Format("工具集{0}对应相机{1}已断线,请检查", currentSettingIndex, cameraIndex)); return; } } else if (cameraIndex > cameraCount) { Util.Notify(Level.Err, string.Format("工具组{0}对应相机没有分配显示窗口!", currentSettingIndex)); } else { Util.Notify(Level.Err, string.Format("工具集{0}对应相机没有连接", currentSettingIndex)); } }
/// <summary> /// 切换运行状态 /// </summary> public void btnRun_Click(object sender, EventArgs e) { int cameraCount = IniStatus.Instance.CamearCount; Dictionary <int, CameraBase> cameraDic = CameraManger.CameraDic; try { if (CommHandle.Instance.IsLink == false) { /*StatusManger status = StatusManger.Instance; * if (status.RuningStatus == RuningStatus.系统异常) * { * MessageBox.Show("系统出现异常,请检查设置", "提示", * MessageBoxButtons.OK, MessageBoxIcon.Error); * return; * }*/ if (CameraManger.CameraDic.Count > 0) { CameraManger.Close(); } if (CameraManger.Open() == false) { MessageBox.Show("没有相机连接,无法启动", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } for (int i = 0; i < cameraCount; i++) { if (cameraDic.ContainsKey(i + 1) == false) { //Util.Notify(string.Format("请注意相机{0}未连接", i+1)); MessageHelper.ShowError(string.Format("相机{0}没有找到", i + 1)); } } foreach (int key in cameraDic.Keys) { if (key > cameraCount || key < 1) { cameraDic.Remove(key); Util.Notify(Level.Err, $"相机{key}名称ID超出相机个数设定范围,请用相机软件重新设定"); return; } } Util.Notify("相机打开完成"); foreach (var item in ToolsFactory.ToolsDic.Values) { Tools.CreateImage.CreateImageTool createImageTool = item[0] as Tools.CreateImage.CreateImageTool; createImageTool.OffLineMode = false; } LoadProject(false); CommHandle.Instance.CommunicationParam = UserSetting.Instance.MainDeviceComParam; //两对象同是CommunicationParam类型。 CommHandle.Instance.Open(); } else { if (MessageBox.Show("确定中止运行吗?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { CommHandle.Instance.IsLink = false; foreach (var item in CameraManger.CameraDic.Values) { item.ContinuousShotStop(); if (item.IsContinuousShot) { item.ContinuousShotStop(); } } } } } catch (Exception) { } }
public void RunAllTool() { HTuple /*start = null, */ end = null; //帧率统计增加 fps.IncreaseFrameNum(); fpsCount++; if (fpsCount > 10) { fps.UpdateFps(); fpsCount = 0; } RunStatus runStatus = new RunStatus(settingIndex, cameraIndex); runStatus.FpsStr = string.Format("FPS:{0:F1}|帧:{1}|", fps.GetFps(), fps.GetTotalFrameCount()); List <ToolBase> runToolList = ToolsFactory.GetToolList(settingIndex); Tools.CreateImage.CreateImageTool createImageTool = runToolList[0] as Tools.CreateImage.CreateImageTool; HWndCtrl hWndCtrl = cameraShowUnit.HWndUnit.HWndCtrl; try { HTuple toolStart = new HTuple(), toolEnd = new HTuple(); StatusManger statusManger = StatusManger.Instance; statusManger.RuningStatus = RuningStatus.图像检测中; runningResultFlag = false; toolErr = null; //开始运行所有工具 HOperatorSet.CountSeconds(out toolStart); //外部触发处理 if (isExtTrigger || isGrabber) { createImageTool.SettExtTriggerData(ImageData); isGrabber = false; } else { createImageTool.SetExtTriggerDataOff(); } StringBuilder MyStringBuilder = new StringBuilder(); //string yy = MyStringBuilder.ToString(); string datSend = ""; foreach (var item in runToolList) { if (item is IToolRun) { try { item.Run(); string result = item.IsOk ? "OK" : "NG"; Util.Notify(string.Format("{0}_{1} T={2:f2}ms,结果: {3}", item.Name, result, item.ExecutionTime, item.Result)); MyStringBuilder.Append(string.Format("{0}_{1}_T={2:f2}ms\r\n", item.Name, result, item.ExecutionTime)); if (item.IsOutputResults) { string dat = item.GetSendResult(); if (dat != string.Empty) { datSend += dat; datSend += toolDelimiter; } } runStatus.RunStatusList.Add(item.IsOk); } catch (Exception ex) { //Util.WriteLog(this.GetType(), ex); Util.Notify(Level.Err, string.Format("工具{0}运行出现异常{1}", item.Name, ex.Message)); runStatus.RunStatusList.Add(false); } } else { runStatus.RunStatusList.Add(true); } } runStatus.ResultMessage = MyStringBuilder.ToString(); //时间统计 HOperatorSet.CountSeconds(out toolEnd); double toolTime = (toolEnd - toolStart) * 1000.0; //toolStart) * 1000.0; Util.Notify(string.Format("工具组{0}图像处理用时{1:f2}ms", settingIndex, toolTime)); #region 3 查找是否存在运行错误的工具 toolErr = runToolList.Find(x => x.IsOk == false && x is IToolRun); if (toolErr == null && ToolsFactory.ToolsDic.Count > 0) { runningResultFlag = true; ok++; } else { runningResultFlag = false; ng++; Util.Notify(string.Format("工具{0}图像处理检测到异常", toolErr.Name)); } if (runningResultFlag == true) { datSend = Util.TrimEndString(datSend, toolDelimiter); datSend = Util.TrimStartString(datSend, toolDelimiter); } else { datSend = ("Image" + Environment.NewLine + "Done" + Environment.NewLine); } if (isOffLineMode == false) //这个变量与AutoUnit中的isTestMode不是同一个,这里是指AutoUnit的测试模式与离线模式。 { //SerialHelper.Instance.WriteCommdToSerial(datSend); //非相机输出模式下就直接输出文本信息 if (!CommHandle.Instance.CommunicationParam.IsCamIOOutput && datSend != string.Empty) { Util.Notify(string.Format("发送结果: {0}", datSend)); autoUnit.RunCommWriteDataThread.WriteData(datSend); } else { if (StatusManger.Instance.IsInterlocking && CameraManger.CameraDic.ContainsKey(settingIndex) && runningResultFlag == false) { CameraManger.CameraDic[settingIndex].Output(); //结果NG时相机外部输出信号导通。 } } } else { if (runningResultFlag == false) { Util.Notify(string.Format("测试结果:{0}", "NG")); } else { Util.Notify(string.Format("测试结果:{0}", "OK")); } } #endregion #region 4 显示所有的图形 //HTuple showStart; //HOperatorSet.CountSeconds(out showStart); autoUnit.Invoke(new Action <HWndCtrl, List <ToolBase>, bool>((h, l, f) => { ShowResult(h, l, f); }), hWndCtrl, runToolList, runningResultFlag); #endregion HTuple end1; HOperatorSet.CountSeconds(out end1); double time1 = (end1 - toolEnd) * 1000.0; Util.Notify(string.Format("工具组{0}分析显示用时{1:f2}ms", settingIndex, time1)); } catch (Exception) { //Util.WriteLog(this.GetType(), ex); Util.Notify(string.Format("图像处理异常")); } finally { HOperatorSet.CountSeconds(out end); double runTime = 0; runTime = (end - startExTime) * 1000.0; runStatus.OKCount = ok; runStatus.NgCount = ng; runStatus.CylceTime = runTime; RunStatus runStatusTmp = runStatus.DeepClone(); autoUnit.RefreshUI(runStatusTmp); //指示可以来图像处理 Util.Notify(string.Format("---工具组{0}运行完成,用时{1:f2}ms\r\n", settingIndex, runTime)); imageRunFinishSignalFlow.Set(); //离线模式 if (isOffLineMode && createImageTool.OffLineMode == true && createImageTool.AllReadFinish == false) { Task.Run(async delegate { await Task.Delay(1000); if (isOffLineMode) { TrigerRun(this.settingIndex, true); //离线测试模式时,接着触发下次离线测试。 } }); } else { isOffLineMode = false; //将该对象的离线模式标志复位,不再执行离线。 } } }