drewid74/2024-nd3-mazda-obdii

GitHub: drewid74/2024-nd3-mazda-obdii

该项目整理了 2024 款以上马自达 MX-5 ND3 平台经实车验证的 OBD-II PID 参数,解决了第三方诊断与遥测工具读取车辆数据时缺乏精确公式与解码文档的问题。

Stars: 1 | Forks: 0

# 2024+ 马自达 MX-5 ND3 — OBD-II PID 研究 适用于 2024+ MX-5(ND3 平台)的已确认可用 PID 及其实施笔记。 ## 状态 验证车型:**2025 MX-5 RF Club**(Cal ID `PFD2EB000PEP6010`,发动机系列 `STKXV02.0FFB`),使用 **OBDLink MX+** 通过 Bluetooth Classic SPP 连接。 **方法论**(2026-06-23 更新):混合 Mode 01 + Mode 22 候选列表,通过 auto-probe-all 进行探测并记录原始响应。解码值通过以下方式进行验证: - 合理范围(例如,RPM 700–7000,节气门 0–100%) - 跨 PID 相关性(节气门 ↔ 发动机负荷 ↔ MAF ↔ 燃油消耗率) - 2 公里驾驶记录过程中的真实动态(怠速 → 巡航 → WOT) - 温度暖机曲线(冷启动 → 热怠速) - 里程表偏差与实际行驶距离匹配(8698.8 → 8700.8 km = 2.0 km ✓) ## 已确认可用的 PID (36) ### Mode 01(标准 OBD-II — 应适用于任何响应 `01 00` 的车辆) | # | 信号 | Header | PID | 公式 | 单位 | 观测范围 | |---|--------|--------|-----|---------|-------|----------------| | 1 | 发动机 RPM | 7DF | 01 0C | `((A*256)+B)/4` | RPM | 806 → 2367 | | 2 | 车速 | 7DF | 01 0D | `A` | km/h | 13 → 58 | | 3 | 冷却液温度 | 7DF | 01 05 | `A-40` | °C | 80 → 89 (暖机中) | | 4 | 冷却液温度 1 & 2 | 7DF | 01 67 | `B-40` (byte B) | °C | 镜像 0x05 | | 5 | 节气门位置 | 7DF | 01 11 | `A*100/255` | % | 13 → 92 | | 6 | 发动机负荷 | 7DF | 01 04 | `A*100/255` | % | 14 → 99 | | 7 | 绝对负荷 | 7DF | 01 43 | `((A*256)+B)*100/255` | % | 11 → 55 | | 8 | 进气温度 | 7DF | 01 0F | `A-40` | °C | 31 → 35 | | 9 | 环境空气温度 | 7DF | 01 46 | `A-40` | °C | 27 → 35 | | 10 | MAF 空气流量 | 7DF | 01 10 | `((A*256)+B)/100` | g/s | 2.5 → 43.8 | | 11 | 进气歧管压力 | 7DF | 01 0B | `A` | kPa | 19 → 94 | | 12 | 大气压力 | 7DF | 01 33 | `A` | kPa | 101 (常量) | | 13 | 点火提前角 | 7DF | 01 0E | `(A/2)-64` | °BTDC | 7.5 → 34.5 | | 14 | 燃油/空气当量比 (λ) | 7DF | 01 44 | `((A*256)+B)*2/65536` | — | 0.91 → 2.00 | | 15 | 燃油轨表压 | 7DF | 01 23 | `((A*256)+B)*10` | kPa | 9540 → 25110 | | 16 | 燃油轨绝对压力 | 7DF | 01 59 | `((A*256)+B)*10` | kPa | 10080 → 25590 | | 17 | 油箱液位 | 7DF | 01 2F | `A*100/255` | % | 与仪表盘指针匹配 | | 18 | 发动机燃油消耗率 | 7DF | 01 5E | `((A*256)+B)*0.05` | L/h | 0.9 → 10.5 | | 19 | 发动机/车辆燃油消耗率 | 7DF | 01 9D | `((A*256)+B)/50` | g/s | 0.45 → 6.05 | | 20 | 发动机排气流量 | 7DF | 01 9E | `((A*256)+B)/20` | kg/h | 11 → 120 | | 21 | 催化器温度 B1S1 | 7DF | 01 3C | `((A*256)+B)/10-40` | °C | 365 → 591 | | 22 | 电池电压 | 7DF | 01 42 | `((A*256)+B)/1000` | V | 12.5 (熄火) / 13.8 (通电) | | 23 | 实际发动机扭矩 | 7DF | 01 62 | `A-125` | % | 10 → 78 | | 24 | 发动机基准扭矩 | 7DF | 01 63 | `(A*256)+B` | Nm | 250 (常量) | | 25 | 发动机摩擦扭矩 | 7DF | 01 8E | `A-125` | % | 7 → 10 | | 26 | 加速踏板位置 D | 7DF | 01 49 | `A*100/255` | % | 16 → 47 | | 27 | 加速踏板位置 E | 7DF | 01 4A | `A*100/255` | % | 7.8 → 22.7 | | 28 | 相对节气门位置 | 7DF | 01 45 | `A*100/255` | % | 1.96 → 30 | | 29 | 绝对节气门位置 B | 7DF | 01 47 | `A*100/255` | % | 12 → 39.6 | | 30 | 命令节气门执行器 | 7DF | 01 4C | `A*100/255` | % | 0 → 17 | | 31 | 变速箱齿比 | 7DF | 01 A4 | `((C*256)+D)/1000` | — | 1.594 / 2.035 / 2.991 / 3.127 | | 32 | 车辆里程表 | 7DF | 01 A6 | `((A*256³)+(B*256²)+(C*256)+D)/10` | km | 偏差与实际相符 | ### Mode 22(制造商特定) | # | 信号 | Header | PID | 公式 | 单位 | 观测值 | |---|--------|--------|-----|---------|-------|----------| | 33 | 加速踏板百分比 (编码 B) | 7E0 | 22 03 2B | `A/2` | % | 0 → 43.5 | | 34 | 发动机机油温度 | 7E0 | 22 13 10 | `(((A*256)+B)/100)-40` | °C | 66.7 → 78.4 | | 35 | 刹车位置 | 760 | 22 2B 0D | `max(0, signed_int16(A,B))/2.3` | % | 0 → 0.43 (轻踩) | ### 设计上的静态值(正确的常量 — 不是 Bug) - **01 33 大气压力** = 101 kPa(海平面压力;在 2 分钟的行驶中不会改变) - **01 63 基准扭矩** = 250 Nm(根据 SAE 规范的车辆常数 — 不是运行时数值) ## 挡位检测 — `01 A4`(需要发动机运转) ND3 支持标准的 SAE J1979-2 PID `0xA4`(变速箱实际挡位)。**关键特性:**需要发动机运转。 **字节布局**(`41 A4` 前缀后的数据): | 偏移量 | 字节 | 含义 | |--------|-------|---------| | 0 | A | 支持位图(始终为 `0x03`) | | 1 | B | 挡位半字节 — 高半字节随结合的挡位变化 | | 2–3 | C, D | 齿比 = `((C*256)+D)/1000` | **熄火行为**:PCM 保留最后已知的齿比(通常为 `5.087` = 默认 1 挡,即字面上的 ND2/ND3 1 挡齿比)。挡位是通过 `RPM ÷ 输出轴转速` 计算得出的,当 RPM=0 时此值未定义。单独的换挡 Hall 传感器并不是驱动此 PID 的因素。 **真实驾驶过程中的观测齿比(发动机启动,2026-06-23):** - `1.594`(可能是 4-5 挡) - `2.035`(可能是 3 挡) - `2.991`(可能是 2 挡) - `3.127`(可能是 1 挡或过渡中) 驾驶过程中观测到 Byte B 半字节在 `0x00 / 0x20 / 0x30 / 0x40` 之间变化 — 可能直接编码了挡位数字(`半字节 = 挡位`),但映射关系需要通过在停车场缓慢行驶(1 挡 → 2 挡 → 3 挡)来确认。 ## 空挡 / 挡位状态 — `01 65`(Byte B,而不是 Byte A) 常见的错误实现:读取 byte A,因为它**始终为 `0x10`**(仅为 SAE J1979 I/O 支持位图)。实际的空挡/挡位状态存在于 **byte B** 中,观测发现在真实驾驶过程中的多次记录里,它在 `0x30 / 0x00 / 0x60 / 0x40` 之间变化。 **比特到挡位的映射仍待确定 (TBD)** — 需要相关的换挡测试(空挡 ↔ 1 挡 ↔ 2 挡,发动机运转)来识别哪个比特编码了空挡,哪些比特编码了每个挡位数字。 ## 转向集群 — DSC `0x760/22 20 XX` 范围扫描揭示了 **DSC 模块**上的该集群包含 4 个 PID(不是 `0x730` 处的 EPS 模块,该模块是静默的)。目前等待发动机启动状态下的转向测试验证。 | PID | 假设 | 静止值 | |-----|-----------|------------------| | `22 20 33` | 转向角(有符号 16 位 / 10 = 度) | `00 00` 居中(发动机启动);`FF FF`/`00 00` 无数据标记(发动机熄火) | | `22 20 34` | 转向速率或备用角度(有符号 16 位 / 10) | `00 00` 静态 | | `22 20 1D` | 状态标志(DSC 就绪?) | `0x04` | | `22 20 1F` | 状态标志(故障指示灯?) | `0x00` | **熄火测试**(5 次快照,踩下离合器,换挡杆遍历各挡位): 这些均未发生变化 → SAS/DSC 在发动机熄火时不会主动测量转向。发动机启动 + 停车状态 + 方向盘 `居中 → 向右打满 → 向左打满` 是必须的验证步骤。 ## Mode 22 PCM 集群发现 对 `7E0/22 XX XX` 集群的范围扫描返回了大量数据(256 个 PID × 6 个集群 = 约 6 分钟内进行了 1536 次探测): | 集群 | 命中数 | 描述 | |---------|------|-------------| | `22 09 XX` | 8 | 凸轮轴 / VVT / 气门集群 | | `22 13 XX` | 1 | 热力学(仅机油温度 `13 10`) | | `22 F4 XX` | **60** | 燃油 / 增压 / MAP — 最大的数据集 | | `22 DA XX` | 36 | 维 / 燃油学习(包含 VIN + Cal ID 片段) | | `22 03 XX` | 38 | 发动机控制(包含加速踏板 `03 2B`) | | `22 2B XX` (DSC) | 11 | 底盘(包含刹车 `2B 0D`) | 完整的字节级结果:[`pids/range-scan-2026-06-23.md`](pids/range-scan-2026-06-23.md) ## 死胡同(请勿重复探测) 这些项目已经过全面测试并返回静默状态;请勿浪费时间重试: - **`0x730` 处的 EPS** — 所有子范围(`22 20 XX`, `22 06 XX`)在 512 个 PID 中均无响应。EPS 在 ND3 上不响应 `0x730` Header。维修手册的地址可能有误,或者 EPS 需要不同的寻址方式(尝试 `0x7E2`、`0x720`?)。 - **`760/22 21 XX`** — 横摆率 / 横向 G 力集群在此范围内不在 DSC 上(在 256 个 PID 的扫描中命中数为 0)。请改用 IMU/GPS(RaceBox 提供 25 Hz 的数据)。 - **`760/22 06 XX`** — 在此范围内,车轮转速不通过 DSC 公开。DSC 模块知道车轮转速(它必须为 ABS/牵引力系统获取此数据),但不会在此 Mode 22 子地址上发布它们。 ## 响应前缀修复 如果您正在开发一个混合使用 Mode 01 和 Mode 22 PID 的 OBD 应用程序,请参阅 [`docs/prefix-fix.md`](docs/prefix-fix.md)。 **TL;DR:** 肯定响应的 SID = 请求 SID + 0x40。不要硬编码 `0x62`。 Bug 所在:只测试过 Mode 22 PID 的应用程序会将 `62` 硬编码为预期的响应前缀。Mode 01 的响应前缀为 `41`,Mode 09 为 `49`,依此类推。通用的修复方法是: ``` val serviceId = pidHex.substring(0, 2).toInt(16) val responseService = (serviceId + 0x40).toString(16).uppercase().padStart(2, '0') ``` 这不是 ND3 特有的问题 — 它会影响任何在任意车辆上混合使用模式的应用程序。 ## 后续 / 未确认 请参阅 [`pids/nd3_candidates.csv`](pids/nd3_candidates.csv) 获取当前的探测队列(已更新至 2026-06-23 状态)。欢迎提交带有测试结果的 PR。 悬而未决的问题: - `01 65` byte B 的比特到挡位映射 - 确认 `01 A4` byte B 的高半字节 = 挡位数字(停车场缓慢行驶测试) - 确认 `760/22 20 33` 是转向角(发动机启动转向测试) - 解码 `22 F4 XX` 集群中的 60 个 PID - 寻找正确的 EPS 地址(尝试 `0x7E2`、`0x720`,物理寻址) ## 相关资源 - [berumiya/CAN_DBC_6thGenMazda](https://github.com/berumiya/CAN_DBC_6thGenMazda) — ND1/ND2 原始 CAN DBC(不适用于 ND3) - [timurrrr/RaceChronoDiyBleDevice](https://github.com/timurrrr/RaceChronoDiyBleDevice) — RaceChrono 的 ND1/ND2 CAN IDs - [miata.net — 2024 CAN 总线研究帖](https://forum.miata.net/vb/showthread.php?t=782326) ## 贡献 从 `pids/nd3_candidates.csv` 测试一个候选 PID,并提交更新状态列的 PR。请在 PR 描述中包含您的车辆配置和年份。
标签:OBD-II, PID参数, 命令控制, 数据采集, 汽车, 车辆诊断, 马自达MX-5