1. 程式人生 > >Intel與Motorola的編碼格式

Intel與Motorola的編碼格式

Vector CANdb++ Online Help

在這份教程的第一部分,我們提到沒有CAN資料庫,CANoe還不能工作。在第二部分,我們來看看CAN資料庫是怎樣的。通過CANoe的Tools選單,或者從開始選單開啟Vector的CAN資料庫編輯器——CANdb++ Editor。

CANdb++ Editor interface

簡介

CAN總線上有4種報文:資料幀、遠端幀、錯誤幀、超載幀。其中只有資料幀真正承載資料。CAN資料庫儲存這些的資料幀的所有屬性,這樣當我們發現了某條報文在總線上出現時,利用資料庫中的資料,就能查詢出相關的資料。比如這條報文的收發者,以及其表示的意義。

在Vector格式的資料庫中,資料被組織成了6種不同的物件(Object):

  • 訊號(Signal)
  • 報文(Message)
  • 網路節點(Network node),或者簡稱節點
  • 環境變數(Environment variable)
  • 裝置(ECU)
  • CAN網路(Network)

物件是有級別的,高階的物件由若干低階物件附加額外的屬性構成。如下圖:

CANdb Object Model

訊號和報文訊號的關係稍後會解釋。報文訊號到報文的箭頭表示(若干)訊號組成報文;報文到節點的箭頭表示報文擁有傳送節點;報文訊號到節點的箭頭表示擁有接收節點;節點和環境變數到ECU的箭頭表示它們組成了ECU;同樣,ECU組成了網路。這和CAN匯流排的互動結構是一樣的。

在CANoe自帶的CANdb++版本中,一個數據庫最高階的物件是Network,且只能有一個,其名字與檔名相同。在更高階的Vector CANdb++ Admin版本中,最高階為一個叫Vehicles的物件,可以包含若干Network。

物件說明

訊號

訊號(Singal)代表了資訊的最小單位,也就是一個“值”。例如發動機轉速,開關的位置等。其主要的屬性有:namelengthByte orderValue type。具體含義可以參考CANdb++的Help中,Signal and Message Signal一節。注意Byte order屬性,我們稱之為“格式”,它可以設定為Motorola或者Intel,稍後會詳細介紹。

報文訊號

報文訊號(Mapped signal)其實就是訊號,區別在於當一個訊號成為報文的組成部分時,它就會變成報文訊號。因為它算是存在於報文中的,因此多了兩個屬性:

  • Startbit: 起始位,也就是訊號在報文中的位置。
  • Receivers: 這個Signal會被哪個節點接收,這也是上圖訊號到節點的箭頭的意義。

一個訊號可以包含在多個報文中,之後會變成多個不同的報文訊號,CANdb++ Editor中也叫對映的訊號(Mapped Signal)。這是為了Singal可以重用,資料庫中其它物件都不能這樣重用。

報文

報文(Message)代表一條CAN報文,它就是在CAN總線上實際傳送的內容。報文包含若干訊號,有nameIDDLCTransmitters等屬性,具體參考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 StandardIntel 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 MSBMotorola 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

CANdb Communication Matrix

非常好,我們的資料庫如此精煉。資料庫的教程至此,儲存在<project>\database資料夾中吧。

額外的說明

Vector的CANdb資料庫其實是一個編碼為ANSI的文字檔案,可以使用任何文字編輯器開啟。其結構可以參考Vector的DBC File Format Documentation,在官網似乎搜不到這份檔案,就只有提供民間版本了。

這在你有了某種結構的資料庫檔案(比如表格檔案格式),想要轉換成Vector的dbc檔案的,可以寫程式轉換,而不是手動輸入。


相關推薦

IntelMotorola編碼格式

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編碼格式理解:encodingdecoding

在Python對txt文件處理的時候,txt文件預設為gb2312編碼,在開啟檔案的時候,將其轉換為Utf-8編碼,才能進一步處理。 fi=open("c:/","r",encoding="utf-8") 常用的幾種編碼關係如下: 因為開啟的檔案已經轉換為utf-8,所以寫入的時候

bcdhex轉換、以及編碼格式

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)將音

g711ug729比較編碼格式

 •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