Aevus Learn · Protocols · 7 min read

Modbus Explained. The 40-year-old protocol that refuses to die — and why that's a feature.

Modbus was published in 1979. It has no security, no authentication, no encryption, no addressing beyond a single byte. By every modern criterion, it should have been replaced decades ago. Instead, it's the most widely deployed industrial protocol on Earth. Here's the practical version of what Modbus is, how it works, and why uninstalling it from your plant is harder than it sounds.

Aevus / Intrepid LogicBeginnerFor engineers · technicians · programmersUpdated 2026-05-21

The 30-second version

Modbus is a request-response protocol. A master (sometimes called a "client") sends a short binary message to a slave (or "server") asking it to read or write a value. The slave answers with the value, or with an exception code if it can't.

That's it. No subscriptions, no broker, no push, no security, no negotiation. Just ask-and-answer over whatever transport you can route bytes through. Modbus comes in three transports — RTU (binary over serial), ASCII(text over serial — rare today), and TCP (binary over Ethernet) — but the underlying request-response semantics are identical.

Why it won't die: every PLC and RTU vendor speaks it, every SCADA system supports it, every gauge and pressure transmitter has a Modbus library available, and every plant engineer learned it as their first protocol. Network effects compounded over four decades. The cost to switch is enormous; the cost to keep using it is near-zero.

A brief history

Modicon (now Schneider Electric) invented Modbus in 1979 as a way for its 084 and 084-series PLCs to talk to each other over the then-new RS-232 serial bus. The specification was simple by design — Modicon wanted system integrators to be able to wire up multivendor systems, and complexity is the enemy of integration.

Modicon eventually open-sourced the specification, which is the second reason Modbus won. Every protocol stack that came after it (Profibus, Allen-Bradley DH+, GE SRTP, and many more) was vendor-controlled. Plant operators picking equipment kept defaulting to the protocol that wasn't owned by anyone in particular. The Modbus Organization now maintains the spec; both the serial and TCP variants are freely available at modbus.org.

By the 1990s, Modbus was the de facto wire-level lingua franca of industrial automation. By the 2000s, Modbus/TCP let it ride Ethernet without changing semantics. By 2026, it's still in approximately every plant you can walk into — usually alongside two or three "newer" protocols that have been deployed in pockets but have never displaced it.

The three Modbus transports

TransportWireEncodingWhere you find it
Modbus RTURS-232 / RS-485 serialBinary, CRC-16 checksumOlder field installs, multi-drop RS-485 buses, low-bandwidth long runs
Modbus ASCIIRS-232 / RS-485 serialText (hex-encoded), LRC checksumIncreasingly rare; legacy installations only
Modbus TCPEthernet (TCP/IP)Binary, TCP guarantees delivery so no checksumModern installations, control networks, SCADA-to-PLC links

The semantics are identical across all three. A function-code-3 read of holding register 40001 returns the same byte payload whether it traveled over RS-485 or Ethernet. That's why a Modbus gateway can sit between an Ethernet master and a serial slave with essentially no logic — just bit-shuffling between framing formats.

Anatomy of a Modbus request

A Modbus RTU request is six fields. The TCP variant adds a 7-byte MBAP header on top. Here's what's on the wire for a "read holding register 40001" request to slave address 5:

MODBUS RTU REQUEST · READ HOLDING REGISTER
Slave ID
0x05 // slave address (1-247)
Function
0x03 // FC03 = read holding registers
Start addr
0x00 0x00 // register 0 (= "40001" in 1-based labeling)
Count
0x00 0x01 // read 1 register
CRC
0x84 0x0A // CRC-16 of preceding bytes

8 bytes on the wire. The slave responds with another binary message containing the register's value (2 bytes, big-endian) plus a CRC. The whole round-trip is typically 5-20 milliseconds over serial, sub-millisecond over Ethernet.

The "40001" gotcha. Modbus has a 5-digit historical addressing convention where holding registers start at 40001, input registers at 30001, coils at 1, and discrete inputs at 10001. The protocol uses 0-based addressing internally. So "holding register 40001" is request address 0x0000 on the wire. Half the Modbus bugs in field installations come from someone confusing the two.

Function codes that actually matter

Modbus has 19 standard function codes plus extension codes. In the field, you'll see about six of them. The rest are theoretical.

