YLFramework.Modbus
2.0.0-alpha.1
This is a prerelease version of YLFramework.Modbus.
dotnet add package YLFramework.Modbus --version 2.0.0-alpha.1
NuGet\Install-Package YLFramework.Modbus -Version 2.0.0-alpha.1
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="YLFramework.Modbus" Version="2.0.0-alpha.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="YLFramework.Modbus" Version="2.0.0-alpha.1" />
<PackageReference Include="YLFramework.Modbus" />
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 YLFramework.Modbus --version 2.0.0-alpha.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: YLFramework.Modbus, 2.0.0-alpha.1"
#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 YLFramework.Modbus@2.0.0-alpha.1
#: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=YLFramework.Modbus&version=2.0.0-alpha.1&prerelease
#tool nuget:?package=YLFramework.Modbus&version=2.0.0-alpha.1&prerelease
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
YLFramework.Modbus
Modbus 主站(Master) 实现。设计参照经典的 Java Modbus 库 jamod(net.wimpi.modbus),
在 .NET 上以惯用风格复刻其全部 Master 侧能力。
特性
| 能力 | 说明 |
|---|---|
| 传输通道 | Modbus TCP / Modbus UDP(MBAP 报文头)、Modbus RTU(CRC16)、Modbus ASCII(LRC) |
| 功能码 | FC01 / 02 / 03 / 04 / 05 / 06 / 07 / 08 / 0B / 0C / 0F / 10 / 11 / 14 / 15 / 16 / 17 / 18 |
| 报文层 | 独立的请求 / 响应对象,PDU 可独立编解码,便于单元测试与报文抓包分析 |
| 事务层 | TCP / UDP / 串口三种事务,内置事务标识递增、重试与静默间隔 |
| 门面 API | ModbusMasterFactory + 定位器(BaseLocator)统一读写入口 |
| 异常 | 从站异常响应统一映射为 SlaveException,携带功能码与异常码 |
架构
Facade ModbusMasterFactory / ModbusTcpMaster / ModbusUdpMaster / ModbusSerialMaster
BaseLocator / ReadReference / WriteReference ← 定位器读写
↑
Master ModbusMaster ← createXxxRequest + 便捷读写
↑
IO IModbusTransport / ModbusIpTransport(TCP·UDP)
ModbusRtuTransport / ModbusAsciiTransport ← 组帧、校验、重试
ModbusTcpTransaction / ModbusUdpTransaction / ModbusSerialTransaction
↑
Net TcpConnection / UdpConnection / SerialConnection ← 纯字节流
↑
Messages ModbusRequest / ModbusResponse / ExceptionResponse ← PDU 编解码(全部功能码)
Util BitVector / ModbusUtil(CRC16·LRC·hex) / SerialParameters
快速开始
Modbus TCP
using Framework.Modbus.Facade;
using Framework.Modbus.ProcessImage;
using var master = ModbusMasterFactory.CreateTcpMaster("192.168.1.10", 502);
master.SetUnitId(1);
master.Connect();
// 读 16 个线圈
var coils = master.ReadCoils(0, 16);
Console.WriteLine(coils);
// 读 4 个保持寄存器并写入第一个
var registers = master.ReadMultipleRegisters(0, 4);
Console.WriteLine(string.Join(", ", registers.Select(r => r.Value)));
master.WriteRegister(0, 1234);
Modbus RTU(串口)
using Framework.Modbus.Facade;
using Framework.Modbus.Util;
var master = ModbusMasterFactory.CreateRtuMaster(
portName: "/dev/ttyUSB0",
baudRate: 9600,
dataBits: 8,
parity: System.IO.Ports.Parity.None,
stopBits: System.IO.Ports.StopBits.One);
master.Timeout = 1000;
master.SetUnitId(1);
master.Connect();
var values = master.ReadInputRegisterValues(0, 8); // FC04
定位器(jamod 风格)
using Framework.Modbus.Facade;
var status = BaseLocator.CoilStatus(unitId: 1, reference: 0, count: 8);
var setpoint = BaseLocator.HoldingRegister(unitId: 1, reference: 10);
var bits = (BitVector)master.Read(status); // 位区 → BitVector
master.Write(setpoint, 3000); // 寄存器区 → FC06
底层报文(可直接编解码)
using Framework.Modbus.IO;
using Framework.Modbus.Messages;
// 单独抓取一次交互的线序字节
var transport = ModbusTcpTransport.Create("127.0.0.1", 502);
transport.MessageSent += (_, e) => Console.WriteLine($"→ {e.Hex}");
transport.MessageReceived += (_, e) => Console.WriteLine($"← {e.Hex}");
// PDU 往返
var request = new WriteMultipleRegistersRequest(0, new[] { 1, 2, 3 });
byte[] pdu = request.ToPdu();
var parsed = WriteMultipleRegistersRequest.FromPdu(pdu);
关键约定
- 地址一律使用 PDU 偏移(从 0 开始),与 jamod 的
BaseLocator一致; 习惯上的 40001 / 10001 等 5 位/6 位引用号需要自行减去基址。 - 位序遵循 Modbus 线序:第一个线圈对应首字节的最低位(LSB)。
BitVector的索引 0 即第一个线圈。 - 寄存器为大端(高字节在前)。
- FC14 读文件记录的响应不携带起始记录号,解析结果的记录号从 0 顺序编号。
单元测试
dotnet test test/Framework.Modbus.Tests/Framework.Modbus.Tests.csproj
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. 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.
-
net10.0
- System.IO.Ports (>= 10.0.12)
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 |
|---|---|---|
| 2.0.0-alpha.1 | 64 | 10/17/2026 |