前言
眾所周知,J1939協(xié)議是由美國汽車工程師協(xié)會(huì)(SAE)定義的一組標(biāo)準(zhǔn)。J1939標(biāo)準(zhǔn)用于卡車、公共汽車和移動(dòng)液壓等重型車輛。如今大多數(shù)車輛都通過CAN進(jìn)行ECU通信。但是CAN總線僅僅是提供了通信的基礎(chǔ)(就像是電話),但是沒有提供對(duì)話的“語言”來進(jìn)行更復(fù)雜的操作。所以在大多數(shù)大型車輛中,這個(gè)“語言”就是SAE定義的J1939標(biāo)準(zhǔn)。
今天我們繼續(xù)來介紹TSMaster新功能—J1939多幀報(bào)文收發(fā)。這個(gè)功能屬于J1939的高級(jí)功能,需要license的授權(quán),具體操作需求可以聯(lián)系我們。
J1939功能使用
Use of J1939 functionality/
我們假設(shè)已經(jīng)擁有了帶license的硬件,以TC1005為例,選擇硬件通道后連接應(yīng)用程序,隨后打開about窗口,就可以看到擁有l(wèi)icense的列表。其中有一個(gè)J1939的option,接下來介紹這個(gè)功能的使用。
> 首先打開TSMaster的安裝目錄,進(jìn)入demo文件夾,找到示例數(shù)據(jù)庫J1939ILDemo的數(shù)據(jù)庫文件。我們將其拖入TSMaster中,這個(gè)拖入的過程需要在程序斷開連接的時(shí)候來完成,可以看到,這個(gè)數(shù)據(jù)庫里面有四幀報(bào)文,它的PGN分別為EF00,EF00,F(xiàn)F02和FF01。
> 其中前兩幀為點(diǎn)對(duì)點(diǎn)的多幀,分別是節(jié)點(diǎn)2往1發(fā),1往2發(fā);后兩個(gè)是廣播,分別是地址2的廣播和地址1的廣播。以第一幀為例,他的DLC=35個(gè)字節(jié),這意味著這個(gè)信號(hào)可以在這35乘以8,也就是280個(gè)位置里面任意排布。那么報(bào)文中的sgn1~4就是模擬了這種情況。如果希望發(fā)送這些報(bào)文,我們可以直接使用發(fā)送窗口,我們打開CAN Transmit窗口,點(diǎn)擊左上角的來自數(shù)據(jù)庫的按鈕,選擇剛才看到的四幀報(bào)文,然后再將視圖切換成J1939,這樣協(xié)議相關(guān)的信息就一覽無余了。
前兩個(gè)是點(diǎn)對(duì)點(diǎn),后兩個(gè)是廣播,可以從目的地址看出來,對(duì)于廣播報(bào)文來講,發(fā)送節(jié)點(diǎn)只要自顧自的發(fā)送就可以了。而對(duì)于前兩個(gè)點(diǎn)對(duì)點(diǎn)的發(fā)送過程,不但需要發(fā)送節(jié)點(diǎn),還需要接收節(jié)點(diǎn)在過程中進(jìn)行應(yīng)答,才能完成整個(gè)發(fā)送過程。所以我們還需要激活TSMaster內(nèi)置的J1939的仿真節(jié)點(diǎn)。
> 接下來我們來到仿真,J1939的仿真配置對(duì)話框里面,可以看到節(jié)點(diǎn)1和2,分別被標(biāo)注為Node1和Node2,所有的節(jié)點(diǎn)都勾選了仿真發(fā)送功能,但是仿真接收功能默認(rèn)是沒有勾選的。我們可以通過激活rbs的方法來自動(dòng)激活這兩個(gè)接收的功能,同時(shí)呢也可以手動(dòng)勾上,在此我們就手動(dòng)勾選,并且點(diǎn)擊應(yīng)用設(shè)置來關(guān)閉對(duì)話框。
> 這個(gè)時(shí)候就可以啟動(dòng)仿真了,我們按下F5,然后打開trace窗口,隨后呢我們激活這4個(gè)節(jié)點(diǎn)的這4個(gè)報(bào)文的發(fā)送,就依次點(diǎn)擊發(fā)送就可以了。于是在右側(cè)的trace窗口中間就可以看到這4個(gè)多幀報(bào)文的接收情況。他們的DLC分別是右邊的35,36,13和33,然后右邊顯示的就是他們的默認(rèn)的數(shù)據(jù)段默認(rèn)都是0。
>我們當(dāng)然可以修改他們的數(shù)據(jù)字節(jié)來任意的修改他們的數(shù)據(jù),那這里就可以看到這是我們剛才修改的結(jié)果,我們當(dāng)然還可以通過信號(hào)生成器的方式來改,比如說我們選中第一幀報(bào)文,在這個(gè)sgn1 a2上面選擇正弦,然后點(diǎn)擊配置,我們可以把峰值改的稍微大一點(diǎn),然后點(diǎn)擊應(yīng)用、點(diǎn)擊啟動(dòng),這個(gè)時(shí)候就可以看到這個(gè)sgn1 a2就在發(fā)生變化。
> 接下來可以打開圖形窗口,將這個(gè)信號(hào)拖進(jìn)來,就可以看到正弦波,當(dāng)然這個(gè)正弦波的頻率比較低,這是因?yàn)樗嵌鄮?,它發(fā)一幀需要200毫秒,所以一秒只有5個(gè)點(diǎn),我們還可以通過其他的窗口來進(jìn)行觀察,比如說數(shù)值顯示。
> 最后我們打開數(shù)值顯示,點(diǎn)擊這里的添加按鈕,可以選擇我們的信號(hào),當(dāng)然我們也可以通過拖動(dòng)的方式將信號(hào)拖進(jìn)去,之后可以調(diào)整窗口的大小,使得信號(hào)值可以在上面顯示。我們還可以通過面板的方式添加,當(dāng)然面板需要設(shè)計(jì),所以首先需要停止仿真,停止仿真之后我們可以將信號(hào)拖入面板,再啟動(dòng)仿真,然后再啟動(dòng)報(bào)文的發(fā)送,這樣就可以看到這些信號(hào)都可以在測(cè)量窗口里面正確的顯示。
J1939一系列API函數(shù)
J1939 A series of API functions/
J1939有一套API的函數(shù),通過這一套API就可以實(shí)現(xiàn)J1939的信號(hào)讀寫、報(bào)文發(fā)送等等一系列功能。
> 我們打開一個(gè)自動(dòng)化模塊,然后選中入口點(diǎn),按回車增加一系列的動(dòng)作。我們選第一個(gè)動(dòng)作,然后設(shè)置他為API函數(shù)調(diào)用,在過濾器里面敲入1939,就可以看到1939的一系列API。這其中有1939的標(biāo)識(shí)符的get和set方法以及下面的多幀報(bào)文的發(fā)送方法。關(guān)于標(biāo)識(shí)符的get和set方法在此就不展開描述,大家完全可以查看c代碼編輯器里面的小程序的幫助文檔,里面有詳細(xì)的介紹,在右側(cè)也可以看到示例代碼。那么這次我們著重介紹一下1939的多幀發(fā)送的API。
> 首先我們可以選中1939異步發(fā)送API,那么發(fā)送分為同步和異步兩種,同步意味著發(fā)完之后程序才會(huì)往下走,異步則意味著只要將數(shù)據(jù)推入發(fā)送緩存,程序就可以繼續(xù)往下,那么不管是同步還是異步,還分了兩種類型。一種是不帶字符串的發(fā)送,一種是基于字符串的發(fā)送。那么基于字符串方式的發(fā)送,他的數(shù)據(jù)是以逗號(hào)來進(jìn)行分隔,那么這兩種方式自動(dòng)化模塊都是支持的。因?yàn)樵谧詣?dòng)化模塊里面,數(shù)組均以逗號(hào)分隔的字符串表達(dá),那么我們可以選擇一個(gè)異步發(fā)送,函數(shù)就可以看到這個(gè)函數(shù)有7個(gè)輸入的參數(shù)。
>那么第一個(gè)參數(shù)是通道號(hào),我們可以選擇常量,比如說,channel1然后PGN,在此我們就可以輸入。比如說我們可以選廣播,就是剛才看到的OxFF01,然后優(yōu)先級(jí)是6,默認(rèn)源地址是2,目的地址是1,然后PDU的數(shù)據(jù)我們可以隨意填寫。比如說Ox11,然后我們可以將這個(gè)復(fù)制多份,密貼多份,這里長(zhǎng)度是可以很長(zhǎng)。他的實(shí)際長(zhǎng)度是被最后一個(gè)參數(shù)限制,那么在此我們可以保持跟dbc的一致,也就是35,然后我們就可以啟動(dòng),按F9啟動(dòng)發(fā)送或者點(diǎn)擊發(fā)送按鈕,那么就可以發(fā)送成功。
> 我們就可以看到trace窗口里面顯示的發(fā)送的信號(hào)內(nèi)容跟我們的設(shè)置是一模一樣,最后如果說數(shù)據(jù)不夠,就會(huì)以0來補(bǔ)充。那么我們可以把數(shù)據(jù)填多一點(diǎn),再啟動(dòng)發(fā)送,這樣的話,數(shù)據(jù)長(zhǎng)度就會(huì)正好達(dá)到我們的所需要的長(zhǎng)度。
那這是原始報(bào)文的發(fā)送方法,倘若需要修改報(bào)文里面的信號(hào)的值,就需要rbs的仿真引擎來支持,那我們可以點(diǎn)擊CAN總線仿真窗口來模擬節(jié)點(diǎn)的行為,我們激活這兩個(gè)節(jié)點(diǎn),然后將總線仿真設(shè)置為自動(dòng)啟動(dòng),這個(gè)時(shí)候可以看到rbs已經(jīng)在工作了,并且得到了我們通過發(fā)送窗口一樣的結(jié)果。
> 當(dāng)然發(fā)送窗口這個(gè)時(shí)候是不應(yīng)該啟動(dòng)發(fā)送,回到自動(dòng)化模塊里面,刪除我們的原始的報(bào)文發(fā)送的動(dòng)作,設(shè)置一個(gè)新的動(dòng)作衍生函數(shù)調(diào)用,在此我們搜索set Signal by address,通過這個(gè)函數(shù)就可以實(shí)現(xiàn)rbs里面信號(hào)的任意修改。那這里有兩個(gè)參數(shù),分別是信號(hào)地址和值,那么信號(hào)地址就是我們所需要發(fā)送的信號(hào)的數(shù)據(jù)庫地址,我們可以隨便選一個(gè)比如說A_Node1 signal 1_a1,我們可以點(diǎn)擊復(fù)制數(shù)據(jù)庫地址,然后到這里粘貼即可,然后他的值我們可以隨意修改,然后我們可以點(diǎn)擊啟動(dòng),那么這樣就實(shí)現(xiàn)了這個(gè)信號(hào)的修改,可以看到A_Node1里面的這個(gè)信號(hào)已經(jīng)變成1111,就是我們所設(shè)置的值,那么這就是信號(hào)的發(fā)送。
如果是希望接收一個(gè)信號(hào)的值,該怎么做呢?
我們可以用到signal server的方法:還是來到函數(shù)調(diào)用,刪除我們剛才的發(fā)送,然后再多加幾個(gè)動(dòng)作。我們首先將它改為函數(shù)調(diào)用,然后輸入SGN SRV,這就是signal server的系列函數(shù)。
> 那這里需要一個(gè)流程,首先需要注冊(cè)我們關(guān)心的信號(hào),需要用到register_can_signal_by_message ID或者是name,我們?cè)谶@里選擇message ID,那么我們就需要到rbs里面去copy這個(gè)報(bào)文的ID,copy過來的時(shí)候需要把后面的x刪掉,讓這個(gè)字符串是一個(gè)有效的16進(jìn)制值,通道還是可以用之前的通道1,然后信號(hào)名稱就是我們關(guān)心的信號(hào)。
> 比如說sgn1_a1,我們自己直接輸入sgn1_a1,client ID是這個(gè)函數(shù)注冊(cè)成功之后給到我們程序的一個(gè)handle,我們可以新建個(gè)變量來存儲(chǔ)它,就命名ID就行。這個(gè)時(shí)候直接已經(jīng)可以點(diǎn)擊本地變量關(guān)聯(lián)我們的ID,然后我們可以等一會(huì)再讀取信號(hào)的值,那這個(gè)時(shí)候可以調(diào)用wait函數(shù),比如說等個(gè)3秒,然后接下去就是一個(gè)讀取過程,同樣用到了Signal server sgnsrv get_can_signal物理值。最后通過這個(gè)方法去取得,得到的信號(hào)的物理值,那么在這里可以同樣選擇channel1 client ID就填我們剛才所得到的變量ID,然后這里就是輸出的值,我們同樣可以用一個(gè)變量來裝,這里需要添加的就是個(gè)double型的變量,value寫個(gè)v就行,然后在這個(gè)地方選擇v,然后同時(shí)還會(huì)返回最后的時(shí)間戳,如果不需要的話,我們這里默認(rèn)填個(gè)0就行或者不填。
> 然后這個(gè)時(shí)候我們可以將我們讀到的值打印出來,這時(shí)候就需要用到log函數(shù)字符串,我們可以寫我們的變量v的值作為字符串,那么log level,可以用一種顏色,比如說綠色,然后我們點(diǎn)擊啟動(dòng),這個(gè)時(shí)候首先獲取ID等待,然后最后獲取值結(jié)束,那么我們會(huì)看一下每一步驟的運(yùn)行結(jié)果。在這里都有反饋,這里是實(shí)際傳入的參數(shù)值,wait然后讀到的參數(shù)值然后我們可以看一下打印出來值就是111,就是我們之前設(shè)定的值,那么我們完全可以改一下這個(gè)值,比如說改成12345,這個(gè)值最大就是2047,我們就設(shè)它為2047,這個(gè)時(shí)候我們只要再啟動(dòng)一下程序,我們打開log,就可以看到我們獲取的值跟我們?cè)O(shè)定值是一樣。這就是1939系列API的用法。
以上就是我們本期介紹的TSMaster新功能之J1939多幀報(bào)文的收發(fā),我們下期再見?。ň唧w操作解說可以觀看我們B站視頻哦)
-
汽車
+關(guān)注
關(guān)注
13文章
3387瀏覽量
37107
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論