From ebcc1d53f14112363bbf539bcaf0202aadcdc9d7 Mon Sep 17 00:00:00 2001
From: C3032 <1057644574@qq.com>
Date: 星期一, 13 四月 2026 12:58:58 +0800
Subject: [PATCH] 2D取图计数功能完成

---
 LB_SmartVision/VisionForm.cs |  335 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 332 insertions(+), 3 deletions(-)

diff --git a/LB_SmartVision/VisionForm.cs b/LB_SmartVision/VisionForm.cs
index f4ed8c8..216c564 100644
--- a/LB_SmartVision/VisionForm.cs
+++ b/LB_SmartVision/VisionForm.cs
@@ -1,6 +1,7 @@
 锘縰sing HalconDotNet;
 using LB_SmartVision.Forms;
 using LB_SmartVision.Forms.Pages;
+using LB_SmartVision.Forms.Pages.BarcodeReaderPage;
 using LB_SmartVision.Forms.Pages.CameraPage;
 using LB_SmartVision.Forms.Pages.CommunicatorPage;
 using LB_SmartVision.Forms.Pages.HistoricalData;
@@ -10,6 +11,7 @@
 using LB_SmartVision.Forms.Pages.SettingPage;
 using LB_SmartVision.Forms.Pages.UserManagementPage;
 using LB_SmartVision.ProcessRun;
+using LB_SmartVision.SQL;
 using LB_SmartVision.Tool;
 using LB_SmartVisionCommon;
 using LB_SmartVisionLoginUI;
@@ -17,6 +19,8 @@
 using LB_VisionProcesses.Cameras;
 using LB_VisionProcesses.Cameras.HRCameras;
 using LB_VisionProcesses.Cameras.LBCameras;
+using LB_VisionProcesses.BarcodeReaders;
+using LB_VisionProcesses.BarcodeReaders.Huayray;
 using LB_VisionProcesses.Communicators;
 using LB_VisionProcesses.Communicators.SiemensS7;
 using LB_VisionProcesses.Communicators.TCom;
@@ -45,6 +49,7 @@
     {
         AllProcessesPage AllProcessesPages = new AllProcessesPage();
         CamerasEditPage CamerasEditPage = new CamerasEditPage();
+        BarcodeReadersEditPage BarcodeReadersEditPage = new BarcodeReadersEditPage();
         HistoricalDataEditPage HistoricalDataEditPage = new HistoricalDataEditPage();
         CommunicatorsEditPage CommunicatorsEditPage = new CommunicatorsEditPage();
         SettingEditPage SettingEditPage = new SettingEditPage();
@@ -67,6 +72,7 @@
 
             GlobalVar.dicCommunicators.DictionaryChanged += CommunicatorsChanged;
             GlobalVar.dicCameras.DictionaryChanged += CamerasChanged;
+            GlobalVar.dicBarcodeReaders.DictionaryChanged += BarcodeReadersChanged;
             GlobalVar.dicProcesses.DictionaryChanged += ProcessRunBllChanged;
 
             //鏈�寮�濮嬪氨娓呯┖鎵�鏈塗ab椤�
@@ -79,6 +85,9 @@
 
             CamerasEditPage.LogInfo += LogInfo;
             materialTabControl.Controls.Add(new MyPage(CamerasEditPage));
+
+            BarcodeReadersEditPage.LogInfo += LogInfo;
+            materialTabControl.Controls.Add(new MyPage(BarcodeReadersEditPage));
 
             CommunicatorsEditPage.LogInfo += LogInfo;
             materialTabControl.Controls.Add(new MyPage(CommunicatorsEditPage));
@@ -572,6 +581,26 @@
             catch { }
         }
 
