예제 #1
0
        /// <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));
            }
        }
예제 #2
0
        /// <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;   //将该对象的离线模式标志复位,不再执行离线。
                }
            }
        }