Files
justin 03223dfd6c Rename project to OBDash + per-metric colored multi-axis
Rename: the app is vehicle-agnostic, so 'ford-obd' was wrong. Rebranded all
code/docs/profile authors to OBDash; Gitea repo renamed justin/ford-obd ->
justin/obdash (remote + description updated). Ford the make and the
ford-6.0-powerstroke profile are unchanged (that vehicle really is a Ford).

Multi-axis upgrade (per request):
- MultiAxisPlot now gives each METRIC its own Y axis, each axis colored to
  match its line; the primary metric owns the LEFT axis, others stack right.
- Click a line to promote it to the left axis (sigClicked -> set_primary).
- Cleaner teardown (no removeItem warnings); axis label no longer doubles the
  unit; Normalize round-trips.

Validated headless: colored per-metric axes, promote-to-left, gauge view,
normalize toggle, profile switch; obdcore + diagnostics tests pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yT89n4zR4qbrySoSiEyZs
2026-06-30 15:25:26 -04:00

193 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-06-29 — 6.0 Power Stroke no-start session
In-cab diagnostic session using the `OBDash` tool on the truck.
Charger on "12V Hi" was attached for most of the session.
## Symptoms
- Cranks **fast** (starter spins the engine normally)
- **Zero combustion event** — no sputter, no cough, no kickback
- HFCM lift pump heard priming on key-RUN and shutting off normally
- Battery at OBD port: 11.2 12.7V key-RUN (varied with charger state)
## Codes pulled (multiple reads, slight variation between reads)
| Mode | Code | Description |
|---|---|---|
| Stored (03) | `C0300` | (chassis — not engine, not in our DB) |
| Pending (07) | `C0700` / `C0701` | (chassis — alternated between reads) |
| Pending (07) | `P0113` | IAT circuit HIGH — sensor wiring, not a no-start |
| Permanent (0A) | `C3F0A` | (chassis — not engine) |
No engine P-codes, no FICM codes, no injector codes, no CMP/CKP codes.
## What we ruled out
- **Batteries as primary cause** — cranks fast and voltage held adequately
(see `watch-cranking.log`). Bus sagged to 10.811.2V during ~11s crank,
borderline-low but not catastrophic. Healthy starter spin means batteries
have current to give.
- **Fuel supply (low-pressure)** — HFCM lift pump audibly primes and shuts
off correctly on key-RUN. And the truck runs fine once started, so the
whole fuel-supply chain delivers under load.
- **Compression / mechanical** — fast even cranking, would feel different
with a low-compression cylinder. Ether ignition (see below) confirms
good compression and valve timing.
- **FICM** — meter showed **>48V on cranking AND key-ON**. FICM is healthy.
- **Injector electrical / CMP / CKP** — truck runs fine once started, so
injector drive, cam/crank sync, and the FICM-to-injector path are all
good when the engine is turning at running RPM.
## ⭐ EMPIRICAL CONFIRMATION (2026-06-30 crank test)
Direct measurement with `--crank` and the verified `1446` ICP PID:
**Peak cranking ICP = 376 psi** — below the ~500 psi firing threshold.
Full output in [crank-test-2026-06-30.txt](crank-test-2026-06-30.txt).
This is the smoking gun. Truck cannot generate enough ICP during cranking
to open injectors → cannot fire on its own fuel → needs ether every time.
Matches the symptom-set perfectly.
Side data from the same test:
- **FICM Main min: 48.0 V** — healthy, corroborates the meter.
- **Battery min: 10.3 V** — sag but adequate.
- 376 psi is "almost there" not zero → suggests a **partial** leak
(IPR seat / oil rail O-rings / partial STC crack) rather than a
fully blown STC fitting (which would typically show sub-100 psi).
## ⭐ Key diagnostic finding: ether starts it every time
Spraying starting fluid (ether) into the intake **gets the truck to fire,
catch, and run normally** — and it then **idles and runs fine until shut
off**. Then it needs ether *again* to restart, even when warm.
This is a near-textbook signature on a 6.0:
- Ether ignites at much lower temperature and pressure than diesel. If
the engine fires and runs on ether, **compression, timing, and valves
are fine**.
- If it runs cleanly once started, **injectors are firing correctly at
running ICP** and the high-pressure oil system is making enough
pressure *at running RPM* to drive the injectors.
- Needing ether **every** time — even after warm-up — means the failure
is in the **starting-pressure window**, not a cold-soak / temperature
issue.
Mechanism: at cranking RPM the HPOP can only generate ICP so fast.
Anything that bleeds high-pressure oil at cranking speeds will starve
ICP below the ~500 psi firing threshold. Once the engine catches (on
ether) and gets to idle RPM, the HPOP can outpace the leak and ICP
holds normal — so it runs fine. Shut it off, oil pressure drops to
zero, the leak path is still there next crank.
## Working hypothesis (in order of suspicion)
The new symptom set narrows the field hard. **It is almost certainly
in the high-pressure oil (ICP) path that feeds the injectors:**
1. **STC fitting** — the high-pressure oil branch tube where it joins
the oil rails. Classic 6.0 wear item. Cracks at the fitting let oil
bleed off during cranking when the HPOP can't keep up; pressure
recovers at running RPM. Ford TSB exists. **#1 suspect.**
2. **High-pressure oil rail O-rings** (under the valve covers) — same
failure mode: leak at cranking pressure, mask at running pressure.
3. **HPOP discharge tube / O-rings** — same family.
4. **IPR valve** seat/seal worn or stuck — bleeds oil back to sump
during cranking.
5. **HPOP itself worn** — gears can't pressurize fast enough at
cranking RPM. Less common than STC/rails.
6. **Sticky injector spool valves** — some 6.0 injectors won't open at
marginal ICP but work fine once pressure is up. Less likely if it
needs ether *every* time, more likely if it's "some cold starts."
What this is **NOT** (given runs-fine-once-started + needs-ether-even-warm):
- ❌ FICM (measured >48V; also injectors fire fine when running)
- ❌ CMP/CKP (sync is good when running)
- ❌ Glow plugs / glow plug control (needing ether when *warm* rules
this out — warm engine doesn't need glow assist)
- ❌ Fuel filters / HFCM / lift pump (runs fine = fuel delivery works)
- ❌ Compression / valve seal (ether fires and engine runs cleanly)
## What we did with the tool this session
- Pulled DTCs across all 3 modes (multiple times).
- Captured cranking voltage with `--watch 30` (see `watch-cranking.log`):
- Pre-crank: bus 11.7→12.1V, VPCM 12.39→12.71V
- Cranking (~11s): bus 10.811.2V, VPCM 11.3211.70V
- Recovery: bus 11.812.2V, VPCM stopped responding (`?`) — possible
PCM brief recovery state after the dip.
- Ran first attempt at Mode-22 probes (`--ford`) with community-sourced
PIDs (ICP=1209, FICM=1228/1229/122A, IPR=120B, etc.). **All returned
"no response."** Either the PCM uses different PID numbers, or these
values live on Ford's SCP bus and aren't gatewayed to OBD-CAN.
- Brute-force scanned PIDs `0x1000-0x14FF` (1280 PIDs, ~6 min, 46 hits).
See `mode22-scan-hits.txt`. Data is noisy because **multiple modules on
the bus answer the same query** — positive responses from PCM mixed
with negative-response bytes (`7F 22 12`, `7F 22 31`) from other modules.
## Interesting PIDs from the scan to verify next session
Cleanest-looking PCM-side responses worth re-probing individually
(with normal timing, `python obd_reader.py --pid XXXX`):
```
1310 2 1C 92 (was 1C 69 earlier — value changes; maybe a counter?)
1440 2 01 89 = 393
1442 2 01 88 = 392 ← three closely-spaced ~390 values
1445 2 01 8F = 399 suggests a related sensor cluster
1446 2 00 16 = 22
1447 2 00 34 = 52
1448 2 00 11 = 17
11B3 1 02
11B4 2 00 00
11BA 2 FF 5C
```
Likely scaling guesses:
- raw / 100 → fits if these are voltage-tenths or pressure-tenths
- raw / 1000 → if mV (0.393V plausible for sensor outputs)
- raw - some offset → temperature
To know what each one *is*, compare against a known measurement:
- Run `--pid 1440` with engine off, write down value.
- Get engine running (eventually), write down value.
- Change condition, watch which PIDs move.
## Open items / what's next
Order is now: confirm the ICP-side leak source, then fix.
1. **Visual inspection under valve covers / around STC fitting.**
Pull both valve covers and look for oil flooding, weeping at the
STC fitting (high-pressure oil branch tube), and the condition of
the high-pressure oil rail O-rings on each head.
2. **Crank and watch ICP build** (once we have a verified ICP PID, or
with FORScan / IDS). A healthy 6.0 builds ~500+ psi in 12 seconds
of cranking. If ours stalls below 500 psi or builds very slowly,
that confirms the high-pressure leak.
3. **Verify scan-hit PIDs.** Re-probe the cleanest hits with
`--pid XXXX` (`1310`, `1440-1451`, `11Bx` cluster) for uncontaminated
readings. The cluster around `1440-1451` looks like a related sensor
group — could include ICP_V / IPR / ICP_DES if we're lucky.
4. **FORScan** via CyanLabs mirror when it's back, on the same CH340.
With ICP and IPR live data in front of us, the leak source is much
easier to nail down (e.g., IPR commanded high but ICP stays low =
leak; IPR low and ICP low = control side).
5. **Optional cheap check**: pull the IPR valve and inspect the seat
for wear / debris / a stuck pintle. ~$0, takes 15 minutes.
6. **Address other modules with `ATSH`** — particularly trying the FICM
on its CAN address if it has one (uncertain on 6.0 — FICM likely on
SCP, not directly reachable from OBD-CAN). Lower priority now that
FICM is confirmed healthy by meter.
## Tool state at end of session
`obd_reader.py` now has:
- `--ford` — try the (tentative) Ford 6.0 Mode-22 PID table
- `--pid XXXX` — one-shot probe of any 16-bit Mode-22 PID
- `--watch [N]` — stream ATRV + VPCM for N seconds (default 20)
- `--scan AAAA-BBBB` + `--scan-log PATH` — brute-force scan a PID range
All work on the CH340 ELM327 v1.5 clone at 38400 baud, HS-CAN switch.