VisionProManager.cs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. using Cognex.VisionPro;
  2. using Cognex.VisionPro.ImageFile;
  3. using Cognex.VisionPro.QuickBuild;
  4. using Cognex.VisionPro.ToolBlock;
  5. using LampInspectionMachine.Cameralibs;
  6. using LampInspectionMachine.Interfaces;
  7. using LampInspectionMachine.Log4xml;
  8. using LampInspectionMachine.Model;
  9. using MvCamCtrl.NET;
  10. using Prism.Events;
  11. using Prism.Ioc;
  12. using Prism.Regions;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Collections.ObjectModel;
  16. using System.Drawing;
  17. using System.Linq;
  18. using System.Runtime.InteropServices;
  19. using System.Text;
  20. using System.Threading;
  21. using Prism.Mvvm;
  22. using System.Threading.Tasks;
  23. using System.Windows.Forms;
  24. using System.Diagnostics;
  25. using LampInspectionMachine.KHLplc;
  26. using System.IO;
  27. using SqlSugar;
  28. using System.Windows.Controls;
  29. namespace LampInspectionMachine.Core
  30. {
  31. public class VisionProManager : BindableBase
  32. {
  33. private ICamera _camera;
  34. private PlcData _plcData = new PlcData();
  35. private CogToolBlock _cogToolBlock;
  36. private Queue<ResultsPlcInfo> values = new Queue<ResultsPlcInfo>();
  37. private Thread PcToPlcValueTHread;
  38. private readonly object _lockRead = new object();
  39. private readonly object _lockWrite = new object();
  40. private int _IsNgCount = 0;
  41. private int _IsOkCount = 0;
  42. private bool _IsConnected;
  43. private CameraInfo _cameraInfo;
  44. private Management _management;
  45. private ShowRender render = new ShowRender();
  46. public ICamera Camera { get => _camera; set => _camera = value; }
  47. public CogToolBlock CogToolBlock { get => _cogToolBlock; set => _cogToolBlock = value; }
  48. public CameraInfo CameraInfo { get => _cameraInfo; set { SetProperty(ref _cameraInfo, value); } }
  49. public Management Management { get => _management; set => _management = value; }
  50. public ShowRender Render
  51. {
  52. get => render;
  53. set
  54. {
  55. SetProperty(ref render, value);
  56. }
  57. }
  58. public bool IsConnected
  59. {
  60. get => _IsConnected; set
  61. {
  62. SetProperty(ref _IsConnected, value);
  63. }
  64. }
  65. public PlcData PlcData { get => _plcData; set => _plcData = value; }
  66. public int IsNgCount { get => _IsNgCount; set{ SetProperty(ref _IsNgCount, value); } }
  67. public int IsOkCount { get => _IsOkCount; set { SetProperty(ref _IsOkCount, value); } }
  68. public VisionProManager()
  69. {
  70. PcToPlcValueTHread = new Thread(PcToPlcValueMethod);
  71. PcToPlcValueTHread.IsBackground = true;
  72. PcToPlcValueTHread.Start();
  73. }
  74. /// <summary>
  75. ///调试图像显示
  76. /// </summary>
  77. /// <param name="img"></param>
  78. public void CamCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
  79. {
  80. try
  81. {
  82. if (Management != null)
  83. {
  84. Management.Render = new ShowRender()
  85. {
  86. Image = image,
  87. };
  88. }
  89. }
  90. finally
  91. {
  92. }
  93. }
  94. /// <summary>
  95. /// 运行视觉处理
  96. /// </summary>
  97. public async void ImageCallback(ICogImage image)
  98. {
  99. ImageCallbackAsync(image);
  100. }
  101. private int OldCode = 0;
  102. private Stopwatch stopwatch = new Stopwatch();
  103. public async Task ImageCallbackAsync(ICogImage image)
  104. {
  105. if (CogToolBlock != null)
  106. {
  107. try
  108. {
  109. await Task.Run(() =>
  110. {
  111. bool isok = true;
  112. Guid guid = Guid.NewGuid();
  113. ushort resCode;
  114. lock (_lockRead)
  115. {
  116. stopwatch.Restart();
  117. while (true)
  118. {
  119. resCode = Management.KHLCommunicate.ReadUshort(PlcData.PlcToPcCodeIndex, 1)[0];
  120. if (OldCode != resCode)
  121. {
  122. OldCode = resCode;
  123. break;
  124. }
  125. if (stopwatch.ElapsedMilliseconds > 200)
  126. {
  127. isok = false;
  128. break;
  129. }
  130. }
  131. stopwatch.Stop();
  132. // LogHelper.SwitchCameraInfo(Camera.Name, guid.ToString() + $"\r产品码:{resCode}");
  133. CogToolBlock.Inputs["Image"].Value = image;
  134. CogToolBlock.Run();
  135. }
  136. // LogHelper.SwitchCameraInfo(Camera.Name, guid.ToString() + $"\r产品码:{resCode}[{CameraInfo.CameraName}]运行流程:{CogToolBlock.RunStatus.ProcessingTime:F1}ms");
  137. if (CogToolBlock.RunStatus.Result == CogToolResultConstants.Accept)
  138. {
  139. CogToolBlockTerminalCollection outputCollection = CogToolBlock.Outputs;
  140. ICogRecord record = null;
  141. foreach (CogToolBlockTerminal item in outputCollection)
  142. {
  143. if (item.Value is ICogRecord)
  144. record = item.Value as ICogRecord;
  145. }
  146. ICogImage cogImage = (ICogImage)CogToolBlock.Inputs["Image"].Value;
  147. if (cogImage != null)
  148. {
  149. Render = null;
  150. Render = new ShowRender()
  151. {
  152. CameraName = Camera.Name,
  153. Graphic = outputCollection["Graphics"].Value as CogGraphicCollection,
  154. Image = cogImage,
  155. Record = record,
  156. Result = (bool)(outputCollection["Result"].Value),
  157. };
  158. }
  159. }
  160. else
  161. {
  162. Render = null;
  163. Render = new ShowRender()
  164. {
  165. CameraName = Camera.Name,
  166. Image = image,
  167. Result = false
  168. };
  169. }
  170. // LogHelper.SwitchCameraInfo(Camera.Name, guid.ToString() + $"\r产品码:{resCode}[{CameraInfo.CameraName}]流程结果:{Render.Result}");
  171. ushort Result = (ushort)(Render.Result ? 1 : 2);
  172. if(isok)
  173. values.Enqueue(new ResultsPlcInfo() { Id=guid, Code = resCode, ProcessingTime= CogToolBlock.RunStatus.ProcessingTime.ToString("F1"), Res = Result });
  174. });
  175. }
  176. catch (Exception ex)
  177. {
  178. LogHelper.Info(Resources.Language.Resources.Plc交互出错);
  179. }
  180. }
  181. await Task.CompletedTask;
  182. }
  183. public void PcToPlcValueMethod()
  184. {
  185. ResultsPlcInfo res;
  186. while (true)
  187. {
  188. if (values.Count > 0)
  189. {
  190. res = values.Dequeue();
  191. if (res != null)
  192. {
  193. while (Management.KHLCommunicate.IsConnected)
  194. {
  195. if (Management.KHLCommunicate.ReadUshort(PlcData.PcToPlcCompleted, 1)[0] != 1)
  196. {
  197. Management.KHLCommunicate.WriteUshort(PlcData.PcToPlcCodeIndex, 1, new ushort[] { res.Code });
  198. Management.KHLCommunicate.WriteUshort(PlcData.PcToPlcResult, 1, new ushort[] { res.Res });
  199. Management.KHLCommunicate.WriteUshort(PlcData.PcToPlcCompleted, 1, new ushort[] { 1 });
  200. break;
  201. }
  202. Thread.Sleep(5);
  203. }
  204. if (res.Res == 1)
  205. {
  206. IsOkCount++;
  207. }
  208. else
  209. {
  210. IsNgCount++;
  211. }
  212. LogHelper.SwitchCameraInfo(Camera.Name, Camera.Name + $"\r\n{Resources.Language.Resources.产品码}:{res.Code},{Resources.Language.Resources.耗时}:{res.ProcessingTime}{Resources.Language.Resources.结果};{res.Res} {Resources.Language.Resources.回复完成}");
  213. }
  214. }
  215. Thread.Sleep(5);
  216. }
  217. }
  218. /// <summary>
  219. /// 相机连接或者断开时
  220. /// </summary>
  221. /// <param name="id"></param>
  222. /// <param name="state"></param>
  223. public void CameraConnectChangedEvent(Guid id, bool state)
  224. {
  225. IsConnected = state;
  226. }
  227. }
  228. }