本文是Vector文档DBC_File_Format_Documentation.pdf的翻译,水平有限,仅供参考。
1 Introduction 介绍
DBC(DataBase for Can)文件由Vector公司开发的数据库文件,用来描述单个CAN网络的通信,用于监视和分析网络并模拟物理上不可用的节点(剩余总线仿真)。
DBC文件还可用于开发属于CAN网络的电子控制单元的通信软件。DBC文件不处理ECU的功能行为。
2 General Definitions 一般定义
本文用到的几个通用的定义:
unsigned_integer: an unsigned integer
signed_integer: a signed integer
double: a double precision float number
char_string: an arbitrary string consisting of any printable characters except double hyphens ('"').
C_identifier: a valid C_identifier. C_identifiers have to start with am alpha character or an underscore and may further consist of alpha-numeric characters and underscores.
C_identifier = (alpha_char | '_') {alpha_num_char | '_'}
DBC文件中用到的几个关键字:
关键字 | 对象类型 |
BU_ | 网络节点 |
BO_ | 消息 |
SG_ | 信号 |
EV_ | 环境变量 |
本文使用BNF标记语法描述:
符号 | 含义 |
= | 等号右边的语法是对等号左边名称的定义 |
; | 分号结束一个定义 |
| | 竖线表示可选择的 |
[ … ] | 方括号内的内容是可选的(出现零次或一次) |
{ … } | 大括号内的内容是重复的(出现零次或多次) |
( … ) | 小括号定义分组的元素 |
' … ' | 单引号中的文本必须按照定义显示 |
(* … *) | 注释 |
3 Structure of the DBC File DBC文件结构
DBC文件的总体结构如下:
DBC_file =
version
new_symbols
bit_timing (*废弃但必须的*)
nodes
value_tables
messages
message_transmitters
environment_variables
environment_variables_data
signal_types
comments
attribute_definitions
sigtype_attr_list
attribute_defaults
attribute_values
value_descriptions
category_definitions (*废弃的*)
categories (*废弃的*)
filter (*废弃的*)
signal_type_refs
signal_groups
signal_extended_value_type_list ;
DBC文件使用以下几个部分描述can网络的基本通信:
• Bit_timing 位定时
这个部分是必要的,但一般是空的
• nodes 节点
这个部分是必要的,定义了网络的节点
• messages 消息
这个部分定义了消息和信号
以下部分不在普通的DBC中使用,仅出于完整性的目的在此定义它们:
• signal_types
• sigtype_attr_list
• category_definitions
• categories
• filter
• signal_type_refs
• signal_extended_value_type_list
如果不为系统或其余总线模拟定义任何附加数据,DBC文件内不包含环境变量。
4 Version and New Symbol Specification 版本和新符号规范
DBC文件包含带有版本和新符号条目的标头。版本是空的或者是CANdb编辑器使用的字符串。
version = ['VERSION' '"' { CANdb_version_string } '"' ];
new_symbols = [ '_NS' ':' ['CM_'] ['BA_DEF_']['BA_']['VAL_']['CAT_DEF_'] ['CAT_'] ['FILTER'] ['BA_DEF_DEF_'] ['EV_DATA_']['ENVVAR_DATA_'] ['SGTYPE_'] ['SGTYPE_VAL_'] ['BA_DEF_SGTYPE_']['BA_SGTYPE_'] ['SIG_TYPE_REF_'] ['VAL_TABLE_'] ['SIG_GROUP_']['SIG_VALTYPE_'] ['SIGTYPE_VALTYPE_'] ['BO_TX_BU_']['BA_DEF_REL_'] ['BA_REL_'] ['BA_DEF_DEF_REL_'] ['BU_SG_REL_']['BU_EV_REL_'] ['BU_BO_REL_'] ];
5 Bit Timing Definition位定时定义
位定时部分定义了总线的波特率和BTR寄存器的设置,这部分废弃不再使用了,但是DBC文件中一定要有BS_关键字。
bit_timing = 'BS_:' [baudrate ':' BTR1 ',' BTR2 ] ;
baudrate = unsigned_integer ;
BTR1 = unsigned_integer ;
BTR2 = unsigned_integer ;
6 Node Definitions节点定义
节点部分定义了所有节点的名称,这些名称不能重复。
nodes = 'BU_:' {node_name} ;
node_name = C_identifier ;
7 Value Table Definitions值表定义
值表部分定义了全局值表。值表里的值描述定义了原始值的编码。在常用的DBC文件中不使用全局值表,而是为每个信号单独定义值描述
value_tables = {value_table} ;
value_table = 'VAL_TABLE_' value_table_name
{value_description}';' ;
value_table_name = C_identifier ;
7.1 Value Descriptions值描述
值描述定义单个值的文本描述。 该值可以是总线上传输的信号原始值,也可以是剩余总线仿真中环境变量的值。
value_description = double char_string ;
8 Message Definitions消息定义
消息部分定义了所有帧的名称、属性以及在这些帧上传输的信号。
messages = {message} ;
message = BO_ message_id message_name ':' message_size
transmitter {signal} ;
message_id = unsigned_integer ;
消息的id必须是唯一的,最高有效位是1的帧是扩展帧,将扩展帧的id与上0xCFFFFFFF就可以获得实际id。
message_name = C_identifier ;
在此部分中定义的名称在消息集中必须是唯一的。
transmitter = node_name | 'Vector__XXX' ;
transmitter指定了发送此消息的节点,它必须在前面定义的节点集合之中,没有发送节点的消息的transmitter为'Vector__XXX'
8.1 Signal Definitions 信号定义
消息的信号部分列出了位于此消息的所有信号,包括信号的位置和属性。
signal = 'SG_' signal_name multiplexer_indicator ':' start_bit '|'signal_size '@' byte_order value_type '(' factor ',' offset ')''[' minimum '|' maximum ']' unit receiver {',' receiver} ;
signal_name = C_identifier ;
一个消息中的所有信号名不能重复。
multiplexer_indicator = ' ' | 'M' | m multiplexer_switch_value ;
复用指示器定义了信号是普通信号、复用索引信号还是复用信号。大写'M'表示复用索引信号,一个消息中只能有一个复用索引信号。小写’m’后面跟一个无符号整型数,表示信号为复用信号,如果消息的复用索引信号等于此复用信号的multiplexer_switch_value,则在消息中传送此复用信号。
start_bit = unsigned_integer ;
start_bit值指定了信号在帧数据域中的位置。对于Intel格式的信号,start_bit值是最低有效位的位置。对于motorola格式的信号,start_bit值是最高有效位的位置。这些位以锯齿方式计数。起始位的范围为0 到 (8 * message_size - 1).
signal_size = unsigned_integer ;
signal_size指定了信号的位数。
byte_order = '0' | '1' ; (* 0=little endian, 1=big endian *)
如果是字节顺序是intel格式,那这一位就是0;如果是motorola格式,这一位是1。
value_type = '+' | '-' ; (* +=unsigned, -=signed *)
值类型定义了信号是有符号还是无符号的。
factor = double ;
offset = double ;
因数和偏移定义了信号原始值到信号物理值的线性转换规则(因数不能是0):
physical_value = raw_value * factor + offset
raw_value = (physical_value – offset) / factor
minimum = double ;
maximum = double ;
最大值最小值定义了信号物理值的范围
unit = char_string ;
receiver = node_name | 'Vector__XXX' ;
receiver定义了信号的接收者,接收者名称必须是前面定义的节点集合里面的。如果没有接收者,就是用'Vector__XXX'。
float和double类型的信号由signal_valtype_list定义
signal_extended_value_type_list = 'SIG_VALTYPE_' message_id
signal_name signal_extended_value_type ';' ;
signal_extended_value_type = '0' | '1' | '2' | '3' ; (* 0=signed or unsigned integer, 1=32-bit IEEE-float, 2=64-bit IEEE-double *)
8.2 Definition of Message Transmitters消息发送者的定义
消息发送器部分可以定义一个消息由多个发送节点发送,一般用来描述高层的通信。
message_transmitters = {message_transmitter} ;
Message_transmitter = 'BO_TX_BU_' message_id ':' {transmitter} ';' ;
8.3 Signal Value Descriptions信号值描述
信号值部分定义了特定信号原始值的编码。
value_descriptions = { value_descriptions_for_signal |value_descriptions_for_env_var } ;
value_descriptions_for_signal = 'VAL_' message_id signal_name{ value_description } ';' ;
9 Environment Variable Definitions环境变量定义
在环境变量部分,定义了在系统仿真和剩余总线仿真中用的环境变量
environment_variables = {environment_variable}
environment_variable = 'EV_' env_var_name ':' env_var_type '[' minimum '|' maximum ']' unit initial_value ev_id access_type access_node {',' access_node } ';' ;
env_var_name = C_identifier ;
env_var_type = '0' | '1' | '2' ; (* 0=integer, 1=float, 2=string *)
minimum = double ;
maximum = double ;
initial_value = double ;
ev_id = unsigned_integer ; (* obsolete *)
access_type = 'DUMMY_NODE_VECTOR0' | 'DUMMY_NODE_VECTOR1' |'DUMMY_NODE_VECTOR2' | 'DUMMY_NODE_VECTOR3' ; (*0=unrestricted, 1=read, 2=write, 3=readWrite *)
access_node = node_name | 'VECTOR_XXX' ;
环境变量数据部分中的条目将此处列出的环境定义为“数据”数据类型。这种类型的环境变量可以存储给定长度的任意二进制数据。长度以字节为单位给出。
environment_variable_data = 'ENVVAR_DATA_' env_var_name ':'data_size ';' ;
data_size = unsigned_integer ;
9.1 Environment Variable Value环境变量值描述
环境变量的值描述提供了该变量的特定值的文本表示形式。
value_descriptions_for_env_var = 'VAL_' env_var_name{ value_description } ';' ;
10 Signal Type and Signal Group Definitions信号类型和信号组定义
信号类型用于定义多个信号的通用属性,通常在dbc文件中不使用它们。
signal_types = {signal_type} ;
signal_type = 'SGTYPE_' signal_type_name ':' signal_size '@'byte_order value_type '(' factor ',' offset ')' '[' minimum '|' maximum ']' unit default_value ',' value_table ';' ;
signal_type_name = C_identifier ;
default_value = double ;
value_table = value_table_name ;
signal_type_refs = {signal_type_ref} ;
signal_type_ref = 'SGTYPE_' message_id signal_name ':' signal_type_name ';' ;
信号组用来定义在一个消息中的一组信号,比如定义必须共同更新的一组信号。
signal_groups = 'SIG_GROUP_' message_id signal_group_name repetitions ':' { signal_name } ';' ;
signal_group_name = C_identifier ;
repetitions = unsigned_integer ;
11 Comment Definitions注释定义
注释部分包含了注释对象,对于每一个带有注释的对象,本节都会定义一个带有对象类型标识符的条目。
comments = {comment} ;
comment = 'CM_' (char_string |'BU_' node_name char_string |'BO_' message_id char_string |'SG_' message_id signal_name char_string |'EV_' env_var_name char_string)';' ;
12 User Defined Attribute Definitions用户定义的属性
用户定义的属性是一个扩展dbc文件对象属性的方式,这些附加的属性必须用一个带有属性默认值的属性定义。对于具有为属性定义的每个对象,必须定义属性值条目。如果没有为对象定义属性值,对象属性值是默认的属性值。
12.1 Attribute Definitions 属性定义
attribute_definitions = { attribute_definition } ;
attribute_definition = 'BA_DEF_' object_type attribute_name attribute_value_type ';' ;
object_type = '' | 'BU_' | 'BO_' | 'SG_' | 'EV_' ;
attribute_name = '"' C_identifier '"' ;
attribute_value_type = 'INT' signed_integer signed_integer |'HEX' signed_integer signed_integer |'FLOAT' double double |'STRING' |'ENUM' [char_string {',' char_string}]
attribute_defaults = { attribute_default } ;
attribute_default = 'BA_DEF_DEF_' attribute_name attribute_value';' ;
attribute_value = unsigned_integer | signed_integer | double |char_string ;
12.2 Attribute Values属性值
attribute_values = { attribute_value_for_object } ;
attribute_value_for_object = 'BA_' attribute_name (attribute_value |'BU_' node_name attribute_value |'BO_' message_id attribute_value |'SG_' message_id signal_name attribute_value |'EV_' env_var_name attribute_value)';' ;
13 Examples 示例
VERSION ""
NS_ :
NS_DESC_
CM_
BA_DEF_
BA_
VAL_
CAT_DEF_
CAT_
FILTER
BA_DEF_DEF_
EV_DATA_
ENVVAR_DATA_
SGTYPE_
SGTYPE_VAL_
BA_DEF_SGTYPE_
BA_SGTYPE_
SIG_TYPE_REF_
VAL_TABLE_
SIG_GROUP_
SIG_VALTYPE_
SIGTYPE_VALTYPE_
BO_TX_BU_
BA_DEF_REL_
BA_REL_
BA_DEF_DEF_REL_
BU_SG_REL_
BU_EV_REL_
BU_BO_REL_
BS_:
BU_: Engine Gateway
BO_ 100 EngineData: 8 Engine
SG_ PetrolLevel : 24|8@1+ (1,0) [0|255] "l" Gateway
SG_ EngPower : 48|16@1+ (0.01,0) [0|150] "kW" Gateway
SG_ EngForce : 32|16@1+ (1,0) [0|0] "N" Gateway
SG_ IdleRunning : 23|1@1+ (1,0) [0|0] "" Gateway
SG_ EngTemp : 16|7@1+ (2,-50) [-50|150] "degC" Gateway
SG_ EngSpeed : 0|16@1+ (1,0) [0|8000] "rpm" Gateway
CM_ "CAN communication matrix for power train electronics
*******************************************************
implemented: turn lights, warning lights, windows";
VAL_ 100 IdleRunning 0 "Running" 1 "Idle" ;
【本文完】