Skip to main content

Modbus TCP Client

This page documents the client route (MODBUS_TCP)—the broker connects to a remote Modbus device and polls registers over MQTT. To expose MQTT topics to Modbus masters instead (SCADA, HMIs connect to the broker), see Modbus TCP Server.
The MODBUS_TCP route enables communication with PLCs, RTUs, and industrial devices using the Modbus TCP/IP protocol. It supports reading and writing registers and coils with configurable polling intervals and automatic batch optimization.
Modbus TCP is one of the most widely supported industrial protocols. If your device supports Modbus, this route provides a reliable way to integrate it with MQTT.

Basic Syntax


Connection Configuration

MODBUS_CONFIG Parameters

HOST
string
required
Modbus TCP server hostname or IP address.
PORT
integer
Modbus TCP port. Default: 502.
SLAVE_ID
integer
Modbus slave/unit ID (1-247). Default: 1.
CONNECTION_TIMEOUT
integer
Connection timeout in milliseconds. Default: 5000.
READ_TIMEOUT
integer
Read operation timeout in milliseconds. Default: 1000.
WRITE_TIMEOUT
integer
Write operation timeout in milliseconds. Default: 1000.
RETRY_COUNT
integer
Number of retry attempts on failure. Default: 3.
RETRY_DELAY
integer
Delay between retries in milliseconds. Default: 100.
ONE_BASED_ADDRESSES
boolean
default:"false"
Treat plain numeric tag addresses as one-based (address 1 = PDU register 0). Modicon-style addresses (400001+, 300001+, 100001+) are always decoded regardless of this flag. See Modbus addressing.

Connection Example


Address Types

Modbus defines four address spaces:
Most Modbus devices use Holding Registers for configuration and Input Registers for measured values. Check your device documentation for the correct address type.

Modbus Addressing

Modbus addressing varies by vendor. Coreflux supports three styles—choose the one that matches your device documentation.

Style 1 — Zero-based PDU offsets (default)

The Modbus protocol uses zero-based addresses in the PDU. This is the default (ONE_BASED_ADDRESSES = false). Use this when documentation labels the first register as 0, or when targeting integration tests that follow PDU numbering.

Style 2 — One-based plain addresses

Most device manuals label the first holding register as 1, not 0. Set WITH ONE_BASED_ADDRESSES true on MODBUS_CONFIG to use those labels directly in tag addresses.

Style 3 — Modicon notation

Traditional Modicon prefix notation is always accepted. The prefix determines the address type automatically:
Modicon-style addresses are decoded the same way regardless of ONE_BASED_ADDRESSES. The flag only affects plain numeric addresses (those without a Modicon prefix).

Conversion reference

Multi-word types (FLOAT, INT32, and so on) occupy consecutive registers from the resolved starting address.

Data Types

DATA_TYPE
string
required
The data type determines how raw register values are interpreted:

TAG Configuration

Complete TAG Parameters

TAG Parameters Reference

ADDRESS
string
required
Register or coil address. Plain numeric (0–65535 zero-based by default, or 1–65536 when ONE_BASED_ADDRESSES true), or Modicon notation (400001+, 300001+, 100001+). See Modbus addressing.
ADDRESS_TYPE
string
required
Type of Modbus address: HOLDING_REGISTER, INPUT_REGISTER, COIL, or DISCRETE_INPUT.
SCALING
double
Multiplier applied to raw value. Default: 1.0. Example: Raw value 245 with SCALING 0.1 becomes 24.5.
OFFSET
double
Value added after scaling. Default: 0.0. Formula: result = (raw * scaling) + offset.
DECIMAL_PLACES
integer
Number of decimal places in published value. Default: 2.
MIN_VALUE
double
Minimum allowed value. Values below this threshold are not published.
MAX_VALUE
double
Maximum allowed value. Values above this threshold are not published.
DEADBAND
double
Minimum change required to publish a new value. Default: 0.0.
SOURCE_TOPIC
string
Topic where PLC values are published. Subscribe here to receive sensor data.
PUBLISH_MODE
string
Output format: VALUE_ONLY or JSON. Default: VALUE_ONLY.
UNIT
string
Engineering unit for documentation (e.g., °C, bar, RPM).
DESCRIPTION
string
Human-readable description of the TAG.
WRITABLE
boolean
Allow writing to this register/coil. Default: false.
DESTINATION_TOPIC
string
Topic to send write commands. Publish a value here to write it to the PLC.
BYTE_ORDER
string
Byte order for multi-byte values: BIGENDIAN or LITTLEENDIAN. Default: BIGENDIAN.
WORD_ORDER
string
Word order for 32/64-bit values: BIGENDIAN or LITTLEENDIAN. Default: BIGENDIAN.
Different manufacturers use different byte/word ordering. If values appear incorrect, try changing BYTE_ORDER or WORD_ORDER.

Event-Based Operations

For on-demand Modbus operations (not polling), use the EVENT syntax. Publish a message to SOURCE_TOPIC to trigger the operation; the route executes it and publishes the result to DESTINATION_TOPIC.

Query Syntax

The WITH QUERY value uses LoT object syntax: unquoted keys, unquoted identifiers, and numeric values. The entire query is wrapped in double quotes.

Supported Operations

Query Parameters by Operation

To write a value on demand, publish a message to SOURCE_TOPIC. The route executes the write and publishes the result to DESTINATION_TOPIC:

Complete Examples

Read temperature and pressure from a Modbus device:

Troubleshooting

  • Verify IP address and port are correct
  • Check firewall settings (port 502 must be open)
  • Ensure device is powered on and connected to network
  • Try increasing CONNECTION_TIMEOUT
  • Verify ADDRESS matches device documentation—try WITH ONE_BASED_ADDRESSES true if the manual labels registers starting at 1
  • Use Modicon notation (400100) when the datasheet shows prefixed addresses
  • Check BYTE_ORDER and WORD_ORDER settings
  • Confirm DATA_TYPE matches register size
  • Verify SCALING and OFFSET calculations
  • Ensure WRITABLE is set to “true”
  • Verify ADDRESS_TYPE is HOLDING_REGISTER or COIL
  • Check device permissions for write operations
  • Verify value is within MIN_VALUE and MAX_VALUE
  • Confirm correct SLAVE_ID (usually 1 for TCP devices)
  • Some gateways use different slave IDs for different devices
  • Check device documentation for correct unit ID

Next Steps

Modbus Serial Client

Connect to RS-232/RS-485 Modbus RTU devices.

Modbus TCP Server

Expose MQTT topics as Modbus registers for SCADA and HMIs.
Last modified on July 3, 2026