日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解析.DBC文件, 读懂CAN通信矩阵,实现车内信号仿真

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解析.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通信矩阵,实现车内信号仿真的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。