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