前言
眾所周知,J1939協議是由美國汽車工程師協會(SAE)定義的一組標準。J1939標準用于卡車、公共汽車和移動液壓等重型車輛。如今大多數車輛都通過CAN進行ECU通信。但是CAN總線僅僅是提供了通信的基礎(就像是電話),但是沒有提供對話的“語言”來進行更復雜的操作。所以在大多數大型車輛中,這個“語言”就是SAE定義的J1939標準。
今天我們繼續來介紹TSMaster新功能—J1939多幀報文收發。這個功能屬于J1939的高級功能,需要license的授權,具體操作需求可以聯系我們。
J1939功能使用
Use of J1939 functionality/
我們假設已經擁有了帶license的硬件,以TC1005為例,選擇硬件通道后連接應用程序,隨后打開about窗口,就可以看到擁有license的列表。其中有一個J1939的option,接下來介紹這個功能的使用。



> 首先打開TSMaster的安裝目錄,進入demo文件夾,找到示例數據庫J1939ILDemo的數據庫文件。我們將其拖入TSMaster中,這個拖入的過程需要在程序斷開連接的時候來完成,可以看到,這個數據庫里面有四幀報文,它的PGN分別為EF00,EF00,FF02和FF01。



> 其中前兩幀為點對點的多幀,分別是節點2往1發,1往2發;后兩個是廣播,分別是地址2的廣播和地址1的廣播。以第一幀為例,他的DLC=35個字節,這意味著這個信號可以在這35乘以8,也就是280個位置里面任意排布。那么報文中的sgn1~4就是模擬了這種情況。如果希望發送這些報文,我們可以直接使用發送窗口,我們打開CAN Transmit窗口,點擊左上角的來自數據庫的按鈕,選擇剛才看到的四幀報文,然后再將視圖切換成J1939,這樣協議相關的信息就一覽無余了。



前兩個是點對點,后兩個是廣播,可以從目的地址看出來,對于廣播報文來講,發送節點只要自顧自的發送就可以了。而對于前兩個點對點的發送過程,不但需要發送節點,還需要接收節點在過程中進行應答,才能完成整個發送過程。所以我們還需要激活TSMaster內置的J1939的仿真節點。
> 接下來我們來到仿真,J1939的仿真配置對話框里面,可以看到節點1和2,分別被標注為Node1和Node2,所有的節點都勾選了仿真發送功能,但是仿真接收功能默認是沒有勾選的。我們可以通過激活rbs的方法來自動激活這兩個接收的功能,同時呢也可以手動勾上,在此我們就手動勾選,并且點擊應用設置來關閉對話框。



> 這個時候就可以啟動仿真了,我們按下F5,然后打開trace窗口,隨后呢我們激活這4個節點的這4個報文的發送,就依次點擊發送就可以了。于是在右側的trace窗口中間就可以看到這4個多幀報文的接收情況。他們的DLC分別是右邊的35,36,13和33,然后右邊顯示的就是他們的默認的數據段默認都是0。



>我們當然可以修改他們的數據字節來任意的修改他們的數據,那這里就可以看到這是我們剛才修改的結果,我們當然還可以通過信號生成器的方式來改,比如說我們選中第一幀報文,在這個sgn1 a2上面選擇正弦,然后點擊配置,我們可以把峰值改的稍微大一點,然后點擊應用、點擊啟動,這個時候就可以看到這個sgn1 a2就在發生變化。



> 接下來可以打開圖形窗口,將這個信號拖進來,就可以看到正弦波,當然這個正弦波的頻率比較低,這是因為它是多幀,它發一幀需要200毫秒,所以一秒只有5個點,我們還可以通過其他的窗口來進行觀察,比如說數值顯示。



> 最后我們打開數值顯示,點擊這里的添加按鈕,可以選擇我們的信號,當然我們也可以通過拖動的方式將信號拖進去,之后可以調整窗口的大小,使得信號值可以在上面顯示。我們還可以通過面板的方式添加,當然面板需要設計,所以首先需要停止仿真,停止仿真之后我們可以將信號拖入面板,再啟動仿真,然后再啟動報文的發送,這樣就可以看到這些信號都可以在測量窗口里面正確的顯示。
J1939一系列API函數
J1939 A series of API functions/
J1939有一套API的函數,通過這一套API就可以實現J1939的信號讀寫、報文發送等等一系列功能。
> 我們打開一個自動化模塊,然后選中入口點,按回車增加一系列的動作。我們選第一個動作,然后設置他為API函數調用,在過濾器里面敲入1939,就可以看到1939的一系列API。這其中有1939的標識符的get和set方法以及下面的多幀報文的發送方法。關于標識符的get和set方法在此就不展開描述,大家完全可以查看c代碼編輯器里面的小程序的幫助文檔,里面有詳細的介紹,在右側也可以看到示例代碼。那么這次我們著重介紹一下1939的多幀發送的API。



> 首先我們可以選中1939異步發送API,那么發送分為同步和異步兩種,同步意味著發完之后程序才會往下走,異步則意味著只要將數據推入發送緩存,程序就可以繼續往下,那么不管是同步還是異步,還分了兩種類型。一種是不帶字符串的發送,一種是基于字符串的發送。那么基于字符串方式的發送,他的數據是以逗號來進行分隔,那么這兩種方式自動化模塊都是支持的。因為在自動化模塊里面,數組均以逗號分隔的字符串表達,那么我們可以選擇一個異步發送,函數就可以看到這個函數有7個輸入的參數。



