Wp.Utils.Modbus 0.0.2-alpha

This is a prerelease version of Wp.Utils.Modbus.
dotnet add package Wp.Utils.Modbus --version 0.0.2-alpha
                    
NuGet\Install-Package Wp.Utils.Modbus -Version 0.0.2-alpha
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Wp.Utils.Modbus" Version="0.0.2-alpha" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Wp.Utils.Modbus" Version="0.0.2-alpha" />
                    
Directory.Packages.props
<PackageReference Include="Wp.Utils.Modbus" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Wp.Utils.Modbus --version 0.0.2-alpha
                    
#r "nuget: Wp.Utils.Modbus, 0.0.2-alpha"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Wp.Utils.Modbus@0.0.2-alpha
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Wp.Utils.Modbus&version=0.0.2-alpha&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Wp.Utils.Modbus&version=0.0.2-alpha&prerelease
                    
Install as a Cake Tool

Wp.Utils.Modbus使用样例

状态类

线圈状态类

public class CeilStatus
{
	#region Events

	#endregion Events

	#region Properties&Fileds

	[DataFormat(BitAddress = 20)]
	public bool MyProperty { get; set; }

	[DataFormat(BitAddress = 21)]
	public bool MyProperty1 { get; set; }

	[DataFormat(BitAddress = 22)]
	public bool MyProperty2 { get; set; }

	[DataFormat(BitAddress = 23)]
	public bool MyProperty3 { get; set; }

	[DataFormat(BitAddress = 24)]
	public bool MyProperty4 { get; set; }

	#endregion Properties&Fileds

	#region Methods

	public override string ToString()
	{
		var res = new StringBuilder();
		foreach (var item in this.GetPropertyValueKeyIsName())
		{
			res.Append(item.ToString());
		}
		return res.ToString();
	}

	#endregion Methods
}

寄存器状态类

	public class RegisterStatus
	{
		[DataFormat(20)]
		public float MyProperty { get; set; }

		[DataFormat(22)]
		public int MyProperty1 { get; set; }

		[DataFormat(24)]
		public ushort MyProperty2 { get; set; }

		[DataFormat(25)]
		public byte MyProperty3 { get; set; }

		[DataFormat(25, 4)]
		public byte MyProperty4 { get; set; }

		[DataFormat(25, 1)]
		public bool MyProperty5 { get; set; }

		[DataFormat(26)]
		public double MyProperty6 { get; set; }

		public override string ToString()
		{
			var res = new StringBuilder();
			foreach (var item in this.GetPropertyValueKeyIsName())
			{
				res.Append(item.ToString());
			}
			return res.ToString();
		}
	}

