Skip to content

Fleet Maintenance Codes: Reading Fault Data Without the Manual

A fault code is a pointer, not a diagnosis. This sheet covers how the codes are built, what the common ones usually mean, and how heavy-vehicle J1939 data differs from the OBD-II codes a car scanner shows you.

A code arrives on the tracking screen at 06:40. The driver is at the gate, the load is booked in for nine, and somebody has to decide in the next two minutes whether the vehicle rolls. What is on screen is five characters. Nobody in the room knows whether those five characters mean the truck limps home tonight or stops here.

That decision gets easier once you can read the structure. Codes are not arbitrary — the first character tells you which domain failed, the digits narrow it to a subsystem, and on heavy vehicles a separate failure-mode number tells you whether the sensor read high, read low, or stopped talking altogether. Knowing that much lets a supervisor triage before the workshop picks up the phone.

One caution stated up front: a code names a circuit or a symptom, never a part. P0401 does not mean the EGR valve is faulty. It means measured flow did not match expected flow, which a blocked passage, a stuck valve, a bad sensor or a wiring fault will all produce. Codes narrow the search. They do not end it.

How a fault code is assembled

PositionWhat it encodesExample
First character: PPowertrain. Engine, transmission, fuel, ignition and emissions. The bulk of what a fleet sees.P0300
First character: BBody. Cab systems, restraints, climate, lighting and interior electrics.B1234
First character: CChassis. Braking, steering, suspension and stability control systems.C0035
First character: UNetwork and communication. A module has stopped talking on the bus, or is talking nonsense.U0100
Second digit: 0Generic. Defined by the SAE standard and identical in meaning across every manufacturer.P0171
Second digit: 1Manufacturer-specific. The meaning comes from the OEM's own list, not from any published standard.P1234
Third digit: 1 or 2Fuel and air metering. Digit 2 narrows it to the injector circuit specifically.P0171, P0201
Third digit: 3Ignition system or misfire detection.P0300
Third digit: 4Auxiliary emission controls: EGR, catalyst, evaporative and aftertreatment.P0401, P0420
Third digit: 5Vehicle speed control, idle control and auxiliary inputs.P0562
Third digit: 6Computer output circuits and module-to-module links.P0606
Third digit: 7 or 8Transmission. Two groups because one ran out of room.P0700

Powertrain codes you will actually see

CodeWhat it meansWhere it usually leads
P0016Crankshaft and camshaft position correlation. The two sensors disagree about where the engine is.Timing chain wear, a slipped tone ring, or a sensor circuit fault. Not a code to drive on.
P0087Fuel rail or system pressure too low.Filter, lift pump, high-pressure pump or a leaking return. Often follows poor fuel or a missed filter change.
P0101Mass air flow sensor range or performance. The reading is implausible rather than absent.A dirty sensor, an air leak after it, or a blocked filter. Cheap to check first.
P0171System too lean on bank one. More air than the fuelling expects.Vacuum or intake leak, weak fuel delivery, or a drifting oxygen sensor.
P0234Turbocharger overboost. Boost exceeded the commanded target.Stuck wastegate or variable geometry mechanism. Usually pairs with a power derate.
P0299Turbocharger underboost. Boost fell short of target.Boost leak, sticking vanes, or a restricted intake. The common cause of a truck that has gone flat.
P0300Random or multiple cylinder misfire. Codes P0301 upward name the specific cylinder instead.Fuel, compression or ignition. A single-cylinder code narrows the job enormously.
P0401Insufficient EGR flow. Measured flow did not match what was commanded.Soot-blocked passages, a stuck valve, or the sensor that measures the flow.
P0420Catalyst efficiency below threshold on bank one. Inferred from the downstream sensor, not measured directly.A failed catalyst, or a lazy rear oxygen sensor telling a story about a healthy one.
P0562System voltage low.Alternator, belt, batteries or a corroded earth. Chase this before the codes it causes.
P2002Diesel particulate filter efficiency below threshold on bank one.A filter at the end of its life, or a regeneration cycle the duty cycle never allows to complete.
U0100Lost communication with the engine control module.Wiring, connector or power to the module. Everything downstream of it will code too, so start here.

J1939 failure mode identifiers

