【图解CAN总线】-8-CANFD总线网络“负载率”计算

本文介绍了CANFD帧结构及帧间空间概念,详细分析了不同帧类型的实际长度,并提供了计算单个帧负载率的方法。此外,还展示了如何通过DBC/Arxml文件估算整个CANFD网络的理论负载率。

目录

1 Classic CAN/CANFD帧长度

2 Interframe space帧间空间的介绍

2.1 Intermission间歇

2.2 Bus idle总线空闲

2.3 Suspend transmission

3 CANFD总线网络“负载率”计算

3.1 单个帧的“负载率”

3.2 通过CAN DBC/Arxml来计算一个CAN网络的理论“负载率”

4 拓展

END


推荐阅读(单击下方文字即可跳转至对应博文):

Vector工具链

CAN Matrix DBC

CAN Matrix Arxml

CANFD/经典CAN/CANXL

1 Classic CAN/CANFD帧长度

不管是Classic CAN还是CANFD,其帧结构都由以下7个段组成:

—   SOF帧起始;

—   arbitration field仲裁段;

—   control field控制段;

—   data field数据段;

—   CRC field;

—   ACK field;

—   EOF.

Classic CAN Standard Frame标准帧不考虑位填充)共:108Bit

帧起始(1bit)、仲裁段(12bit)、控制段(6bit)、数据段(8×8bit)、循环冗余码段(16bit)、应答段(2bit)和帧结束(7bit)

Classic CAN Extended Frame扩展帧不考虑位填充)共:128Bit

帧起始(1bit)、仲裁段(32bit)、控制段(6bit)、数据段(8×8bit)、循环冗余码段(16bit)、应答段(2bit)和帧结束(7bit)

CANFD Standard Frame标准帧不考虑位填充;DLC = 8)共:117Bit

帧起始(1bit)、仲裁段(12bit)、控制段(9bit)、数据段(8×8bit)、循环冗余码段(22bit)、应答段(2bit)和帧结束(7bit)

CANFD Standard Frame标准帧不考虑位填充;DLC = 64)共:569Bit

帧起始(1bit)、仲裁段(12bit)、控制段(9bit)、数据段(64×8bit)、循环冗余码段(26bit)、应答段(2bit)和帧结束(7bit)

CANFD CAN Extended Frame扩展帧不考虑位填充;DLC = 8)共:136Bit

帧起始(1bit)、仲裁段(32bit)、控制段(8bit)、数据段(8×8bit)、循环冗余码段(22bit)、应答段(2bit)和帧结束(7bit)

CANFD CAN Extended Frame扩展帧不考虑位填充;DLC = 64)共:588Bit

帧起始(1bit)、仲裁段(32bit)、控制段(8bit)、数据段(64×8bit)、循环冗余码段(26bit)、应答段(2bit)和帧结束(7bit)

2 Interframe space帧间空间的介绍

Data frame数据帧remote frame远程帧应通过一个称为interframe space帧间空间的bit field与前面的帧分开,不管是什么类型的帧(data frame数据帧remote frame远程帧error frame错误帧overload frame过载帧)。

注意:

  • overload frame过载帧error frame错误帧的前面不应有interframe space帧间空间;
  • 多个overload frame过载帧之间也不应有interframe space帧间空间

inter-frame space帧间空间应包含bit field:intermission和bus idle time。 对于已经是前一帧的发送方的error-passive node,inter-frame space帧间空间还应包含该节点的suspend transmission time(参见图9和图10)。

图2-1 非前一帧的error-passive或receiver的节点的帧间空间

图2-2 作为前一帧发送方的error-passive node的Interframe space

2.1 Intermission间歇

intermission field应包括三个隐性位。在intermission期间,任何节点不得开始发送data frame数据帧remote frame远程帧。只允许发出overload条件的信号。

在intermission期间的第三位检测到总线上的显性位应解释为SOF。

2.2 Bus idle总线空闲

bus idle总线空闲期间可以是任意长度。当intermission的第3位被认为是隐性的时,receiver和error active transmitter应将总线识别为空闲。当suspend transmission time的第8位是隐性的时,由error passive transmitter应识别为空闲;或当离开bus integrating state时。当总线处于空闲状态时,任何节点都可以访问总线进行发送。

在发送另一帧的过程中,等待发送的帧,应在intermission后的第1位开始。

在总线空闲时间内检测到总线上的显性位,应解释为SOF。

2.3 Suspend transmission

一个error-passive node,如果是前一帧的发送方,应在intermission后发送8个隐性位后,开始发送另一帧。如果另一个节点在该suspend transmission time内开始发送,则该节点将成为该Data Frame数据帧Remote Frame远程帧的接收方。

3 CANFD总线网络“负载率”计算

通过第2章我们可以知悉,CAN总线网络正常的发送过程中,帧与帧之间至少有3个隐性位

