基於QT的CAN仿真工具(一)----CAN Dbc的格式


 

 

既然是CAN仿真工具,第一篇就講一下CAN DBC的格式,如何通過dbc文件定位到需要的信號 。下面用到的所有定義都已經做過處理,都是假的,不涉及任何商業使用的數據。

以下內容不針對沒有CAN基礎的同學,如果有基礎問題可以后面留言,不定期回復。以下內容均為原創,轉載請注明出處。

各個CAN工具公司都有CANDBC的編輯與查看工具並且都很智能 ,比如Vector的CANOE跟 CAN Alyzer或者intrepidcs的工具都有dbc的工具。那么問題來了,為啥我們還要人工去看看怎么解析 ,因為我們要做的是自己的CAN 工具,CAN dbc 的各種操作都需要自己去實現 ,所以這篇文章就是介紹如何用肉眼去解析CAN dbc,有了人工解析的能力,使用代碼解析就手到擒來了。

針對一個信號無非是以下幾個內容:

1. 信號所在的MessageID與名字,每個信號都依附於一個MeesageID;

2. 信號的名字,這個信號叫什么名字,有時候信號名字會有變化;

3. 信號的開始位置與長度,及時信號名變化,只要信號的位置與長度不變就不影響該信號的值;

4. 信號的Factor與Offset,由於每個CAN message 包含64bit的數據,只能表示整型,但是汽車中有很多物理量是需要小數點及負數的 ,比如溫度,-40度-+40度。因此需要引入factor和offset的概念,在計算物理值的時候需要用以下公式計算:

raw_value*Factor+Offset=Py_value

有時候我們需要計算某個物理值對應的rawvalue,簡單的解方程就能得到raw_value.;

5. 信號的值列表,有些信號為枚舉類型,比如車輛的Ignition信號,會有啟動,OFF不同的狀態,對應不同的raw value,包括物理值,也會有 invalid,Error等特殊狀態,在使用解析的時候都需要關注;

6. 極大值,極小值,一般根據信號的字節長度,跟Factor和Offset就可以計算出來,沒什么實際作用;

6. 信號的說明,描述說明信號是個什么東西,比如這個信號是車速之類的 ;

 

下面介紹如何從DBC里面找到上面這些信息:

第一步,需要知道開頭兩個字符的定義

第二步,找到Message,message都是以BO開頭,格式如下,從這里我們可以得到上面所述的信息1:

例如:

 BO_ 112 BCM_Mesage1: 8 BCM

“BO_ ” 起始字符串,代表這一行為定義一個Message

“112”  為10進制的Message ID

“BCM_Message1” 為Message的名字

“:” 分割符

“8” message 有多少個byte,一般為8個byte, 64 bit

“BCM” 消息的發送者

第三步,找到signal, 格式如下,在這個里面我們可以找到大部分的信息:

例如:

BO_ 100 BCM_Message1: 8 BCM     //這一行為Message
SG_ Ignition_Status : 13|4@0+ (1,0) [0|0] "SED"  GW  //以下為依附於該Message的Signal

SG_ Veh_V : 27|12@0+ (0.1,0) [0|409.5] "0 to 409.5 kilometers per hour"  ECM

“SG_” 該行為信號

“Ignition_Status” : 信號名為IgnitionStatus

“:13” 冒號后面第一位是起始位置

“|4” |后面的值,代表信號長度為4個bit

“@0+”  0 代表 byte_order = '0' | '1' ; (* 0=little endian, 1=big endian *), +號代表有無符號,value_type = '+' | '-' ; (* +=unsigned, -=signed *)

“(1,0)” 小括號的值代表Factor和Offset,用於計算

“[0|0]” 中括號的值代表最大值與最小值

“SED” 代表單位,SED一般代表沒有單位,因為這個值是一個枚舉狀態

“GW” 最后的GW代表接受的節點

第三步,找到信號的枚舉狀態,該行為一堆鍵值對,不同的值代表什么意思

VAL_ 100  Ignition_Status 15 "Invalid" 8 "Start" 4 "Run" 2 "Off" 0 "Unknown" ;

“VAL_” 代表該行定義了一堆鍵值對,信號的值與內容

“100” 與之前的MessageID一致, 代表信號所在的Message

“Ignition_Status” 信號的名字

“15 'Invalid'” 數值15代表invalid,其他都一樣

 

至此我們已經找到我們寫代碼需要的主要信息了,接下來會講解如何寫代碼解析DBC文件。 當然我們還有其他的內容可以去找,比如是否喚醒之類的,信號解釋什么的

 

CM_ SG_ 100 SteeringAngle "Absolute steering angle calculated from XXX motor position sensor value";

CM開頭的語句定義了信號有什么作用

 

 

BA開頭定義了信號的屬性,比如發送周期什么的,

BA_ "GenMsgCycleTime" BO_ 100 60; 代表信號為100的發送周期為60ms

 

 

 

參考內容:

dbc的format說明

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM