-
Notifications
You must be signed in to change notification settings - Fork 9
NModbus
The NModbus projects are comprised of a library, a console application, a test project, and two web applications.
The NModbus library provides a set of helper classes to facilitate data access to a Modbus slave. This library is using the NModbus library (found at GitHub (https://github.com/NModbus/NModbus) and has been recompiled as a .NET Standard 2.0 library.
NModbus is a fork of NModbus4 which itself is a fork of the original NModbus (https://code.google.com/p/nmodbus) and supports serial ASCII, serial RTU, TCP, and UDP protocols. NModbus is a C# implementation of the Modbus protocol. Here only the Modbus TCP master is used to communicate with the Modbus TCP slaves.
The APIs used are:
Function | Function Code |
---|---|
Read Discrete Inputs | (fc 2) |
Read Coils | (fc 1) |
Write Single Coil | (fc 5) |
Write Multiple Coils | (fc 15) |
Read Input Registers | (fc 4) |
Read Multiple Registers | (fc 3) |
Write Single Register | (fc 6) |
Write Multiple Registers | (fc 16) |
The additional datatypes supported are:
- BitArray
- Short
- UShort
- Int32
- UInt32
- Float
- Double
- Long
- ULong
- ASCII
- Hex
Conversion routines from and to Modbus registers are provided.
Additonal data types (using read/write coils and holding registers) are supported:
Function | Description |
---|---|
ReadString | Reads an ASCII string (multiple holding registers) |
ReadHexString | Reads an HEX string (multiple holding registers) |
ReadBool | Reads a boolean value (single coil) |
ReadBits | Reads a 16 bit array (single holding register) |
ReadShort | Reads a 16 bit integer (single holding register) |
ReadUShort | Reads an unsigned 16 bit integer (single holding register) |
ReadInt32 | Reads a 32 bit integer (two holding registers) |
ReadUInt32 | Reads an unsigned 32 bit integer (two holding registers) |
ReadFloat | Reads a 32 bit IEEE floating point number (two holding registers) |
ReadDouble | Reads a 64 bit IEEE floating point number (four holding registers) |
ReadLong | Reads a 64 bit integer (four holding registers) |
ReadULong | Reads an unsigned 64 bit integer (four holding registers) |
ReadBoolArray | Reads an array of boolean values (multiple coils) |
ReadBytes | Reads 8 bit values (multiple holding register) |
ReadShortArray | Reads an array of 16 bit integers (multiple holding register) |
ReadUShortArray | Reads an array of unsigned 16 bit integer (multiple holding register) |
ReadInt32Array | Reads an array of 32 bit integers (multiple holding registers) |
ReadUInt32Array | Reads an array of unsigned 32 bit integers (multiple holding registers) |
ReadFloatArray | Reads an array of 32 bit IEEE floating point numbers (multiple holding registers) |
ReadDoubleArray | Reads an array of 64 bit IEEE floating point numbers (multiple holding registers) |
ReadLongArray | Reads an array of 64 bit integers (multiple holding registers) |
ReadULongArray | Reads an array of unsigned 64 bit integers (multiple holding registers) |
WriteString | Writes an ASCII string (multiple holding registers) |
WriteHexString | Writes an HEX string (multiple holding registers) |
WriteBool | Writes a boolean value (single coil) |
WriteBits | Writes a 16 bit array (single holding register) |
WriteShort | Writes a 16 bit integer (single holding register) |
WriteUShort | Writes an unsigned 16 bit integer (single holding register) |
WriteInt32 | Writes a 32 bit integer (two holding registers) |
WriteUInt32 | Writes an unsigned 32 bit integer (two holding registers) |
WriteFloat | Writes a 32 bit IEEE floating point number (two holding registers) |
WriteDouble | Writes a 64 bit IEEE floating point number (four holding registers) |
WriteLong | Writes a 64 bit integer (four holding registers) |
WriteULong | Writes an unsigned 64 bit integer (four holding registers) |
WriteBoolArray | Writes an array of boolean values (multiple coils) |
WriteBytes | Writes 8 bit values (multiple holding register) |
WriteShortArray | Writes an array of 16 bit integers (multiple holding register) |
WriteUShortArray | Writes an array of unsigned 16 bit integer (multiple holding register) |
WriteInt32Array | Writes an array of 32 bit integers (multiple holding registers) |
WriteUInt32Array | Writes an array of unsigned 32 bit integers (multiple holding registers) |
WriteFloatArray | Writes an array of 32 bit IEEE floating point numbers (multiple holding registers) |
WriteDoubleArray | Writes an array of 64 bit IEEE floating point numbers (multiple holding registers) |
WriteLongArray | Writes an array of 64 bit integers (multiple holding registers) |
WriteULongArray | Writes an array of unsigned 64 bit integers (multiple holding registers) |
Additonal data types (read discrete inputs and input registers) are supported:
Function | Description |
---|---|
ReadOnlyString | Reads an ASCII string (multiple input registers) |
ReadOnlyHexString | Reads an HEX string (multiple input registers) |
ReadOnlyBool | Reads a boolean value (single discrete input) |
ReadOnlyBits | Reads a 16 bit array (single holding register) |
ReadOnlyShort | Reads a 16 bit integer (single holding register) |
ReadOnlyUShort | Reads an unsigned 16 bit integer (single input register) |
ReadOnlyInt32 | Reads a 32 bit integer (two input registers) |
ReadOnlyUInt32 | Reads an unsigned 32 bit integer (two input registers) |
ReadOnlyFloat | Reads a 32 bit IEEE floating point number (two input registers) |
ReadOnlyDouble | Reads a 64 bit IEEE floating point number (four input registers) |
ReadOnlyLong | Reads a 64 bit integer (four input registers) |
ReadOnlyULong | Reads an unsigned 64 bit integer (four input registers) |
ReadOnlyBoolArray | Reads an array of boolean values (multiple discrete inputs) |
ReadOnlyBytes | Reads 8 bit values (multiple input register) |
ReadOnlyShortArray | Reads an array of 16 bit integers (multiple input register) |
ReadOnlyUShortArray | Reads an array of unsigned 16 bit integer (multiple input register) |
ReadOnlyInt32Array | Reads an array of 32 bit integers (multiple input registers) |
ReadOnlyUInt32Array | Reads an array of unsigned 32 bit integers (multiple input registers) |
ReadOnlyFloatArray | Reads an array of 32 bit IEEE floating point numbers (multiple input registers) |
ReadOnlyDoubleArray | Reads an array of 64 bit IEEE floating point numbers (multiple input registers) |
ReadOnlyLongArray | Reads an array of 64 bit integers (multiple input registers) |
ReadOnlyULongArray | Reads an array of unsigned 64 bit integers (multiple input registers) |
This attribute allows to mark a property with a Modbus specific offset, length, and access mode.
[Modbus(1)]
public ushort Value { get; set; }
[Modbus(1, AccessModes.ReadOnly)]
public ushort Value { get; set; }
[Modbus(1, AccessModes.ReadOnly, 4)]
public long Value { get; set; }
[Modbus(offset: 1, access: AccessModes.ReadOnly, length: 4)]
public double Value { get; set; }
Those attributes can be used to access the actual modbus registers (at the specified offset, using the specified numbers).
The NModbus console application is used to access Modbus slave devices over ethernet (TCP) or serial lines (RTU). Several commandline options are provided to facilitate the device access and optionally to override settings from the JSON configuration file ("appsettings.json"). All commands have -? and --help options to display usage information.
Option | Description |
---|---|
--settings | Shows the current settings (typically from "appsettings.json") |
The root command options can also be used in the following sub commands.
Command | Description |
---|---|
rtu | Supporting standard Modbus RTU operations |
tcp | Supporting standard Modbus RTU operations |
Option | Description |
---|---|
--com | Sets the Modbus master COM port |
--baudrate | Sets the Modbus COM port baud rate |
--parity | Sets the Modbus COM port parity |
--databits | Sets the Modbus COM port data bits |
--stopbits | Sets the Modbus COM port stop bits |
--slaveid | Sets the Modbus slave ID |
The rtu command options can also be used in the following sub commands.
Command | Description |
---|---|
read | Supporting standard Modbus RTU operations |
write | Supporting standard Modbus RTU operations |
monitor | Supporting standard Modbus RTU operations |
Option | Description | |
---|---|---|
-c | --coil | Reads coil(s) |
-d | --discrete | Reads discrete input(s) |
-h | --holding | Reads holding register(s) |
-i | --input | Reads input register(s) |
-x | --hex | Displays the register values in HEX |
-n | --number <number> | The number of items to read |
-o | --offset <number> | The offset of the first item to read |
-t | --type <string> | Reads the specified data type |
Argument | Description |
---|---|
First | Data values (JSON array format) |
Option | Description | |
---|---|---|
-c | --coil | Writes coil(s) |
-h | --holding | Writes holding register(s) |
-o | --offset <number> | The offset of the first item to write |
-t | --type <string> | Writes the specified data type |
Option | Description | |
---|---|---|
-c | --coil | Reads coil(s) |
-d | --discrete | Reads discrete input(s) |
-h | --holding | Reads holding register(s) |
-i | --input | Reads input register(s) |
-x | --hex | Displays the register values in HEX |
-n | --number <number> | The number of items to read |
-o | --offset <number> | The offset of the first item to read |
-t | --type <string> | Reads the specified data type |
-r | --repeat | The number of times to read (default: forever) |
The monitor command runs for the number of times specified and can be terminated using Control-C.
Option | Description |
---|---|
--address | Sets the Modbus slave IP address |
--port | Sets the Modbus slave port number |
--slaveid | Sets the Modbus slave ID |
The tcp command options can also be used in the following sub commands.
Command | Description |
---|---|
read | Supporting standard Modbus RTU operations |
write | Supporting standard Modbus RTU operations |
monitor | Supporting standard Modbus RTU operations |
Option | Description | |
---|---|---|
-c | --coil | Reads coil(s) |
-d | --discrete | Reads discrete input(s) |
-h | --holding | Reads holding register(s) |
-i | --input | Reads input register(s) |
-x | --hex | Displays the register values in HEX |
-n | --number <number> | The number of items to read |
-o | --offset <number> | The offset of the first item to read |
-t | --type <string> | Reads the specified data type |
Argument | Description |
---|---|
First | Data values (JSON array format) |
Option | Description | |
---|---|---|
-c | --coil | Writes coil(s) |
-h | --holding | Writes holding register(s) |
-o | --offset <number> | The offset of the first item to write |
-t | --type <string> | Writes the specified data type |
Option | Description | |
---|---|---|
-c | --coil | Reads coil(s) |
-d | --discrete | Reads discrete input(s) |
-h | --holding | Reads holding register(s) |
-i | --input | Reads input register(s) |
-x | --hex | Displays the register values in HEX |
-n | --number <number> | The number of items to read |
-o | --offset <number> | The offset of the first item to read |
-t | --type <string> | Reads the specified data type |
-r | --repeat | The number of times to read (default: forever) |
The monitor command runs for the number of times specified and can be terminated using Control-C.
The NModbusRtu web application is used to access Modbus RTU slave devices providing a REST based web service. The Web service can act as a HTTP gateway to Modbus slave devices providing a common well known protocol and the use of JSON for the data exchange.
The Web API page provides a common Web interface for the REST web API using Swagger. The configuration is stored in the appsettings.json file.
The typical configuration file contains application settings, the database connection string and the Serilog logger settings. The TcpSlave settings allow to specifiy the Modbus TCP slave device.
{
"AppSettings": {
"TcpSlave": {
"Address": "10.0.1.77",
"Port": 502,
"ID": 1
},
"Swagger": {...}
},
"ConnectionStrings": {...}
"Serilog": {...}
},
"AllowedHosts": "*"
}
The NModbusTcp web application is used to access Modbus TCP slave devices providing a REST based web service. The Web service can act as a HTTP gateway to Modbus slave devices providing a common well known protocol and the use of JSON for the data exchange.
The Web API page provides a common Web interface for the REST web API using Swagger. The configuration is stored in the appsettings.json file.
The typical configuration file contains application settings, the database connection string and the Serilog logger settings. The RtuMaster and RtuSlave settings allow to specifiy the Modbus RTU master and slave device.
{
"AppSettings": {
"RtuMaster": {
"SerialPort": "COM1",
"Baudrate": 19200,
"ReadTimeout": 10000,
"WriteTimeout": 10000
},
"RtuSlave": {
"ID": 1
},
"Swagger": {...}
},
"ConnectionStrings": {...}
"Serilog": {...}
},
"AllowedHosts": "*"
}
HTTP | Address | Description |
---|---|---|
GET | /api/Coil/{offset} | Reading a single coil from a Modbus slave. |
PUT | /api/Coil/{offset} | Writing a single coil to a Modbus slave. |
GET | /api/Coils/{offset} | Reading multiple coils from a Modbus slave. |
PUT | /api/Coils/{offset} | Writing multiple coils to a Modbus slave. |
GET | /api/DiscreteInput/{offset} | Reading a single discrete input from a Modbus slave. |
GET | /api/DiscreteInputs/{offset} | Reading multiple discrete inputs from a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/HoldingRegister/{offset} | Reading a single holding register from a Modbus slave. |
PUT | /api/HoldingRegister/{offset} | Writing a single holding registers to a Modbus slave. |
GET | /api/HoldingRegisters/{offset} | Reading multiple holding registers from a Modbus slave. |
PUT | /api/HoldingRegisters/{offset} | Writing multiple holding registers to a Modbus slave. |
GET | /api/InputRegister/{offset} | Reading a single input register from a Modbus slave. |
GET | /api/InputRegisters/{offset} | Reading multiple input registers from a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/Bool/{offset} | Reads an array of boolean values from a Modbus slave. |
GET | /api/ROSingle/Bool/{offset} | Reads a boolean value from a Modbus slave. |
GET | /api/RWArray/Bool/{offset} | Reads an array of boolean values from a Modbus slave. |
PUT | /api/RWArray/Bool/{offset} | Writes an array of boolean values to a Modbus slave. |
GET | /api/RWSingle/Bool/{offset} | Reads a boolean value from a Modbus slave. |
PUT | /api/RWSingle/Bool/{offset} | Writes a boolean value to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/Bytes/{offset} | Reads 8-bit values from a Modbus slave. |
GET | /api/RWArray/Bytes/{offset} | Reads 8-bit values from a Modbus slave. |
PUT | /api/RWArray/Bytes/{offset} | Writes 8-bit values to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/Short/{offset} | Reads an array of 16 bit integers from a Modbus slave. |
GET | /api/ROSingle/Short/{offset} | Reads a 16 bit integer from a Modbus slave. |
GET | /api/RWArray/Short/{offset} | Reads an array of 16 bit integers from a Modbus slave. |
PUT | /api/RWArray/Short/{offset} | Writes an array of 16 bit integers to a Modbus slave. |
GET | /api/RWSingle/Short/{offset} | Reads a 16 bit integer from a Modbus slave. |
PUT | /api/RWSingle/Short/{offset} | Writes a 16 bit integer to a Modbus slave. |
Note that this writes a single holding register.
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/UShort/{offset} | Reads an array of unsigned 16 bit integers from a Modbus slave. |
GET | /api/ROSingle/UShort/{offset} | Reads an unsigned 16 bit integer from a Modbus slave. |
GET | /api/RWArray/UShort/{offset} | Reads an array of unsigned 16 bit integer from a Modbus slave. |
PUT | /api/RWArray/UShort/{offset} | Writes an array of unsigned 16 bit integer to a Modbus slave. |
GET | /api/RWSingle/UShort/{offset} | Reads an unsigned 16 bit integer from a Modbus slave. |
PUT | /api/RWSingle/UShort/{offset} | Writes an unsigned 16 bit integer (single holding register) to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/Int32/{offset} | Reads an array of 32 bit integers from a Modbus slave. |
GET | /api/ROSingle/Int32/{offset} | Reads a 32 bit integer from a Modbus slave. |
GET | /api/RWArray/Int32/{offset} | Reads an array of 32 bit integers from a Modbus slave. |
PUT | /api/RWArray/Int32/{offset} | Writes an array of 32 bit integers to a Modbus slave. |
GET | /api/RWSingle/Int32/{offset} | Reads a 32 bit integer from a Modbus slave. |
PUT | /api/RWSingle/Int32/{offset} | Writes a 32 bit integer to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/UInt32/{offset} | Reads an array of unsigned 32 bit integers from a Modbus slave. |
GET | /api/ROSingle/UInt32/{offset} | Reads an unsigned 32 bit integer from a Modbus slave. |
GET | /api/RWArray/UInt32/{offset} | Reads an array of unsigned 32 bit integers from a Modbus slave. |
PUT | /api/RWArray/UInt32/{offset} | Writes an array of unsigned 32 bit integers to a Modbus slave. |
GET | /api/RWSingle/UInt32/{offset} | Reads an unsigned 32 bit integer from a Modbus slave. |
PUT | /api/RWSingle/UInt32/{offset} | Writes an unsigned 32 bit integer to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/Float/{offset} | Reads an array of 32 bit IEEE floating point numbers from a Modbus slave. |
GET | /api/ROSingle/Float/{offset} | Reads a 32 bit IEEE floating point number from a Modbus slave. |
GET | /api/RWArray/Float/{offset} | Reads an array of 32 bit IEEE floating point numbers from a Modbus slave. |
PUT | /api/RWArray/Float/{offset} | Writes an array of 32 bit IEEE floating point numbers to a Modbus slave. |
GET | /api/RWSingle/Float/{offset} | Reads a 32 bit IEEE floating point number from a Modbus slave. |
PUT | /api/RWSingle/Float/{offset} | Writes a 32 bit IEEE floating point number to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/Double/{offset} | Reads an array of 64 bit IEEE floating point numbers from a Modbus slave. |
GET | /api/ROSingle/Double/{offset} | Reads a 64 bit IEEE floating point number from a Modbus slave. |
GET | /api/RWArray/Double/{offset} | Reads an array of 64 bit IEEE floating point numbers from a Modbus slave. |
PUT | /api/RWArray/Double/{offset} | Writes an array of 64 bit IEEE floating point numbers to a Modbus slave. |
GET | /api/RWSingle/Double/{offset} | Reads a 64 bit IEEE floating point number from a Modbus slave. |
PUT | /api/RWSingle/Double/{offset} | Writes a 64 bit IEEE floating point number to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/Long/{offset} | Reads an array of 64 bit integers from a Modbus slave. |
GET | /api/ROSingle/Long/{offset} | Reads a 64 bit integer from a Modbus slave. |
GET | /api/RWArray/Long/{offset} | Reads an array of 64 bit integers from a Modbus slave. |
PUT | /api/RWArray/Long/{offset} | Writes an array of 64 bit integers to a Modbus slave. |
GET | /api/RWSingle/Long/{offset} | Reads a 64 bit integer from a Modbus slave. |
PUT | /api/RWSingle/Long/{offset} | Writes a 64 bit integer to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROArray/ULong/{offset} | Reads an array of unsigned 64 bit integers from a Modbus slave. |
GET | /api/ROSingle/ULong/{offset} | Reads an unsigned 64 bit integer from a Modbus slave. |
GET | /api/RWArray/ULong/{offset} | Reads an array of unsigned 64 bit integers from a Modbus slave. |
PUT | /api/RWArray/ULong/{offset} | Writes an array of unsigned 64 bit integers to a Modbus slave. |
GET | /api/RWSingle/ULong/{offset} | Reads an unsigned 64 bit integer from a Modbus slave. |
PUT | /api/RWSingle/ULong/{offset} | Writes an unsigned 64 bit integer to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROSingle/String/{offset} | Reads an ASCII string from a Modbus slave. |
GET | /api/RWSingle/String/{offset} | Reads an ASCII string from a Modbus slave. |
PUT | /api/RWSingle/String/{offset} | Writes an ASCII string to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROSingle/HexString/{offset} | Reads an HEX string from a Modbus slave. |
GET | /api/RWSingle/HexString/{offset} | Reads an HEX string from a Modbus slave. |
PUT | /api/RWSingle/HexString/{offset} | Writes an HEX string to a Modbus slave. |
HTTP | Address | Description |
---|---|---|
GET | /api/ROSingle/Bits/{offset} | Reads a 16-bit bit array value from a Modbus slave. |
GET | /api/RWSingle/Bits/{offset} | Reads a 16-bit bit array value from a Modbus slave. |
PUT | /api/RWSingle/Bits/{offset} | Writes a 16-bit bit array value to a Modbus slave. |