接口/总线/驱动
0、前言
近期小编发表了一些关于CAN总线的文章,(点击查看文章汇总),有粉丝在后台留言问:能否写一些关于CAN总线负载率的文章?大家都知道,我们是很宠爱自己的粉丝的,特此奉上本篇文章。
1、什么是CAN总线的负载率?
一般业内对负载率的定义为:实际数据传输速率和理论上能达到的数据传输速率的比值。
可类比景区的负载率进行理解:每个景区都有一个负荷上限,比如10000人,如果此时景区内只有1000人,那么这时的景区负载率是10%。如下图1和图2分别展示了景区高负载率和低负载率的情况。
景区负载率是一个在空间上定义的概念,它说明了在空间上资源的被使用情况,而总线负载率则不然,其是在时间上定义的一个概念,说明了在时间上资源被使用的情况。
因为传输速率一般是按秒来计算,数据传输速率既为每秒钟传输了多少个BIT,负载率也默认为在一秒的时间范围内位资源的使用情况。理论上波特率为500K的总线上每秒钟能够传输500000个BIT,如果在某一秒中总线上只传输了100000个BIT,则总线负载率为20%。
2、CAN总线负载率最大支持多少?
在行业内一般要求负载率不大于30%。
如果按照空间上负载率的概念做简单类比,CAN总线上一般要求负载率不大于30%似乎不能被理解,毕竟物尽其用这个观念是被大家广为接受的。要深入系统的理解为什么30%成为目前业内普遍遵守的负载率高压线,就不得的不引入CAN理论中另外几个重要的概念:ID仲裁、闲时发送和最大反应时间。
CAN总线本质上是一种串口通讯,靠在时间线上对每一位的电压值进行调制来搭载不同的信号。因为各节点共用总线介质,对总线的使用权界定就至关重要。
先说结论:只有在总线空闲时,发送节点才能向总线上发送帧起始及后续帧ID,只有在帧ID赢得仲裁时,发送节点拥有总线控制权进而向总线发送报文剩余部分,在仲裁中失败的节点让出总线控制权等待下次总线空闲时继续尝试发送。
我们可以看到如果某一个节点需要发送一帧报文,它需要同时满足两个条件
1、总线是空闲的,即目前没有任何节点在发送报文,在总线上表示为节点监测到11个连续的隐性位;
2、所需发送的报文赢得ID仲裁,即报文优先级较高。
一个报文在试图发送时,必须满足上述两个条件才能完成发送。这里的问题就是:如果一个优先级相对较低的节点向外发报文时,会因为不断地在仲裁中失败而导致发送延迟。如果延迟过大会引起通讯失败。
负载率越高,代表需要发送的数据越多,相对来说低优先级节点发生通讯延迟的概率越大。
实际上30%的数据也只是一个经验数值,历史很悠久的一个经验数值。从本质上来看,限制负载率最终是要保证相对低优先级节点的通讯实时性,如果能通过网络及节点优化等手段满足每个节点的最大响应时间满足要求,负载率只是一个无关紧要的参数。
3:负载率计算
想要了解负载率的计算,需先清楚CAN总线的帧格式。
图3:CAN标准帧格式
图4:CAN扩展帧格式
图5:帧间隔
假设
Ui:各个信息帧占用总线百分比
L:为报文的总长度
C:为报文的总线占用时间
N:为填充的位数
t:为毛速率 ( 亦称波特率 )下的位时间
则有:
L = N + 8d + g + 13
C = L * t
Ui = C / T
然而总线负载率是各个信息帧占用总线百分比之和。
U = U1 + U2 + U3 + .....
注:g 为CAN报文中控制位的总位数 ( 标准帧 g =34 , 扩展帧 g = 54 )g的取值是只取位填充部分除去数据段。
负载率计算例子:
网络负载率是 1s 内网络总线传输数据所占带宽的百分率。以上图网络矩阵表为例,假设总线速度为500Kbps,网络中有多帧信号,把每个信号帧所占的负载率算出来,相加即得到总的网络负载率。FBCM_1/FBCM_2这两帧的所占的负载率算法如下:
负载率1 = (1000ms / 20ms) * 111 / 500000 = 0.0111 = 1.11%
负载率2 = (1000ms / 10ms) * 111 / 500000 = 0.0222 = 2.22%
4:负载率自动计算工具
根据以上的负载率计算原理,可以轻松整理出如下的表格,输入CAN总线的相关参数:波特率、ID个数、帧间隔、帧类型等,可以自动出总线负载率。
当然:本文的重点是讲解CAN总线负载率的原理及如何进行负载率计算;真实情况下不需要自动手动计算,可以使用CAN分析仪等工具可以轻松的读取到CAN总线负载率。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !