From da9eb30d00f2d7b3832d0710dbfe3ca3c508c2d8 Mon Sep 17 00:00:00 2001 From: luosheng Date: Sat, 22 Apr 2023 19:20:58 +0800 Subject: [PATCH] Bug fix and test fix --- .../Modbus.Net.Modbus.NA200H.csproj | 2 +- .../IUtilityMethodTime.cs | 4 +- ...Modbus.Net.Modbus.SelfDefinedSample.csproj | 2 +- .../ModbusProtocolTime.cs | 8 +- .../ModbusUtilityTime.cs | 8 +- .../Modbus.Net.Modbus.csproj | 2 +- .../ModbusAsciiProtocolLinker.cs | 6 +- .../Modbus.Net.Modbus/ModbusProtocol.cs | 154 +++--------------- .../ModbusRtuInTcpProtocolLinker.cs | 3 +- .../ModbusRtuInUdpProtocolLinker.cs | 3 +- .../ModbusRtuProtocolLinker.cs | 6 +- .../ModbusUdpProtocolLinker.cs | 4 +- Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs | 52 +----- .../Modbus.Net.OPC/Modbus.Net.OPC.csproj | 2 +- .../Modbus.Net.Siemens.csproj | 2 +- Modbus.Net/Modbus.Net/Modbus.Net.csproj | 2 +- Tests/Modbus.Net.Tests/MachineMethodTest.cs | 4 +- Tests/Modbus.Net.Tests/Modbus.Net.orderedtest | 31 ---- Tests/Modbus.Net.Tests/ModbusTest.cs | 103 ++++-------- 19 files changed, 84 insertions(+), 314 deletions(-) delete mode 100644 Tests/Modbus.Net.Tests/Modbus.Net.orderedtest diff --git a/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj b/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj index 2ffb238..081fb03 100644 --- a/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj +++ b/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj @@ -5,7 +5,7 @@ Modbus.Net.Modbus.NA200H Modbus.Net.Modbus.NA200H Modbus.Net.Modbus.NA200H - 1.4.1-beta05 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net.Modbus diff --git a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/IUtilityMethodTime.cs b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/IUtilityMethodTime.cs index ff2de27..a28eb9a 100644 --- a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/IUtilityMethodTime.cs +++ b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/IUtilityMethodTime.cs @@ -12,13 +12,13 @@ namespace Modbus.Net.Modbus.SelfDefinedSample /// 获取PLC时间 /// /// PLC时间 - Task> GetTimeAsync(); + Task> GetTimeAsync(ushort startAddress); /// /// 设置PLC时间 /// /// 设置PLC时间 /// 设置是否成功 - Task> SetTimeAsync(DateTime setTime); + Task> SetTimeAsync(ushort startAddress, DateTime setTime); } } diff --git a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/Modbus.Net.Modbus.SelfDefinedSample.csproj b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/Modbus.Net.Modbus.SelfDefinedSample.csproj index 15a05bb..edf83a0 100644 --- a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/Modbus.Net.Modbus.SelfDefinedSample.csproj +++ b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/Modbus.Net.Modbus.SelfDefinedSample.csproj @@ -5,7 +5,7 @@ Modbus.Net.Modbus.SelfDefinedSample Modbus.Net.Modbus.SelfDefinedSample Modbus.Net.Modbus.SelfDefinedSample - 1.4.1-beta05 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net.Modbus diff --git a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusProtocolTime.cs b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusProtocolTime.cs index 5d67e60..542ee19 100644 --- a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusProtocolTime.cs +++ b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusProtocolTime.cs @@ -30,11 +30,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample /// 构造函数 /// /// 从站号 - public GetSystemTimeModbusInputStruct(byte slaveAddress) + public GetSystemTimeModbusInputStruct(byte slaveAddress, ushort startAddress) { SlaveAddress = slaveAddress; FunctionCode = (byte)ModbusProtocolTimeFunctionCode.GetSystemTime; - StartAddress = 30000; + StartAddress = startAddress; GetCount = 5; } @@ -162,11 +162,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample /// /// 从站号 /// 时间 - public SetSystemTimeModbusInputStruct(byte slaveAddress, DateTime time) + public SetSystemTimeModbusInputStruct(byte slaveAddress, ushort startAddress, DateTime time) { SlaveAddress = slaveAddress; FunctionCode = (byte)ModbusProtocolTimeFunctionCode.SetSystemTime; - StartAddress = 30000; + StartAddress = startAddress; WriteCount = 5; WriteByteCount = 10; Year = (ushort)time.Year; diff --git a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs index 2165d46..4bab590 100644 --- a/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs +++ b/Modbus.Net/Modbus.Net.Modbus.SelfDefinedSample/ModbusUtilityTime.cs @@ -39,11 +39,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample /// 读时间 /// /// 设备的时间 - public async Task> GetTimeAsync() + public async Task> GetTimeAsync(ushort startAddress) { try { - var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress); + var inputStruct = new GetSystemTimeModbusInputStruct(SlaveAddress, startAddress); var outputStruct = await Wrapper.SendReceiveAsync( Wrapper[typeof(GetSystemTimeModbusProtocol)], inputStruct); @@ -73,11 +73,11 @@ namespace Modbus.Net.Modbus.SelfDefinedSample /// /// 需要写入的时间 /// 写入是否成功 - public async Task> SetTimeAsync(DateTime setTime) + public async Task> SetTimeAsync(ushort startAddress, DateTime setTime) { try { - var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, setTime); + var inputStruct = new SetSystemTimeModbusInputStruct(SlaveAddress, startAddress, setTime); var outputStruct = await Wrapper.SendReceiveAsync( Wrapper[typeof(SetSystemTimeModbusProtocol)], inputStruct); diff --git a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj index 8f7111d..675d96e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj +++ b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj @@ -5,7 +5,7 @@ Modbus.Net.Modbus Modbus.Net.Modbus Modbus.Net.Modbus - 1.4.1-beta05 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net.Modbus diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs index b68256e..bcc1cf5 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusAsciiProtocolLinker.cs @@ -16,10 +16,8 @@ namespace Modbus.Net.Modbus public ModbusAsciiProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((IConnectorWithController)BaseConnector).AddController(new MatchController( - new ICollection<(int, int)>[] { - new List<(int, int)> { (1, 1), (2, 2) }, new List<(int, int)> { (3, 3), (4, 4) } }, - int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), + ((IConnectorWithController)BaseConnector).AddController(new FifoController( + int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), lengthCalc: content => { if (content[0] != 0x3a) return 0; diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs index f5a0a6e..6fee1b8 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusProtocol.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using ProtocolUnit = Modbus.Net.ProtocolUnit; @@ -296,10 +297,14 @@ namespace Modbus.Net.Modbus FunctionCode = (byte)translateAddress.Area; StartAddress = (ushort)translateAddress.Address; var writeByteValue = ValueHelper.GetInstance(endian).ObjectArrayToByteArray(writeValue); + if (writeByteValue.Length % 2 == 1) writeByteValue = writeByteValue.ToList().Append(0).ToArray(); WriteCount = (ushort)(writeByteValue.Length / addressTranslator.GetAreaByteLength(translateAddress.AreaString)); WriteByteCount = (byte)writeByteValue.Length; WriteValue = writeByteValue; + translateAddress = ((ModbusTranslatorBase)addressTranslator).AddressTranslate(startAddress, false, WriteCount == 1); + FunctionCode = (byte)translateAddress.Area; + StartAddress = (ushort)translateAddress.Address; } /// @@ -389,8 +394,18 @@ namespace Modbus.Net.Modbus { var r_message = (WriteDataModbusInputStruct)message; var dataValue = Format(r_message.WriteValue); - var formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode, - r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, dataValue); + byte[] formattingBytes; + if (r_message.FunctionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil || r_message.FunctionCode == (byte)ModbusProtocolFunctionCode.WriteSingleRegister) + { + formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode, + r_message.StartAddress, dataValue); + } + else + { + formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode, + r_message.StartAddress, r_message.WriteCount, r_message.WriteByteCount, dataValue); + } + return formattingBytes; } @@ -406,142 +421,15 @@ namespace Modbus.Net.Modbus var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag); var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); var writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); + if (functionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil || functionCode == (byte)ModbusProtocolFunctionCode.WriteSingleRegister) + { + writeCount = 1; + } return new WriteDataModbusOutputStruct(slaveAddress, functionCode, startAddress, writeCount); } } - /// - /// 写数据输入 - /// - public class WriteSingleCoilModbusInputStruct : IInputStruct - { - /// - /// 构造函数 - /// - /// 从站号 - /// 开始地址 - /// 写入的数据 - /// 地址翻译器 - /// 端格式 - public WriteSingleCoilModbusInputStruct(byte slaveAddress, string startAddress, object writeValue, - ModbusTranslatorBase addressTranslator, Endian endian) - { - SlaveAddress = slaveAddress; - var translateAddress = addressTranslator.AddressTranslate(startAddress, false, true); - FunctionCode = (byte)translateAddress.Area; - StartAddress = (ushort)translateAddress.Address; - var writeByteValue = - FunctionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil - ? ((bool)writeValue - ? new byte[] { 0xFF, 0x00 } - : new byte[] { 0x00, 0x00 }) - : ValueHelper.GetInstance(endian).GetBytes(ushort.Parse(writeValue.ToString())); - WriteValue = writeByteValue; - } - - - /// - /// 从站号 - /// - public byte SlaveAddress { get; } - - /// - /// 功能码 - /// - public byte FunctionCode { get; } - - /// - /// 开始地址 - /// - public ushort StartAddress { get; } - - /// - /// 写入的数据 - /// - public byte[] WriteValue { get; } - } - - /// - /// 写数据输出 - /// - public class WriteSingleCoilModbusOutputStruct : IOutputStruct - { - /// - /// 构造函数 - /// - /// 从站号 - /// 功能码 - /// 开始地址 - /// 写入的数据 - public WriteSingleCoilModbusOutputStruct(byte slaveAddress, byte functionCode, - ushort startAddress, object writeValue) - { - SlaveAddress = slaveAddress; - FunctionCode = functionCode; - StartAddress = startAddress; - WriteValue = writeValue; - } - - /// - /// 从站号 - /// - public byte SlaveAddress { get; private set; } - - /// - /// 功能码 - /// - public byte FunctionCode { get; private set; } - - /// - /// 开始地址 - /// - public ushort StartAddress { get; private set; } - - /// - /// 写入的数据 - /// - public object WriteValue { get; private set; } - } - - /// - /// 写多个寄存器协议 - /// - public class WriteSingleCoilModbusProtocol : ProtocolUnit - { - /// - /// 格式化 - /// - /// 写寄存器参数 - /// 写寄存器协议核心 - public override byte[] Format(IInputStruct message) - { - var r_message = (WriteSingleCoilModbusInputStruct)message; - var dataValue = Format(r_message.WriteValue); - var formattingBytes = Format(r_message.SlaveAddress, r_message.FunctionCode, - r_message.StartAddress, dataValue); - return formattingBytes; - } - - /// - /// 反格式化 - /// - /// 设备返回的信息 - /// 当前反格式化的位置 - /// 反格式化的信息 - public override IOutputStruct Unformat(byte[] messageBytes, ref int flag) - { - var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag); - var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag); - var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); - var writeValue = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag); - var returnValue = functionCode == (byte)ModbusProtocolFunctionCode.WriteSingleCoil - ? (object)(writeValue == 0xFF00) : writeValue; - return new WriteSingleCoilModbusOutputStruct(slaveAddress, functionCode, startAddress, - returnValue); - } - } - #endregion /// diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs index c340c6b..ae8d1d5 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInTcpProtocolLinker.cs @@ -28,7 +28,8 @@ namespace Modbus.Net.Modbus int.Parse(ConfigurationReader.GetValue("TCP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { - if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; + if (content[1] > 128) return 5; + else if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; else return DuplicateWithCount.GetDuplcateFunc(new List { 2 }, 5).Invoke(content); }, checkRightFunc: ContentCheck.Crc16CheckRight, diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs index 3a0ef4a..b4365b2 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuInUdpProtocolLinker.cs @@ -28,7 +28,8 @@ namespace Modbus.Net.Modbus int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), lengthCalc: content => { - if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; + if (content[1] > 128) return 5; + else if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; else return DuplicateWithCount.GetDuplcateFunc(new List { 2 }, 5).Invoke(content); }, checkRightFunc: ContentCheck.Crc16CheckRight, diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs index 76fb9a7..2e6f05e 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusRtuProtocolLinker.cs @@ -15,12 +15,12 @@ namespace Modbus.Net.Modbus public ModbusRtuProtocolLinker(string com, int slaveAddress) : base(com, slaveAddress) { - ((IConnectorWithController)BaseConnector).AddController(new MatchController( - new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0) }, new List<(int, int)> { (1, 1) } }, + ((IConnectorWithController)BaseConnector).AddController(new FifoController( int.Parse(ConfigurationReader.GetValue("COM:" + com + ":" + slaveAddress, "FetchSleepTime")), lengthCalc: content => { - if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; + if (content[1] > 128) return 5; + else if (content[1] == 5 || content[1] == 6 || content[1] == 15 || content[1] == 16 || content[1] == 21) return 8; else return DuplicateWithCount.GetDuplcateFunc(new List { 2 }, 5).Invoke(content); }, checkRightFunc: ContentCheck.Crc16CheckRight, diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs index 4b7cb2a..a917e9a 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUdpProtocolLinker.cs @@ -23,8 +23,8 @@ namespace Modbus.Net.Modbus /// 端口 public ModbusUdpProtocolLinker(string ip, int port) : base(ip, port) { - ((IConnectorWithController)BaseConnector).AddController(new FifoController( - int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "FetchSleepTime")), + ((IConnectorWithController)BaseConnector).AddController(new ModbusTcpMatchDirectlySendController( + new ICollection<(int, int)>[] { new List<(int, int)> { (0, 0), (1, 1) } }, lengthCalc: DuplicateWithCount.GetDuplcateFunc(new List { 4, 5 }, 6), waitingListMaxCount: ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount") != null ? int.Parse(ConfigurationReader.GetValue("UDP:" + ip + ":" + port, "WaitingListCount")) : diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs index 041953c..d1e5365 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs @@ -50,24 +50,10 @@ namespace Modbus.Net.Modbus AsciiInUdp = 7 } - /// - /// 写单个数据方法接口 - /// - public interface IUtilityMethodWriteSingleCoil : IUtilityMethod - { - /// - /// 写数据 - /// - /// 起始地址 - /// 需要设置的数据 - /// 设置是否成功 - Task> SetSingleCoilAsync(string startAddress, object setContent); - } - /// /// Modbus基础Api入口 /// - public class ModbusUtility : BaseUtility, PipeUnit>, IUtilityMethodWriteSingleCoil + public class ModbusUtility : BaseUtility, PipeUnit> { private static readonly ILogger logger = LogProvider.CreateLogger(); @@ -327,41 +313,5 @@ namespace Modbus.Net.Modbus }; } } - - /// - /// 写数据 - /// - /// 起始地址 - /// 需要设置的数据 - /// 设置是否成功 - public async Task> SetSingleCoilAsync(string startAddress, object setContent) - { - try - { - var inputStruct = new WriteSingleCoilModbusInputStruct(SlaveAddress, startAddress, setContent, - (ModbusTranslatorBase)AddressTranslator, Endian); - var outputStruct = await - Wrapper.SendReceiveAsync(Wrapper[typeof(WriteSingleCoilModbusProtocol)], - inputStruct); - return new ReturnStruct() - { - Datas = outputStruct?.WriteValue.ToString() == setContent.ToString(), - IsSuccess = outputStruct?.WriteValue.ToString() == setContent.ToString(), - ErrorCode = outputStruct?.WriteValue.ToString() == setContent.ToString() ? 0 : -2, - ErrorMsg = outputStruct?.WriteValue.ToString() == setContent.ToString() ? "" : "Data length mismatch" - }; - } - catch (ModbusProtocolErrorException e) - { - logger.LogError(e, $"ModbusUtility -> SetSingleDatas: {ConnectionString} error: {e.Message}"); - return new ReturnStruct - { - Datas = false, - IsSuccess = false, - ErrorCode = e.ErrorMessageNumber, - ErrorMsg = e.Message - }; - } - } } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj index b901e52..e16fe60 100644 --- a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj +++ b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj @@ -5,7 +5,7 @@ Modbus.Net.OPC Modbus.Net.OPC Modbus.Net.OPC - 1.4.1-beta05 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net.OPC diff --git a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj index 9e7d830..a347872 100644 --- a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj +++ b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj @@ -5,7 +5,7 @@ Modbus.Net.Siemens Modbus.Net.Siemens Modbus.Net.Siemens - 1.4.1-beta05 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. Modbus.Net Siemens Profinet Implementation diff --git a/Modbus.Net/Modbus.Net/Modbus.Net.csproj b/Modbus.Net/Modbus.Net/Modbus.Net.csproj index ddbbae7..540b712 100644 --- a/Modbus.Net/Modbus.Net/Modbus.Net.csproj +++ b/Modbus.Net/Modbus.Net/Modbus.Net.csproj @@ -5,7 +5,7 @@ Modbus.Net Modbus.Net Modbus.Net - 1.4.1-beta05 + 1.4.1 Modbus.Net Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. diff --git a/Tests/Modbus.Net.Tests/MachineMethodTest.cs b/Tests/Modbus.Net.Tests/MachineMethodTest.cs index e14ec82..baee8d8 100644 --- a/Tests/Modbus.Net.Tests/MachineMethodTest.cs +++ b/Tests/Modbus.Net.Tests/MachineMethodTest.cs @@ -25,10 +25,10 @@ namespace Modbus.Net.Tests { BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, _machineIp, null, true, 2, 0); await baseMachine.BaseUtility.ConnectAsync(); - var success = await baseMachine.BaseUtility.GetUtilityMethods().SetDatasAsync("4X 1", new object[] { (ushort)11 }); + var success = await baseMachine.BaseUtility.GetUtilityMethods().SetDatasAsync("4X 1", new object[] { (byte)11 }); Assert.AreEqual(success.IsSuccess, true); var datas = await baseMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); - Assert.AreEqual(datas.Datas[1], 11); + Assert.AreEqual(datas.Datas[0], 11); baseMachine.Disconnect(); } diff --git a/Tests/Modbus.Net.Tests/Modbus.Net.orderedtest b/Tests/Modbus.Net.Tests/Modbus.Net.orderedtest deleted file mode 100644 index 7f3ab26..0000000 --- a/Tests/Modbus.Net.Tests/Modbus.Net.orderedtest +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/Modbus.Net.Tests/ModbusTest.cs b/Tests/Modbus.Net.Tests/ModbusTest.cs index cd7f2c5..cf61276 100644 --- a/Tests/Modbus.Net.Tests/ModbusTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusTest.cs @@ -16,6 +16,8 @@ namespace Modbus.Net.Tests private string _machineCom = "COM1"; + private string _machineCom2 = "COM3"; + [TestInitialize] public void Init() { @@ -23,7 +25,7 @@ namespace Modbus.Net.Tests _modbusRtuMachine = new ModbusMachine("2", ModbusType.Rtu, _machineCom, null, true, 2, 0); - _modbusAsciiMachine = new ModbusMachine("3", ModbusType.Ascii, _machineCom, null, true, 2, 0); + _modbusAsciiMachine = new ModbusMachine("3", ModbusType.Ascii, _machineCom2, null, true, 2, 0); } [TestMethod] @@ -60,9 +62,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); - Assert.AreEqual(ans2.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); - Assert.AreEqual(ans3.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans.Datas?["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans2.Datas?["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans3.Datas?["0X 1.0"].DeviceValue, dic1["0X 1.0"]); } [TestMethod] @@ -87,9 +89,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans.Datas["1X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans2.Datas["1X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans3.Datas["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans.Datas?["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans2.Datas?["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans3.Datas?["1X 1.0"].DeviceValue, 0); } [TestMethod] @@ -114,9 +116,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans.Datas["3X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans2.Datas["3X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans3.Datas["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans.Datas?["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans2.Datas?["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans3.Datas?["3X 1.0"].DeviceValue, 0); } [TestMethod] @@ -153,9 +155,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); - Assert.AreEqual(ans2.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); - Assert.AreEqual(ans3.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans.Datas?["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans2.Datas?["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans3.Datas?["4X 1.0"].DeviceValue, dic1["4X 1"]); } [TestMethod] @@ -254,63 +256,24 @@ namespace Modbus.Net.Tests var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.CommunicationTag); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.CommunicationTag); - Assert.AreEqual(ans.Datas["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans.Datas["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans.Datas["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans.Datas["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans.Datas["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans.Datas["A6"].DeviceValue, dic1["A6"]); - Assert.AreEqual(ans2.Datas["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans2.Datas["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans2.Datas["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans2.Datas["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans2.Datas["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans2.Datas["A6"].DeviceValue, dic1["A6"]); - Assert.AreEqual(ans3.Datas["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans3.Datas["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans3.Datas["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans3.Datas["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans3.Datas["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans3.Datas["A6"].DeviceValue, dic1["A6"]); - } - - [TestMethod] - public async Task ModbusWriteSingleTest() - { - Random r = new Random(); - - var dic1 = new Dictionary() - { - { - "4X 1", r.Next(0, UInt16.MaxValue) - } - }; - - var dic2 = new Dictionary() - { - { - "0X 1", r.Next(0, 2) - } - }; - - await _modbusTcpMachine!.BaseUtility.GetUtilityMethods().SetSingleCoilAsync("4X 1", dic1["4X 1"]); - await _modbusAsciiMachine!.BaseUtility.GetUtilityMethods().SetSingleCoilAsync("4X 1", dic1["4X 1"]); - await _modbusRtuMachine!.BaseUtility.GetUtilityMethods().SetSingleCoilAsync("4X 1", dic1["4X 1"]); - var ans = await _modbusTcpMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); - var ans2 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); - var ans3 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); - Assert.AreEqual(ans.Datas[0], dic1["4X 1"]); - Assert.AreEqual(ans2.Datas[0], dic1["4X 1"]); - Assert.AreEqual(ans3.Datas[0], dic1["4X 1"]); - await _modbusTcpMachine.BaseUtility.GetUtilityMethods().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1); - await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1); - await _modbusRtuMachine.BaseUtility.GetUtilityMethods().SetSingleCoilAsync("0X 1", dic2["0X 1"] >= 1); - var ans21 = await _modbusTcpMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("0X 1", 1); - var ans22 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("0X 1", 1); - var ans23 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("0X 1", 1); - Assert.AreEqual(ans21.Datas[0] ? 1 : 0, dic2["0X 1"]); - Assert.AreEqual(ans22.Datas[0] ? 1 : 0, dic2["0X 1"]); - Assert.AreEqual(ans23.Datas[0] ? 1 : 0, dic2["0X 1"]); + Assert.AreEqual(ans.Datas?["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans.Datas?["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans.Datas?["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans.Datas?["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans.Datas?["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans.Datas?["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans2.Datas?["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans2.Datas?["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans2.Datas?["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans2.Datas?["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans2.Datas?["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans2.Datas?["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans3.Datas?["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans3.Datas?["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans3.Datas?["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans3.Datas?["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans3.Datas?["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans3.Datas?["A6"].DeviceValue, dic1["A6"]); }