From 1dff5c1f690299efcd0fc456eb7d7d20c503775b Mon Sep 17 00:00:00 2001
From: hwh <332078369@qq.com>
Date: 星期六, 12 十月 2024 16:04:55 +0800
Subject: [PATCH] Modbus读写

---
 Admin.NET/WCS.Application/PLC/ModbusUtil.cs |  273 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 273 insertions(+), 0 deletions(-)

diff --git a/Admin.NET/WCS.Application/PLC/ModbusUtil.cs b/Admin.NET/WCS.Application/PLC/ModbusUtil.cs
new file mode 100644
index 0000000..1c77885
--- /dev/null
+++ b/Admin.NET/WCS.Application/PLC/ModbusUtil.cs
@@ -0,0 +1,273 @@
+锘縰sing IoTClient;
+using IoTClient.Clients.Modbus;
+using IoTClient.Common.Enums;
+using IoTClient.Enums;
+using IoTClient.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Application;
+/// <summary>
+/// Modbus
+/// </summary>
+public class ModbusUtil
+{
+    public readonly long PlcId;
+    public readonly string PlcIP;
+    private ModbusTcpClient _client;
+    private WcsPlc _modPlc;
+    private readonly object OLock = new object();
+    public ModbusUtil(WcsPlc modPlc)
+    {
+        //娴嬭瘯浠g爜
+        //WCS.Application.ModbusUtil modUtil = new WCS.Application.ModbusUtil(new WCS.Application.WcsPlc() { IP = "127.0.0.1", Port = 502 });
+        //var result = modUtil.GetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4");
+        //Console.WriteLine(result.value);
+        //var result2 = modUtil.SetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4", "44");
+        //Console.WriteLine(result2.IsSucceed);
+
+        PlcId = modPlc.Id;
+        PlcIP = modPlc.IP;
+        _modPlc = modPlc;
+        _client = new ModbusTcpClient(modPlc.IP, modPlc.Port);
+        _client.Open();
+    }
+
+    public bool Connected
+    {
+        get { return _client.Connected; }
+    }
+    public IoTClient.Result Open()
+    {
+        return _client.Open();
+    }
+    public IoTClient.Result Close()
+    {
+        return _client.Close();
+    }
+    /// <summary>
+    /// 璇诲彇PLC鍊�
+    /// </summary>
+    /// <param name="PosType">瀛楃绫诲瀷</param>
+    /// <param name="Pos">鍋忕Щ閲�/鍦板潃</param>
+    /// <param name="StationNumber">绔欏彿</param>
+    /// <returns></returns>
+    public (IoTClient.Result, dynamic value) GetDBValue(PLCDataTypeEnum PosType, string Pos, byte StationNumber = 1)
+    {
+        lock (OLock)
+        {
+            dynamic result = null;
+            switch (PosType)
+            {
+                case PLCDataTypeEnum.Bit:
+                    result = _client.ReadCoil(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Byte:
+                    result = _client.ReadDiscrete(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Short:
+                    result = _client.ReadInt16(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.UShort:
+                    result = _client.ReadUInt16(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Int:
+                    result = _client.ReadInt32(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.UInt:
+                    result = _client.ReadUInt32(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Long:
+                    result = _client.ReadInt64(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.ULong:
+                    result = _client.ReadUInt64(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Float:
+                    result = _client.ReadFloat(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Double:
+                    result = _client.ReadDouble(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.String:
+                    result = _client.ReadString(Pos, StationNumber);
+                    break;
+                default:
+                    result = new IoTClient.Result<object>();
+                    break;
+            }
+            return (result, result.Value);
+        }
+    }
+    /// <summary>
+    /// 鎵归噺璇诲彇PLC鍊�
+    /// </summary>
+    /// <returns></returns>
+    public Result<List<ModbusOutput>> GetBatchDBValue(Dictionary<string, PLCDataTypeEnum> listaddress)
+    {
+        lock (OLock)
+        {
+            var list = new List<ModbusInput>();
+            foreach (var address in listaddress)
+            {
+                switch (address.Value)
+                {
+                    case PLCDataTypeEnum.Bit:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Bool,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Byte:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Byte,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Short:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Int16,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.UShort:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.UInt16,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Int:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Int32,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.UInt:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.UInt32,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Long:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Int64,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.ULong:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.UInt64,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Float:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Float,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Double:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Double,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.String:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.String,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return _client.BatchRead(list);
+        }
+    }
+    /// <summary>
+    /// 鍐欏叆PLC鍊�
+    /// </summary>
+    /// <param name="PosType">瀛楃绫诲瀷</param>
+    /// <param name="Pos">鍋忕Щ閲�/鍦板潃</param>
+    /// <param name="Value">鍐欏叆鍊�</param>
+    /// <param name="StationNumber">绔欏彿</param>
+    /// <returns></returns>
+    public IoTClient.Result SetDBValue(PLCDataTypeEnum PosType, string Pos, string Value, byte StationNumber = 1)
+    {
+        switch (PosType)
+        {
+            case PLCDataTypeEnum.Bit:
+                if (!bool.TryParse(Value, out bool bit))
+                {
+                    if (Value == "0")
+                        bit = false;
+                    else if (Value == "1")
+                        bit = true;
+                    else
+                    {
+                        throw new Exception("鍐欏叆鍊奸敊璇�");
+                    }
+                }
+                return _client.Write(Pos, bit, StationNumber);
+            case PLCDataTypeEnum.Byte:
+                return _client.Write(Pos, byte.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Short:
+                return _client.Write(Pos, short.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.UShort:
+                return _client.Write(Pos, ushort.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Int:
+                return _client.Write(Pos, int.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.UInt:
+                return _client.Write(Pos, uint.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Long:
+                return _client.Write(Pos, long.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.ULong:
+                return _client.Write(Pos, ulong.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Float:
+                return _client.Write(Pos, float.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Double:
+                return _client.Write(Pos, float.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.String:
+                return _client.Write(Pos, Value, StationNumber);
+            default:
+                return new IoTClient.Result();
+        }
+    }
+}

--
Gitblit v1.8.0