RTLAB非同步通信案例
來自專欄 RTLAB半實物模擬教程
非同步通信概述
通過RTLAB軟體自帶的通信模塊,RTLAB模型(model)能與第三方軟體(app)通信。由於model中運行的步長很小(如100us),而app的串聯通信步長常常很大(如1s)。因此它們的通常是非同步通信。
在非同步通信前,必須模仿模板,按照自己的需求編寫一個c/c++ 文件:AsyncIP.c。在這個c文件中,定義了發送/接受 數據的格式、開闢內存的大小等。在模型初始化過程中,這個文件會被編譯成可執行文件,發送到下位機中運行。注意,開闢的共享內存是指在下位機上的內存。
在模型運行過程時,共享內存中僅存放模型的運行數據。假設模型的步長為10ms,則共享內存中的數據將以10ms的刷新速率被刷新。通過下圖中的模塊,可以設定數據發送的速率。圖中設定每100個採樣發送一次,則每隔1s,將共享內存中的數據按照AsyncIP.c中定義的數據格式,發送到model中定義的IP地址,即本文的app端。
在app端需要根據數據格式進行解析,得到模型運行數據。同樣,app端發送的數據會被AsyncIP.c 文件解析後存放在共享內存中,由model的receive模塊調用。
注意:由於rtlab模型運行在linux系統,而app一般運行在windows系統,因此數據傳輸時會存在大小端問題。在讀取到rtlab發送來的數據,需要進行數據解析。同樣,app數據發送到rtlab端也需要進行解析。
下圖給出了一個項目中model與app 非同步通信的流程。
首先,model在初始化階段會開闢一塊共享內存。然後啟動第三方程序,程序會鏈接到內存,執行相關代碼。在實際運行時,可以由app發送數據到內存,model定期地讀取內存中的數據,用於model的控制。也可以是model 發送數據到內存中,app定期讀取內存中數據,用於app運行。或者兩者兼有之。
非同步通信應用編譯
搭建RTLAB模型
非同步通信必須要用RTLAB庫中的三個模塊:OpAsyncGenCtrl,OpAsyncRecv,OpAsyncSend。
OpAsyncGenCtrl:非同步通信控制模塊用於配置非同步通信的基本參數,模型中至少有一個這個模塊。同一個模型內,可以有多組控制模塊、接收模塊與發送模塊。
OpAsyncRecv:非同步通信接收模塊用以接收共享內存中的數據。
OpAsyncSend:非同步通信發送模塊用以將模型數據發送至共享內存中。
RTLAB自帶的案例模型中,介紹了這三個模塊的基本用法。
模型地址: ...RT-LAB/v11.1.4.59/Examples/IO/Generic/asyncip/models/Simulink
準備C代碼
當確定了model與app交互的數據後,需要編寫相應的c代碼實現app的功能。RTLAB提供定義了非同步通信API函數的頭文件 AsyncApi.h。
地址在:.../RT-LAB/v11.1.4.59/common/include_target
RTALB提供了兩個案例,包含了完整的模型和c 代碼。
- IO/Generic/async_ip UDP/IP和 TCP/IP 通信
- IO/Generic/async_serial 串列通信
準備Makefile
makefile用於將源代碼編譯成可執行文件。
RTLAB提供了一個案例:
/Examples/IO/Generic/asyncserial/test/Simulink/AsyncSerial.mk.
一般都基於這個模板進行編寫makefile。 具體內容可查看該模板。
在編譯過程中,RTLAB會把核心庫如:LibOpalCore.a 和libOpalUtils.a 載入到模型目錄中。libOpalAsyncApiCore.a顯然不屬於核心庫,在非同步通信模型中,需要手動添加。
RTLAB I/O庫中非同步通信的模塊都已通過m 文件的方式將必要的庫添加到模型目錄之中。因此用戶自形搭建非同步通信模塊時需要注意將libOpalAsyncApiCore.a添加到目錄中。
為了使makefile可以鏈接模型目錄中所有的庫,需要通過(adding the opotion -L.)把模型文件夾增加到庫路徑中。(沒太懂)
RTLAB配置
在源代碼和模型建立好後,編譯的前兩個步驟(generate model和generate code)會自動調用需要的文件如makefile文件、源代碼、頭文件,從而編譯出可執行文件。接下來的編譯步驟會確認是否所有配置都已完成。相關過程會顯示在「Compilation View」中。
當編譯出現問題時,按照如下步驟進行:
1.在模型編輯的文件頁面,用戶可以指定需要載入到模型中的文件。
具體文件地址可參考:
G:matlab2014 oolboxphysmodpowersyspowersyssfun_discreteVariableDelay.cG:RTlab2017OPAL-RTRT-LABv11.1.4.59ExamplesIO\_Generic_async_ipAsyncIP_sourceAsyncIPUtils.hG:RTlab2017OPAL-RTRT-LABv11.1.4.59ExamplesIO\_Generic_async_ipAsyncIP_sourceAsyncIP.mk
如前所述,若libOpalAsyncApiCore.a 庫沒有在matlab回調函數階段添加到編譯過程中,則需要將該庫添加到上圖的列表中。這個庫的路徑是(需要把$RTLAB-ROOT$ 添加到RTLAB 的根目錄中):
$RTLAB_ROOT$/common/lib/redhawk/libOpalAsyncApiCore.a for Red Hat targets。
這個庫需要轉成binary模式。Category這欄都設置為「Asynchronous Process」。
可執行文件也必須轉成binary模式
2.在development頁面,如下圖所示設置。之後即可完全編譯模型。
模型運行
接下來就是 載入模型、運行模型以及終止運行。
推薦閱讀:
※新「基站」傳奇
※這是個什麼東西啊,基站嗎?
※貝爾實驗室走出的大咖們
※TCP與UDP+噴泉編碼吞吐量的簡單比較
※學通信專業將來工作會有怎樣的一天?