From dc18021539bdf4ee176ec9d9b88eb7d9ad581600 Mon Sep 17 00:00:00 2001
From: C3204 <zhengyabo@lanpucloud.cn>
Date: 星期五, 17 四月 2026 17:00:35 +0800
Subject: [PATCH] 新增心跳等常规信号配置&&修改相机轴读取配置等

---
 LB_SmartVision/VisionForm.cs |  340 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 323 insertions(+), 17 deletions(-)

diff --git a/LB_SmartVision/VisionForm.cs b/LB_SmartVision/VisionForm.cs
index be74509..c899473 100644
--- a/LB_SmartVision/VisionForm.cs
+++ b/LB_SmartVision/VisionForm.cs
@@ -34,6 +34,7 @@
 using log4net.Config;
 using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
+using OpenCvSharp;
 using Serilog;
 using Serilog.Events;
 using Sunny.UI;
@@ -50,6 +51,7 @@
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
 using System.Windows.Forms;
+using System.Windows.Media.Media3D;
 
 namespace LB_SmartVision
 {
@@ -82,6 +84,17 @@
 
         // 绐椾綋绫荤殑鍏ㄥ眬鍙橀噺锛氭爣璁版槸鍚﹀厑璁稿垏鎹ab锛堥粯璁ゅ厑璁革級
         private bool _isTabSwitchAllowed = true;
+
+        PausableHeartbeatAsync heartbeat = new PausableHeartbeatAsync(
+            sendHeartbeatAsync: async () =>
+            {
+                // 妯℃嫙寮傛蹇冭烦鍙戦�侊紙濡� HttpClient 璇锋眰锛�
+                await Task.Delay(100); // 妯℃嫙 I/O 寤惰繜
+                Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 蹇冭烦宸插彂閫�");
+            },
+            interval: TimeSpan.FromSeconds(0.5)
+        );
+
 
         #endregion
 
@@ -153,6 +166,7 @@
             materialTabControl.ControlRemoved += (s, e) => UpdateOverflowComboBox();
 
             //HOperatorSet.SetSystem("max_mem_cache", 2048);
+            startPLCThread();
         }
 
         string removeName = string.Empty;
@@ -657,6 +671,32 @@
             catch { return false; }
         }
 
+        public bool LoadAllPLCSettings(string allPLCSettingStringPath)
+        {
+            try
+            {
+                GlobalVar.allPlcSettings = ConfigManager<Dictionary<string, PlcConfig>>.LoadConfig<Dictionary<string, PlcConfig>>(allPLCSettingStringPath);
+            }
+            catch
+            {
+                return false;
+            }
+            return true;
+        }
+
+        public bool SaveAllPLCSettings()
+        {
+            try
+            {
+                ConfigManager<Dictionary<string, PlcConfig>>.SaveConfig<Dictionary<string, PlcConfig>>(GlobalVar.allPlcSettings, GlobalVar.allPlcSettingsPath);
+            }
+            catch
+            {
+                return false;
+            }
+            return true;
+        }
+
         public static bool SaveAllProcessSetting()
         {
             try
@@ -778,6 +818,14 @@
             else
             {
                 LogInfo("閫氳鍔犺浇澶辫触", LogInfoType.ERROR);
+            }
+            if (LoadAllPLCSettings(GlobalVar.allPlcSettingsPath))
+            {
+                LogInfo("PLC閫氳鍔犺浇鎴愬姛", LogInfoType.PASS);
+            }
+            else
+            {
+                LogInfo("PLC閫氳鍔犺浇澶辫触", LogInfoType.ERROR);
             }
             //鍔犺浇鐩告満
             foreach (BaseCamera camera in GlobalVar.dicCameras.Values)
@@ -940,7 +988,7 @@
                     if (GlobalVar.dicCommunicators.Keys.Contains("閫氳0"))
                     {
                         SiemensLBS7 siemensLBS7 = GlobalVar.dicCommunicators["閫氳0"] as SiemensLBS7;
-                        siemensLBS7.Write(GlobalVar.dicMotionControlData[GlobalVar.strProductName][item].XAxisAddress, GlobalVar.dicMotionControlData[GlobalVar.strProductName][item].XAxisAddress);
+                        //siemensLBS7.Write(GlobalVar.dicMotionControlData[GlobalVar.strProductName][item].XAxisAddress, GlobalVar.dicMotionControlData[GlobalVar.strProductName][item].XAxisAddress);
                     }
                 }
             }
