# OBD2 ECU 模拟器 **Repository Path**: Beautiful_Man/obd2-ecu-simulator ## Basic Information - **Project Name**: OBD2 ECU 模拟器 - **Description**: OBD2 ECU 模拟器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-15 - **Last Updated**: 2026-05-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # OBD2 ECU 模拟器使用说明 适用目录: ```text C:\Users\86177\Desktop\OBD测试 ``` 适用文件: ```text OBD2_ECU_Simulator.can OBD2_ECU_Simulator.dbc ``` 适用场景: ```text CANoe / CANalyzer 模拟汽车 ECU Vgate vLinker MC+ BT4.0 连接 CANoe 台架 手机 OBD APP 或 ESP32-S3/C3 通过 vLinker 读取模拟车辆数据 ``` ## 1. 功能说明 这个工程用于在没有真实车辆的情况下,模拟一台支持 OBD-II 的发动机 ECU。 ![输入图片说明](APP%E6%88%AA%E5%9B%BE.jpg) 模拟器支持: | 功能 | 支持情况 | |---|---| | OBD-II 11bit CAN | 支持 | | ISO 15765-4 CAN 11bit 500k | 支持 | | 功能请求 `0x7DF` | 支持 | | 物理请求 `0x7E0` | 支持 | | ECU 响应 `0x7E8` | 支持 | | 动态转速 | 支持 | | 动态车速 | 支持 | | 动态水温 | 支持 | | 动态电压 | 支持 | | 动态油量 | 支持 | | 故障码读取 | 支持 | | 故障码清除 | 支持 | | VIN 多帧响应 | 支持 | | APP 断开重连 | 支持 | ## 2. 硬件接线 ### 2.1 OBD 接口接线 | OBD 引脚 | 连接 | |---|---| | Pin 16 | +13.8V | | Pin 4 | GND | | Pin 5 | GND | | Pin 6 | CAN-H | | Pin 14 | CAN-L | ### 2.2 CANoe 硬件接线 | CANoe 硬件 | OBD | |---|---| | CAN-H | Pin 6 | | CAN-L | Pin 14 | | GND | Pin 4 / Pin 5 | ### 2.3 电源要求 建议台架电源设置: ```text 电压:13.8V 限流:0.5A - 1A ``` 说明: ```text 很多 OBD APP 会读取 ATRV 判断车辆供电状态。 ATRV 是 vLinker 自己读取 OBD Pin 16 电压,CAPL 脚本无法控制。 如果台架只给 12.0V,部分 APP 可能认为车辆未启动。 建议用 13.8V 模拟发动机启动后的发电机电压。 ``` ## 3. CANoe 配置步骤 ### 3.1 导入 DBC 在 CANoe 中导入: ```text C:\Users\86177\Desktop\OBD测试\OBD2_ECU_Simulator.dbc ``` DBC 中包含 3 个核心报文: | CAN ID | 报文名 | 方向 | |---|---|---| | `0x7DF` | `OBD_Functional_Request_7DF` | Tester -> ECU | | `0x7E0` | `OBD_Physical_Request_7E0` | Tester -> ECU | | `0x7E8` | `OBD_ECU_Response_7E8` | ECU -> Tester | ### 3.2 设置 CAN 通道 CAN 通道设置: ```text CAN 类型:Standard CAN ID 类型:11bit 波特率:500 kbit/s ``` ### 3.3 添加仿真节点 在 `Simulation Setup` 中添加一个节点: ```text ECU_SIM ``` 给该节点加载 CAPL: ```text C:\Users\86177\Desktop\OBD测试\OBD2_ECU_Simulator.can ``` 然后点击: ```text Compile ``` 编译通过后再启动: ```text Start Measurement ``` ## 4. vLinker 连接方式 ### 4.1 插入 vLinker 把 Vgate vLinker MC+ BT4.0 插到 OBD 母座。 确认: ```text OBD Pin 16 有 13.8V OBD Pin 4/5 接地 OBD Pin 6/14 接 CANoe CAN 总线 ``` ### 4.2 手机连接 手机 APP 连接 vLinker 时,优先选择: ```text 协议:ISO 15765-4 CAN 11bit 500k 连接方式:Bluetooth / Bluetooth LE,按 APP 支持选择 适配器:ELM327 / vLinker MC+ ``` 如果 APP 支持手动协议,不建议先用自动协议,建议直接选: ```text ISO 15765-4 CAN 11bit 500k ``` 对应 ELM 指令: ```text ATSP6 ``` ## 5. 推荐测试流程 ### 5.1 CANoe 启动顺序 每次测试建议按这个顺序: ```text 1. 打开 CANoe 工程 2. 确认 CAN 通道 500 kbit/s 3. 编译 OBD2_ECU_Simulator.can 4. 启动 Measurement 5. 打开台架电源 13.8V 6. 插入 vLinker 7. 手机 APP 或 ESP32 连接 vLinker 8. 开始 OBD 测试 ``` ### 5.2 推荐初始化指令 手机 APP 通常会自动发送。ESP32 手动测试时建议: ```text ATZ ATE0 ATL0 ATS0 ATH0 ATSP6 0100 010C 010D 0105 0142 0902 ``` ## 6. 支持的常用 OBD 指令 ### 6.1 连接握手相关 | 指令 | 功能 | 典型响应 | |---|---|---| | `0100` | 查询支持 PID 01-20 | `41 00 ...` | | `0120` | 查询支持 PID 21-40 | `41 20 ...` | | `0140` | 查询支持 PID 41-60 | `41 40 ...` | | `0200` | 查询冻结帧支持 PID | `42 00 ...` | | `0900` | 查询车辆信息支持项 | `49 00 ...` | ### 6.2 实时数据 | 指令 | 功能 | |---|---| | `0101` | MIL 故障灯状态 / DTC 数量 | | `0104` | 发动机负荷 | | `0105` | 冷却液温度 | | `010B` | 进气歧管压力 | | `010C` | 发动机转速 | | `010D` | 车速 | | `010E` | 点火提前角 | | `010F` | 进气温度 | | `0110` | MAF 空气流量 | | `0111` | 节气门开度 | | `011C` | OBD 标准类型 | | `011F` | 发动机运行时间 | | `012F` | 油箱液位 | | `0142` | 控制模块电压 | | `0146` | 环境温度 | | `015C` | 机油温度 | | `015E` | 燃油流量 | ### 6.3 故障码 | 指令 | 功能 | |---|---| | `03` | 读取已存储故障码 | | `04` | 清除故障码 | | `07` | 读取待确认故障码 | | `0A` | 读取永久故障码 | 默认脚本中: ```text gDtcEnabled = 0 ``` 表示无故障码。 如果要模拟故障码 `P0301`,把脚本中: ```c int gDtcEnabled = 0; ``` 改为: ```c int gDtcEnabled = 1; ``` 然后重新编译 CAPL。 ### 6.4 车辆信息 | 指令 | 功能 | |---|---| | `0900` | 查询 Mode 09 支持项 | | `0901` | VIN 消息数量 | | `0902` | VIN 车架号 | | `0903` | 标定 ID 消息数量 | | `0904` | 标定 ID | | `0905` | CVN 消息数量 | | `0906` | CVN | | `0909` | ECU 名称消息数量 | | `090A` | ECU 名称 | ## 7. 动态模拟数据 脚本会周期更新车辆状态。 | 参数 | 范围 | |---|---| | 发动机转速 | 约 `760 - 3300 rpm` | | 车速 | 约 `0 - 112 km/h` | | 冷却液温度 | 约 `78 - 106 C` | | 发动机负荷 | 约 `18 - 84 %` | | 进气歧管压力 | 约 `28 - 96 kPa` | | 进气温度 | 约 `24 - 48 C` | | 节气门开度 | 约 `8 - 72 %` | | ECU 电压 | 约 `12.6 - 14.2 V` | | 环境温度 | 约 `18 - 36 C` | | 机油温度 | 约 `82 - 112 C` | | 燃油流量 | 约 `1.0 - 9.0 L/h` | | 油箱液位 | 逐步下降,低于 15% 后回到 75% | | 运行时间 | 持续递增 | ## 8. 断开重连 脚本支持 APP 断开重连。 实现逻辑: ```text 1. 每次收到 0100,认为是新 OBD 会话 2. 自动清理 VIN / 标定 ID / ECU 名称的多帧等待状态 3. 3 秒没有收到请求,也自动清理会话状态 4. 重连时保持发动机启动状态 ``` 如果 APP 重连失败,建议: ```text 1. 停止手机 APP 2. 等 3 秒 3. 拔插 vLinker 4. 重新打开 APP 5. 重新连接 ``` 一般不需要重启 CANoe。 ## 9. Trace 判断方法 ### 9.1 正常握手 CANoe Trace 应看到: ```text 7DF Rx: 02 01 00 00 00 00 00 00 7E8 Tx: 06 41 00 98 3F 80 13 00 ``` 如果 APP 请求冻结帧: ```text 7DF Rx: 03 02 00 00 00 00 00 00 7E8 Tx: 07 42 00 00 98 3F 80 13 ``` 注意: ```text Mode 01 正响应是 41 Mode 02 正响应是 42 Mode 09 正响应是 49 ``` ### 9.2 转速请求 ```text 7DF Rx: 02 01 0C 00 00 00 00 00 7E8 Tx: 04 41 0C xx xx 00 00 00 ``` ### 9.3 车速请求 ```text 7DF Rx: 02 01 0D 00 00 00 00 00 7E8 Tx: 03 41 0D xx 00 00 00 00 ``` ### 9.4 VIN 请求 VIN 是 ISO-TP 多帧: ```text Tester -> ECU: 02 09 02 00 00 00 00 00 ECU -> Tester: 10 14 49 02 01 ... Tester -> ECU: 30 00 00 00 00 00 00 00 ECU -> Tester: 21 ... ECU -> Tester: 22 ... ``` 如果只看到首帧 `10 14 ...`,但没有后续 `21/22`,说明 APP 或 vLinker 没有发 ISO-TP Flow Control。 ## 10. 常见问题排查 ### 10.1 APP 显示无法连接 OBD 检查: ```text 1. CANoe Measurement 是否已启动 2. CAPL 是否编译成功 3. CAN 波特率是否 500 kbit/s 4. vLinker 是否有 13.8V 供电 5. CAN-H / CAN-L 是否接反 6. APP 协议是否选 ISO 15765-4 CAN 11bit 500k 7. Trace 中是否能看到 0x7DF 请求 8. Trace 中是否能看到 0x7E8 响应 ``` ### 10.2 Trace 有 0x7DF,但没有 0x7E8 说明 CANoe 收到请求,但脚本没有回复。 检查: ```text 1. CAPL 是否加载在仿真节点上 2. CAPL 是否编译通过 3. Measurement 是否已启动 4. 请求 ID 是否是 0x7DF 或 0x7E0 ``` ### 10.3 Trace 有 0x7E8,但 APP 仍失败 说明 CAN 层有回复,但 APP 不接受响应。 重点检查: ```text 1. Mode 01 是否回复 41 2. Mode 02 是否回复 42 3. Mode 02 是否包含 Freeze Frame Number 4. VIN 多帧是否完成 5. 供电电压 ATRV 是否接近 13.8V 6. APP 是否要求更完整的车型协议 ``` ### 10.4 APP 反复请求 0100 可能原因: ```text 1. APP 没识别到 ECU 有效响应 2. 旧脚本仍在运行 3. CAPL 没重新编译 4. vLinker 缓存/会话异常 ``` 处理: ```text 1. 停止 Measurement 2. 重新编译 CAPL 3. 启动 Measurement 4. 拔插 vLinker 5. 重启 APP ``` ## 11. ESP32 测试建议 ESP32-S3/C3 通过 vLinker BLE 连接后,建议固定使用: ```text Service: 000018f0-0000-1000-8000-00805f9b34fb Notify: 00002af0-0000-1000-8000-00805f9b34fb Write: 00002af1-0000-1000-8000-00805f9b34fb ``` 发送格式: ```text ASCII + \r ``` 示例: ```text ATSP6\r 0100\r 010C\r 010D\r 0105\r 0142\r ``` 每条指令必须等待 `>` 后再发下一条。 ## 12. 修改模拟参数 常用参数在 `OBD2_ECU_Simulator.can` 文件开头: ```c int gEngineRpm = 1200; int gVehicleSpeed = 0; int gCoolantTemp = 86; int gEngineLoadPct = 28; int gControlModuleMilliVolt = 13800; int gFuelLevelPct = 75; ``` 修改后需要: ```text 1. 保存文件 2. 重新编译 CAPL 3. 重新启动 Measurement ``` ## 13. 当前限制 当前脚本模拟的是发动机 ECU,不是完整整车网络。 不模拟: ```text 车门状态 车窗状态 灯光状态 安全带状态 胎压 TPMS 空调状态 档位状态 ABS / SRS / BCM 私有诊断 ``` 这些属于车身域或厂商私有 CAN,需要后续按具体车型单独建模。