解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真
通常我們拿到某個ECU的通信矩陣數據庫文件,.dbc后綴名的文件。 直接使用CANdb++ Editor打開,可以很直觀的讀懂信號矩陣的信息,例如下圖:
現在要把上圖呈現的信號從.dbc文件中解析出來,供實現自動化仿真總線信號使用,比如使用python+支持can收發的硬件即可替代canoe實現信號仿真(性能上不夠用,可滿足功能測試所需)。
一個標準CAN幀中包含的信息有,消息ID、報文發送周期、 報文長度、信號信息等。
開始解析前,先了解一下報文幀。下表體現了摩托羅拉字節位序的報文發送時的字節序和bit序,一會兒可以幫助我們理解dbc中的定義
?
?我使用了notepad++打開數據庫文件,提取數據庫文件中的關鍵信息。此處隨意選取了其中一個ID=1015(dec)作為例子講解。全文本搜索1015,結果如下:
Line 62: BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX
Line 883: CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
Line 884: CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
Line 1265: BA_ "GenMsgCycleTime" BO_ 1015 1000;
Line 1463: BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;
Line 1967: VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;
挨個戳開每條搜索結果查看詳細內容,逐句解釋:
說明:dbc文件以空格符拆分數據信息,類似于csv文件以","拆分數據的意思," "屬于分隔符。還有其他分割信息的符號,如 "|",",","()","[]"等
1、報文消息數據格式解讀
舉例:以下是DBC中代表一條消息的描述信息
BO_ 1015 IPK_ODO_Consump: 8 Vector__XXX?
解釋:
BO_? ? ? ? 代表一條消息的起始標識
1015 ? 消息ID的十進制形式,=0x3f7
IPK_ODO_Consump ? 消息名
: ? 分割符號
8 ?消息報文長度,幀字節數
Vector__XXX? ? 發出該消息的網絡節點,標識為Vector__XXX時未指明具體節點
2、信號信息數據格式解讀
每條報文消息里面有多個報文信號,報文信號的信息的起始標識為"SG_",?它以一個"BO_"開始至下一"BO_"之間的內容止,詳細報文消息以縮進1或2個空格符形式類似樹圖子節點的方式呈現。
舉例:一條消息下的一個信號的信息,此處縮進一個空格
?SG_ IPK_EVDTEodometer : 7|12@0+ (1,0) [0|999] "km"? TBOX
解釋:
SG_ 代表一個信號信息的起始標識
IPK_EVDTEodometer? 信號名,分長名與短名,此處是短名。長名非必須存在,可以不定義
?:? 分割符號
7 ?信號起始bit
| 分割符號
12 信號總長度
@0+ ? @0表示是Motorola格式(Intel格式是1),+表示是無符號數據
(1,0) (精度值,偏移值)
[0|999] [最小值|最大值],?物理意義的最小與最大,現實世界的有物理意義的值,比如此處儀表續航里程最大999KM
"km" "單位"
TBOX 接收處理此信號的節點,同樣可以不指明,寫為Vector__XXX
1)Motorola格式與Intel格式
這個決定了信號起始bit,?生成報文計算信號值時的大小端算法。
Motorola格式:
?信號以高字節低位起始,此處占了12bit,?以第二字節的低bit 12位算起,計12個bit總長度,信號是連續的(此處連續針對低字節在前的字節發送序,參看LSB與MSB)。
比如我設置續航里程998KM,?它的信號值在整條報文中表現為 3E,60,00,00,00,00,00,00
發送字節序
?信號布局圖 (橫軸bit序,縱軸字節序;先從左至右,再由上至下閱讀信號)
?
Intel格式:
信號以低字節低位起始,此處占了12bit,?以第一字節的低bit 0位算起,計12個bit總長度,信號是非連續的(發送的字節序體現出的信號值非連續,但是bit位是由低到高連續的)。
比如我設置續航里程998KM,?信號值在報文中為?E6,03,00,00,00,00,00,00
?信號布局圖(橫軸bit序,縱軸字節序;先從右至左,再由上至下閱讀信號)
?
?
2)精度值與偏移量,物理值與信號值的關系公式:
信號值*精度值 +?偏移量 =?物理值
總線上報文消息中傳遞的是信號值,當此信號傳遞到ECU時,需轉換為物理意義的值在輸出接口顯示。
舉例:
SG_ TCU_TransOilTemp : 7|8@0+ (1,-40) [-40|214] "°C"? TBOX
若傳感器顯示16度,則 信號值=(物理值-偏移量)/精度值 = (16 - (-40))/1 = 56(dec) = 0x38,?報文呈現為“38,00,00,00,00,00,00,00”? (此處00表示未設置信號,","分割字節,以上同)
?3、消息與信號的詳細描述
CM_ BO_ 1015 "Transmitted by IPK, including EV DTE odometer, power consumption and fuel consumption";
CM_ SG_ 1015 IPK_EVDTEodometer "The EV DTE odometer ";
解釋:
CM_ 起始標識,我猜測CM_為comment縮寫
4、消息發送周期
BA_ "GenMsgCycleTime" BO_ 1015 1000;
解釋:
BA_ 起始標識,描述消息與信號更詳盡的信息。?以上語句描述了消息的周期,單位ms
5、信號默認值,起始值
BA_ "GenSigStartValue" SG_ 1015 IPK_EVDTEodometer 4095;
解釋:
BA_? 起始標識,描述消息與信號更詳盡的信息。?以上語句描述了消息中具體信號的初始值,十進制表示
6、值枚舉或特殊值列舉或取值范圍描述
VAL_ 1015 IPK_EVDTEodometer 4095 "Invalid" ;
?解釋:
VAL_ 起始標識符,對信號值的描述
以上是DBC解析的的完整內容,轉載注明出處。
轉載于:https://www.cnblogs.com/yao-zhang/p/10220665.html
總結
以上是生活随笔為你收集整理的解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: codeforces CF986C AN
- 下一篇: 2018-2019-1 20189210