DBC文件是一种 CAN总线诊断文件格式。它是Controller Area Network(CAN)总线诊断工具中用于定义CAN总线通信协议的XML格式文件。DBC文件包含了CAN通信的信号、消息ID、数据长度、周期等信息,可以帮助开发人员进行CAN通信协议的开发、测试、诊断和分析。
DBC文件中包含以下几个主要的部分:
Version:定义DBC文件格式版本。
Nodes:定义CAN总线上的节点数量和名称。
Messages:定义CAN总线上的消息,包括消息ID、名称、长度和周期等信息。
Signals:定义CAN消息中每个信号的名称、长度、位置、单位、因子、范围等信息。
Environment variables:定义环境变量,可以用于定义常量或变量值。
Value tables:定义信号值与实际物理值之间的映射表。
Comments:可以添加注释,用于描述CAN总线的相关信息。
DBC文件通常由CAN总线诊断工具厂商或开发人员编写,可以通过CAN总线诊断工具进行导入和导出。在使用DBC文件进行CAN通信协议开发时,开发人员可以使用工具自动生成代码、模拟CAN通信、发送和接收CAN消息以及分析CAN数据。
DBC文件是一种常用的CAN总线数据定义文件,常用于CAN总线网络中的电子控制单元(ECU)通信中,主要作用是描述信号名称,物理值、信号长度、发送周期、计算公式、单位等信息。
下面是一些常见的DBC文件元素:
Version:定义DBC文件的版本信息。
Nodes:定义总线网络中涉及到的所有节点及其ID等信息。
BO_ (Broadcast Message Definition):定义广播信息。例如,车辆速度消息、方向盘角度、时间戳、GPS位置等等。
SG_ (Signal Definition):定义具体的信号信息。例如,车辆速度、转向灯、加速踏板位置等等。
CM_ (Comments):用于添加备注和注释,方便用户理解文件内容。
BA_DEF_ (Attribute Definition):定义属性,例如单位、发送周期、数据类型等等。
BA_ (Attribute Value):给信号添加属性信息。
Val_ (Value Table):给信号添加值域描述,例如用数字1-4代表车辆状态等。
在DBC文件中,最重要的是定义众多的信号和消息,这些信号和消息描述了不同的物理量以及不同的控制信息。例如一个车辆速度的信号会包括名称、单位、长度、发送周期、计算公式等信息。一个控制信号比如方向盘信号也会包括一些类似的信息。这些信息方便了不同的ECU之间进行通信交流。
通常,球迷提交的DBC文件包括可以解析CAN总线信息的工具和应用程序中,以便于程序能够读取和解析CAN总线发送的数据。
DBC文件是一种CAN总线数据定义文件,用于描述CAN总线数据的物理值、单位、发送周期、计算公式、信号名称等信息。这些信息可以帮助不同的ECU之间进行通信,保证信息的准确性和可靠性。
下面详细举例说明一个简单的DBC文件。
假设我们有两个ECU之间的通信,一个是车辆控制模块,一个是人机交互(HMI)模块,这两个模块需要交换车辆速度信息。那么我们可以使用一个DBC文件来定义这个速度信号:
VERSION "1.0"
NS_ :
Vector__XXX:
BU_: car_control_module
BU_: hmi_module
BO_ 180 car_speed: 8 car_control_module
SG_ speed : 0|16@1- (1,0) [0|160] "km/h" BU_ hmi_module
此DBC文件的含义为:
VERSION "1.0"定义了这个DBC文件的版本号。
NS_定义了这个DBC文件使用的命名空间。在这个例子中,命名空间为“Vector__XXX”,这是CAN database protocol的命名空间。
BU_定义了总线上的节点。 在这个例子中,我们有两个节点:“car_control_module”和“hmi_module”。
BO_定义了一个数据帧,每个数据帧都具有唯一的ID。在这个例子中,ID为180的数据帧表示车辆速度信息。
SG_定义了信号。在这个例子中,定义了一个名为"speed"的信号,这个信号是8位,从位0开始,长度为16位。速度的单位是km/h,发送周期为1秒。
在这个例子中,我们定义了一个速度信号,它将频繁地从车辆控制模块发送到HMI模块。当HMI需要显示车辆速度时,它将从CAN总线上接收到速度信号,并根据规定的计算公式来计算车辆速度。如果HMI需要向车辆控制模块发送速度命令,它将根据定义的单位和值范围来确定命令发送到CAN总线上。
总之,DBC文件是用来描述CAN总线数据的物理值、单位、发送周期、计算公式、信号名称等信息的规范文件。使用DBC文件可以简化CAN通信过程,从而提高CAN总线系统的可靠性和效率。
假设我们的汽车需要将转向角度信息从方向盘传输至车辆控制模块和人机交互(HMI)模块,我们需要创建一个符合CAN数据库协议规范的DBC文件进行定义。
VERSION "1.0"
NS_ :
Vector__XXX:
BU_: car_control_module
BU_: hmi_module
BO_ 210 steering_angle: 8 car_control_module
SG_ angle : 0|16@1- (0.1,-200) [0|3599.9] "degree" BU_ hmi_module
上面的DBC文件含义为:
VERSION "1.0"定义了这个DBC文件的版本号。
NS_定义了这个DBC文件使用的命名空间,Vector__XXX是CAN database protocol的命名空间。
BU_定义了总线上的节点,这个例子中,我们有两个节点:“car_control_module”和“hmi_module”。
BO_定义了一个数据帧,每个数据帧都具有唯一的ID,其中ID为210的数据帧,表示转向角度。
SG_定义了信号,其中定义名称为angle,占位长度为16位(从位0开始),值的范围是[0|3599.9],采用0.1的精度表示角度的变化,并以“degree”作为角度值的单位。
上述DBC文件描述了转向方向盘的角度值,并将其发送到车辆控制模块和HMI模块,HMI模块将根据规定的计算公式对转向的角度进行计算,并将所得到的结果在显示屏上显示。如果驾驶员需要控制车辆的方向,则使用方向盘将角度指令发送到CAN总线上,并由车辆控制模块接收后转动车轮进行行驶。
因此,DBC文件在CAN总线通信过程中扮演重要的角色,通过定义数据的标志、发送周期、计算公式、值域等规定,使得ECU之间的通信能够直接、准确地传输数据,保证了CAN总线通信协议的可靠性和高效性。
好的,以下给出DBC文件的不同部分的详细说明和相关示例:
命名空间(Namespace):
命名空间定义了两个或多个DBC文件中可能具有相同名称的定义之间的唯一标识符,使用关键字“NS_”开头。
示例:
NS_: Vector__XXX
BU_定义:
BU(节点)定义是指具有CAN节点地址的物理或逻辑单元,在CAN总线上保留节点地址并可以通过CAN总线进行通信。每个ECU在此之间进行数据通信时都有一个唯一的节点地址。BU_行开头是为了定义一个节点定义。
示例:
BU_ ECU1
BU_ ECU2
BU_ ECU3
顺序有效性(Ordering Validity):
顺序有效性是指基于消息中信号的顺序在解析器端进行解析时是否应该执行检查。例如,如果我们有一个带有2个信号的消息,第一个信号的长度为8位,第二个信号的长度为16位,我们可以决定消息不遵循顺序有效性以允许我们打包和解包数据的使用更高效,但是这导致了解析发生错误时的匹配难度。
示例:
BS_: 0 // 不启用顺序检查 (默认)
BS_: 1 // 启用顺序检查
消息(Message):
消息是在CAN总线上传输的数据帧,使用“BO_”来定义。每个消息都有自己的考虑要素:从基本的ID到发送周期和在CAN数据框架数据有效载荷中的位置。
示例:
BO_ 1000 TEST_MSG: 8 [0|255] Vector
这个消息的ID为1000(0x3E8);
名称为TEST_MSG;
消息载体的大小为8字节;
值域在0到255之间;
这个消息属于“Vector”厂家。
信号(Signal):
信号是消息的部分,用于传输实际数据。使用“SG_”来定义信号。采用与消息相同的单位和值域标度。
示例:
SG_ Car_Speed : 8|8@1+ (0.01,0) [0|4700] "Km/h" Vector
这个信号的名称为Car_Speed;
值的长度为8位,起始位置为8;
商定了小数点后一位的精度0.01;
值域为0-4700;
单位为“Km/h”;
信号所属厂家为“Vector”。
节点(Node):
节点定义了具有各自CAN地址的不同控制器之间的通信。使用BU_来定义一个或多个节点。
示例:
BU_ ECU1
BU_ ECU2
匹配(Matching):
匹配是一个特殊的信号定义,他必须在SG_定义之前插入。使用“val_table”关键字表示该信号的值。
示例:
BO_ 1000 TEST_MSG: 8 [0|255] Vector
SG_ RESPONSE_CNTL: 0|16@1+ (1,0) [1|7] "" Vector
VAL_ 1 "Accepted"
VAL_ 2 "Rejected"
这个消息的名称为“TEST_MSG”,ID为1000;
这个信号的名称为“RESPONSE_CNTL”;
这个信号的长度为16位,起始位置为1(bit 1 to bit 16);
值经历压缩,它的位宽为0,精度为1,最小值是0,最大值是7;
这个信号所属的厂商为“Vector”;
当信号的值为1时,在“Accepted”的价值前找到信号的价值为0;
当信号的值为2时,在“Rejected”的价值前找到信号的价值为0。
环形缓冲区(Ring Buffer):
环形缓冲区定义了可以存储消息ID和信号值的缓冲区,在定期的间隔中将其写入文件。使用“SG_MUL_VAL_”关键字进行定义。
示例:
BO_ 1000 TEST_MSG: 8 [0|255] Vector
SG_MUL_VAL_ VolCAN_[0] : 1|7@0+ (1,0) [0|100] "" Vector
SG_MUL_VAL_ VolCAN_[1] : 8|8@1+ (1,0) [0|100] "" Vector
SG_MUL_VAL_ VolCAN_[2] : 16|16@1+ (0.1,0) [-1000|1000] "" Vector
这个消息的名称为“TEST_MSG”,ID为1000;
长度为8字节;
值域范围是0到255;
当前环形缓冲区保存了3个信号,每个信号的名称以“VolCAN_”开头,一共有三个环形缓冲区信号,它们的名称分别为“VolCAN_[0]”, “VolCAN_[1]”, “VolCAN_[2]”;
通过之前定义的索引来读取环形缓冲区的信号值。
关于DBC文件,需要根据应用实例和具体要求来定义不同数据,上述是其中一些常见部分的示例。
————————————————
版权声明:本文为CSDN博主「江南侠客(上海)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_47712251/article/details/130144332
|