高德基 , 歐 鎮(zhèn),盧森微
(1. 江蘇科技大學 電子信息學院, 江蘇 鎮(zhèn)江 212003 ; 2. 江蘇科技大學 經(jīng)濟管理學院, 江蘇 鎮(zhèn)江 212003)
RTW(Real Time Workshop)技術是一種將Simulink模型自動轉化為代碼的技術。目前,在開發(fā)輪機模擬器的過程中,需要搭建船舶主機的數(shù)學模型。船舶主機的數(shù)學模型非常繁瑣,而市場對產(chǎn)品的需求呈現(xiàn)多樣性、快速性的趨勢, 這使產(chǎn)品開發(fā)面臨著多樣性需求與快速開發(fā)之間的矛盾。其中系統(tǒng)設計軟件( Simulink軟件)是用MATLAB語言建立的一種新型的圖形建模工具,它免去了程序代碼編程帶來的低效與繁瑣,可以方便地建立系統(tǒng)的模型(例如系統(tǒng)被控對象的模型、控制器的模型),通過仿真可以觀察到模型的各種性能,而且,如果模型搭建的不理想,還可以很快地進行反復設計和反復實驗,直到找到比較好的解決方法[1]。但是Simulink運算較慢,不能滿足輪機模擬器實時仿真的要求。應該將所建立的模型轉變?yōu)镃++程序。具體實現(xiàn)時,不需要將設計數(shù)學模型進行編程,可直接將建立的simulink模型通過code generation 工具轉換為可執(zhí)行代碼,下載到存儲器中,這樣大大減輕了軟件工程師的編碼工作量,并且將Simulink模型轉換成的C/C++代碼能脫離MATLAB環(huán)境獨立運行。需要注意的是,要想成功地運行code generation并生成C++代碼,需要在電腦上安裝Microsoft Visual C++ 5.0以上版本的編譯器。
RTW轉換代碼的過程包括:
1)分析模型
RTW的程序創(chuàng)建過程首先從對Simulink模塊方框圖的分析開始,包括如下過程:
① 計算仿真和模塊參數(shù)
② 遞推信號寬度和采樣時間
③ 確定模型中各模塊的執(zhí)行次序
④ 計算工作向量的大小(例如S函數(shù)使用的工作向量)
在本階段,RTW首先讀取模型文件(mdoel.mdl)并對其進行編譯,形成模型的中間描述文件"該中間描述文件以ASCll碼的形式進行存儲,其文件名為model.rtw,該文件是下一步驟的輸入信息。mdoel.rtw文件在格式上與simulink模型.mdl文件類似。
2)目標語言編譯器(TLC)生成代碼
在程序創(chuàng)建的第二階段,目標語言編譯器將中間描述文件(mdoel.nw)轉換為目標指定代碼。目標語言編譯器(TagrctLnaguageComnlier)是一種可將上述模型描述文件轉換為指定目標代碼的解釋性編程語言"目標語言編譯器執(zhí)行一個由幾個TLC文件組成的TLC程序,該程序指明了如何根據(jù)mdoel.rtw文件,從模型中生成所需代碼[2]。
TLC程序包括如下文件:
a.系統(tǒng)目標文件(SystemTagrctFile)系統(tǒng)目標文件是主文件或入口點。
b.模塊目標文件(BlockTagretflie)。
c.目標語言編譯器函數(shù)庫。
3)生成自定義的聯(lián)編文件(makeflie)
4)生成可執(zhí)行程序[3]
本文以輪機模擬器的仿真對象——MAN B&W 6L80MC大型低速二沖程渦輪增壓柴油主機為對象來建立了其Simulink模型[4]。其模型如圖1所示。
假定已經(jīng)安裝好了Matlab支持的一個編譯器(如VC),首先需要進行編譯器的配制。在Windows控制臺的窗口下鍵入mex-setup。系統(tǒng)會顯示一個提示選擇編譯器的菜單,選擇當前安裝的編譯器。

