ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于VH6501与CANoe的CAN总线Busoff故障注入测试实践

基于VH6501与CANoe的CAN总线Busoff故障注入测试实践 做CAN总线测试的工程师对Busoff这个词应该不陌生节点在总线上连续出错错误计数器达到协议阈值之后控制器的发送器被硬件关断节点从总线上“消失”。但真正到了要复现它的时候很多人会犯难——总不能真拿手去掐CAN线吧用Vector VH6501配合CANoe 11.0来做这个故障注入可控、可重复还能把节点进Busoff前后的整条时间线完整抓下来。这篇文章我把硬件接线、通道配置、干扰注入参数、CAPL脚本和常见踩坑一起梳理清楚适配刚接触VH6501的中级测试工程师做整车网络和控制器验证的朋友也可以直接参考。1. 先把Busoff机制讲透1.1 错误计数器是怎么累加的CAN总线之所以能在恶劣的电磁环境下稳定工作靠的是一套错误检测与错误计数机制。每个CAN节点内部都有两个关键计数器发送错误计数器TECTransmit Error Counter和接收错误计数器RECReceive Error Counter。节点每检测到一次发送错误TEC会按规则增加比如发送节点在发送过程中发现位错误TEC加8如果错误帧的标志位也出错还会继续累加。当TEC或REC超过127时节点从Error Active变为Error Passive此时它仍然可以参与总线通信但发送错误标志时只能发被动错误标志。真正关键的是下一个阈值当TEC超过255节点直接进入Bus Off状态。硬件会把发送器关断节点既不能发送报文也不能正常接收总线上的数据仿佛从网络上“拔线”了。这个机制是CAN协议为了隔离故障节点、防止单个损坏节点拖垮整个总线而设计的。恢复也不是瞬时的。CAN标准规定节点要连续检测到128次“11个连续的显性位”才能完成Bus Off恢复条件之后TEC清零并重新参与通信。这意味着Bus Off不是一次性的开关动作而是一个有时间窗口的状态。测试时从重启到恢复之间会有一段对整车功能来说“失控”的空窗期这也是很多ECU软件里需要重点监控的故障场景。1.2 为什么要用工具主动“造”出Busoff实际路采中Bus Off多半由线束串扰、接插件松动、大功率负载切换等偶发因素引起复现概率低、时间点随机。靠实车去“碰运气”做Bus Off测试既不能保证重复性也很难配合调试窗口观察到节点进入Bus Off前后的内部状态变化。用工具主动注入Bus Off的好处很明显时间可控、强度可控、次数可控。测试人员可以指定在某个网络管理帧发完后再开始注入也可以在DUT发送某个特定报文时精确地“打断”它确保DUT的TEC按预期增长。VH6501这类设备的强项就在这里它能以微秒级的时间精度在总线物理层施加干扰产生的错误帧能被CANoe完整记录进而跟DUT的故障码、状态位、网络管理行为做关联分析。我之前在项目里做过一个ADAS域控制器的Bus Off恢复测试如果不主动注入这类故障可能跑一整天也触发不了几次。用VH6501做定时干扰之后整个失败案例从不可控变成了可重复的标准化测试项效率提升非常明显。2. VH6501 CANoe 11.0 环境搭建2.1 VH6501到底是个什么设备VH6501是Vector推出的一款紧凑型CAN接口与干扰注入设备拿来做余量测试和故障注入特别方便。它的体积比普通的CANcaseXL还要小但功能上很有针对性设备提供两路CAN通道其中一路可以配置为测量通道负责正常的报文收发和监控另一路可以配置为干扰通道专门用来在总线上注入各种物理层故障。常见的干扰类型包括CAN_H对地短路、CAN_L对地短路、CAN_H与CAN_L互短、总线断路以及强制总线进入显性状态等。模拟Bus Off时我们最常用的是“强制显性”或者“CAN_H与CAN_L短路”这两种方式。它们的本质都是让目标节点发出去的隐性位被覆盖成显性位从而在接收侧形成错误帧触发TEC不断累加。VH6501和CANoe 11.0的配合非常紧密。在工程里把设备识别出来后CANoe会自动为它分配硬件通道用户只需要在“Network Hardware”窗口里指定每个通道的角色即可。相比用继电器搭一套物理短路装置VH6501的软件配置方式更安全而且不需要断电操作测试过程中可以随时打开或关闭干扰注入。2.2 硬件接线与注意事项接线时先把VH6501的供电连好这个设备需要独立供电不是单靠USB就能稳定驱动。USB线可以同时用于和PC之间的通信但建议使用带屏蔽的线缆避免在注入大干扰时数据链路不稳定。总线侧把VH6501的CAN1按照正常CAN网络的方式并联到被测总线上。需要注意CAN_H和CAN_L的顺序不能接反同时要确保网络两端有正确的终端电阻。如果被测总线是台架上的临时走线终端电阻的匹配尤其重要否则干扰注入后波形反射会很严重测试结果不具备参考性。如果被测节点本身就是DUT还要注意节点地与VH6501的地电位保持一致。日常测试中遇到过因为地电位不一致导致干扰注入后误伤多个节点的情况排查了很久才发现是接地点的问题。这里的建议是VH6501的电源地、DUT的地、CANoe测试电脑的地尽量接到同一个参考点。2.3 CANoe 11.0 里的通道映射与配置打开CANoe 11.0后先从“Hardware → Network Hardware”进入硬件配置界面。这个版本对VH6501的识别已经很傻瓜化插上设备后刷新一下就能看到。下图是我这个工程里的实际配置界面左边硬件树展开之后能看到VN6501设备它有两个通道CAN1和CAN2。我把CAN1的“Channel Usage”设成“Measurement”用来监控总线上所有报文同时参与正常的仿真发送CAN2设成“Interference”专门用于故障注入。这里有一个容易忽略的点两个通道的Bit rate都要和被测网络一致。工程里常用的是500 kbit/s那VH6501的测量通道和干扰通道也都配成500 kbit/s。如果干扰通道的通信速率设置与总线不一致VH6501可能无法准确判断哪些位是显性位干扰效果会大打折扣。设置完成后在“Channel Mapping”里把工程里的网络和物理通道绑定CANoe的Simulation Setup才能正确引用到设备。3. 模拟Busoff的核心原理与关键配置3.1 用“显性干扰”去触发TEC累加Bus Off的触发路径很清晰让目标节点在发送过程中反复出错TEC一路超过255。要实现这一点核心动作就是在目标节点发送的帧上“做手脚”。CAN的信号电平分为显性和隐性。显性位会覆盖隐性位如果总线上同时出现两个节点一个发显性、一个发隐性隐性节点会检测到位错误并立刻认为总线出错。VH6501的干扰通道就能模拟这种“强占总线”的行为在目标节点发送报文的窗口内强制把总线拉成显性电平。目标节点发隐性位时发现读到的是显性就会累计发送错误计数。需要注意的是干扰并不需要对每个位都做覆盖只要让目标节点的报文在传输过程中产生错误标志TEC就会增加。通常一个完整的错误过程会让发送节点的TEC加8累计32次错误即可从TEC0推到256以上。对于周期10ms、100ms的报文来说持续几百毫秒的干扰就能让一个正常节点进入Bus Off。3.2 干扰注入的参数周期、脉宽与触发方式在实际配置里VH6501的干扰注入参数主要由三部分组成触发源、干扰时长和干扰类型。触发源可以选定时触发也可以选总线事件触发。定时触发适合做周期性的Bus Off模拟比如每5秒注入一次用于验证网络管理状态机的切换总线事件触发更适合针对特定报文做精确打断比如监控到目标DUT发出0x123帧后立刻启动干扰。干扰时长决定了总线被破坏的时间窗口。比如把干扰时长设为10ms而目标报文的周期正好是100ms那么一次干扰大概能覆盖到一帧报文的完整传输窗口。若希望快速进入Bus Off可以把时长加大或者缩短触发间隔让TEC在一个连续的时间段内持续累加。干扰类型我建议优先选择“Force Dominant”或者“CAN_H short to CAN_L”。这两种方式都能制造出足够多的位错误。早期的测试中我习惯用CAN_H对地短路但它在某些收发器上触发的错误并不是很稳定后来在CANoe里对比测试之后发现强制显性的方式对不同的CAN收发器兼容性更好Bus Off触发时间也更可预期。3.3 用CANoe建立被测节点的发送环境要观察Bus Off总线上必须有一个正在正常发送报文的节点。可以用真实的DUT连到总线上也可以用CANoe的IG模块仿真一个节点。我这边通常的做法是把VH6501的测量通道绑定到CANoe的仿真网络上用IG模块周期发送目标报文同时用CAPL脚本判断是否进入了Bus Off。如果目标是真实DUT则IG模块可以停用取而代之的是DUT自身的应用报文。此时VH6501的干扰通道主要负责“攻击”DUT的发送窗口CANoe则作为旁观者持续记录总线上出现的错误帧和DUT的报文消失点。这里建议在Trace窗口里开启错误帧显示否则只看正常报文容易遗漏关键时间点。还有一点很实用在CANoe里可以用“Error Counter”窗口实时查看VN6501通道上节点的发送错误计数。虽然这个窗口不一定能直接显示真实DUT内部的TEC值但通过总线上的错误帧数量可以反推出目标节点是否在不断累加错误。结合DUT的诊断反馈就能明确判断它是否已经进入Bus Off。4. 从零到一的实操流程4.1 创建工程与导入数据库第一步自然是新建一个CANoe 11.0工程。选择“CAN”模板然后在“Simulation Setup”里添加一个网络。下一步导入DBC文件把被测总线的报文和信号定义加载进来。如果没有现成的DBC也可以先用网络通道的原始收发功能验证链路但建议还是建一个最小的DBC方便观察报文发送周期和信号值变化。硬件配置窗口里把VH6501加入工程。如果系统里同时装了其他Vector硬件注意区分设备序列号避免选错通道。加入之后按照第二章里的方式设置好测量通道和干扰通道并在“Channel Mapping”里绑定到对应的网络名称。4.2 干扰通道的图形化配置在CANoe 11.0中VH6501的干扰参数可以直接在设备配置页面里改。主要设置项包括干扰使能开关默认关闭测试中通过CAPL或手动控制干扰类型选择“Force Dominant”或“Short Circuit”触发条件定时触发或事件触发干扰时长以毫秒为单位。我一直强调把初始干扰时长设得保守一点。比如先从5ms开始观察Trace窗口是否出现错误帧再逐步增加。这样做一方面是为了避免干扰过强导致总线长时间被“锁死”另一方面也能帮助定位干扰通道是否真的作用在目标节点上。如果5ms就有明显错误帧说明链路没问题后面就可以放心地加大时长。4.3 CAPL脚本怎么设计干扰逻辑虽然图形界面可以手动开启干扰但工程化测试里还是需要用CAPL脚本把干扰逻辑自动化。下面是一段我常用的测试框架核心函数按功能拆成开启/关闭干扰两个接口/* 定义总线报文 */ message 0x123 DUT_PeriodicMsg; /* 开启Busoff干扰注入 */ void StartBusoffSimulation() { // 调用VH6501干扰控制接口启动“强制显性”干扰 // 具体函数名视CANoe版本而定我这里做了封装 VH6501InterferenceStart(); write(Busoff interference started.); } /* 停止干扰注入 */ void StopBusoffSimulation() { VH6501InterferenceStop(); write(Busoff interference stopped.); } on key s { StartBusoffSimulation(); } on key e { StopBusoffSimulation(); }这段脚本只是一个控制壳子实际工程里还要加上时序判断。比如等目标报文发出20帧之后再启动干扰或者每1000ms执行一次“开-等-关”的循环。CAPL里的定时器配上干扰开关能很容易编出“每10秒触发一次Bus Off”的测试序列。4.4 运行测试与观察关键时间点脚本跑起来之后在CANoe的Trace窗口里能看到非常明显的现象干扰开启的瞬间总线上开始出现错误帧同时DUT的周期报文会突然消失。这个消失点就是Bus Off的入口。配合CANoe的“Bus Statistics”窗口可以看到错误帧的统计数据在快速增长。如果DUT是真实ECU在Bus Off之后可以继续观察它的诊断状态。有的ECU会在网络管理报文里上报Bus Off相关故障码有的则要等恢复之后才能读到。这个差异本身也是测试要记录的。下一步通常是把干扰通道关闭然后观察DUT何时恢复通信。恢复时间的长短可以直接用CANoe的触发点和时间戳来量化。4.5 验证进入Busoff的几个辅助手段除了看Trace窗口的报文消失还可以用以下手段增强说服力CANoe里打开“Error Counter”窗口观察总线上错误计数的峰值用示波器接CAN_H和CAN_L抓取进入Bus Off瞬间的电平变化让DUT通过UDS诊断读取内部状态如果DUT支持相关DID或DTCBus Off的状态会直接映射出来。这三种手段配合使用基本能确定节点是否真的进入了Bus Off以及恢复是否按预期完成。5. 常见问题与避坑指南5.1 现象与原因排查表下面这个表格是我在实际项目里总结出来的高频问题遇到异常时可以先对照排查现象可能原因处理方式干扰开启后总线上没有错误帧干扰通道速率和总线不一致检查VH6501两路通道的Bit rate配置一干扰就导致所有节点掉线干扰时长过长或触发频率过高减小干扰时长改为周期触发只有少量错误帧DUT始终不进Bus Off干扰未覆盖到DUT发送窗口改用事件触发在DUT发送特定帧后启动干扰DUT进入Bus Off后迟迟不恢复干扰仍持续存在或DUT恢复逻辑有特殊要求先关闭干扰再检查DUT的恢复策略测试时CANoe与VH6501连接不稳定USB线屏蔽差或地电位不一致换屏蔽线统一参考地5.2 几条实用的坑边心得第一终端电阻非常关键。在做Bus Off注入时总线上如果缺少终端电阻干扰波形会出现振铃严重时甚至会让CANoe本机也产生误码测试数据就完全不可信了。建议在搭建台架时就把终端电阻状态固定下来并在每次测试前用万用表确认。第二尽量不要在整车网络或者重要通信较多的环境中长时间持续干扰。Bus Off本身是一种故障隔离机制但在测试台架上如果一些节点进入Bus Off后触发了不期望的降级策略会干扰联调进度。稳妥的做法是先在小网络、独立台架上验证干扰参数再迁移到整车级环境。第三VH6501的干扰通道在测试结束后一定要确认处于关闭状态。我在一次联调中遇到过因为忘记关闭干扰通道导致模拟器上其他同事的数据一直出现高错误率的尴尬问题。现在我的习惯是测试结束首先把设备配置界面里“Interference Enable”关掉然后再做后续操作。第四如果被测ECU对Bus Off的恢复策略有特殊要求比如需要“下电重启”或者“外部唤醒”那在做自动恢复测试时就要在CAPL脚本里加入对应的唤醒序列。仅仅关闭干扰并不能让这类DUT自动回到正常通信状态。最后分享一个经验用VH6501模拟Bus Off这件事门槛其实不在设备操作而在于对CAN错误计数机制的理解。只要把TEC累加的逻辑想明白参数怎么配都不会偏。后续还可以把这个测试扩展成自动化脚本把“注入参数—Bus Off时间—恢复时间”全部记录到测试报告中让Bus Off从一个偶发故障变成可以量化的标准测试项。
返回列表