Skip to main content

The Signal Layer Below Modbus: 4-20 mA, HART, Fieldbus, and Discrete I/O

📍 Where we are: Part II · Capturing the Process — Chapter 12. Chapter 11 read Modbus and S7 — digital protocols that at least return a number. This chapter goes one layer deeper, to the physical signals beneath them: a sensor that reports as an electrical current, a valve that is a 24-volt line, a transmitter that overlays digital data on the loop — and reads each safely into the same canonical, unit-bearing tags.

The simple version

Beneath the protocols that send numbers sits a layer that sends electricity. The oldest and most common industrial sensor does not transmit "1.85 bar"; it transmits a current between 4 and 20 milliamps, and 4 mA means the bottom of its range, 20 mA the top — like a fuel gauge that is a needle, not a readout. There is no unit on that wire, no name, not even a way for the sensor to say "I'm broken" except a clever convention: if the current drops below about 3.6 mA or climbs above 21, something has failed, because a healthy sensor never sends those values. A 24-volt line is even simpler — on or off, valve open or shut. This chapter reads that physical signal layer, applies the conventions that turn a current into a meaning, and lands every reading in the same canonical tags as everything else. It is the same job as the legacy-protocol chapter — the edge layer supplies what the wire omits — only the wire here omits even more.

What this chapter covers

Chapter 11 reached the legacy digital protocols — Modbus and S7 — that return raw integers. But walk to the instrument rack and many signals never reach a digital protocol at all: they are analog currents, voltage lines, and fieldbus telegrams that an I/O module or gateway converts before anything Modbus-shaped exists. We cover:

  • The physical signal layer — why a 4-20 mA current, a 24V line, a HART overlay, and a Profibus telegram sit below the digital protocols, and why they carry even less meaning than Modbus.
  • 4-20 mA current loops — linear scaling from milliamps to engineering units, and NAMUR NE43 fault detection, the analog cousin of a quality flag, shown in runnable code.
  • HART — the digital signal overlaid on the 4-20 mA loop that volunteers the primary variable with its unit and a device identity, so it carries more than the bare current beneath it.
  • Discrete 24V I/O and fieldbus — single-bit signals and the cyclic, already-typed data of Profibus/Profinet.
  • Landing it in the canonical model — mapping every signal-layer channel to the same unit-bearing tag the bioreactor information model declares, via examples/chapters/12-the-signal-layer/signal_layer.py.

Below the digital protocols

The legacy-skids chapter made a point that gets sharper one layer down: a protocol carries less meaning than you assume, and the edge layer supplies the rest. Modbus returned a raw integer with no unit, timestamp, or quality. The signal layer beneath it returns even less — frequently not a number at all, but a physical quantity an I/O module must first convert into one.

The workhorse is the 4-20 mA current loop, the dominant analog instrumentation signal for half a century. A pressure or temperature transmitter does not send a value; it modulates the current flowing in its loop between 4 mA (the bottom of its calibrated range) and 20 mA (the top). The choice of 4 mA — not 0 — as the "live zero" is deliberate and clever: a genuinely zero current means a broken wire, not a real low reading, so the signal range itself encodes a basic integrity check. But that current carries no engineering unit, no tag name, no timestamp, and no datatype — strictly less than a Modbus register, which at least holds a number someone could read off a datasheet. An analog input module samples the current and hands the edge layer a float in milliamps; everything else — what physical quantity it represents, in what unit, scaled how, and whether it is even valid — is the edge layer's to supply.

Three other signal-layer kinds round out a real bioreactor suite. HART (Highway Addressable Remote Transducer) overlays a low-level digital signal on the same 4-20 mA wire, so a HART transmitter sends both the analog current and a digital message carrying its primary variable with a real unit and a device identity — it volunteers what the bare loop cannot. Discrete 24V I/O is a single bit: a 24-volt line that is on or off, a valve open or closed, a level switch made or not. And fieldbusesProfibus and its Ethernet successor Profinet — carry cyclic, already-typed process data between a controller and its field devices, the richer end of the signal layer. The edge layer's job is the same across all of them, and identical to the Modbus chapter's: scale, name, unit, and quality-stamp each signal into the platform's canonical tags.

