Understanding OBD-II Fault Codes
OBD-II fault codes are five characters long, and each part means something:
Breaking down a code
- First letter — the system: P = powertrain (engine/gearbox), B = body, C = chassis, U = network/communication.
- First digit — 0 = generic (SAE-standard) code, 1 = manufacturer-specific code.
- Next digits — the subsystem and specific fault. P0300–P0308 are misfires, P01xx fuel and air metering, P07xx transmission.
So P0171 = powertrain, generic, fuel system, bank 1 too lean. U0100 = lost communication with the ECM — a network fault, not an engine fault.
What a code does NOT tell you
This is the part that costs people money. A code identifies the circuit or condition that failed its self-test, not the part to replace. P0171 (lean bank 1) might be a vacuum leak, a lazy MAF, weak fuel pressure or a faulty O2 sensor. Replacing the O2 sensor because "the code said so" fixes it only one time in four.
Pending, stored and permanent codes
- Pending: seen once, not yet confirmed — useful early warnings.
- Stored/confirmed: seen repeatedly, MIL illuminated.
- Permanent: cannot be cleared by a scan tool; they clear themselves only after the system passes its self-test.
Freeze-frame: the free bonus data
Every stored code captures the conditions when it set — RPM, load, coolant temperature, fuel trims. This snapshot often makes the diagnosis obvious before any part is touched.
The right way to use codes
Treat codes as the start of diagnosis, not the end: read them, review freeze-frame, analyse live data, test the circuit, confirm the root cause. That's exactly the process we follow at AutoLogic Diagnostics — supported by MechanIQ, which evaluates the full evidence trail before recommending a repair.
Have a fault code you'd like explained? Send it to us on WhatsApp — or book a full diagnostic session in Witbank.
At AutoLogic Diagnostics, this kind of fault finding is supported by MechanIQ Diagnostic Intelligence — our evidence-driven diagnostic platform.