>那么第一個參數是通道號,我們可以選擇常量,比如說,channel1然后PGN,在此我們就可以輸入。比如說我們可以選廣播,就是剛才看到的OxFF01,然后優先級是6,默認源地址是2,目的地址是1,然后PDU的數據我們可以隨意填寫。比如說Ox11,然后我們可以將這個復制多份,密貼多份,這里長度是可以很長。他的實際長度是被最后一個參數限制,那么在此我們可以保持跟dbc的一致,也就是35,然后我們就可以啟動,按F9啟動發送或者點擊發送按鈕,那么就可以發送成功。



> 我們就可以看到trace窗口里面顯示的發送的信號內容跟我們的設置是一模一樣,最后如果說數據不夠,就會以0來補充。那么我們可以把數據填多一點,再啟動發送,這樣的話,數據長度就會正好達到我們的所需要的長度。



那這是原始報文的發送方法,倘若需要修改報文里面的信號的值,就需要rbs的仿真引擎來支持,那我們可以點擊CAN總線仿真窗口來模擬節點的行為,我們激活這兩個節點,然后將總線仿真設置為自動啟動,這個時候可以看到rbs已經在工作了,并且得到了我們通過發送窗口一樣的結果。
> 當然發送窗口這個時候是不應該啟動發送,回到自動化模塊里面,刪除我們的原始的報文發送的動作,設置一個新的動作衍生函數調用,在此我們搜索set Signal by address,通過這個函數就可以實現rbs里面信號的任意修改。那這里有兩個參數,分別是信號地址和值,那么信號地址就是我們所需要發送的信號的數據庫地址,我們可以隨便選一個比如說A_Node1 signal 1_a1,我們可以點擊復制數據庫地址,然后到這里粘貼即可,然后他的值我們可以隨意修改,然后我們可以點擊啟動,那么這樣就實現了這個信號的修改,可以看到A_Node1里面的這個信號已經變成1111,就是我們所設置的值,那么這就是信號的發送。



如果是希望接收一個信號的值,該怎么做呢?
我們可以用到signal server的方法:還是來到函數調用,刪除我們剛才的發送,然后再多加幾個動作。我們首先將它改為函數調用,然后輸入SGN SRV,這就是signal server的系列函數。
> 那這里需要一個流程,首先需要注冊我們關心的信號,需要用到register_can_signal_by_message ID或者是name,我們在這里選擇message ID,那么我們就需要到rbs里面去copy這個報文的ID,copy過來的時候需要把后面的x刪掉,讓這個字符串是一個有效的16進制值,通道還是可以用之前的通道1,然后信號名稱就是我們關心的信號。



> 比如說sgn1_a1,我們自己直接輸入sgn1_a1,client ID是這個函數注冊成功之后給到我們程序的一個handle,我們可以新建個變量來存儲它,就命名ID就行。這個時候直接已經可以點擊本地變量關聯我們的ID,然后我們可以等一會再讀取信號的值,那這個時候可以調用wait函數,比如說等個3秒,然后接下去就是一個讀取過程,同樣用到了Signal server sgnsrv get_can_signal物理值。最后通過這個方法去取得,得到的信號的物理值,那么在這里可以同樣選擇channel1 client ID就填我們剛才所得到的變量ID,然后這里就是輸出的值,我們同樣可以用一個變量來裝,這里需要添加的就是個double型的變量,value寫個v就行,然后在這個地方選擇v,然后同時還會返回最后的時間戳,如果不需要的話,我們這里默認填個0就行或者不填。



> 然后這個時候我們可以將我們讀到的值打印出來,這時候就需要用到log函數字符串,我們可以寫我們的變量v的值作為字符串,那么log level,可以用一種顏色,比如說綠色,然后我們點擊啟動,這個時候首先獲取ID等待,然后最后獲取值結束,那么我們會看一下每一步驟的運行結果。在這里都有反饋,這里是實際傳入的參數值,wait然后讀到的參數值然后我們可以看一下打印出來值就是111,就是我們之前設定的值,那么我們完全可以改一下這個值,比如說改成12345,這個值最大就是2047,我們就設它為2047,這個時候我們只要再啟動一下程序,我們打開log,就可以看到我們獲取的值跟我們設定值是一樣。這就是1939系列API的用法。



以上就是我們本期介紹的TSMaster新功能之J1939多幀報文的收發,我們下期再見!(具體操作解說可以觀看我們B站視頻哦)
-
汽車
+關注
關注
15文章
4153瀏覽量
41093
發布評論請先 登錄
重型車輛J1939通信協議是什么
Profinet?轉 SAE J1939?網關 實現重型車智能控制 西門子 PLC?渣土自卸車改造案例
移植網絡PHY芯片驅動,如何融入 rt-thread 的網絡體系,并添加新的以太網類型的報文?
STM32已經用標準庫寫好的代碼,怎么導入RT THREAD?
軟件更新 | TSMaster 7-8月新功能來了!你升級了嗎?
從手寫代碼到AUTOSAR工具鏈:J1939Tp應用篇
告別摸索!TSMaster官方最全學習路徑整理
盟通方案|如何集成J1939協議
STM32已經用標準庫寫好的代碼,怎么導入RT THREAD?
軟件更新 | TSMaster 202504 版本已上線!三大功能讓車載測試更智能
超125款游戲和應用支持DLSS 4多幀生成
軟件更新 | 以太網通信仿真功能已上線!TSMaster 202503 版本更新速覽
干貨分享 | TSMaster用戶必看:以太網通信仿真用戶手冊
解鎖TSMaster fifo函數:報文讀取的高效方法
軟件更新 | 你期待的新功能來了!TSMaster 202502 新版本亮點搶先看!
新功能發布 | TSMaster如何實現J1939多幀報文收發
評論