Skip to content

Modbus Bridge~

Add a "Modbus bridge" functionality to a device that is otherwise serial Modbus RTU only

This feature is only included in tasmota32 binary

When compiling your build add the following to user_config_override.h:

#ifndef USE_MODBUS_BRIDGE
#define USE_MODBUS_BRIDGE       // Add support for software Modbus Bridge (+3k code)
#define USE_MODBUS_BRIDGE_TCP   // Add support for software Modbus TCP Bridge (Must also enable USE_MODBUS_BRIDGE)
#endif

In most cases you'll need an RS485 converter like this:

rs485 converter

Introduction~

Connect the Modbus device to an ESP and Tasmota will create a bridge to the Modbus network.

The Modbus Bridge driver features 2 kind of bridges.

USE_MODBUS_BRIDGE: The bridge can be used by commands in the console and via MQTT messages.
USE_MODBUS_BRIDGE_TCP: The bridge can be used by commands in the console and via MQTT messages but also as Modbus TCP/IP bridge

Configuration~

First assign two GPIOs to ModBR Tx and ModBR Rx in the "Configure Module" page. The Rx/Tx are relative to the ESP device. For example with ESP-12's hardware serial, set GPIO1 as ModBR Tx and GPIO3 as ModBR Rx.

Then set baud rate with ModbusBaudRate (default is 9600).

Commands~

Command Parameters
ModbusSend Sending a message to the Modbus network as JSON payload.
{"deviceAddress":<value>, "functionCode":<value>, "startAddress":<value>, "type":"<value>","count":<value>}
  "deviceAddress":1..255 = device address from the Modbus slave.
  "functioncode":1..6 or 15..16 = function code to send to the Modbus slave (see table below).
  "startaddress":1..65535 address of the first register to read.
  "type":"<value>" Gives the type of the returned data (see table below).
  "count":1..n the number of values to be requested.
ModbusBaudrate 1200...115200 = set baudrate for serial (only 8N1 mode) in 1200 increments (default = 9600)
ModbusSerialConfig Set serial protocol using data/parity/stop conventional notation (example: 8N1 or 702)
0..23 = set serial protocol (3 equals 8N1)

FunctionCode~

Function Code Description
1 Read Coils
2 Read Discrete Inputs
3 Read Multiple Holding Registers
4 Read Input Registers
5 Write Single Coil
6 Write Single Register
15 Write Multiple Coils
16 Write Multiple Registers

Type~

Type Description
raw Return or send the slave data as a raw values
bit Return or send the slave data as a bit values
hex Return or send the slave data as a hex values
float Return or send the slave data as floats
uint8 Return or send the slave data as an 8 bits unsigned int
uint32 Return or send the slave data as an 32 bits unsigned int
uint16 Return or send the slave data as an 16 bits unsigned int
uint32 Return or send the slave data as an 32 bits unsigned int
int8 Return or send the slave data as an 8 bits signed int
int16 Return or send the slave data as an 16 bits signed int
int32 Return or send the slave data as an 32 bits signed int

Additional commands for USE_MODBUS_TCP_BRIDGE~

Command Parameters
ModbusTcpStart Start the Modbus TCP bridge on the specified tcp port
ModbusTcpConnect Connect to a remote Modbus TCP server on ip address and remote tcp port

Returned Data~

{"ModbusReceived":{"DeviceAddress":<value>,"FunctionCode":<value>,"StartAddress":<value>,"Length":<value>,"Count":<value>,"Values":[value1,value2,value3,valueN]}}

In raw mode, only the data is returned, no other fields.

Error Codes~

There are 2 types of errors, errors from the tasmotamodbus driver and errors from this Modbusbridge module.

Module Errors~

Errors from this Modbus bridge module can be recognized by MBS: MBR Send error or MBS: MBR Recv error at the start of the errormessage.

Errorcode Description
1 nodataexpected
2 wrongdeviceaddress
3 wrongfunctioncode
4 wrongstartaddress
5 wrongtype
6 wrongregistercount
7 wrongcount
8 tomanydata

Driver Errors~

Errors from the tasmotamodbus driver can be recognized by MBS: MBR Driver error

Errorcode Description
1 Illegal Function
2 Illegal Data Address
3 Illegal Data Value
4 Slave Error
5 Acknowledge but not finished (no error)
6 Slave Busy
7 Not enough minimal data received
8 Memory Parity error
9 Crc error
10 Gateway Path Unavailable
11 Gateway Target device failed to respond
12 Wrong register count
13 Register data not specified

Example of use~

Requesting 4 holding registers starting from register 1 from slave address

Register 1~

On command:

ModBusSend {"deviceaddress": 1, "functioncode": 3, "startaddress": 1, "type":"uint16", "count":4}`

Response:

RSL: RESULT = {"ModbusSend":"Done"}
RSL: RESULT = {"ModbusReceived":{"DeviceAddress":1,"FunctionCode":3,"StartAddress":1,"Length":13,"Count":4,"Values":[65282,65028,65280,65024]}}

Set coil register 1 of slaveaddress 1 to ON:~

On command:

ModBusSend {"deviceaddress": 1, "functioncode": 5, "startaddress": 1, "type":"bit", "count":1, "values":[1]}
Response:
RSL: RESULT = {"ModbusSend":"Done"}
RSL: RESULT = {"ModbusReceived":{"DeviceAddress":1,"FunctionCode":5,"StartAddress":1,"Length":8,"Count":1,"Values":[255]}}

Setting multiple coils starting from coil register 1 from slave address 1~

On command:

ModBusSend '{"deviceaddress": 1, "functioncode": 15, "startaddress": 1, "type":"bit", "count":8, "values":[1,0,0,1,1,1,0,0]}
Response:
RSL: RESULT = {"ModbusSend":"Done"}
RSL: RESULT = {"ModbusReceived":{"DeviceAddress":1,"FunctionCode":15,"StartAddress":1,"Length":8,"Count":1}}

Additional resources~

Tasmota Pull Request
Modbus Protocol
More Modbus information