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