01.流程外使用 可进行单拍.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. using System;
  2. using System.Text;
  3. using System.Windows.Forms;
  4. using Script.Methods;
  5. using HuarayVMCore;
  6. using HuarayVMCore.Camera;
  7. using HuarayVMCore.Core;
  8. using HuarayVMCore.VisionMaster;
  9. using ImageConverter = HuarayVMCore.Core.ImageConverter;
  10. using System.Threading;
  11. using VM.PlatformSDKCS;
  12. using VM.Core;
  13. using ImageSourceModuleCs;
  14. /************************************
  15. Shell Module default code: using .NET Framwwork 4.6.1
  16. *************************************/
  17. public partial class UserScript : ScriptMethods, IProcessMethods
  18. {
  19. //the count of process
  20. #region 实例
  21. int processCount;
  22. private HuarayCamera _camera = null;
  23. CameraDeviceInfo devInfo = null;
  24. bool GetImageOK = false;//单帧取像时的结果判断
  25. #endregion
  26. //Continuous=连续采集模式 Software=软触发模式 Hardware=外部硬件触发模式
  27. TriggerMode _TriggerMode = TriggerMode.Software;
  28. // Software-连续 Software=软触发 Line0-Line2 线路触发 CounterOut-CounterOut
  29. TriggerSource _TriggerSource = TriggerSource.Software;
  30. /// <summary>
  31. /// Initialize the field's value when compiling
  32. /// </summary>
  33. public void Init()
  34. {
  35. try
  36. {
  37. if (_camera != null)
  38. _camera.Close();
  39. var _deviceList = HuarayCamera.EnumerateDevices();
  40. for (int i = 0; i < _deviceList.Count; i++)
  41. {
  42. if (_deviceList[i].SerialNumber == SerialNumber)
  43. {
  44. _camera = new HuarayCamera();
  45. _camera.FrameReceived += OnFrameReceived;
  46. VmSolution.Instance.DisableModulesCallback();//关闭所有回调
  47. devInfo = _deviceList[i];
  48. _camera.Open(devInfo);
  49. //set
  50. _camera.SetIntFeatureValue("Width", (long)ImgWidth);//设置图像宽高
  51. _camera.SetIntFeatureValue("Height", (long)ImgHeight);//设置图像宽高
  52. _camera.SetTriggerMode(_TriggerMode, _TriggerSource);//设置触发模式
  53. _camera.SetDoubleFeatureValue("ExposureTime", (double)ExposureTime);//设置曝光时间
  54. _camera.SetDoubleFeatureValue("Gain", (double)Gain);//设置增益
  55. _camera.SetBufferCount(30);//设置缓冲区数量
  56. _camera.StartGrabbing();//开始采集
  57. continue;
  58. }
  59. }
  60. }
  61. catch
  62. {
  63. }
  64. //You can add other global fields here
  65. processCount = 0;
  66. }
  67. /// <summary>
  68. /// Enter the process function when running code once
  69. /// </summary>
  70. /// <returns></returns>
  71. public bool Process()
  72. {
  73. Init();//初始化相机
  74. try
  75. {
  76. GetImageOK = false;
  77. if (_camera != null && _camera.IsOpened)
  78. {
  79. _camera.StopGrabbing();//关闭采集
  80. _camera.SetTriggerMode(TriggerMode.Software, TriggerSource.Software);//流程执行先设置成单帧率触发
  81. _camera.SetBufferCount(30);// 设置缓冲区数量
  82. _camera.StartGrabbing();// 开始采集
  83. _camera.TriggerSoftware();//触发单排
  84. int i = 0;
  85. do
  86. {
  87. if (GetImageOK == true)
  88. break;
  89. Thread.Sleep(1000);//等待8s取图 防止卡顿
  90. i++;
  91. }
  92. while (i <= 8);
  93. _camera.FrameReceived -= OnFrameReceived;
  94. _camera.Close();
  95. Init();//初始化相机
  96. Message = GetImageOK.ToString();
  97. if(!GetImageOK)
  98. {
  99. Message = "相机取像失败";
  100. throw new Exception("相机取像失败");
  101. }
  102. return GetImageOK;
  103. }
  104. else
  105. {
  106. throw new Exception("相机连接失败");
  107. return false;
  108. }
  109. }
  110. catch (Exception ex)
  111. {
  112. throw new Exception(ex.ToString());
  113. return false;
  114. }
  115. finally
  116. {
  117. Init();
  118. }
  119. }
  120. /// <summary>
  121. /// 帧接收事件处理(异步回调取图模式)
  122. /// </summary>
  123. private void OnFrameReceived(object sender, FrameReceivedEventArgs e)
  124. {
  125. try
  126. {
  127. ImageBaseData imageData = ImageConverter.ToImageBaseData(e);
  128. VmProcedure procedure = VmSolution.Instance[FlowName] as VmProcedure;
  129. ImageSourceModuleTool module = VmSolution.Instance[FlowName + "." + ToolName] as ImageSourceModuleTool;
  130. module.SetImageData(imageData);
  131. procedure.Run();
  132. GetImageOK = true;
  133. }
  134. catch (Exception ex)
  135. {
  136. MessageBox.Show(ex.Message);
  137. }
  138. }
  139. }