FMIFailure modeRead it as
0Data valid but above normal operational range, most severe level.The reading is real and it is dangerously high. Stop the vehicle.
1Data valid but below normal operational range, most severe level.Real and dangerously low. Oil pressure landing here ends the shift.
2Data erratic, intermittent or incorrect.The signal is jumping around. Usually a connector, rarely the component.
3Voltage above normal, or shorted to high source.An electrical fault on the circuit, not a fault in the thing being measured.
4Voltage below normal, or shorted to low source.The circuit is grounding somewhere it should not.
5Current below normal, or open circuit.A broken wire or an unplugged connector. Check the obvious before the expensive.
6Current above normal, or grounded circuit.Something is drawing more than it should. A chafed loom is the classic.
7Mechanical system not responding, or out of adjustment.The command went out and nothing moved. An actuator or linkage problem.
9Abnormal update rate.The message is arriving too slowly. A bus loading or module health issue.
13Out of calibration.The component works but its reference is wrong. Often follows a part swap without a reset.
19Received network data in error.A module is repeating what another module told it, and that source is the real fault.
31Condition exists.The vaguest one in the standard. The manufacturer's own documentation is the only route in.

Suspect parameter numbers worth knowing

SPNParameterWhy it matters
84Wheel-based vehicle speed.Drives the tachograph, the speed limiter and most distance reporting. A fault here corrupts the trip record.
91Accelerator pedal position.Separates a driver asking for power from an engine failing to deliver it.
100Engine oil pressure.Paired with FMI 1 this is the code that ends the shift where the vehicle is standing.
102Boost pressure.The measurement behind most derates and the first place to look when a truck feels flat.
110Engine coolant temperature.A slow climb over weeks is a cooling system telling you before it strands anybody.
190Engine speed.Underpins idle detection, gear analysis and engine hours. Nothing derived from it survives a fault.
639J1939 network number one.The bus itself has a problem. Treat unrelated codes arriving alongside this one with suspicion.
1761Diesel exhaust fluid tank level.Runs to zero and the vehicle derates by design. A refill problem, not a mechanical one.

Repair coding dimensions

DimensionWhat it records
System, assembly, componentThe three-level hierarchy standard coding schemes use to locate a repair, narrowing from a system down to the individual part. It is how you compare brake spend across a fleet without reading job cards.
Reason for repairWhy the vehicle came in: scheduled service, driver defect report, inspection finding, breakdown, or accident damage. Without this field you cannot separate planned work from firefighting.
Work accomplishedWhat was actually done to the component: replaced, repaired, adjusted, cleaned, or inspected with no fault found. The no-fault-found count is often the most revealing number in the workshop.
Repair priorityHow urgently the job needed doing, recorded at the point of diagnosis rather than reconstructed later. It is what lets you audit whether urgent work actually jumped the queue.
Labour and parts splitHours against materials on the same job. A component with low parts cost and high labour hours is an access problem, and access problems are a specification decision rather than a workshop one.
Failure timingWhether the failure happened in service, at inspection, or on the roadside. The same repair carries a very different total cost depending on which of the three it was.

Frequently asked questions

Because VMRS is a licensed standard published by the Technology and Maintenance Council, and reproducing its code list here would be both a copyright problem and a reliability problem — the list is revised, and a stale copy on a web page is worse than no copy. The structure is what generalises, so that is what we have described. If your workshop needs the numbers, licence them from TMC and hold one authoritative version rather than the three partial copies most fleets end up with.

No, and confusing them wastes workshop time. OBD-II codes are the five-character format familiar from cars and light commercials, and they are largely emissions-driven. Heavy vehicles report over J1939 as an SPN naming the parameter plus an FMI describing how it failed, with an occurrence count. J1939 tells you more: the same SPN with FMI 4 is an electrical fault while FMI 0 is a genuine reading that is too high. Those are different jobs and the same part number will not fix both.

Probably, and the vehicle has told you something useful. Intermittent faults are the expensive ones because they refuse to appear in the bay. This is why the occurrence count matters and why history is worth keeping: a code that has now appeared eleven times over six weeks, always cold, always on the same vehicle, is a chafed connector nobody has found yet. Clearing codes without recording them destroys the only evidence you had.

No, and any system claiming otherwise is selling you something. A code identifies a circuit or a symptom. It does not identify the cause, and the cheap component named in a code description is very often not the faulty one. What remote code visibility genuinely does is change when you find out and what you can do about it — deciding this morning whether the vehicle rolls, and booking the bay and the part before it arrives instead of after.

It depends on the vehicle and the device, and it is worth being blunt about that. A device on the diagnostic port of a light commercial typically gives you generic P codes. A hardwired unit on a heavy vehicle's J1939 bus gives SPN and FMI with lamp status. Manufacturer-specific codes, the ones with a 1 in the second position, need the OEM's own definitions, which some manufacturers publish and others license. The platform tells you which category each vehicle's data falls into rather than presenting all three as though they were equivalent.

See these metrics on your own fleet

Fleet Maintenance Software reports every one of these numbers from live operational data.