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位开销)
- 区分平均负载和峰值负载,两个都要看
- 峰值负载才是真正的杀手,平均负载只是参考
下一节,咱们聊聊怎么优化负载率。说白了就是:怎么让总线跑得更顺畅,不堵车。