OBD-II PIDs
P-codes, or OBD-II PIDs On Board Diagnostics "Parameter IDs", are codes used to request data from a vehicle, used as a diagnostic tool. These codes are part of SAE standard J/1979, required to be implemented in all cars sold in North America since 1996.
Typically, an automotive technician will use PIDs with a scan tool connected to the vehicle's OBD-II connector.
- The technician enters the PID
- The scan tool sends it to the vehicle's bus (CAN, VPW, PWM, ISO, KWP. After 2008, CAN only)
- A device on the bus recognizes the PID as one it is responsible for, and reports the value for that PID to the bus
- The scan tool reads the response, and shows it to the technician
Modes
There are ten modes of operation described in the latest OBD-II standard SAE J1979. They are, the $ prefix indicating a hexadecimal number:
$01. Show current data
$02. Show freeze frame data
$03. Show stored Diagnostic Trouble Codes
$04. Clear Diagnostic Trouble Codes and stored values
$05. Test results, oxygen sensor monitoring (non CAN only)
$06. Test results, other component/system monitoring (Test results, oxygen sensor monitoring for CAN only)
$07. Show pending Diagnostic Trouble Codes (detected during current or last driving cycle)
$08. Control operation of on-board component/system
$09. Request vehicle information
$0A. Permanent DTC's (Cleared DTC's)
Vehicle manufactures are not required to support all modes.
Each manufacturer may define additional modes above #9 (e.g.: mode 22 as defined by SAE J2190 for Ford/GM, mode 21 for Toyota) for other information (e.g.: the voltage of the Traction Battery[1] in a HEV).
Standard PIDs
The table below shows the standard OBD-II PIDs as defined by SAE J1979. The expected response for each PID is given, along with information on how to translate the response into meaningful data. Again, not all vehicles will support all PIDs and there can be manufacturer-defined custom PIDs that are not defined in the OBD-II standard.
Note that modes 1 and 2 are basically identical, except that Mode 1 provides current information, whereas Mode 2 provides a snapshot of the same data taken at the point when the last diagnostic trouble code was set. The exceptions are PID 01, which is only available in Mode 1, and PID 02, which is only available in Mode 2. If Mode 2 PID 02 returns zero, then there is no snapshot and all other Mode 2 data is meaningless.
Mode (hex) |
PID (hex) |
Data bytes returned | Description | Min value | Max value | Units | Formula |
---|---|---|---|---|---|---|---|
01 | 00 | 4 | PIDs supported [01 - 20] | Bit encoded [A7..D0] == [PID 0x01..PID 0x20] | |||
01 | 01 | 4 | Monitor status since DTCs cleared. (Includes malfunction indicator lamp (MIL) status and number of DTCs.) | Bit encoded. See below. | |||
01 | 02 | 2 | Freeze DTC | ||||
01 | 03 | 2 | Fuel system status | Bit encoded. See below. | |||
01 | 04 | 1 | Calculated engine load value | 0 | 100 | % | A*100/255 |
01 | 05 | 1 | Engine coolant temperature | -40 | 215 | °C | A-40 |
01 | 06 | 1 | Short term fuel % trim—Bank 1 | -100 (Rich) | 99.22 (Lean) | % | (A-128) * 100/128 |
01 | 07 | 1 | Long term fuel % trim—Bank 1 | -100 (Rich) | 99.22 (Lean) | % | (A-128) * 100/128 |
01 | 08 | 1 | Short term fuel % trim—Bank 2 | -100 (Rich) | 99.22 (Lean) | % | (A-128) * 100/128 |
01 | 09 | 1 | Long term fuel % trim—Bank 2 | -100 (Rich) | 99.22 (Lean) | % | (A-128) * 100/128 |
01 | 0A | 1 | Fuel pressure | 0 | 765 | kPa (gauge) | A*3 |
01 | 0B | 1 | Intake manifold absolute pressure | 0 | 255 | kPa (absolute) | A |
01 | 0C | 2 | Engine RPM | 0 | 16,383.75 | rpm | ((A*256)+B)/4 |
01 | 0D | 1 | Vehicle speed | 0 | 255 | km/h | A |
01 | 0E | 1 | Timing advance | -64 | 63.5 | ° relative to #1 cylinder | A/2 - 64 |
01 | 0F | 1 | Intake air temperature | -40 | 215 | °C | A-40 |
01 | 10 | 2 | MAF air flow rate | 0 | 655.35 | g/s | ((A*256)+B) / 100 |
01 | 11 | 1 | Throttle position | 0 | 100 | % | A*100/255 |
01 | 12 | 1 | Commanded secondary air status | Bit encoded. See below. | |||
01 | 13 | 1 | Oxygen sensors present | [A0..A3] == Bank 1, Sensors 1-4. [A4..A7] == Bank 2... | |||
01 | 14 | 2 | Bank 1, Sensor 1: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 15 | 2 | Bank 1, Sensor 2: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 16 | 2 | Bank 1, Sensor 3: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 17 | 2 | Bank 1, Sensor 4: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 18 | 2 | Bank 2, Sensor 1: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 19 | 2 | Bank 2, Sensor 2: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 1A | 2 | Bank 2, Sensor 3: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 1B | 2 | Bank 2, Sensor 4: Oxygen sensor voltage, Short term fuel trim |
0 -100(lean) |
1.275 99.2(rich) |
Volts % |
A * 0.005 (B-128) * 100/128 (if B==0xFF, sensor is not used in trim calc) |
01 | 1C | 1 | OBD standards this vehicle conforms to | Bit encoded. See below. | |||
01 | 1D | 1 | Oxygen sensors present | Similar to PID 13, but [A0..A7] == [B1S1, B1S2, B2S1, B2S2, B3S1, B3S2, B4S1, B4S2] | |||
01 | 1E | 1 | Auxiliary input status | A0 == Power Take Off (PTO) status (1 == active) [A1..A7] not used | |||
01 | 1F | 2 | Run time since engine start | 0 | 65,535 | seconds | (A*256)+B |
01 | 20 | 4 | PIDs supported 21-40 | Bit encoded [A7..D0] == [PID 0x21..PID 0x40] | |||
01 | 21 | 2 | Distance traveled with malfunction indicator lamp (MIL) on | 0 | 65,535 | km | (A*256)+B |
01 | 22 | 2 | Fuel Rail Pressure (relative to manifold vacuum) | 0 | 5177.265 | kPa | (((A*256)+B) * 10) / 128 |
01 | 23 | 2 | Fuel Rail Pressure (diesel) | 0 | 655350 | kPa (gauge) | ((A*256)+B) * 10 |
01 | 24 | 4 | O2S1_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 25 | 4 | O2S2_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 26 | 4 | O2S3_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 27 | 4 | O2S4_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 28 | 4 | O2S5_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 29 | 4 | O2S6_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 2A | 4 | O2S7_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 2B | 4 | O2S8_WR_lambda(1): Equivalence Ratio Voltage |
0 0 |
2 8 |
N/A V |
((A*256)+B)/32768 ((C*256)+D)/8192 |
01 | 2C | 1 | Commanded EGR | 0 | 100 | % | 100*A/255 |
01 | 2D | 1 | EGR Error | -100 | 99.22 | % | (A-128) * 100/128 |
01 | 2E | 1 | Commanded evaporative purge | 0 | 100 | % | 100*A/255 |
01 | 2F | 1 | Fuel Level Input | 0 | 100 | % | 100*A/255 |
01 | 30 | 1 | # of warm-ups since codes cleared | 0 | 255 | N/A | A |
01 | 31 | 2 | Distance traveled since codes cleared | 0 | 65,535 | km | (A*256)+B |
01 | 32 | 2 | Evap. System Vapor Pressure | -8,192 | 8,192 | Pa | ((A*256)+B)/4 (A is signed) |
01 | 33 | 1 | Barometric pressure | 0 | 255 | kPa (Absolute) | A |
01 | 34 | 4 | O2S1_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/32768 ((C*256)+D)/256 - 128 |
01 | 35 | 4 | O2S2_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/32768 ((C*256)+D)/256 - 128 |
01 | 36 | 4 | O2S3_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/327685 ((C*256)+D)/256 - 128 |
01 | 37 | 4 | O2S4_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/32768 ((C*256)+D)/256 - 128 |
01 | 38 | 4 | O2S5_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/32768 ((C*256)+D)/256 - 128 |
01 | 39 | 4 | O2S6_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/32768 ((C*256)+D)/256 - 128 |
01 | 3A | 4 | O2S7_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/32768 ((C*256)+D)/256 - 128 |
01 | 3B | 4 | O2S8_WR_lambda(1): Equivalence Ratio Current |
0 -128 |
2 128 |
N/A mA |
((A*256)+B)/32768 ((C*256)+D)/256 - 128 |
01 | 3C | 2 | Catalyst Temperature Bank 1, Sensor 1 |
-40 | 6,513.5 | °C | ((A*256)+B)/10 - 40 |
01 | 3D | 2 | Catalyst Temperature Bank 2, Sensor 1 |
-40 | 6,513.5 | °C | ((A*256)+B)/10 - 40 |
01 | 3E | 2 | Catalyst Temperature Bank 1, Sensor 2 |
-40 | 6,513.5 | °C | ((A*256)+B)/10 - 40 |
01 | 3F | 2 | Catalyst Temperature Bank 2, Sensor 2 |
-40 | 6,513.5 | °C | ((A*256)+B)/10 - 40 |
01 | 40 | 4 | PIDs supported 41-60 | Bit encoded [A7..D0] == [PID 0x41..PID 0x60] | |||
01 | 41 | 4 | Monitor status this drive cycle | Bit encoded. See below. | |||
01 | 42 | 2 | Control module voltage | 0 | 65.535 | V | ((A*256)+B)/1000 |
01 | 43 | 2 | Absolute load value | 0 | 25,700 | % | ((A*256)+B)*100/255 |
01 | 44 | 2 | Command equivalence ratio | 0 | 2 | N/A | ((A*256)+B)/32768 |
01 | 45 | 1 | Relative throttle position | 0 | 100 | % | A*100/255 |
01 | 46 | 1 | Ambient air temperature | -40 | 215 | °C | A-40 |
01 | 47 | 1 | Absolute throttle position B | 0 | 100 | % | A*100/255 |
01 | 48 | 1 | Absolute throttle position C | 0 | 100 | % | A*100/255 |
01 | 49 | 1 | Accelerator pedal position D | 0 | 100 | % | A*100/255 |
01 | 4A | 1 | Accelerator pedal position E | 0 | 100 | % | A*100/255 |
01 | 4B | 1 | Accelerator pedal position F | 0 | 100 | % | A*100/255 |
01 | 4C | 1 | Commanded throttle actuator | 0 | 100 | % | A*100/255 |
01 | 4D | 2 | Time run with MIL on | 0 | 65,535 | minutes | (A*256)+B |
01 | 4E | 2 | Time since trouble codes cleared | 0 | 65,535 | minutes | (A*256)+B |
01 | 51 | 1 | Fuel Type | From fuel type table see below | |||
01 | 52 | 1 | Ethanol fuel % | 0 | 100 | % | A*100/255 |
01 | 53 | 2 | Absoulute Evap system Vapour Pressure | 0 | 327675 | kpa | 1/200 per bit |
01 | C3 | ? | ? | ? | ? | ? | Returns numerous data, including Drive Condition ID and Engine Speed* |
01 | C4 | ? | ? | ? | ? | ? | B5 is Engine Idle Request B6 is Engine Stop Request* |
02 | 02 | 2 | Freeze frame trouble code | BCD encoded, See below. | |||
03 | N/A | n*6 | Request trouble codes | 3 codes per message frame, BCD encoded. See below. | |||
04 | N/A | 0 | Clear trouble codes / Malfunction indicator lamp (MIL) / Check engine light | Clears all stored trouble codes and turns the MIL off. | |||
05 | 0100 | OBD Monitor IDs supported ($01 - $20) | |||||
05 | 0101 | O2 Sensor Monitor Bank 1 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0102 | O2 Sensor Monitor Bank 1 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0103 | O2 Sensor Monitor Bank 1 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0104 | O2 Sensor Monitor Bank 1 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0105 | O2 Sensor Monitor Bank 2 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0106 | O2 Sensor Monitor Bank 2 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0107 | O2 Sensor Monitor Bank 2 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0108 | O2 Sensor Monitor Bank 2 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0109 | O2 Sensor Monitor Bank 3 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 010A | O2 Sensor Monitor Bank 3 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 010B | O2 Sensor Monitor Bank 3 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 010C | O2 Sensor Monitor Bank 3 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 010D | O2 Sensor Monitor Bank 4 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 010E | O2 Sensor Monitor Bank 4 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 010F | O2 Sensor Monitor Bank 4 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0110 | O2 Sensor Monitor Bank 4 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Rich to lean sensor threshold voltage | |
05 | 0201 | O2 Sensor Monitor Bank 1 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0202 | O2 Sensor Monitor Bank 1 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0203 | O2 Sensor Monitor Bank 1 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0204 | O2 Sensor Monitor Bank 1 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0205 | O2 Sensor Monitor Bank 2 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0206 | O2 Sensor Monitor Bank 2 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0207 | O2 Sensor Monitor Bank 2 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0208 | O2 Sensor Monitor Bank 2 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0209 | O2 Sensor Monitor Bank 3 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 020A | O2 Sensor Monitor Bank 3 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 020B | O2 Sensor Monitor Bank 3 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 020C | O2 Sensor Monitor Bank 3 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 020D | O2 Sensor Monitor Bank 4 Sensor 1 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 020E | O2 Sensor Monitor Bank 4 Sensor 2 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 020F | O2 Sensor Monitor Bank 4 Sensor 3 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
05 | 0210 | O2 Sensor Monitor Bank 4 Sensor 4 | 0.00 | 1.275 | Volts | 0.005 Lean to Rich sensor threshold voltage | |
09 | 00 | 4 | mode 9 supported PIDs 01 to 20 | Bit encoded | |||
09 | 02 | 5x5 | Vehicle identification number (VIN) | Returns 5 lines, A is line ordering flag, B-E ASCII coded VIN digits. | |||
09 | 04 | varies | calibration ID | Returns multiple lines, ASCII coded | |||
09 | 06 | 4 | calibration |
In the formula column, letters A, B, C, etc. represent the decimal equivalent of the first, second, third, etc. bytes of data. Where a (?) appears, contradictory or incomplete information was available. Someone with a copy of the 2006 SAE HS-3000 should fact-check these.
Bitwise encoded PIDs
Some of the PIDs in the above table cannot be explained with a simple formula. A more elaborate explanation of these data is provided here:
Mode 1 PID 01: A request for this PID returns 4 bytes of data. The first byte contains two pieces of information. Bit A7 (the eighth bit of byte A, the first byte) indicates whether or not the MIL (check engine light) is illuminated. Bits A0 through A6 represent the number of diagnostic trouble codes currently flagged in the ECU. The second, third, and fourth bytes give information about the availability and completeness of certain on-board tests. Note that test availability signified by set (1) bit; completeness signified by reset (0) bit:
Test available Test incomplete Misfire B0 B4 Fuel System B1 B5 Components B2 B6 Reserved B3 B7 Catalyst C0 D0 Heated Catalyst C1 D1 Evaporative System C2 D2 Secondary Air System C3 D3 A/C Refrigerant C4 D4 Oxygen Sensor C5 D5 Oxygen Sensor Heater C6 D6 EGR System C7 D7
Mode 1 PID 03: A request for this PID returns 2 bytes of data. The first byte describes fuel system #1. Only one bit should ever be set.
A0 Open loop due to insufficient engine temperature A1 Closed loop, using oxygen sensor feedback to determine fuel mix A2 Open loop due to engine load OR fuel cut due to deacceleration A3 Open loop due to system failure A4 Closed loop, using at least one oxygen sensor but there is a fault in the feedback system A5-A7 Always zero
The second byte describes fuel system #2 (if it exists) and is encoded identically to the first byte.
Mode 1 PID 12: A request for this PID returns a single byte of data which describes the secondary air status. Only one bit should ever be set.
A0 Upstream of catalytic converter A1 Downstream of catalytic converter A2 From the outside atmosphere or off A3-A7 Always zero
Mode 1 PID 1C: A request for this PID returns a single byte of data which describes which OBD standards this ECU was designed to comply with. The hexadecimal and binary representations of the data byte are shown below next to what it implies:
0x01 00000001b OBD-II as defined by the CARB 0x02 00000010b OBD as defined by the EPA 0x03 00000011b OBD and OBD-II 0x04 00000100b OBD-I 0x05 00000101b Not meant to comply with any OBD standard 0x06 00000110b EOBD (Europe) 0x07 00000111b EOBD and OBD-II 0x08 00001000b EOBD and OBD 0x09 00001001b EOBD, OBD and OBD II 0x0A 00001010b JOBD (Japan) 0x0B 00001011b JOBD and OBD II 0x0C 00001100b JOBD and EOBD 0x0D 00001101b JOBD, EOBD, and OBD II
Mode 1 PID 41: A request for this PID returns 4 bytes of data. The first byte is always zero. The second, third, and fourth bytes give information about the availability and completeness of certain on-board tests. Note that test availability signified by set (1) bit; completeness signified by reset (0) bit:
Test enabled Test incomplete Misfire B0 B4 Fuel System B1 B5 Components B2 B6 Reserved B3 B7 Catalyst C0 D0 Heated Catalyst C1 D1 Evaporative System C2 D2 Secondary Air System C3 D3 A/C Refrigerant C4 D4 Oxygen Sensor C5 D5 Oxygen Sensor Heater C6 D6 EGR System C7 D7
Mode 3: (no PID required) A request for this mode returns information about the DTCs that have been set. The response will be an integer number of packets each containing 6 data bytes. Each trouble code requires 2 bytes to describe, so the number of packets returned will be the number of codes divided by three, rounded up. A trouble code can be decoded from each pair of data bytes. The first character in the trouble code is determined by the first two bits in the first byte:
A7 A6 First DTC character -- -- ------------------- 0 0 P - Powertrain 0 1 C - Chassis 1 0 B - Body 1 1 U - Network
As of September 2005, only P and U generic DTCs are standardized.
The second character in the DTC is a number defined by
A5 A4 Second DTC character -- -- -------------------- 0 0 0 0 1 1 1 0 2 1 1 3
The third character in the DTC is a number defined by
A3 A2 A1 A0 Third DTC character -- -- -- -- ------------------- 0 0 0 0 0 0 0 0 1 1 0 0 1 0 2 0 0 1 1 3 0 1 0 0 4 0 1 0 1 5 0 1 1 0 6 0 1 1 1 7 1 0 0 0 8 1 0 0 1 9
The fourth and fifth characters are defined in the same way as the third, but using bits B7..B4 and B3..B0. The resulting five-character code should look something like "U0158" and can be looked up in a table of OBD-II DTCs.
Fuel Type Coding
Mode 1 PID 0x51 returns a value from an enumerated list giving the fuel type of the vehicle. The fuel type is returned as a single byte, and the value is given by
01 Gasoline 02 Methanol 03 Ethanol 04 Diesel 05 LPG 06 CNG 07 Propane 08 Electric 09 Bifuel running Gasoline 0A Bifuel running Methanol 0B Bifuel running Ethanol 0C Bifuel running LPG 0D Bifuel running CNG 0E Bifuel running Prop 0F Bifuel running Electricity 10 Bifuel mixed gas/electric 11 Hybrid gasoline 12 Hybrid Ethanol 13 Hybrid Diesel 14 Hybrid Electric 15 Hybrid Mixed fuel 16 Hybrid Regenerative
Non-standard PIDs
The majority of all OBD-II PIDs in use are non-standard. For most modern vehicles, there are many more functions supported on the OBD-II interface than are covered by the standard PIDs, and there is relatively minor overlap between vehicle manufacturers for these non-standard PIDs.
AutoEnginuity, who manufactures OBD-II scan tools, provides the following example on their website[1]:
Although Ford does implement the largest subset of the OBDII standard, the typical vehicle only supports 20 - 40 [standard] sensors and is limited to the emissions powertrain. Using the enhanced Ford interface, a typical Ford vehicle will support 200 - 300 sensors within half a dozen systems; that's essential systems such as ABS, airbags, GEM, ICM, etc.
Our enhanced Ford interface coverage is only matched by factory tools; we have support for 3,400+ [Ford] sensors selected from all 58 [Ford] systems.
There is very limited information available in the public domain for non-standard PIDs. The primary source of information on non-standard PIDs across different manufacturers is maintained by the US-based Equipment and Tool Institute and only available to members. The price of ETI membership for access to scan codes starts from US $7500[2]
However, even ETI membership will not provide full documentation for non-standard PIDs. ETI state[2]
Some OEMs refuse to use ETI as a one-stop source of scan tool information. They prefer to do business with each tool company separately. These companies also require that you enter into a contract with them. The charges vary but here is a snapshot of today's per year charges as we know them:
GM $50,000
Honda $5,000
Suzuki $1,000
BMW $7,000 plus $1,000 per update. Updates occur every quarter. (This is more now, but do not have exact number)
CAN (11-bit) Bus format
The PID query and response occurs on the vehicle's CAN Bus. Physical addressing uses particular CAN IDs for specific modules (e.g., 720 for the instrument cluster in Fords). Functional addressing uses the CAN ID 7DFh, to which any module listening may respond.
Query
The functional PID query is sent to the vehicle on the CAN bus at ID 7DFh, using 8 data bytes. The bytes are:
Byte -> | _ 0 _ | _ 1 _ | _ 2 _ | _ 3 _ | _ 4 _ | _ 5 _ | _ 6 _ | _ 7 _ |
---|---|---|---|---|---|---|---|---|
SAE Standard | Number of additional data bytes: 2 |
Mode 01 = show current data; 02 = freeze frame; etc. |
PID code (e.g.: 05 = Engine coolant temperature) |
not used (may be 55h) | ||||
Vehicle specific | Number of additional data bytes: 3 |
Custom mode: (e.g.: 22 = enhanced data) | PID code (e.g.: 4980h) |
not used (may be 00h or 55h) |
Response
The vehicle responds to the PID query on the CAN bus with message IDs that depend on which module responded. Typically the engine or main ECU responds at ID 7E8h. Other modules, like the hybrid controller or battery controller in a Prius, respond at 07E9h, 07EAh, 07EBh, etc. These are 8h higher than the physical address the module responds to. Even though the number of bytes in the returned value is variable, the message uses 8 data bytes regardless. The bytes are:
Byte -> | _ 0 _ | _ 1 _ | _ 2 _ | _ 3 _ | _ 4 _ | _ 5 _ | _ 6 _ | _ 7 _ |
---|---|---|---|---|---|---|---|---|
SAE Standard 7E8h, 7E9h, 7EAh, etc. |
Number of additional data bytes: 3 to 6 |
Custom mode Same as query, except that 40h is added to the mode value. So: 41h = show current data; 42h = freeze frame; etc. |
PID code (e.g.: 05 = Engine coolant temperature) |
value of the specified parameter, byte 0 | value, byte 1 (optional) | value, byte 2 (optional) | value, byte 3 (optional) | not used (may be 00h or 55h) |
Vehicle specific 7E8h, or 8h + physical ID of module. |
Number of additional data bytes: 4to 7 |
Custom mode: same as query, except that 40h is added to the mode value.(e.g.: 62h = response to mode 22h request) | PID code (e.g.: 4980h) |
value of the specified parameter, byte 0 | value, byte 1 (optional) | value, byte 2 (optional) | value, byte 3 (optional) | |
Vehicle specific 7E8h, or 8h + physical ID of module. |
Number of additional data bytes: 3 |
7Fh this a general response usually indicating the module doesn't recognize the request. | Custom mode: (e.g.: 22h = enhanced diagnostic data by PID, 21h = enhanced data by offset) | 31h | not used (may be 00h) |
See also
8
References
- ^
"AutoEnginuity's Scan Tool - Enhanced interface for Ford". Retrieved 30 September 2009.
{{cite web}}
: Cite has empty unknown parameter:|coauthors=
(help) - ^ a b
"ETI Full Membership FAQ". Retrieved 30 September 2009.
{{cite web}}
: Cite has empty unknown parameter:|coauthors=
(help) showing cost of access to OBD-II PID documentation
External links
- OBD-II Codes Description OBD-II codes list, description and diagnosis.
- CAN Bus Vehicles, make, model and year vehicles that support OBD II CAN bus
- Fault Code Examples Sample fault code data read using the OBDKey Bluetooth, OBDKey USB and OBDKey WLAN vehicle interface units.