@@ -973,6 +1021,7 @@
             SaveMotionControlDatas();
             SaveSerialPorts();
             SaveAllBarcodeReaders();
+            SaveAllPLCSettings();
         }
 
 
@@ -1104,7 +1153,7 @@
         {
             try
             {
-                GlobalVar.dicMotionControlData = ConfigManager<Dictionary<string, Dictionary<string, RecordMotionControlData>>>.LoadConfig<Dictionary<string, Dictionary<string, RecordMotionControlData>>>(alMotionControlDataPath);
+                GlobalVar.dicMotionControlData = ConfigManager<Dictionary<string, Dictionary<string, PlcConfig>>>.LoadConfig<Dictionary<string, Dictionary<string, PlcConfig>>>(alMotionControlDataPath);
             }
             catch
             {
@@ -1141,7 +1190,7 @@
                         GlobalVar.dicMotionControlData[item].Remove(itemSN);
                     }
                 }
-                ConfigManager<Dictionary<string, Dictionary<string, RecordMotionControlData>>>.SaveConfig<Dictionary<string, Dictionary<string, RecordMotionControlData>>>(GlobalVar.dicMotionControlData, GlobalVar.allMotionControlDataPath);
+                ConfigManager<Dictionary<string, Dictionary<string, PlcConfig>>>.SaveConfig<Dictionary<string, Dictionary<string, PlcConfig>>>(GlobalVar.dicMotionControlData, GlobalVar.allMotionControlDataPath);
             }
             catch
             {
@@ -1498,7 +1547,10 @@
                         Debug.WriteLine("No match found.");
                     }
                 }
-
+                if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0)
+                {
+                    GlobalVar.currentCommunicators = GlobalVar.dicCommunicators.Keys.ToList()[0];
+                }
                 return true;
             }
             catch { return false; }
@@ -2963,25 +3015,31 @@
             {
                 camera.Dispose();
             }
+            if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0 &&
+                GlobalVar.dicCommunicators[GlobalVar.currentCommunicators] != null &&
+                GlobalVar.dicCommunicators[GlobalVar.currentCommunicators].bConnected)
+            {
+                foreach (var item in GlobalVar.allPlcSettings[GlobalVar.currentCommunicators].Signals)
+                {
+                    if (item.SignalName.Equals("瑙嗚Ready淇″彿"))
+                    {
+                        if (!string.IsNullOrEmpty("0"))
+                        {
+                            object convertedValue = ConvertValue(item.DataType, "0");
+                            ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(item, convertedValue);
+                        }
+                    }
+                }
+            }
+
+            StopPLC();
+
             foreach (BaseCommunicator communicator in GlobalVar.dicCommunicators.Values)
             {
                 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();
         }
@@ -3073,6 +3131,24 @@
                 {
                     _isTabSwitchAllowed = false;
                     btn_RunContinuously.Text = "鏆傚仠杩愯";
+
+                    if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0 &&
+                        GlobalVar.dicCommunicators[GlobalVar.currentCommunicators] != null &&
+                        GlobalVar.dicCommunicators[GlobalVar.currentCommunicators].bConnected)
+                    {
+                        foreach (var item in GlobalVar.allPlcSettings[GlobalVar.currentCommunicators].Signals)
+                        {
+                            if (item.SignalName.Equals("瑙嗚Ready淇″彿"))
+                            {
+                                if (!string.IsNullOrEmpty("1"))
+                                {
+                                    object convertedValue = ConvertValue(item.DataType, "1");
+                                    ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(item, convertedValue);
+                                }
+                            }
+                        }
+                    }
+                    StartPLC();
                     // 鍏抽棴浣胯兘
                     SelectMainPage();
                     btn_GlobalVar.Enabled = false;
@@ -3129,6 +3205,23 @@
                     ckbAllowRun.Enabled = true;
                     Thread.Sleep(100);
                     _isTabSwitchAllowed = true;
