Table of Contents
- Introduction
- DTC encoding
- Examples of DTCs
- Read DTC sequence
- Request number of DTCs
- Request confirmed DTCs
- Read DTCs example
- Conclusions
Introduction
Service/Mode $03 of the OBD-II (On-Board Diagnostics) standard is used to read emission-related Diagnostic Trouble Codes (DTCs) from the vehicle’s Engine Control Unit (ECU). These DTCs indicate problems related to the engine, transmission, and emissions systems that can affect the vehicle’s compliance with emission regulations.
On-board of an ECU (Electronic Control Unit), there are different types of DTC, as explained in the table below.
Type of DTC | Description | OBD Service to read | OBD Service to clear |
Pending |
| Service/Mode $07 | Service/Mode $04 |
Confirmed |
| Service/Mode $03 | Service/Mode $04 |
Permanent |
| 1)Service/Mode $0A | 2)Can NOT be cleared by scantool |
1) applicable only for Diagnostics over CAN (ISO 15765-4) 2) permanent DTC can only self-heal, they will disapear after a number of driving cycle if the fault has been fixed |
Table 1. Types of DTCs used in OBD-II.
The purpose of Service $03 is to enable the external test equipment to read “confirmed” emission-related DTCs.
DTC encoding
The recommended Diagnostic Trouble Codes (DTCs) follow a specific structure. Each code is a three-digit hexadecimal number preceded by an alphanumeric prefix that identifies the category of the fault. Here’s how the structure works:
- alphanumeric designators (prefixes): the alphanumeric prefix consists of a letter and a digit, which classify the type of system or component affected:
- B0, B1, B2, B3: codes for the Body system (e.g., airbags, climate control, lighting).
- C0, C1, C2, C3: codes for the Chassis system (e.g., ABS, traction control).
- P0, P1, P2, P3: codes for the Powertrain system (e.g., engine, transmission, emissions).
- U0, U1, U2, U3: codes for Network and Vehicle Integration (e.g., communication between control modules).
- code structure: the structure of the code is partially open-ended, meaning:
- certain numeric sequences are reserved for standardized codes. These are uniform and assigned by regulatory bodies or future updates to ensure consistency across manufacturers.
- for example: portions of the B0, C0, P0, P2, P3, U0, and U3 categories are reserved for these standardized codes.
- other portions of the code space may be used by manufacturers for proprietary or specialized codes unique to their vehicles.
The following table specifies systems, code categories, hexadecimal values and particular sections of electrical/electronic systems diagnostic.
System | Code Categories | Hex Value | Appendix |
Body | B0xxx – B3xxx | 8xxx – Bxxx | B0 |
Chassis | C0xxx – C3xxx | 4xxx – 7xxx | C0 |
Powertrain | P0xxx – P3xxx | 0xxx – 3xxx | P0 |
Network & Vehicle Integration | U0xxx – U3xxx | Cxxx – Fxxx | U0 |
Table 2. OBD-II DTCs categories.
Most diagnostic trouble codes (DTCs) for circuits, components, or systems that do not use a detailed sub-fault strategy fall into four basic categories:
- General Circuit/Open: indicates an open circuit or general issue with connectivity.
- Range/Performance: indicates a signal that is outside the expected range or indicates poor performance.
- Circuit Low: indicates a signal that is lower than expected when the external circuit, component, or system is connected; the specific signal type (e.g., voltage, frequency) should be included in the message after “Circuit Low.”
- Circuit High: indicates a signal that is higher than expected when the external circuit, component, or system is connected; the specific signal type (e.g., voltage, frequency) may be included in the message after “Circuit High.”
Let’s take for example the code P0143 – O2 Sensor Circuit Low Voltage Bank 1 Sensor 3 and break it down.
Diagnostic Trouble Codes (DTCs) can be defined either 2 bytes long (e.g., SAE J1979) or 3 bytes long (e.g., ISO 14229-1). The decoding process depends on the length and format of the DTC:
- 2-byte DTCs:
- These are always decoded using a single, standardized list contained in SAE J2012DA.
- 3-byte DTCs:
- the two most significant bytes are decoded based on the DTC Format Identifier (e.g., 0x00 or 0x04), as specified by the diagnostic protocol in use.
- the least significant byte is decoded using the SAE J2012DA Failure Type Byte (FTB) Table, which identifies the specific type of fault.
This structure ensures compatibility with different diagnostic protocols and provides detailed fault information by combining the main DTC code with the failure type.
The DTC P0143 is what the user/service technician is seeing on the diagnostic scantool. On the communication bus (K-line, CAN, etc.) the same DTC is sent as a hexadecimal value as described in the table below.
Scantool display | P | 0 | 1 | 4 | 3 | |||||||||||
Binary conversion | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
Hexadecimal conversion | 0x0 | 0x1 | 0x4 | 0x03 | ||||||||||||
Byte type | DTC high byte | DTC low byte | ||||||||||||||
Byte value | 0x01 | 0x43 | ||||||||||||||
Bus value | 0x0143 |
Table 3. Decomposition of DTC P0143.
This means that on the communication bus the DTC P0143 is going to be transmitted as 2-bytes in hexadecimal format: 0x0143.
Let’s take another example, DTC code B3A1C – A/C System Temperature – Too High.
Scantool display | B | 3 | A | 1 | C | |||||||||||
Binary conversion | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 |
Hexadecimal conversion | 0xB | 0xA | 0x1 | 0xC | ||||||||||||
Byte type | DTC high byte | DTC low byte | ||||||||||||||
Byte value | 0xBA | 0x1C | ||||||||||||||
Bus value | 0xBA1C |
Table 4. Decomposition of DTC B3A1C.
ISO/SAE-controlled diagnostic trouble codes (DTCs) are standardized codes applicable to all vehicles for which ISO/SAE OBD standards are mandatory. These codes have the following characteristics:
- Standardization: these codes are consistent across manufacturers to ensure compatibility and uniform understanding of common faults.
- Reserved numbers: Unused codes within each category are reserved by ISO/SAE for future updates and should not be used without approval.
- Uniform faults: While service procedures may vary between manufacturers, the faults represented by these codes are sufficiently consistent to warrant a standardized DTC.
- Usage restrictions: Manufacturers are prohibited from using ISO/SAE-controlled codes until they are formally approved by ISO/SAE.
The Powertrain DTCs have the following areas of vehicle systems:
P | 0 | Overall system |
1 | Secondary air system/Mixture preparation | |
2 | Fuel system | |
3 | Ignition system/Misfires | |
4 | Additional exhaust gas monitoring | |
5 | Cruise control/Idle speed control | |
6 | Input/Output signals, Control units | |
7 | Gearbox/Transmission | |
8 | Transmission | |
9 | Transmission | |
A | Hybrid Propulsion | |
B | Reserved |
Table 5. The areas of vehicle systems for Powertrain DTCs.
Manufacturer-controlled DTCs address faults that are unique to a particular manufacturer due to differences in system design, implementation, or diagnostic strategies. These codes have the following characteristics:
- Manufacturer-specific use: these codes are not widely shared among manufacturers because they reflect unique system or strategy variations.
- Consistency encouraged: Manufacturers or suppliers responsible for designing diagnostic algorithms, software, and DTCs are strongly encouraged to maintain consistency in code assignments across their entire product line.
- Customization allowed: Manufacturers have the flexibility to define DTCs to align with their specific controller algorithms.
- Standardized descriptions: All DTC descriptions must comply with SAE J1930 or ISO 15031-2 standards, ensuring clear and consistent communication of fault information.
Examples of DTCs
Powertrain | P0004 | Fuel Volume Regulator “A” Control Circuit High |
P01E8 | Engine Coolant Heater “A” Control Circuit/Open | |
P219C | Cylinder 1 Air-Fuel Ratio Imbalance | |
Chassis | C0005 | Front/Left Front Park Brake Actuator |
C061C | Variable Effort Steering Actuator Control Circuit/Open | |
C06A5 | Brake Master Cylinder Piston Position Sensor “A” Circuit Intermittent/Erratic | |
Body | B0104 | Sensor Cleaning Air Blower Actuator “A” Relay Control |
B0171 | A/C System Performance | |
B023E | Side Mirror Spotlight Lamp | |
Network & Vehicle Integration | U0009 | High Speed CAN Communication Bus (-) shorted to Bus (+) |
U013C | Lost Communication With Accelerator Pedal Module | |
U0301 | Software Incompatibility With ECM/PCM |
Table 6. Example of ISO/SAE controlled DTCs.
Read DTC sequence
The purpose of Service/Mode $03 is to allow external test equipment to retrieve confirmed emission-related DTCs through a two-step process:
Step 1. Query the Number of Stored DTCs
- Send a Service $01, PID $01 request to all ECUs capable of reporting emission-related DTCs.
- Each ECU responds with a message indicating the number of stored DTCs:
- If DTCs are stored, the response includes the count.
- If no DTCs are stored, the response indicates zero (0) stored DTCs.
Step 2. Retrieve the DTCs
- Send a Service $03 request to each ECU to retrieve all stored emission-related DTCs.
- ECUs with stored DTCs respond with one or more messages, each containing up to three DTCs per message.
- If no DTCs are stored, the ECU may choose not to respond.
The image below depicts the sequence of request-response messages between the scantool and ECU to retrieve the confirmed DTCs.
Handling Additional DTCs
If additional DTCs are logged between the initial count (Step 1) and the retrieval (Step 2), the number of reported DTCs may exceed the expected count. In such cases, the external test equipment must repeat the cycle (Steps 1 and 2) until the number of retrieved DTCs matches the count reported in the Service $01, PID $01 response. This iterative process ensures the accurate retrieval of all confirmed emission-related DTCs.
Request number of DTCs
The table below defines the structure of the message sent by the scantool to request the current powertrain diagnostic data (specifically, the number of emission-related DTCs and the status of the Malfunction Indicator Lamp, or MIL).
Data Byte | Parameter Name | Cvt | Byte Value (Hex) | Mnemonic |
---|---|---|---|---|
#1 | Request current powertrain diagnostic data request SID | M | 01 | SIDRQ |
#2 | PID {Number of emission-related DTCs and MIL status} | M | 01 | PID |
Table 7. Request current powertrain diagnostic data request message (PID $01).
Table Header Overview
- Data Byte: represents the position of the byte in the message.
- Parameter Name: describes the type of information requested or transmitted.
- Cvt (Conversion Type): specifies if the parameter is Mandatory (M), User Optional (U), or Conditional (C).
- Hex Value: hexadecimal values used in the message.
- Mnemonic: shortened versions (labels) of the parameters.
Data Byte Details
- Data Byte #1: Service Identifier (SID) for the request.
- Byte Value:
01
(indicating Service $01 – Request Current Data).
- Byte Value:
- Data Byte #2: Parameter Identifier (PID) that specifies what data is being requested.
- Byte Value:
01
(indicating PID $01 – Number of emission-related DTCs and MIL status).
- Byte Value:
The table below defines the structure of the response sent by the ECU to the scantool. The response contains the requested information, including the number of stored emission-related DTCs and the MIL status.
Data Byte | Parameter Name | Cvt | Byte Value (Hex) | Mnemonic |
---|---|---|---|---|
#1 | Request current powertrain diagnostic data response SID | M | 41 | SIDPR |
#2 | PID {Number of emission-related DTCs and MIL status} | M | 01 | PID |
#3 | Data A | M | xx | DATA_A |
#4 | Data B | M | xx | DATA_B |
#5 | Data C | M | xx | DATA_C |
#6 | Data D | M | xx | DATA_D |
Table 8. Request current powertrain diagnostic data response message (PID $01).
Data Byte Details
- Data Byte #1: Response Service Identifier (SID) for the response
- Byte Value:
41
(indicating a response to Service $01).
- Byte Value:
- Data Byte #2: PID, matching the PID sent in the request.
- Byte Value:
01
(indicating a response to PID $01).
- Byte Value:
- Data Bytes #3–#6: Data Record:
- Data A: Encodes the MIL status and the number of stored emission-related DTCs.
- Data B–D: Provide additional status information about readiness tests and other diagnostic data.
To understand how the number of stored DTCs are embedded into the PID $01, let’s break down its structure. The table below explains the decomposition of every byte of the PID $01.
Bytes | Bit # | Min value | Max value | Bit Description |
Byte 1 (A) | 0 | 0 | 127 | Number of DTCs stored in this ECU |
1 | ||||
2 | ||||
3 | ||||
4 | ||||
5 | ||||
6 | ||||
7 | 0 = MIL OFF | 1 = MIL ON | Malfunction Indicator Lamp (MIL) status | |
Byte 2 (B) | 0 | 0 = NO | 1 = YES | Misfire monitoring supported |
1 | 0 = NO | 1 = YES | Fuel system monitoring supported | |
2 | 0 = NO | 1 = YES | Comprehensive component monitoring supported | |
3 | 0 = SI | 1 = CI | Compression ignition monitoring supported | |
4 | 0 = YES | 1 = NO | Misfire monitoring ready | |
5 | 0 = YES | 1 = NO | Fuel system monitoring ready | |
6 | 0 = YES | 1 = NO | Comprehensive component monitoring ready | |
7 | 0 | 0 | ISO/SAE reserved | |
Byte 3 (C) | 0 | 0 = NO | 1 = YES | Catalyst monitoring supported |
NMHC catalyst monitoring supported | ||||
1 | Heated catalyst monitoring supported | |||
NOx after-treatment monitoring supported | ||||
2 | Evaporative system monitoring supported | |||
ISO/SAE reserved | ||||
3 | Secondary air system monitoring supported | |||
Boost pressure system monitoring supported | ||||
4 | ISO/SAE reserved | |||
ISO/SAE reserved | ||||
5 | Oxygen sensor monitoring supported | |||
Exhaust gas sensor monitoring supported | ||||
6 | Oxygen sensor heater monitoring supported | |||
PM filter monitoring supported | ||||
7 | EGR and/or VVT system monitoring supported | |||
EGR and/or VVT system monitoring supported | ||||
Byte 4 (D) | 0 | Catalyst monitoring ready | ||
NMHC catalyst monitoring ready | ||||
1 | Heated catalyst monitoring ready | |||
NOx aftertreatment monitoring ready | ||||
2 | Evaporative system monitoring ready | |||
ISO/SAE reserved | ||||
3 | Secondary air system monitoring ready | |||
Boost pressure system monitoring ready | ||||
4 | ISO/SAE reserved | |||
ISO/SAE reserved | ||||
5 | Oxygen sensor monitoring ready | |||
Exhaust gas sensor monitoring ready | ||||
6 | Oxygen sensor heater monitoring ready | |||
PM filter monitoring ready | ||||
7 | EGR and/or VVT system monitoring ready | |||
EGR and/or VVT system monitoring ready |
Table 9. PID $01 structure (encoding).
As you can see, the first 6 bits of byte A will give the total number of stored DTCs.
Request Example (from the scantool to ECU): 01 01
01
– Request current powertrain diagnostic data request SID.01
– PID: Number of emission-related DTCs and MIL status.
Response Example (from the ECM to scantool): 41 01 83 33 FF 63
41
– Request current powertrain diagnostic data response SID.01
– PID: Number of emission-related DTCs and MIL status.83
- Number of emission-related DTCs: 3
- MIL: ON
33
- Misfire monitoring supported (YES)
- Fuel system monitoring supported (YES)
- Compression ignition monitoring supported (SI)
- Misfire monitoring ready (NO)
- Fuel system monitoring ready (NO)
FF
– all supported.63
- Catalyst monitoring ready (YES)
- Heated catalyst monitoring ready (YES)
- Oxygen sensor monitoring ready (YES)
- Oxygen sensor heater monitoring ready (YES)
From the response message we can see that there are 3 stored and confirmed DTCs, which we are going to read next with Service $03.
Request confirmed DTCs
Table 10 below specifies the structure of the message sent by the tester (scantool) to request Diagnostic Trouble Codes (DTCs) related to emissions from the ECU.
Data Byte | Parameter Name | Cvt | Byte Value (Hex) | Mnemonic |
---|---|---|---|---|
#1 | Request emission-related DTC request SID | M | 03 | SIDRQ |
Table 10. Request emission-related DTC request message.
Data Byte Details
- Data Byte #1: Contains the Service Identifier (SID), which is
03
(hex) for this request.
Table 11 below describes the structure of the response message sent by the ECU to the tester (scantool).
Data Byte | Parameter Name | Cvt | Byte Value (Hex) | Mnemonic |
---|---|---|---|---|
#1 | Request emission-related DTC response SID | M | 43 | SIDPR |
#2 | DTC#1 (High Byte) | M/Ca | xx | DTC1HI |
#3 | DTC#1 (Low Byte) | M/C | xx | DTC1LO |
#4 | DTC#2 (High Byte) | M/C | xx | DTC2HI |
#5 | DTC#2 (Low Byte) | M/C | xx | DTC2LO |
#6 | DTC#3 (High Byte) | M/C | xx | DTC3HI |
#7 | DTC#3 (Low Byte) | M/C | xx | DTC3LO |
a: C = Conditional — DTC#1, DTC#2, and DTC#3 are always present. If no valid DTC number is included the DTC values shall contain $00. |
Table 11. Request emission-related DTC response message.
Data Byte Details
- Data Byte #1: Contains the Service Identifier for the response, which is
43
(hex). - Data Byte #2 to #7: Contain the emission-related DTCs. Each DTC is represented by two bytes: High Byte and Low Byte
Request Example (from the scantool to ECU): 03
03
– Request emission-related DTC request SID.
Response Example (from the ECM to scantool): 43 01 43 01 96 02 34
43
– Request emission-related DTC response SID.01
– DTC#1 High Byte of P0143 – O2 Sensor Circuit Low Voltage Bank 1 Sensor 3.43
– DTC#1 Low Byte of P0143 – O2 Sensor Circuit Low Voltage Bank 1 Sensor 3.01
– DTC#2 High Byte of P0196 – Engine Oil Temperature Sensor “A” Range/Performance.96
– DTC#2 Low Byte of P0196 – Engine Oil Temperature Sensor “A” Range/Performance.02
– DTC#3 High Byte of P0234 – Turbocharger/Supercharger “A” Overboost Condition.34
– DTC#3 Low Byte of P0234 – Turbocharger/Supercharger “A” Overboost Condition.
Read DTCs example
The image below displays the Readiness Status section from the OBD-II scan tool for Service $01 PID $01, which reports the number of active emission-related Diagnostic Trouble Codes (DTCs), the Malfunction Indicator Lamp (MIL) status, and the readiness status of various onboard monitors.
The system reports 2 stored emission-related DTCs, but the MIL is off, suggesting the issues may not be currently active or critical. The Fuel System, Comprehensive Component, and EGR System tests are supported and have been successfully completed. Most non-continuous monitors (e.g., Catalyst, Oxygen Sensor) are not supported in this ECU configuration.
The image below, from an OBD-II scantool, displays the results for Service $03, which reports stored Diagnostic Trouble Codes (DTCs).
With Service $03 two codes are retrieved, P1462 and P1461, which indicate issues with the air conditioning (A/C) pressure sensor circuit, specifically high and low voltage conditions. These are stored in the ECU and may represent past or persistent faults.
Conclusions
Service $03 in the OBD-II diagnostic protocol is responsible for retrieving Diagnostic Trouble Codes (DTCs) from the vehicle’s memory, providing critical information about malfunctions or irregularities detected by the Engine Control Unit (ECU). These codes represent specific issues, such as faults in the emission system, sensors, or actuators, enabling technicians and vehicle owners to identify and address potential problems. Service $03 is essential for maintaining vehicle performance and ensuring compliance with emission standards. By offering a detailed record of stored issues, it supports timely maintenance and repairs, contributing to improved engine efficiency, reduced environmental impact, and enhanced vehicle reliability.