新闻中心

NEWS center


汽车数据智能基础:一文了解CAN总线格式
来源: | 作者:智协慧同 | 发布时间: 1264天前 | 5212 次浏览 | 分享到:

一、DBC

01.DBC (CAN Bus Databases)

定义CAN总线上的报文如何解析成原始值,再通过一个线性公式(a * x + b)转换为实际值。

1、BO_ 信号包定义:BO_信号包ID 信号包名 字节长度 发送者

2、SG_ 信号定义:SG_信号名:Bit起始位|Bit长度@endian UNSIGNED/SIGNED(a, b) [最小|最大] 单位 接收者

3、信号名:有可能重复

4:信号包ID:base-10 long,check long high bit for extended flag

5、字节长度:CAN = 1-8字节,如果是CANFD可以到64字节

6、Bit长度:如果大于/小于起始位,剩下的bit会循环

7、Endian:1 = Intel,0 = Motorola

8、+/-:+ = unsigned, - = signed

9、信号:所有原始值都是整数,如果实际值为浮点值,则a或b为浮点值


02.CAN报文Intel编码

SG_ EngineSpeed:25|9@1+ (0.1,0) [min|max] "unit" Vector_XXX

̶MSB 000110100 = 52, 52 * 0.1 + 0 = 5.2


03.CAN报文Motorola编码

SG_ EngineSpeed : 25|9@0+ (0.1,0) [min|max] "unit" Vector_XXX

̶MSB 000001000 = 8, 8 * 0.1 + 0 = 0.8


二、ASC / BLF

01.ASC(Vector ASCII Format)

通过简单的文本定义CAN总线上的报文

1、date:开始数采的时间

2、timestamp absolute(relative)- absolute:每一行时间位移都是相对于开始时间- Relative:每一行时间位移都是相对于上一行时间

3、Begin Triggerblock:有时候有,大部分时候都和date一致

4、时间位移:秒为小数点前位单位,常见的的是6-位小数点(微秒)

5、信号包ID:要注意是base16,DBC是base10

6、信号包字节长度:可能会大于DBC里对应信号包长度定义(填充零值)

7、解析方法见DBC编码解析



02.BLF (Binary Logging Format)

通过高效的二进制格式定义CAN总线上的报文

1、和ASC本质上差不多,ASC把bytes写成了HEX文本

2、BLF多了信号包的压缩和解压


三、MDF

01.MDF(Measurement Data Format)

对数据处理不太友好的格式,位置指针数量较多

1、以块Block划分的格式定义:

- ID Block (1个):基本信息:包括文件版本、是哪一个大小Endian 编码(Intel、Motorola)等 

- Header Block (1个): 文件头:包括信号采集的开始时间、生成者、第一个数据组定义的位置指针等

- Data Group Block(1个以上)数据组:包括这个数据组内的信号组数量、数据的行数、一行数据的长度,数据前或后带ID的长度、第一个信号组定义的位置指针、下一个数据组块定义的位置指针、数据的位置指针等

• Channel Group Block(1个以上)信号组:类似DBC里的BO_, 包括这个信号组内的信号数量、第一个信号定义的位置指针、下一个信号组定义的位置指针等

• Channel Block(1个以上)信号:类似DBC里的SG_, 包括这个信号的名字、单位、原始值的数据类型,读取的byte位置、bit位置、bit长度、转换公式定义的位置指针、下一个信号定义的位置指针等

• Channel Conversion Block(0或1个):信号的转换公式定义:原始值解析后经过一个公式计算转成实际值,最常见的就是线性公式(y = a * x + b) ,如果没有转换公式取原始值

- Text block, metadata block, source info block ...等一些其他相关信息


2、每一行信号包

- 数据是按照信号组分时间位移+信号字节(这点和CAN信号包很像,但要注意:MDF的Bit的字节编码写法不一样,所以CAN的信号包不能直接用)

- 信号组ID在排序的格式内通常没有(因为不需要),非排序格式数据前必须要有信号组ID(数据后的ID在spec里写允许有,但通常不会见到)

3、版本分 3.x.x 和 4.x.x

- V3格式比较简单,但有个限制是不能超过255个信号组

- V4格式比较复杂,而且位置指针有8-byte alignment对齐的要求

4、分为排序(sorted)和非排序(unsorted,由logger数采设备生成)

- 排序:文件里有多个数据组,但每个数据组里只能有一个信号组的定义和符合这个信号组按时间排序好的数据

- 非排序:文件里只有一个数据组,但数据组里有所有信号组的定义,所有行的数据在文件的结尾(由信号组ID识别但不一定有排序)


02.MDF 3.x.x 格式逻辑排列


03.MDF 4.x.x 格式逻辑排列



04.MDF编码

1、数据类型

- 浮点数:float、double

- 整数char、uchar、short、ushort、int、uint、long、ulong

- char array

- byte array

2、数据长度与对齐

- 浮点数:必须为偶数位的整数字节数量,必须对齐在字节边界

- 整数:可以有任意数量的bits(低版本的MDF不允许小于8个bits的整数跨字节边界)

3、信号组ID

- V3:1个字节(0-255)

- V4:1、2、4、或8个字节(依据多少个信号组而定)

4、时间位移

- 通常为6位字节(微秒long,数据转换公式x 10-6 )或8位字节(纳秒long,数据转换公式x 10-9 )


05.MDF Intel 编码

整数编码1、字节位移(顺算) - ID byte # + bit 位移/ 82、总字节长度 - (Bit长度 + bit 位移)/ 8 round up3、Bit位移(顺算) - bit 位移%84、最后一位的bit为高位(可能需要sign判断)


06.MDF Motorola 编码

整数编码

1、字节位移(顺算)

- ID byte # + bit 位移/ 8

2、总字节长度

 - (Bit长度 + bit 位移)/ 8 round up

3、Bit位移(反算)

 - bit 位移%8

4、第一位的bit为高位(可能需要sign判断)

关注我们

联系我们

010-64466266

联系地址:

北京市海淀区知春路27号量子芯座10层

上海市长宁区凯旋路1388号长宁国际发展广场T1栋10层