很多测试工程师把 BCM(Body Control Module,车身控制模块)当成”配角”。觉得它不控制动力、不碰制动,测起来就是点点开关、看看灯亮不亮。我刚入行时也这么想,直到在一个项目里被天窗防夹漏测狠狠上了一课。
我观察过不少团队:功能测试把 BCM 当”开关集合”,点亮即过;系统测试又把它当成背景板,注意力全在动力和智驾。结果 BCM 的边界场景——休眠电流、防夹末端、LIN 调度抖动——长期没人管。等项目走到 PV 阶段爆出问题,返工成本比早期多好几倍。所以我把 BCM 测试单列成体系,不是小题大做,而是它真的值得。
下面我会按”认知 → 链路 → 用例 → 故障”的顺序展开:先讲 BCM 管什么、为什么值得测;再拆信号从开关到执行器的完整路径;然后用车灯、雨刮、天窗三个高频功能,把用例设计讲到能直接抄;末尾用一次真实漏测复盘和故障注入,把”冷门路径”讲透。全文尽量用项目里的真实数据,方便你边读边落地。
|
先给结论:BCM 是整车”身体”的总控台。它管灯、管雨刮、管天窗、管门锁车窗、管后视镜、管进入许可。一辆车 30 多个车身功能,大半归它调度。测不好 BCM,用户感受到的”小毛病”会一个接一个——灯不灭、雨刮乱刮、天窗夹手、离车不锁车。这些不是小事,每一条都是投诉和召回风险 |
一、BCM功能全景:哪些东西归它管
我习惯先把”边界”画清楚。BCM 在整车电子电气架构里属于车身域控制器。在入门级车型上,它常常是一个独立 ECU;在中高端车型上,它可能和 BCM+Gateway、甚至和座椅/空调域融合成域控。但不管形态怎么变,它手里的活儿大致分七类。
1.1 七大功能域清单
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注意看”通信方式”这列。车灯和门锁常常保留硬线,因为这是安全相关功能,硬线更可靠、不受总线休眠影响;雨刮、天窗、车窗、后视镜多半走 LIN,因为这些都是”慢速、低成本、点对点”的负载,LIN 一根线就能搞定,省线束又省钱;而进入许可、整车状态这类要和别的域交互的,就上 CAN。
图片引自微信公众号,扫码关注阅读原文面对这么多功能,怎么排测试优先级?我习惯用风险 × 频度二维法:安全相关(防夹、照明)排在首位;用户高频感知(车灯、雨刮)排第二;低频但影响体验(后视镜记忆)排第三。排好序再分配工时,避免在”边角功能”上耗太多,却漏掉核心风险。这个方法在资源紧张的项目里特别管用。
1.2 通信矩阵该怎么读
真正动手测之前,我会先向开发要三样东西:DBC(CAN 数据库)、LDF(LIN 描述文件)、功能规范(Function Spec)。这三样齐了,用例才有据可依。
举个例子,车灯功能的通信矩阵通常长这样:
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
经验提醒:不少项目里 BCM 既是某些报文的发送方、又是另一些报文的接收方。测车灯时,你不能只发命令看灯亮,还要监听 BCM 自己回的状态报文(0x100),确认”执行”和”反馈”一致。只测一边,等于蒙着眼睛走路。 |
补充一点趋势观察:如今很多新车把 BCM 和网关、甚至座椅域融合成”车身域控”,ECU 数量在减少,但单个模块管的功能在变多。对测试来说,这意味着用例要跟着”域”走——原来分散在多个模块的功能,现在要在一个 BCM 上做集成测试,通信矩阵和故障域的耦合也更复杂。早一点建立域视角的用例库,后面少踩坑。
二、BCM信号链路:从开关到执行器的完整路径
讲完”管什么”,接着讲”信号怎么走”。我把 BCM 的信号链路分成三段:输入段(开关/传感器 → BCM)、处理段(BCM 内部逻辑)、输出段(BCM → 执行器)。每一段出问题的表现完全不同,定位方式也不一样。
2.1 三条输入路径
硬线组合开关(灯光开关、雨刮开关)直接拉高/拉低 BCM 的 GPIO 引脚。这种方式抗干扰强,但引脚资源宝贵,一般只留给关键功能。测硬线,重点是电平阈值和抖动去抖(debounce)。
LIN雨量传感器、雨刮电机、天窗电机、后视镜,这些慢速设备通过 LIN 子节点连到 BCM 的 LIN 主端口。BCM 是 LIN 主节点,负责调度帧。测 LIN,重点是帧调度表(schedule table)和从节点响应时间。
CAN进入许可、整车模式(ignition state)、网关转发来的指令,走 CAN。测 CAN,重点是报文周期、信号有效性和超时处理。
讲完路径,必须提两个常被忽略的细节。去抖(debounce):硬线开关存在机械抖动,BCM 一般会做 10~50ms 的软件去抖。测硬线时,我会故意做”快抖”测试——在阈值时间内快速通断,确认 BCM 不会误判成多次操作。诊断(UDS):BCM 支持 0x22 读数据、0x2E 写数据、0x14 清故障码、0x19 读故障码。故障注入后,要通过诊断服务确认 DTC 被正确记录,这是回归的必要一环,不能只靠肉眼看行为。
2.2 唤醒与睡眠:被忽略的隐性链路
这一块我见过太多人漏测。车熄火锁车后,BCM 要进入休眠(sleep)以省电;当用户拉门把手、按遥控、开灯,BCM 要被唤醒(wakeup)。
图片引自微信公众号,扫码关注阅读原文唤醒测试我一般会覆盖这几条:
- 硬线唤醒:
在休眠状态下拉一下门把手开关,量 BCM 的供电电流,确认从休眠电流(一般 < 0.3mA)爬升到工作电流(> 50mA),且唤醒时间 < 200ms。 - LIN 唤醒:
从节点发唤醒脉冲(breaking pulse),确认 BCM 在 100ms 内恢复帧调度。 - CAN 唤醒:
网管报文(NM)触发,确认 BCM 参与网络唤醒。 - 睡眠策略:
无操作一段时间后,BCM 应主动释放总线、关负载、进入休眠,避免亏电。
|
真实事故:有个项目整车轮休眠电流超标到了 1.2A,放一夜就亏电。事后定位是 BCM 在熄火后没关掉后视镜加热驱动,LIN 从节点一直被供电。这种问题只有在”休眠 + 电流钳”的用例里才能抓到,靠点点开关永远发现不了 |
再补一句通信演进:部分新平台已把 BCM 接到 CAN FD,速率从 500k 提到 2M,报文负载更大。测链路时要确认 BCM 在经典 CAN 与 CAN FD 混合网里的兼容性——旧节点发经典帧、新节点发 FD 帧,BCM 不能因为帧格式切换而丢信号。这条在改款车型(新旧节点混用)里尤其容易出问题。
三、测试用例设计:车灯控制4场景
车灯是 BCM 里测试频次高、也容易被测”虚”的功能。我把它拆成四个场景,每个场景都带可落地的判定标准。
3.1 场景一:CAN 信号驱动逻辑
现代车灯多由 CAN 信号驱动。测试台架(或 CANoe)发 0x101 命令,BCM 解析后驱动对应灯组。判定标准很直接:发命令 bit0=1 → 近光灯亮;bit1=1 → 远光灯亮;bit2=1 → 示宽灯亮;bit3=1 → 日行灯亮。同时监听 0x100 状态报文,确认反馈位与命令位一致。
3.2 场景二:多模式优先级
车灯模式之间有优先级。我项目里定的规则是:远光 > 近光 > 示宽 > 日行灯。也就是说,远光开启时再发近光命令,BCM 应保持远光(或按规范切换)。这个优先级必须用用例锁死,否则会出现”开远光时近光也亮”的怪象。
3.3 场景三:故障替代策略
当 CAN 通信丢失,BCM 应有”故障替代(fail-safe / fallback)”。比如 CAN 断了,硬线开关仍能控制近光/示宽,保证基本照明。这是安全底线,必须测。
3.4 场景四:日行灯法规要求
日行灯(DRL)不是想亮就亮。发动机运转且未开近远光时,日行灯应自动点亮;一旦开近光,日行灯应熄灭。这条和法规强相关,欧洲 ECE R87、国内 GB 也都有要求,漏测会被评审打回。
测试环境上,车灯我一般用”台架 + 实车”双轨。台架用 CANoe 发 0x101、监听 0x100,能把信号时序和优先级测得很干净;实车则补上”人眼确认”——有些灯的亮度、色温、点亮位置,仪器测不出,得靠主观评价。两者结合,覆盖率才完整。顺带一提,转向灯和双闪也属于 BCM 管辖:转向灯闪烁频率一般要求 1~2Hz、亮灭占空比约 50%,双闪要和转向互斥,这些参数都得进用例,别只盯着近远光。
图片引自微信公众号,扫码关注阅读原文① 发送 LightCmd=0x01,1s 内近光灯物理点亮,0x100.LowBeam_St=1;
② 在远光状态下发近光,远光维持、近光不叠加(按优先级规范判定);
③ 断开 CAN 后,硬线开关仍能控制示宽/近光;
④ 发动机运转且未开近远光,日行灯自动点亮;开近光后日行灯 500ms 内熄灭。
3.5 车灯控制 CAPL 测试脚本(完整可运行)
下面这段 CAPL 脚本,监听 0x100 状态报文,向 0x101 发控制命令,覆盖近光/远光切换,并在按键 ‘a’/’b’ 触发用例。在 CANoe 里新建一个 CAPL 节点挂到对应 CAN 通道即可直接跑。
/* ============================================================* BCM 车灯控制测试 CAPL 脚本* 监听 CAN 报文 0x100(车灯状态反馈)* 发送控制命令 0x101(车灯控制命令)* 适用:CANoe / CANalyzer CAPL 节点* ============================================================ */variables{message 0x100 msgLightStatus; // BCM 发出的车灯状态反馈报文message 0x101 msgLightCmd; // 测试台架发出的车灯控制命令msTimer tLightPoll; // 周期轮询定时器}on start{write("===================================");write(" 车灯控制测试脚本已启动");write(" 按键 a = 打开近光灯");write(" 按键 b = 打开远光灯");write("===================================");msgLightCmd.dlc = 8; // 数据长度 8 字节setTimer(tLightPoll, 200); // 每 200ms 轮询发送一次命令}on timer tLightPoll{output(msgLightCmd); // 周期发送控制命令,保持通信活跃setTimer(tLightPoll, 200);}// 监听 BCM 回传的车灯状态报文 0x100on message 0x100{byte b0 = this.byte(0);write("收到车灯状态 0x100, byte0 = 0x%02X", b0);if (b0 & 0x01) write(" -> 近光灯: ON");else write(" -> 近光灯: OFF");if (b0 & 0x02) write(" -> 远光灯: ON");else write(" -> 远光灯: OFF");if (b0 & 0x04) write(" -> 示宽灯: ON");else write(" -> 示宽灯: OFF");if (b0 & 0x08) write(" -> 日行灯: ON");else write(" -> 日行灯: OFF");}// 用例1:打开近光灯void Test_OpenLowBeam(){msgLightCmd.byte(0) = 0x01; // bit0 = 近光灯msgLightCmd.byte(1) = 0x00;output(msgLightCmd);write("已发送:打开近光灯 (0x101, byte0=0x01)");}// 用例2:切换远光灯void Test_HighBeam(){msgLightCmd.byte(0) = 0x02; // bit1 = 远光灯msgLightCmd.byte(1) = 0x00;output(msgLightCmd);write("已发送:打开远光灯 (0x101, byte0=0x02)");}// 用例3:关闭全部车灯void Test_AllOff(){msgLightCmd.byte(0) = 0x00;output(msgLightCmd);write("已发送:关闭全部车灯 (0x101, byte0=0x00)");}// 键盘触发,方便手动回归on key 'a' { Test_OpenLowBeam(); }on key 'b' { Test_HighBeam(); }on key 'c' { Test_AllOff(); }
3.6 转向灯与双闪:别漏掉的小兄弟
车灯里转向灯和危险报警灯(双闪)也归 BCM。它们的测试点很具体:转向灯频率一般要求 1~2Hz,亮灭占空比接近 50%;左右转向要独立可控;双闪开启时应让左右同步闪,且和转向指令互斥(开了左转再按双闪,应进入双闪优先)。这些参数看着小,却是法规项和用户高频感知项,建议单列用例,用示波器抓 LED 驱动端的占空比来验证,别只凭眼睛数闪。
用例管理上,车灯这章的每一条我都建议挂到需求 ID。比如”优先级””日行灯法规”分别来自 Spec 的哪一条,用例里写清楚。评审时评审员格外关心的就是”你的用例能不能覆盖我提的需求”,有追溯链,沟通成本直接降下来。同时把 CAPL 脚本命名和用例编号对应,回归时一键跑、结果自动比对,效率提升明显。
四、雨刮系统测试:雨量传感器与速度自适应
雨刮走的是 LIN。BCM 作为 LIN 主节点,接收雨量传感器的信号,再驱动雨刮电机从节点。这条链路比车灯”娇气”——LIN 是单线、速率低(峰值 20kbps),对时序和调度表特别敏感。
4.1 信号流向
雨量传感器 → CAN/LIN → BCM → LIN(帧ID 0x20 控制帧)→ 雨刮电机。雨量传感器给出 0~1023 的模拟等级,BCM 映射到间歇/低速/高速/自动四种模式。
4.2 四种模式怎么测
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
雨量标定是雨刮测试里容易翻车的地方。雨量传感器出厂有零点校准,装车后还要做”湿玻璃”标定。我遇到过传感器零点漂移,导致小雨不刮、大雨狂刮。所以用例里我会加一条:用可调光源或喷水模拟,从”无雨”缓慢增加到”暴雨”,确认 BCM 的换挡曲线单调、无跳变。清洗(wash)还要和雨刮联动——喷水的几秒内雨刮应自动补刮 3 次,这个联动也常被漏测。另外间歇挡的间隔要可标定,常见 2~6s 可调,实测间隔偏差应控制在 ±10% 内。
图片引自微信公众号,扫码关注阅读原文|
|
4.3 雨刮 LIN 总线测试 Python 脚本(完整可运行)
下面这段是纯逻辑模拟的 LIN 测试脚本,模拟发送 LIN 帧(含校验和),并验证 BCM 对雨刮模式的响应。它不依赖硬件,先帮你把用例逻辑跑通;上实车或台架时,把 send_lin_frame 换成真正的 LIN 接口调用即可。
#!/usr/bin/env python3# -*- coding: utf-8 -*-"""雨刮 LIN 总线测试脚本模拟 LIN 信号帧,验证 BCM 对雨刮电机的响应说明:此处用纯逻辑模拟演示,实车测试时把 send_lin_frame 换成硬件接口依赖:标准库即可运行(python3 直接执行)"""import time# LIN 帧定义(示例帧 ID,实际项目以 LDF 描述文件为准)LIN_WIPER_CTRL_ID = 0x20 # 雨刮控制帧 (BCM -> 电机)LIN_WIPER_STATUS_ID = 0x21 # 雨刮状态反馈帧 (电机 -> BCM)SPEED_MAP = {0: "停止", 1: "间歇", 2: "低速", 3: "高速", 4: "自动"}class WiperLINSimulator:"""模拟 LIN 主节点向雨刮电机发帧,并验证 BCM 调度逻辑"""def __init__(self):self.bcm_response = Nonedef send_lin_frame(self, frame_id, data):"""模拟发送一帧 LIN(含 classic checksum)"""if not data:raise ValueError("LIN 数据帧不能为空")checksum = (frame_id + sum(data)) & 0xFFframe = bytes([0x55, frame_id]) + bytes(data) + bytes([checksum])print(f"[TX] LIN 帧 ID=0x{frame_id:02X} 数据={data.hex()} 校验=0x{checksum:02X}")self._simulate_bcm_response(frame_id, data)return framedef _simulate_bcm_response(self, frame_id, data):"""模拟 BCM 收到命令后驱动电机的反馈"""if frame_id == LIN_WIPER_CTRL_ID:mode = data[0]enable = data[1]print(f"[RX] BCM 响应: 雨刮模式={SPEED_MAP.get(mode, '未知')} "f"电机使能={'是' if enable else '否'}")self.bcm_response = (mode, enable)def verify_response(self, expected_mode):ok = self.bcm_response is not None and self.bcm_response[0] == expected_modeactual = self.bcm_response[0] if self.bcm_response else Noneprint(f"[VERIFY] 期望={expected_mode}({SPEED_MAP.get(expected_mode)}) "f"实际={actual}({SPEED_MAP.get(actual)}) -> {'PASS' if ok else 'FAIL'}")return okdef run_wiper_cases():sim = WiperLINSimulator()results = []# 用例1:触发自动模式(雨量传感器上报大雨)sim.send_lin_frame(LIN_WIPER_CTRL_ID, [0x04, 0x01])results.append(sim.verify_response(0x04))time.sleep(0.1)# 用例2:切到高速sim.send_lin_frame(LIN_WIPER_CTRL_ID, [0x03, 0x01])results.append(sim.verify_response(0x03))time.sleep(0.1)# 用例3:切到间歇sim.send_lin_frame(LIN_WIPER_CTRL_ID, [0x01, 0x01])results.append(sim.verify_response(0x01))time.sleep(0.1)# 用例4:关闭雨刮sim.send_lin_frame(LIN_WIPER_CTRL_ID, [0x00, 0x00])results.append(sim.verify_response(0x00))passed = sum(1 for r in results if r)print(f"\n==== 雨刮用例结果: {passed}/{len(results)} 通过 ====")return all(results)if __name__ == "__main__":ok = run_wiper_cases()print("整体结论:", "全部通过" if ok else "存在失败用例,请排查")
五、天窗测试:防夹保护与防翘安全
天窗是 BCM 里安全等级较高的功能——它带防夹(anti-pinch),夹到人会有伤害风险。这块测试我格外较真。
5.1 防夹原理与法规阈值
天窗电机内置霍尔传感器,实时检测转速/电流。当遇到障碍物阻力上升,电机电流会突变。BCM 监测到力矩超过防夹力矩阈值时,立刻停止并反向回收(约 150~200mm),这就是防夹动作。
|
|
5.2 手动 / 自动模式
- 手动模式:
按住开关,天窗随动;松开即停。防夹仅在”自动关闭”路径生效(手动点动一般不触发反向,但部分企标要求手动也防夹,要看规范)。 - 自动模式:
轻触一下,天窗自动跑到全关/全开;途中遇阻则防夹反向。这是防夹测试的核心路径。
补充技术细节:防夹判断的核心是前级霍尔传感器算出的”位置 + 速度”。BCM 通过霍尔脉冲数估算天窗位置,通过脉冲间隔估算速度;遇阻时速度骤降、电流骤升,二者联合判定障碍。所以天窗的”位置自学习”(初次上电学习全程行程)也很关键——学习不准,防夹阈值就会偏移。我会专门测一次断电复位后的自学习是否准确,并确认自学习期间若有障碍能安全中止。手动模式本身也有歧义:部分企标要求手动点动也防夹,部分只要求自动防夹,这条必须翻 Spec 确认,不能拍脑袋。
5.3 防翘安全
天窗除了”滑动”,还能”翘起(tilt)”。翘起状态下若遇阻,也应有限位/防翘保护,避免夹伤或机构卡死。很多项目只测了滑动防夹,漏了翘起防夹——这正是第六章程的真实事故源头。
图片引自微信公众号,扫码关注阅读原文5.4 天窗防夹测试用例表(详细参数 + 判定标准)
这张表是我项目里实际在用的,参数和判定都写清楚了,可直接搬进你的用例管理工具
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
六、实战讲解:天窗防夹功能漏测的真实项目复盘
这一章是全文重点。它不是教科书,是我真实踩过的坑。事情发生在我带的一个量产项目,SOP(量产启动)前两周。
|
故事开始:项目进入试生产(PV),我们在做整车耐久。一天,负责主观评价的小伙子把一瓶水卡在天窗关闭路径上做”防夹随手测”,结果天窗没反向,直接把瓶子压变形了。我们一开始的反应是”偶发”,重新测了三次,两次没防夹。这才意识到:防夹在某些条件下是失效的 |
6.1 漏测背景
回顾我们的测试计划,防夹用例只覆盖了滑动关闭(slide close)的自动模式,而且障碍物只放在了”全程中段”。也就是说,我们默认了三个前提:
-
用户只用自动模式关天窗 -
障碍物一定在滑动中段 -
翘起(tilt)模式不需要防夹
这三个前提,每一个都错了。
6.2 测试用例缺失分析
我们用”5 Why”往下挖:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
看到 Why5 就明白了:我们抄了旧模板,却没核对本项目的防夹算法差异。末端 5% 禁用防夹是本项目为”关严”加的逻辑,旧模板根本没有这一条,于是用例天然缺了一块。
|
关键教训:照搬用例模板是测试的大忌。每一个项目的算法、阈值、禁用区间都可能不同。模板只能当起点,必须对照本项目的 Function Spec 逐条核对 |
6.3 补充用例设计
我们连夜补了三类用例:
- 位置覆盖:
把障碍物放在 5%、15%、30%、50%、70%、85%、95% 行程,逐一验证防夹。特别把 95% 末端单列,确认禁用区是否真的安全(结论是:禁用区内若遇障碍应改为”保持当前位置、不再下压”,而非硬压)。 - 翘起防夹:
补齐 SRF-TILT-01,验证翘起路径遇阻保护。 - 连续与组合:
连续两次防夹后保持打开;防夹过程中断开 LIN 的安全降级。
图片引自微信公众号,扫码关注阅读原文怎么衡量这次补测值不值?我们拉了两个指标:漏测密度(每千条用例中遗漏的高风险路径数)和缺陷逃逸率(流到 PV 之后的 BCM 缺陷数)。补测前逃逸率偏高,补完并固化流程后,连续两个项目 PV 阶段 BCM 缺陷数下降明显。用数据说话,比”我觉得测够了”有说服力得多,也更容易争取到测试资源。
6.4 回归验证结果
补完用例后,开发同步改了两处:
-
防夹禁用区从”末端 5%”收窄为”末端 2%”,且禁用区内遇阻改为”保持位置”而非硬压; -
翘起路径补上防夹逻辑。
我们用 7 条补充用例做了三轮回归,全部通过。后续在 PV 阶段追加了 200 次防夹耐久,无失效。SOP 没有延期。这件事后来成了团队内部的经典复盘案例。
|
|
七、故障注入测试:信号短路/断路/CAN丢失
本章讲故障注入(fault injection)。这是验证 BCM 健壮性的手段:故意制造故障,看它会不会”发疯”。我常用的有四类。
7.1 四种故障场景
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7.2 降级策略怎么验证
BCM 的降级(degradation)是分层的。我验证时遵循一条原则:越靠近安全的故障,降级越保守。
- CAN 丢失:
车灯应退回到硬线控制(保照明);天窗应停在当前位置、禁止自动动作(防夹失效风险);雨刮保持当前挡位不再变速。 - LIN 丢失:
对应从节点功能失效,但 BCM 要能报出具体故障码(DTC),且不能影响其他 LIN 从节点和 CAN 功能。 - 硬线故障:
短路要能限流保护,不能烧毁驱动芯片;断路要能识别为”无输入”,不能误动作。
|
|
再补一类常被忽略的:网络管理(NM)超时。CAN 网络靠 NM 报文维持唤醒,若 NM 超时(常见 2~5s 无 NM),BCM 应判定网络休眠并进入对应低功耗状态;NM 恢复后应在规定时间内重新参与通信。
7.3 故障恢复的隐性用例
很多人只测”故障中“的表现,忘了测”故障恢复“。故障解除后,BCM 应自动恢复到正常状态,且不保留错误的故障记忆(或按规范保留 DTC 待诊断清除)。
我会专门加一条:解除故障 → 等待恢复时间(一般 < 3s)→ 功能恢复正常。这条能抓出不少”故障解除后功能卡死”的隐性 bug。
故障注入的收尾动作是”读 DTC”。每注入一类故障,我都会用 UDS 0x19 把 BCM 当前故障码读出来,和预期 DTC 列表比对——不但要”故障中行为对”,还要”故障码记录对”。工具上,建议用成熟的故障注入箱(FIU)配合程控电源和负载箱,别用飞线手工短接。一来可重复,二来安全,三来能记录每次注入的精确时序,方便回归比对。DTC 记录后还要验证清除流程:用 0x14 清码后,相关故障应不再置位,除非故障依旧存在。
把 FIU、程控电源、CAN/LIN 接口都接到测试管理软件,用脚本跑”注入-等待-读 DTC-恢复“的完整序列,一晚上能覆盖上百种故障组合。我建议至少把”四类基础故障 × 各功能”做成自动化基线,释放人力去做探索性测试——那才是人和机器分工的正确方式。
|
|
