Why trucks don't use OBD-II-style messaging

A truck cab, trailer, and any number of add-on implements (a fire pump, a refuse compactor, an agricultural tool) can come from entirely different manufacturers and still need to talk on one network. SAE J1939 is the standard that makes that possible - it defines a common, publicly documented message structure on top of the same 29-bit extended CAN identifiers covered in CAN Bus Fundamentals, so equipment from different vendors can broadcast and interpret the same messages without a private agreement between manufacturers.

PGNs: what a message is

PGN (Parameter Group Number) identifies what a J1939 message contains - the heavy-vehicle equivalent of "what this CAN ID means." A PGN is encoded directly into the extended 29-bit identifier, alongside the sender's address and message priority, so the meaning of a message is recoverable from the ID alone without an external database (though a database still maps a PGN to its human-readable name and contents).

PGNNameTypical rate
61444 (0xF004)Electronic Engine Controller 1 (EEC1) - engine speed20 ms
65262 (0xFEEE)Engine Temperature 1 - coolant temp1 s
65253 (0xFEE9)Engine Hours, Revolutionson request
65226 (0xFECA)Active Diagnostic Trouble Codes (DM1)1 s, or on change

SPNs: what a signal is

SPN (Suspect Parameter Number) is the individual signal within a PGN's data - the J1939 equivalent of one signal row in a DBC file (see DBC Files & Signal Decoding). PGN 61444 (EEC1) carries several SPNs in its 8 data bytes, including SPN 190 (Engine Speed) at a fixed byte position with a defined 0.125 rpm/bit resolution. Because the standard fixes both the PGN layout and the SPN definitions, a generic J1939 decoder can interpret standard messages from any compliant engine or transmission without a vehicle-specific DBC file - unlike a typical passenger-car OEM network, where the frame layout is proprietary.

Diagnostics: DM1 and DM2

J1939 has its own diagnostic message family, distinct from (but conceptually similar to) OBD-II's DTCs and UDS's diagnostic services:

  • DM1 (Active DTCs) - broadcast continuously while a fault is active, so any node - including a logger with no prior knowledge of the vehicle - can pick up currently-active faults just by listening.
  • DM2 (Previously Active DTCs) - the fault history, retrievable on request.

A J1939 DTC itself is structured as SPN + FMI (Failure Mode Identifier - e.g. "signal above normal range," "voltage below normal") rather than the five-character P/C/B/U codes OBD-II uses.

Source addresses and multi-ECU networks

Every J1939 node claims an 8-bit source address on startup (via an address-claim procedure that resolves conflicts if two nodes want the same one), and that address is embedded in every message's identifier. This is what lets J1939 tell apart, for example, the engine's DM1 broadcast from the transmission's, even though both use messages built from the same PGN structure.

Where this fits into the ONAC platform

The extended-ID CAN capture ONAC Network Studio already does for passenger-vehicle networks (see CAN Bus Fundamentals) applies directly to J1939 traffic at the frame level; PGN/SPN-aware decoding is part of extending that same decode pipeline for heavy-duty and off-highway consultancy work.