既然是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
參考內容: