From 32eb4a9afdaf53ed92dae8995d22d9d1c164e466 Mon Sep 17 00:00:00 2001 From: luosheng Date: Tue, 27 Jun 2023 19:33:08 +0800 Subject: [PATCH] Alter Endian from enum to partial class --- .../ModbusUtilityTime.cs | 4 +- Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs | 4 +- Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs | 4 +- .../Modbus.Net/Configuration/MachineReader.cs | 2 +- Modbus.Net/Modbus.Net/Enum/Enum.cs | 145 ++++++++++++++++++ .../Modbus.Net/Linker/ComProtocolLinker.cs | 40 ----- Modbus.Net/Modbus.Net/Machine/BaseMachine.cs | 26 ---- Modbus.Net/Modbus.Net/Utility/BaseUtility.cs | 21 --- Samples/AnyType/Controllers/HomeController.cs | 2 +- .../CrossLamp/Controllers/HomeController.cs | 2 +- .../TripleAdd/Controllers/HomeController.cs | 4 +- Tests/Modbus.Net.Tests/MachineMethodTest.cs | 6 +- .../ModbusMultiStationTest.cs | 4 +- Tests/Modbus.Net.Tests/ModbusTest.cs | 6 +- 14 files changed, 164 insertions(+), 106 deletions(-) create mode 100644 Modbus.Net/Modbus.Net/Enum/Enum.cs diff --git a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs index 4bab590..63fca81 100644 --- a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs +++ b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs @@ -16,7 +16,7 @@ namespace Modbus.Net.Modbus.SelfDefinedSample /// 主站号 /// 端格式 public ModbusUtilityTime(int connectionType, byte slaveAddress, byte masterAddress, - Endian endian = Endian.BigEndianLsb) + Endian endian) : base(connectionType, slaveAddress, masterAddress, endian) { } @@ -30,7 +30,7 @@ namespace Modbus.Net.Modbus.SelfDefinedSample /// 主站号 /// 端格式 public ModbusUtilityTime(ModbusType connectionType, string connectionString, byte slaveAddress, byte masterAddress, - Endian endian = Endian.BigEndianLsb) + Endian endian) : base(connectionType, connectionString, slaveAddress, masterAddress, endian) { } diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs index 51b0d01..76c3601 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs @@ -22,7 +22,7 @@ namespace Modbus.Net.Modbus /// 端格式 public ModbusMachine(TKey id, ModbusType connectionType, string connectionString, IEnumerable> getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress, - Endian endian = Endian.BigEndianLsb) + Endian endian) : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { BaseUtility = new ModbusUtility(connectionType, connectionString, slaveAddress, masterAddress, endian); @@ -43,7 +43,7 @@ namespace Modbus.Net.Modbus /// 端格式 public ModbusMachine(TKey id, ModbusType connectionType, string connectionString, IEnumerable> getAddresses, byte slaveAddress, byte masterAddress, - Endian endian = Endian.BigEndianLsb) + Endian endian) : this(id, connectionType, connectionString, getAddresses, true, slaveAddress, masterAddress, endian) { } diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs index 70e38fe..45495b7 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs @@ -79,7 +79,7 @@ namespace Modbus.Net.Modbus /// 主站号 /// 端格式 public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress, - Endian endian = Endian.BigEndianLsb) + Endian endian) : base(slaveAddress, masterAddress) { Endian = endian; @@ -97,7 +97,7 @@ namespace Modbus.Net.Modbus /// 主站号 /// 端格式 public ModbusUtility(ModbusType connectionType, string connectionString, byte slaveAddress, byte masterAddress, - Endian endian = Endian.BigEndianLsb) + Endian endian) : base(slaveAddress, masterAddress) { Endian = endian; diff --git a/Modbus.Net/Modbus.Net/Configuration/MachineReader.cs b/Modbus.Net/Modbus.Net/Configuration/MachineReader.cs index 81f2082..ff8a0be 100644 --- a/Modbus.Net/Modbus.Net/Configuration/MachineReader.cs +++ b/Modbus.Net/Modbus.Net/Configuration/MachineReader.cs @@ -67,7 +67,7 @@ namespace Modbus.Net } case "endian": { - paramsSet.Add(FastEnum.Parse(dic["endian"])); + paramsSet.Add(Endian.Parse(dic["endian"])); break; } default: diff --git a/Modbus.Net/Modbus.Net/Enum/Enum.cs b/Modbus.Net/Modbus.Net/Enum/Enum.cs new file mode 100644 index 0000000..190c1de --- /dev/null +++ b/Modbus.Net/Modbus.Net/Enum/Enum.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Modbus.Net +{ + /// + /// 端格式 + /// + public partial class Endian + { + /// + /// 小端 + /// + public const int LittleEndianLsb = 1; + /// + /// 大端-大端位 + /// + public const int BigEndianLsb = 2; + /// + /// 大端-大端位 + /// + public const int BigEndianMsb = 3; + +#pragma warning disable + protected int Value { get; set; } + + protected Endian(int value) + { + Value = value; + } + + public static implicit operator int(Endian endian) + { + return endian.Value; + } + + public static implicit operator Endian(int value) + { + return new Endian(value); + } + + public static implicit operator Endian(string value) + { + return Endian.Parse(value); + } + + public static implicit operator string(Endian endian) + { + return endian.ToString(); + } + + public static Endian Parse(string value) + { + if (typeof(Endian).GetField(value) != null) + { + return (int)typeof(Endian).GetField(value).GetValue(null); + } + throw new NotSupportedException("Endian name " + value + " is not supported."); + } + + public override string ToString() + { + foreach (var field in typeof(Endian).GetFields()) + { + if ((int)field.GetValue(null) == Value) + { + return field.Name; + } + } + return null; + } +#pragma warning restore + } + + /// + /// 读写设备值的方式 + /// + public enum MachineDataType + { + /// + /// 地址 + /// + Address, + + /// + /// 通讯标识 + /// + CommunicationTag, + + /// + /// 名称 + /// + Name, + + /// + /// Id + /// + Id + } + + /// + /// 波特率 + /// + public enum BaudRate + { +#pragma warning disable + BaudRate75 = 75, + BaudRate110 = 110, + BaudRate134 = 134, + BaudRate150 = 150, + BaudRate300 = 300, + BaudRate600 = 600, + BaudRate1200 = 1200, + BaudRate1800 = 1800, + BaudRate2400 = 2400, + BaudRate4800 = 4800, + BaudRate9600 = 9600, + BaudRate14400 = 14400, + BaudRate19200 = 19200, + BaudRate38400 = 38400, + BaudRate57600 = 57600, + BaudRate115200 = 115200, + BaudRate128000 = 128000, + BaudRate230400 = 230400, + BaudRate460800 = 460800, + BaudRate921600 = 921600, +#pragma warning restore + } + + /// + /// 数据位 + /// + public enum DataBits + { +#pragma warning disable + Seven = 7, + Eight = 8, +#pragma warning restore + } + +} diff --git a/Modbus.Net/Modbus.Net/Linker/ComProtocolLinker.cs b/Modbus.Net/Modbus.Net/Linker/ComProtocolLinker.cs index 0de006d..e84f972 100644 --- a/Modbus.Net/Modbus.Net/Linker/ComProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net/Linker/ComProtocolLinker.cs @@ -3,46 +3,6 @@ using System.IO.Ports; namespace Modbus.Net { - /// - /// 波特率 - /// - public enum BaudRate - { -#pragma warning disable - BaudRate75 = 75, - BaudRate110 = 110, - BaudRate134 = 134, - BaudRate150 = 150, - BaudRate300 = 300, - BaudRate600 = 600, - BaudRate1200 = 1200, - BaudRate1800 = 1800, - BaudRate2400 = 2400, - BaudRate4800 = 4800, - BaudRate9600 = 9600, - BaudRate14400 = 14400, - BaudRate19200 = 19200, - BaudRate38400 = 38400, - BaudRate57600 = 57600, - BaudRate115200 = 115200, - BaudRate128000 = 128000, - BaudRate230400 = 230400, - BaudRate460800 = 460800, - BaudRate921600 = 921600, -#pragma warning restore - } - - /// - /// 数据位 - /// - public enum DataBits - { -#pragma warning disable - Seven = 7, - Eight = 8, -#pragma warning restore - } - /// /// 串口连接对象 /// diff --git a/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs b/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs index c78caf6..725450f 100644 --- a/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs +++ b/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs @@ -6,32 +6,6 @@ using System.Threading.Tasks; namespace Modbus.Net { - /// - /// 读写设备值的方式 - /// - public enum MachineDataType - { - /// - /// 地址 - /// - Address, - - /// - /// 通讯标识 - /// - CommunicationTag, - - /// - /// 名称 - /// - Name, - - /// - /// Id - /// - Id - } - /// /// 设备 /// diff --git a/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs b/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs index b0d45c7..89fc1d2 100644 --- a/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs +++ b/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs @@ -4,27 +4,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -/// -/// 端格式 -/// -public enum Endian -{ - /// - /// 小端 - /// - LittleEndianLsb, - - /// - /// 大端-小端位 - /// - BigEndianLsb, - - /// - /// 大端-大端位 - /// - BigEndianMsb -} - namespace Modbus.Net { /// diff --git a/Samples/AnyType/Controllers/HomeController.cs b/Samples/AnyType/Controllers/HomeController.cs index 5422a2e..eff41f5 100644 --- a/Samples/AnyType/Controllers/HomeController.cs +++ b/Samples/AnyType/Controllers/HomeController.cs @@ -55,7 +55,7 @@ namespace AnyType.Controllers Value = 0, Type = unitValue.DataType.Name }; - var machine = new ModbusMachine("1", ModbusType.Tcp, "10.10.18.251:502", addressUnits, true, 2, 0); + var machine = new ModbusMachine("1", ModbusType.Tcp, "10.10.18.251:502", addressUnits, true, 2, 0, Endian.BigEndianLsb); //启动任务 await MachineJobSchedulerCreator.CreateScheduler("Trigger1", -1, 1).Result.From(machine.Id, machine, MachineDataType.CommunicationTag).Result.Query("Query1", returnValues => diff --git a/Samples/CrossLamp/Controllers/HomeController.cs b/Samples/CrossLamp/Controllers/HomeController.cs index 21c5666..4dec085 100644 --- a/Samples/CrossLamp/Controllers/HomeController.cs +++ b/Samples/CrossLamp/Controllers/HomeController.cs @@ -30,7 +30,7 @@ namespace CrossLamp.Controllers { if (_utility == null) { - _utility = new ModbusUtility(ModbusType.Tcp, "10.10.18.251", 2, 0); + _utility = new ModbusUtility(ModbusType.Tcp, "10.10.18.251", 2, 0, Endian.BigEndianLsb); await _utility.ConnectAsync(); } Lamp light = new Lamp(); diff --git a/Samples/TripleAdd/Controllers/HomeController.cs b/Samples/TripleAdd/Controllers/HomeController.cs index b760401..1a930c1 100644 --- a/Samples/TripleAdd/Controllers/HomeController.cs +++ b/Samples/TripleAdd/Controllers/HomeController.cs @@ -41,7 +41,7 @@ namespace TripleAdd.Controllers { if (utility == null) { - utility = new ModbusUtility(ModbusType.Tcp, "10.10.18.251", 2, 0); + utility = new ModbusUtility(ModbusType.Tcp, "10.10.18.251", 2, 0, Endian.BigEndianLsb); utility.AddressTranslator = new AddressTranslatorModbus(); await utility.ConnectAsync(); } @@ -60,7 +60,7 @@ namespace TripleAdd.Controllers new AddressUnit() {Id = "2", Area = "4X", Address = 2, CommunicationTag = "Add2", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, new AddressUnit() {Id = "3", Area = "4X", Address = 3, CommunicationTag = "Add3", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, new AddressUnit() {Id = "4", Area = "4X", Address = 4, CommunicationTag = "Ans", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, - }, 2, 0); + }, 2, 0, Endian.BigEndianLsb); machine.AddressCombiner = new AddressCombinerContinus(machine.AddressTranslator, 100000); machine.AddressCombinerSet = new AddressCombinerContinus(machine.AddressTranslator, 100000); } diff --git a/Tests/Modbus.Net.Tests/MachineMethodTest.cs b/Tests/Modbus.Net.Tests/MachineMethodTest.cs index baee8d8..5289da5 100644 --- a/Tests/Modbus.Net.Tests/MachineMethodTest.cs +++ b/Tests/Modbus.Net.Tests/MachineMethodTest.cs @@ -12,7 +12,7 @@ namespace Modbus.Net.Tests [TestMethod] public void GetUtility() { - BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, _machineIp, null, true, 2, 0); + BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, _machineIp, null, true, 2, 0, Endian.BigEndianLsb); var utility = baseMachine.GetUtilityMethods(); var methods = utility.GetType().GetRuntimeMethods(); Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "GetDatasAsync") != null, true); @@ -23,7 +23,7 @@ namespace Modbus.Net.Tests [TestMethod] public async Task InvokeUtility() { - BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, _machineIp, null, true, 2, 0); + BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, _machineIp, null, true, 2, 0, Endian.BigEndianLsb); await baseMachine.BaseUtility.ConnectAsync(); var success = await baseMachine.BaseUtility.GetUtilityMethods().SetDatasAsync("4X 1", new object[] { (byte)11 }); Assert.AreEqual(success.IsSuccess, true); @@ -46,7 +46,7 @@ namespace Modbus.Net.Tests CommunicationTag = "A1", DataType = typeof(bool) } - }, true, 2, 0); + }, true, 2, 0, Endian.BigEndianLsb); var success = await baseMachine.GetMachineMethods().SetDatasAsync( MachineDataType.Address, new Dictionary diff --git a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs index 3b4c598..8dfe01e 100644 --- a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs @@ -15,8 +15,8 @@ namespace Modbus.Net.Tests [TestInitialize] public void Init() { - _modbusRtuMachine1 = new ModbusMachine("1", ModbusType.Rtu, _machineCom, null, true, 1, 0); - _modbusRtuMachine2 = new ModbusMachine("2", ModbusType.Rtu, _machineCom, null, true, 2, 0); + _modbusRtuMachine1 = new ModbusMachine("1", ModbusType.Rtu, _machineCom, null, true, 1, 0, Endian.BigEndianLsb); + _modbusRtuMachine2 = new ModbusMachine("2", ModbusType.Rtu, _machineCom, null, true, 2, 0, Endian.BigEndianLsb); } [TestMethod] diff --git a/Tests/Modbus.Net.Tests/ModbusTest.cs b/Tests/Modbus.Net.Tests/ModbusTest.cs index cf61276..332516f 100644 --- a/Tests/Modbus.Net.Tests/ModbusTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusTest.cs @@ -21,11 +21,11 @@ namespace Modbus.Net.Tests [TestInitialize] public void Init() { - _modbusTcpMachine = new ModbusMachine("1", ModbusType.Tcp, _machineIp, null, true, 2, 0); + _modbusTcpMachine = new ModbusMachine("1", ModbusType.Tcp, _machineIp, null, true, 2, 0, Endian.BigEndianLsb); - _modbusRtuMachine = new ModbusMachine("2", ModbusType.Rtu, _machineCom, null, true, 2, 0); + _modbusRtuMachine = new ModbusMachine("2", ModbusType.Rtu, _machineCom, null, true, 2, 0, Endian.BigEndianLsb); - _modbusAsciiMachine = new ModbusMachine("3", ModbusType.Ascii, _machineCom2, null, true, 2, 0); + _modbusAsciiMachine = new ModbusMachine("3", ModbusType.Ascii, _machineCom2, null, true, 2, 0, Endian.BigEndianLsb); } [TestMethod]