圖1 MANB&W6L80MC柴油機Simulink模型Fig.1 MANB&W6L80MC diesel engine’s Simulink model
對于建立好的Simulink模型,首先要在Simulink窗口中打開此模型,為了將該模型通過code generation生成C++代碼,實時仿真需要選擇定步長的仿真算法,所以在轉換之前應進行相應的設置。仿真的控制參數(shù)由Toolscode generationoptions菜單項來選擇。定步長的仿真算法在該對話框下的Solver options下選擇。
Simulink模型中輸出參數(shù)的設置是在該信號線的signal propety對話框中設置,要將所有在VC中用的信號屬性均設置為 ExportedGlobal。
此外,應將code generationoption對話框下的Code Generation中的language選擇目標代碼的生成類型。完成之后,在單擊System target file欄對應的Browse按鈕,來選擇目標代碼生成方式。這里選擇Generic Real-Time Target 下的grt.tlc。以上參數(shù)設置如表1所示。
配置好各項參數(shù)后,就可以轉換為C++代碼了。系統(tǒng)會自動產(chǎn)生一個名為caiyouji_grt_rtw的文件夾,里面包含生成的所有文件。其中caiyouji.cpp為實現(xiàn)模型功能的c++代碼,caiyouji_data.cpp為模型所用到的初始參數(shù)值,caiyouji.h為包含參數(shù)和狀態(tài)變量定義的頭文件,caiyouji_types.h為代碼中所用數(shù)據(jù)類型的聲明,caiyouji_private.h為模型中定義的本地常量和本地變量頭文件。其他相關生成文件:rt_nonfinite.cpp,rt_nonfinite.h, rtwtypes.h, rtmodel.h,rtGetNaN.cpp, rtGetNaN.h,rtGetInf.h等為定義RTW所需的必要參數(shù)。

表1 代碼轉換參數(shù)設置Tab.1 Code transformation parameters settings
將轉換完的可執(zhí)行C++代碼加入到新建的MFC的對話框的程序中,運行該程序,將模型仿真所產(chǎn)生的柴油機升速曲線數(shù)據(jù)存入.txt文本中,再將該數(shù)據(jù)導入MATLAB中,繪出的圖形與Simulink自身所產(chǎn)生的圖形對比如圖2所示。

圖2 Simulink和代碼繪制的升速曲線對比Fig.2 The contrast of the curve drawed by Simulink and the code
由圖2兩圖中曲線可以看出轉換的代碼是正確的,能夠得出正確的數(shù)據(jù)。
下面以基于virtools的船舶主機虛擬操作系統(tǒng)的駕駛臺操作為例來說明。對于生成的C++代碼, caiyouji_initialize()為系統(tǒng)的初始化函數(shù),caiyouji_step()為系統(tǒng)仿真運行的函數(shù),caiyouji_derivatives()為計算連續(xù)模型的導數(shù)的函數(shù),caiyouji_terminate()為模型中止函數(shù)[5]。生成代碼的模型執(zhí)行流程如圖3所示。

