Side-by-Side Comparison
| Aspect | Modbus RTU | Modbus TCP |
|---|---|---|
| Physical Layer | RS-485 (or RS-232) | Ethernet (10/100/1000) |
| Default Port | Serial COM port | TCP port 502 |
| Addressing | Slave address (1-247) | IP address + Unit ID |
| Error Detection | CRC-16 | TCP checksum (no Modbus CRC) |
| Frame Delimiting | Silent interval (3.5 char times) | MBAP header with length field |
| Topology | Bus (daisy chain) | Star (via switches) |
| Max Devices | 32 per segment (247 addressable) | Unlimited (network capacity) |
| Speed | Up to 115200 baud (~11.5 KB/s) | 100 Mbps+ (practical: 10K+ msg/s) |
| Max Distance | 1200m (at 9600 baud) | 100m per segment (Ethernet) |
| Simultaneous Requests | 1 (half-duplex) | Multiple (TCP is full-duplex) |
| Cost per Device | Lower (simple UART) | Higher (Ethernet PHY + stack) |
Frame Structure Differences
Modbus RTU Frame
┌──────────────┬───────────────┬──────────┬─────────┐ │ Slave Address │ Function Code │ Data │ CRC-16 │ │ 1 byte │ 1 byte │ N bytes │ 2 bytes │ └──────────────┴───────────────┴──────────┴─────────┘ ← Frame bounded by silent intervals (≥3.5 char times) →
Modbus TCP Frame
┌────────────────────────────── MBAP Header ──────────────────────────────┐ │ Transaction ID │ Protocol ID │ Length │ Unit ID │ Function │ Data │ │ 2 bytes │ 2 bytes (0) │ 2 bytes │ 1 byte │ 1 byte │ N bytes │ └───────────────┴─────────────┴─────────┴─────────┴──────────┴───────────┘ ← No CRC needed — TCP handles error detection →
Key differences in the frame:
- Transaction ID: TCP allows multiple requests in-flight simultaneously. The transaction ID lets you match responses to requests. RTU is strictly request-response, one at a time.
- Protocol ID: Always
0x0000for Modbus. Allows future protocols on the same connection. - Length field: Tells the receiver exactly how many bytes follow. RTU uses timing-based frame delimiting, which is more fragile.
- No CRC: TCP/IP has its own checksums at the transport layer, so the Modbus CRC is removed.
When to Choose RTU
- Device only has RS-485 (many legacy instruments, meters, sensors)
- Simple point-to-point connection with minimal infrastructure
- Long cable distances (>100m) where Ethernet would need switches/fibre
- Cost-sensitive applications where Ethernet hardware isn't justified
- Existing RS-485 infrastructure you don't want to re-cable
When to Choose TCP
- Ethernet infrastructure already exists (most modern sites)
- Multiple masters need to poll the same devices simultaneously
- High polling rates required (TCP is orders of magnitude faster)
- Remote access needed (TCP/IP is routable across networks)
- Cybersecurity requirements (TCP supports TLS via Modbus Security)
- New installations where you're choosing the infrastructure
You don't always have to choose one or the other. TCP-to-RTU gateways let your SCADA system use Modbus TCP while the field devices stay on RS-485. The gateway handles the protocol translation transparently. Just remember that the serial bus is still the bottleneck — one request at a time, at the serial baud rate.
Common Migration Pitfalls
RTU → TCP: Don't Forget the Unit ID
When migrating from RTU to TCP, the slave address becomes the Unit ID in the MBAP header. Make sure your TCP client sets the correct Unit ID, not just 0 or 1. If you're going through a gateway, the Unit ID routes to the correct downstream serial device.
TCP → RTU: Timing Matters
If you're adding RTU devices to a TCP-based system (via gateway), remember that serial is much slower. A single register read that takes 2ms on TCP takes 50-200ms on RTU at 9600 baud. Don't set your poll interval to 100ms and expect 50 RTU devices to keep up.
🔄 Works with Both
ModBus Pro supports RTU (serial) and TCP out of the box. Scan address ranges to find devices on your serial bus or your Ethernet network.
Download ModBus Pro