ModbusTcp

  1. 读线圈

    测试代码

     		var buffer = new byte[1024];
     		var readCoilByteArray = ModbusTcpUtil.ReadCoil<CeilStatus>();
     		AnsiConsole.MarkupLine($"[green]Send:{readCoilByteArray.ToFormatString()}[/]");
     		socket.Send(readCoilByteArray);
     		Thread.Sleep(100);
     		var count = socket.Receive(buffer);
     		var readCoilRec = new byte[6 + buffer[5]];
     		Buffer.BlockCopy(buffer, 0, readCoilRec, 0, readCoilRec.Length);
     		var readCoilRes = new byte[readCoilRec[8]];
     		Buffer.BlockCopy(readCoilRec, 9, readCoilRes, 0, readCoilRes.Length);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{readCoilRec.ToFormatString()}[/]");
     		var arg = new AnalysisReadArgument(readCoilRec, EFunctionCode.ReadCoil, 0, 1);
     		var metaMsg = ModbusTcpUtil.AnalysisResponse<CeilStatus>(arg, null);
     		Console.WriteLine(metaMsg.Meta);
    

    寄存器状态

    image-20240326095015073

    测试结果

    image-20240326094943931

  2. 读保持寄存器

    测试代码

     		var buffer = new byte[1024];
     		var readHoldingRegisterByteArray = ModbusTcpUtil.ReadHoldingRegister<RegisterStatus>(0, 1);
     		AnsiConsole.MarkupLine($"[green]Send:{readHoldingRegisterByteArray.ToFormatString(EScale.HexToUp)}[/]");
     		socket.Send(readHoldingRegisterByteArray);
     		Thread.Sleep(100);
     		var readHoldingRegisterCountTemp = socket.Receive(buffer);
     		var readHoldingRegisterRec = new byte[6 + buffer[5]];
     		Buffer.BlockCopy(buffer, 0, readHoldingRegisterRec, 0, 6 + buffer[5]);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{readHoldingRegisterRec.ToFormatString()}[/]");
    
     		var arg = new AnalysisReadArgument(readHoldingRegisterRec, EFunctionCode.ReadHoldingRegister, 0, 1);
     		var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
     			{
     				{
     					typeof(float),DefaultValueFunc.Default[typeof(float)]
     				},
     				{
     					typeof(int),DefaultValueFunc.Default[typeof(int)]
     				},
     				{
     					typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
     				},
     				{
     					typeof (double),DefaultValueFunc.Default[typeof(double)]
     				}
     			};
     		var metaMsg = ModbusTcpUtil.AnalysisResponse<RegisterStatus>(arg, func);
     		Console.WriteLine(metaMsg.Meta);
    

    寄存器状态

    image-20240326103646392

    测试结果

    image-20240326103500326

  3. 读输入寄存器

    测试代码

     		var buffer = new byte[1024];
     		var readInputRegisterByteArray = ModbusTcpUtil.ReadInputRegister<RegisterStatus>(0, 1);
     		AnsiConsole.MarkupLine($"[green]Send:{readInputRegisterByteArray.ToFormatString()}[/]");
     		socket.Send(readInputRegisterByteArray);
     		Thread.Sleep(100);
     		var readInputRegisterCountTemp = socket.Receive(buffer);
     		var readInputRegisterRec = new byte[6 + buffer[5]];
     		Buffer.BlockCopy(buffer, 0, readInputRegisterRec, 0, 6 + buffer[5]);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{readInputRegisterRec.ToFormatString()}[/]");
     		var arg = new AnalysisReadArgument(readInputRegisterRec, EFunctionCode.ReadInputRegister, 0, 1);
     		var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
     			{
     				{
     					typeof(float),DefaultValueFunc.Default[typeof(float)]
     				},
     				{
     					typeof(int),DefaultValueFunc.Default[typeof(int)]
     				},
     				{
     					typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
     				},
     				{
     					typeof (double),DefaultValueFunc.Default[typeof(double)]
     				}
     			};
     		var metaMsg = ModbusTcpUtil.AnalysisResponse<RegisterStatus>(arg, func);
     		Console.WriteLine(metaMsg.Meta);
    

    寄存器状态

    image-20240326111649807

    测试结果

    image-20240326111626689

  4. 写单个线圈

    测试代码

     		var buffer = new byte[1024];
     		var msg = new Msg();
     		var res = new ushort[1];
     		var writeSingleCoilAddress = AnsiConsole.Ask<ushort>("请输入线圈地址:");
     		var writeSingleCoilValue = AnsiConsole.Ask<string>("请输入要写入的值。值为1表示将该线圈置为true;值为0表示将该线圈置为false:") == "1";
     		var writeSingleCoilByteArray = ModbusTcpUtil.WriteSingleCoil(writeSingleCoilAddress, writeSingleCoilValue);
     		AnsiConsole.MarkupLine($"[green]Send:{writeSingleCoilByteArray.ToFormatString()}[/]");
     		socket.Send(writeSingleCoilByteArray);
    
     		Thread.Sleep(100);
     		var writeSingleCoilCountTemp = socket.Receive(buffer);
     		var writeSingleCoilRec = new byte[6 + buffer[5]];
     		Buffer.BlockCopy(buffer, 0, writeSingleCoilRec, 0, 6 + buffer[5]);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{writeSingleCoilRec.ToFormatString()}[/]");
     		msg = ModbusTcpUtil.AnalysisWriteSingleCoil(writeSingleCoilByteArray, writeSingleCoilRec);
     		AnsiConsole.WriteLine(msg.ToString());
    
  5. 写单个寄存器

    测试代码

     		var buffer = new byte[1024];
     		var msg = new Msg();
     		var res = new ushort[1];
     		var writeSingleRegisterAddress = AnsiConsole.Ask<ushort>("请输入寄存器地址:");
     		var writeSingleRegisterValue = AnsiConsole.Ask<ushort>("请输入要写入的值:");
     		var writeSingleRegisterByteArray = ModbusTcpUtil.WriteUshort(writeSingleRegisterAddress, writeSingleRegisterValue);
     		AnsiConsole.MarkupLine($"[green]Send:{writeSingleRegisterByteArray.ToFormatString()}[/]");
     		socket.Send(writeSingleRegisterByteArray);
     		Thread.Sleep(100);
     		var singleRegisterCount = socket.Receive(buffer);
     		var singleRegisterRec = new byte[6 + buffer[5]];
     		Buffer.BlockCopy(buffer, 0, singleRegisterRec, 0, 6 + buffer[5]);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{singleRegisterRec.ToFormatString()}[/]");
     		msg = ModbusTcpUtil.AnalysisWriteSingleRegister(writeSingleRegisterByteArray, singleRegisterRec);
     		AnsiConsole.WriteLine(msg.ToString());
    
  6. 写多个线圈

    测试代码

    var buffer = new byte[1024];
    var value = new CeilStatus()
    {
     MyProperty = false,
     MyProperty1 = true,
     MyProperty2 = true,
     MyProperty3 = false,
     MyProperty4 = false,
    };
    var writeMultiplyColisByteArray = ModbusTcpUtil.WriteMultipleCoils(value);
    AnsiConsole.MarkupLine($"[green]Send:{writeMultiplyColisByteArray.Meta.ToArray().ToFormatString()}[/]");
    socket.Send(writeMultiplyColisByteArray.Meta.ToArray());
    Thread.Sleep(100);
    var writeMultiplyColisCount = socket.Receive(buffer);
    var writeMultiplyColisRec = new byte[6 + buffer[5]];
    Buffer.BlockCopy(buffer, 0, writeMultiplyColisRec, 0, 6 + buffer[5]);
    AnsiConsole.MarkupLine($"[gray]Rec:{writeMultiplyColisRec.ToFormatString()}[/]");
    var msg = ModbusTcpUtil.AnalysisWriteMultipleCoils(writeMultiplyColisByteArray.Meta.ToArray(), writeMultiplyColisRec);
    Console.WriteLine(msg);
    

    测试结果

    image-20240326095454745

    寄存器状态

    image-20240326095510359

  7. 写多个寄存器

    测试代码

     		var buffer = new byte[1024];
    
     		var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
     			{
     				{
     					typeof(float),DefaultValueFunc.Default[typeof(float)]
     				},
     				{
     					typeof(int),DefaultValueFunc.Default[typeof(int)]
     				},
     				{
     					typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
     				},
     				{
     					typeof (double),DefaultValueFunc.Default[typeof(double)]
     				}
     			};
     		var status = new RegisterStatus
     		{
     			MyProperty = 12.44f,
     			MyProperty1 = 23,
     			MyProperty2 = 2,
     			MyProperty3 = 3,
     			MyProperty4 = 4,
     			MyProperty6 = 2.66
     		};
     		var writeMultiplyRegisterByteArray = status.WriteMultipleRegisters(func);
     		AnsiConsole.MarkupLine($"[green]Send:{writeMultiplyRegisterByteArray.ToFormatString()}[/]");
     		socket.Send(writeMultiplyRegisterByteArray);
     		Thread.Sleep(100);
     		var writeMultiplyRegisterCountTemp = socket.Receive(buffer);
     		var writeMultiplyRegisterRec = new byte[6 + buffer[5]];
     		Buffer.BlockCopy(buffer, 0, writeMultiplyRegisterRec, 0, 6 + buffer[5]);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{writeMultiplyRegisterRec.ToFormatString()}[/]");
     		var msg = ModbusTcpUtil.AnalysisWriteMultipleRegisters(writeMultiplyRegisterRec, writeMultiplyRegisterByteArray);
     		AnsiConsole.WriteLine(msg.ToString());
    

    测试结果

    image-20240326153159319

    寄存器状态

    image-20240326153226351

  8. 读写多个寄存器

