using Cognex.VisionPro; using Cognex.VisionPro.QuickBuild; using LampInspectionMachine.Cameralibs; using LampInspectionMachine.Model; using MvCamCtrl.NET; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; using Prism.Mvvm; using LampInspectionMachine.Log4xml; using Cognex.VisionPro.ImageFile; using System.Drawing; using System.Windows.Forms; using System.Web; using System.ComponentModel; using System.Windows.Media.Media3D; using LampInspectionMachine.ViewModels; using System.Collections.Concurrent; using System.Threading; using System.Windows.Controls; using LampInspectionMachine.Views; using System.Windows.Media.Imaging; using System.Windows.Media; using System.Windows; using System.Runtime.InteropServices; using SqlSugar.DistributedSystem.Snowflake; using System.Windows.Threading; using System.Windows.Ink; using System.Data.SqlClient; using System.Xml.Linq; using System.Drawing.Imaging; using System.IO.Packaging; using Cognex.VisionPro.ToolBlock; using System.Windows.Markup; using System.Diagnostics; using LampInspectionMachine.Cameralibs.HKCamera; using Newtonsoft.Json.Linq; using OpenCvSharp.Dnn; using LampInspectionMachine.Interfaces; using System.IO; using LampInspectionMachine.KHLplc; using LampInspectionMachine.Cameralibs.OPTCamera; namespace LampInspectionMachine.Core { public class Management : BindableBase { private CameraView cameraView; private ShowRender render = new ShowRender(); public ShowRender Render { get => render; set { SetProperty(ref render, value); } } private KHLCommunicate _kHLCommunicate; public KHLCommunicate KHLCommunicate { get => _kHLCommunicate; set => _kHLCommunicate = value; } public CameraService CameraService { get; set; } /// /// 相机列表 /// public ObservableCollection CameraList { get => _CameraList; set { SetProperty(ref _CameraList, value); } } /// /// 当前相机配置 /// public CameraInfo CurrCamConfig { get => _CurrCamConfig; set { SetProperty(ref _CurrCamConfig, value); } } /// /// 相机配置列表 /// public List CamConfigs { get => _CamConfigs; set { SetProperty(ref _CamConfigs, value); } } // public bool IsTriggerModel { get => _isTriggerModel; set { SetProperty(ref _isTriggerModel, value); } } public ICamera CurrCamera { get => myCamera; set { SetProperty(ref myCamera, value); } } /// /// 相机对应模板工具 /// // public List CamTemplateS { get => _CamTemplateS; set => _CamTemplateS = value; } public event Action ToolBlockSwitched; public event Action ToolBlockCatched; private int _CurrIndex=0; /// /// 当前选中的视觉方案id /// public int CurrIndex { get => _CurrIndex; set => _CurrIndex = value; } /// /// 当前选中相机的SN /// public string CurrCameraSn { get => _CurrCameraSn; set { SetProperty(ref _CurrCameraSn, value); } } public ObservableCollection VisionProManagers { get => _visionProManagers; set { SetProperty(ref _visionProManagers, value); } } public VisionProManager Currvision { get => _Currvision; set => _Currvision = value ; } private List _CamConfigs = new List(); private ObservableCollection _visionProManagers=new ObservableCollection(); // private List _CamTemplateS = new List(); private CogToolBlock cogToolBlock1; private VisionProManager _Currvision; private CameraInfo _CurrCamConfig = null; private ICamera myCamera; //private bool _isTriggerModel = false; private ObservableCollection _CameraList = new ObservableCollection(); private string _CurrCameraSn = ""; public Stopwatch stopwatch = new Stopwatch(); public Management() { } Thread PlcConnChangThread ; public async void ConnectPlc() { KHLCommunicate = new KHLCommunicate(); await KHLCommunicate.ConnPlc(); if (KHLCommunicate.IsConnected) { PlcConnChangThread = new Thread(RefPlcConnect); PlcConnChangThread.IsBackground = true; PlcConnChangThread.Start(); } } public async void RefPlcConnect() { while (true) { if(!KHLCommunicate.IsConnected) await KHLCommunicate.ConnPlc(); Thread.Sleep(1000); } } /// /// 获取相机列表 /// public void LoadCameraDevice() { CameraService = new CameraService(); CamConfigs = FileHelper.ReadApplicationConfiguration(); CameraList = FindLoadCamera(); if ( CamConfigs.Count == 0 ) { CamConfigs.Add(new CameraInfo() { CameraName = "相机1", Id = new Guid(), SerialNumber = "", VppIndex = 0, VppFileName = "Cam1.vpp" }); CamConfigs.Add(new CameraInfo() { CameraName = "相机2", Id = new Guid(), SerialNumber = "", VppIndex = 1, VppFileName = "Cam2.vpp" }); CamConfigs.Add(new CameraInfo() { CameraName = "相机3", Id = new Guid(), SerialNumber = "", VppIndex = 2, VppFileName = "Cam3.vpp" }); CamConfigs.Add(new CameraInfo() { CameraName = "相机4", Id = new Guid(), SerialNumber = "", VppIndex = 3, VppFileName = "Cam4.vpp" }); CamConfigs.Add(new CameraInfo() { CameraName = "相机5", Id = new Guid(), SerialNumber = "", VppIndex = 4, VppFileName = "Cam5.vpp" }); CamConfigs.Add(new CameraInfo() { CameraName = "相机6", Id = new Guid(), SerialNumber = "", VppIndex = 5, VppFileName = "Cam6.vpp" }); CamConfigs.Add(new CameraInfo() { CameraName = "相机7", Id = new Guid(), SerialNumber = "", VppIndex = 6, VppFileName = "Cam7.vpp" }); CamConfigs.Add(new CameraInfo() { CameraName = "相机8", Id = new Guid(), SerialNumber = "", VppIndex = 7, VppFileName = "Cam8.vpp" }); } LogHelper.Info(Resources.Language.Resources.加载配置文件完成); } public void SaveCameraDevice() { FileHelper.SaveApplicationConfiguration(CamConfigs); LogHelper.Info(Resources.Language.Resources.保存配置完成); } /// /// 初始化相机管理 /// public void InitTemplates(TipService tipService, Management management) { tipService.ShowMsg($"{Resources.Language.Resources.相机模板加载}2 %"); for ( int i = 0; i < CamConfigs.Count; i++ ) { CogToolBlock cogToolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + $"\\Vpp\\{CamConfigs[i].VppFileName}"); VisionProManager vision=new VisionProManager(); ICamera myCamera; myCamera = CreateCamera(CamConfigs[ i ]); if ( myCamera != null && myCamera.IsConnected ) { if ( myCamera.CheckImageCallbackEventIsHas(vision.CamCallBack) ) myCamera.ImageCallbackEvent -= vision.CamCallBack; if ( !myCamera.CheckGrabImageCallbackEventIsHas(vision.ImageCallback) ) myCamera.GrabImageCallbackEvent += vision.ImageCallback; myCamera.CameraConnectChangedEvent += vision.CameraConnectChangedEvent; vision.IsConnected = true; myCamera.SetTriggerMode(true, 0); myCamera.StartTriggerGrabbing(); } vision.Camera = myCamera; vision.PlcData.PlcToPcCodeIndex = ( uint ) ( 100 + i ); vision.PlcData.PcToPlcCompleted = ( uint ) ( 200 + i ); vision.PlcData.PcToPlcResult = ( uint ) ( 300 + i ); vision.PlcData.PcToPlcCodeIndex = ( uint ) ( 400 + i ); vision.CogToolBlock = cogToolBlock; vision.CameraInfo = CamConfigs[ i ]; vision.Management = management; VisionProManagers.Add(vision); tipService.ShowMsg($"{Resources.Language.Resources.相机模板加载}{( i + 1 ) * 10 + 2}%"); } LogHelper.Info(Resources.Language.Resources.模板加载完成); tipService.Tcolse(); } /// /// 单张采集 /// public void SoftTrigger() { if ( CurrCamera.IsConnected ) { CurrCamera.StopGrabbing(); LogHelper.Info(Resources.Language.Resources.软触发配置写入); CurrCamera.SetTriggerMode(false, 7); if ( !CurrCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) ) CurrCamera.ImageCallbackEvent += Currvision.CamCallBack; CurrCamConfig.TriggerMode = false; LogHelper.Info(Resources.Language.Resources.软触发取图); CurrCamera.Grab(); } else { System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.相机未打开); } } /// /// 连续采集写入 /// public void SoftTrigger__Continue() { if ( CurrCamera!=null&& CurrCamera.IsConnected ) { CurrCamera.StopGrabbing(); CurrCamera.SetTriggerMode(false, 7); CurrCamConfig.TriggerMode = false; if ( !CurrCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) ) CurrCamera.ImageCallbackEvent += Currvision.CamCallBack; if (myCamera.CheckGrabImageCallbackEventIsHas(Currvision.ImageCallback)) myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback; LogHelper.Info(Resources.Language.Resources.连续采集启动); CurrCamera.StartGrabbing(); } else { System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.相机未打开); } } /// /// 单张图片测试 /// public void ImageTrigger() { OpenFileDialog openFileDialog = new OpenFileDialog(); if ( openFileDialog.ShowDialog() == DialogResult.OK ) { // 加载图像文件 using ( var bitmap = new Bitmap(openFileDialog.FileName) ) { // 转换为VisionPro图像格式 ICogImage icogImage = new CogImage8Grey(bitmap); // 设置输入参数 Currvision.CogToolBlock.Inputs["Image"].Value = icogImage; //执行处理 Currvision.CogToolBlock.Run(); //获取输出结果 if (Currvision.CogToolBlock.RunStatus.Result == CogToolResultConstants.Accept) { CogToolBlockTerminalCollection outputCollection = Currvision.CogToolBlock.Outputs; ICogRecord record = null; foreach (CogToolBlockTerminal item in outputCollection) { if (item.Value is ICogRecord) record = item.Value as ICogRecord; } ICogImage cogImage = (ICogImage)Currvision.CogToolBlock.Inputs["Image"].Value; if (cogImage != null) { Render = new ShowRender() { //Graphic = outputCollection["Graphic"].Value as CogGraphicCollection, Image = icogImage, Record = record }; } } else { Render = new ShowRender() { Image = icogImage }; } } } } /// /// 图片轮询测试 /// public async Task ImageTrigger__Continue() { try { FolderBrowserDialog openFileDialog = new FolderBrowserDialog(); if ( openFileDialog.ShowDialog() == DialogResult.OK ) { DirectoryInfo folder = new DirectoryInfo(openFileDialog.SelectedPath); FileInfo[] files = folder.GetFiles("*.bmp", SearchOption.AllDirectories); Task.Run(() => { foreach ( FileInfo file in files ) { // 加载图像文件 using ( var bitmap = new Bitmap(file.FullName) ) { // 转换为VisionPro图像格式 ICogImage cogImage = new CogImage8Grey(bitmap); Currvision.ImageCallback(cogImage); } } }); } } catch { } } public void SetHardTrigger_CallBack() { if ( CurrCamera != null && CurrCamera.IsConnected ) { LogHelper.Info(Resources.Language.Resources.硬触发模式启动); CurrCamera.ImageCallbackEvent -= Currvision.CamCallBack; CurrCamera.SetTriggerMode(true, 0); CurrCamConfig.TriggerMode = true; CurrCamera.StartGrabbing(); } else { System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.相机未打开); } } /// /// 查找相机 /// public ObservableCollection FindLoadCamera() { ObservableCollection strings = new ObservableCollection(); if (CamConfigs.Count!=0) { switch (CamConfigs[0].CameraBrand) { case CameraBrand.HikRobot_MVS: var listsn = MvCamera.GetDevices(); if (listsn.Length > 0) { strings.Add(""); for (int i = 0; i < listsn.Length; i++) { strings.Add(listsn[i].SerialNumber); } return strings; } break; case CameraBrand.Basler_Pylon: break; case CameraBrand.SciCamera_Opt: var listsn2 = MVOptCamera.GetDevices(); if (listsn2.Length > 0) { strings.Add(""); for (int i = 0; i < listsn2.Length; i++) { strings.Add(listsn2[i].SerialNumber); } return strings; } break; default: break; } } if (strings.Count > 0) { return strings; } else { System.Windows.Forms.MessageBox.Show(Resources.Language.Resources.未查询到设备, Resources.Language.Resources.提示, MessageBoxButtons.OK); return null; } } public bool InitCamera() { try { ICamera myCamera; if ( CurrCamera != null && CurrCamera.IsConnected ) { CurrCamera.CloseDevice(); myCamera = CameraService.GetCamera(CurrCamera.ID); bool res = myCamera.OpenDevice(); if ( !res ) { myCamera.CloseDevice(); myCamera = null; return false; } else { CurrCamera = myCamera; CurrCamConfig.SerialNumber = myCamera.SerialNumber; if ( myCamera.IsConnected ) { if ( !myCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) ) myCamera.ImageCallbackEvent += Currvision.CamCallBack; if ( !myCamera.CheckGrabImageCallbackEventIsHas(Currvision.ImageCallback) ) myCamera.GrabImageCallbackEvent += Currvision.ImageCallback; if ( !myCamera.CheckCameraConnectChangedEventIsHas(Currvision.CameraConnectChangedEvent) ) myCamera.CameraConnectChangedEvent += Currvision.CameraConnectChangedEvent; } return true; } } else { CurrCamera = null; myCamera = CreateCamera(new CameraInfo() { SerialNumber = CurrCameraSn }); CurrCamera = myCamera; if(myCamera!=null) CurrCamConfig.SerialNumber = myCamera.SerialNumber; if ( myCamera != null&& myCamera.IsConnected ) { if ( !myCamera.CheckImageCallbackEventIsHas(Currvision.CamCallBack) ) myCamera.ImageCallbackEvent += Currvision.CamCallBack; if ( !myCamera.CheckGrabImageCallbackEventIsHas(Currvision.ImageCallback) ) myCamera.GrabImageCallbackEvent += Currvision.ImageCallback; if ( !myCamera.CheckCameraConnectChangedEventIsHas(Currvision.CameraConnectChangedEvent) ) myCamera.CameraConnectChangedEvent += Currvision.CameraConnectChangedEvent; Currvision.IsConnected = true; return true; } return false; } } catch { CurrCamera?.CloseDevice(); CurrCamera = null; return false; } } public ICamera CreateCamera(CameraInfo cameraInfo) { Guid guid = Guid.NewGuid(); CameraService.CreateCamera(guid, cameraInfo); ICamera myCamera = CameraService.GetCamera(guid); if ( myCamera != null ) { try { bool res = myCamera.OpenDevice(); if ( !res ) { myCamera.CloseDevice(); myCamera = null; return null; } else { myCamera.SetExposureTime(cameraInfo.ExpouseTime); return myCamera; } } catch { } } return myCamera; } public void CloseCamera() { CurrCamera?.StopGrabbing(); CurrCamera?.CloseDevice(); CurrCamera = null; } // // 将海康相机帧数据转换为CogImage8Grey灰度图像 // public static ICogImage ConvertToCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo) // { // // 验证像素格式(支持MONO8/RGB8转灰度) // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8 && // pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) // { // throw new ArgumentException("Unsupported pixel format"); // } // // 创建CogImage8Grey对象 // CogImage8Grey cogImage = new CogImage8Grey(); // int width = (int)pFrameInfo.nWidth; // int height = (int)pFrameInfo.nHeight; // // 分配内存并复制数据 // cogImage.Allocate(width, height); // // 获取8位灰度图像像素内存区域 // ICogImage8PixelMemory pixelMemory = (cogImage).Get8GreyPixelMemory( //CogImageDataModeConstants.ReadWrite, //0, 0, //cogImage.Width, cogImage.Height); // IntPtr destPtr = pixelMemory.Scan0; // 获取像素数据指针 // // IntPtr destPtr = cogImage.GetPixelData(CogImageDataModeConstants.ReadWrite); // if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8) // { // // 直接拷贝MONO8数据 // SafeMemoryCopy(destPtr, pData, width * height); // } // else // RGB转灰度 // { // byte[] rgbBuffer = new byte[width * height * 3]; // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length); // unsafe // { // byte* pDest = (byte*)destPtr.ToPointer(); // for (int i = 0; i < rgbBuffer.Length; i += 3) // { // // RGB转灰度公式:0.299*R + 0.587*G + 0.114*B // *pDest++ = (byte)(0.299 * rgbBuffer[i] + // 0.587 * rgbBuffer[i + 1] + // 0.114 * rgbBuffer[i + 2]); // } // } // } // return cogImage; // } // // 将海康相机帧数据转换为CogImage24PlanarColor彩色图像 // public static ICogImage ConvertToColorCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo) // { // if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed) // { // throw new ArgumentException("Only RGB8 format supported for color conversion"); // } // CogImage24PlanarColor cogColorImage = new CogImage24PlanarColor(); // int width = (int)pFrameInfo.nWidth; // int height = (int)pFrameInfo.nHeight; // // 分配内存 // cogColorImage.Allocate(width, height); // // 获取三个颜色平面指针 // CogImage8Grey red = cogColorImage.GetPlane(CogImagePlaneConstants.Red); // CogImage8Grey green = cogColorImage.GetPlane(CogImagePlaneConstants.Green); // CogImage8Grey blue = cogColorImage.GetPlane(CogImagePlaneConstants.Blue); // IntPtr redPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Red).Get8GreyPixelMemory( //CogImageDataModeConstants.ReadWrite, //0, 0, //red.Width, red.Height).Scan0; // 获取像素数据指针 // IntPtr greenPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Green).Get8GreyPixelMemory( //CogImageDataModeConstants.ReadWrite, //0, 0, //red.Width, red.Height).Scan0; ; // IntPtr bluePtr = cogColorImage.GetPlane(CogImagePlaneConstants.Blue).Get8GreyPixelMemory( //CogImageDataModeConstants.ReadWrite, //0, 0, //red.Width, red.Height).Scan0; ; // // 转换RGB数据到平面格式 // byte[] rgbBuffer = new byte[width * height * 3]; // Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length); // unsafe // { // byte* pRed = (byte*)redPtr.ToPointer(); // byte* pGreen = (byte*)greenPtr.ToPointer(); // byte* pBlue = (byte*)bluePtr.ToPointer(); // for (int i = 0; i < rgbBuffer.Length; i += 3) // { // *pRed++ = rgbBuffer[i]; // R // *pGreen++ = rgbBuffer[i + 1]; // G // *pBlue++ = rgbBuffer[i + 2]; // B // } // } // return cogColorImage; // } public void OnSwitchToolBlock(int index) { cogToolBlock1 = VisionProManagers[index].CogToolBlock; CurrCamera= VisionProManagers[ index ].Camera; CurrCamConfig = VisionProManagers[ index ].CameraInfo; ToolBlockSwitched?.Invoke(index); // 触发事件,传递索引参数。 } public void OnSaveSwitchToolBlock(int index) { ToolBlockCatched?.Invoke(index); } } }