AUTO-330 · Lesson 3 of 12 · 22 min
Scan tool data: PIDs, freeze frame and Mode 06
Hal Osei's courier van 1 comes in with its check engine light on and a stored code for random and multiple-cylinder misfire. Marcus Bell, its driver, says the van feels a little rough at idle on cold mornings and sometimes shudders on the long climb out of the river valley with a full load. The light came on last week and has stayed on. "Read me everything the van recorded before you touch it," Marty tells Kiran. "A code is a sentence. Freeze frame and Mode 06 are the paragraph around it."
This lesson explains the data a scan tool reads from an engine control module and how to use it: the generic data defined by the on-board diagnostic standards and the manufacturer's enhanced data, freeze frame, calculated and absolute load, airflow and pressure checks corrected for altitude, Mode 06 test results, and the newer diagnostic protocol that is replacing the old one. Graphing data over time is Lesson 4; here Kiran learns what each number means and whether it is believable.
Generic and enhanced data
Every light-duty gasoline vehicle sold in Canada and the United States since the late 1990s has a standard diagnostic connector and supports a standard set of diagnostic services. Through them any scan tool can read emissions-related codes, readiness status, freeze frame and a list of standard parameters, each identified by a parameter identification number, or PID: engine speed, vehicle speed, coolant and intake air temperature, mass airflow, manifold absolute pressure, throttle position, fuel trims, oxygen sensor voltages, calculated load, timing advance and others. The definitions are fixed by standards, so a PID means the same thing on every vehicle.
Manufacturers add enhanced data, available through their own diagnostic services. Enhanced data is usually far richer: misfire counts for each cylinder, injector pulse widths, desired and actual camshaft positions, fuel rail pressures, learned values, commanded idle speed, knock retard for each cylinder and the status of every input and output. A scan tool that supports the manufacturer's enhanced data, or the manufacturer's own tool, sees much more than a generic reader. For driveability work, Kiran uses the shop's professional scan tool in enhanced mode whenever the vehicle is supported.
Every number on a scan tool is the module's opinion. It is what the module calculated from its inputs, not necessarily what is really happening. A coolant temperature PID is the module's interpretation of a sensor voltage; if the sensor or its wiring is faulty, the PID is wrong and the module acts on the wrong value. That is why Lesson 1's strategy tests key readings with an independent instrument when they matter.
Freeze frame
When the engine control module sets an emissions-related code, it stores a snapshot of key PIDs at that moment, called freeze frame data. It typically includes the code that triggered it, engine speed, vehicle speed, calculated load, coolant temperature, intake air temperature, fuel trims, manifold pressure, fuel system status and sometimes more. Many manufacturers store additional failure records with more data and for more codes. Freeze frame tells the technician the conditions under which the fault was detected, which is exactly what verification needs: Kiran can try to reproduce those conditions on a road test.
The van's freeze frame shows: engine speed 2,850 rpm, vehicle speed 60 mph, calculated load 69 percent, coolant 196 °F, intake air 82 °F, fuel system in closed loop, short-term trims +3 and +2 percent, long-term trims +4 and +3 percent on banks 1 and 2, barometric pressure 24.6 inHg and mass airflow 68.0 grams per second. The van was climbing the valley grade, fully warm, under heavy load, when the misfire monitor counted enough misfires to set the code. Fuel trims are normal, so the misfire is probably not a fuel delivery or vacuum leak problem affecting the whole engine.
Load: calculated and absolute
Load is one of the most useful PIDs and one of the most misunderstood. Calculated load is defined by the standard as the airflow the engine is taking in now, divided by the most airflow it could take in at that speed at sea-level standard conditions. It reads near 20 to 25 percent at a warm idle on most engines and approaches 100 percent at wide-open throttle at sea level. Because the denominator is fixed at standard conditions, an engine at altitude can never reach 100 percent: in Denver there is simply less air to take in. Absolute load is a similar value normalized by the engine's displacement, and can read above 100 percent on a turbocharged engine.
Kiran checks whether the freeze frame's numbers agree with each other. If the airflow and load make sense for the engine's size, speed and the local air density, the mass airflow sensor and the load calculation are probably believable. The code uses the standard's definition with the van's 3.5 liter displacement.
# Calculated load from mass airflow, and the most airflow possible at this altitude
disp_l = 3.5 # engine displacement, liters
rpm = 2850
maf = 68.0 # mass airflow from freeze frame, g/s
rho_std = 1.184 # air density at the standard's reference conditions, g per liter
baro_kpa, iat_c = 83.3, 28
rho_here = baro_kpa * 1000 / (287.05 * (iat_c + 273.15)) # g per liter at the van's conditions
swept = disp_l * rpm / 120 # liters of cylinder volume filled per second
load = maf / (swept * rho_std) * 100
best_here = swept * rho_here * 0.88 / (swept * rho_std) * 100 # with a typical full-throttle volumetric efficiency
print(f"air density here: {rho_here:.3f} g/L ({baro_kpa / 3.386:.1f} inHg, {iat_c * 9 / 5 + 32:.0f} F)")
print(f"calculated load: {load:.0f} percent")
print(f"the most this engine can reach here at full throttle is about {best_here:.0f} percent")air density here: 0.964 g/L (24.6 inHg, 82 F) calculated load: 69 percent the most this engine can reach here at full throttle is about 72 percent
The calculation gives 69 percent, matching the freeze frame, and shows that at Ridgeline's altitude and that intake temperature the engine could reach only about 72 percent at full throttle. The van was near full throttle on the hill, which is the condition that stresses ignition and compression most. A technician who expected 100 percent at full throttle would think the engine was weak or the airflow sensor was reading low.
Is the airflow believable?
A mass airflow sensor that reads wrong upsets fuel control, load and many other calculations, so Kiran checks it against what the engine should be taking in. The expected airflow is the volume the cylinders sweep each second, multiplied by the volumetric efficiency and the air density. Volumetric efficiency is how completely the cylinders fill compared with their swept volume; a typical naturally aspirated engine fills about 80 to 90 percent at full throttle in its best speed range, much less at idle. At a warm idle, a common rule of thumb is about one gram per second for each liter of displacement at sea level, a little less at altitude.
# Expected mass airflow at full throttle versus the sensor reading, corrected for altitude
disp_l = 3.5
baro_kpa = 83.3
iat_c = 25
ve = 0.85 # assumed full-throttle volumetric efficiency at this speed
rho = baro_kpa * 1000 / (287.05 * (iat_c + 273.15))
for rpm, reading in ((2500, 61.5), (3500, 86.0), (4500, 108.0)):
expected = disp_l * rpm / 120 * ve * rho
print(f"{rpm} rpm: expected {expected:5.1f} g/s, sensor {reading:5.1f} g/s, {reading / expected:4.0%} of expected")2500 rpm: expected 60.3 g/s, sensor 61.5 g/s, 102% of expected 3500 rpm: expected 84.5 g/s, sensor 86.0 g/s, 102% of expected 4500 rpm: expected 108.6 g/s, sensor 108.0 g/s, 99% of expected
On a full-throttle run in second gear, the van's sensor reads within a few percent of the expected airflow at every speed. A sensor reading 80 percent or less of the expected value at full throttle would be suspect, and so would one reading far more. Kiran records the readings, because a known-good airflow at Ridgeline's altitude is worth adding to the shop's reference folder for this engine. A shop in a city at sea level would expect higher readings for the same engine, and its reference values would not apply here without the correction.
Pressure sanity checks
Manifold absolute pressure is measured above a perfect vacuum, so with the key on and the engine off the manifold is at atmospheric pressure and the manifold pressure PID should equal the barometric pressure. Many modules read barometric pressure from the manifold sensor at key-on, or have a separate sensor; either way, the two should agree within a few kilopascals. At a warm idle, manifold pressure falls to about a third of atmospheric on a healthy engine, and at full throttle it rises nearly to atmospheric.
# Key on, engine off: manifold pressure should match barometric pressure
baro_actual = 24.6 # local air pressure today (weather service, corrected to station altitude)
readings = {"MAP, key on engine off": 24.5, "BARO PID": 24.5, "MAP at warm idle": 8.6}
tol = 0.9
for name, value in readings.items():
print(f"{name:<24} {value:5.1f} inHg")
koeo, baro = readings["MAP, key on engine off"], readings["BARO PID"]
ok = abs(koeo - baro_actual) <= tol and abs(baro - baro_actual) <= tol
print("key-on readings agree with the local air pressure" if ok else "a pressure sensor or its circuit is suspect")
print(f"idle manifold pressure is {readings['MAP at warm idle'] / baro_actual:.0%} of atmospheric")MAP, key on engine off 24.5 inHg BARO PID 24.5 inHg MAP at warm idle 8.6 inHg key-on readings agree with the local air pressure idle manifold pressure is 35% of atmospheric
The local air pressure is the actual station pressure, not the sea-level value that weather reports usually give. Ridgeline keeps a calibrated barometer in the shop for this. A manifold pressure sensor that reads 29.9 inHg with the key on in Denver is wrong, however reasonable that number looks on a chart printed for sea level. The van's readings agree within a fraction of a kilopascal, and its idle manifold pressure is about a third of atmospheric, which is normal.
Mode 06: the monitors' own test results
On-board monitors run tests on catalysts, oxygen sensors, the EVAP system, misfire and other systems, as the emissions course explained. A code sets only when a test fails, often more than once. Mode 06, named for the diagnostic service that reports it, gives the results of the latest tests: for each test, the measured value and the limits it must stay within. A value that passes but sits close to its limit shows a system that is weakening before it sets a code, which is valuable for diagnosis and for advising the customer.
Mode 06 data is identified by monitor identification and test identification numbers. On vehicles using the current diagnostic protocol, scan tools translate the numbers and scale the results into units; on older protocols, some tools show raw values that need the manufacturer's scaling. The misfire monitor reports misfire counts for each cylinder, for the current and recent driving cycles; these usually have no meaningful limit, because the module decides misfire using its own calculation, but they show which cylinders are misfiring. Kiran reads the van's Mode 06 results.
# Mode 06 results: flag tests that failed or are within 15 percent of a limit
results = [
# monitor, test, value, minimum, maximum
("catalyst bank 1", "oxygen storage ratio", 0.21, 0.0, 0.75),
("catalyst bank 2", "oxygen storage ratio", 0.19, 0.0, 0.75),
("upstream O2 bank 1", "response time, ms", 88, 0, 100),
("EVAP", "leak test, small", 0.11, 0.0, 0.50),
("misfire cyl 1", "average count", 0, None, None),
("misfire cyl 2", "average count", 1, None, None),
("misfire cyl 3", "average count", 0, None, None),
("misfire cyl 4", "average count", 0, None, None),
("misfire cyl 5", "average count", 46, None, None),
("misfire cyl 6", "average count", 2, None, None),
]
for mon, test, v, lo, hi in results:
if lo is None:
flag = "high count" if v >= 10 else ""
elif v < lo or v > hi:
flag = "FAILED"
elif (hi - v) <= 0.15 * (hi - lo) or (v - lo) <= 0.15 * (hi - lo) and lo > 0:
flag = "close to limit"
else:
flag = "ok"
print(f"{mon:<20} {test:<22} {v:>6} {flag}")catalyst bank 1 oxygen storage ratio 0.21 ok catalyst bank 2 oxygen storage ratio 0.19 ok upstream O2 bank 1 response time, ms 88 close to limit EVAP leak test, small 0.11 ok misfire cyl 1 average count 0 misfire cyl 2 average count 1 misfire cyl 3 average count 0 misfire cyl 4 average count 0 misfire cyl 5 average count 46 high count misfire cyl 6 average count 2
Two results stand out. Cylinder 5 has far more misfires than any other cylinder, so the "random" code is not really random: one cylinder is doing nearly all the misfiring, and the module set the random code because it saw misfires that, under heavy load, it could not attribute confidently. And the bank 1 upstream oxygen sensor's response time is passing but close to its limit, a note for the customer but not today's problem. Kiran compares this with the catalyst results from the van's converter replacement in the emissions course: both banks are well within their limits.
The new diagnostic protocol
The diagnostic services that scan tools have used since the 1990s are being replaced by a newer protocol, OBD on UDS, defined in the SAE J1979-2 standard. It runs on the same connector and the same kind of in-vehicle network, but organizes data differently, reports richer readiness and fault information and allows more data for each code. California's on-board diagnostic rules allowed manufacturers to switch to it during the early 2020s and require it for new vehicles over the following model years, with heavy-duty engines switching from the 2027 model year; vehicles sold elsewhere in Canada and the United States follow the same designs. Older scan tools that do not support the new protocol can fail to read these vehicles at all, which is one reason Ridgeline keeps its scan tool software current.
For Kiran the practical differences are that some PIDs and Mode 06 results are presented differently on newer vehicles, that code descriptions may include an extra failure type, and that she must make sure the scan tool's software supports the vehicle's protocol before deciding that a module is not communicating.
What the van's data says
With the data in hand, Kiran writes her theory: a cylinder 5 misfire under heavy load and on cold mornings, with normal fuel trims, normal airflow, normal pressures and good catalysts. That points at something specific to cylinder 5: its spark plug, coil, injector or compression. She swaps the cylinder 5 coil with cylinder 2 and drives the van up the valley grade with a full load of sandbags in the back, watching the enhanced misfire counts for each cylinder. The misfires stay on cylinder 5. The coil is not the cause. She removes the cylinder 5 spark plug: the electrode is worn but no worse than the others, and its insulator is clean. That leaves the injector and the cylinder's compression, which the scope and current probe in Lessons 7 and 8 will test. Marty agrees with the plan and books the van for the next morning.
Worked problem
Is the load reading believable?
An engine of 2.0 liters runs at 3,000 rpm at full throttle in Denver, where the air density is 0.96 g per liter. The scan tool shows mass airflow of 44 g/s and calculated load of 89 percent. Is the load reading consistent?
Show solution
- Swept volume per second = 2.0 × 3,000 ÷ 120 = 50 liters per second.
- At the standard density of 1.184 g per liter, the most airflow is 50 × 1.184 = 59.2 g/s.
- Calculated load = 44 ÷ 59.2 = 74 percent, not 89.
Answer: No. The load reading and the airflow disagree, so either the module calculates load differently or one of the readings is wrong; check the airflow against the expected value before trusting either.
Common mistakes
MistakeTreating a PID as a measurement.
InsteadA PID is the module's calculation; test key values with an independent instrument.
MistakeExpecting 100 percent calculated load at full throttle at altitude.
InsteadCalculated load is referenced to sea-level standard air, so it reads lower at altitude.
MistakeComparing manifold pressure with a sea-level barometric value.
InsteadUse the actual station pressure for the shop's altitude.
MistakeIgnoring passing Mode 06 results.
InsteadA result close to its limit shows a weakening system before a code sets.
MistakeTaking a random misfire code at face value.
InsteadCheck misfire counts by cylinder; one cylinder often does most of the misfiring.
Summary and key terms
- Generic PIDs are defined by standards; enhanced data comes from the manufacturer and is far richer.
- Every PID is the module's opinion of what is happening.
- Freeze frame records the conditions when a code set; use it to plan verification.
- Calculated load compares current airflow with the most possible at sea-level standard conditions.
- Expected airflow depends on displacement, speed, volumetric efficiency and air density at the shop's altitude.
- Key on, engine off, manifold pressure should equal the actual local air pressure.
- Mode 06 shows each monitor's test values and limits, including results close to failing.
- The newer OBD on UDS protocol needs scan tool software that supports it.
- PID
- A parameter identification number for a data value a module reports to a scan tool.
- Enhanced data
- Manufacturer-specific data beyond the standard generic parameters.
- Freeze frame
- A snapshot of key data stored when an emissions-related code sets.
- Calculated load
- Current airflow as a percentage of the most possible at that speed at standard conditions.
- Volumetric efficiency
- How completely the cylinders fill with air compared with their swept volume.
- Mode 06
- The diagnostic service that reports on-board monitor test results and limits.
- OBD on UDS
- The newer on-board diagnostic protocol defined in SAE J1979-2.
Practice problems
Work each problem on paper first, then reveal the answer to check.
Why can calculated load not reach 100 percent at full throttle in Denver?
Show answer
It is referenced to sea-level standard air density; the local air is less dense.
What should manifold pressure read with the key on and the engine off?
Show answer
The actual local air pressure, the same as the barometric reading.
What did Mode 06 show about the van's random misfire code?
Show answer
Cylinder 5 had far more misfires than any other cylinder.
Why did Kiran swap the cylinder 5 coil with cylinder 2?
Show answer
To see whether the misfire followed the coil; it stayed on cylinder 5, so the coil was not the cause.
Lesson quiz · 5 questions
Score 60% or more to complete this lesson.
Create a free account to save your progress, take quizzes and earn a certificate.