+        private void BarcodeReadersChanged(object sender, DictionaryChangedEventArgs<string, BarcodeReaderBase> e)
+        {
+            try
+            {
+                switch (e.ChangeType)
+                {
+                    case DictionaryChangeType.Added:
+                        LogInfo($"璇荤爜鍣╗{e.NewValue.SN}]鍔犺浇鎴愬姛", LogInfoType.INFO);
+                        e.NewValue.SN = e.NewKey;
+                        break;
+                    case DictionaryChangeType.Removed:
+                        if (e.OldValue != null)
+                            e.OldValue.Dispose();
+                        LogInfo($"璇荤爜鍣╗{e.OldValue.SN}]宸茬Щ闄�", LogInfoType.INFO);
+                        break;
+                }
+            }
+            catch { }
+        }
+
         private void VisionForm_Load(object sender, EventArgs e)
         {
             XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
@@ -623,6 +652,21 @@
             {
                 LogInfo("鐩告満鍔犺浇澶辫触", LogInfoType.ERROR);
             }
+
+            //鍔犺浇璇荤爜鍣�
+            foreach (var reader in GlobalVar.dicBarcodeReaders.Values)
+            {
+                reader.Dispose();
+            }
+            GlobalVar.dicBarcodeReaders.Clear();
+            if (LoadAllBarcodeReaders(GlobalVar.allBarcodeReadersConnectionStringPath))
+            {
+                LogInfo("璇荤爜鍣ㄥ姞杞芥垚鍔�", LogInfoType.PASS);
+            }
+            else
+            {
+                LogInfo("璇荤爜鍣ㄥ姞杞藉け璐�", LogInfoType.ERROR);
+            }
             //鍔犺浇鍏ㄥ眬鍙橀噺
             IProcess.dicGlobalVars.Clear();
             if (LoadAllProcessVars(GlobalVar.allProcessVarsPath))
@@ -633,7 +677,15 @@
             {
                 LogInfo("鍏ㄥ眬鍙橀噺鍔犺浇澶辫触", LogInfoType.ERROR);
             }
-
+            GlobalVar.dicMotionControlData.Clear();
+            if (LoadMotionControlDatas(GlobalVar.allMotionControlDataPath))
+            {
+                LogInfo("杩愬姩鎺у埗鍙傛暟鍔犺浇鎴愬姛", LogInfoType.PASS);
+            }
+            else
+            {
+                LogInfo("杩愬姩鎺у埗鍙傛暟鍔犺浇澶辫触", LogInfoType.ERROR);
+            }
             //鍔犺浇娴佺▼
             GlobalVar.dicProcesses.Clear();
             if (LoadAllProcess(GlobalVar.allProcessConnectionStringPath))
@@ -687,6 +739,7 @@
             com_ProductName.Items.Add("鏂板");
             com_ProductName.Text = GlobalVar.strProductName;
             this.WindowState = FormWindowState.Maximized;
+            DatabaseRecordProductDataHelper.InitializeDatabase();
         }
 
         public void SaveAllSetting()
@@ -695,9 +748,58 @@
             SaveAllProcessVars();
             SaveAllCommunicators();
             SaveAllCameras();
+            SaveAllBarcodeReaders();
             SaveAllProcessSetting();
             SaveAllLayout();
             SaveAllCsv();
+            SaveMotionControlDatas();
+        }
+        public bool LoadMotionControlDatas(string alMotionControlDataPath)
+        {
+            try
+            {
+                GlobalVar.dicMotionControlData = ConfigManager<ConcurrentDictionary<string, ConcurrentDictionary<string, RecordMotionControlData>>>.LoadConfig<ConcurrentDictionary<string, ConcurrentDictionary<string, RecordMotionControlData>>>(alMotionControlDataPath);
+            }
+            catch
+            {
+                return false;
+            }
+            return true;
+        }
+        public bool SaveMotionControlDatas()
+        {
+            try
+            {
+                ConcurrentDictionary<string, List<string>> removeCameraSN = new ConcurrentDictionary<string, List<string>>();
+                foreach (var item in GlobalVar.dicMotionControlData.Keys)
+                {
+                    List<string> list = new List<string>();
+                    foreach (var itemSN in GlobalVar.dicMotionControlData[item].Keys)
+                    {
+                        if (!GlobalVar.dicCameras.Keys.Contains(itemSN))
+                        {
+                            list.Add(itemSN);
+                        }
+                    }
+                    if (list.Count > 0)
+                    {
+                        removeCameraSN.TryAdd(item, list);
+                    }
+                }
+                foreach (var item in removeCameraSN.Keys)
+                {
+                    foreach (var itemSN in removeCameraSN[item])
+                    {
+                        GlobalVar.dicMotionControlData[item].Keys.Remove(itemSN);
+                    }
+                }
+                ConfigManager<ConcurrentDictionary<string, ConcurrentDictionary<string, RecordMotionControlData>>>.SaveConfig<ConcurrentDictionary<string, ConcurrentDictionary<string, RecordMotionControlData>>>(GlobalVar.dicMotionControlData, GlobalVar.allMotionControlDataPath);
+            }
+            catch
+            {
+                return false;
+            }
+            return true;
         }
 
         public bool LoadAllCameras(string allCamerasConnectionStringPath)
