using AntdUI; using AntdUI.Svg; using DH.Commons.Base; using DH.Commons.Enums; using DH.Commons.Helper; using DH.Commons.Models; using DH.Devices.Camera; using DH.Devices.Motion; using DH.Devices.PLC; using DH.Devices.Vision; using DHSoftware.Languages; using DHSoftware.Models; using DHSoftware.Utils; using DHSoftware.Views; using DVPCameraType; using HalconDotNet; using Microsoft.Win32; using OpenCvSharp; using System; using System.CodeDom; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using XKRS.UI.Device.Winform; using static AntdUI.Math3D; using static DH.Commons.Enums.EnumHelper; using Camera = DHSoftware.Models.Camera; using ResultState = DH.Commons.Base.ResultState; namespace DHSoftware { public partial class MainWindow : AntdUI.Window { private UserControl currControl; private bool isUpdatingTabs = false;//用于阻止Tabs更新 private bool isLight = true; private int testCounter = 1; Dictionary> _cameraRelatedDetectionDict = null; public MainWindow() { InitializeComponent(); //refreshTimer.Start(); //初始化数据 InitData(); //绑定事件 BindEventHandler(); UserConfigFrm userControlFrm = new UserConfigFrm(); userControlFrm.Window = this; userControlFrm.Dock = DockStyle.Fill; tabPage2.Controls.Add(userControlFrm); } private void InitData() { //加载方案 LoadScheme(); } private void LoadScheme() { try { //方案配置初始化 SchemeHelper.Initialize(); //读取方案列表 List list = SchemeHelper.GetAllSchemes(); string CurrentScheme = "默认方案"; //如果是空,新增默认数据 if (list == null || list.Count <= 0) { list = new() { CurrentScheme }; //显示到方案列表 sltProjects.Items.Clear(); sltProjects.Items.Add(CurrentScheme); //保存到方案配置 SchemeHelper.AddScheme(CurrentScheme); SchemeHelper.SetCurrentScheme(CurrentScheme); //新构建配置文件 ConfigHelper.InitializeScheme(CurrentScheme); sltProjects.SelectedIndex = 0; } else { foreach (string s in list) { sltProjects.Items.Add(s); } CurrentScheme = SchemeHelper.GetCurrentScheme(); sltProjects.SelectedValue = CurrentScheme; } SystemModel.CurrentScheme = CurrentScheme; //加载当前方案配置 ConfigHelper.LoadConfig(); } catch (Exception ex) { AntdUI.Message.error(this, ex.Message, autoClose: 3); } } private void BindEventHandler() { btnAddProject.Click += BtnAddProject_Click; btnLoadProject.Click += BtnLoadProject_Click; btnDeleteProject.Click += BtnDeleteProject_Click; } private void BtnDeleteProject_Click(object? sender, EventArgs e) { try { if (sltProjects.Items.Count == 0 || sltProjects.SelectedIndex == -1) return; var result = AntdUI.Modal.open(this, "删除警告!", "确认要删除该方案吗?", TType.Warn); if (result == DialogResult.OK) { int selectedIndex = sltProjects.SelectedIndex; // 删除当前选中项 SchemeHelper.DeleteScheme(sltProjects.Text); ConfigHelper.DeleteSchemeConfig(sltProjects.Text); AntdUI.Message.success(this, $"删除方案{sltProjects.Text}成功!", autoClose: 3); sltProjects.Items.RemoveAt(selectedIndex); // 自动选择下一个(如果存在) if (sltProjects.Items.Count > 0) { // 如果删除的不是最后一项,则选中原位置的新项,否则选中最后一项 sltProjects.SelectedIndex = selectedIndex < sltProjects.Items.Count ? selectedIndex : sltProjects.Items.Count - 1; SystemModel.CurrentScheme = sltProjects.Text; SchemeHelper.SetCurrentScheme(SystemModel.CurrentScheme); //加载当前方案配置 ConfigHelper.LoadConfig(); } else { sltProjects.SelectedIndex = -1; // 清空选择 AntdUI.Modal.open(this, "空方案警告!", "当前方案全部删除,需重启程序!", TType.Warn); } } } catch (Exception ex) { AntdUI.Message.error(this, ex.Message, autoClose: 3); } } private void BtnLoadProject_Click(object? sender, EventArgs e) { try { if (sltProjects.Items.Count == 0 || sltProjects.SelectedIndex == -1) return; if (SystemModel.CurrentScheme == sltProjects.Text) { AntdUI.Message.warn(this, "当前已是该方案,无需重复载入!", autoClose: 3); return; } //修改当前软件当前方案 SystemModel.CurrentScheme = sltProjects.Text; //修改配置当前方案 SchemeHelper.SetCurrentScheme(SystemModel.CurrentScheme); //将配置文件替换为当前方案 ConfigHelper.LoadConfig(); AntdUI.Message.success(this, $"载入方案{SystemModel.CurrentScheme}成功!", autoClose: 3); } catch (Exception ex) { AntdUI.Message.error(this, ex.Message, autoClose: 3); } } private void BtnAddProject_Click(object? sender, EventArgs e) { try { var form = new AddSchemeControl(this, "新增方案操作") { Size = new System.Drawing.Size(400, 300) }; AntdUI.Modal.open(new AntdUI.Modal.Config(this, "", form, TType.None) { BtnHeight = 0, }); if (form.submit) { string SchemeName = form.SchemeName; //保存到方案配置 SchemeHelper.AddScheme(SchemeName); if (form.NullScheme) { //新构建配置文件 ConfigHelper.InitializeScheme(SchemeName); } else { //派生当前方案 ConfigHelper.DeriveScheme(SchemeName); } //刷新方案列表 sltProjects.Items.Clear(); List list = SchemeHelper.GetAllSchemes(); foreach (string s in list) { sltProjects.Items.Add(s); } string CurrentScheme = SchemeHelper.GetCurrentScheme(); sltProjects.SelectedValue = CurrentScheme; AntdUI.Message.success(this, $"新增方案{SchemeName}成功!", autoClose: 3); } } catch (Exception ex) { AntdUI.Message.error(this, ex.Message, autoClose: 3); } } public List HKCameras { get; } = new List(); public List Cameras { get; } = new List(); public Dictionary Dectection { get; } = new Dictionary(); public XinJEPLCTcpNet PLC { get; } = XinJEPLCTcpNet.Instance; SLDMotion sLDMotion = new SLDMotion(); private void MainWindow_Load(object sender, EventArgs e) { } private void MainWindow_FormClosed(object sender, FormClosedEventArgs e) { foreach (var camera in Cameras) { camera.CameraDisConnect(); } foreach (var camera in HKCameras) { //var hk as HikVisionCamera; camera.CameraDisConnect(); } PLC.PLCDisConnect(); } private void segmented1_SelectIndexChanged(object sender, EventArgs e) { // Get the index of the selected item int selectedIndex = segmented1.SelectIndex; // Handle each button based on its index switch (selectedIndex) { case 0: // "启动" (Start) HandleStartButton(); break; case 1: // "停止" (Stop) HandleStopButton(); break; case 2: // "复位" (Reset) HandleResetButton(); break; case 3: // "设置" (Settings) HandleSettingsButton(); break; case 4: // "登录" (Login) HandleLoginButton(); break; default: break; } segmented1.SelectIndex = -1; } public bool CurrentMachine = false; public volatile int ProductNum_Total = 0; public volatile int ProductNum_OK = 0; private readonly object _cameraSummaryLock = new object(); public SimboVisionDriver? _visionEngine = null; public PLCBase? _PLCConfig = null; List DetectionConfigs = new List(); List SimboStationMLEngineList = new List(); Dictionary HalconToolDict = new Dictionary(); public List RecongnitionLabelList { get; set; } = new List(); public DateTime startTime; private void HandleStartButton() { Cameras.Clear(); HKCameras.Clear(); Dectection.Clear(); _cameraRelatedDetectionDict = new(); //初始化相机 链接相机 if (ConfigModel.CameraBaseList.Count > 0) { for (int i = 0; i 0) { for (int i = 0; i < ConfigModel.PLCBaseList.Count; i++) { var plcBase = ConfigModel.PLCBaseList[i]; if(plcBase.PLCType==EnumPLCType.信捷XC网口) { PLC.IP = plcBase.IP; PLC.Enable = plcBase.Enable; PLC.PLCName = plcBase.PLCName; PLC.PLCItemList=plcBase.PLCItemList; PLC.Port= plcBase.Port; PLC.PLCConnect(); } } } if (ConfigModel.DetectionList.Count > 0) { for (int i = 0; i < ConfigModel.DetectionList.Count; i++) { DetectionConfig detectionConfig = ConfigModel.DetectionList[i]; var detection = ConfigModel.DetectionList[i]; detectionConfig.CameraCollects = detection.CameraCollects; detectionConfig.ModelconfThreshold = detection.ModelconfThreshold; detectionConfig.ModelWidth = detection.ModelWidth; detectionConfig.ModelHeight = detection.ModelHeight; detectionConfig.In_lable_path = detection.In_lable_path; detectionConfig.IsEnabled = detection.IsEnabled; detectionConfig.ShowLocation.X = detection.ShowLocation.X; detectionConfig.ShowLocation.Y = detection.ShowLocation.Y; DetectionConfigs.Add(detectionConfig); } } DetectionConfigs.ForEach(detection => { detection.CameraCollects.ForEach(cam => { List Dets = new List { detection.Id }; if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId)) { _cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets); } else { _cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id); } } ); }); string inferenceDevice = "CPU"; // _visionEngine = new SimboVisionDriver(); _visionEngine.DetectionConfigs = DetectionConfigs; //初始化模型 加载模型 _visionEngine.Init(); CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine); tabImgDisplay.Controls.Add(ctrlVisionRun); } private static int currentRegister = 411; // 初始为 D411 private void StartProcess() { //计数清零 PieceCount = 0; //吹气点位归置 currentRegister = 411; if (_PLCConfig?.Enable == true) { PLC.CountToZero(); } ConfigModel.CameraBaseList.ForEach(d => { if (d is CameraBase cam) { cam.SnapshotCount = 0; } }); //PrepareBatchNO(); // isInPositionChecking = false; //isFullTrayChecking = false; //队列清空 // var temp = new List(); // temp.AddRange(XKRSPLCConfig.TriggerConfigCollection); // temp.AddRange(XKRSPLCConfig.SnapshotTriggerConfigCollection); //temp.ForEach(t => //{ // var diskInfo = XKRSPLCConfig.DiskInfoList.FirstOrDefault(u => u.DiskName == t.DiskName); // if (diskInfo != null) // { // t.AxisNum = diskInfo.DiskAxisNum; // } // else // { // t.AxisNum = -1; // } //}); //if (temp.Any(u => u.AxisNum < 0)) //{ // LogAsync(DateTime.Now, LogLevel.Error, "触发信号归属转盘未确认"); // return new ProcessResponse(false); //} // _diskInfoListInOrder = XKRSPLCConfig.DiskInfoList.OrderBy(u => u.DiskSequence).ToList(); // var axisNumList = _diskInfoListInOrder.Select(u => u.DiskAxisNum).ToList(); /// PrepareMLEngine(); // if (_PLCConfig?.Enable == true) //挡料电机操作 // _PLC.FeedingMotor(_PLCConfig.CunToZeroSpeed, _PLCConfig.CunPos, _PLCConfig.CunSpeed, _PLCConfig.CunDirection); //流程开启操作配置 // ProcessInitialAction(); // if (_PLC?Enabled == true) //皮带 // _PLC.Belt(true); //DeviceCollection.ForEach(d => //{ // if (d is CameraBase c) // { // c.OnHImageOutput -= OnCameraHImageOutput; // c.OnHImageOutput += OnCameraHImageOutput; // c.SnapshotCount = 0; // } //}); _productLists.Clear(); #region 虚拟相机 //mOfflineImageTimer = new System.Timers.Timer(); //mOfflineImageTimer.Elapsed += OnEmitSerialPortAsync; //mOfflineImageTimer.Interval = 1000; //mOfflineImageTimer.Start(); #endregion var settings = _visionEngine.DetectionConfigs.Where(u => u.IsEnabled && u.IsAddStation ).ToList(); if (settings != null) { settings = settings.Where(s => s.IsEnabled).ToList(); ProductBaseCount = settings.Count; for (int i = 0; i < ProductBaseCount * ProductListMulti; i++) { ConcurrentDictionary products = new ConcurrentDictionary(); _productLists.Add(products); } } // _MGSCameraList = DeviceCollection //.OfType() // 直接筛选出 MGSCameraDriver 类型的元素 //.Where(camera => camera.IConfig != null && camera.IConfig.IsEnabled) // 进一步筛选 IConfig 不为 null 且 IsEnabled 为 true //.ToList(); // ProductBaseCount = _MGSCameraList.Count; for (int i = 0; i < ProductBaseCount * ProductListMulti; i++) { ConcurrentDictionary products = new ConcurrentDictionary(); _productLists.Add(products); } // 转盘操作 // if (_PLC?.IIConfig?.IsEnabled == true) // _PLC.TurntableOpen(XKRSPLCConfig.TurnSpeed, XKRSPLCConfig.TurnDirection); Thread.Sleep(500); //振动盘 //if (XKRSPLCConfig.IsEnableVibratory) //{ // if (_PLC.IIConfig.IsEnabled) // _PLC.Vibratory(true); //} //InitialOEEStatistic(); // MachineState = MachineState.Running; } private void PrepareMLEngine() { //if (_visionEngine == null) //{ // _visionEngine = DeviceCollection.FirstOrDefault(u => u is VisionEngineBase) as VisionEngineBase; //} //if (_visionEngine == null) //{ // throw new ProcessException($"未能获取检测设备"); //} //相机模组 //_cameraRelatedDetectionDict = new(); //detectionList.ForEach(detection => //{ // detection.CameraCollects.ForEach(cam => // { // List Dets = new List // { // detection.Id // }; // if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId)) // { // _cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets); // } // else // { // _cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id); // } // }); //}); //_visionEngine.OnDetectionWarningStop += VisionEngine_OnDetectionWarningStopAsync; } #if false private void HandleStartButton2() { CurrentMachine = true; //_visionEngine.Start(); //[Category("深度学习检测配置")] //[DisplayName("检测标签定义集合")] //[Description("定义检测标签的集合,例如:Seg/Detection模式:断裂、油污、划伤...;Class模式:ok、ng、上面、下面、套环、正常...")] //[TypeConverter(typeof(CollectionCountConvert))] //[Editor(typeof(ComplexCollectionEditor), typeof(UITypeEditor))] RecongnitionLabel recongnition = new RecongnitionLabel { LabelName = "youwu", LabelDescription = "油污", LabelCategory = "A_NG" }; RecongnitionLabel recongnition2 = new RecongnitionLabel { LabelName = "youwu", LabelDescription = "油污", LabelCategory = "A_NG" }; RecongnitionLabel recongnition3 = new RecongnitionLabel { LabelName = "youwu", LabelDescription = "油污", LabelCategory = "A_NG" }; RecongnitionLabelList.Add(recongnition); RecongnitionLabelList.Add(recongnition2); RecongnitionLabelList.Add(recongnition3); var det1 = new DetectionConfig("相机1", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam1.onnx", false, "Cam1"); var det2 = new DetectionConfig("相机2", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam2.onnx", false, "Cam2"); var det3 = new DetectionConfig("相机3", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam3.onnx", false, "Cam3"); var det4 = new DetectionConfig("相机4", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam4.onnx", false, "Cam4"); var det5 = new DetectionConfig("相机5", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam5.onnx", false, "Cam5"); var det6 = new DetectionConfig("相机6", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam6.onnx", false, "Cam6"); var det7 = new DetectionConfig("相机7", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam7.onnx", false, "Cam7"); var det8 = new DetectionConfig("相机8", ModelType.目标检测, @"D:\PROJECTS\X015\Vision\Cam8.onnx", false, "Cam8"); List CameraCollects = new List(); CameraCollects.Add(new RelatedCamera("Cam1")); List CameraCollects2 = new List(); CameraCollects2.Add(new RelatedCamera("Cam2")); List CameraCollects3 = new List(); CameraCollects3.Add(new RelatedCamera("Cam3")); List CameraCollects4 = new List(); CameraCollects4.Add(new RelatedCamera("Cam4")); List CameraCollects5 = new List(); CameraCollects5.Add(new RelatedCamera("Cam5")); List CameraCollects6 = new List(); CameraCollects6.Add(new RelatedCamera("Cam6")); List CameraCollects7 = new List(); CameraCollects7.Add(new RelatedCamera("Cam7")); List CameraCollects8 = new List(); CameraCollects8.Add(new RelatedCamera("Cam8")); float Conf = 0.5f; det1.CameraCollects = CameraCollects; det1.ModelconfThreshold = Conf; det1.ModelWidth = 640; det1.ModelHeight = 640; det1.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam1.txt"; det1.IsEnabled = true; det1.ShowLocation.X = 1; det1.ShowLocation.Y = 1; det2.CameraCollects = CameraCollects2; det2.ModelconfThreshold = Conf; det2.ModelWidth = 640; det2.ModelHeight = 640; det2.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam2.txt"; det2.IsEnabled = true; det2.ShowLocation.X = 2; det2.ShowLocation.Y = 1; det3.CameraCollects = CameraCollects3; det3.ModelconfThreshold = Conf; det3.ModelWidth = 640; det3.ModelHeight = 640; det3.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam3.txt"; det3.IsEnabled = true; det3.ShowLocation.X = 3; det3.ShowLocation.Y = 1; det4.CameraCollects = CameraCollects4; det4.ModelconfThreshold = Conf; det4.ModelWidth = 640; det4.ModelHeight = 640; det4.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam4.txt"; det4.IsEnabled = true; det4.ShowLocation.X = 4; det4.ShowLocation.Y = 1; det5.CameraCollects = CameraCollects5; det5.ModelconfThreshold = Conf; det5.ModelWidth = 640; det5.ModelHeight = 640; det5.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam5.txt"; det5.IsEnabled = true; det5.ShowLocation.X = 1; det5.ShowLocation.Y = 2; det6.CameraCollects = CameraCollects6; det6.ModelconfThreshold = Conf; det6.ModelWidth = 640; det6.ModelHeight = 640; det6.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam6.txt"; det6.IsEnabled = true; det6.ShowLocation.X = 2; det6.ShowLocation.Y = 2; det7.CameraCollects = CameraCollects7; det7.ModelconfThreshold = Conf; det7.ModelWidth = 640; det7.ModelHeight = 640; det7.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam7.txt"; det7.IsEnabled = true; det7.ShowLocation.X = 3; det7.ShowLocation.Y = 2; det8.CameraCollects = CameraCollects8; det8.ModelconfThreshold = Conf; det8.ModelWidth = 640; det8.ModelHeight = 640; det8.In_lable_path = "D:\\PROJECTS\\X015\\Vision\\Cam8.txt"; det8.IsEnabled = true; det8.ShowLocation.X = 4; det8.ShowLocation.Y = 2; DetectionConfigs.Add(det1); DetectionConfigs.Add(det2); DetectionConfigs.Add(det3); DetectionConfigs.Add(det4); DetectionConfigs.Add(det5); DetectionConfigs.Add(det6); DetectionConfigs.Add(det7); DetectionConfigs.Add(det8); Cameras.Clear(); HKCameras.Clear(); Dectection.Clear(); _cameraRelatedDetectionDict = new(); #if false for (int i = 1; i <= 8; i++) { HikVisionCamera camera = new HikVisionCamera(); camera.CameraName = $"Cam{i}"; camera.CameraIP = $"192.168.{i}.1"; camera.ComputerIP = $"192.168.{i}.1"; camera.CameraConnect(); camera.OnHImageOutput += OnCameraHImageOutput; HKCameras.Add(camera); } #else //Do3ThinkCamera do3ThinkCamera1 = new Do3ThinkCamera(); //do3ThinkCamera1.dvpStreamFormat = dvpStreamFormat.S_RAW8; //do3ThinkCamera1.CameraName = "Cam1"; //do3ThinkCamera1.CameraConnect(); //do3ThinkCamera1.OnHImageOutput += OnCameraHImageOutput; // Cameras.Add(do3ThinkCamera1); for (int i = 1; i <= 8; i++) { Do3ThinkCamera cam = new Do3ThinkCamera(); if (i == 1) { cam.dvpStreamFormat = dvpStreamFormat.S_RAW8; } else { cam.dvpStreamFormat = dvpStreamFormat.S_RGB24; } cam.CameraName = $"Cam{i}"; Cameras.Add(cam); cam.CameraConnect(); cam.OnHImageOutput += OnCameraHImageOutput; } #endif DetectionConfigs.ForEach(detection => { detection.CameraCollects.ForEach(cam => { List Dets = new List { detection.Id }; if (!_cameraRelatedDetectionDict.ContainsKey(cam.CameraSourceId)) { _cameraRelatedDetectionDict.Add(cam.CameraSourceId, Dets); } else { _cameraRelatedDetectionDict[cam.CameraSourceId].Add(detection.Id); } } ); }); string inferenceDevice = "CPU"; _visionEngine = new SimboVisionDriver(); _visionEngine.DetectionConfigs = DetectionConfigs; _visionEngine.Init(); CtrlVisionRunBase ctrlVisionRun = new CtrlVisionRunBase(_visionEngine); tabImgDisplay.Controls.Add(ctrlVisionRun); //Add the code for the "启动" button click here ////初始化Halcon工具 //InitialHalconTools(); ////深度学习模型加载 //bool resultOK = InitialSimboMLEnginesAsync(); //if (resultOK) //{ // //初始化失败 // // return; //} //位置比较卡 sLDMotion.AxisSettings = new List(); AxisSetting axis1 = new AxisSetting(); axis1.AxisIndex = 0; axis1.AxisName = "转盘1"; axis1.IsAxisEnabled = true; //axis1.AlarmLogic = AxisDirection.Positive; sLDMotion.IODefinitionCollection = new List(); Motion(sLDMotion.IODefinitionCollection); sLDMotion.SnapshotSettings = new List(); int[] cameraPositions = { 24161, 33608, 39702, 45701 }; sLDMotion.SnapshotSettings.Add(new SnapshotSetting { IsEnabled = true, CameraIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 13), CameraPosition = 7613, StationNumber = 0 }); for (int i = 0; i < 4; i++) { sLDMotion.SnapshotSettings.Add(new SnapshotSetting { IsEnabled = true, CameraIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == i), CameraPosition = cameraPositions[i], StationNumber = 0 }); } sLDMotion.BlowSettings = new List(); int[] BlowPositions = { 61353, 68566 }; sLDMotion.BlowSettings.Add(new BlowSetting { IsEnabled = true, BlowIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 5), BlowPosition = BlowPositions[0], StationNumber = 0 }); sLDMotion.BlowSettings.Add(new BlowSetting { IsEnabled = true, BlowIO = sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 6), BlowPosition = BlowPositions[1], StationNumber = 0 }); //SnapshotSetting sna1 = new SnapshotSetting(); //sna1.IsEnabled = true; //sna1.CameraIO= sLDMotion.IODefinitionCollection.FirstOrDefault(t => t.IOType == IOType.OUTPUT && t.IOIndex == 0); //sna1.CameraPosition = 17000; //sna1.StationNumber = 0; // sLDMotion.SnapshotSettings.Add(sna1); sLDMotion.AxisSettings.Add(axis1); sLDMotion.Init(); sLDMotion.OnNewPieces -= MainMotion_NewPieces; sLDMotion.OnNewPieces += MainMotion_NewPieces; // sLDMotion.Start(); //PLC.IP = "192.168.6.6"; //PLC.Port = 502; //PLC.PLCConnect(); //PLC.OnNewPieces -= MainMotion_NewPieces; //PLC.OnNewPieces += MainMotion_NewPieces; ProductBaseCount = 8; for (int i = 0; i < ProductBaseCount * ProductListMulti; i++) { ConcurrentDictionary products = new ConcurrentDictionary(); _productLists.Add(products); } sLDMotion.AxisStop(); bool e = sLDMotion.CArdReset(); //转盘速度 sLDMotion.JOGRun(14000, 100000); startTime = DateTime.Now; } public void Motion(List iODefinitions) { for (int i = 0; i < 16; i++) { iODefinitions.Add(new IODefinition { IOType = IOType.INPUT, IOIndex = i, IODesc = $"入料传感器{i + 1}" }); } for (int i = 0; i < 16; i++) { iODefinitions.Add(new IODefinition { IOType = IOType.OUTPUT, IOIndex = i, IODesc = $"入料传感器{i + 1}" }); } } #endif private uint PieceCount = 0; private List> _productLists = new List>(); private int ProductListMulti = 2; private int ProductBaseCount = 0; private int PieceNumberToIndex(uint pn) { // 物料编号,取余 集合数量 int ret = (int)(pn % (ProductBaseCount * ProductListMulti)); return ret; } DateTime _ctTime = DateTime.Now; public async void MainMotion_NewPieces(int axisIndex, uint pieceNumber) { //if (MachineState != MachineState.Running && MachineState != MachineState.Warning) //{ // return; //} PieceCount++; int index = PieceNumberToIndex(pieceNumber); // productDatas.Add(pData); //转盘2 的物料是不是重新覆盖之前的pDta if (axisIndex == 1) { ProductData pData = new ProductData("", pieceNumber, ProductBaseCount); _productLists[index][pieceNumber] = pData; } string logStr = $"时间:{DateTime.Now} 轴{axisIndex}新产品{pieceNumber}加入队列{index}----入料计数{PieceCount}\n"; Task.Run(() => { //this.BeginInvoke(new MethodInvoker(delegate () { richTextBox1.AppendText(logStr); })); }); DateTime dtNow = DateTime.Now; UpdateCT(null, (float)(dtNow - _ctTime).TotalSeconds); _ctTime = dtNow; } public async Task UpdateCT(object objData, float ctTime) { await Task.Run(() => { //OnUpdateCT?.Invoke(objData, ctTime); }); } /// /// 相机回调 /// /// /// /// private void OnCameraHImageOutput(DateTime dt, CameraBase camera, Mat imageSet) { //if (camera.CameraName.Equals("cam1", StringComparison.OrdinalIgnoreCase)) //{ // Console.WriteLine(); //} //if (camera.CameraName.Equals("cam2", StringComparison.OrdinalIgnoreCase)) //{ // Console.WriteLine(); //} // 获取该相机的拍照计数 uint productNumber = (uint)camera.SnapshotCount; Task.Run(async () => { using (Mat localImageSet = imageSet.Clone()) // 复制 Mat 避免并发问题 { // imageSet?.Dispose(); // 拍照计数与物件编号一致,查找对应的产品 ProductData product = null; //内外壁模组多个相机的处理方法 //计算队列的方法不变 int index = PieceNumberToIndex(productNumber); // 找到产品存放在哪个队列里 ConcurrentDictionary tmpDic = _productLists[index]; try { int retryTimes = 100; while (product == null && retryTimes > 0) { if (tmpDic.ContainsKey(productNumber)) { product = tmpDic[productNumber]; } else { // Thread.Sleep(20); await Task.Delay(20); } retryTimes--; } // 如果产品为空,则销毁图片,提示错误 if (null == product) { List pnList = tmpDic.Keys.ToList(); string pnStr = ""; if (pnList != null && pnList.Count > 0) { pnStr = string.Join(",", pnList); } //LogAsync(DateTime.Now, LogLevel.Error, $"{camera.Name} 未找到产品,编号:{productNumber},队列{index}数量:{tmpDic.Count},列表:{pnStr}"); localImageSet.Dispose(); this.BeginInvoke(new MethodInvoker(delegate () { int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; richTextBox1.AppendText(productNumber + "提前推出" + camera.CameraName); // 设置回原来的滚动位置 richTextBox1.SelectionStart = richTextBox1.TextLength; richTextBox1.ScrollToCaret(); })); //重新生成实例 销毁之前的实例 using (StreamWriter sw = new StreamWriter("D://123log.txt", true, Encoding.UTF8)) { sw.WriteLine(productNumber + "提前推出" + camera.CameraName); } return; } // LogAsync(DateTime.Now, LogLevel.Information, $"{camera.Name} 找到产品{productNumber},队列{index}数量:{tmpDic.Count}"); if (!_cameraRelatedDetectionDict.ContainsKey(camera.CameraName)) { localImageSet.Dispose(); this.BeginInvoke(new MethodInvoker(delegate () { int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; richTextBox1.AppendText(productNumber + "提前推出" + camera.CameraName); // 设置回原来的滚动位置 richTextBox1.SelectionStart = richTextBox1.TextLength; richTextBox1.ScrollToCaret(); })); //重新生成实例 销毁之前的实例 using (StreamWriter sw = new StreamWriter("D://123log.txt", true, Encoding.UTF8)) { sw.WriteLine(productNumber + "提前推出" + camera.CameraName); } // LogAsync(DateTime.Now, LogLevel.Warning, $"{camera.Name} 找到产品{productNumber},但是没有推理1"); return; } double totalTime = 0.0; List resultStates = new List(); List? detectionDict = _cameraRelatedDetectionDict[camera.CameraName]; for (int i = 0; i < detectionDict.Count; i++) { string detectionId = detectionDict[i]; // 1. 预处理 using (Mat inferenceImage = localImageSet.Clone()) // 仅在此处克隆,确保推理过程中 Mat 有独立副本 { DetectStationResult temp1=_visionEngine.RunInference(inferenceImage, detectionId); resultStates.Add(temp1.ResultState); product.ResultCollection.Add(temp1); } } product.InferenceOne(); // LogAsync(DateTime.Now, LogLevel.Information, $"{camera.Name} 推理完成,产品{productNumber}"); if (!product.InferenceFinished()) { return; } ProductNum_Total++; CalculateOEE(); this.BeginInvoke(new MethodInvoker(delegate () { int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; richTextBox1.AppendText($"统计结果成功,{productNumber} 吹气!\n"); // 设置回原来的滚动位置 richTextBox1.SelectionStart = richTextBox1.TextLength; richTextBox1.ScrollToCaret(); })); #region 6. 统计产品结果 product.ProductResult = product.ResultCollection.Any(u => u.ResultState != ResultState.OK) ? ResultState.B_NG : ResultState.OK; product.ProductLabelCategory = product.ProductResult.GetEnumDescription(); product.ProductLabel = product.ProductResult.GetEnumDescription(); #endregion #region 7.产品吹气 #endregion // 出列 ProductData temp = null; int tryTimes = 10; while (temp == null && tryTimes > 0) { if (tmpDic.TryRemove(productNumber, out temp)) { break; } tryTimes--; Thread.Sleep(5); } if (temp == null) { string logStr = $"{DateTime.Now}产品{productNumber}出列失败:true," + $"当前队列产品数量:{tmpDic.Count}"; this.BeginInvoke(new MethodInvoker(delegate () { int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; richTextBox1.AppendText(logStr); // 设置回原来的滚动位置 richTextBox1.SelectionStart = richTextBox1.TextLength; richTextBox1.ScrollToCaret(); })); } else { try { string logStr = $"{DateTime.Now}产品{productNumber}出列成功:true," + $"产品结果:{temp.ProductResult.GetEnumDescription()}," + $"当前队列产品数量:{tmpDic.Count}"; this.BeginInvoke(new MethodInvoker(delegate () { int currentScrollPosition = richTextBox1.GetPositionFromCharIndex(richTextBox1.TextLength).Y; richTextBox1.AppendText(logStr); // 设置回原来的滚动位置 richTextBox1.SelectionStart = richTextBox1.TextLength; richTextBox1.ScrollToCaret(); })); //重新生成实例 销毁之前的实例 var saveData = temp.GetProductData(); using (StreamWriter sw = new StreamWriter("D://123log.txt", true, Encoding.UTF8)) { sw.WriteLine(logStr); } } catch (Exception) { } finally { // temp.Dispose(); temp = null; } } // UpdateCT((float)(dtNow - _ctTime).TotalSeconds); //_ctTime = dtNow; // }); } catch (Exception ex) { //LogAsync(DateTime.Now, LogLevel.Error, $"流程检测未捕获的异常:{ex.GetExceptionMessage()}"); product?.Dispose(); } } }); } public void SetResult() { //// detectResult.IsPreTreatDone = detectResult.VisionImageSet.PreTreatedFlag ////2024-02-29 目标检测不能全是NG //if (IsPreTreatNG || IsObjectDetectNG) //{ // return; //} //if (IsPreTreatDone && IsMLDetectDone && IsAfterTreatDone) //{ // ResultState = ResultState.OK; // ResultLabel = ResultState.OK.GetEnumDescription(); //} } private void HandleStopButton() { Cameras.Clear(); Dectection.Clear(); // Add the code for the "停止" button click here // PLC.TurntableStop(); CurrentMachine = true; sLDMotion.Stop(); } public int UPH = 0; public void CalculateOEE() { TimeSpan timeSpan = DateTime.Now - startTime; UPH = (int)(ProductNum_Total / timeSpan.TotalHours) + 100; //UPM = (int)UPH / 60; this.BeginInvoke(new MethodInvoker(delegate () { label1.Text = UPH.ToString(); })); } private void HandleResetButton() { // Add the code for the "复位" button click here MessageBox.Show("复位按钮按下"); } private void HandleSettingsButton() { // Add the code for the "设置" button click here // MessageBox.Show("设置按钮按下"); List listCamBase = new List(); CameraBase cam1 = new CameraBase { CameraName = "Cam1", CameraIP = "192.168.1.101", SerialNumber = "1000001", Gain = 60, Exposure = 10, RotateImage = 0, IsEnabled = false, }; CameraBase cam2 = new CameraBase { CameraName = "Cam2", CameraIP = "192.168.1.101", SerialNumber = "1000002", Gain = 60, Exposure = 10, RotateImage = 0, IsEnabled = false, }; listCamBase.Add(cam1); listCamBase.Add(cam2); SettingWindow settingWindow = new SettingWindow(); settingWindow.Show(); //s.cameras = listCamBase; //s.Show(); } private void HandleLoginButton() { // Add the code for the "登录" button click here MessageBox.Show("登录按钮按下"); } private void splitter1_SplitterMoved(object sender, SplitterEventArgs e) { } } }