Skip to main content
net10.0.NETFramework4.5.NETFramework4.6.1net6.0net7.0net8.0

Modbus RTU/ASCII serial protocol library for .NET. Supports binary RTU (CRC-16), ASCII (LRC), and lightweight RtuSimple variants over SerialPort on Windows and Linux. Built on NewLife.IoT standard interfaces with APM tracing support.

Published
Jul 22, 2026
3mo ago
Total Downloads
33.5K
33,472

Install

dotnet add package NewLife.ModbusRTU --version 2.0.2026.722-beta1103
ProductVersions
.NET
net10.0net6.0net7.0net8.0net9.0
.NET Standard
netstandard2.0netstandard2.1
Other
.NETFramework4.5.NETFramework4.6.1

README

NewLife.Modbus - ModbusTcp/ModbusRTU

GitHub top language GitHub License Nuget Downloads Nuget Nuget (with prereleases)

Nuget Downloads Nuget Nuget (with prereleases)

🌐 Languages: English | 简体中文 | Español | Português | Français | العربية | Русский | Deutsch | 日本語 | 한국어

Complete Modbus protocol implementation including ModbusTCP / ModbusRTU / ModbusASCII and multiple network variants, built on NewLife.IoT standard interfaces with IoTEdge gateway support.

Source: https://github.com/NewLifeX/NewLife.Modbus
Nuget: NewLife.Modbus / NewLife.ModbusRTU
Docs: 需求文档 / 架构设计 / 功能清单 / 竞品分析

Highlights

  • Most Complete Protocol: Implements Modbus Application Protocol Specification V1.1b3 with all 19 function codes (12 public + 7 advanced), covering over 99% of common industrial operations
  • Multiple Transport Variants: ModbusTCP, ModbusUDP, ModbusRTU (serial), ModbusASCII (serial), ModbusRtuOverTCP, ModbusRtuOverUDP, ModbusRtuSimple — 7 variants in total
  • Full Master & Slave: Complete implementations of both Master (client) and Slave (server), with Slave supporting concurrent multi-client connections
  • Zero-Allocation Encoding: Hot paths use SpanReader / SpanWriter for zero-allocation encoding/decoding, reducing GC pressure
  • Batch Optimization: BuildSegments automatically merges consecutive addresses, reading multiple points in a single request to reduce polling overhead
  • IoT Driver Integration: Implements the IDriver standard interface for zero-code integration with IoTEdge platform, with 6 drivers to choose from
  • Advanced Features: Auto-reconnect, async/await API, multi-slave network model, custom function code registration, broadcast mode
  • Lightweight Serial: ModbusRtuSimple targets resource-constrained edge devices with fewer dependencies and smaller memory footprint
  • APM Observability: Built-in ITracer tracing and ILog logging support, integrated with Stardust distributed platform
  • Multi-Framework: net45 / net462 / netstandard2.0 / netstandard2.1 / net6.0 / net7.0 / net8.0 / net9.0 / net10.0

Supported Transport Variants

Variant NuGet Package Description
ModbusTCP NewLife.Modbus Standard Modbus TCP/IP with MBAP header + PDU, port 502
ModbusUDP NewLife.Modbus Modbus over UDP, connectionless transport
ModbusRtuOverTCP NewLife.Modbus RTU frames (with CRC) over TCP transport
ModbusRtuOverUDP NewLife.Modbus RTU frames (with CRC) over UDP transport
ModbusRTU NewLife.ModbusRTU Serial binary compact format, CRC-16 validation
ModbusASCII NewLife.ModbusRTU Serial ASCII hexadecimal format, LRC validation
ModbusRtuSimple NewLife.ModbusRTU Lightweight simplified serial implementation, direct SerialPort access, suitable for resource-constrained edge scenarios

Quick Start

Install NuGet Package

# TCP/UDP scenario (no serial port needed)
dotnet add package NewLife.Modbus

# Serial RTU/ASCII scenario
dotnet add package NewLife.ModbusRTU

Master - ModbusTCP Read/Write Registers

using NewLife.IoT.Protocols;

// Create ModbusTCP connection
var modbus = new ModbusTcp
{
    Server = "192.168.1.100:502",
    Timeout = 3000,
    Log = XTrace.Log,       // Optional: enable communication log
};
modbus.Open();

