Skip to main content

Modbus Protocol

Modbus is a widely-used industrial communication protocol for connecting electronic devices. Originally developed for PLCs, it's now a de facto standard for industrial automation and equipment integration.

Overview​

Modbus provides:

  • Master-slave architecture
  • Simple request/response model
  • Multiple transport options (RTU, TCP)
  • Standard function codes
  • Register-based data model
  • Wide device support

Protocol Variants​

Modbus RTU​

Serial communication (RS-232/RS-485):

  • Binary protocol
  • CRC error checking
  • Compact and efficient
  • Common in industrial settings
  • Multi-drop bus topology

Configuration:

  • Baud rate: 9600, 19200, 38400, etc.
  • Data bits: 8
  • Parity: None, Even, Odd
  • Stop bits: 1 or 2

Modbus TCP​

Ethernet-based communication:

  • Uses TCP/IP
  • Port 502 (standard)
  • No CRC (TCP handles integrity)
  • Supports multiple simultaneous connections
  • Point-to-point or routed

Modbus ASCII​

ASCII encoding (rarely used):

  • Human-readable
  • Less efficient
  • LRC error checking
  • Easier debugging

Architecture​

Master-Slave Model​

Master (Client):

  • Initiates all communication
  • Sends requests
  • Receives responses
  • Controls bus access

Slave (Server):

  • Responds to requests
  • Unique address (1-247)
  • Cannot initiate communication
  • Passive listener

Communication Flow​

1. Master sends request to slave
2. Slave processes request
3. Slave sends response
4. Master receives response

Only master initiates transactions

Data Model​

Register Types​

Coils (0x):

  • Type: Read/write bits
  • Access: Read/write
  • Use: Digital outputs (relays, LEDs)
  • Function codes: 01, 05, 15

Discrete Inputs (1x):

  • Type: Read-only bits
  • Access: Read only
  • Use: Digital inputs (switches, sensors)
  • Function code: 02

Input Registers (3x):

  • Type: Read-only 16-bit
  • Access: Read only
  • Use: Analog inputs (temperature, pressure)
  • Function code: 04

Holding Registers (4x):

  • Type: Read/write 16-bit
  • Access: Read/write
  • Use: Configuration, setpoints, analog outputs
  • Function codes: 03, 06, 16

Address Notation​

Traditional Notation:

Coils:              00001 - 09999 (0-based internally)
Discrete Inputs: 10001 - 19999
Input Registers: 30001 - 39999
Holding Registers: 40001 - 49999

Modern (Protocol) Addresses:

All types: 0 - 65535
Register type determined by function code

Function Codes​

Read Functions​

FC01: Read Coils

Request: 
- Slave address
- Function code: 01
- Starting address: 0x0000
- Quantity: 0x000A (10 coils)

Response:
- Slave address
- Function code: 01
- Byte count: 0x02
- Coil status: 0xCD 0x01

FC02: Read Discrete Inputs Similar to FC01 but for inputs

FC03: Read Holding Registers

Request:
- Slave address: 0x01
- Function code: 0x03
- Starting address: 0x006B (register 107)
- Quantity: 0x0003 (3 registers)

Response:
- Slave address: 0x01
- Function code: 0x03
- Byte count: 0x06 (6 bytes)
- Register values: 0x022B 0x0000 0x0064

FC04: Read Input Registers Similar to FC03 but for input registers

Write Functions​

FC05: Write Single Coil

Request:
- Slave address: 0x01
- Function code: 0x05
- Coil address: 0x00AC (coil 172)
- Value: 0xFF00 (ON) or 0x0000 (OFF)

Response: (Echo of request)
- Same as request

FC06: Write Single Register

Request:
- Slave address: 0x01
- Function code: 0x06
- Register address: 0x0001
- Value: 0x0003

Response: (Echo of request)

FC15: Write Multiple Coils

Request:
- Slave address: 0x01
- Function code: 0x0F
- Starting address: 0x0013
- Quantity: 0x000A (10 coils)
- Byte count: 0x02
- Coil values: 0xCD 0x01

FC16: Write Multiple Registers

Request:
- Slave address: 0x01
- Function code: 0x10
- Starting address: 0x0001
- Quantity: 0x0002 (2 registers)
- Byte count: 0x04
- Register values: 0x000A 0x0102

Message Format​

Modbus RTU Frame​

[Slave Address][Function Code][Data][CRC]

Slave Address: 1 byte (1-247, 0=broadcast)
Function Code: 1 byte
Data: N bytes
CRC: 2 bytes (CRC-16)

Example:

Request: 01 03 00 00 00 0A C5 CD
- Slave: 01
- Function: 03 (read holding registers)
- Start address: 00 00 (0)
- Quantity: 00 0A (10)
- CRC: C5 CD

Modbus TCP Frame​

[MBAP Header][Function Code][Data]

MBAP Header:
- Transaction ID: 2 bytes
- Protocol ID: 2 bytes (0x0000)
- Length: 2 bytes
- Unit ID: 1 byte (slave address)

Function Code: 1 byte
Data: N bytes

No CRC (TCP provides integrity)

Error Handling​