根据这些信息,来介绍一种“CANFD总线网络“负载率”计算”的方法。

3.1 单个帧的“负载率”

Classic CAN Standard Frame标准帧来说,发送一帧实际长度(不考虑位填充;帧间隔3BitDLC = 8):

108+3=111Bit;

比特率/波特率

一个Bit的位时间

单个帧的“负载率”

250 Kbps

4000纳秒

((111 * 4000纳秒) / 1秒) *100%= 0.0444 %

500 Kbps

2000纳秒

((111 * 2000纳秒) / 1秒) *100%= 0.0222 %

1 Mbps

1000纳秒

((111 * 1000纳秒) / 1秒) *100%= 0.0111 %

Classic CAN Extended Frame扩展帧来说,发送一帧实际长度(不考虑位填充;帧间隔3BitDLC = 8):

128+3=131Bit;

比特率/波特率

一个Bit的位时间

单个帧的“负载率”

250 Kbps

4000纳秒

((131 * 4000纳秒) / 1秒) *100%= 0.0524 %

500 Kbps

2000纳秒

((131 * 2000纳秒) / 1秒) *100%= 0.0262 %

1 Mbps

1000纳秒

((131 * 1000纳秒) / 1秒) *100%= 0.0131 %

CANFD Standard Frame标准帧来说,发送一帧实际长度(不考虑位填充;帧间隔3BitDLC = 8;启用BRS位加速):117+3=120Bit

其中:

  • 29Bit使用仲裁段波特率:1位SOF段,12位仲裁段,1位IDE,1位FDF,1位R0,1位BRS,2位ACK段,7位EOF段,3位帧间隔;
  • 91Bit使用数据段波特率;1位ESI,4位DLC,64位数据段,22位CRC段。

比特率/波特率

一个Bit的位时间

单个帧内对应段的负载率

仲裁段500 Kbps

2000纳秒

((29 * 2000纳秒) / 1秒) *100%= 0.0058 %

数据段2 Mbps

500纳秒

((91 * 500纳秒) / 1秒) *100%= 0.00455 %

单个帧的“负载率”

0.01035%

CANFD Standard Frame标准帧来说,发送一帧实际长度(不考虑位填充;帧间隔3BitDLC = 64;启用BRS位加速):569+3=572Bit;

其中:

  • 29Bit使用仲裁段波特率:1位SOF段,12位仲裁段,1位IDE,1位FDF,1位R0,1位BRS,2位ACK段,7位EOF段,3位帧间隔;
  • 543Bit使用数据段波特率;1位ESI,4位DLC,512位数据段,26位CRC段。

比特率/波特率

一个Bit的位时间

单个帧内对应段的负载率

仲裁段500 Kbps

2000纳秒

((29 * 2000纳秒) / 1秒) *100%= 0.0058 %

数据段2 Mbps

500纳秒

((543 * 500纳秒) / 1秒) *100%= 0.02715 %

单个帧的“负载率”

0.03295%

CANFD Extended Frame扩展帧来说,发送一帧实际长度(不考虑位填充;帧间隔3BitDLC = 8;启用BRS位加速):136+3=139Bit;

其中:

  • 48Bit使用仲裁段波特率:1位SOF段,32位仲裁段,1位FDF,1位R0,1位BRS,2位ACK段,7位EOF段,3位帧间隔;
  • 91Bit使用数据段波特率;1位ESI,4位DLC,64位数据段,22位CRC段。

比特率/波特率

一个Bit的位时间

单个帧内对应段的负载率

仲裁段500 Kbps

2000纳秒

((48 * 2000纳秒) / 1秒) *100%= 0.0096 %

数据段2 Mbps

500纳秒

((91 * 500纳秒) / 1秒) *100%= 0.00455 %

单个帧的“负载率”

0.01415%

CANFD Extended Frame扩展帧来说,发送一帧实际长度(不考虑位填充;帧间隔3BitDLC = 64;启用BRS位加速):588+3=591Bit;

其中:

  • 48Bit使用仲裁段波特率:1位SOF段,32位仲裁段,1位FDF,1位R0,1位BRS,2位ACK段,7位EOF段,3位帧间隔;
  • 543Bit使用数据段波特率;1位ESI,4位DLC,512位数据段,26位CRC段。

比特率/波特率

一个Bit的位时间

单个帧内对应段的负载率

仲裁段500 Kbps

2000纳秒

((48 * 2000纳秒) / 1秒) *100%= 0.0096 %

数据段2 Mbps

500纳秒

((543 * 500纳秒) / 1秒) *100%= 0.02715 %

单个帧的“负载率”

0.03675%

3.2 通过CAN DBC/Arxml来计算一个CAN网络的理论“负载率”

如果已知一个CAN总线网络所有CAN ID的DBC/Arxml,并且知道它们的发送方式,我们可以粗略地估算出CANFD总线网络的“负载率”:CANFD总线负载率是各个帧占用总线带宽百分比之和。

