通过DBC文件的解析可以得到CAN数据库的结构,多个DBC文件组合可以得到整车网络拓扑。
因此DBC文件对于一辆车来说至关重要。
DBC文件是一个文本文件,其格式如下:
/******************************************************************************
DBC_File(network)=
version // VERSION
new_symbols // NS_(DESC_)
bit_timing // BS_ (*obsolete but required*)
nodes // BU_
value_tables // VAL_TABLE_
messages // BO_ / SG_
message_transmitters // BO_TX_BU_
environment_variables // EV_
environment_variables_data // ENVVAR_DATA_
signal_types // (*not used in normal DBC files*)
// SGTYPE_
// SGTYPE_VAL_
// BA_DEF_SGTYPE_
// BA_SGTYPE_
comments // CM_ ...
attribute_definitions // BA_DEF_(REL_)
sigtype_attr_list // (*not used in normal DBC files*)
attribute_defaults // BA_DEF_DEF_(REL_)
attribute_values // BA_(REL_)
value_descriptions // VAL_
category_definitions // CAT_DEF_ (*obsolete*)
categories // CAT_ (*obsolete*)
filter // FILTER_ (*obsolete*)
signal_type_refs // (*not used in normal DBC files*)
// SIG_TYPE_REF_
signal_groups // SIG_GROUP_
signal_extended_value_types // (*not used in normal DBC files*)
// SIG_VALTYPE_
// SIGTYPE_VALTYPE_
extended_multiplexing // SG_MUL_VAL_
;
******************************************************************************/
使用巴科斯-诺尔范式定义后,各字段的展开如下:
/******************************************************************************
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_']
];
bit_timing = 'BS_:' [baudrate ':' BTR1 ',' BTR2 ]
baud rate = unsigned_integer
BTR1 = unsigned_integer
BTR2 = unsigned_integer
nodes = 'BU_:' {node_name}
node_name = C_identifier
value_tables = {value_table}
value_table = 'VAL_TABLE_' value_table_name {value_description } ';'
value_table_name = C_identifier
value_description = double char_string
messages = {message}
message = BO_ message_id message_name ':' message_size transmitter {signal}
message_id = unsigned_integer
message_name = C_identifier
message_size = unsigned_integer
transmitter = node_name | 'Vector__XXX'
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
start_bit = unsigned_integer
signal_size = unsigned_integer
byte_order = '0' | '1' (* 0=little endian, 1=big endian *)
value_type = '+' | '-' (* +=unsigned, -=signed *)
factor = double
offset = double
physical_value = raw_value * factor + offset
raw_value = (physical_value – offset) / factor
minimum = double
maximum = double
unit = char_string
receiver = node_name | 'Vector__XXX'
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=32bit IEEEfloat, 2=64bit IEEEdouble *)
message_transmitters = {message_transmitter}
message_transmitter = 'BO_TX_BU_' message_id ':' {} transmitter ';'
value_descriptions = { value_descriptions_for_signal | value_descriptions_for_env_var }
value_descriptions_for_signal = 'VAL_' message_id signal_name { value_description } ';'
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_variables_data = environment_variable_data
environment_variable_data = 'ENVVAR_DATA_' env_var_name: ' data_size ';'
data_size = unsigned_integer
value_descriptions_for_env_var = 'VAL_' env_var_aname { value_description } ';'
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
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)';'
attribute_definitions = { attribute_definition | attribute_definition_relation}
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_definition_relation = 'BA_DEF_REL_' 'BU_SG_REL_' attribute_name attribute_value_type ';'
attribute_defaults = { attribute_default }
attribute_default = 'BA_DEF_DEF_' attribute_name attribute_value ';'
attribute_value = unsigned_integer
| signed_integer
| double
| char_string
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)';'
| 'BA_REL_' attribute_name ( 'BU_SG_REL_' node_name 'SG_' message_id signal_name attribute_value
| 'BU_BO_REL_' node_name message_id attribute_value) ';')
******************************************************************************/
使用上面的格式定义,可以比较容易的通过代码,实现自己的文件解析器。