using Cognex.VisionPro; using Cognex.VisionPro.ImageFile; using Cognex.VisionPro.QuickBuild; using Cognex.VisionPro.ToolBlock; using LampInspectionMachine.Cameralibs; using LampInspectionMachine.Interfaces; using LampInspectionMachine.Log4xml; using LampInspectionMachine.Model; using MvCamCtrl.NET; using Prism.Events; using Prism.Ioc; using Prism.Regions; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using Prism.Mvvm; using System.Threading.Tasks; using System.Windows.Forms; using System.Diagnostics; using LampInspectionMachine.KHLplc; using System.IO; using SqlSugar; using System.Windows.Controls; namespace LampInspectionMachine.Core { public class VisionProManager : BindableBase { private ICamera _camera; private PlcData _plcData = new PlcData(); private CogToolBlock _cogToolBlock; private Queue values = new Queue(); private Thread PcToPlcValueTHread; private readonly object _lockRead = new object(); private readonly object _lockWrite = new object(); private int _IsNgCount = 0; private int _IsOkCount = 0; private bool _IsConnected; private CameraInfo _cameraInfo; private Management _management; private ShowRender render = new ShowRender(); public ICamera Camera { get => _camera; set => _camera = value; } public CogToolBlock CogToolBlock { get => _cogToolBlock; set => _cogToolBlock = value; } public CameraInfo CameraInfo { get => _cameraInfo; set { SetProperty(ref _cameraInfo, value); } } public Management Management { get => _management; set => _management = value; } public ShowRender Render { get => render; set { SetProperty(ref render, value); } } public bool IsConnected { get => _IsConnected; set { SetProperty(ref _IsConnected, value); } } public PlcData PlcData { get => _plcData; set => _plcData = value; } public int IsNgCount { get => _IsNgCount; set{ SetProperty(ref _IsNgCount, value); } } public int IsOkCount { get => _IsOkCount; set { SetProperty(ref _IsOkCount, value); } } public VisionProManager() { PcToPlcValueTHread = new Thread(PcToPlcValueMethod); PcToPlcValueTHread.IsBackground = true; PcToPlcValueTHread.Start(); } /// ///调试图像显示 /// /// public void CamCallBack(ICogImage image, TimeSpan totaltime, string errormessage) { try { if (Management != null) { Management.Render = new ShowRender() { Image = image, }; } } finally { } } /// /// 运行视觉处理 /// public async void ImageCallback(ICogImage image) { ImageCallbackAsync(image); } private int OldCode = 0; private Stopwatch stopwatch = new Stopwatch(); public async Task ImageCallbackAsync(ICogImage image) { if (CogToolBlock != null) { try { await Task.Run(() => { bool isok = true; Guid guid = Guid.NewGuid(); ushort resCode; lock (_lockRead) { stopwatch.Restart(); while (true) { resCode = Management.KHLCommunicate.ReadUshort(PlcData.PlcToPcCodeIndex, 1)[0]; if (OldCode != resCode) { OldCode = resCode; break; } if (stopwatch.ElapsedMilliseconds > 200) { isok = false; break; } } stopwatch.Stop(); // LogHelper.SwitchCameraInfo(Camera.Name, guid.ToString() + $"\r产品码:{resCode}"); CogToolBlock.Inputs["Image"].Value = image; CogToolBlock.Run(); } // LogHelper.SwitchCameraInfo(Camera.Name, guid.ToString() + $"\r产品码:{resCode}[{CameraInfo.CameraName}]运行流程:{CogToolBlock.RunStatus.ProcessingTime:F1}ms"); if (CogToolBlock.RunStatus.Result == CogToolResultConstants.Accept) { CogToolBlockTerminalCollection outputCollection = CogToolBlock.Outputs; ICogRecord record = null; foreach (CogToolBlockTerminal item in outputCollection) { if (item.Value is ICogRecord) record = item.Value as ICogRecord; } ICogImage cogImage = (ICogImage)CogToolBlock.Inputs["Image"].Value; if (cogImage != null) { Render = null; Render = new ShowRender() { CameraName = Camera.Name, Graphic = outputCollection["Graphics"].Value as CogGraphicCollection, Image = cogImage, Record = record, Result = (bool)(outputCollection["Result"].Value), }; } } else { Render = null; Render = new ShowRender() { CameraName = Camera.Name, Image = image, Result = false }; } // LogHelper.SwitchCameraInfo(Camera.Name, guid.ToString() + $"\r产品码:{resCode}[{CameraInfo.CameraName}]流程结果:{Render.Result}"); ushort Result = (ushort)(Render.Result ? 1 : 2); if(isok) values.Enqueue(new ResultsPlcInfo() { Id=guid, Code = resCode, ProcessingTime= CogToolBlock.RunStatus.ProcessingTime.ToString("F1"), Res = Result }); }); } catch (Exception ex) { LogHelper.Info(Resources.Language.Resources.Plc交互出错); } } await Task.CompletedTask; } public void PcToPlcValueMethod() { ResultsPlcInfo res; while (true) { if (values.Count > 0) { res = values.Dequeue(); if (res != null) { while (Management.KHLCommunicate.IsConnected) { if (Management.KHLCommunicate.ReadUshort(PlcData.PcToPlcCompleted, 1)[0] != 1) { Management.KHLCommunicate.WriteUshort(PlcData.PcToPlcCodeIndex, 1, new ushort[] { res.Code }); Management.KHLCommunicate.WriteUshort(PlcData.PcToPlcResult, 1, new ushort[] { res.Res }); Management.KHLCommunicate.WriteUshort(PlcData.PcToPlcCompleted, 1, new ushort[] { 1 }); break; } Thread.Sleep(5); } if (res.Res == 1) { IsOkCount++; } else { IsNgCount++; } 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.回复完成}"); } } Thread.Sleep(5); } } /// /// 相机连接或者断开时 /// /// /// public void CameraConnectChangedEvent(Guid id, bool state) { IsConnected = state; } } }