4、CAN网络负载率定义:负载率计算公式、总线利用率、峰值负载与平均负载

好,咱们进入正题。今天聊的这个话题,是每个做CAN总线的人绕不开的坎儿——负载率。

我记得刚入行那会儿,带我的老工程师丢给我一句话:“小子,负载率算不明白,你后面调网络就是瞎子摸象。”当时我不信,后来被现实狠狠教育了一顿。嗯,今天我把这些经验掰开揉碎了讲给你听。

4.1 负载率到底是个啥?

说白了,负载率就是总线有多“忙”。

你想想看,CAN总线就像一条单车道马路。车多了就堵,车少了就空。负载率就是衡量这条路上“车流量”的指标。

官方定义是这样的:在单位时间内,总线上实际传输的数据位时间,占总线可用总时间的百分比

我个人习惯用一个更直白的说法:负载率 = 总线被占用的时间 / 总时间

核心公式:

负载率(%) = (所有报文传输时间之和 / 测量时间周期) × 100%

这里有个坑,我刚开始也踩过——报文传输时间不是简单的数据长度除以波特率。为什么?因为CAN帧有开销。

4.2 一帧报文到底占多少时间?

咱们拿标准帧(11位ID)来算笔账。

一帧CAN报文,除了你关心的数据字节,还有这些“固定开销”:

  • SOF(帧起始):1位
  • 仲裁场:12位(11位ID + 1位RTR)
  • 控制场:6位(IDE + r0 + DLC 4位)
  • CRC场:16位(15位CRC + 1位CRC界定符)
  • ACK场:2位(ACK槽 + ACK界定符)
  • EOF:7位
  • ITM(帧间空间):3位

加起来,固定开销是 47位。数据场是 8×8=64位。

所以一帧8字节的标准帧,总位数为:47 + 64 = 111位

数据长度(字节) 总位数(标准帧) @500kbps 传输时间(μs)
0 47 94
4 79 158
8 111 222

我的经验:很多新手算负载率时只算了数据位,忘了47位的开销。结果算出来负载率偏低,实车一跑就丢帧。我曾经吃过这个亏,后来每次算负载率都拿示波器实测一遍,心里才踏实。

4.3 总线利用率 vs 负载率

这两个概念容易搞混,我简单说清楚。

总线利用率,更偏向于“总线被有效数据占用的比例”。它关心的是:总线上跑的数据里,有多少是真正的“有效载荷”。

负载率,则包含了所有开销。它关心的是:总线到底有多忙。

举个例子:

假设总线上只有一帧8字节报文,周期10ms,波特率500kbps。

  • 负载率 = 111位 / (500,000位/秒 × 0.01秒) = 111 / 5000 = 2.22%
  • 总线利用率 = 64位 / 5000 = 1.28%

你看,利用率比负载率低了不少。那47位的开销,就是“无效但必须”的代价。

注意:行业内讨论网络设计时,大家默认说的是“负载率”,不是“利用率”。如果你跟供应商沟通时把这两个搞混了,对方可能会觉得你不专业。我见过有人因为这个被怼过。

4.4 峰值负载与平均负载

这两个指标,一个看“常态”,一个看“极限”。

平均负载:在一段较长的时间内(比如1秒),总线上负载的平均值。

峰值负载:在某个极短的时间窗口内(比如1ms),总线上出现的最大负载值。

为什么峰值负载更重要?

你想想看,平均负载30%看起来挺安全对吧?但如果所有ECU都在同一时刻发报文,峰值负载可能瞬间冲到80%甚至90%。这时候,低优先级的报文就得等着,延迟就上来了。

我在做某个车身域控制器项目时遇到过这种情况:

  • 平均负载只有25%,看着很健康
  • 但每次车窗升降时,多个ECU同时响应,峰值负载飙到75%
  • 结果就是,门控模块的报文偶尔被延迟,导致车门锁响应慢了半拍

后来怎么解决的?我把几个高优先级报文的发送时刻错开了,峰值负载降到了55%。问题就消失了。

行业经验值:

  • 平均负载建议控制在 30%以下(预留余量给诊断和标定)
  • 峰值负载建议不超过 60%(超过这个值,丢帧风险显著增加)
  • 极端情况下(如Bootloader刷写),允许短时达到 80%,但不能持续

4.5 怎么算?手把手来一遍

假设你手头有个网络,包含以下报文:

报文ID 数据长度(字节) 周期(ms)
0x100 8 10
0x200 4 20
0x300 2 50

波特率500kbps。咱们算平均负载:

0x100:每10ms发一次,每秒100次
  每帧时间 = 111位 / 500kbps = 222μs
  每秒占用时间 = 100 × 222μs = 22,200μs

0x200:每20ms发一次,每秒50次
  每帧时间 = 79位 / 500kbps = 158μs
  每秒占用时间 = 50 × 158μs = 7,900μs

0x300:每50ms发一次,每秒20次
  每帧时间 = 63位 / 500kbps = 126μs
  每秒占用时间 = 20 × 126μs = 2,520μs

总占用时间 = 22,200 + 7,900 + 2,520 = 32,620μs
平均负载率 = 32,620 / 1,000,000 = 3.26%

3.26%,很安全对吧?但别忘了,这只是平均。如果这三帧恰好同时发送,峰值负载就是:

峰值负载 = (222 + 158 + 126) / 1000 = 50.6%

你看,平均3.26%,峰值50.6%。这就是为什么只看平均负载会出问题。

我的建议:做网络设计时,先用Excel拉一张表,把所有报文的周期和长度列出来。然后算两个值:平均负载和理论峰值(所有报文同时发送)。如果理论峰值超过60%,你就得考虑错开发送时刻了。这个习惯我保持了十年,从来没出过大的网络设计事故。

4.6 小结一下

负载率这件事,说白了就是:

  • 算清楚每帧报文到底占多少时间(别忘了47位开销)
  • 区分平均负载和峰值负载,两个都要看
  • 峰值负载才是真正的杀手,平均负载只是参考

下一节,咱们聊聊怎么优化负载率。说白了就是:怎么让总线跑得更顺畅,不堵车。