4-20 mA: scaling a current, and NAMUR NE43

The conversion from milliamps to a meaning is a straight line, and it is worth seeing in code because the fault half is the part people skip. The module examples/chapters/12-the-signal-layer/signal_layer.py models a 4-20 mA pressure transmitter calibrated so that 4 mA is 0 bar and 20 mA is 3 bar:

# examples/chapters/12-the-signal-layer/signal_layer.py (excerpt)
def scale_4_20(loop: Loop4to20, mA: float) -> dict:
"""Linear 4-20 mA -> engineering unit, with NAMUR NE43 fault detection."""
# NAMUR NE43: the 3.8-20.5 mA band is valid signal; outside it is a diagnosed fault,
# NOT a real reading. This is the analog layer's only 'quality flag', and the edge
# layer must assert it -- the current itself does not say 'I am broken'.
if mA < 3.6: return {"tag": loop.tag, "quality": "BAD", "fault": "under-range (sensor/loop fault)"}
if mA > 21.0: return {"tag": loop.tag, "quality": "BAD", "fault": "over-range (sensor/loop fault)"}
eu = loop.lo_eu + (mA - 4.0) / 16.0 * (loop.hi_eu - loop.lo_eu)
q = "GOOD" if 3.8 <= mA <= 20.5 else "UNCERTAIN"
return {"tag": loop.tag, "value": round(eu, 3), "unit": loop.unit, "quality": q}

The linear scale is the obvious part: 12 mA is halfway, so 1.5 bar. The load-bearing part is NAMUR NE43, the industry recommendation that standardizes how a transmitter signals a fault on a 4-20 mA loop. Because a healthy sensor only ever drives 3.8-20.5 mA, a reading outside that band is not a real low or high value — it is a diagnosed sensor or loop failure (a burned-out sensor drives the current to a fixed downscale value below 3.6 mA; a short drives it upscale). NE43 is the analog layer's only equivalent of OPC UA's Good/Uncertain/Bad quality, and it is one the edge layer must assert, because the current itself cannot say "I am broken" — it can only sit at a value a healthy sensor would never produce. An edge layer that scales a 3.4 mA fault current as if it were a real reading records a confident, wrong, in-range-looking pressure — exactly the silent-corruption failure the legacy chapter warned about, now one layer lower.

HART and fieldbus: when the signal layer volunteers more

Not every signal-layer protocol is as mute as a bare current. HART is the important middle case: it keeps the 4-20 mA analog loop (so legacy analog-input systems still read it) but overlays a digital FSK signal that carries the device's primary variable with its engineering unit, additional variables, a device tag, and a status byte. A HART temperature transmitter, read digitally, hands you 37.05 Cel with a device identity — the unit and the identity arrive on the wire, not from the edge layer's scaling table. HART is therefore the signal layer's partial answer to the meaning problem: where it is available, prefer the digital reading, because it volunteers what the analog loop omits.

Profibus and Profinet sit at the richer end still: a fieldbus master exchanges cyclic, already-typed I/O with field devices according to a device profile (the GSD file), so an agitator's variable-frequency drive can report its speed as a typed value in min-1 rather than a bare current. The trade is the familiar one: more meaning on the wire, but a more complex master and a device-profile dependency. The module makes the spectrum explicit — for each signal-layer kind it records what the wire volunteers versus what the edge layer must add. Running python signal_layer.py prints the conversions and that comparison, verbatim:

the signal layer below Modbus — 4-20 mA, HART, discrete 24V, fieldbus
each physical signal -> a canonical, unit-bearing tag (the edge layer supplies what the wire omits)

-- 4-20 mA pressure transmitter (no unit, no identity on the wire) --
4.0 mA -> 0.000 bar [GOOD] BR101.Pressure.PV
11.6 mA -> 1.425 bar [GOOD] BR101.Pressure.PV
20.0 mA -> 3.000 bar [GOOD] BR101.Pressure.PV
3.4 mA -> --- [BAD] under-range (sensor/loop fault)

-- 4-20 mA + HART temperature transmitter (HART overlays digital PV + unit + tag) --
HART PV = 37.05 Cel device-tag=BR101.Temp.PV (unit + identity came digitally)