圖3 代碼的執(zhí)行流程Fig.3 Code execution process
其中仿真運算函數(shù)中的一部分如下:
caiyouji_step()
{zhuanshu=caiyouji_X.Integrator_CSTATE; (轉速輸出)
youci=caiyouji_P.Gain4_Gain*caiyouji_B.Gain3;(油尺刻度)
gongyouliang=(0.043* rt_powd_snf(zhuanshu, 0.335) +0.06353 * youci) -0.095255;
(每循環(huán)供油量)
……}
設定各模塊的參數(shù)。本文采用edit box輸入,代碼如下[6]:
UpdateData(TRUE);
caiyouji_P.Gain_Gain=m_edit1;(更新P參數(shù))
caiyouji_P.Gain1_Gain=m_edit2;(更新I參數(shù))
caiyouji_P.Gain2_Gain=m_edit3;(更新D參數(shù))
caiyoujizhuanshu1_P.Integrator_IC=shedingzs; (在線調整積分初值)
將產(chǎn)生的代碼加入到創(chuàng)建好的MFC工程里,做進一步的編程。這里采用ADO的方式訪問數(shù)據(jù)庫。
將各模塊的參數(shù)設定好以后,就可以將代碼所產(chǎn)生的數(shù)據(jù)根據(jù)駕駛臺發(fā)出的信號實時的存入SQL數(shù)據(jù)庫中。例如當程序檢測到數(shù)據(jù)庫表 x3d_output中第3行的數(shù)據(jù)為1時(代表駕駛臺臺的啟動主機按鈕按下),將向數(shù)據(jù)庫表x3d_input第17、18、19行實時存入數(shù)據(jù)(分別代表啟動空氣壓力,柴油機轉速,油門刻度)。以供駕駛臺操作界面調用。存入SQL數(shù)據(jù)庫表x3d_input中的數(shù)據(jù)如圖4所示。
駕駛臺的操作界面讀取數(shù)據(jù)并顯示如圖5所示。

圖4 數(shù)據(jù)庫表x3d_inputFig.4 Database table x3d_input

圖5 啟動空氣壓力表Fig.5 Starting air pressure gauge
另外,柴油機排氣溫度,轉速等均可駕駛臺操作界面讀取SQL數(shù)據(jù)庫中的數(shù)據(jù)來顯示。駕駛臺操作界面上的燈也可根據(jù)SQL數(shù)據(jù)庫中的數(shù)據(jù)亮滅。
文中通過將simulink模型轉變?yōu)镃++程序,并驗證了結果的正確性,實現(xiàn)了對模塊參數(shù)的實時修改,且將Simulink模型所產(chǎn)生的數(shù)據(jù)輸入到了數(shù)據(jù)庫中,以供輪機模擬器中的操作界面調用。這樣既減輕了編寫程序的繁瑣,又滿足了輪機模擬器仿真實時性的要求[7]。與傳統(tǒng)設計方法相比,具有開發(fā)周期短、費用低、效率高的特點。
[1 ] 邱曉林,李天柁,弟宇鳴等.基于MATLAB的動態(tài)模型與系統(tǒng)仿真工具——Simulink3.0/4.x[M].西安:西安交通大學出版社,2003.
[2]蔡毅.基于Matalab/RTW實時仿真系統(tǒng)的設計與研究[D].天津:天津大學,2005.
[3]王振波. 基于Matlab RTW/Engine的建模仿真實驗實驗報告[R] .北京航空航天大學,2010.
[4]甘霏斐. 輪機模擬器柴油主機系統(tǒng)動態(tài)過程實時仿真研究[D] 鎮(zhèn)江:江蘇科技大學, 2005.
[5]常青,邢超,李言俊.基于Matlab/Simulink的交互式實時仿真[J] . 計算機工程與應用, 2003(24):131-132.CHANG Qing, XING Chao, Li Yanjun.An interactive real time simulation based on Matlab/Simulink[J]. Computer Engineering and Application,2003.24:131-132.
[6]王春民,安海忠,王豐貴.基于VC和Simulink的電力電子仿真實驗平臺設計[J].吉林大學學報:信息科學版,2008,26(3):264-268.WANG Chun-min, AN Hai-zhong,WANG Feng-gui. Design of simulation experimental platform for power electronics based on VC and Simulink[J].Journal of Jilin University Information Science Edition,2008,26(3):264-268 .
[7]李長文,趙長祿,張付軍,等.基于Matlab/Simulink及RTW的柴油機瞬態(tài)建模與仿真[J]. 北京理工大學學報, 2004,24(7):579-582.LI Chang-wen, ZHAO Chang-lu, ZHANG Fu-jun, et al.Modeling and simulation of diesel engine under transient conditions based on Matlab/Simulink and RTW[J]. Transactions of Beijing Institute of Technology,2004,24(7): 579-582.