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
| Position | What it encodes | Example |
|---|---|---|
| First character: P | Powertrain. Engine, transmission, fuel, ignition and emissions. The bulk of what a fleet sees. | P0300 |
| First character: B | Body. Cab systems, restraints, climate, lighting and interior electrics. | B1234 |
| First character: C | Chassis. Braking, steering, suspension and stability control systems. | C0035 |
| First character: U | Network and communication. A module has stopped talking on the bus, or is talking nonsense. | U0100 |
| Second digit: 0 | Generic. Defined by the SAE standard and identical in meaning across every manufacturer. | P0171 |
| Second digit: 1 | Manufacturer-specific. The meaning comes from the OEM's own list, not from any published standard. | P1234 |
| Third digit: 1 or 2 | Fuel and air metering. Digit 2 narrows it to the injector circuit specifically. | P0171, P0201 |
| Third digit: 3 | Ignition system or misfire detection. | P0300 |
| Third digit: 4 | Auxiliary emission controls: EGR, catalyst, evaporative and aftertreatment. | P0401, P0420 |
| Third digit: 5 | Vehicle speed control, idle control and auxiliary inputs. | P0562 |
| Third digit: 6 | Computer output circuits and module-to-module links. | P0606 |
| Third digit: 7 or 8 | Transmission. Two groups because one ran out of room. | P0700 |
Powertrain codes you will actually see
| Code | What it means | Where it usually leads |
|---|---|---|
| P0016 | Crankshaft 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. |
| P0087 | Fuel 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. |
| P0101 | Mass 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. |
| P0171 | System too lean on bank one. More air than the fuelling expects. | Vacuum or intake leak, weak fuel delivery, or a drifting oxygen sensor. |
| P0234 | Turbocharger overboost. Boost exceeded the commanded target. | Stuck wastegate or variable geometry mechanism. Usually pairs with a power derate. |
| P0299 | Turbocharger underboost. Boost fell short of target. | Boost leak, sticking vanes, or a restricted intake. The common cause of a truck that has gone flat. |
| P0300 | Random or multiple cylinder misfire. Codes P0301 upward name the specific cylinder instead. | Fuel, compression or ignition. A single-cylinder code narrows the job enormously. |
| P0401 | Insufficient EGR flow. Measured flow did not match what was commanded. | Soot-blocked passages, a stuck valve, or the sensor that measures the flow. |
| P0420 | Catalyst 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. |
| P0562 | System voltage low. | Alternator, belt, batteries or a corroded earth. Chase this before the codes it causes. |
| P2002 | Diesel 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. |
| U0100 | Lost 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
| FMI | Failure mode | Read it as |
|---|---|---|
| 0 | Data valid but above normal operational range, most severe level. | The reading is real and it is dangerously high. Stop the vehicle. |
| 1 | Data valid but below normal operational range, most severe level. | Real and dangerously low. Oil pressure landing here ends the shift. |
| 2 | Data erratic, intermittent or incorrect. | The signal is jumping around. Usually a connector, rarely the component. |
| 3 | Voltage above normal, or shorted to high source. | An electrical fault on the circuit, not a fault in the thing being measured. |
| 4 | Voltage below normal, or shorted to low source. | The circuit is grounding somewhere it should not. |
| 5 | Current below normal, or open circuit. | A broken wire or an unplugged connector. Check the obvious before the expensive. |
| 6 | Current above normal, or grounded circuit. | Something is drawing more than it should. A chafed loom is the classic. |
| 7 | Mechanical system not responding, or out of adjustment. | The command went out and nothing moved. An actuator or linkage problem. |
| 9 | Abnormal update rate. | The message is arriving too slowly. A bus loading or module health issue. |
| 13 | Out of calibration. | The component works but its reference is wrong. Often follows a part swap without a reset. |
| 19 | Received network data in error. | A module is repeating what another module told it, and that source is the real fault. |
| 31 | Condition exists. | The vaguest one in the standard. The manufacturer's own documentation is the only route in. |
Suspect parameter numbers worth knowing
| SPN | Parameter | Why it matters |
|---|---|---|
| 84 | Wheel-based vehicle speed. | Drives the tachograph, the speed limiter and most distance reporting. A fault here corrupts the trip record. |
| 91 | Accelerator pedal position. | Separates a driver asking for power from an engine failing to deliver it. |
| 100 | Engine oil pressure. | Paired with FMI 1 this is the code that ends the shift where the vehicle is standing. |
| 102 | Boost pressure. | The measurement behind most derates and the first place to look when a truck feels flat. |
| 110 | Engine coolant temperature. | A slow climb over weeks is a cooling system telling you before it strands anybody. |
| 190 | Engine speed. | Underpins idle detection, gear analysis and engine hours. Nothing derived from it survives a fault. |
| 639 | J1939 network number one. | The bus itself has a problem. Treat unrelated codes arriving alongside this one with suspicion. |
| 1761 | Diesel exhaust fluid tank level. | Runs to zero and the vehicle derates by design. A refill problem, not a mechanical one. |
Repair coding dimensions
| Dimension | What it records |
|---|---|
| System, assembly, component | The 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 repair | Why 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 accomplished | What 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 priority | How 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 split | Hours 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 timing | Whether 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.