Blog
SAE J1939 PGN List Explained: Structure, Decoding, and Common Parameter Groups
August 25, 2026
If you've spent any time working with heavy-duty vehicle networks — trucks, buses, agricultural equipment, construction machinery, or marine systems — you've run into the term PGN. It shows up in datasheets, CAN traces, diagnostic tools, and protocol stacks, and it's one of the first concepts anyone integrating SAE J1939 needs to understand.
This guide breaks down what a PGN actually is, how it's built at the bit level, how to pull one out of a raw CAN identifier, and lists the PGNs you'll encounter most often in real-world J1939 networks.
PGN stands for Parameter Group Number. In SAE J1939, related data parameters are bundled together into a "Parameter Group" — for example, engine speed and engine torque are grouped into a single message rather than sent as separate frames. Each of these groups is assigned a unique numeric identifier by the SAE committee when the message is defined. That identifier is the PGN.
Every PGN is documented in the SAE J1939 standard, most commonly in J1939-71 (Vehicle Application Layer), which defines the great majority of application-level PGNs, and J1939-73 (Diagnostics Layer), which defines PGNs used specifically for fault reporting and diagnostic services like Active/Previously Active DTCs.
A PGN doesn't just identify a message it also implicitly defines:
A PGN is an 18-bit value made up of four fields:
| Field | Bits | Purpose |
|---|---|---|
| Extended Data Page (EDP) | 1 bit | Extends the addressable PGN space beyond the base standard |
| Data Page (DP) | 1 bit | Selects between Page 0 and Page 1 of the PGN space |
| PDU Format (PF) | 8 bits | Determines whether the message is PDU1 or PDU2 format |
| PDU Specific (PS) | 8 bits | Either a Destination Address (PDU1) or a Group Extension (PDU2) |
This 18-bit structure allows for a maximum of 8,672 unique PGNs, giving the standard plenty of room to define engine, transmission, brake, aftertreatment, body controller, and diagnostic messages without collision.
The behavior of the PDU Specific field depends entirely on the value of PDU Format (PF):
This distinction or debugging a bus trace — a PDU1 message's PS byte tells you who it's for, while a PDU2 message's PS byte tells on matters because it changes how you interpret the message when you're building a filter, writing a decoder, you what it is.
J1939 runs on top of CAN, using the 29-bit extended CAN identifier. The PGN isn't transmitted as a standalone field — it's embedded within that 29-bit ID alongside priority and source address information:
| Bit Range | Field |
|---|---|
| Bits 26-28 | Priority |
| Bit 25 | Reserved |
| Bit 24 | Data Page (DP) |
| Bits 16-23 | PDU Format (PF) |
| Bits 8-15 | PDU Specific (PS) |
| Bits 0-7 | Source Address (SA) |
A key point that trips up newcomers: the Source Address is not part of the PGN. Two messages with the same PGN sent by two different ECUs are still "the same PGN" — the PGN identifies what data is being sent, not who sent it. This is also why, in a PDU1 message, the PGN is considered static even though the PS byte changes per destination; the PGN value used for lookup purposes always has the PS field treated as zero for PDU1 messages.
Below are some of the most frequently used PGNs across engine, diagnostic, and network management functions. This is a working reference, not the full J1939-71/J1939-73 list — always confirm exact bit layouts against the current SAE specification for production work.
| PGN | Acronym | Name | Typical Rate |
|---|---|---|---|
| 61444 | EEC1 | Electronic Engine Controller 1 (engine speed, torque) | 10-50 ms, engine speed dependent |
| 61443 | EEC2 | Electronic Engine Controller 2 (accelerator pedal position) | 50 ms |
| 65265 | CCVS | Cruise Control/Vehicle Speed | 100 ms |
| 65262 | ET1 | Engine Temperature 1 (coolant, oil temp) | 1 s |
| 65263 | EFL/P1 | Engine Fluid Level/Pressure 1 | 500 ms |
| 65266 | LFE | Fuel Economy (fuel rate, instantaneous economy) | 100 ms |
| 65253 | HOURS | Engine Hours, Revolutions | On request / 1 s |
| 65259 | CI | Component Identification | On request |
| 65226 | DM1 | Active Diagnostic Trouble Codes | On change / 1 s |
| 65227 | DM2 | Previously Active Diagnostic Trouble Codes | On request |
| 60928 | AC | Address Claimed / Cannot Claim Address | On startup / on conflict |
| 59904 | RQST | Request PGN | As needed |
| 59392 | ACK | Acknowledgment | As needed |
| 65270 | IC1 | Inlet/Exhaust Conditions 1 (boost pressure, intake temp) | 500 ms |
Note: a handful of these differ slightly between engine and transmission ECU implementations, and OEM-specific PGNs above the standard range are common in real fleets — always cross-check against the ECU's own J1939 database (DBC) or the manufacturer's diagnostic documentation rather than relying on a generic list alone.
PGN 61444 is one of the most commonly referenced PGNs because it carries engine speed — a value nearly every diagnostic tool and telematics device needs.
| Attribute | Value |
|---|---|
| Parameter Group Number | 61444 |
| Data Length | 8 bytes |
| Default Priority | 3 |
| Transmission Rate | Engine speed dependent |
| Start Position | Length | Parameter | SPN |
|---|---|---|---|
| Byte 1, bits 1-4 | 4 bits | Engine Torque Mode | 899 |
| Byte 2 | 1 byte | Driver's Demand Engine – Percent Torque | 512 |
| Byte 3 | 1 byte | Actual Engine – Percent Torque | 513 |
| Bytes 4-5 | 2 bytes | Engine Speed | 190 |
| Byte 6 | 1 byte | Source Address of Controlling Device of Engine | 1483 |
| Byte 7, bits 1-4 | 4 bits | Engine Starter Mode | 1675 |
| Byte 8 | 1 byte | Engine Demand – Percent Torque | 2432 |
Notice that a single PGN carries seven distinct SPNs. This is the core reason PGNs and SPNs are talked about together but aren't interchangeable: the PGN identifies the message container, the SPN identifies the individual parameter inside it.
| Aspect | PGN (Parameter Group Number) | SPN (Suspect Parameter Number) |
|---|---|---|
| What it identifies | A message (a group of parameters) | An individual data parameter |
| Bit width | 18 bits | 19 bits |
| Where it's defined | J1939-71 (application), J1939-73 (diagnostics) | J1939-71, J1939-73 |
| Used for | Message filtering, routing, transmission rate | Diagnostic trouble codes, signal decoding |
| Example | 61444 (EEC1) | 190 (Engine Speed) |
| Cardinality | One PGN can contain multiple SPNs | One SPN typically lives inside one PGN |
If you're staring at a raw CAN trace, here's the practical extraction process:
Most engineers don't do this by hand for long — a CAN analyzer or a J1939 protocol stack that exposes a j1939_rx()-style API will parse the PGN, source address, and SPNs automatically, but understanding the manual process is essential for debugging edge cases like malformed frames or non-standard PGN implementations.
In production embedded systems, PGN handling isn't something most application developers implement from scratch — it's handled by the protocol stack layer, which exposes filtered, decoded parameters rather than raw CAN frames. A well-built J1939 stack will:
This is the layer where correctness really matters — a stack that mishandles PDU1/PDU2 detection or transport protocol reassembly will produce intermittent, hard-to-reproduce bugs on the bus.
The 18-bit PGN field allows for a theoretical maximum of 8,672 unique PGNs. The actual number of defined PGNs is smaller and grows with each SAE J1939-71/J1939-73 revision as new engine, transmission, and diagnostic functions are added.
The CAN ID is the full 29-bit identifier transmitted on the bus, which includes priority, the PGN fields (EDP, DP, PF, PS), and the source address. The PGN is extracted from the CAN ID — it's a subset of it, not a separate field sent independently.
Yes. The PGN identifies the data being sent, not the sender. Two different engine ECUs from two different manufacturers both broadcasting engine speed will use the same PGN (61444), differentiated only by their source address in the CAN ID.
PGN 65226 is DM1 (Active Diagnostic Trouble Codes), defined in J1939-73. It's how an ECU broadcasts currently active fault codes to the rest of the network, and it's one of the most commonly monitored PGNs in fleet diagnostic and telematics applications.
No — the PF field determines this at the protocol level. PF values 0-239 (PDU1) are destination-specific, while PF values 240-255 (PDU2) are always broadcast. A given PGN is fixed as one or the other by its definition; it doesn't switch dynamically.