From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点
---
PLCHelper/ModbusHelper.cs | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 153 insertions(+), 0 deletions(-)
diff --git a/PLCHelper/ModbusHelper.cs b/PLCHelper/ModbusHelper.cs
new file mode 100644
index 0000000..adad255
--- /dev/null
+++ b/PLCHelper/ModbusHelper.cs
@@ -0,0 +1,153 @@
+锘縰sing HslCommunication;
+using HslCommunication.ModBus;
+using PLCHelper.Entity;
+using System;
+using System.Collections.Concurrent;
+
+namespace PLCHelper
+{
+ public class ModbusHelper
+ {
+ private static ConcurrentDictionary<string, ModbusTcpNet> cache = new ConcurrentDictionary<string, ModbusTcpNet>();
+
+ internal static ModbusTcpNet GetClient(string ip, int port)
+ {
+ string key = $"{ip}:{port};";
+ if (!cache.ContainsKey(key))
+ {
+ var client = new ModbusTcpNet(ip, port);
+ cache[key] = client;
+ client.ConnectServer();
+ }
+ return cache[key];
+ }
+
+ internal static bool ParseConfig(string address, out string ip, out int port, out string index)
+ {
+ try
+ {
+ var arr = address.Split(',');
+ ip = arr[0];
+ port = int.Parse(arr[1]);
+ index = arr[2];
+ return true;
+ }
+ catch
+ {
+ ip = null;
+ port = -1;
+ index = null;
+ return false;
+ }
+ }
+
+ internal static void Release()
+ {
+ foreach (var client in cache.Values)
+ {
+ client.Dispose();
+ }
+ cache.Clear();
+ }
+
+ internal static bool ReadData(PLCTagData data, out object val, out string errMsg)
+ {
+ val = null;
+ try
+ {
+ string address = data.Address;
+ if (!ModbusHelper.ParseConfig(address, out string ip, out int port, out string index))
+ {
+ errMsg = "瑙f瀽閰嶇疆澶辫触";
+ return false;
+ }
+ var api = ModbusHelper.GetClient(ip, port);
+ if (data.Type == PLCTagType.BOOL)
+ {
+ var res = api.ReadBool(index);
+ val = res.Content;
+ errMsg = res.Message;
+ return res.IsSuccess;
+ }
+ else if (data.Type == PLCTagType.SHORT)
+ {
+ var res = api.ReadInt16(index);
+ val = res.Content;
+ errMsg = res.Message;
+ return res.IsSuccess;
+ }
+ else if (data.Type == PLCTagType.USHORT)
+ {
+ var res = api.ReadUInt16(index);
+ val = res.Content;
+ errMsg = res.Message;
+ return res.IsSuccess;
+ }
+ else if (data.Type == PLCTagType.INT)
+ {
+ var res = api.ReadInt32(index);
+ val = res.Content;
+ errMsg = res.Message;
+ return res.IsSuccess;
+ }
+ else if (data.Type == PLCTagType.FLOAT)
+ {
+ var res = api.ReadFloat(index);
+ val = res.Content;
+ errMsg = res.Message;
+ return res.IsSuccess;
+ }
+ errMsg = "绫诲瀷涓嶆敮鎸�";
+ return false;
+ }
+ catch (Exception ex)
+ {
+ errMsg = ex.Message;
+ return false;
+ }
+ }
+
+ internal static bool WriteData(PLCTagData data, object val, out string msg)
+ {
+ try
+ {
+ string address = data.Address;
+ if (!ParseConfig(address, out string ip, out int port, out string index))
+ {
+ msg = "瑙f瀽閰嶇疆澶辫触";
+ return false;
+ }
+ var api = GetClient(ip, port);
+ OperateResult res;
+ switch (data.Type)
+ {
+ case PLCTagType.BOOL:
+ res = api.Write(index, bool.Parse(val.ToString()));
+ break;
+ case PLCTagType.SHORT:
+ res = api.Write(index, short.Parse(val.ToString()));
+ break;
+ case PLCTagType.USHORT:
+ res = api.Write(index, ushort.Parse(val.ToString()));
+ break;
+ case PLCTagType.INT:
+ res = api.Write(index, int.Parse(val.ToString()));
+ break;
+ case PLCTagType.FLOAT:
+ res = api.Write(index, float.Parse(val.ToString()));
+ break;
+ default:
+ msg = "绫诲瀷涓嶆敮鎸�";
+ return false;
+ }
+ msg = res.Message;
+ return res.IsSuccess;
+ }
+ catch (Exception ex)
+ {
+ msg = ex.Message;
+ return false;
+ }
+ }
+ }
+}
--
Gitblit v1.9.1