测试代码

			var buffer = new byte[1024];
			var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
				{
					{
						typeof(float),DefaultValueFunc.Default[typeof(float)]
					},
					{
						typeof(int),DefaultValueFunc.Default[typeof(int)]
					},
					{
						typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
					},
					{
						typeof (double),DefaultValueFunc.Default[typeof(double)]
					}
				};
			var status = new RegisterStatus
			{
				MyProperty = 10.44f,
				MyProperty1 = 23,
				MyProperty2 = 2,
				MyProperty3 = 3,
				MyProperty4 = 4,
				MyProperty6 = 2.77
			};
			var readAndWriteMultiplyRegisterByteArray = status.ReadAndWriteMultipleRegisters<RegisterStatus, RegisterStatus>(func);
			AnsiConsole.MarkupLine($"[green]Send:{readAndWriteMultiplyRegisterByteArray.ToFormatString()}[/]");
			var count = socket.Send(readAndWriteMultiplyRegisterByteArray);
			Thread.Sleep(100);
			var readAndWriteMultiplyRegisterCountTemp = socket.Receive(buffer);
			var readAndWriteMultiplyRegisterRec = new byte[6 + buffer[5]];
			Buffer.BlockCopy(buffer, 0, readAndWriteMultiplyRegisterRec, 0, 6 + buffer[5]);
			AnsiConsole.MarkupLine($"[yellow]Rec:{readAndWriteMultiplyRegisterRec.ToFormatString()}[/]");

			var arg = new AnalysisReadArgument(readAndWriteMultiplyRegisterRec, EFunctionCode.ReadAndWriteMultipleRegisters, 0, 1);
			var metaMsg = ModbusTcpUtil.AnalysisResponse<RegisterStatus>(arg, func);
			Console.WriteLine(metaMsg.Meta);

