Modbus RTU Troubleshooting Checklist for BAS

ModbusModbus RTUtroubleshootingRS-485serial
April 5, 2026|8 min read

Modbus RTU communication failures almost always trace back to one of four root causes: mismatched serial settings (baud rate, parity, data bits, stop bits), incorrect RS-485 wiring or polarity, wrong slave ID configuration, or register addressing errors (0-based vs 1-based offset confusion). Work through the physical layer first, then serial parameters, then protocol settings—this order eliminates the most common failures fastest.

Modbus RTU Communication Failure Symptoms

Before working through the checklist, confirm what you're seeing. Modbus RTU failures present differently depending on whether the problem is physical, configuration, or protocol-related:

Physical Layer Checks

Modbus RTU runs over RS-485, a differential signaling standard that uses two wires (A and B) plus an optional signal ground. Physical layer problems account for roughly half of all Modbus RTU field failures. Check these items first:

RS-485 Wiring and Polarity

Termination and Bias

Cable Specifications and Length

Serial Configuration Checks

Every device on a Modbus RTU bus must use identical serial port settings. A mismatch in any single parameter will cause communication to fail. The four parameters that must match:

Baud Rate

Standard Modbus RTU baud rates: 9600, 19200, 38400, 57600, and 115200 bps. The original Modbus specification defaults to 19200 bps. Many BAS field devices (energy meters, VFDs, sensors) ship with a factory default of 9600 bps. The master and every slave on the bus must use the same baud rate. There is no auto-negotiation in Modbus RTU.

# Common baud rate defaults by device type
# -----------------------------------------------
# Energy meters (Schneider PM5xxx, ABB M4M)  : 9600
# Variable frequency drives (ABB, Danfoss)   : 9600 or 19200
# Tridium Niagara (JACE) serial port          : 9600 (configurable)
# Honeywell Spyder controllers                : 9600 (configurable)
# ICP DAS I/O modules                         : 9600 (DIP switch selectable)
# Veris power meters                           : 9600

Parity, Data Bits, and Stop Bits

The Modbus RTU specification defines the default serial frame as 8 data bits, even parity, 1 stop bit (8E1). However, many devices ship configured for 8 data bits, no parity, 1 stop bit (8N1) or 8 data bits, no parity, 2 stop bits (8N2). The Modbus specification requires that when parity is set to "none," an additional stop bit be used (8N2) to maintain the 11-bit character frame, but in practice most devices and masters work with 8N1.

The critical rule: every device on the bus must use the same combination. If even one device is set to 8E1 while the rest use 8N1, that device will either fail to respond or generate CRC errors.

# Serial frame configuration - all devices must match
# -----------------------------------------------
# Common configurations (pick ONE for the entire bus):
#
# 8E1 = 8 data bits, Even parity, 1 stop bit  (Modbus default)
# 8O1 = 8 data bits, Odd parity, 1 stop bit
# 8N2 = 8 data bits, No parity, 2 stop bits   (spec-compliant alt)
# 8N1 = 8 data bits, No parity, 1 stop bit    (widely used in BAS)
#
# If unsure, try 8N1 first - it is the most common in BAS field devices

Protocol Settings Checks

Slave ID (Unit Address)

Each Modbus slave device must have a unique address on the bus, ranging from 1 to 247. Address 0 is reserved for broadcast (write-only, no response). Addresses 248–255 are reserved. Duplicate slave IDs cause exactly the same symptoms as duplicate BACnet MAC addresses: intermittent responses, garbled data, and bus collisions.

Function Codes

Ensure you are using the correct Modbus function code for the register type you are trying to access:

Function CodeNameRegister TypeAccess
01 (0x01)Read CoilsCoils (0xxxx)Read
02 (0x02)Read Discrete InputsDiscrete Inputs (1xxxx)Read
03 (0x03)Read Holding RegistersHolding Registers (4xxxx)Read
04 (0x04)Read Input RegistersInput Registers (3xxxx)Read
05 (0x05)Write Single CoilCoils (0xxxx)Write
06 (0x06)Write Single Holding RegisterHolding Registers (4xxxx)Write
15 (0x0F)Write Multiple CoilsCoils (0xxxx)Write
16 (0x10)Write Multiple Holding RegistersHolding Registers (4xxxx)Write

A common mistake: using function code 03 (Read Holding Registers) when the device maps a value to an input register (function code 04). The slave will return an Illegal Function exception (0x01) or an Illegal Data Address exception (0x02).

Register Addressing: 0-Based vs 1-Based

