The same CAN 2.0B physical layer as a passenger car, with a completely different message structure built for a mix-and-match world of trucks, trailers, and implements.
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.
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).
| PGN | Name | Typical rate |
|---|---|---|
| 61444 (0xF004) | Electronic Engine Controller 1 (EEC1) - engine speed | 20 ms |
| 65262 (0xFEEE) | Engine Temperature 1 - coolant temp | 1 s |
| 65253 (0xFEE9) | Engine Hours, Revolutions | on request |
| 65226 (0xFECA) | Active Diagnostic Trouble Codes (DM1) | 1 s, or on change |
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.
J1939 has its own diagnostic message family, distinct from (but conceptually similar to) OBD-II's DTCs and UDS's diagnostic services:
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.
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.
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.