摘要:在HLA仿真中使用Simulink模型快速建立成員存在3種方法,首先對(duì)這3種方法進(jìn)行系統(tǒng)分析和優(yōu)缺點(diǎn)比較,得出S—Functions制作RTI接口模塊的方法是最優(yōu)方法。然后對(duì)采用最優(yōu)方法的方案進(jìn)行具體設(shè)計(jì)。最后分析并解決數(shù)據(jù)映射與時(shí)間同步兩個(gè)關(guān)鍵問題。使得HLA仿真能夠充分快速利用MATLAB強(qiáng)大的數(shù)學(xué)計(jì)算功能。
關(guān)鍵詞:Simulink;HLA;分布式仿真;模型重用
中圖分類號(hào):TP391.1 文獻(xiàn)標(biāo)識(shí)碼:A
Application of Simulink Model in the HLA Simulation
KUAI Wei1,ZHANG Zhihui2
(1.Navy military affairs agent''sroom1, Nanjing210002,China;
2.No.91404 Troops Of PLA2,Qinhuangdao066001,China)
Abstract:There were three methods of quickly using MATLAB models in the HLA simulation. First, these methods were systematically analyzed and the advantage and disadvantage of them were compared. Then the method, using S—Functions to make an RTI interface model, was manifested to be the best one. Secondly, the project using the best method was concretely designed. Finally, two key issues that were data mapping and time synchronization, were analyzed and solved in the project. All of these work succeeded in arriving at the goal, making MATLAB to be quickly and sufficiently used as mathematical tools in the HLA simulation.
Key words:Simulink; HLA; distributed simulation; model reuse
1引言
MATLAB是MathWorks公司開發(fā)的科學(xué)計(jì)算軟件,具有強(qiáng)大的數(shù)學(xué)計(jì)算功能,采用了許多非常成熟的算法,能夠方便的進(jìn)行科學(xué)與工程計(jì)算,大大地減少了工作量。其中工具Simulink是圖形化建模、仿真和分析的軟件包,能處理線性和非線性系統(tǒng),連續(xù)、離散、混合系統(tǒng)。另一方面,HLA(高層體系結(jié)構(gòu))克服了以前技術(shù)的互聯(lián)、互操作有限等的限制,目前在分布式計(jì)算機(jī)仿真領(lǐng)域中得到了廣泛應(yīng)用。在分布式仿真中往往需要大量的復(fù)雜的數(shù)學(xué)運(yùn)算,而MATLAB中的工具Simulink能夠?qū)崿F(xiàn)圖形化動(dòng)態(tài)仿真,又能充分利用MATLAB數(shù)學(xué)計(jì)算資源,因此研究在HLA仿真中使用Simulink作為成員的快速生成方法,是非常有意義的。
文獻(xiàn)[1—4]分別從不同的角度提出了一種使用Simulink模型作為HLA仿真成員或重用Simulink模型的方法,本文在此基礎(chǔ)上,從MATLAB對(duì)外編程接口的角度,對(duì)在HLA仿真中使用Simulink作為成員的三種方法進(jìn)行了分析和總結(jié),根據(jù)各類方法的優(yōu)缺點(diǎn)得到了其中最優(yōu)的快速生成成員的方法,在文獻(xiàn)[4]基礎(chǔ)上,對(duì)最優(yōu)的方法進(jìn)行了深入分析,提出了新的設(shè)計(jì)思路,并進(jìn)行了軟件具體設(shè)計(jì),同時(shí)解決了其中數(shù)據(jù)映射和時(shí)間同步兩個(gè)關(guān)鍵問題。
2在HLA中使用Simulink的方法
在HLA中使用Simulink,首先應(yīng)根據(jù)仿真要求,開發(fā)成員的SOM,再根據(jù)SOM設(shè)計(jì)出Simulink模型的對(duì)外接口,而不是先有模型再自動(dòng)生成SOM。由于MATLAB對(duì)外只提供了3種類型的編程接口,所以在HLA仿真中使用Simulink作為成員可以采用這三種類型接口,從而形成了3種方法,而各文獻(xiàn)提出的方法都應(yīng)屬于這3種方法的不同實(shí)現(xiàn)形式。
2.1使用MATLAB引擎
MATLAB引擎(engine)是一組MATLAB提供的接口函數(shù),支持C和Fortran兩種語言。引擎所提供的MATLAB功能支持是所有類型接口中最全面的,通過引擎方式,應(yīng)用程序運(yùn)行時(shí)會(huì)創(chuàng)建新的MATLAB進(jìn)程,可以控制MATLAB進(jìn)程完成各種計(jì)算和操作。
計(jì)算技術(shù)與自動(dòng)化2012年9月
第31卷第3期蒯偉等:Simulink 模型在HLA仿真中的應(yīng)用方法研究
現(xiàn)有的RTI產(chǎn)品都提供C++接口,獨(dú)立于MATLAB之外的應(yīng)用程序采用C++語言編程平臺(tái)可以調(diào)用C語言的MATLAB引擎,并能夠使用RTI的C++接口,這樣應(yīng)用程序通過調(diào)用MATLAB引擎可以控制運(yùn)行Simulink工具,并能夠同時(shí)調(diào)用RTI服務(wù),形成HLA成員。文獻(xiàn)[3]采用了此接口,但與本文設(shè)計(jì)思路不同。
圖1在HLA仿真中通過MATLAB引擎
使用Simulink原理圖
此方法原理如圖1所示,應(yīng)用程序通過MATLAB引擎調(diào)用Simulink工具進(jìn)行動(dòng)態(tài)仿真,仿真輸入輸出都在共享數(shù)據(jù)區(qū)域中讀寫。應(yīng)用程序在另外線程調(diào)用RTI服務(wù)讀寫共享區(qū)域的數(shù)據(jù),并控制Simulink模型仿真進(jìn)度。根據(jù)SOM進(jìn)行數(shù)據(jù)映射設(shè)置,使得Simulink模型的輸入輸出與成員的輸入輸出相對(duì)應(yīng)。實(shí)現(xiàn)與其它成員的交互。
此方法各種模型(包括包含用戶自定模塊的模型)都可使用,但間接調(diào)用了MATLAB進(jìn)程,效率不高。用戶在使用應(yīng)用程序時(shí),數(shù)據(jù)映射設(shè)置非常復(fù)雜而且不夠直觀。
2.2使用RTW工具
RTW(Real—Time Workshop)是Simulink功能的一種拓展,能夠從Simulink模型自動(dòng)生成C語言代碼。將Simulink模型轉(zhuǎn)化為HLA成員的流程圖如圖2所示,先用RTW工具把Simulink模型轉(zhuǎn)換為C代碼,再在C++編程平臺(tái)上編輯的應(yīng)用程序,應(yīng)用程序中根據(jù)已有SOM調(diào)用C代碼和RTI服務(wù),最終生成HLA成員。文獻(xiàn)[2]采用了此接口,其認(rèn)為應(yīng)先有C代碼而后自動(dòng)生成SOM。
圖2使用RTW將Simulink轉(zhuǎn)化為HLA成員流程圖
此方法由C++語言實(shí)現(xiàn),仿真時(shí)不依賴MATLAB,運(yùn)行效率較高。但數(shù)據(jù)映射設(shè)置與第一個(gè)方法一樣,非常復(fù)雜而且不夠直觀。而且Simulink模型的任何改動(dòng),都必須重復(fù)全過程。若Simulink模型中有用戶自定義的模塊,則無法使用RTW生成C代碼,從而限制了該方法使用范圍。從Simulink模型到HLA成員的整個(gè)過程比較復(fù)雜,涉及編譯等,很難實(shí)現(xiàn)完全的自動(dòng)生成。
2.3使用SFunctions
SFunctions接口是由于MATLAB所提供的功能模塊不能完全滿足用戶的要求,作為擴(kuò)展功能的接口留給了用戶的。用戶可以通過SFunctions自己編寫模塊滿足各種復(fù)雜的仿真。利用此編程接口可以用SFunctions制作一個(gè)RTI接口模塊,如圖3所示,RTI接口模塊在使用時(shí)如其它模塊一樣,Simulink仿真中所有輸入輸出的數(shù)據(jù)都是通過RTI接口模塊與其它成員進(jìn)行交互的,RTI接口模塊根據(jù)數(shù)據(jù)輸入和映射設(shè)置調(diào)用RTI服務(wù),這樣可以使Simulink直接成為一個(gè)獨(dú)立成員。文獻(xiàn)[4]采用了此接口,以上設(shè)計(jì)思路與文獻(xiàn)[4]基本相同。
制作RTI接口模塊有兩種思路,一種思路是用M文件的SFunctions制作RTI接口模塊,首先MATLAB中必須有滿足HLA協(xié)議的M函數(shù)庫(FORWARDSIM的HLA Toolbox就是此類產(chǎn)品),再用M函數(shù)編寫M文件的SFunctions,從而制作出RTI接口模塊。此思路可以直接在MATLAB環(huán)境下完成,制作非常容易,但仿真不能脫離MATLAB環(huán)境,而且要求先開發(fā)滿足HLA協(xié)議的M函數(shù)庫,這是非常大且非常復(fù)雜的工程。另一思路是用其它語言編寫SFunctions來制作RTI接口模塊,由于MATLAB只有LCC編譯器,僅支持C語言,但C語言無法滿足RTI提供的編程接口要求,所以必須在其它語言編程平臺(tái)上編寫S—Functions,如VC++等。此思路在其它編程平臺(tái)編輯SFunctions成為動(dòng)態(tài)鏈接庫文件,但動(dòng)態(tài)鏈接庫文件必須在MATLAB下調(diào)試,所以調(diào)試工作比較困難,但不依賴M函數(shù)庫,成本低。
圖3RTI接口模型工作原理圖
采用RTI接口模塊方法與前面兩種方法不同,在不需要其它應(yīng)用程序下,Simulink本身直接成為一個(gè)成員。此方法相對(duì)前兩種方法有如下優(yōu)勢(shì):
1) 用戶使用時(shí),數(shù)據(jù)映射設(shè)置在RTI模塊屬性設(shè)置中完成,比前兩種方法直觀明了。
2) 用戶使用時(shí),可以充分利用MATLAB良好的圖形界面進(jìn)行操作,比前兩種方法直觀方便。
3) 此方法在效率上也比前兩種方法占有優(yōu)勢(shì)。采用此方法形成的成員可以在MATLAB環(huán)境下運(yùn)行,也可以利用RTW工具生成可不依賴MATLAB單獨(dú)執(zhí)行的程序。單獨(dú)執(zhí)行程序的所需生成條件和工作效率與第二種方法相同。
由以上優(yōu)點(diǎn)可以看出,采用RTI接口模塊的方法是在HLA仿真中使用Simulink作為成員的最恰當(dāng)方法。由于采用HLA協(xié)議的M函數(shù)庫的成本較高,所以下面選擇第二種思路,即采用其它語言編程平臺(tái)編輯SFunctions,編譯成RTI接口模塊所需的動(dòng)態(tài)鏈接庫。
3RTI接口模塊的具體分析與設(shè)計(jì)
因?yàn)橹С諬LA協(xié)議的RTI產(chǎn)品都提供C++接口函數(shù),所以采用VC++6.0作為程序編輯平臺(tái)。HLA主要有六大服務(wù):聯(lián)邦管理,聲明管理,對(duì)象管理,所有權(quán)管理,時(shí)間管理和數(shù)據(jù)分發(fā)管理。由于使用Simulink形成的成員都是數(shù)據(jù)處理或數(shù)據(jù)源等簡(jiǎn)單的成員,其中所有權(quán)管理服務(wù)往往不涉及,所以RTI接口模塊只完成剩下的五大服務(wù)。MATLAB中定義的SFunctions動(dòng)態(tài)鏈接庫有許多導(dǎo)出函數(shù),而我們只用到其中4個(gè)回調(diào)函數(shù),分別是mdlInitializeSizes,mdlStart,mdlOutputs,mdlTerminate。SFunctions動(dòng)態(tài)鏈接庫的功能模塊組成如圖4所示。
圖4SFunctions動(dòng)態(tài)鏈接庫的功能模塊組成
在數(shù)據(jù)映射設(shè)置功能模塊中,完成數(shù)據(jù)映射設(shè)置,并根據(jù)數(shù)據(jù)映射設(shè)置,設(shè)置好RTI接口模塊面向MATLAB的對(duì)外輸入輸出端口屬性設(shè)置。因?yàn)镾imulink仿真模型設(shè)計(jì)過程時(shí)模塊屬性設(shè)置和仿真過程的開始階段都需調(diào)用導(dǎo)出函數(shù)mdlInitializeSizes,所以把此功能模塊放在導(dǎo)出函數(shù)mdlInitializeSizes中完成。
在連接聯(lián)邦功能模塊中,根據(jù)數(shù)據(jù)映射設(shè)置,完成建立聯(lián)邦,加入聯(lián)邦,公布與訂購屬性,注冊(cè)對(duì)象類、設(shè)置時(shí)間管理模式和創(chuàng)建區(qū)域等面向RTI的工作。由于導(dǎo)出函數(shù)mdlStart的調(diào)用時(shí)機(jī)正好在仿真的開始階段,此功能模塊放在導(dǎo)出函數(shù)mdlStart中完成。
數(shù)據(jù)更新功能模塊采用雙線程工作,完成仿真的每一步的數(shù)據(jù)更新,數(shù)據(jù)更新包括面向RTI發(fā)送對(duì)象屬性和接收對(duì)象屬性,發(fā)送對(duì)象屬性在仿真每一步都會(huì)調(diào)用的導(dǎo)出函數(shù)mdlOutputs中完成,接收對(duì)象屬性在另一開辟的線程中完成。兩線程采用共享數(shù)據(jù)區(qū)域方式進(jìn)行交流。在導(dǎo)出函數(shù)mdlOutputs中,檢測(cè)仿真時(shí)間,根據(jù)要求進(jìn)行時(shí)間推進(jìn)實(shí)現(xiàn)仿真同步。
退出聯(lián)邦功能模塊完成刪除區(qū)域,退出和刪除聯(lián)邦等功能,在導(dǎo)出函數(shù)mdlTerminate中完成。
在RTI接口模塊工程實(shí)現(xiàn)中主要有兩個(gè)關(guān)鍵問題。一是數(shù)據(jù)映射問題,另一是時(shí)間同步問題。
3.1數(shù)據(jù)映射問題
MATLAB共有5種數(shù)據(jù)類型,而HLA定義了13種基本數(shù)據(jù)類型,為了易于處理,而且所有上述數(shù)據(jù)類型轉(zhuǎn)換為64位的double數(shù)據(jù)類型不會(huì)丟失信息,所以使用double數(shù)據(jù)類型作為Simulink和HLA之間的過渡。如圖3所示,在Simulink中仿真模型中所有輸入輸出數(shù)據(jù)都采用double類型,若是其它類型數(shù)據(jù)則在輸入前或輸出后采用Simulink中的Data Type Conversion模塊進(jìn)行轉(zhuǎn)換。在RTI接口模塊內(nèi)部則根據(jù)HLA的13種基本數(shù)據(jù)類型存儲(chǔ)形式與double類型進(jìn)行相互轉(zhuǎn)換。
在HLA中,屬性或參數(shù)往往是基本數(shù)據(jù)類型的組合,而且一個(gè)對(duì)象類可以注冊(cè)多個(gè)對(duì)象,這樣數(shù)據(jù)映射無法做到一一映射。為了解決這個(gè)問題,如果是對(duì)象類,接口模塊端口輸入輸出都采用矩陣(2維數(shù)組)形式,每個(gè)端口選擇對(duì)象類的一個(gè)屬性,多個(gè)端口對(duì)應(yīng)類的多個(gè)屬性,一個(gè)端口輸入輸出數(shù)據(jù)矩陣每一行(1維數(shù)組)對(duì)應(yīng)類的一個(gè)屬性,一行的多個(gè)數(shù)據(jù)對(duì)應(yīng)組合成一個(gè)屬性的多個(gè)基本數(shù)據(jù),矩陣行數(shù)對(duì)應(yīng)于注冊(cè)的對(duì)象數(shù)。若RTI接口模塊的某端口輸入為3×4的矩陣,則對(duì)應(yīng)注冊(cè)了3個(gè)對(duì)象,該端口對(duì)應(yīng)的對(duì)象類的屬性是4個(gè)基本數(shù)據(jù)類型的組合。如果是交互類時(shí),由于無多個(gè)對(duì)象問題,但為了統(tǒng)一,輸入輸出數(shù)據(jù)采用1×n矩陣。為了減少網(wǎng)絡(luò)數(shù)據(jù),對(duì)象類不是仿真每一步,而是在數(shù)據(jù)有變化時(shí)才更新數(shù)據(jù)。交互類存在同樣問題,但解決方法與對(duì)象類不同,仿真運(yùn)行時(shí)必須給予一個(gè)發(fā)送的標(biāo)志,所以采用輸入數(shù)據(jù)矩陣的第一個(gè)數(shù)據(jù)作為發(fā)送的標(biāo)志,后面n—1個(gè)數(shù)據(jù)對(duì)應(yīng)交互類的一個(gè)參數(shù)。采用上述方法設(shè)計(jì)的RTI接口模塊,用戶在使用時(shí),進(jìn)行數(shù)據(jù)映射設(shè)置簡(jiǎn)單明了。
3.2時(shí)間同步問題
HLA采用相互等待,共同推進(jìn)的方式完成時(shí)間同步。RTI接口模塊作為聯(lián)邦的成員有一個(gè)仿真時(shí)間(下面簡(jiǎn)稱聯(lián)邦仿真時(shí)間),在Simulink動(dòng)態(tài)仿真中又有一個(gè)仿真時(shí)間(下面簡(jiǎn)稱Simulink仿真時(shí)間)。為使Simulink和聯(lián)邦仿真同步,在Simulink仿真的每一步中,兩個(gè)仿真時(shí)間必須同步推進(jìn),在S—Functions中的導(dǎo)出函數(shù)mdlStart中,先計(jì)算聯(lián)邦仿真時(shí)間和Simulink仿真時(shí)間的差值,形成有固定差值的同步起點(diǎn)。如果設(shè)置了HLA定義的同步點(diǎn),還必須在同步點(diǎn)到達(dá)的回調(diào)函數(shù)中,再次計(jì)算聯(lián)邦仿真時(shí)間和Simulink仿真時(shí)間的差值,形成新的同步起點(diǎn)。在Simulink仿真每一步都需運(yùn)行的導(dǎo)出函數(shù)mdlOutputs中,根據(jù)當(dāng)前Simulink仿真時(shí)間和兩仿真時(shí)間的差值,計(jì)算出聯(lián)邦仿真時(shí)間,再調(diào)用RTI的時(shí)間服務(wù)可判斷出在聯(lián)邦仿真中Simulink成員是超前還是在被等待。若超前,則調(diào)用線程掛起函數(shù)來暫停整個(gè)Simulink仿真,等待其它成員。若被等待,則調(diào)用RTI時(shí)間推進(jìn)服務(wù),并迅速更新數(shù)據(jù),使聯(lián)邦仿真時(shí)間向前推進(jìn),并在Simulink仿真的下一步中重復(fù)此操作,使得Simulink成員與其它成員同步向前步步推進(jìn),這樣就實(shí)現(xiàn)了時(shí)間同步。
圖5HLA仿真中的目標(biāo)航跡生成的Simulink模型
4HLA仿真中快速使用Simulink模型舉例
以一目標(biāo)航跡生成成員為例,其采用RTI接口模塊,由Simulink模型形成一個(gè)HLA成員,完成雷達(dá)目標(biāo)航跡生成任務(wù),并把航跡上報(bào)。如圖5所示,其中RTI接口模塊訂購了飛機(jī)的坐標(biāo)。根據(jù)RTI接口模塊輸出的飛機(jī)坐標(biāo),雷達(dá)測(cè)量模塊(radar)在距離與方位上采用相互獨(dú)立的正態(tài)分布模型計(jì)算出飛機(jī)的坐標(biāo),由最小二乘法模塊(LSM)得到飛機(jī)航跡,再經(jīng)RTI接口模塊發(fā)送出去。對(duì)RTI接口模塊進(jìn)行屬性設(shè)置時(shí),彈出對(duì)話框如圖6所示,根據(jù)成員的SOM,可以在一個(gè)對(duì)話框中直觀、簡(jiǎn)單的完成時(shí)間管理、端口映射等設(shè)置,設(shè)置完成后,Simulink模型就成為可以運(yùn)行的HLA成員了。然后利用MATLAB的菜單控制該成員的整個(gè)仿真過程。
在聯(lián)邦工作流程中,該成員工作在飛機(jī)發(fā)出坐標(biāo)之后和航跡上報(bào)之前,所以在屬性設(shè)置時(shí)選擇時(shí)間控制和時(shí)間受限,程序根據(jù)該設(shè)置在仿真過程中自動(dòng)完成時(shí)間同步的各項(xiàng)計(jì)算工作,對(duì)用戶完全透明。時(shí)間同步如圖7所示,其中Chat13為本成員。
圖6時(shí)間管理和各個(gè)端口映射設(shè)置
圖7各成員的時(shí)間同步監(jiān)控
5結(jié)論
本文對(duì)3種使用Simulink形成HLA成員的實(shí)現(xiàn)方法進(jìn)行了分析和總結(jié),從各自的優(yōu)缺點(diǎn)得出:利用SFunctions接口制作RTI接口模塊的方法相對(duì)其它兩種在快速性、工作效率和使用方便上具有絕對(duì)優(yōu)勢(shì)。在最優(yōu)方法工程實(shí)現(xiàn)中,存在數(shù)據(jù)映射和時(shí)間同步兩個(gè)關(guān)鍵問題,其中采用矩陣的方法能夠很好解決數(shù)據(jù)映射問題,采用固定差值同步起點(diǎn)的方法能很好解決時(shí)間同步問題。采用RTI接口模塊方法制作出的產(chǎn)品,用戶使用時(shí)可以充分利用MATLAB的圖形仿真界面,僅通過一個(gè)簡(jiǎn)單對(duì)話框,完成數(shù)據(jù)映射、時(shí)間同步等各項(xiàng)屬性設(shè)置,直觀快速的生成HLA成員。使得HLA仿真中能夠快速使用MATLAB這一強(qiáng)大的數(shù)學(xué)工具。
參考文獻(xiàn)
[1]Sven Pawletta, Wolfgang Drewelow, Thorsten Pawletta.HLABased Simulation within an Interactive Engineering Environment[J].Fourth IEEE International Workshop on Distributed Simulation and Real— Time Applications,2000,97—102.
[2]田新華,馮潤(rùn)明,翁干飛.一種將Simulink/Stateflow模型改造成HLA成員的方法[J].系統(tǒng)仿真學(xué)報(bào),2002,14(7):883—886.
[3]郭斌,熊光楞,陳曉波.MATLAB與HLA/RTI通用適配器研究與實(shí)現(xiàn)[J]. 系統(tǒng)仿真學(xué)報(bào),2004,16(6):1275—1279.
[4]喬海泉,田新華,黃柯棣.將Simulink模型用于HLA仿真[J].系統(tǒng)仿真學(xué)報(bào),2006,18(2):335—400.
[5]The Mathworks, Inc. Using Simulink, 2003 [Z].