nxmbserver NxModbus Server Example
The nxmbserver example demonstrates how to create a Modbus server (slave)
using the NxModbus protocol stack. It supports RTU, ASCII, and TCP transports
with simulated register data.
Register Map
The example server provides the following simulated registers:
Coils (read/write, FC01/FC05/FC15):
Address range: 1-100
Initial state: All zeros
Writable via FC05 (write single) and FC15 (write multiple)
Discrete Inputs (read-only, FC02):
Address range: 1-100
Initial state: All zeros
Read-only (cannot be modified by client)
Input Registers (read-only, FC04):
Address range: 1-100
Initial values:
register[i] = i * 10(register 1 = 10, register 2 = 20, register 10 = 100)
Holding Registers (read/write, FC03/FC06/FC16/FC23):
Address range: 1-100
Initial values:
register[i] = i * 100(register 1 = 100, register 2 = 200, register 10 = 1000)Writable via FC06 (write single), FC16 (write multiple), FC23 (read/write)
Command-Line Options
Transport Selection (required):
-t TYPE- Transport type:rtu,ascii, ortcp
Serial Transport Options (RTU/ASCII):
-d DEVICE- Serial device path (e.g.,/dev/ttyS1)-b BAUD- Baud rate (default: 115200)-p PARITY- Parity:none,even, orodd(default: none)
TCP Transport Options:
-a ADDR- Bind address (default: 0.0.0.0 - all interfaces)-P PORT- TCP port (default: 502)
Modbus Options:
-u UNIT- Unit ID / slave address (default: 1)
Usage Examples
RTU Server on Serial Port:
nsh> nxmbserver -t rtu -d /dev/ttyS1 -b 115200
Starting Modbus RTU server on /dev/ttyS1 (baud=115200, unit=1)
Server running. Press Ctrl+C to stop.
Register map:
Coils: 1-100 (read/write)
Discrete: 1-100 (read-only)
Input regs: 1-100 (read-only, value=addr*10)
Holding regs: 1-100 (read/write, initial=addr*100)
TCP Server on Default Port:
nsh> nxmbserver -t tcp -P 502
Starting Modbus TCP server on port 502 (unit=1)
Server running. Press Ctrl+C to stop.
Register map:
Coils: 1-100 (read/write)
Discrete: 1-100 (read-only)
Input regs: 1-100 (read-only, value=addr*10)
Holding regs: 1-100 (read/write, initial=addr*100)
ASCII Server with Even Parity:
nsh> nxmbserver -t ascii -d /dev/ttyS1 -b 9600 -p even -u 5
Starting Modbus ASCII server on /dev/ttyS1 (baud=9600, unit=5)
Server running. Press Ctrl+C to stop.
...
Testing with nxmbclient
The server can be tested using the nxmbclient tool:
Read Input Registers (initial values):
nsh> nxmbclient -t tcp -h 127.0.0.1 read-input 1 5
Read 5 input registers from address 1:
[1]: 10
[2]: 20
[3]: 30
[4]: 40
[5]: 50
Read Holding Registers (initial values):
nsh> nxmbclient -t tcp -h 127.0.0.1 read-holding 1 5
Read 5 holding registers from address 1:
[1]: 100
[2]: 200
[3]: 300
[4]: 400
[5]: 500
Write and Read Back Holding Register:
nsh> nxmbclient -t tcp -h 127.0.0.1 write-holding 10 9999
Wrote holding register at address 10: 9999
nsh> nxmbclient -t tcp -h 127.0.0.1 read-holding 10 1
Read 1 holding register from address 10:
[10]: 9999
Configuration
Enable the example in your NuttX configuration:
CONFIG_EXAMPLES_NXMBSERVER=y
CONFIG_INDUSTRY_NXMODBUS=y
CONFIG_NXMODBUS_RTU=y # For RTU support
CONFIG_NXMODBUS_ASCII=y # For ASCII support
CONFIG_NXMODBUS_TCP=y # For TCP support
Kconfig Options:
CONFIG_EXAMPLES_NXMBSERVER- Enable the nxmbserver exampleCONFIG_EXAMPLES_NXMBSERVER_PROGNAME- Program name (default: “nxmbserver”)CONFIG_EXAMPLES_NXMBSERVER_PRIORITY- Task priority (default: 100)CONFIG_EXAMPLES_NXMBSERVER_STACKSIZE- Stack size (default: DEFAULT_TASK_STACKSIZE)
See Also
nxmodbus NuttX Modbus - NxModbus protocol stack
nxmbclient NxModbus Client Tool - NxModbus client tool