@@ -804,6 +906,105 @@
             catch { return false; }
         }
 
+        public bool LoadAllBarcodeReaders(string allBarcodeReadersConnectionStringPath)
+        {
+            if (!File.Exists(allBarcodeReadersConnectionStringPath))
+            {
+                Debug.WriteLine("璇荤爜鍣ㄩ厤缃枃浠朵笉瀛樺湪锛屽垱寤虹┖鏂囦欢");
+                SaveAllBarcodeReaders();
+                return true;
+            }
+            string strJson = string.Empty;
+            using (StreamReader streamReader = new StreamReader(allBarcodeReadersConnectionStringPath, Encoding.UTF8))
+            {
+                strJson = streamReader.ReadToEnd();
+                streamReader.Close();
+            }
+            GlobalVar.allBarcodeReadersConnectionString = JsonConvert.DeserializeObject<ConcurrentDictionary<string, string>>(strJson);
+            if (GlobalVar.allBarcodeReadersConnectionString == null)
+            {
+                MessageBox.Show("璇荤爜鍣ㄥ姞杞藉け璐�!", "寮傚父");
+                return false;
+            }
+            BarcodeReaderBase reader = null;
+            foreach (var ReaderConnectionString in GlobalVar.allBarcodeReadersConnectionString)
+            {
+                Enum.TryParse<BarcodeReaderBrand>(ReaderConnectionString.Value, out BarcodeReaderBrand brand);
+                switch (brand)
+                {
+                    case BarcodeReaderBrand.Huayray:
+                        {
+                            reader = new HRBarcodeReader();
+                            break;
+                        }
+                    default:
+                        {
+                            MessageBox.Show($"[{ReaderConnectionString.Key}]璇荤爜鍣ㄥ搧鐗屼笉鏀寔!", "寮傚父");
+                            continue;
+                        }
+                }
+                reader.SN = ReaderConnectionString.Key;
+                if (!reader.Open(ReaderConnectionString.Key))
+                {
+                    LogInfo($"鍒濆鍖栬鐮佸櫒[{ReaderConnectionString.Key}]澶辫触", LogInfoType.ERROR);
+                    reader.IsConnected = false;
+                    reader.IsGrabbing = false;
+                }
+                else
+                {
+                    LogInfo($"鍒濆鍖栬鐮佸櫒[{ReaderConnectionString.Key}]鎴愬姛", LogInfoType.PASS);
+                }
+
+                GlobalVar.dicBarcodeReaders.TryAdd(ReaderConnectionString.Key, reader);
+            }
+
+            return true;
+        }
+
+        public bool SaveAllBarcodeReaders()
+        {
+            try
+            {
+                string strJson = string.Empty;
+                GlobalVar.allBarcodeReadersConnectionString = new ConcurrentDictionary<string, string>();
+
+                foreach (var item in GlobalVar.dicBarcodeReaders)
+                {
+                    string ReaderSN = item.Value.SN;
+                    string ReaderBrand = item.Value.Brand.ToString();
+
+                    if (string.IsNullOrEmpty(ReaderSN) || string.IsNullOrEmpty(ReaderBrand))
+                    {
+                        break;
+                    }
+                    GlobalVar.allBarcodeReadersConnectionString.TryAdd(ReaderSN, ReaderBrand);
+                }
+                var settings = new JsonSerializerSettings
+                {
+                    Formatting = Formatting.Indented,
+                    ContractResolver = new DefaultContractResolver
+                    {
+                        NamingStrategy = new CamelCaseNamingStrategy()
+                    }
+                };
+
+                strJson = JsonConvert.SerializeObject(GlobalVar.allBarcodeReadersConnectionString, settings);
+                string directoryPath = Path.GetDirectoryName(GlobalVar.allBarcodeReadersConnectionStringPath);
+                if (!Directory.Exists(directoryPath))
+                {
+                    try
+                    {
+                        Directory.CreateDirectory(directoryPath);
+                    }
+                    catch (Exception)
+                    { }
+                }
+                File.WriteAllText(GlobalVar.allBarcodeReadersConnectionStringPath, strJson, Encoding.UTF8);
+                return true;
+            }
+            catch { return false; }
+        }
+
 
         public bool LoadAllCommunicators(string allCommunicatorsConnectionStringPath)
         {
@@ -850,7 +1051,7 @@
                             string ClassName = match.Groups["ClassName"].Value;   // "TCP"
                             string IP = match.Groups["IP"].Value;          // "127.0.0.1"
                             string Slot = match.Groups["Slot"].Value;        // "1111"
-                            string CpuType= match.Groups["CpuType"].Value;
+                            string CpuType = match.Groups["CpuType"].Value;
                             string PlcAddress = match.Groups["PlcAddress"].Value;
                             string DataType = match.Groups["DataType"].Success ? match.Groups["DataType"].Value : "String";
 
@@ -1027,7 +1228,6 @@
             {
                 string strJson = string.Empty;
                 GlobalVar.allCommunicatorsConnectionString = new ConcurrentDictionary<string, string>();
-
                 foreach (var item in GlobalVar.dicCommunicators)
                 {
                     string ClassName = item.Value.GetType().FullName;// "TCP"
@@ -1056,6 +1256,7 @@
                         string CommunicatorConnectionString = $"({ClassName})[{IP}][{PORT}]";
                         GlobalVar.allCommunicatorsConnectionString.TryAdd(item.Key, CommunicatorConnectionString);
                     }
+                    GlobalVar.dicCommunicators[item.Key].ClassName = ClassName;
                 }
                 var settings = new JsonSerializerSettings
                 {
@@ -1080,6 +1281,11 @@
                     { }
                 }
                 File.WriteAllText(GlobalVar.allCommunicatorsConnectionStringPath, strJson, Encoding.UTF8);
+                foreach (var item in GlobalVar.dicCommunicators)
+                {
+                    string ClassName = item.Value.GetType().FullName;// "TCP"
+                }
+                ConfigManager<ObservableConcurrentDictionary<string, BaseCommunicator>>.SaveConfig<ObservableConcurrentDictionary<string, BaseCommunicator>>(GlobalVar.dicCommunicators, GlobalVar.strApplicationPath + "\\鎵�鏈変骇鍝乗\" + GlobalVar.strProductName + "\\dicCommunicators.json");
                 return true;
             }
             catch { return false; }
@@ -1339,6 +1545,7 @@
                 GlobalVar.strProductName = com_ProductName.SelectedItem?.ToString();
                 foreach (BaseCamera camera in GlobalVar.dicCameras.Values)
                 {
+                    camera.TriggerRunMessageReceived -= TriggerRunMessageReceived;
                     camera.Dispose();
                 }
                 GlobalVar.dicCameras.Clear();
@@ -1652,6 +1859,128 @@
                 communicator.Disconnect();
             }
             FormClosing -= VisionForm_FormClosing;