Exception Responses​

When error occurs:

Response:
- Slave address
- Function code + 0x80 (e.g., 0x83 for FC03 error)
- Exception code

Exception Codes​

01: Illegal Function

  • Function code not supported

02: Illegal Data Address

  • Register address doesn't exist

03: Illegal Data Value

  • Value out of range

04: Slave Device Failure

  • Slave device error

05: Acknowledge

  • Long operation, acknowledged

06: Slave Device Busy

  • Try again later

07: Memory Parity Error

  • Memory error

08: Gateway Path Unavailable

  • Gateway routing issue

Example:

Request: 01 03 00 6B 00 03 [CRC]
Error Response: 01 83 02 [CRC]
- Function: 0x83 (0x03 + 0x80)
- Exception: 02 (Illegal Address)

Data Types​

16-bit Values​

Single register:

INT16: -32768 to 32767
UINT16: 0 to 65535

32-bit Values​

Two consecutive registers:

High-Low (Big Endian):

Register 1: High word
Register 2: Low word

Low-High (Little Endian):

Register 1: Low word
Register 2: High word

Example (value 123456):

High-Low: [0x0001][0xE240]
Low-High: [0xE240][0x0001]

Floating Point​

Two registers (32-bit float):

IEEE 754 format
Byte order varies by device

Strings​

Multiple registers:

Each register = 2 ASCII characters
"TEMP" = [0x5445][0x4D50]

Timing Requirements​

Modbus RTU Timing​

Character Timeout:

  • 1.5 character times
  • Marks end of frame

Frame Timeout:

  • 3.5 character times
  • Silence between frames

Response Timeout:

  • Typically 500ms - 2s
  • Device-dependent

Modbus TCP Timing​

Connection Timeout:

  • Initial connection: 1-5s

Response Timeout:

  • Request response: 1-10s

Keep-Alive:

  • Optional TCP keep-alive

Best Practices​

Polling Strategy​

Sequential Polling:

1. Poll Slave 1
2. Wait for response
3. Poll Slave 2
4. Wait for response
5. Repeat

Optimized Polling:

1. Group register reads
2. Use multiple register read
3. Adjust poll rate per device
4. Priority-based polling

Error Recovery​

Timeout:

1. Wait for response timeout
2. Retry (up to 3 times)
3. Log error
4. Continue with next slave

CRC Error:

1. Discard message
2. Retry request
3. Count errors
4. Check wiring if frequent

Performance Optimization​

Reduce Transactions:

  • Read multiple registers at once
  • Batch writes when possible
  • Minimize polling frequency

Optimize Baud Rate:

  • Higher baud = faster communication
  • Must match all devices
  • Consider cable length and quality

Minimize Latency:

  • Reduce response timeouts
  • Use appropriate poll rates
  • Prioritize critical data

Security Considerations​

Modbus has no built-in security:

Mitigations​

Network Segmentation:

  • Isolate Modbus network
  • Use VLANs
  • Firewall rules

VPN/TLS:

  • Tunnel Modbus over VPN
  • Use Modbus Security (rare)

Access Control:

  • Restrict physical access
  • Monitor network traffic
  • Log all transactions

Input Validation:

  • Validate all data
  • Check ranges
  • Implement safety interlocks

AppBlocks Implementation​

Modbus Master​

Configure Modbus Master feature:

  • Serial or TCP settings
  • Poll multiple slaves
  • Read/write registers
  • Error handling

Modbus Slave​

Configure Modbus Slave feature:

  • Slave address
  • Register mapping
  • Link to variables
  • Respond to requests

Blocks​

Read/Write:

Events:

Use Cases​

Temperature Sensor​

Read Input Registers (FC04)
Address: 0
Quantity: 1
Response: Temperature in 0.1°C units
Example: 0x00E1 = 225 = 22.5°C

Control Relay​

Write Single Coil (FC05)
Address: 0
Value: 0xFF00 (ON) or 0x0000 (OFF)

Read Power Meter​

Read Holding Registers (FC03)
Address: 0
Quantity: 6
Returns: Voltage, Current, Power (2 registers each)

Set Temperature Setpoint​

Write Single Register (FC06)
Address: 100
Value: Setpoint * 10 (e.g., 225 for 22.5°C)

Troubleshooting​

Common Modbus issues:

No response:

  • Check slave address
  • Verify baud rate/parity
  • Check wiring and termination
  • Verify slave is powered

CRC errors:

  • Check baud rate settings
  • Verify cable quality
  • Check for EMI/noise
  • Proper grounding

Exception 02 (Illegal Address):

  • Verify register address
  • Check device documentation
  • Confirm register exists

Timeout:

  • Increase timeout value
  • Check network latency
  • Verify device responsiveness
  • Reduce poll rate

Testing Tools​

Modbus Poll (Master Simulator)​

  • Test Modbus slaves
  • Monitor registers
  • Simulate master

Modbus Slave (Slave Simulator)​

  • Test master implementations
  • Simulate device responses
  • Protocol testing

Wireshark​

  • Capture Modbus TCP traffic
  • Analyze packets
  • Debug communication

See Also​