FCWhat it doesRead or writeHow often you see it
0x01Read coils (single-bit outputs)ReadCommon
0x02Read discrete inputs (single-bit inputs)ReadCommon
0x03Read holding registers (16-bit read/write)ReadThe most-used FC in the protocol
0x04Read input registers (16-bit read-only)ReadVery common
0x05Write single coilWriteCommon
0x06Write single holding registerWriteCommon
0x0FWrite multiple coilsWriteOccasional
0x10Write multiple holding registersWriteOccasional

The Modbus data model

Modbus exposes four "data tables." Every Modbus device — PLC, RTU, transmitter, gateway — presents itself as some subset of these:

TableTypeAccessTypical use
Coils1-bitRead / writeDiscrete outputs — pump runs, valve open, alarm enable
Discrete inputs1-bitRead onlyDiscrete inputs — limit switches, contact closures, alarm states
Input registers16-bit wordRead onlyAnalog values from sensors — pressure, temperature, flow rate
Holding registers16-bit wordRead / writeSetpoints, configuration, PLC variables, derived values

16 bits is the catch. Modern process variables are usually 32-bit floats (pressure to 2 decimal places, flow rates with precision). Vendors pack a 32-bit float into two consecutive holding registers, but there's no standard for which register holds the high word and which holds the low — every vendor does it slightly differently. Aevus's Modbus connectors detect and adapt to all six common float-packing conventions automatically. Many integrator tools do not, which is why "the value reads 4.2 × 10³⁷" is a recurring field-debug story.

Where Modbus is right (and where it's wrong)

Modbus is right when:

  • You need to bolt onto an existing field-device population without negotiation.
  • You're operating on a clean physical network (RS-485 multi-drop, isolated control-network VLAN) where the lack of authentication is offset by physical segregation.
  • The polled, low-latency request-response model fits the application (deterministic SCADA polling at 1-5 second intervals is the canonical example).
  • You need maximum interoperability with a heterogeneous fleet of vendor equipment.

Modbus is wrong when:

  • You need security at the protocol layer. Vanilla Modbus has none. None at all. Anyone on the wire can write any holding register on any slave, full stop.
  • You need event-driven reporting. Modbus is poll-only. There is no native "tell me when something changes" mechanism.
  • You need addressing beyond 247 slaves on a single segment, or beyond ~125 16-bit registers per request.
  • You need a rich data type system. Modbus has 16-bit words and 1-bit coils. Anything else is an interpretation layered on top.

Modern security: Modbus/Secure and Modbus over TLS

The Modbus Organization published Modbus/Secure (sometimes called Modbus/TCP Security) in 2018, adding TLS encryption and X.509 certificate-based authentication to Modbus/TCP. It's a mostly-clean addition — the message semantics don't change, just the transport adds a TLS handshake and encrypted channel.

Adoption is slow. Most field deployments are still vanilla Modbus on physically segregated networks because (a) the certificate management is a real operational burden, (b) most legacy field devices can't be upgraded to speak it, and (c) the common defensive posture is "Modbus is fine if it's not on the corporate network."

For new deployments — especially anything touching cloud or remote-access — Modbus/Secure should be the default. For an existing field population, the realistic path is zone-and-conduit segmentation per IEC 62443, with Modbus living inside the lowest-trust zone and a properly secured gateway translating to OPC UA or MQTT/Sparkplug at the zone boundary.

How Aevus reads Modbus

Aevus ingests Modbus telemetry from existing customer infrastructure in one of three ways, chosen per deployment:

  1. Through the customer's existing historian — if there's already an OSIsoft PI, Ignition, or AVEVA Historian collecting Modbus data, Aevus subscribes to the historian's API. Zero new connections to the field.
  2. Through a customer-deployed edge gateway — a small device at the customer site polls Modbus over the existing control network and forwards the data to Aevus via outbound MQTT (Sparkplug B). No inbound connections required.
  3. Through a SCADA front-end — if the customer's SCADA front-end can publish telemetry to a queue (Kafka, Kinesis, etc.), Aevus subscribes to the queue.

Aevus never writes Modbus. Reads only — and not even read access to write-capable registers, by IAM policy at our boundary. The AI cannot issue a Modbus write command to any of your field equipment.

The architecture enforcing this is IL-9000 — at the AWS Organization boundary, not by application policy.

That's Modbus.

If your plant runs Modbus across hundreds of devices and you want to know what's failing across the fleet — without writing back to a single one — that's the conversation we'd love to have.