+
+            //try
+            //{
+            //    Process[] processes = System.Diagnostics.Process.GetProcesses(); //鑾峰緱鎵�鏈夎繘绋�
+            //    foreach (Process p in processes)
+            //    {
+            //        if (p.ProcessName == "LB_SmartVision" && p.StartTime < DateTime.Now.AddMilliseconds(-300))
+            //        {
+            //            p.Kill();
+            //        }
+            //    }
+            //}
+            //catch { }
+
+            KillAllTargetProcesses();
+        }
+
+        /// <summary>
+        /// 鏉�杩涚▼閫昏緫
+        /// </summary>
+        private void KillAllTargetProcesses()
+        {
+            try
+            {
+                // 1. 鑾峰彇褰撳墠杩涚▼ID锛岄伩鍏嶆潃姝昏嚜宸�
+                int currentProcessId = Process.GetCurrentProcess().Id;
+                // 2. 妯$硦鍖归厤杩涚▼鍚嶏紙蹇界暐澶у皬鍐欙級锛岃鐩杤shost/鍚庣紑绛夋儏鍐�
+                var targetProcesses = Process.GetProcesses()
+                    .Where(p =>
+                        p.ProcessName.IndexOf("LB_SmartVision", StringComparison.OrdinalIgnoreCase) >= 0
+                        && p.Id == currentProcessId);
+
+                foreach (var p in targetProcesses)
+                {
+                    try
+                    {
+                        if (!p.HasExited)
+                        {
+                            // 鍏堝皾璇曚紭闆呭叧闂璚inForm绋嬪簭锛堟瘮鐩存帴Kill鏇村弸濂斤級
+                            p.CloseMainWindow();
+                            // 绛夊緟500ms锛岀湅鏄惁姝e父閫�鍑�
+                            if (!p.WaitForExit(500))
+                            {
+                                p.Kill(); // 寮哄埗鏉�姝�
+                                p.WaitForExit(1000); // 绛夊緟杩涚▼瀹屽叏缁堟
+                            }
+                        }
+                        p.Dispose(); // 閲婃斁杩涚▼璧勬簮锛岄伩鍏嶅彞鏌勬硠婕�
+                    }
+                    catch (Exception ex)
+                    {
+                        // 璁板綍寮傚父浣嗕笉涓柇锛屾瘮濡傛潈闄愪笉瓒崇殑鎯呭喌
+                        System.IO.File.AppendAllText("kill_process_log.txt", $"[{DateTime.Now}] 鏉�姝昏繘绋嬪け璐�: {ex.Message}\r\n");
+                    }
+                }
+
+                // 棰濆寤惰繜锛岀‘淇濇枃浠跺彞鏌勫畬鍏ㄩ噴鏀�
+                Thread.Sleep(1000);
+            }
+            catch (Exception)
+            {
+                // 闈欓粯澶辫触锛屼笉褰卞搷绋嬪簭閫�鍑�
+            }
+        }
+
+        private void btn_Run_Click(object sender, EventArgs e)
+        {
+            var matchedItems = GlobalVar.dicProcessSetting
+                                        .Where(item =>
+                                        {
+                                            var value = item.Value;
+                                            var triggerComm = value["瑙﹀彂閫氳"];
+                                            var triggerChar = value["瑙﹀彂瀛楃"];
+                                            return triggerComm != null;
+                                            //return triggerComm != null && triggerComm.Equals(name) &&
+                                            //       (string.IsNullOrEmpty(triggerChar?.ToString()) ||
+                                            //        msg.StartsWith(triggerChar.ToString()));
+                                        })
+                                        .ToList(); // 閬垮厤閲嶅瀛楀吀璁块棶鍜岃绠辨搷浣�
+            if (matchedItems.Count <= 0)
+            {
+                return;
+            }
+            TriggerRunMessageReceived(matchedItems[0].Value["瑙﹀彂閫氳"], matchedItems[0].Value["瑙﹀彂瀛楃"]);
+        }
+
+        private void btn_RunContinuously_Click(object sender, EventArgs e)
+        {
+            if (btn_RunContinuously.Text.Equals("杩炵画杩愯"))
+            {
+                btn_RunContinuously.Text = "鏆傚仠杩愯";
+                Task.Factory.StartNew(() =>
+                {
+                    var matchedItems = GlobalVar.dicProcessSetting
+                                                .Where(item =>
+                                                {
+                                                    var value = item.Value;
+                                                    var triggerComm = value["瑙﹀彂閫氳"];
+                                                    var triggerChar = value["瑙﹀彂瀛楃"];
+                                                    return triggerComm != null;
+                                                    //return triggerComm != null && triggerComm.Equals(name) &&
+                                                    //       (string.IsNullOrEmpty(triggerChar?.ToString()) ||
+                                                    //        msg.StartsWith(triggerChar.ToString()));
+                                                })
+                                                .ToList(); // 閬垮厤閲嶅瀛楀吀璁块棶鍜岃绠辨搷浣�
+                    while (btn_RunContinuously.Text.Equals("鏆傚仠杩愯"))
+                    {
+
+                        TriggerRunMessageReceived(matchedItems[0].Value["瑙﹀彂閫氳"], matchedItems[0].Value["瑙﹀彂瀛楃"]);
+                        Thread.Sleep(500);
+                    }
+                    //this.Invoke(() =>
+                    //{
+                    //});
+                });
+            }
+            else if (btn_RunContinuously.Text.Equals("鏆傚仠杩愯"))
+            {
+                btn_RunContinuously.Text = "杩炵画杩愯";
+                Thread.Sleep(100);
+            }
+
         }
     }
 }

--
Gitblit v1.9.3