Press Releases

J1939 DM1 vs DM2: Understanding Diagnostic Messages

September 3, 2026

What's the Difference?

Anyone working with SAE J1939 fault reporting runs into DM1 and DM2 almost immediately — they're the two most common diagnostic messages on the bus, and they're easy to confuse because they carry nearly identical data structures. The difference isn't in what they contain, it's in what state of fault they represent. This guide breaks down exactly how DM1 and DM2 differ, how each is structured, and when a real diagnostic workflow needs to look at one versus the other.

Quick Answer

DM1 (PGN 65226) reports currently active diagnostic trouble codes — faults that are happening right now. DM2 (PGN 65227) reports previously active diagnostic trouble codes — faults that occurred at some point but are not currently present. Both messages use the same underlying data structure (SPN, FMI, Occurrence Count, SPN Conversion Method); the distinction is purely about fault status, not format.

What Is DM1?

DM1, formally Active Diagnostic Trouble Codes, is defined in J1939-73 as PGN 65226. An ECU broadcasts DM1 whenever it has one or more faults that are currently active — meaning the fault condition is present at this exact moment. If the fault clears (e.g., a sensor reading returns to normal range), the associated code is expected to drop out of the next DM1 broadcast.

Key characteristics of DM1:
  • Broadcast on change of active fault status, and also cyclically (commonly every 1 second) as long as at least one fault is active
  • Includes lamp status bits at the start of the message — Malfunction Indicator Lamp (MIL), Red Stop Lamp, Amber Warning Lamp, and Protect Lamp — indicating what the ECU wants the operator to see on the dash
  • If no faults are active, DM1 is transmitted with an "all clear" indication (SPN 524287, meaning no fault data follows)

What Is DM2?

DM2, formally Previously Active Diagnostic Trouble Codes, is defined in J1939-73 as PGN 65227. It holds a history of faults that were active at some point but are no longer occurring — essentially the fault memory log. This is the equivalent of what many technicians call "stored codes" or "history codes" in other diagnostic contexts.

Key characteristics of DM2:
  • Transmitted on request rather than broadcast continuously — a scan tool or diagnostic system typically requests DM2 explicitly using a Request PGN (59904) targeting PGN 65227
  • Retains faults even after they're no longer active, until they're cleared (typically via a DM3 "Clear Previously Active DTCs" command from a diagnostic tool)
  • Uses the same lamp status and DTC structure as DM1, but reflects the fault history rather than the live state

DM1 vs. DM2 Comparison

Aspect DM1 DM2
Full name Active Diagnostic Trouble Codes Previously Active Diagnostic Trouble Codes
PGN 65226 65227
Defined in J1939-73 J1939-73
Reports Faults currently occurring Faults that occurred but are no longer active
Transmission Broadcast on change / cyclically (e.g., 1 s) Sent on request
Data structure SPN + FMI + OC + SPN Conversion Method Same structure as DM1
Lamp status included Yes Yes
Cleared by Fault condition resolving on its own DM3 (Clear Previously Active DTCs) command
Typical use case Real-time fault monitoring, dash warning lamps Fault history review, service diagnostics

Anatomy of a DM1/DM2 Message

Both messages share the same on-wire structure. The first byte carries lamp status, and every DTC after that is packed into a repeating 4-byte block:

Byte(s) Field
Full name Active Diagnostic Trouble Codes
Byte 1 Lamp Status (MIL, Red Stop, Amber Warning, Protect)
Byte 2 Flash/Lamp Status continued
Bytes 3-4 SPN (low byte, mid byte — partial)
Byte 5, bits 1-5 FMI
Byte 5, bits 6-7 SPN Conversion Method
Byte 5, bits 8 + Byte 6 SPN (high bits) / Occurrence Count

If more than one fault is active (or was previously active), the message extends beyond 8 bytes and is sent using the Transport Protocol (TP.CM/TP.DT), since a single CAN frame can't hold more than one 8-byte payload. This is one of the most common places implementations get tripped up — a DM1 with multiple simultaneous faults is a multi-packet message, not a single frame, and needs to be reassembled accordingly.

Worked Example

Suppose an engine ECU detects a boost pressure sensor reading a voltage above the expected range, starting at time T:

  • At time T, the fault becomes active. The ECU adds SPN 102 (Boost Pressure), FMI 3 (Voltage Above Normal) to its next DM1 broadcast, and illuminates the appropriate warning lamp.
  • While the fault persists, DM1 continues to report SPN 102/FMI 3 with an incrementing Occurrence Count each time it's re-detected.
  • When the fault clears (voltage returns to normal), the ECU removes SPN 102/FMI 3 from DM1 — it no longer broadcasts as active.
  • The fault is now available in DM2 — a technician running a scan tool later can request DM2 and see that SPN 102/FMI 3 occurred previously, even though DM1 currently shows no active faults.
  • The technician clears the code using a DM3 command, removing it from DM2's history.

This is exactly why fleet diagnostic tools query both messages: DM1 tells you what's wrong right now, DM2 tells you what's happened since the last clear.

Where DM1 and DM2 Fit Among the Other DM Messages

DM1 and DM2 are the two most commonly used diagnostic messages, but J1939-73 defines a broader family:

Message Purpose
DM1 Active Diagnostic Trouble Codes
DM2 Previously Active Diagnostic Trouble Codes
DM3 Clear Previously Active DTCs (technician command)
DM4 Freeze Frame Parameters
DM11 Clear/Reset Active DTCs (technician command)
DM12 Emissions-Related Active DTCs
DM23 Previously Active Emissions-Related DTCs
DM30 Scaled Test Results
DM31 DTC to Lamp Association

DM1 and DM2 handle the general case; several of the others (like DM12/DM23) exist specifically for emissions-related fault reporting under OBD requirements.

Why This Distinction Matters in Implementation

For anyone building or integrating a J1939 stack, treating DM1 and DM2 as interchangeable is a common source of bugs:

  • A system that only monitors DM1 will miss intermittent faults that clear before anyone looks — those only show up in DM2's history.
  • A system that only checks DM2 won't reflect the real-time state needed for dash warning lamps or live fleet monitoring.
  • Clearing logic differs — DM1 faults clear themselves when the condition resolves; DM2 entries persist until explicitly cleared with DM3, and confusing the two can leave stale codes in a technician's report or, conversely, wipe fault history that should have been retained.

A properly implemented Diagnostic Event Manager handles this separation natively — tracking active faults, moving them into history when they clear, and responding to DM3/DM11 clear requests — rather than requiring application code to manage the state transitions manually.

FAQs

Functionally, yes most J1939 diagnostic stacks move a fault out of the active (DM1) set and into the previously-active (DM2) history the moment it's no longer detected as active, assuming the implementation follows the standard's intended behavior.

DM2 (previously active) codes are cleared using DM3 – Clear Previously Active DTCs, typically issued by a scan tool or diagnostic application. This is distinct from DM11, which clears active DTCs.

DM1 is broadcast automatically whenever at least one fault is active — on change of status and cyclically, commonly every second. It doesn't need to be requested, unlike DM2.

Yes. If multiple faults are active simultaneously, DM1 grows beyond a single 8-byte CAN frame and is transmitted using the J1939 Transport Protocol (TP.CM/TP.DT) to carry all the SPN/FMI pairs in one multi-packet message.

DM2 covers previously active DTCs generally, while DM12 is scoped specifically to emissions-related active DTCs, used to satisfy OBD compliance requirements. DM2 is broader; DM12 is a regulatory-focused subset.