Skip to content

J1939

CAN gains a heavy-vehicle vocabulary and source-addressing discipline.

Status Examples Runtime example Source posture
final-copy synthetic/passive available standards metadata plus public/tooling cross-checks

A Concrete Artifact

# synthetic 29-bit CAN frame interpreted as J1939
0x0CF00400  ff ff ff 68 13 ff ff ff

Synthetic

Synthetic offline sample for explanation; not a real operational trace or live-system instruction.

Inspection Trap

A 29-bit CAN identifier can look self-explanatory once a PGN appears. The trap is to treat PGN extraction as signal truth before checking PDU1/PDU2 rules, SPN authority, source-address claims, and dictionary provenance. PGN is still not signal truth.

This page inspects one synthetic extended CAN frame as J1939-shaped evidence. It teaches identifier composition, candidate PGN reasoning, source-address evidence, and the boundary between PGN/SPN dictionaries and raw bytes.

Worked Decode

  1. 0x0CF00400 is read as a 29-bit CAN identifier in the J1939 teaching model.
  2. Priority is 3, source address is 0x00, and PF = 0xF0, so the example is treated as a PDU2-style parameter group. In that case, PS = 0x04 contributes to the PGN, giving 0xF004.
  3. If PF were below 0xF0, PS would be interpreted as a destination address and the PGN calculation would differ. This is the first observer trap: the same 29-bit CAN shape does not always produce a PGN by the same rule.
  4. The payload bytes are transport evidence. Under a common EEC1-style teaching dictionary, bytes 68 13 at the relevant offset can be interpreted as raw 0x1368.
  5. Using a scale of 0.125 rpm/bit, raw 0x1368 gives an engine-speed-like value of 621 rpm.
  6. That value is a source-grounded claim only if the PGN/SPN definition, offset, byte order, scale, and not-available conventions match the captured system.
  7. SA = 0x00 is source-address evidence, not a permanent identity guarantee. A real observer still needs address-claim context, platform integration knowledge, and dictionary provenance before treating that source address as a specific controller.

What The Evidence Supports

  • The artifact supports priority, PF/PS, source-address, and PDU2 PGN extraction under the page-local J1939 model.
  • The payload can support an engine-speed-like toy calculation only under the named synthetic dictionary assumptions.
  • A sequence of similar frames would support cadence, source-address population, and stale/missing broadcast hypotheses.

What The Evidence Does Not Support

  • The artifact does not prove an actual engine speed, controller identity, sensor health, or fleet-specific SPN meaning.
  • It does not cover proprietary PGNs, full J1939DA signal tables, address-claim edge cases, or transport-protocol conformance.
  • It does not make a generic DBC or public explainer authoritative for a specific machine.

Field Layout / Anatomy

Element Shape Inspection meaning
Priority 3 bits Arbitration priority inherited from CAN extended identifiers.
PGN 18-bit concept from DP/PF/PS rules Names a parameter group, not every individual signal.
Source address 8 bits Identifies the claimed address of the transmitting controller.
Payload usually 8 bytes for simple PGs Carries SPN fields, not self-describing values.
Transport protocol multi-frame when needed Moves larger parameter groups through connection-management or broadcast-announcement patterns.

Visual Model

packet +3: "Priority 3" +1: "R" +1: "DP" +8: "PF 0xF0" +8: "PS 0x04" +8: "SA 0x00" +64: "Data ff ff ff 68 13 ff ff ff"
flowchart LR can["29-bit CAN ID"] --> pf{"PF < 0xF0?"} pf -- "yes: PDU1" --> pdu1["PS is destination<br/>PGN zeroes PS"] pf -- "no: PDU2" --> pdu2["PS is group extension<br/>PGN includes PS"] pdu2 --> pgn["PGN 0xF004"] pgn --> spn["SPN definitions"] db["J1939DA / DBC / OEM dictionary"] --> spn spn --> signal["EngineSpeed-like value"]

Timing And Authority

CAN arbitration still controls bus access, but J1939 adds semantic authority through PGN/SPN definitions, source-address claims, address-claim behavior, and vendor dictionaries. A repeated PGN cadence can reveal engine running state, missing modules, or diagnostic chatter; it cannot prove that a particular physical sensor is healthy.

Semantic authority

Bytes rarely explain themselves. Name the source that defines meaning before naming engineering values: standard metadata, label table, DBC, PGN/SPN definition, object dictionary, register map, DID catalog, LDF, ARXML, channel metadata, or vendor profile.

Failure And Ambiguity

  • PGN extraction differs between PDU1 and PDU2; treating all identifiers alike produces wrong group numbers.
  • J1939DA covers standardized PGNs/SPNs, not every proprietary or OEM-specific parameter group.
  • Source addresses can be reassigned or collide during address-claim behavior.
  • Not-available values and error indicators can look like high numeric values if decoded naively.
  • A generic DBC may decode a fleet incorrectly when firmware, options, or proprietary PGNs differ.

Python Model

The current package exposes a concrete identifier example:

"""Runnable J1939 identifier example for the schoolbus binder."""

from schoolbus.protocols.j1939 import J1939Identifier

identifier = J1939Identifier(0x0CF00400)

print(identifier.show_fields())
print(identifier.explain())

It demonstrates identifier decomposition before claiming SPN-level engineering values.

The first workbook sample pack includes a passive synthetic J1939 fixture under samples/first-workbook/ that keeps PGN evidence separate from SPN and payload authority.

Source Notes

Source confidence: High for identifier anatomy and semantic-authority framing. Signal-level claims are intentionally limited to the synthetic artifact and require dictionary provenance in real analysis.

Teaching claim Source role Limit
J1939 uses 29-bit CAN identifier parts. canonical metadata detailed J1939DA signal tables are not reproduced
PDU1/PDU2 changes PGN extraction. public explainer page uses one synthetic identifier
Source address is evidence. canonical metadata not permanent controller identity without address-claim data
Engine-speed-like value is toy-local. synthetic teaching artifact not a real SPN authority
Field Value
Governance tier Tier 1 Core Lab
Canonical source status yes
Public explainer status yes
Open-source tool status yes
Sample-data status none listed; use synthetic teaching artifacts
Confidence high
Citation specificity document-metadata-level
Canonical source(s) SAE J1939 Serial Control and Communications Heavy Duty Vehicle Network — Top Level Document (SAE International; SAE J1939_202306; paywalled; metadata-only)
Public explainer/tooling source(s) J1939 explained (CSS Electronics; public-web; link-only)
Linux J1939 documentation (Linux kernel; public-web; link-only)
Open-source tool references Linux J1939 kernel documentation: Linux J1939 sockets and transport model
python-can: CAN log inspection and offline lab context
can-utils: CAN capture/log-format context
canboat: NMEA 2000 description and decode context

Simplification

The 0xF004 and engine-speed-like decode are synthetic teaching choices aligned with common J1939 pedagogy. The page does not reproduce J1939DA tables, proprietary PGNs, address-claim edge cases, or transport-protocol conformance behavior.

References

Public Sources

Project posture is aggregated in the protocol support policy, source policy, and project charter.