1. 课程导入与工程全景

现代汽车电子电气架构中,一辆中高端车型可能包含 70~120 个电子控制单元(ECU),通过 CAN、CAN FD、LIN、FlexRay 以及车载以太网(100BASE-T1 / 1000BASE-T1)等多条总线互联。整车功能越来越多地由跨 ECU 的协同逻辑实现,例如自适应巡航需要动力、制动、转向与网关协同,诊断与刷写又依赖 UDS(ISO 14229)在 CAN 或 DoIP 上的完整会话管理。这意味着:单靠实车验证已经无法覆盖功能组合、故障注入与边界工况,而 HIL(Hardware-in-the-Loop,硬件在环)与诊断测试正是为了解决这一问题而存在的工程手段。

一、HIL 与诊断测试在整车开发中的定位

HIL 的核心思想是:把真实的被测对象(ECU 或 ECU 网络)接入一套实时仿真系统,由仿真系统替代部分真实车辆环境——包括被控对象模型(如发动机、电机、电池、制动液压模型)、传感器信号模拟、执行器负载模拟以及其余缺失的 ECU 节点。被测 ECU 收到的电气信号、总线报文与真实装车状态高度一致,因此可以在台架上完成原本只能在整车上做的功能验证。

诊断测试则聚焦于 ECU 的诊断服务行为:UDS 的 0x10 会话控制、0x27 安全访问、0x22/0x2E 读写数据、0x31 例程控制、0x19 读取 DTC、0x14 清除 DTC,以及基于 CAN 的 0x3E 保持连接、基于 DoIP 的车辆识别与刷写流程。诊断测试既可以在 HIL 台架上做,也可以在纯总线仿真环境(如 CANoe 无真实 ECU)中做,但 HIL 的价值在于把诊断行为与真实 ECU 的软件状态、故障存储、刷写时序绑定在一起验证。

HIL 解决的是“功能在真实电气与总线环境下是否正确”,诊断测试解决的是“ECU 的诊断服务、故障管理与刷写流程是否符合规范”。两者在工程上高度耦合:诊断会触发 ECU 内部状态变化,而这些状态又会影响功能表现。

二、核心价值:为什么必须做 HIL 与诊断测试

从工程实践看,HIL 与诊断测试的价值集中在四个方面:

  • 覆盖实车难以复现的工况:例如 -40℃ 冷启动、电池 SOC 低于 5%、CAN 总线单线断路、报文丢失 200ms、电压跌落至 6V 等。这些在实车上要么危险,要么不可控,而在 HIL 中可以通过故障注入单元(FIU)和模型参数精确复现。
  • 提前暴露跨 ECU 集成问题:网关路由、信号超时、网络管理(NM)睡眠唤醒、诊断会话与功能执行的冲突,往往在多个 ECU 同时接入时才出现。HIL 可以在装车前把整条网络搭起来。
  • 支撑自动化回归:一套 HIL 台架可以 7×24 小时运行测试用例,每次软件版本更新后自动跑完数百条用例,显著降低人工实车测试成本。
  • 满足法规与主机厂规范:功能安全(ISO 26262)、网络安全(ISO/SAE 21434)以及各主机厂的诊断规范,都要求提供可追溯的测试证据,HIL 与诊断测试报告是重要交付物。

三、典型工作流程

一个完整的 HIL 与诊断测试项目,通常按以下链路推进:需求与规范输入 → 测试计划与用例设计 → 台架搭建与模型配置 → 被测 ECU 接入与总线配置 → 测试执行与故障注入 → 结果记录与问题跟踪 → 回归验证。下面这张图展示了从输入到输出的工程全景,以及各环节之间的数据与信号流向。

车载网络 HIL 与诊断测试工程全景 需求与规范输入 功能规范 / 诊断规范 DBC / ARXML / ODX 测试计划与用例 功能用例 / 诊断用例 故障注入清单 HIL 实时台架 实时仿真机 + I/O 板卡 被控对象模型(电机/电池等) 故障注入单元 FIU 剩余节点仿真 / 总线仿真 被测对象 DUT 真实 ECU(1~N 个) CAN / CAN FD / LIN / 以太网 诊断栈(UDS / DoIP) 刷写 Bootloader 激励/信号 响应/报文 测试执行与监控 自动化测试序列(CAPL / Python / vTESTstudio) · 诊断服务调用 · 故障注入触发 总线报文记录 · 信号波形采集 · DTC 状态读取 · 刷写流程监控 结果记录与判定 通过 / 失败 / 阻塞 日志、报告、证据链 问题跟踪与回归 缺陷单 / 根因分析 软件更新后重新验证 回归反馈 学习路径 总线基础 → HIL 台架 → 诊断协议 → 自动化测试

四、一个可参考的测试示例

为了把上述流程落到具体操作,下面给出一个典型的诊断测试片段:验证某 ECU 在收到 0x27 安全访问请求后,错误密钥连续输入 3 次是否触发延时锁定。

测试对象:BCM(车身控制器),CAN FD 通道 1,波特率 500k/2M
测试用例:UDS_SecurityAccess_WrongKey_Lockout
前置条件:ECU 处于默认会话(0x01),电压 13.5V

步骤:
1. 发送 10 03        → 进入扩展会话,期望响应 50 03
2. 发送 27 01        → 请求种子,期望响应 67 01 + Seed(4字节)
3. 发送 27 02 + 错误Key → 期望响应 7F 27 35(invalidKey)
4. 重复步骤 2~3 共 3 次
5. 第 4 次发送 27 01 → 期望响应 7F 27 36(exceedNumberOfAttempts)
6. 读取 0x19 02 FF   → 检查是否记录 DTC(示例:0xC12787)

判定依据:
- 第 3 次错误后,ECU 应进入安全延时(示例:10s 内拒绝安全访问)
- DTC 状态位 testFailed 应置 1
- 延时结束后再次请求种子应恢复正常

这个用例体现了 HIL 与诊断测试的典型结合方式:诊断服务调用是激励,ECU 内部状态与 DTC 是响应,总线报文与时间戳是证据。在 HIL 台架上,还可以同步注入总线断路或电压跌落,观察诊断行为是否仍然符合规范。

五、学习路径建议

本课程后续内容将按“基础 → 台架 → 协议 → 自动化 → 实战”的顺序展开。建议的学习路径是:

  1. 车载网络基础:CAN/CAN FD 帧结构、仲裁、错误处理;LIN 主从调度;车载以太网与 SOME/IP 基本概念。
  2. HIL 台架构成:实时仿真机、I/O 板卡、故障注入单元、负载模拟、总线接口卡(如 VN 系列)的作用与连接方式。
  3. 诊断协议:UDS 服务分类、会话与安全状态机、DTC 状态位、DoIP 与刷写流程。
  4. 测试工具链:CANoe/CANalyzer、vTESTstudio、CAPL 脚本、诊断描述文件 ODX/CDD 的使用。
  5. 自动化与工程实践:用例设计、回归策略、报告生成、问题定位与根因分析。
建议在学完每一章后,回到本节这张全景图,确认自己当前处在哪个环节、输入输出是什么、与上下游如何衔接。这样能把零散知识点串成一条完整的工程链路。

需要强调的是,HIL 与诊断测试不是彼此独立的两个方向,而是同一套验证体系的两条主线:HIL 提供真实电气与总线环境,诊断测试提供对 ECU 内部状态与规范符合性的检查手段。掌握这两条主线,才能在整车电子电气开发中真正承担起集成验证与问题定位的工作。