This is the single most common source of Modbus RTU configuration errors in building automation. Modbus documentation uses two different numbering conventions, and confusing them produces an off-by-one error that returns data from the wrong register:

# Register addressing example
# -----------------------------------------------
# Device data sheet says: "Zone Temp = Holding Register 40101"
#
# In Modbus poll software or BAS driver configuration:
#
# If the tool uses 1-based (register number):  enter 40101 or 101
# If the tool uses 0-based (protocol address):  enter 100
#
# The Modbus RTU frame on the wire always uses 0-based:
#   Slave ID | Func 03 | Start Addr Hi | Start Addr Lo | ...
#   0x01     | 0x03    | 0x00          | 0x64          | ...
#                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#                        0x0064 = 100 decimal = register 40101
#
# Getting this wrong by 1 means you read register 40102 or 40100
# instead of 40101. The data comes back with no error - just wrong values.

Always check whether your BAS controller's Modbus driver or integration software expects 0-based addresses or 1-based register numbers. Tridium Niagara, for example, typically uses 0-based addressing in its Modbus driver configuration. Honeywell and Schneider Electric platforms vary by product line—consult the integration guide for the specific controller.

Using Diagnostic Tools

When the checklist above doesn't resolve the issue, connect diagnostic tools to observe the actual data on the wire:

Serial Port Monitors and Modbus Master Tools

A serial port monitor captures raw bytes on the RS-485 bus through the master's COM port. Free Serial Port Monitor (HHD Software) shows hex data with timestamps. CAS Modbus Scanner (CHIPKIN, free) scans for devices and tests communication parameters.

Dedicated Modbus master tools let you manually poll registers independent of your BAS controller. Modbus Poll (Witte Software, 30-day trial) supports RTU, ASCII, and TCP. QModMaster (open-source) handles basic register reads and writes on Windows and Linux. mbpoll is a command-line option for Linux-based BAS servers.

# Example: Using mbpoll on Linux to read 5 holding registers
# starting at address 100 from slave ID 1 at 9600 baud, 8N1
#
# mbpoll -m rtu -a 1 -b 9600 -P none -r 100 -c 5 /dev/ttyUSB0
#
# Expected output (if communication works):
# [100]:  2350    (zone temp = 23.50°C scaled by 100)
# [101]:  5500    (humidity = 55.00% scaled by 100)
# [102]:  1       (occupancy = occupied)
# [103]:  0       (alarm = no alarm)
# [104]:  720     (CO2 = 720 ppm)

Common Modbus RTU Troubleshooting Mistakes

Platform/Version Compatibility

Modbus RTU is a protocol-level standard (Modbus Organization, modbus.org) supported by virtually every BAS platform. The troubleshooting steps in this checklist apply across all major building automation equipment that supports Modbus RTU integration:

Platform / EquipmentModbus RTU InterfaceTypical RoleNotes
Tridium Niagara (JACE, Supervisor)Built-in serial port or USB-RS485MasterModbus driver uses 0-based addressing; configure under Drivers > ModbusNetwork
Schneider Electric AS-P / SmartXRS-485 portMaster or SlaveEcoStruxure supports both Modbus master and slave configurations
Johnson Controls FEC / CGMRS-485 portMasterMetasys Modbus integration via CGM (Communications Gateway Module)
Honeywell Spyder / WEB-8000RS-485 portMaster or SlaveSpyder supports Modbus slave; WEB-8000 acts as Modbus master via serial
Schneider Electric PM5xxx metersRS-485 portSlaveDefault: 9600, 8E1, slave ID 1. Register map in PM5xxx user manual.
ABB ACS580 / ACH580 VFDsRS-485 (embedded) or fieldbus adapterSlaveDefault: 9600, 8N1, slave ID 1. Requires parameter group 58 configuration.
ICP DAS I-7000 / M-7000 modulesRS-485 portSlaveDIP switch selectable baud rate and address. Detailed troubleshooting in ICP DAS FAQ.
Veris E5x / H8000 power metersRS-485 portSlaveDefault: 9600, 8N1, slave ID 1. Commonly integrated for energy monitoring.

Sources and Attribution

The technical guidance in this entry is informed by the following sources:

Modbus RTUtroubleshootingRS-485serialbaud rate

Was this article helpful?

Related Articles

Need to do this remotely? SiteConduit supports Modbus remote access with the same protocol-level controls as BACnet. Join the waitlist.

SC

SiteConduit Technical Team

Idea Networks Inc.

SiteConduit builds managed remote access for building automation. Our knowledge base is maintained by BAS professionals with hands-on experience deploying and troubleshooting BACnet, Niagara, Modbus, and Facility Explorer systems.