维克多DBC文件结构

通过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=32­bit IEEE­float, 2=64­bit IEEE­double *)
    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) ';')

******************************************************************************/

使用上面的格式定义,可以比较容易的通过代码,实现自己的文件解析器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值