ARTICLE DETAIL

资讯详情

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

TSMaster全链路CAN报文过滤配置实战:从硬件到软件

TSMaster全链路CAN报文过滤配置实战:从硬件到软件 一个多月前我在试验车上调试 VCU 与 BMS 的交互逻辑整车 CAN 网络负载本来就不低我又开着 TSMaster 在记录总线数据结果一个小时不到日志文件就突破了 1GB。更要命的是 Trace 窗口每秒刷出几百帧无关报文我盯着屏幕想找自己想要的那帧眼睛都快花了。后来我把问题拆开来看发现根子不在 TSMaster而在于我根本没有把报文过滤真正做起来——从硬件层到软件层的全链路过滤一处都没配。这篇文章就把我这一路的配置经验完整写出来。从同星 CAN 适配器的硬件接收滤波器开始一路讲到 TSMaster 软件里的 Trace 过滤、统计过滤、录制过滤再到 DBC 信号级过滤和脚本自定义过滤最后是三级过滤器同时开启时的联调方法和常见坑位。内容不涉及高深理论全是实际操作路径和踩坑记录适合做总线测试、ECU 开发、整车调试的工程师参考。1. 总线过载不是个例一个真实抓包现场引发的过滤需求很多人用 TSMaster 的第一反应是软件挺好用就是窗口太乱。其实乱的不是软件是数据。要理解全链路配置的价值得先看清楚默认状态下的 TSMaster 到底在干什么。1.1 默认设置下TSMaster 会把总线上所有报文都收进来TSMaster 默认的报文接收策略是来者不拒。这也是它作为通用总线分析工具的定位决定的在不确定你要看什么之前先把所有报文都收上来。但实际工程场景中你通常只需要关注某几个节点、某几条报文甚至某几个信号。把整条总线上的数据全盘接收至少带来三个问题。第一个问题是内存和日志膨胀。标准 CAN 帧虽然只有几个字节的数据但加上时间戳、通道号、方向、帧类型这些附加信息后一条记录轻轻松松占用几十甚至上百字节。整车一跑起来每秒几千帧稀松平常。按 3000 帧/s 算一个小时的原始日志就是上 GB 级别。日志一大后续回放、分析都变得很重拷文件、开文件都比平时慢几倍。第二个问题是人在回路上。Trace 窗口每秒刷新几百行时人眼根本无法追踪目标报文。想把一条故障帧前后的时序理清楚基本得靠暂停加肉眼搜索效率极低。更麻烦的是窗口刷太快时 PC 的 GUI 线程容易卡顿操作起来一卡一卡的连暂停都要等半秒才响应。第三个问题是分析效率下降。总线负载率、报文周期、调度分析这些功能如果输入数据里混着大量无关帧统计结果会被稀释。你关心的是某个节点报文的周期抖动结果统计窗口显示的是全网的报文数跨度太大根本看不出问题。这三个问题叠加起来会让人误以为 TSMaster 不好用实际上问题出在过滤没有配置好。1.2 全链路过滤到底分几层我倾向于把报文过滤分成四个层级。注意这里说的层级是按数据流动的先后顺序排的不一定每个层级都有独立配置界面但它决定了过滤发生在哪个阶段以及最终效果如何。层级工作位置过滤发生的时机规则灵活度性能收益L1CAN 控制器硬件报文被控制器接收的一瞬间低ID 掩码/列表最高L2同星设备固件/驱动报文传输到 PC 之前中可做多规则高L3TSMaster 应用内核PC 接收后、窗口显示前高ID/通道/信号中L4离线分析/日志回放数据落盘后的后处理最高无越靠近总线过滤发生的时机越早性能收益越大但规则灵活度越低。越靠近应用规则越灵活但此时数据已经完整进到 PC 了收益只是眼不见心不烦和少写一点日志。这篇文章的核心思路就是从 L1 一路配到 L4这也是全链路三个字的意思不是任何一个窗口的过滤按钮而是从硬件到软件逐层设防。回到我开头说的场景如果从一开始就把硬件过滤配好把整车上万个 ID 收窄到 VCU 和 BMS 相关的几十个 ID日志不会膨胀到 1GBTrace 也不会刷屏。2. 第一关同星 CAN 适配器硬件接收过滤的配置细节硬件过滤是整个链条里收益最大、但最容易被忽略的一层。很多人以为 TSMaster 的过滤就是窗口上的小漏斗其实同星 CAN 适配器本身就有很强的接收过滤能力。2.1 掩码模式与列表模式怎么选同星 CAN 适配器也包括市面上大多数 CAN 卡的硬件过滤本质上是配置 CAN 控制器内部的接收过滤器。只有满足过滤条件的报文才会被写入控制器的接收缓冲区进而被固件上传到 PC其余报文在物理层面就被丢弃了。具体到实现CAN 控制器的过滤机制主要有两种模式。掩码模式一个 Mask 值加一个 ID 值。Mask 中某一位为 1表示这一位必须与 ID 值对应位完全一致Mask 中某一位为 0表示这一位不关心。用一个生活类比来理解掩码模式有点像只认门牌号前三位是 101 的这一整层只要你在这一层不管住哪个房间都算通过。举个例子要接收 ID 0x100 到 0x1FF 这一个连续的 256 个标准帧 ID可以这样配置ID 值设为 0x100Mask 值设为 0x700。因为 0x700 的二进制是 111 0000 0000表示高 3 位必须匹配 0x100 的高 3 位001低 8 位不关心。这样匹配的范围恰好就是 0x100 到 0x1FF。列表模式直接写一个允许接收的表表里可以是单个 ID也可以是 ID 范围。控制器收到报文后按表逐一对比。优点是直观一眼能看到放行哪些 ID缺点是表的条目数量有限常见控制器一般只有几十条以内超出就压不进去。选择建议过滤目标是连续 ID 段时用掩码模式一条规则覆盖一大片过滤目标是多个零散 ID 时用列表模式当列表条目快用完时把能合并的 ID 段合并成掩码规则释放条目给零散 ID。实际项目里往往是两种模式混着用比如列表放几个关键零散 ID掩码覆盖一个连续区间。2.2 TSMaster 硬件配置页面的实操路径TSMaster 里操作同星设备的配置路径很直观主界面工具栏点硬件配置图标进入后选择设备类型和序列号然后对每个通道做参数设置。我以大多数同星 USB-CAN 设备的通用配置界面为例不同版本菜单位置可能略有出入但核心选项一般都在通道参数页签下。配置流程大致如下打开硬件配置界面确认设备已被识别。这一步如果设备列表为空先检查 USB 线缆和驱动。选择通道CAN1/CAN2看设备型号。配置波特率和采样点注意要与总线上各节点保持一致。采样点位置不对报文就会出现偶发错误。找到接收过滤或Acceptance Filter设置项有的版本叫报文滤波。选择过滤模式掩码/列表。对标准帧和扩展帧分别配置因为两者 ID 位数不同混在一起配容易出错。重点提示配置完成后通道要重启才生效。而且某些同星设备对重启的定义是重新打开通道不是断电重插。改完配置后建议把设备拔插一次或重启 TSMaster再观察过滤是否真正生效。还有一个容易漏掉的细节如果设备是多通道的每个通道都有自己的过滤配置。你从 CAN1 过滤了CAN2 还是全收。别只改一个通道就去抓数据否则另一路数据会给你一种过滤了但还是乱的错觉。2.3 SFF/EFF 和 CAN FD 的过滤边界硬件过滤有一个容易踩的边界标准帧和扩展帧的 ID 位宽不同。标准帧 ID 是 11 位范围 0x000-0x7FF扩展帧 ID 是 29 位范围 0x00000000-0x1FFFFFFF。在配置硬件过滤器时有的设备提供了标准帧/扩展帧分开配置的选项有的则是一个过滤规则同时作用在两种帧上。如果混用很可能出现标准帧过滤正常扩展帧乱收或者反过来。CAN FD 帧也要单独说。CAN FD 与经典 CAN 的仲裁过程兼容ID 和过滤机制本质上一样。但有些控制器的过滤器支持按 FD 标志过滤也就是只接收 FD 报文或只接收经典报文。需要的时候可以配置不需要的时候保持不过滤帧类型否则 FD 报文会被无声无息地滤掉而你可能根本不知道——等到分析时才发现该有的 FD 报文一条都没有。另外特别提醒硬件过滤器一般不处理错误帧和过载帧。你开了硬件过滤之后错误帧是否上报取决于设备驱动层的错误帧使能设置不要在硬件过滤配置里找错误帧选项。这个细节在排查总线质量问题时很关键因为有时候你看不到错误帧并不代表总线上没有而是被某种过滤机制屏蔽了。3. 第二关TSMaster 软件层常用的三处过滤入口硬件层过滤完以后数据量已经大幅下降但 TSMaster 软件层还有自己的过滤逻辑需要配置。这一层主要解决显示什么、统计什么、记录什么的问题。3.1 Trace 窗口条件过滤怎么建Trace 窗口是 TSMaster 最常用的窗口也是刷屏重灾区。好在它支持条件过滤只是界面入口藏得有点深。操作路径一般是在 Trace 窗口空白处右键弹出菜单里找过滤器或Filter相关选项或者看窗口工具栏有没有漏斗图标。点击后可以新建过滤规则。规则里常用的条件有报文 ID可以填单个 ID也可以填一个范围通道选择 CAN1、CAN2 等方向发送 TX、接收 RX帧类型数据帧、远程帧、错误帧总线类型CAN、CAN FD、LIN建好规则后回到 Trace 窗口把规则挂到窗口上。一个窗口可以同时挂多条规则多条规则之间一般是或的关系——满足任意一条就显示。这个逻辑和直觉相反不是叠加过滤而是叠加放行。我建议给每条规则取一个一眼能看懂的名字比如只看VCU_CAN1记录BMS_300段。过滤规则一旦多起来名字就是命根子。现场调试时你不可能一条条点开看内容只能靠名字快速定位。注意Trace 窗口的过滤只影响显示不影响 TSMaster 内部接收和记录。换句话说数据其实还在只是不显示。这一点和硬件过滤有本质区别。3.2 报文统计窗口与图形窗口的过滤设置Trace 窗口解决了显示层面的问题但 TSMaster 里还有两个窗口值得单独设置过滤报文统计窗口和图形窗口。报文统计窗口有的版本叫 Bus Statistics / Message Statistics默认统计的是全网报文。如果你把关注范围切成某几个 ID统计结果会精准很多周期、帧数、负载率都能聚焦到目标节点上。操作上一般是右键统计窗口选择过滤设置或统计对象设置把要统计的 ID 段加进去。有一个重要的经验如果开启了硬件过滤总线的真实负载率在统计窗口里是看不出来的。因为硬件过滤已经把大量报文丢掉了统计窗口只能反映漏进来的流量不能代表物理总线的真实负载。想看真实负载率得在不过滤的通道上看或者单独开一个不启用过滤的监控通道。这个细节很多人等到出问题才反应过来。图形窗口Graphics本质上是按信号解析的。加载 DBC 后从数据库浏览器里把信号拖到图形窗口它只画你拖进去的信号这本身就是一种信号级过滤。很多人喜欢在图形窗口看车速、转速等连续量不需要看报文列表就不需要在 Trace 窗口里反复过滤。统计窗口和图形窗口的过滤尽量与 Trace 窗口保持一致。如果你在 Trace 里只看 VCU 报文统计窗口却还在统计全网那两组数据对不上现场很容易误判。3.3 录制与回放时的过滤策略TSMaster 支持总线数据录制和回放。录制功能同样可以挂过滤规则而且这个功能的价值经常被低估。录制时设置过滤可以只把关注的报文写进日志日志体积能降一个数量级。我之前的例子就是最直接的说明同样的工况过滤前 1 小时 1GB过滤后只有 180MB 左右。做长周期耐久测试时这一点尤为重要——存储卡被写满的后果经历过的人都懂。回放时也可以挂过滤。常见场景是用实测数据给某个 ECU 做回归测试只回放它关心的报文其他节点的报文全部滤掉。但这里有一个坑如果被回放的 DUT 需要另一个节点的信号作为输入你把那个节点的报文滤掉了DUT 会进入异常状态。所以在做回放过滤时一定要先弄清 DUT 的输入依赖宁可多放不要少放尤其在做闭环测试的时候。4. 第三关DBC 信号过滤与脚本自定义过滤按 ID 过滤只能解决看哪些报文的问题但有些场景的过滤条件更细比如只记录电池温度超过 60 度时的报文。这时候就要进入信号级过滤和脚本过滤的领域。4.1 按信号值过滤不做全量记录只留关键时刻按信号值过滤的前提是加载对应的 DBC 文件。TSMaster 里加载 DBC 后报文可以按信号展开在 Trace 窗口看到的就不再是一串十六进制数据而是带物理值、带单位的信号列表。在此基础上可以做条件记录设置当某信号值满足条件时记录该时刻前后一定时间范围内的所有报文。这个功能对故障复现非常有用。举个实际例子电池管理系统在温度过高时会有一些保护动作你想抓取温度超过 60 度的瞬间前后各 5 秒的总线数据手动操作根本来不及只能靠条件记录。具体操作上TSMaster 的条件记录一般需要借助触发器或事件模块或者直接用脚本实现。如果版本里没有现成的信号阈值过滤入口最通用的做法是写脚本进入报文事件先判断 ID再用 DBC 解析出信号值最后决定是否写入日志或者输出到 Trace。4.2 C# / Python 脚本自定义过滤的写法TSMaster 内置脚本引擎官方主推 C#也有 Python 插件。用脚本做报文过滤最大的好处是规则完全自定义什么条件都能写不受界面功能限制。脚本过滤的典型写法订阅接收报文事件在回调里判断报文 ID 和数据内容满足条件再做后续处理。下面给一个简化示例具体 API 以你安装的 TSMaster 版本为准。// TSMaster C# 脚本 - 按条件处理接收报文 public override void OnRxMessage(Message message) { // 只看 ID 0x123 的报文 if (message.ID ! 0x123) { return; } // 用 DBC 解析信号判断物理值 // GetSignalValue 的具体调用方式以版本 API 为准 double temperature GetSignalValue(message, Temperature); if (temperature 60.0) { Output.WriteLine($时间:{message.TimeStamp} 温度:{temperature:F1}℃); } }# TSMaster Python 脚本 def OnRxMessage(msg): if msg.ID ! 0x123: return temp db.GetSignal(BMS, Temperature, msg) if temp is not None and temp 60.0: print(f时间:{msg.TimeStamp} 温度:{temp:.1f})脚本过滤的注意事项不要一上来就让脚本处理全网所有报文。硬件层能滤掉的先滤掉软件层能缩小范围的先缩小脚本只处理最终关心的那部分否则 CPU 会紧张。脚本里尽量避免在回调函数里直接写文件或做重 IO 操作会影响实时性。正确做法是先把满足条件的数据暂存到内存队列再异步落盘。调试脚本时先用一小段历史数据验证逻辑再挂到长时间抓取任务上避免现场发现问题。4.3 三种软件过滤方式的取舍信号级过滤、脚本过滤、以及前面提到的窗口显示过滤三者各有适用场景。方式灵活度性能开销适用场景Trace/统计窗口过滤中极低实时观察、现场调试条件记录/信号级记录高低故障复现、长周期测试脚本过滤最高中-高自定义逻辑、复杂判断实际使用中我的习惯是三层搭配硬件层用掩码/列表先收窄到目标 ID 段软件层用 Trace 和统计窗口过滤做实时观察当某个信号超过阈值这类复杂条件出现时再用条件记录或脚本过滤。每一层的任务简单明确性能就平衡。5. 全链路联调三级过滤器同时开启时的优先级与排查方法三级过滤器同时开最怕的就是滤没了或者滤漏了。要快速定位问题先要搞清楚每一级的过滤边界在哪里。5.1 数据流走向与各级过滤的影响边界报文从物理总线到 TSMaster 窗口完整的数据流是物理总线 - 同星 CAN 收发器 - CAN 控制器L1 硬件过滤- 同星设备固件/驱动L2- USB/以太网传输到 PC - TSMaster 软件内核L3 应用过滤- Trace / 统计 / 图形 / 记录窗口。有几个关键结论值得单独拎出来在 L1 被过滤掉的帧后面的所有环节都不可能再看到。要恢复它只能修改硬件过滤器配置软件和脚本都无能为力。所以硬件过滤规则一定要谨慎别把需要的帧滤掉了。在 L3 的 Trace 窗口过滤只是显示过滤数据其实还是被 TSMaster 完整接收到了。你随时可以把过滤规则摘掉看完整数据。在录制器里挂的过滤影响的是日志内容不影响实时窗口显示。换句话说同一份实时数据可以一边全量显示一边按规则记录两者支持不同的过滤策略。这个影响边界的概念是理解全链路配置的钥匙。很多人配置出错就是因为不清楚自己改的是哪一层影响范围有多大。5.2 一个完整的过滤规则配置案例用一个完整案例把配置链路串起来。需求监测电机控制器报文 0x181、0x182VCU 报文 0x200同时记录 BMS 报文段 0x300-0x31F其余全部丢弃。配置步骤硬件层在同星设备硬件配置里CAN1 通道选择混合模式如果设备支持列表加入 0x181、0x182、0x200再配置一个掩码规则覆盖 0x300-0x31F。如果设备不支持混合模式就按最接近需求的方式列表模式下尽量加入这些 ID。应用层在 TSMaster 过滤器管理里新建规则项目A条件包括这些 ID 和 CAN1 通道。Trace 窗口挂上项目A规则。统计窗口统计对象设置为这些 ID。记录器挂项目A规则只记录这些 ID 的报文。验证步骤用一个 CAN 信号发生器或者 TSMaster 自身的报文发送功能往总线上发一个不在范围内的 ID比如 0x777确认 TSMaster 各窗口都看不到。再发一个范围外的扩展帧 ID确认也不会进来。发送 0x181、0x182、0x200、0x305确认这四个都能在 Trace 里看到统计窗口计数一致。最后看记录文件的条目数是否与预期吻合。这个验证步骤看着简单但每次配置完成都应该跑一遍。我在现场见过太多配置了但没验证跑了一天才发现 ID 范围写错了的案例。5.3 滤没了和滤漏了的排查路径如果配置完成后发现滤没了或滤漏了按下面的路径排查。滤没了什么都看不到先看硬件层确认硬件过滤配置已应用通道已重启。有些设备配置下发后必须重启通道才生效。再看显示层Trace 窗口是否挂了过滤规则规则是否启用。规则界面里的启用开关是一个很容易忽略的点。检查通道过滤规则挂的是不是当前正在看的通道。多通道设备很常见规则挂在 CAN1看的却是 CAN2。最后检查 ID 类型标准帧和扩展帧的 ID 范围是否配错。滤漏了不该显示的还在显示优先怀疑显示层规则没有生效规则启用开关没打勾或者规则被其他高优先级规则覆盖。其次怀疑硬件层过滤根本没有配置上回到硬件配置页面看过滤器状态是否 enabled。最后怀疑帧类型远程帧和错误帧是不是也被当成普通帧显示了。排查时一定要利用 TSMaster 自身的统计功能。通道接收计数只要在涨说明物理链路是通的计数不涨多半是硬件过滤把报文全滤掉了。顺着这个思路很快就能定位到具体是第几层出的问题。6. 同星设备适配避坑记录固件、通道、终端电阻与性能平衡同星设备是 TSMaster 的原生硬件兼容性一般不会有问题但不代表完全不用管固件和驱动版本。这一节把我在同星设备适配过程中踩过的坑集中写出来希望对你有用。6.1 固件版本与 TSMaster 驱动匹配问题同星设备在 TSMaster 新的版本上一般都能正常工作但一般不等于一定。我碰到过一次比较典型的情况TSMaster 升级到新版本后硬件配置里的接收过滤选项变成灰色不可点。查了帮助文档才知道需要先把同星设备固件升级到对应版本新版的过滤配置功能才开放。所以建议拿到设备后先记录固件版本和驱动版本截图或者抄在本子上。每次升级 TSMaster 之前对照同星官方网站的兼容性说明确认是否需要同步升级设备固件。不要盲目升软件也不要一直不升固件。这类问题通常不会在功能自检时报错而是表现为某些配置项不可用、行为异常排查起来很费时间。另外如果你同时在使用 TSMaster 和其他第三方总线分析工具要注意驱动冲突。同星设备在同一台电脑上被多个软件抢占时有的软件会提示设备占用有的则静默失效。遇到设备时通时断的情况先看有没有第二个软件正在打开设备。6.2 多通道设备与终端电阻的隐藏影响同星设备如果带多个 CAN 通道过滤规则是按通道独立配置的。你可能在 CAN1 上做了过滤但忘了 CAN2。这个说起来简单现场忙乱时还真容易漏。我的习惯是不管是否用到所有通道都在硬件配置页面把所有通道过一遍不用的通道也要明确不过滤或者禁用避免踩空。终端电阻是另一个隐藏因素。同星设备一般内置 120Ω 终端电阻有的通过软件配置开关。如果你的设备插在总线中间而两端节点已经有终端电阻了设备端的电阻还开着会导致 CAN 差分信号幅值偏小误码率上升。表现出来的现象会很诡异有些报文时有时无、ID 过滤后偶发丢帧。此时不是过滤器的问题是物理层信号质量问题。排查时先看总线连接再怀疑过滤配置。还有一个工程习惯建议给通道起个有意义的名字比如把 CAN1 改名成动力CANCAN2 改名成车身CAN。TSMaster 支持通道别名配置一次以后所有窗口都会显示别名。做过多通道项目的人都明白这能省下大量辨别通道的时间也能避免过滤规则挂错通道。6.3 性能验证过滤前后实测对比最后给一个性能对比的参考。以我在试验车上的一次配置为例数值是大概的车型和负载不同会有差异但趋势是一致的。指标未过滤硬件软件过滤后接收帧率3200 帧/s420 帧/sTSMaster 进程 CPU 占用30-40%8-12%1 小时日志体积约 1.5GB约 180MBTrace 窗口肉眼可读性不可读正常从表里能直观看到硬件过滤的性能收益。帧率降到十分之一左右CPU 占用和日志体积也同步下降。而且这个结果不是靠显示过滤实现的——显示过滤只是看起来少了数据还是全量进 PC只有把过滤前置到硬件层PC 端的压力才会真正降下来。最后补一句个人体会报文过滤这件事做得越早越好。硬件层能挡掉的就不要留到软件层去处理。我的习惯是先把整车的报文 ID 全表拉出来把必须观察的 ID 段划好然后在同星设备的硬件过滤器里配一遍接着在 TSMaster 里建一套对应的过滤规则模板。每次换测试项目只改规则模板不重新配置硬件。这个模板化的思路在长周期测试项目里能省下大量时间。
返回列表