Esempio n. 1
0
        public RunStatus Execute(int timeout, out string visionResult)
        {
            bool isTimeout = false;
            var  runStatus = new RunStatus();

            visionResult = "";

            try
            {
                //参数校验
                if (VisionFrame == null)
                {
                    throw new NullReferenceException("VisionFrame cannot be null");
                }

                if (!IsInit)
                {
                    throw new Exception($"scene is uninitialized({nameof(IsVisionFrameInit)}:{IsVisionFrameInit} {nameof(IsCameraInit)}:{IsCameraInit})");
                }

                ItemCollection outputs;

                //开始计时
                totalProcessStopwatch.Restart();

                //如果使能相机,则调用相机采集
                if (VisionFrame.IsEnableCamera && IsCameraInit)
                {
                    lock (threadLock)
                    {
                        isVisionProcessed = false;
                    }

                    //注册相机采集完成事件
                    Camera.NewImageEvent -= Camera_NewImageEvent;
                    Camera.NewImageEvent += Camera_NewImageEvent;

                    //配置相机参数
                    CameraFactory.ConfigurateCamera(CameraSerial, cameraConfigParam);

                    //触发拍照
                    Camera.TriggerSoftware();

                    //阻塞等待视觉处理完成
                    grapTimeoutStopwatch.Restart();
                    while (true)
                    {
                        lock (threadLock)
                        {
                            if (isVisionProcessed)
                            {
                                grapTimeoutStopwatch.Stop();
                                break;
                            }
                        }

                        if ((timeout > 0) && (grapTimeoutStopwatch.Elapsed.TotalMilliseconds > timeout))
                        {
                            isTimeout = true;
                            grapTimeoutStopwatch.Stop();
                            throw new TimeoutException("grab image timeout");
                        }

                        System.Threading.Thread.Sleep(2);
                    }

                    //执行视觉框架
                    VisionFrame.ExecuteByImageInfo(imageInfo, out outputs);

                    //结果拼接
                    visionResult = ConvertItemCollectionToString(outputs, MainSeparatorChar, SubSeparatorChar);
                }
                else
                {
                    //执行视觉框架
                    VisionFrame.Execute(timeout, out outputs);

                    //结果拼接
                    visionResult = ConvertItemCollectionToString(outputs, MainSeparatorChar, SubSeparatorChar);
                }
            }
            catch (Exception ex)
            {
                return(new RunStatus(0, EResult.Error, ex.Message));
            }
            finally
            {
                //停止计时
                totalProcessStopwatch.Stop();
                VisionFrame.RunStatus.TotalTime = totalProcessStopwatch.Elapsed.TotalMilliseconds;

                if (!isTimeout)
                {
                    //释放图像资源,否则可能会导致资源泄露
                    imageInfo.DisposeImageIntPtr?.Invoke(imageInfo.ImagePtr);
                }
            }

            return(VisionFrame.RunStatus);
        }