FoundryNet / Compare / BACnet/IP vs Modbus TCP
Protocol comparison

BACnet/IP vs Modbus TCP

The question that appears the first time a data centre or a factory tries to put building systems and process equipment on one dashboard.

Get an API key All 14 adapters

Side by side

The comparison

BACnet/IPModbus TCP
SpecificationASHRAE 135 / ISO 16484-5Modicon Modbus, TCP encapsulation (Modbus-TCP)
First published19951979 (serial), 1999 (TCP)
TransportUDP 47808 (0xBAC0)TCP, port 502
Data modelObjects with properties — Analog Input, Binary Value, Schedule, Trend Log. Standard object types with standard property identifiers.Flat 16-bit registers and single-bit coils. No types, no names, no metadata — a register is a number at an address.
DiscoveryYes — Who-Is / I-Am broadcast discovery, then read the object list.None. You need the vendor's register map, usually a PDF.
SecurityWeak historically. BACnet/SC (secure connect) is the current answer and is not widely deployed.None in the base specification. Whatever the network gives you.
Polling or subscriptionBoth — polled reads and COV (change of value) subscriptions.Polling only. The client asks; the device answers.
Implementation complexityModerate. The object model is clean; the broadcast/BBMD routing across subnets is not.Lowest of any protocol here. A working client is ~200 lines.
Typical industriesBuildings. HVAC, chillers, air handlers, lighting, metering.Everything. Drives, meters, inverters, sensors, PLCs, BESS.
Forge supportAdapter shipped. 3 OEM families mapped.Adapter shipped. 14 OEM families mapped.

Where each one wins

BACnet/IP

Strength. Genuinely standardised object semantics inside its domain.

What it costs you. Object *names* are free text set by the commissioning engineer, so the semantics stop at the object type.

BACnet/IP adapter →

Modbus TCP

Strength. Universal, trivial to implement, works on hardware from 1985.

What it costs you. Carries no semantics whatsoever. Scaling, byte order and register meaning all live outside the protocol.

Modbus TCP adapter →

BACnet has real object semantics inside buildings; Modbus has no semantics anywhere. But BACnet object *names* are free text typed by a commissioning engineer, so 'AHU-3 SAT' and 'RTU3_SupplyTemp' are the same measurement at two sites of the same customer. The gap between the two protocols is smaller than the gap between two BACnet installations.


The Forge angle

Whichever one you pick, the output is the same

Forge is not an argument for a protocol. It is the layer that makes the choice stop mattering downstream: 16,908 curated mappings across 14 protocol adapters, resolving to 366 canonical fields with enforced units and physics bounds.

Two devices, two protocols, two vendors, two entirely different tag names — and one canonical field out. Both of these are real mappings from the corpus, not illustrations.

BACnet/IP — Carrier

# raw tag on the wire
{"EnergyKWH": 1450}
# normalized
{"energy_kwh": 1450}

Modbus TCP — Sungrow

# raw tag on the wire
{"Daily PV generation & battery discharge": 1450}
# normalized
{"energy_kwh": 1450}

Same field: energy_kwh. Same unit contract, same physics bounds, same shape. Your query does not need to know which protocol the reading arrived on.

# Try it against both, with no key and no account
docker run -p 8000:8000 ghcr.io/foundrynet/forge-sandbox

Keep reading

The protocol you pick matters less than the schema underneath. The Machine Agent, weekly. Read it →
Get the thesis behind this infrastructure — The Machine Agent, weekly.