-- discrete 24V level switch (one bit; the edge layer names the state) --
24 V -> True BR101.LevelSwitch.High
0 V -> False BR101.LevelSwitch.High

-- Profibus DP agitator VFD (fieldbus carries cyclic, already-typed data) --
cyclic word -> 142.0 min-1 BR101.Agitation.PV (typed + unit by GSD device profile)

-- WHAT EACH SIGNAL-LAYER PROTOCOL VOLUNTEERS (True) vs the edge layer must ADD --
protocol value unit identity fault/quality
4-20 mA True False False NE43 only (edge asserts)
4-20 mA + HART True True True HART status byte
discrete 24V True False False line-fault only
Profibus DP True True True diagnostic telegram

Read the comparison table as the chapter's spine. The four signal-layer kinds form a spectrum of how much meaning the wire carries: bare 4-20 mA and a 24V bit volunteer only a value (and a crude fault), so the edge layer supplies unit, identity, and quality; HART and Profibus volunteer the unit and identity digitally, so the edge layer supplies less. But the destination is identical for all four — a canonical, unit-bearing tag like BR101.Pressure.PV in the bioreactor information model. The signal layer is where the plant's physics meets its data model, and the edge layer is the translator that makes a current mean something.

Hero diagram of the signal layer as a stacked stratum beneath the digital protocols. At the top, a thin slate band labelled digital protocols (Modbus, S7 — Chapter 11). Below it, a wider band labelled the signal layer with four channels drawn left to right into a shared edge-layer converter box. Channel one, indigo, a 4-20 mA pressure transmitter, shows a current dial reading 11.6 mA with a NAMUR NE43 scale marking the 3.8 to 20.5 mA valid band in green and the under-3.6 and over-21 zones in rose as faults; an arrow into the converter is labelled scale + NE43. Channel two, cyan, a 4-20 mA + HART temperature transmitter, shows the same loop with a digital overlay carrying PV 37.05 Cel and a device tag, labelled volunteers unit + identity. Channel three, amber, a discrete 24V level switch, shows one bit on/off. Channel four, violet, a Profibus DP agitator VFD, shows cyclic typed data 142 min-1. The converter box emits four canonical unit-bearing tags (BR101.Pressure.PV bar, BR101.Temp.PV Cel, BR101.LevelSwitch.High bool, BR101.Agitation.PV min-1) up into a green canonical model band labelled the bioreactor information model, Chapter 6. A small table at the bottom marks what each protocol volunteers: value, unit, identity, fault. The signal layer, beneath the digital protocols: four physical channels — a bare 4-20 mA current (scaled, with NAMUR NE43 telling a fault from a real reading), a HART loop that volunteers its unit and identity digitally, a discrete 24V bit, and a Profibus fieldbus carrying typed data — all converted by the edge layer into the same canonical, unit-bearing tags the bioreactor model declares. The lower the meaning the wire carries, the more the edge layer must supply. Original diagram by the authors, created with AI assistance.

Why it matters

The signal layer is where a surprising amount of a bioreactor's data actually originates — pressure and temperature transmitters, mass-flow controllers, level switches, agitator drives — and it is the layer most likely to be read carelessly, precisely because a current looks like such a simple thing. The two failures it invites are the ones this chapter guards against. First, scaling without fault detection: an edge layer that linearly scales every milliamp value, including a 3.4 mA fault current, records an authoritative-looking pressure that is pure sensor failure, and a downstream model or reviewer has no way to see it — which is why NE43 is not optional decoration but a data-integrity control, the analog cousin of the quality flag, that belongs under the same review and qualification as any GMP control. Second, assuming the wire carries meaning it does not: a 4-20 mA loop has no unit and no identity, so the unit and canonical name come entirely from reviewed edge configuration, exactly as for Modbus — and getting that scaling table wrong by a decimal silently corrupts the record. Done right, the signal layer feeds the same canonical, unit-bearing, quality-stamped tags as every other source, so a soft sensor or an agentic connectivity tool downstream cannot tell — and need not care — whether a reading began life as an OPC UA node or a 12 mA current. That uniformity is the whole point: the messiest, most physical layer of the plant is made to speak the same canonical model as the cleanest.

In the real world

