Intel與Motorola的編碼格式
Vector CANdb++ Online Help
在這份教程的第一部分,我們提到沒有CAN資料庫,CANoe還不能工作。在第二部分,我們來看看CAN資料庫是怎樣的。通過CANoe的Tools選單,或者從開始選單開啟Vector的CAN資料庫編輯器——CANdb++ Editor。
簡介
CAN總線上有4種報文:資料幀、遠端幀、錯誤幀、超載幀。其中只有資料幀真正承載資料。CAN資料庫儲存這些的資料幀的所有屬性,這樣當我們發現了某條報文在總線上出現時,利用資料庫中的資料,就能查詢出相關的資料。比如這條報文的收發者,以及其表示的意義。
在Vector格式的資料庫中,資料被組織成了6種不同的物件(Object):
- 訊號(Signal)
- 報文(Message)
- 網路節點(Network node),或者簡稱節點
- 環境變數(Environment variable)
- 裝置(ECU)
- CAN網路(Network)
物件是有級別的,高階的物件由若干低階物件附加額外的屬性構成。如下圖:
訊號和報文訊號的關係稍後會解釋。報文訊號到報文的箭頭表示(若干)訊號組成報文;報文到節點的箭頭表示報文擁有傳送節點;報文訊號到節點的箭頭表示擁有接收節點;節點和環境變數到ECU的箭頭表示它們組成了ECU;同樣,ECU組成了網路。這和CAN匯流排的互動結構是一樣的。
在CANoe自帶的CANdb++版本中,一個數據庫最高階的物件是Network,且只能有一個,其名字與檔名相同。在更高階的Vector CANdb++ Admin版本中,最高階為一個叫Vehicles的物件,可以包含若干Network。
物件說明
訊號
訊號(Singal)代表了資訊的最小單位,也就是一個“值”。例如發動機轉速,開關的位置等。其主要的屬性有:name
, length
, Byte
order
, Value type
。具體含義可以參考CANdb++的Help中,Signal and Message
Signal一節。注意Byte order屬性,我們稱之為“格式”,它可以設定為Motorola
或者Intel
,稍後會詳細介紹。
報文訊號
報文訊號(Mapped signal)其實就是訊號,區別在於當一個訊號成為報文的組成部分時,它就會變成報文訊號。因為它算是存在於報文中的,因此多了兩個屬性:
- Startbit: 起始位,也就是訊號在報文中的位置。
- Receivers: 這個Signal會被哪個節點接收,這也是上圖訊號到節點的箭頭的意義。
一個訊號可以包含在多個報文中,之後會變成多個不同的報文訊號,CANdb++ Editor中也叫對映的訊號(Mapped Signal)。這是為了Singal可以重用,資料庫中其它物件都不能這樣重用。
報文
報文(Message)代表一條CAN報文,它就是在CAN總線上實際傳送的內容。報文包含若干訊號,有name
, ID
, DLC
, Transmitters
等屬性,具體參考Help文件。需要說明的是,理論上只有一個節點會是報文的傳送者,不過CANdb++
Editor中可以設定多個。
另外,Message的屬性頁中的Layout,可以直觀的設定Message包含的Message Signal的位置(也就是其Startbit屬性),它編輯的並不是Message的屬性。
網路節點
網路節點(Node),它幾乎代表了一個裝置(ECU)。之所以說幾乎,首先是因為ECU還包含了環境變數,其次是因為有一種特殊的ECU模型,它叫做閘道器(Gateway)。閘道器包含兩個或更多節點,我們等會兒再來說明它。
所以通常,節點 + 環境變數 = ECU,節點的主要屬性就只有name
而已。
環境變數
環境變數(Environment varisble),用來儲存ECU中的資料,比如開關位置、感測器訊號等。節點讀寫這些變數,同時,環境變數還能夠被其它東西讀寫,比如虛擬的感測器。環境變數的存在是為了更好的模擬ECU這個模型。節點利用環境變數和環境交換資訊。
ECU
上面已經差不多說明了,ECU其實就是節點和環境變數的組合,代表真實世界的儀器裝置。在CANdb++ Editor中,ECU的可設定的屬性只有其包含哪些環境變數。ECU物件名字無法編輯的,它等於節點的名字。
網路
Network表示真實世界中的一條CAN匯流排,它包含若干ECU。
閘道器
閘道器(Gateway),是一種特殊的ECU,它包含多個節點,以及環境變數。各個節點屬於不同的網路,通過共用的環境變數交換資料。這樣,各個網路就可以通過閘道器交換資訊。這也是“閘道器”名字的由來。需要注意的是,CANdb++ Editor非Admin版本中,dbc檔案只能含有唯一一個Network,因此閘道器這種模型是建立不出來的(汗
關於訊號的起始位
稍微瞭解點CAN之後,CAN資料庫非常容易理解,它其實就是CAN匯流排的模型。不過訊號的“起始位”屬性,還是得仔細說明。藉助報文的Layout,理解起來會稍容易一些。
我們已經知道,報文包含若干訊號。訊號的格式(Byte order)可以是兩種之一:Motorola或者Intel。他們是指Motorola和Intel處理器中使用的資料的儲存格式,也就是兩種位元組序,Motorola是大端位元組序,Intel是小端位元組序。具體來說,十進位制數128,寫成二進位制數1000
0000
,就是大端位元組序,而寫成0000 0001
就是小端位元組序。
Byte order for Motorola processors (Big Endian): MSB ... ... LSB Byte order for Intel processors (Little Endian): LSB ... ... MSB
CANdb++ Editor中,都表示成(注意大小寫):
msb ... ... lsb
不過我認為這樣理解起來更加混亂,因此我們還是按照MSB和LSB來看。
這兩種位元組序的訊號在報文中的排列規則也不同。為了解釋這些規則,我們假如報文的DLC為8,也就是報文中含有8位元組的資料,共8 * 8 = 64 bit
。把每一位都列在一張表中。
如果位編號從右至左(R2L),那麼:
7 6 5 4 3 2 1 0 -------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
如果位編號從左至右(L2R),那麼:
0 1 2 3 4 5 6 7 -------------------------------- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
這兩種編號方式中,位元組的編號是一樣的,位的編號不同。CAN報文是序列傳送的,CAN節點在傳送報文時,不論如何編號,總是從表的左上第一位開始傳送。從左至右,從上至下。
x x x x x x x x -------------------------------- 1st 2nd 3rd 4th 5th 6th 7th 8th | 0 ... ... ... ... ... ... ... ... | 1 ... ... ... ... ... ... ... ... | 2 ... ... ... ... ... ... ... ... | 3 ... ... ... ... ... ... ... ... | 4 ... ... ... ... ... ... ... ... | 5 ... ... ... ... ... ... ... ... | 6 ... ... ... ... ... ... ... last| 7
上面說到不同位元組序(格式)的訊號在報文中的排列規則也不同:Intel格式的訊號的每位,從MSB到LSB,按照從右至左,從上至下的順序排列(向右上角塞):
x x x x x x x x -------------------------------- >.. ... ... ... ... ... ... MSB | 0 LSB ... ... ..> | 1 | 2 | 3 | 4 | 5 | 6 | 7
在CANdb++中看時,記得把MSB和LSB分別換成lsb和msb(注意順序)。
而Motorola格式的訊號,從MSB到LSB,按照每位從左至右,從上至下排列(向左上角塞):
x x x x x x x x -------------------------------- MSB ... ... ... ... ... ... ..< | 0 <.. ... ... LSB | 1 | 2 | 3 | 4 | 5 | 6 | 7
在CANdb++中看時,記得把MSB和LSB分別換成msb和lsb。
<
或者>
表示訊號的銜接點。通常一個Message中只應該含有同一種格式的訊號。否則:
x x x x x x x x -------------------------------- >l e t n I ... ... MSB | 0 LSB ... ... ..> | 1 MSB ... M o t o r o< | 2 <l a ... LSB | 3 | 4 | 5 | 6 | 7
於是Intel向左上擠,佔據了12個位。Motorola向右上擠就只能從byte2開始排列了,中間的4位不得不空出來。
至此應該沒有太多問題,不過接下來才是混亂的:Intel格式的訊號有2種表示方法Intel Standard
和Intel
Sequential
:
Intel Standard表示法:
7 6 5 4 3 2 1 0 -------------------------------- | 0 >.. ... ... MSB | 1 LSB ... ... ... ... ... ... ..> | 2 | 3
這種表示法使用從右至左的位編號方式。例子中我們假設前12位(bit0~11)已經被其它訊號佔滿了。這個訊號起始位為MSB,即:12。說出Intel Standard、起始位12、長度12位,就能在Message中確定Singal的位置了。
Intel Sequential表示法:
0 1 2 3 4 5 6 7 -------------------------------- | 0 >.. ... ... MSB | 1 LSB ... ... ... ... ... ... ..> | 2 | 3
這種表示法使用從左至右的位編號方式。前12位(bit7~0, 15~12)已經被佔,這個訊號起始位為MSB,即:11。
Motorola式的訊號有4種表示方法,分別是:Motorola Forward LSB
, Motorola
Forward MSB
,Motorola Sequential
, Motorola
Backward
。
Motorola Forward LSB:
7 6 5 4 3 2 1 0 -------------------------------- | 0 MSB ... ... ..< | 1 <.. ... ... ... ... ... ... LSB | 2 | 3
從右至左編號方式,起始位為LSB,即:16。
Motorola Forward MSB:
7 6 5 4 3 2 1 0 -------------------------------- | 0 MSB ... ... ..< | 1 <.. ... ... ... ... ... ... LSB | 2 | 3
從右至左編號方式,起始位為MSB,即:11。
Motorola Sequential:
0 1 2 3 4 5 6 7 -------------------------------- | 0 MSB ... ... ..< | 1 <.. ... ... ... ... ... ... LSB | 2 | 3
從左至右編號方式,起始位為MSB,即:12。
也許你覺得最後一種方法應該是從左至右編號,起始位為LSB,但是世間萬物總是那麼不如意。
Motorola Backward:
7 6 5 4 3 2 1 0 -------------------------------- | 3 MSB ... ... ..< | 2 <.. ... ... ... ... ... ... LSB | 1 | 0
非常費解的編號方式,它的位元組編號是從下到上,位編號從右到左,起始位置為LSB,即8。
針對兩種格式訊號使用的表示法可以在CANdb++ Editor選單欄的Option > Settings > Display
中設定。但不論設定如何,資料庫進行儲存時,Intel格式使用Intel
Sequential表示法儲存,Motorola格式使用Motorola Sequential表示法儲存,避免在設定不同的編輯器中開啟時出現誤解。
在這份教程裡,我們都使用Motorola格式的訊號,並且使用Motorola Forward MSB式的表示方法。它應該和很多人(比如我)的第一感覺相同。
第一份CAN資料庫
現在讓我們著手建立一份簡單的CAN資料庫。它有1個訊號,1條報文,2個節點分別作為收發節點,1個環境變數用來演示其使用。當然,不用說,有1個網路。
CANdb++ Editor中,使用File > Create Database...
來新建一個叫candb.dbc
的資料庫,程式會詢問你使用的模板。不同模板的區別在於每個物件的屬性多少。越複雜的模板屬性越多,這裡我們使用最簡單的EmptyTemplate.dbc
在CANdb++ Editor預設開啟的Overall View視窗的左側,我們可以看到各個物件的分類。如果不是的話,找選單欄View > Overall
View
。
建立節點
在Newwork noedes上右鍵新建,
Name: ECM
同樣再新建一個:
Name: METER
建立報文
在Message上右鍵,新建:
Name: EngineState Type: CAN Standard ID: 0x1 DLC: 1
Transmitters中,點選Add...
,選擇ECM。
建立訊號
在Singal上點選右鍵,New...
,之後輸入:
Name: Speed Length[bit]: 8 Byte Order: Motorola Value Type: Unsigned Unit: m/s Factor: 0.1 Offset: 0 Minimum: 0 Maximum: 25.5
Messages頁中點選Add...
,選擇EngineState。
編輯報文訊號
展開左側Messages下的EngineState,右鍵點選Speed,選擇Edit Mapped Singal
。
Startbit[bit]: 7
Receivers頁中點選Add...
,選擇METER。
建立環境變數
在左側Environment variables上右鍵新建
Name: env_speed Value Type: Float Access: Read Unit: m/s Initial Value: 0 Minimum: 0 Maximum: 25.5
Control units頁中新增ECM。
再次確認一下,使用View > Communication Matrix
非常好,我們的資料庫如此精煉。資料庫的教程至此,儲存在<project>\database
資料夾中吧。
額外的說明
Vector的CANdb資料庫其實是一個編碼為ANSI的文字檔案,可以使用任何文字編輯器開啟。其結構可以參考Vector的DBC File Format Documentation,在官網似乎搜不到這份檔案,就只有提供民間版本了。
這在你有了某種結構的資料庫檔案(比如表格檔案格式),想要轉換成Vector的dbc檔案的,可以寫程式轉換,而不是手動輸入。
相關推薦
Intel與Motorola的編碼格式
Vector CANdb++ Online Help 在這份教程的第一部分,我們提到沒有CAN資料庫,CANoe還不能工作。在第二部分,我們來看看CAN資料庫是怎樣的。通過CANoe的Tools選單,或者從開始選單開啟Vector的CAN資料庫編輯器——CANdb++
Intel格式與Motorola格式的區別
文章出處:http://blog.csdn.net/ppdyhappy/article/details/52700464 Intel低位元組在前 Motorola高位元組在前 在進行CAN匯流排通訊設計或者測試過程中,經常看到
報文 Intel 格式與Motorola 格式的區別
當一個訊號的資料長度不超過 1 個位元組(8 位)時,Intel 與 Motorola 兩種格式的編碼結果沒有什麼不同,完全一樣。當訊號的資料長度超過 1 個位元組(8 位)時,兩者的編碼結果出現 了明顯的不同。 訊號的高位,即最能表達訊號特性的因子,比如:車速訊號 500km/
CAN報文 Intel 格式與Motorola 格式的區別
當一個訊號的資料長度不超過 1 個位元組(8 位)時,Intel 與 Motorola 兩種格式的 編碼結果沒有什麼不同,完全一樣。當訊號的資料長度超過 1 個位元組(8 位)時,兩者的編碼結果出現 了明顯的不同 1. 訊號的高位,即最能表達訊號特性
mysql中數據庫與數據表編碼格式的查看、創建及修改
utf8 auth body int bar variable variables 如果 constrain 一、查看數據庫編碼格式 ? 1 mysql> show variables like ‘character_set_database‘;
java 圖片文件Base64編碼與二進制編碼格式互相轉換
jre public log 編碼 lose img csdn rac body 1 public static byte[] base64String2ByteFun(String base64Str){ 2 BASE64Decoder
WCF標準綁定以及傳輸協議與編碼格式
blog image post 技術分享 info clas 分享圖片 gpo http WCF標準綁定以及傳輸協議與編碼格式
Python編碼格式理解:encoding與decoding
在Python對txt文件處理的時候,txt文件預設為gb2312編碼,在開啟檔案的時候,將其轉換為Utf-8編碼,才能進一步處理。 fi=open("c:/","r",encoding="utf-8") 常用的幾種編碼關係如下: 因為開啟的檔案已經轉換為utf-8,所以寫入的時候
bcd與hex轉換、以及編碼格式
1、BCD碼 (1)壓縮BCD:4位二進位制數表示一個十進位制數,例如: 0001 0010 --> 12 0001 0011 --> 13 (2)BCD:8位二進位制數表示一個十進位制數,高四位為
HTTP請求編碼格式與報文
HTTP請求的編碼格式有很多中,這裡主要記述一些常用的。 application/x-www-form-urlencoded:窗體資料被編碼為名稱/值對。(預設)。空格轉換為 “+” 加號,但不對特殊字元編碼。 multipart/form-data:窗體資
VS 修改預設編碼格式 為utf-8 無 BOM 與 utf-8 帶BOM
VS 在使用的時候預設的編碼格式為 GB2312 如何修改預設的編碼格式呢? 網上都說修改 VS 建立檔案時的模板 如C++ 則修改 C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcprojectitems
字元與位元組區別,編碼格式的字元長度
(一)“位元組”的定義 位元組(Byte)是一種計量單位,表示資料量多少,它是計算機資訊科技用於計量儲存容量的一種計量單位。 (二)“字元”的定義 字元是指計算機中使用的文字和符號,比如1、
Android直播開發之旅(4):MP3編碼格式分析與lame庫編譯封裝
轉載請宣告出處:http://blog.csdn.net/andrexpert/article/77683776 一、Mp3編碼格式分析 MP3,全稱MPEG Audio Layer3,是一種高效的計算機音訊編碼方案,它以較大的壓縮比(1:10至1:12)將音
g711u與g729比較編碼格式
•g711a—編解碼格式為G.711 alaw •g711u—編解碼格式為G.711 ulaw (the default) •g729—編解碼格式為G.729 •g729a—編解碼格式為G.729a 上面的就是voip使用的編碼解碼格式的,我們到底選擇哪個
LInux的服務器編碼格式的查看與更改
roo inux span alt image bubuko 服務 src sys 1.locale 命令查看字符編碼 然後修改/etc/sysconfig/i18n,如改成中文編碼: LANG=en_US.UTF-8 改為 LANG="zh_CN.GBK"
Java 修改編碼格式的幾種方式
格式 text cnblogs 修改 .com pac 方式 src -1 1、工作空間 workspase Window→Preferences→General→Workspace→Text file encoding→other→UTF-8 2、項目編碼格式 右鍵項目
js字符串與Unicode編碼互相轉換
char 字符串 name targe ron strong target nbsp log ‘好‘.charCodeAt(0).toString(16) "597d" 這段代碼的意思是,把字符‘好‘轉化成Unicode編碼, 看看charCodeAt()是怎麽個意思
【編碼格式錯誤】SyntaxError: Non-UTF-8 code starting with
org 一行 文件 編碼 with details pla err pytho 問題: SyntaxError: Non-UTF-8 code starting with ‘\xba‘ in file E:/placement/placement/Placement Tes
轉 音視頻封裝格式、編碼格式知識
flash swf 開發 ng- 多個 rate .com 流媒體 window 常見的AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等文件其實只能算是一種封裝標準。 一個完整的視頻文件是由音頻和視頻2部分組成的。H264、Xvid等就是視頻編碼格式
mac終端下修改MySQL的編碼格式--找不到my-default.cnf及my.cnf
methods slaver depend win pla doc ets -i 空白 首先請確認正確安裝好MySQL. 1- 先配置環境變量path 1.1 打開終端,輸入: cd ~ 會進入~文件夾, 1.2 然後輸入:touch .b