DBC檔案的閱讀方法

2021-10-07 02:36:18 字數 4322 閱讀 9013

最近為apollo適配新的線控的底盤,部分線控底盤的**商會給三個檔案:dbc檔案,協議說明書和協議的詳細檔案(一般都是excel檔案)。第乙個檔案就是apollo官方可以通過工具直接生成protocol檔案的,第二個檔案主要是說明如何使用這個協議的,第三個檔案是第乙個檔案的延展,具體到每個位或位元組代表什麼。但是可能部分廠家偷懶就只有第乙個和第二個檔案。這個時候為了去寫線控驅動就必須去讀dbc 檔案。

首先看一段dbc檔案內容

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_

sg_mul_val_

bs_:

bu_: dcu ids

bo_ 256 ids_dcu_msg100: 8 ids

sg_ ids_dcu_autoctrlena : 0|1@0+ (1,0) [0|1] "-" dcu

sg_ ids_dcu_modectrl_ctroll : 51|4@0+ (1,0) [0|15] "-" dcu

sg_ ids_dcu_modectrl_checksum : 63|8@0+ (1,0) [0|255] "-" dcu

版本資訊

版本資訊可以省略,不用管。

波特率定義

格式如下:

bs_:[baudrate:btr1,btr2];

其中bs_為關鍵字,用於定義can網路的波特率;[ ]內容表示為可選部分,可以省略(如下圖例子中即把該部分省略了);但關鍵字」bs_:」必須存在,省略則會出錯。這個檔案中是預設的,給的說明書裡說是500k,是否預設就是500k呢?簡單查了下資料沒有發現相關定義。有點不解。

網路節點的定義
格式如下:
bu_:nodename1 nodename2 nodename3 ……
其中bu_為關鍵字,表示網路節點,格式中的nodename1、nodename2表示定義的網路節點名字,由使用者自己定義;但需保證節點命名的唯一性。

如示例中的bu_: dcu ids :表示定義了dcu,ids這兩個網路節點。

報文幀的定義
格式如下:

bo_ messageid(10進製數表示) messagename: messagesize transmitter

(1)、bo_為關鍵字,表示報文;

(2)、messageid為定義的報文id,是以10進製數表示的;如例子中的996,代表報文id為0x3e4;

(3)、messagename表示該報文的名字,命名規則和c語言變數相同;

(4)、messagesize表示該報文資料域位元組數,為無符號整型資料;

(5)、transmitter表示傳送該報文的網路節點;如果該報文沒有指定傳送節點,則該值需設定為」 vector__***」。

如示例中的`bo_ 256 ids_dcu_msg100: 8 ids ` :表示定義了一條由ids這個節點傳送,資料域長度為8位元組,id為256,名字命名為ids_dcu_msg100的報文。

訊號的定義
格式如下:

sg_ signalname : startbit|signalsize@byteorder valuetype (factor,offset) [min|max] unit receiver

(1)、sg_為關鍵字,表示訊號;

(2)、signalname、 startbit、 signalsize分別表示該訊號的名字、起始位、訊號長度;

(3)、byteorder表示訊號的位元組順序:0代表motorola格式,1代表inter格式;

(4)、 valuetype 表示該訊號的數值型別:+表示無符號數,-表示有符號數;

(5)、factor表示因子,offset表示偏移量;這兩個值於該訊號的原始值與物理值之間的轉換。

轉換如下:物理值=原始值*因子+偏移量;

(6)、min|max表示該訊號的最小值和最大值,即指定了該訊號值的範圍;這兩個值為double型別;

(7)、unit表示該訊號的單位,為字串型別;

(8)、receiver表示該訊號的接收節點;若該訊號沒有指定的接收節點,則必須設定為」 vector__***」。

如示例中的`sg_ ids_dcu_autoctrlena : 0|1@0+ (1,0) [0|1] "-" dcu`

表示定義了乙個命名為ids_dcu_autoctrlena的訊號,其起始位是第0位,訊號長度1個位;訊號是motorola格式,數值型別為無符號型別數;因子為1,偏移量為0;訊號取值範圍為0到1;訊號單位為字串」-」(預設);該訊號接收節點為dcu這個節點。

