AI-generated text still pending human review/editing.
NMEA 2000 ↗

ISO 11783 (ISOBUS)

ISOBUS is the standard a tractor and its implements speak to each other: a planter, sprayer, baler or harvester plugs into the same connector and is driven from one in-cab display. Under the hood it is J1939 with an agricultural dictionary, the same 29-bit CAN framing, the same PGN/source-address structure, the same ISO address claim. ISO 11783 adds an ag PGN set, a Virtual Terminal and Task Controller, and one extra transport for very large messages, the Extended Transport Protocol (ETP).

J1939 at the Wire Level

Every ISOBUS frame is a standard CAN 2.0B frame with a 29-bit extended identifier, split the way J1939 does it: priority, data page, PDU format, PDU specific, source address. The PGN (Parameter Group Number) says what the message is. sloppyCAN reuses its J1939 ID parser verbatim and swaps in the ISOBUS dictionary when you pick ISO 11783 from the protocol dropdown in the J1939 / N2K tab.

Because the data link is identical, standard J1939 Transport Protocol (TP.CM 0xEC00 / TP.DT 0xEB00) still applies: most multi-frame ISOBUS messages up to 1785 bytes use ordinary TP. ISOBUS mode keeps those handlers active; only larger transfers switch to ETP. A tractor also emits plain J1939 engine and vehicle-speed PGNs, so the ISOBUS dictionary includes the entire J1939 set plus the ag PGNs below.

The bus runs at 250 kbit/s. Set the header Speed dropdown to 250k before connecting to a real implement bus. sloppyCAN does not change it for you.

Agricultural PGNs

ISO 11783-7 defines the tractor/machine messages; -10 the Task Controller; -6 the Virtual Terminal. sloppyCAN decodes the high-value, byte-aligned ones and labels the rest:

PGNNameDecoded
65096 / 65097Wheel- / Ground-Based Speed & Distancespeed (m/s), distance (m), direction
65091 / 65092Primary / Secondary PTO Output Shaftshaft speed + setpoint (rpm), engaged
65093 / 65094Primary / Secondary Hitch Statusposition (%), in-work, nominal lower link force (%), draft (N)
65256Vehicle Direction / Speedcompass bearing, navigation speed, pitch, altitude
52224Task Controller Process Datacommand, element, DDI, value
58880 / 59136Virtual Terminal ↔ ECUVT function byte (labelled)

The Task Controller message packs a 4-bit command, a 12-bit element number, a 16-bit DDI (Data Dictionary Identifier, what variable this is, e.g. actual application rate) and a 32-bit signed value into 8 bytes. The Virtual Terminal object pool (the screens, soft keys and dials the operator sees) is a deep protocol of its own; sloppyCAN labels the VT function byte but does not render object pools.

ETP, the New Transport

Standard J1939 TP caps a message at 1785 bytes (255 packets × 7). ISOBUS object pools and large Task-Controller transfers blow past that, so ISO 11783-3 defines the Extended Transport Protocol, which uses two dedicated PGNs: ETP.CM (connection management) on 0xC800 and ETP.DT (data) on 0xC700.

The control flow mirrors TP: RTS announces the size, CTS clears packets, DT carries the data, EOMA acknowledges. ETP adds one extra message, the Data Packet Offset (DPO).

CtrlMessageCarries
0x14RTS: Request To Sendtotal size (32-bit), PGN
0x15CTS: Clear To Sendnum packets, next packet #
0x16DPO: Data Packet Offsetnum packets, packet offset, PGN
0x17EOMA: End Of Message Acktotal size
0xFFAbort-
ETP.DT frame (PGN 0xC700)
SEQbyte 0
Dbyte 1
D
D
D
D
D
Dbyte 7

In J1939 TP, data packet N always lands at byte offset (N − 1) × 7: the sequence number indexes the whole message. In ETP the sequence number is relative to the most recent DPO offset. The sender walks the message in windows: it sends a DPO that says "the next packets start at packet offset K", then DT packets numbered 1, 2, 3 … from that base. The real byte position is:

byteOffset = (dpoOffset + seq − 1) × 7

Decode it as (seq − 1) × 7 like TP and every window after the first lands in the wrong place. sloppyCAN tracks the current DPO offset per session and applies it to each DT packet. Reassembled ETP messages get an ETP badge in the PGN Monitor and Frame Log. The reassembly buffer is capped at 256 KB and stale sessions are dropped after ~2 s of silence.

Address Claim: Agricultural NAMEs

Address claim works exactly as in J1939 (PGN 60928, each device broadcasts a 64-bit NAME), but ISOBUS devices use industry group 2 (agriculture), and the device-class field (NAME bits 49–55) carries ag-specific classes. sloppyCAN's Address Claim tab maps them: 1 Tractor, 4 Planter/Seeder, 5 Fertilizer, 6 Sprayer, 7 Harvester, and many more.

Worked Example: PGN 65096

A single-frame TECU message. The 8 data bytes lay out as:

SPDbyte 0–1
SPD
DSTbyte 2–5
DST
DST
DST
-byte 6
DIRbyte 7

Payload: D0 07 A0 86 01 00 FF 40

  • Wheel Speed = bytes 0–1 LE = 0x07D0 = 2000 × 0.001 m/s = 2.0 m/s
  • Wheel Distance = bytes 2–5 LE = 0x000186A0 = 100 000 × 0.001 m = 100 m
  • Direction = byte 7 bits 6–7 = 01 = Forward

That's exactly what the PGN Monitor shows when you run Demo with the dropdown set to ISO 11783: tractor speed, PTO, hitch, a Task-Controller value, periodic ag address claims, and (every few seconds) a 1792-byte ETP object-pool transfer so you can watch ETP reassembly happen with no hardware attached.