123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- 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<ResultsPlcInfo> values = new Queue<ResultsPlcInfo>();
- 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();
- }
- /// <summary>
- ///调试图像显示
- /// </summary>
- /// <param name="img"></param>
- public void CamCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
- {
- try
- {
- if (Management != null)
- {
- Management.Render = new ShowRender()
- {
- Image = image,
- };
- }
- }
- finally
- {
- }
- }
- /// <summary>
- /// 运行视觉处理
- /// </summary>
- 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);
- }
- }
- /// <summary>
- /// 相机连接或者断开时
- /// </summary>
- /// <param name="id"></param>
- /// <param name="state"></param>
- public void CameraConnectChangedEvent(Guid id, bool state)
- {
- IsConnected = state;
- }
-
- }
- }
|