註解部分

格式如下:

cm_ object messageid/nodename 「comment」

(1)、 cm_為關鍵字,表示註解資訊;

(2)、 object表示進行註解的物件型別,可以是節點「bu_」、報文「bo_」、訊息」sg_」;

(3)、 messageid/nodename 表示進行註解的物件,若前面的物件型別是訊號或者報文,則這裡的值應為報文的id(10進製數表示);若前面的物件型別為節點,則這裡的值應為節點的名字;

(4)、 comment表示進行註解的文字資訊;

如示例中的 cm_ sg_ 996 hud_heightlv 「control hud height level」;

表示對id為996(0x3e4)這條報文下的名為」hud_heightlv 」的訊號進行註解說明,說明的內容為"control hud height level"。

又如	`在這裡插入**片`cm_ bu_ hud 「head up display";表示對hud這個節點進行註解說明,說明的內容為" head up display "。
屬性定義部分
格式如下:

ba_def_ object attributename valuetype min max;

ba_def_def_ attributename defaultvalue;

(1)、 ba_def_為關鍵字,表示屬性定義;

(2)、 object表示屬性定義的物件型別,可以是節點「bu_」、報文「bo_」、訊息」sg_」、網路節點」 」(用空格表示)等;

(3)、 attributename表示進行定義的屬性名字;

(4)、 valuetype表示屬性值的型別,可以是整型、字串、浮點型、列舉型別等;

(5)、min/max表示屬性值的上下最值,即指定了取值範圍(字串型別沒有此項)。

(6)、 ba_def_def_為關鍵字,表示定義屬性的初始值;

(7)、 defaultvalue表示該屬性的初始值。

如示例中的 ba_def_ sg_ 「mytry」 int 0 11;

ba_def_def_ 「mytry」 0;

表示對定義了乙個針對訊號型別的屬性,屬性名為」mytry」,屬性值是整型資料,取值範圍在0到11之間,初始值為0。

數值表部分
格式如下:

val_ messageid signalname n 「definen」 …… 0 「define0」;

(1)、val_為關鍵字,表示數值表定義;

(2)、 messageid表示該訊號所屬的報文id(10進製數表示);

(3)、 signalname表示訊號名;

(4)、 n 「definen」 …… 0 「define0」表示定義的數值表內容,即該訊號的有效值分別用什麼符號表示 。

如示例中的 val_ 996 hud_offst 1 「active」 0 「not active」;

表示對id為996(0x3e4)的這條報文下的,乙個命名為」hud_offst」的訊號,進行其數值表的定義;用」active」取代1;用」not active」取代0。

DBC檔案解析 基於DBCView工具

關於dbc最全的文章在這裡 最新的dbcview的使用方法在 一 最新的dbcview的使用方法在 一 免費的dbc和excel相互轉換方法 dbc檔案解析 基於dbcview工具 1 dbc解析 網路節點 2 dbc解析 節點收發msg dbc檔案中會為每個節點定義傳送訊息和接收訊息 例如下圖所示...

基於C 的整車CAN通訊DBC檔案程式設計

最近需要實現基於excel的發動機台架自動化測量系統,需要用到dbc通訊檔案,特著此文,給需要的人 首先要定義存放dbc資料的結構體 首先是 訊號類和報文類 定義。此定義需遵循變數從屬關係 乙個dbc檔案內有多個bo 乙個bo 下有多個sg 可以參考此文章,作者提供的思路比較清晰,本文所述 基於此思...

Mangos原始碼分析(一) DBC檔案分析

2008 01 24 22 57 57 標籤 mangos 一 dbc檔案結構 檔案頭 檔案頭 4位元組 wdbc 記錄數 4位元組 記錄字段數 4位元組 每條記錄位元組數 4位元組 字串表總位元組數 4位元組 記錄1 欄位1 欄位2 欄位n 記錄2 欄位1 欄位2 欄位n 字串表 字串1 字串2 ...