第二章:测试环境总体架构
好,咱们直接进入正题。测试环境怎么搭?说白了就两种路子:硬件在环(HIL)和软件在环(SIL)。我做了这么多年车载测试,这两种模式几乎天天打交道。今天就把它们的区别、拓扑图、核心组件,一次性给你讲透。
2.1 HIL 与 SIL:到底差在哪?
先问个问题:你手头只有一台电脑,能不能测事件记录器?能,但只能测逻辑。你想测真实的 CAN 总线信号、硬线触发、电源跌落?对不起,电脑模拟不了。这就是 SIL 和 HIL 的分水岭。
核心区别一句话:
- SIL(软件在环):被测对象是纯软件,跑在 PC 或虚拟机里。输入输出全是模拟的。
- HIL(硬件在环):被测对象是真实硬件板卡,通过 IO 板卡、总线仿真器来模拟整车环境。
我个人习惯,前期逻辑验证用 SIL,快、便宜、随便改。但到了回归测试和压力测试,必须上 HIL。为什么?因为事件记录器对时序要求极高,软件模拟出来的 CAN 报文延迟和真实硬件差好几个数量级。
| 对比项 | SIL | HIL |
|---|---|---|
| 被测对象 | 软件模型 / 算法 | 真实硬件板卡 |
| IO 接口 | 虚拟 IO | 真实 IO + 仿真板卡 |
| 实时性 | 弱(依赖 OS 调度) | 强(微秒级响应) |
| 故障注入 | 软件模拟 | 硬件级(短路、断路、电平毛刺) |
| 成本 | 低(一台 PC 搞定) | 高(机柜 + 板卡 + 线束) |
| 适用阶段 | 单元测试、集成测试早期 | 系统测试、回归测试、压力测试 |
我的经验:曾经有个项目,SIL 跑了三天三夜没出问题,一上 HIL 就崩。查到最后是硬件看门狗复位时序和软件预期差了 2ms。这种坑,SIL 永远发现不了。
2.2 测试环境拓扑图
下面这张图是我自己画的,基本覆盖了车载事件记录器 HIL 测试的标准架构。你照着搭,至少能覆盖 80% 的测试场景。
这张图你看懂了吗?从上到下分五层:
- 控制层:上位机,跑测试脚本。我一般用 Python + PyTest,也有人用 NI TestStand。看团队习惯。
- 仿真层:实时仿真机,这是 HIL 的心脏。它模拟整车网络、传感器信号、甚至故障。
- 被测层:就是咱们的事件记录器板卡。注意,一定要用和量产版一致的硬件。
- 负载层:模拟真实负载,比如灯泡、电机、电磁阀。事件记录器经常要采集这些负载的电流。
- 测量层:示波器、逻辑分析仪。用来抓时序,验证记录器的时间戳精度。
注意:我曾经见过有人把示波器直接接到仿真机输出上,结果共地问题导致仿真机板卡烧了。记住,所有测量设备必须和被测件共地,或者用差分探头。
2.3 核心组件详解
下面我把每个核心组件拆开讲。你想想看,如果让你自己搭一套 HIL,最少需要哪些东西?
2.3.1 实时仿真机
这是 HIL 的「大脑」。我推荐 NI PXI 或者 dSPACE SCALEXIO。它们跑的是实时操作系统,能保证 CAN 报文周期误差在 10 微秒以内。普通 PC 做不到这一点。
- CAN/LIN 板卡:至少 2 路 CAN FD,1 路 LIN。我习惯多留一路做监控。
- DIO 板卡:数字 IO,用来模拟硬线触发信号。比如碰撞信号、门开关信号。
- AIO 板卡:模拟 IO,用来模拟传感器电压、电阻。
- 故障注入板卡:这个很关键。可以程控切换开路、短路、对电源/对地短路。
避坑指南:我曾经选过一款便宜的故障注入板卡,切换时间要 50ms。结果测试事件记录器的 10ms 故障响应,根本测不准。后来换了 NI 的故障注入模块,切换时间 < 1ms,问题才解决。
2.3.2 可编程电源
事件记录器对电源质量很敏感。你需要一台能模拟电压跌落、浪涌、纹波的电源。我常用 Chroma 或 ITECH 的系列。
- 电压范围:9V ~ 16V(12V 系统),最好支持 24V 系统。
- 电流能力:至少 20A,因为要模拟启动电机时的浪涌。
- 动态响应:电压变化斜率要快,至少 1V/μs。
2.3.3 负载箱
这个容易被忽略。事件记录器要采集外部负载的电流,比如刹车灯、转向灯。你不能真的去接灯泡,因为灯泡会发热、会烧。用电子负载箱模拟。
- 阻性负载:模拟灯泡、电阻。
- 感性负载:模拟继电器线圈、电机。
- 容性负载:模拟 ECU 内部滤波电容。
2.3.4 测量设备
示波器是必须的。我建议至少 4 通道,200MHz 带宽。逻辑分析仪用来抓数字总线,比如 SPI、I2C,事件记录器内部经常用这些总线。
我的配置清单(最低配):
- 实时仿真机:NI PXIe-1073 + 2 路 CAN FD + 1 路 LIN + 32 路 DIO + 8 路 AIO
- 可编程电源:Chroma 62012P-80-20
- 电子负载:ITECH IT8512A+
- 示波器:Rigol DS1104Z
- 故障注入板卡:NI PXI-2515
这套配置大概 15 万左右,够用三年。
2.4 SIL 环境快速搭建
说完了 HIL,咱们也聊聊 SIL。毕竟不是每个团队都买得起 HIL 机柜。SIL 怎么搭?其实更简单。
# 一个最简单的 SIL 测试脚本(Python 伪代码)
class SIL_EventRecorder:
def __init__(self):
self.can_bus = VirtualCANBus() # 虚拟 CAN 总线
self.dio = VirtualDIO() # 虚拟 IO
self.recorder = EventRecorderLogic() # 被测软件逻辑
def inject_event(self, event_type, timestamp):
# 模拟事件注入
self.can_bus.send_message(0x123, event_type)
self.recorder.process_event(timestamp)
def verify_record(self, expected_event):
# 验证记录结果
actual = self.recorder.get_last_record()
assert actual == expected_event, f"记录不匹配: {actual} != {expected_event}"
# 跑一个测试用例
test = SIL_EventRecorder()
test.inject_event("碰撞信号", 1000)
test.verify_record({"type": "碰撞", "timestamp": 1000})
print("SIL 测试通过!")
你看,SIL 环境就这么几行代码。但注意,SIL 只能测逻辑正确性,测不了时序、测不了硬件兼容性。我一般 SIL 跑 80% 的用例,剩下 20% 留给 HIL。
再次提醒:不要迷信 SIL。我见过一个团队,SIL 全过,HIL 一跑就挂。原因是 SIL 里的 CAN 总线是理想模型,没有延迟和错误帧。而真实 CAN 总线会有位填充、仲裁、错误重发。这些在 SIL 里根本模拟不出来。
2.5 本章小结
好,咱们捋一下:
- HIL 和 SIL 不是替代关系,是互补关系。SIL 快、便宜,HIL 准、全面。
- 拓扑图记住五层结构:控制层 → 仿真层 → 被测层 → 负载层 → 测量层。
- 核心组件:实时仿真机、可编程电源、负载箱、测量设备。缺一不可。
- 搭建顺序:先 SIL 验证逻辑,再 HIL 验证硬件和时序。
下一章咱们会深入讲实时仿真机的选型和配置。嗯,到时候我会把 NI 和 dSPACE 的优缺点掰开了揉碎了讲。今天就到这儿,你先消化一下这张拓扑图。
公众号:蓝海资料掘金营,微信deep3321