The signal layer is not legacy trivia; it is the live majority of plant instrumentation. 4-20 mA remains the dominant process-instrumentation signal worldwide, and NAMUR NE43 is the universally applied recommendation for how a transmitter signals a fault on that loop — the 3.8-20.5 mA valid band and the downscale/upscale fault currents are standard across vendors [1]. HART is installed on a very large base of field devices precisely because it adds digital data without abandoning the 4-20 mA loop, and the FieldComm Group maintains it alongside Profibus and Profinet, the dominant fieldbuses for cyclic I/O [2][3]. The RFP that motivates this series names exactly this spread of signals — Analog 4-20 mA, HART, Modbus RTU/TCP, Profibus, RS-232/485, discrete 24V — across its instrument table (pressure and temperature transmitters, mass-flow controllers, peristaltic pumps, agitators, level switches), confirming that a real bioreactor suite mixes the signal layer with the digital protocols on the same skid [4]. Two honest caveats close the loop. First, the device-status side is maturing: NAMUR NE107 standardizes a richer four-state device health (Good / Maintenance Required / Out of Specification / Failure) that HART and the OPC UA companion specs increasingly carry, beyond NE43's binary fault [1]. Second, the security story is the same as Modbus's: an analog loop has no authentication to break, but the I/O modules, HART multiplexers, and fieldbus masters that aggregate these signals sit on the OT network and inherit the same zone-and-conduit segmentation obligation under NIST SP 800-82 and IEC 62443 [5]. The OSS-versus-commercial line holds too: open-source edge tools scale and quality-stamp these signals once an I/O module or HART/fieldbus gateway has digitized them, but that digitization hardware — the analog-input card, the HART modem, the Profibus master — is vendor equipment, so the signal layer is where "open source reaches the device" meets a physical gateway it does not replace.

Key terms

  • Signal layer — the physical instrumentation signals (analog current, voltage, fieldbus) beneath the digital protocols; an I/O module or gateway converts them to numbers before a Modbus-shaped value exists, and the edge layer supplies the unit, identity, and fault semantics the wire omits.
  • 4-20 mA current loop — the dominant analog instrumentation signal: a transmitter modulates the loop current between 4 mA (range bottom) and 20 mA (range top), with no unit, name, or datatype on the wire; "live zero" at 4 mA means a broken wire (0 mA) is distinguishable from a real low reading.
  • NAMUR NE43 — the recommendation standardizing fault signaling on a 4-20 mA loop: the 3.8-20.5 mA band is valid signal, and a current below ~3.6 mA or above ~21 mA is a diagnosed sensor/loop fault, not a real reading; the analog layer's only quality flag, which the edge layer must assert.
  • HART (Highway Addressable Remote Transducer) — a digital signal overlaid on the 4-20 mA loop that carries the primary variable with its unit, additional variables, a device identity, and a status byte; the signal layer's partial answer to the meaning problem, since it volunteers what the bare current omits.
  • Discrete 24V I/O — a single-bit signal: a 24-volt line that is on or off (a valve open/closed, a level switch made), named into a boolean tag by the edge layer.
  • Profibus / Profinet — fieldbuses carrying cyclic, already-typed process data between a controller and field devices per a device profile (GSD); the richer end of the signal layer, where the wire volunteers typed values and units.
  • NAMUR NE107 — the recommendation for richer device-status signaling (Good / Maintenance Required / Out of Specification / Failure) that HART and OPC UA companion specs increasingly carry, beyond NE43's binary fault.
  • Edge-layer translation — scaling, naming, unit-stamping, and quality-stamping each signal-layer channel into the platform's canonical, unit-bearing tags; the same job as the Modbus chapter, only the wire here omits more.

Where this leads

We have now reached the very bottom of the capture stack — the physical currents and voltages beneath every digital protocol — and pulled them up into the same canonical tags as everything else. The upstream picture is complete: from a self-describing OPC UA bioreactor down to a bare 4-20 mA loop, every signal speaks the model. Next we follow the product into purification. Downstream Capture: Chromatography & Filtration Skids turns the load, wash, elute, and strip phases of a Protein A capture cycle into decision-bearing events — the moment the harvest becomes drug substance, and the time-series we have been collecting starts to tell a purification story.