测试结果

image-20240326170232379

寄存器状态

image-20240326170300739

ModbusRtu

  1. 读线圈

    测试代码

     	public static void Execute(SerialPort sp)
     	{
     		var readCoilByteArray = ModbusRtuUtil.ReadCoil<CeilStatus>(1);
     		AnsiConsole.MarkupLine($"[green]Send:{readCoilByteArray.ToFormatString()}[/]");
     		sp.Write(readCoilByteArray, 0, readCoilByteArray.Length);
     		Thread.Sleep(100);
     		byte[] readCoilRec = new byte[sp.BytesToRead];
     		sp.Read(readCoilRec, 0, sp.BytesToRead);
     		var readCoilRes = new byte[readCoilRec[2]];
     		Buffer.BlockCopy(readCoilRec, 3, readCoilRes, 0, readCoilRes.Length);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{readCoilRec.ToFormatString()}[/]");
     		var arg = new AnalysisReadArgument(readCoilRec, EFunctionCode.ReadCoil, 0, 1);
     		var metaMsg = ModbusRtuUtil.AnalysisResponse<CeilStatus>(arg, null);
     		Console.WriteLine(metaMsg.Success ? metaMsg.Meta : metaMsg.Message);
     	}
    
  2. 读保持寄存器

    测试代码

     	public static void Execute(SerialPort sp)
     	{
     		var readHoldingRegisterByteArray = ModbusRtuUtil.ReadHoldingRegister<RegisterStatus>(1);
     		AnsiConsole.MarkupLine($"[green]Send:{readHoldingRegisterByteArray.ToFormatString(EScale.HexToUp)}[/]");
     		sp.Write(readHoldingRegisterByteArray, 0, readHoldingRegisterByteArray.Length);
     		Thread.Sleep(100);
     		var readHoldingRegisterRec = new byte[sp.BytesToRead];
     		sp.Read(readHoldingRegisterRec, 0, sp.BytesToRead);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{readHoldingRegisterRec.ToFormatString()}[/]");
    
     		var arg = new AnalysisReadArgument(readHoldingRegisterRec, EFunctionCode.ReadHoldingRegister, 0, 1);
     		var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
     			{
     				{
     					typeof(float),DefaultValueFunc.Default[typeof(float)]
     				},
     				{
     					typeof(int),DefaultValueFunc.Default[typeof(int)]
     				},
     				{
     					typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
     				},
     				{
     					typeof (double),DefaultValueFunc.Default[typeof(double)]
     				}
     			};
     		var metaMsg = ModbusRtuUtil.AnalysisResponse<RegisterStatus>(arg, func);
     		Console.WriteLine(metaMsg.Success ? metaMsg.Meta : metaMsg.Message);
     	}
    
  3. 读输入寄存器

    测试代码

     	public static void Execute(SerialPort sp)
     	{
     		var readInputRegisterByteArray = ModbusRtuUtil.ReadInputRegister<RegisterStatus>(1);
     		AnsiConsole.MarkupLine($"[green]Send:{readInputRegisterByteArray.ToFormatString()}[/]");
     		sp.Write(readInputRegisterByteArray, 0, readInputRegisterByteArray.Length);
     		Thread.Sleep(100);
     		var readInputRegisterRec = new byte[sp.BytesToRead];
     		sp.Read(readInputRegisterRec, 0, sp.BytesToRead);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{readInputRegisterRec.ToFormatString()}[/]");
     		var arg = new AnalysisReadArgument(readInputRegisterRec, EFunctionCode.ReadInputRegister, 0, 1);
     		var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
     			{
     				{
     					typeof(float),DefaultValueFunc.Default[typeof(float)]
     				},
     				{
     					typeof(int),DefaultValueFunc.Default[typeof(int)]
     				},
     				{
     					typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
     				},
     				{
     					typeof (double),DefaultValueFunc.Default[typeof(double)]
     				}
     			};
     		var msg = ModbusRtuUtil.AnalysisResponse<RegisterStatus>(arg, func);
     		AnsiConsole.WriteLine(msg.Success ? msg.Meta.ToString() : msg.Message);
     	}
    
  4. 写单个线圈

    测试代码

     	public static void Execute(SerialPort sp)
     	{
     		var writeSingleCoilAddress = AnsiConsole.Ask<ushort>("请输入线圈地址:");
     		var writeSingleCoilValue = AnsiConsole.Ask<string>("请输入要写入的值。值为1表示将该线圈置为true;值为0表示将该线圈置为false:") == "1";
     		var writeSingleCoilByteArray = ModbusRtuUtil.WriteSingleCoil(new ArgumentBase(writeSingleCoilAddress), writeSingleCoilValue);
     		AnsiConsole.MarkupLine($"[green]Send:{writeSingleCoilByteArray.ToFormatString()}[/]");
     		sp.Write(writeSingleCoilByteArray, 0, writeSingleCoilByteArray.Length);
     		var writeSingleCoilRec = new byte[sp.BytesToRead];
     		sp.Read(writeSingleCoilRec, 0, sp.BytesToRead);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{writeSingleCoilRec.ToFormatString()}[/]");
     		var msg = ModbusRtuUtil.AnalysisWriteSingleCoil(writeSingleCoilByteArray, writeSingleCoilRec, 1);
     		AnsiConsole.WriteLine(msg.ToString());
     	}
    
  5. 写单个寄存器

    测试代码

     	public static void Execute(SerialPort sp)
     	{
     		var msg = new Msg();
     		var writeSingleRegisterAddress = AnsiConsole.Ask<ushort>("请输入寄存器地址:");
     		var writeSingleRegisterValue = AnsiConsole.Ask<ushort>("请输入要写入的值:");
     		var writeSingleRegisterByteArray = ModbusRtuUtil.WriteUshort(new ArgumentBase(writeSingleRegisterAddress), writeSingleRegisterValue);
     		AnsiConsole.MarkupLine($"[green]Send:{writeSingleRegisterByteArray.ToFormatString()}[/]");
     		sp.Write(writeSingleRegisterByteArray, 0, writeSingleRegisterByteArray.Length);
     		Thread.Sleep(100);
     		var singleRegisterRec = new byte[sp.BytesToRead];
     		sp.Read(singleRegisterRec, 0, sp.BytesToRead);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{singleRegisterRec.ToFormatString()}[/]");
     		msg = ModbusRtuUtil.AnalysisWriteSingleRegister(writeSingleRegisterByteArray, singleRegisterRec, 1);
     		AnsiConsole.WriteLine(msg.ToString());
     	}
    
  6. 写多个线圈

    测试代码

     	public static void Execute(SerialPort sp)
     	{
     		var status = new CeilStatus()
     		{
     			MyProperty = false,
     			MyProperty1 = true,
     			MyProperty2 = true,
     			MyProperty3 = false,
     			MyProperty4 = true,
     		};
     		var writeMultiplyColisByteArray = status.WriteMultipleCoils(1);
     		AnsiConsole.MarkupLine($"[green]Send:{writeMultiplyColisByteArray.ToFormatString()}[/]");
     		sp.Write(writeMultiplyColisByteArray, 0, writeMultiplyColisByteArray.Length);
     		Thread.Sleep(100);
     		var writeMultiplyColisRec = new byte[sp.BytesToRead];
     		sp.Read(writeMultiplyColisRec, 0, sp.BytesToRead);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{writeMultiplyColisRec.ToFormatString()}[/]");
     		var msg = ModbusRtuUtil.AnalysisWriteMultipleCoils(writeMultiplyColisByteArray, writeMultiplyColisRec, 1);
     		AnsiConsole.WriteLine(msg.ToString());
     	}
    
  7. 写多个寄存器

    测试代码

     	public static void Execute(SerialPort sp)
     	{
     		var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
     			{
     				{
     					typeof(float),DefaultValueFunc.Default[typeof(float)]
     				},
     				{
     					typeof(int),DefaultValueFunc.Default[typeof(int)]
     				},
     				{
     					typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
     				},
     				{
     					typeof (double),DefaultValueFunc.Default[typeof(double)]
     				}
     			};
     		var status = new RegisterStatus
     		{
     			MyProperty = 12.44f,
     			MyProperty1 = 23,
     			MyProperty2 = 2,
     			MyProperty3 = 3,
     			MyProperty4 = 4,
     			MyProperty6 = 2.66
     		};
     		var writeMultiplyRegisterByteArray = status.WriteMultipleRegisters(func, 1);
     		AnsiConsole.MarkupLine($"[green]Send:{writeMultiplyRegisterByteArray.ToFormatString()}[/]");
     		sp.Write(writeMultiplyRegisterByteArray, 0, writeMultiplyRegisterByteArray.Length);
     		Thread.Sleep(100);
     		var writeMultiplyRegisterRec = new byte[sp.BytesToRead];
     		sp.Read(writeMultiplyRegisterRec, 0, sp.BytesToRead);
     		AnsiConsole.MarkupLine($"[yellow]Rec:{writeMultiplyRegisterRec.ToFormatString()}[/]");
     		var msg = ModbusRtuUtil.AnalysisWriteMultipleRegisters(writeMultiplyRegisterRec, writeMultiplyRegisterByteArray, 1);
     		AnsiConsole.WriteLine(msg.ToString());
     	}
    
  8. 读写多个寄存器

    测试代码

		public static void Execute(SerialPort sp)
		{
			var func = new Dictionary<Type, Func<IEnumerable<byte>, IEnumerable<byte>>>
				{
					{
						typeof(float),DefaultValueFunc.Default[typeof(float)]
					},
					{
						typeof(int),DefaultValueFunc.Default[typeof(int)]
					},
					{
						typeof(ushort),DefaultValueFunc.Default[typeof(ushort)]
					},
					{
						typeof (double),DefaultValueFunc.Default[typeof(double)]
					}
				};
			var status = new RegisterStatus
			{
				MyProperty = 10.44f,
				MyProperty1 = 23,
				MyProperty2 = 2,
				MyProperty3 = 3,
				MyProperty4 = 4,
				MyProperty6 = 2.77
			};
			var readAndWriteMultiplyRegisterByteArray = ModbusRtuUtil.ReadAndWriteMultipleRegisters<RegisterStatus, RegisterStatus>(status, 1, func);
			AnsiConsole.MarkupLine($"[green]Send:{readAndWriteMultiplyRegisterByteArray.ToFormatString()}[/]");
			sp.Write(readAndWriteMultiplyRegisterByteArray, 0, readAndWriteMultiplyRegisterByteArray.Length);
			Thread.Sleep(100);
			var readAndWriteMultiplyRegisterRec = new byte[sp.BytesToRead];
			sp.Read(readAndWriteMultiplyRegisterRec, 0, sp.BytesToRead);
			AnsiConsole.MarkupLine($"[yellow]Rec:{readAndWriteMultiplyRegisterRec.ToFormatString()}[/]");
			var arg = new AnalysisReadArgument(readAndWriteMultiplyRegisterRec, EFunctionCode.ReadAndWriteMultipleRegisters, 0, 1);
			var msg = ModbusRtuUtil.AnalysisResponse<RegisterStatus>(arg, func);
			AnsiConsole.WriteLine(msg.Success ? msg.Meta.ToString() : msg.Message);
		}
Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.0.2-alpha 179 4/10/2025
0.0.1 161 3/28/2024
0.0.1-alpha 130 12/11/2023