// Read holding registers (FC03), station 1, starting address 0, read 10 registers
var registers = modbus.ReadRegister(host: 1, address: 0, count: 10);
Console.WriteLine($"Register values: {registers?.Join(", ")}");

// Read coils (FC01)
var coils = modbus.ReadCoil(host: 1, address: 0, count: 8);
Console.WriteLine($"Coil states: {coils?.Join(", ")}");

// Write single register (FC06)
modbus.WriteRegister(host: 1, address: 0, value: 1234);

// Write multiple registers (FC16)
modbus.WriteRegisters(host: 1, address: 0, values: [100, 200, 300]);

// Write single coil (FC05)
modbus.WriteCoil(host: 1, address: 0, value: true);

Master - ModbusRTU Serial Communication

using NewLife.IoT.Protocols;

// Create ModbusRTU serial connection
var modbus = new ModbusRtu
{
    PortName = "COM3",       // Windows: "COM3", Linux: "/dev/ttyS0"
    Baudrate = 9600,
    Log = XTrace.Log,
};
modbus.Open();

// Read holding registers (FC03)
var registers = modbus.ReadRegister(host: 1, address: 0, count: 5);

// Write multiple registers (FC16)
modbus.WriteRegisters(host: 1, address: 0, values: [0xABCD, 0xEF01]);

Slave - TCP Simulation Server

using NewLife.IoT;
using NewLife.IoT.Models;

// Create and configure the slave
var slave = new ModbusSlave
{
    Port = 502,
    Log = XTrace.Log,
};

// Preset register data (holding registers, FC03/FC06 operations)
for (var i = 0; i < 100; i++)
    slave.Registers.Add(new RegisterUnit { Address = (UInt16)i, Value = (UInt16)(i * 10) });

// Preset coil data (FC01/FC05 operations)
for (var i = 0; i < 16; i++)
    slave.Coils.Add(new CoilUnit { Address = (UInt16)i, Value = i % 2 == 0 });

// Start the slave and begin listening
slave.Start();
Console.WriteLine("Modbus Slave started, port 502");

IoT Driver Layer Integration

using NewLife.IoT.Drivers;

// Create TCP driver (supports IoTEdge driver standard interface)
var driver = new ModbusTcpDriver();
var parameter = new ModbusTcpParameter
{
    Server = "192.168.1.100:502",
    Host = 1,
    Timeout = 3000,
    BatchStep = 1,   // Points with address gap ≤1 are auto-merged into batch requests
    BatchSize = 100, // Maximum 100 points per batch
};

// Open driver (single connection reused)
var node = driver.Open(device: null, parameter);

// Batch read (automatically merges consecutive addresses to reduce request count)
var points = new[] { /* ThingModel point definitions */ };
var result = driver.Read(node, points);

NewLife Development Team

XCode

Founded in 2002, the NewLife team (新生命团队) is an IoT industry solution provider dedicated to software/hardware consulting, system architecture planning, and development services.
The team leads over 80 open-source projects widely adopted across various industries, with over 4 million cumulative NuGet downloads.
Our big-data middleware NewLife.XCode, scheduling platform AntJob, distributed platform Stardust, caching/queue component NewLife.Redis, and IoT platform FIoT have been successfully deployed in power, education, internet, telecom, transportation, logistics, industrial control, healthcare, and cultural heritage sectors.

We continuously improve our services to become a trusted long-term partner for our clients, and strive through innovation to become a leading IoT service provider in China.

Founded in 2002, some open-source projects have over 20 years of history; the source repository retains all change records since 2010
Website: https://newlifex.com
Open Source: https://github.com/newlifex
QQ Group: 1600800/1600838
WeChat Official Account:
智能大石头

Changes from Previous Version

No structural changes between v2.0.2026.610 and v2.0.2026.722-beta1103.

Adoption Assessment

Assess this package against its supported frameworks, license, maintenance signals and dependency graph before making it a project standard.

This version is marked prerelease. Validate its API and upgrade path before production use.Compatibility metadata lists 9 target frameworks; confirm the exact target used by your application.The published metadata declares 16 direct dependency entries across framework groups. Inspect the resolved dependency graph for your target framework.

Related Guides & Workflows

Learn how to evaluate, integrate, or audit this package in your .NET project.