using System; using System.Text; using System.Windows.Forms; using Script.Methods; using HuarayVMCore; using HuarayVMCore.Camera; using HuarayVMCore.Core; using HuarayVMCore.VisionMaster; using ImageConverter = HuarayVMCore.Core.ImageConverter; using System.Threading; using VM.PlatformSDKCS; using VM.Core; using ImageSourceModuleCs; /************************************ Shell Module default code: using .NET Framwwork 4.6.1 *************************************/ public partial class UserScript : ScriptMethods, IProcessMethods { //the count of process #region 实例 int processCount; private HuarayCamera _camera = null; CameraDeviceInfo devInfo = null; bool GetImageOK = false;//单帧取像时的结果判断 #endregion //Continuous=连续采集模式 Software=软触发模式 Hardware=外部硬件触发模式 TriggerMode _TriggerMode = TriggerMode.Software; // Software-连续 Software=软触发 Line0-Line2 线路触发 CounterOut-CounterOut TriggerSource _TriggerSource = TriggerSource.Software; /// /// Initialize the field's value when compiling /// public void Init() { try { if (_camera != null) _camera.Close(); var _deviceList = HuarayCamera.EnumerateDevices(); for (int i = 0; i < _deviceList.Count; i++) { if (_deviceList[i].SerialNumber == SerialNumber) { _camera = new HuarayCamera(); _camera.FrameReceived += OnFrameReceived; VmSolution.Instance.DisableModulesCallback();//关闭所有回调 devInfo = _deviceList[i]; _camera.Open(devInfo); //set _camera.SetIntFeatureValue("Width", (long)ImgWidth);//设置图像宽高 _camera.SetIntFeatureValue("Height", (long)ImgHeight);//设置图像宽高 _camera.SetTriggerMode(_TriggerMode, _TriggerSource);//设置触发模式 _camera.SetDoubleFeatureValue("ExposureTime", (double)ExposureTime);//设置曝光时间 _camera.SetDoubleFeatureValue("Gain", (double)Gain);//设置增益 _camera.SetBufferCount(30);//设置缓冲区数量 _camera.StartGrabbing();//开始采集 continue; } } } catch { } //You can add other global fields here processCount = 0; } /// /// Enter the process function when running code once /// /// public bool Process() { Init();//初始化相机 try { GetImageOK = false; if (_camera != null && _camera.IsOpened) { _camera.StopGrabbing();//关闭采集 _camera.SetTriggerMode(TriggerMode.Software, TriggerSource.Software);//流程执行先设置成单帧率触发 _camera.SetBufferCount(30);// 设置缓冲区数量 _camera.StartGrabbing();// 开始采集 _camera.TriggerSoftware();//触发单排 int i = 0; do { if (GetImageOK == true) break; Thread.Sleep(1000);//等待8s取图 防止卡顿 i++; } while (i <= 8); _camera.FrameReceived -= OnFrameReceived; _camera.Close(); Init();//初始化相机 Message = GetImageOK.ToString(); if(!GetImageOK) { Message = "相机取像失败"; throw new Exception("相机取像失败"); } return GetImageOK; } else { throw new Exception("相机连接失败"); return false; } } catch (Exception ex) { throw new Exception(ex.ToString()); return false; } finally { Init(); } } /// /// 帧接收事件处理(异步回调取图模式) /// private void OnFrameReceived(object sender, FrameReceivedEventArgs e) { try { ImageBaseData imageData = ImageConverter.ToImageBaseData(e); VmProcedure procedure = VmSolution.Instance[FlowName] as VmProcedure; ImageSourceModuleTool module = VmSolution.Instance[FlowName + "." + ToolName] as ImageSourceModuleTool; module.SetImageData(imageData); procedure.Run(); GetImageOK = true; } catch (Exception ex) { MessageBox.Show(ex.Message); } } }