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