+                    if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0 &&
+                        GlobalVar.dicCommunicators[GlobalVar.currentCommunicators] != null &&
+                        GlobalVar.dicCommunicators[GlobalVar.currentCommunicators].bConnected)
+                    {
+                        foreach (var item in GlobalVar.allPlcSettings[GlobalVar.currentCommunicators].Signals)
+                        {
+                            if (item.SignalName.Equals("瑙嗚Ready淇″彿"))
+                            {
+                                if (!string.IsNullOrEmpty("0"))
+                                {
+                                    object convertedValue = ConvertValue(item.DataType, "0");
+                                    ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(item, convertedValue);
+                                }
+                            }
+                        }
+                    }
+                    StopPLC();
                 }
             }
         }
@@ -3234,6 +3327,219 @@
             }
             materialCombobox1.SelectedItem = materialTabControl.SelectedTab.Text;
         }
+
+
+        #region  PLC蹇冭烦绾跨▼
+        private bool threadStart = false;
+        private AutoResetEvent mAutoResetEventWorking = new AutoResetEvent(false);
+
+        private void startPLCThread()
+        {
+            var taskworking = Task.Factory.StartNew(() =>
+            {
+                PLCHeartBeatWorkThread();
+            });
+        }
+        private void StartPLC()
+        {
+            threadStart = true;
+            mAutoResetEventWorking.Set();
+            AsyncLogHelper.Info("寮�鍚績璺抽�氳绾跨▼锛�");
+        }
+        private void StopPLC()
+        {
+            threadStart = false;
+            Thread.Sleep(10);
+        }
+        bool isStart = true;
+        object plcHeartBeatWorkThread = new object();
+        private bool plcHeartBeat = false;
+        private void PLCHeartBeatWorkThread()
+        {
+            while (isStart)
+            {
+                try
+                {
+                    lock (plcHeartBeatWorkThread)
+                    {
+                        if (threadStart == false)
+                        {
+                            mAutoResetEventWorking.WaitOne();//闃诲绛夊緟
+                        }
+                        else
+                        {
+                            if (threadStart)
+                            {
+                                try
+                                {
+                                    Thread.Sleep(500);
+                                }
+                                catch { }
+                                try
+                                {
+                                    if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0 &&
+                                        GlobalVar.dicCommunicators[GlobalVar.currentCommunicators] != null &&
+                                        GlobalVar.dicCommunicators[GlobalVar.currentCommunicators].bConnected)
+                                    {
+                                        var TaskHeartBeat = Task.Factory.StartNew(() =>
+                                        {
+                                            try
+                                            {
+                                                if (!plcHeartBeat)
+                                                {
+                                                    plcHeartBeat = true;
+                                                    foreach (var item in GlobalVar.allPlcSettings[GlobalVar.currentCommunicators].Signals)
+                                                    {
+                                                        if (item.SignalName.Equals("蹇冭烦淇″彿"))
+                                                        {
+                                                            if (!string.IsNullOrEmpty(plcHeartBeat.ToString()))
+                                                            {
+                                                                object convertedValue = ConvertValue(item.DataType, plcHeartBeat.ToString());
+                                                                ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(item, convertedValue);
+                                                            }
+                                                        }
+                                                    }
+                                                    this.textBox_CommunicationSetting.BackColor = Color.SpringGreen;
+                                                }
+                                                else
+                                                {
+                                                    plcHeartBeat = false;
+                                                    foreach (var item in GlobalVar.allPlcSettings[GlobalVar.currentCommunicators].Signals)
+                                                    {
+                                                        if (item.SignalName.Equals("蹇冭烦淇″彿"))
+                                                        {
+                                                            if (!string.IsNullOrEmpty(plcHeartBeat.ToString()))
+                                                            {
+                                                                object convertedValue = ConvertValue(item.DataType, plcHeartBeat.ToString());
+                                                                ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(item, convertedValue);
+                                                            }
+                                                        }
+                                                    }
+                                                    this.textBox_CommunicationSetting.BackColor = Color.Red;
+                                                }
+                                            }
+                                            catch
+                                            {
+
+                                            }
+                                        });
+                                    }
+                                }
+                                catch
+                                {
+                                }
+                            }
+                        }
+                    }
+                    //Thread.Sleep(1000);
+                }
+                catch { }
+            }
+        }
+        public void stopPLC()
+        {
+            if (btn_RunContinuously.Text.Equals("杩炵画杩愯"))
+            {
+                var taskstopPLC = Task.Factory.StartNew(() =>
+                {
+                    try
+                    {
+                        if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0 &&
+                            GlobalVar.dicCommunicators[GlobalVar.currentCommunicators] != null &&
+                            GlobalVar.dicCommunicators[GlobalVar.currentCommunicators].bConnected)
+                        {
+                            //S7NETplusStaticClass.plc.Write(VVar.softWareParams.StopNG, true);
+                            AsyncLogHelper.Error("[" + DateTime.Now.ToString("yyyy:MM:dd:HH:mm:ss:fff") + "]" + "杩炵画NG娆℃暟涓猴細" + ", 宸插彂鍑哄仠绾夸俊鍙凤紒璇蜂汉涓烘帓鏌ュ苟澶嶄綅寮傚父銆�");
+                        }
+                    }
+                    catch
+                    {
+                        AsyncLogHelper.Error("[" + DateTime.Now.ToString("yyyy:MM:dd:HH:mm:ss:fff") + "]" + "杩炵画NG鍋滅嚎寮傚父锛佽妫�鏌ュ伐鎺ф満鍒癙LC鐨勭綉绾胯繛鎺ワ紒");
+                    }
+                });
+            }
+        }
+        private void abortHeartB()
+        {
+            try
+            {
+                threadStart = false;
+            }
+            catch { }
+        }
+        private void stopPLCHB()
+        {
+            //鍙戦�佺粰PLC鐨処sRead涓篺alse;
+            if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0 &&
+                       GlobalVar.dicCommunicators[GlobalVar.currentCommunicators] != null &&
+                       GlobalVar.dicCommunicators[GlobalVar.currentCommunicators].bConnected)
+            {
+                foreach (var item in GlobalVar.allPlcSettings[GlobalVar.currentCommunicators].Signals)
+                {
+                    if (item.SignalName.Equals("瑙嗚Ready淇″彿"))
+                    {
+                        ((SiemensLBS7)GlobalVar.dicCommunicators[GlobalVar.currentCommunicators]).WriteSignal(item, "0");
+                    }
+                }
+                threadStart = false;
+                AsyncLogHelper.Info("鏆傚仠蹇冭烦閫氳绾跨▼锛�");
+                if (GlobalVar.dicCommunicators != null && GlobalVar.dicCommunicators.Count > 0 &&
+                       GlobalVar.dicCommunicators[GlobalVar.currentCommunicators] != null &&
+                       GlobalVar.dicCommunicators[GlobalVar.currentCommunicators].bConnected)
+                {
+                    this.textBox_CommunicationSetting.BackColor = Color.SpringGreen;
+                }
+                else
+                {
+                    textBox_CommunicationSetting.BackColor = Color.Red;
+                }
+            }
+            else
+            {
+                AsyncLogHelper.Error("鍋滄閫氳寮傚父锛丳LC杩炴帴寮傚父锛岃妫�鏌ュ伐鎺ф満鍒癙LC鐨勭綉绾胯繛鎺ワ紒");
+            }
+            Thread.Sleep(100);
+        }
+        #endregion
+        // 鏁版嵁绫诲瀷杞崲杈呭姪鏂规硶
+        private object ConvertValue(string dataType, string valueStr)
+        {
+            switch (dataType)
+            {
+                case "Bool":
+                    {
+                        if (bool.TryParse(valueStr, out bool b)) return b;
+                        if (valueStr == "1") return true;
+                        if (valueStr == "0") return false;
+                        throw new Exception("鏃犳晥鐨勫竷灏斿��");
+                    }
+                case "Byte":
+                    {
+                        return byte.Parse(valueStr);
+                    }
+                case "Int":
+                    {
+                        return short.Parse(valueStr);
+                    }
+                case "DInt":
+                    {
+                        return int.Parse(valueStr);
+                    }
+                case "Real":
+                    {
+                        return float.Parse(valueStr);
+                    }
+                case "String":
+                    {
+                        return valueStr;
+                    }
+                default:
+                    {
+                        throw new NotSupportedException($"涓嶆敮鎸佺殑绫诲瀷: {dataType}");
+                    }
+            }
+        }
+
     }
 }
 

--
Gitblit v1.9.3