can总线的负载率为什么要控制在30%以内?

52 篇文章 15 订阅

can总线的负载率为什么要控制在30%以内?求讲解一下原理以及优缺点

最近群里有人问如何计算CANFD总线负载,我自己用CANoe模拟了一下CAN总线的负载,大概的思路如下:

首先,我们拿最大通信速率为500kbps的CAN总线来说,500kbps就是500kbit/s,也就是1秒内总线上最大允许传输的bit数为500000个

我们模拟发送一条周期报文,计算1秒内它传输到总线上的bit数,然后再除以1秒内最大允许的bit数,不就得到总线的负载了嘛

计算方式如下

  • 1000是1秒,也就是1000ms
  • Tsendcycle是发送的周期报文的周期时间,这里以ms为单位
  • N是一条CAN报文发送到总线上的bit数
“ 我们以dlc为8个字节的标准帧为例,帧起始(1bit)+仲裁场(11bit)+控制场(6)+数据场(64bit)+CRC场(16bit)+ ACK场(2bit)+帧结束(7bit)+ITM(3bit) = 111bit
  • 500000是CAN总线在1秒内的最大承载bit数

假设我们以1ms为周期往总线上循环发送CAN报文,先用上面的公式计算出负载率busload为22.2%

然后我们在CANoe上模拟发送这个周期报文,同时检测CAN总线的真实负载是否相同

代码很简单

variables
{
  msTimer tSendMsg1;
  message 0x001 message1 = {dlc = 8, byte(0) = 0x00, byte(1) = 0x11, byte(2) = 0x22, byte(3) = 0x33, byte(4) = 0x44, byte(5) = 0x55, byte(6) = 0x66, byte(7) = 0x77};
}

on timer tSendMsg1
{
  output(message1);
}

on key 'a'
{
  setTimerCyclic(tSendMsg1, 1);
}  

在点击按键a发送报文的同时,打开CANoe里的Statistics界面,监测CAN总线

“ Busload那一行的Avg是 平均统计值,它会从0开始不断增大,最终趋向于 最大值Max,由于开始时busload为0,增大到23%,然后一直稳定在23%(可以通过Current那一列看出),而Avg就是统计从0%开始到值的 平均值,所以时间越久,它就越趋向于23%

由此看出,计算得出的理论值22.2%与实际的负载几乎相等

通过上面的公式,可以发现

“ 报文发送周期越短,1秒内往总线上发送的次数越多,往总线上发送的bit数就越多,负载也就越大

而以1ms为周期发送一条报文最大的负载也就23%,如果我想让负载率达成75%左右,甚至是90%以上呢,我总不能让发送周期比1ms还小

那要怎么办呢

既然不能继续缩短发送周期,可以在每个发送周期多发送几条此报文不就行了

variables
{
  msTimer tSendMsg1;
  message 0x001 message1 = {dlc = 8, byte(0) = 0x00, byte(1) = 0x11, byte(2) = 0x22, byte(3) = 0x33, byte(4) = 0x44, byte(5) = 0x55, byte(6) = 0x66, byte(7) = 0x77};
}

on timer tSendMsg1
{
  output(message1);
  output(message1);
  output(message1);
  output(message1);
}

on key 'a'
{
  setTimerCyclic(tSendMsg1, 1);
}  

这里我以每1ms发送4条相同的报文,那么负载也就是只发送一条报文的负载的4倍

看一下监测结果

“ 我们就可以用上面的公式,调整里面的变量,还有增加每个周期发送的次数,来达到我们想要的总线负载, 当然最终还是需要用Statistics查看实际的负载是否能满足我们的要求

在测试中,模拟负载的报文,也有要求,不同的报文ID,优先级也不同,0x000优先级最高,0x7ff优先级最低,所以如果需要在高优先级下测试,就用0x000报文模拟负载,如果需要在低优先级下测试,就用ox7ff报文模拟负载,这样就可以模拟高负载高优先级、高负载低优先级、低负载高优先级、低负载低优先级这四种情况

学会了CAN总线的负载,那么CANFD的负载就简单了

-------------------------------------------

谢邀,以下通过个人的一点理解谈一下这个问题,望各位批评指正,大家共同进步。

首先,需要理解什么是CAN线的负载率。一般业内的对负载率的定义为实际数据传输速率理论上能达到的数据传输速率的比值。

可以类比景区的负载率,每个景区都有一个负荷上限,比如说10000人,如果此时景区内只有1000人,那么这时的景区负载率是10%。景区负载率是一个在空间上定义的概念,它说明了在空间上资源的被使用情况,而总线负载率则不然,其是在时间上定义的一个概念,说明了在时间上资源被使用的情况。因为传输速率一般是按秒来计算,数据传输速率既为每秒钟传输了多少个BIT,负载率也默认为在一秒的时间范围内位资源的使用情况。理论上波特率为500K的总线上每秒钟能够传输500000个BIT,如果在某一秒中总线上只传输了100000个BIT,则总线负载率为20%。如果按照空间上负载率的概念做简单类比,CAN总线上一般要求负载率不大于30%似乎不能被理解,毕竟物尽其用这个观念是被大家广为接受的。要深入系统的理解为什么30%成为目前业内普遍遵守的负载率高压线,就不得的不引入CAN理论中另外几个重要的概念:ID仲裁、闲时发送和最大反应时间。

CAN总线本质上是一种串口通讯,靠在时间线上对每一位的电压值进行调制来搭载不同的信号。因为各节点共用总线介质,对总线的使用权界定就至关重要。先说结论:只有在总线空闲时,发送节点才能向总线上发送帧起始及后续帧ID,只有在帧ID赢得仲裁时,发送节点拥有总线控制权进而向总线发送报文剩余部分,在仲裁中失败的节点让出总线控制权等待下次总线空闲时继续尝试发送。我们可以看到如果某一个节点需要发送一帧报文,它需要同时满足两个条件:1、总线是空闲的,即目前没有任何节点在发送报文,在总线上表示为节点监测到11个连续的隐性位;2、所需发送的报文赢得ID仲裁,即报文优先级较高。

一个报文在试图发送时,必须满足上述两个条件才能完成发送。这里的问题就是:如果一个优先级相对较低的节点向外发报文时,会因为不断地在仲裁中失败而导致发送延迟。如果延迟过大会引起通讯失败。

负载率越高,代表需要发送的数据越多,相对来说低优先级节点发生通讯延迟的概率越大。

实际上30%的数据也只是一个经验数值,历史很悠久的一个经验数值。从本质上来看,限制负载率最终是要保证相对低优先级节点的通讯实时性,如果能通过网络及节点优化等手段满足每个节点的最大响应时间满足要求,负载率只是一个无关紧要的参数。12年的时候菲亚特已经可以做到70%的负载率下仍然能够保证正常通讯,见链接。http://www.21ic.com/app/auto/201203/108515.htm

can总线的负载率为什么要控制在30%以内? - 知乎 (zhihu.com)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值