下面以比特率/波特率:仲裁段500kbps,数据段2Mbps为例(不考虑位填充;帧间隔3Bit):

Num

CAN ID

发送周期

帧类型

DLC

对应帧一秒内的负载率

1

0x115

10ms

经典CAN标准帧

8

(1000ms / 10ms)* 0.0222 % = 2.22%

2

0x217

20ms

经典CAN扩展帧

8

(1000ms / 20ms)* 0.0262 % = 1.31%

3

0x3B4

10ms

CANFD标准帧

8

(1000ms / 10ms)* 0.01035% = 1.035%

4

0x475

20ms

CANFD标准帧

64

(1000ms / 20ms)* 0.03295% = 1.6475%

5

0x211

10ms

CANFD扩展帧

8

(1000ms / 10ms)* 0.01415% = 1.415%

6

0x311

20ms

CANFD扩展帧

64

(1000ms / 20ms)* 0.03675% = 1.8375%

CANFD总线网络的理论“负载率”

9.465 % +…

4 拓展

如果有一个已知的CAN Trace Log,我们也可以按照上述的方法,统计1秒以内发送的帧数,来粗略计算该1秒以内的CANFD总线网络负载率。

推荐阅读(单击下方文字即可跳转至对应博文):

《Autosar从入门到精通-实战篇》总目录_培训教程持续更新中...

《Autosar_BSW高阶配置》总目录_培训教程持续更新中...

《Autosar_MCAL高阶配置》总目录_培训教程持续更新中...

END

获取更多“汽车电子资讯”和“工具链使用”,

请关注“汽车电子助手”,做您的好助手。

### 计算CAN总线负载率 #### 负载率定义 CAN总线负载率是指总线上所有节点在单位时间内发送的所有数据占整个总线理论带宽的比例,即总线实际数据传输速率与理论上能达到的数据传输速率的比值[^1]。 #### 计算公式 为了计算CAN总线负载率,可以使用以下公式: \[ \text{负载率} = \frac{\sum (\text{消息长度})}{\text{采样周期} \times \text{波特率}} \] 其中: - **消息长度** 是指每条报文的实际占用时间(以位为单位),包括仲裁场、控制场、数据场、CRC场、ACK场以及间隔和结束位。 - **采样周期** 是指统计的时间窗口大小。 - **波特率** 是指CAN总线的工作频率。 #### 示例计算 假设在一个特定时间段内,有若干条不同长度的消息被传送。具体参数如下表所示: | 报文ID | 数据字节数 (DLC) | 发送次数 | |--| | 0x100 | 8 | 5 | | 0x200 | 4 | 3 | 设波特率为500 kbps, 统计时间为1秒,则可按上述公式逐步求解。 对于一条标准CAN报文而言,其固定开销部分由7个域组成:起始位(1 bit),仲裁场(ID+RTR=12 bits), 控制场(DLC=6 bits), CRC序列(15 bits), ACK槽及其分隔符(2 bits), 结束标志(7 bits)[^3]。因此,当携带8字节有效负荷时,单次完整传输所需比特数总计为\(1 + 12 + 6 + 8\times8 + 15 + 2 + 7 = 119\);同理,对于含有4字节的有效载荷来说,该数值变为\(1 + 12 + 6 + 4\times8 + 15 + 2 + 7 = 85\)。 基于此, - ID为`0x100` 的报文每次传输需耗时 \(119 / 500,000 = 0.238 ms\), - ID为`0x200` 的报文每次传输需耗时 \(85 / 500,000 = 0.17ms\). 那么,在给定的一秒钟期间里, \[ \begin{aligned} &\text{总占用时间(ms)} \\ =& (0.238 * 5) + (0.17 * 3)\\ =& 1.19 + 0.51 \\ =& 1.7 ms. \end{aligned}\] 最后得出负载率为: \[ \frac{(1.7/1000)\,\mathrm{s}}{1\,\mathrm{s}}=\boxed{0.17\%}. \] ```python def calculate_can_bus_load_rate(messages, sample_time_seconds, bitrate_kbps): total_bits_per_second = bitrate_kbps * 1e3 # Calculate the sum of message lengths over all messages sent during sampling period accumulated_message_length_bits = sum([ ((message['data_bytes'] * 8 + 47) * message['transmit_count']) for message in messages]) load_ratio = (accumulated_message_length_bits / total_bits_per_second) return round(load_ratio * 100, 2) messages_example = [ {'id': '0x100', 'data_bytes': 8, 'transmit_count': 5}, {'id': '0x200', 'data_bytes': 4, 'transmit_count': 3} ] sample_period_s = 1 bitrate_kbps = 500 load_percentage = calculate_can_bus_load_rate( messages_example, sample_period_s, bitrate_kbps ) print(f"Load rate is {load_percentage}%") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车电子助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值