摘要:在HLA仿真中使用Simulink模型快速建立成員存在3種方法,首先對這3種方法進行系統分析和優缺點比較,得出S—Functions制作RTI接口模塊的方法是最優方法。然后對采用最優方法的方案進行具體設計。最后分析并解決數據映射與時間同步兩個關鍵問題。使得HLA仿真能夠充分快速利用MATLAB強大的數學計算功能。
關鍵詞:Simulink;HLA;分布式仿真;模型重用
中圖分類號:TP391.1 文獻標識碼: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公司開發的科學計算軟件,具有強大的數學計算功能,采用了許多非常成熟的算法,能夠方便的進行科學與工程計算,大大地減少了工作量。其中工具Simulink是圖形化建模、仿真和分析的軟件包,能處理線性和非線性系統,連續、離散、混合系統。另一方面,HLA(高層體系結構)克服了以前技術的互聯、互操作有限等的限制,目前在分布式計算機仿真領域中得到了廣泛應用。在分布式仿真中往往需要大量的復雜的數學運算,而MATLAB中的工具Simulink能夠實現圖形化動態仿真,又能充分利用MATLAB數學計算資源,因此研究在HLA仿真中使用Simulink作為成員的快速生成方法,是非常有意義的。
文獻[1—4]分別從不同的角度提出了一種使用Simulink模型作為HLA仿真成員或重用Simulink模型的方法,本文在此基礎上,從MATLAB對外編程接口的角度,對在HLA仿真中使用Simulink作為成員的三種方法進行了分析和總結,根據各類方法的優缺點得到了其中最優的快速生成成員的方法,在文獻[4]基礎上,對最優的方法進行了深入分析,提出了新的設計思路,并進行了軟件具體設計,同時解決了其中數據映射和時間同步兩個關鍵問題。
2在HLA中使用Simulink的方法
在HLA中使用Simulink,首先應根據仿真要求,開發成員的SOM,再根據SOM設計出Simulink模型的對外接口,而不是先有模型再自動生成SOM。由于MATLAB對外只提供了3種類型的編程接口,所以在HLA仿真中使用Simulink作為成員可以采用這三種類型接口,從而形成了3種方法,而各文獻提出的方法都應屬于這3種方法的不同實現形式。
2.1使用MATLAB引擎
MATLAB引擎(engine)是一組MATLAB提供的接口函數,支持C和Fortran兩種語言。引擎所提供的MATLAB功能支持是所有類型接口中最全面的,通過引擎方式,應用程序運行時會創建新的MATLAB進程,可以控制MATLAB進程完成各種計算和操作。
計算技術與自動化2012年9月
第31卷第3期蒯偉等:Simulink 模型在HLA仿真中的應用方法研究
現有的RTI產品都提供C++接口,獨立于MATLAB之外的應用程序采用C++語言編程平臺可以調用C語言的MATLAB引擎,并能夠使用RTI的C++接口,這樣應用程序通過調用MATLAB引擎可以控制運行Simulink工具,并能夠同時調用RTI服務,形成HLA成員。文獻[3]采用了此接口,但與本文設計思路不同。
圖1在HLA仿真中通過MATLAB引擎
使用Simulink原理圖
此方法原理如圖1所示,應用程序通過MATLAB引擎調用Simulink工具進行動態仿真,仿真輸入輸出都在共享數據區域中讀寫。應用程序在另外線程調用RTI服務讀寫共享區域的數據,并控制Simulink模型仿真進度。根據SOM進行數據映射設置,使得Simulink模型的輸入輸出與成員的輸入輸出相對應。實現與其它成員的交互。
此方法各種模型(包括包含用戶自定模塊的模型)都可使用,但間接調用了MATLAB進程,效率不高。用戶在使用應用程序時,數據映射設置非常復雜而且不夠直觀。
2.2使用RTW工具
RTW(Real—Time Workshop)是Simulink功能的一種拓展,能夠從Simulink模型自動生成C語言代碼。將Simulink模型轉化為HLA成員的流程圖如圖2所示,先用RTW工具把Simulink模型轉換為C代碼,再在C++編程平臺上編輯的應用程序,應用程序中根據已有SOM調用C代碼和RTI服務,最終生成HLA成員。文獻[2]采用了此接口,其認為應先有C代碼而后自動生成SOM。
圖2使用RTW將Simulink轉化為HLA成員流程圖
此方法由C++語言實現,仿真時不依賴MATLAB,運行效率較高。但數據映射設置與第一個方法一樣,非常復雜而且不夠直觀。而且Simulink模型的任何改動,都必須重復全過程。若Simulink模型中有用戶自定義的模塊,則無法使用RTW生成C代碼,從而限制了該方法使用范圍。從Simulink模型到HLA成員的整個過程比較復雜,涉及編譯等,很難實現完全的自動生成。
2.3使用SFunctions
SFunctions接口是由于MATLAB所提供的功能模塊不能完全滿足用戶的要求,作為擴展功能的接口留給了用戶的。用戶可以通過SFunctions自己編寫模塊滿足各種復雜的仿真。利用此編程接口可以用SFunctions制作一個RTI接口模塊,如圖3所示,RTI接口模塊在使用時如其它模塊一樣,Simulink仿真中所有輸入輸出的數據都是通過RTI接口模塊與其它成員進行交互的,RTI接口模塊根據數據輸入和映射設置調用RTI服務,這樣可以使Simulink直接成為一個獨立成員。文獻[4]采用了此接口,以上設計思路與文獻[4]基本相同。
制作RTI接口模塊有兩種思路,一種思路是用M文件的SFunctions制作RTI接口模塊,首先MATLAB中必須有滿足HLA協議的M函數庫(FORWARDSIM的HLA Toolbox就是此類產品),再用M函數編寫M文件的SFunctions,從而制作出RTI接口模塊。此思路可以直接在MATLAB環境下完成,制作非常容易,但仿真不能脫離MATLAB環境,而且要求先開發滿足HLA協議的M函數庫,這是非常大且非常復雜的工程。另一思路是用其它語言編寫SFunctions來制作RTI接口模塊,由于MATLAB只有LCC編譯器,僅支持C語言,但C語言無法滿足RTI提供的編程接口要求,所以必須在其它語言編程平臺上編寫S—Functions,如VC++等。此思路在其它編程平臺編輯SFunctions成為動態鏈接庫文件,但動態鏈接庫文件必須在MATLAB下調試,所以調試工作比較困難,但不依賴M函數庫,成本低。
圖3RTI接口模型工作原理圖
采用RTI接口模塊方法與前面兩種方法不同,在不需要其它應用程序下,Simulink本身直接成為一個成員。此方法相對前兩種方法有如下優勢:
1) 用戶使用時,數據映射設置在RTI模塊屬性設置中完成,比前兩種方法直觀明了。
2) 用戶使用時,可以充分利用MATLAB良好的圖形界面進行操作,比前兩種方法直觀方便。
3) 此方法在效率上也比前兩種方法占有優勢。采用此方法形成的成員可以在MATLAB環境下運行,也可以利用RTW工具生成可不依賴MATLAB單獨執行的程序。單獨執行程序的所需生成條件和工作效率與第二種方法相同。
由以上優點可以看出,采用RTI接口模塊的方法是在HLA仿真中使用Simulink作為成員的最恰當方法。由于采用HLA協議的M函數庫的成本較高,所以下面選擇第二種思路,即采用其它語言編程平臺編輯SFunctions,編譯成RTI接口模塊所需的動態鏈接庫。
3RTI接口模塊的具體分析與設計
因為支持HLA協議的RTI產品都提供C++接口函數,所以采用VC++6.0作為程序編輯平臺。HLA主要有六大服務:聯邦管理,聲明管理,對象管理,所有權管理,時間管理和數據分發管理。由于使用Simulink形成的成員都是數據處理或數據源等簡單的成員,其中所有權管理服務往往不涉及,所以RTI接口模塊只完成剩下的五大服務。MATLAB中定義的SFunctions動態鏈接庫有許多導出函數,而我們只用到其中4個回調函數,分別是mdlInitializeSizes,mdlStart,mdlOutputs,mdlTerminate。SFunctions動態鏈接庫的功能模塊組成如圖4所示。
圖4SFunctions動態鏈接庫的功能模塊組成
在數據映射設置功能模塊中,完成數據映射設置,并根據數據映射設置,設置好RTI接口模塊面向MATLAB的對外輸入輸出端口屬性設置。因為Simulink仿真模型設計過程時模塊屬性設置和仿真過程的開始階段都需調用導出函數mdlInitializeSizes,所以把此功能模塊放在導出函數mdlInitializeSizes中完成。
在連接聯邦功能模塊中,根據數據映射設置,完成建立聯邦,加入聯邦,公布與訂購屬性,注冊對象類、設置時間管理模式和創建區域等面向RTI的工作。由于導出函數mdlStart的調用時機正好在仿真的開始階段,此功能模塊放在導出函數mdlStart中完成。
數據更新功能模塊采用雙線程工作,完成仿真的每一步的數據更新,數據更新包括面向RTI發送對象屬性和接收對象屬性,發送對象屬性在仿真每一步都會調用的導出函數mdlOutputs中完成,接收對象屬性在另一開辟的線程中完成。兩線程采用共享數據區域方式進行交流。在導出函數mdlOutputs中,檢測仿真時間,根據要求進行時間推進實現仿真同步。
退出聯邦功能模塊完成刪除區域,退出和刪除聯邦等功能,在導出函數mdlTerminate中完成。
在RTI接口模塊工程實現中主要有兩個關鍵問題。一是數據映射問題,另一是時間同步問題。
3.1數據映射問題
MATLAB共有5種數據類型,而HLA定義了13種基本數據類型,為了易于處理,而且所有上述數據類型轉換為64位的double數據類型不會丟失信息,所以使用double數據類型作為Simulink和HLA之間的過渡。如圖3所示,在Simulink中仿真模型中所有輸入輸出數據都采用double類型,若是其它類型數據則在輸入前或輸出后采用Simulink中的Data Type Conversion模塊進行轉換。在RTI接口模塊內部則根據HLA的13種基本數據類型存儲形式與double類型進行相互轉換。
在HLA中,屬性或參數往往是基本數據類型的組合,而且一個對象類可以注冊多個對象,這樣數據映射無法做到一一映射。為了解決這個問題,如果是對象類,接口模塊端口輸入輸出都采用矩陣(2維數組)形式,每個端口選擇對象類的一個屬性,多個端口對應類的多個屬性,一個端口輸入輸出數據矩陣每一行(1維數組)對應類的一個屬性,一行的多個數據對應組合成一個屬性的多個基本數據,矩陣行數對應于注冊的對象數。若RTI接口模塊的某端口輸入為3×4的矩陣,則對應注冊了3個對象,該端口對應的對象類的屬性是4個基本數據類型的組合。如果是交互類時,由于無多個對象問題,但為了統一,輸入輸出數據采用1×n矩陣。為了減少網絡數據,對象類不是仿真每一步,而是在數據有變化時才更新數據。交互類存在同樣問題,但解決方法與對象類不同,仿真運行時必須給予一個發送的標志,所以采用輸入數據矩陣的第一個數據作為發送的標志,后面n—1個數據對應交互類的一個參數。采用上述方法設計的RTI接口模塊,用戶在使用時,進行數據映射設置簡單明了。
3.2時間同步問題
HLA采用相互等待,共同推進的方式完成時間同步。RTI接口模塊作為聯邦的成員有一個仿真時間(下面簡稱聯邦仿真時間),在Simulink動態仿真中又有一個仿真時間(下面簡稱Simulink仿真時間)。為使Simulink和聯邦仿真同步,在Simulink仿真的每一步中,兩個仿真時間必須同步推進,在S—Functions中的導出函數mdlStart中,先計算聯邦仿真時間和Simulink仿真時間的差值,形成有固定差值的同步起點。如果設置了HLA定義的同步點,還必須在同步點到達的回調函數中,再次計算聯邦仿真時間和Simulink仿真時間的差值,形成新的同步起點。在Simulink仿真每一步都需運行的導出函數mdlOutputs中,根據當前Simulink仿真時間和兩仿真時間的差值,計算出聯邦仿真時間,再調用RTI的時間服務可判斷出在聯邦仿真中Simulink成員是超前還是在被等待。若超前,則調用線程掛起函數來暫停整個Simulink仿真,等待其它成員。若被等待,則調用RTI時間推進服務,并迅速更新數據,使聯邦仿真時間向前推進,并在Simulink仿真的下一步中重復此操作,使得Simulink成員與其它成員同步向前步步推進,這樣就實現了時間同步。
圖5HLA仿真中的目標航跡生成的Simulink模型
4HLA仿真中快速使用Simulink模型舉例
以一目標航跡生成成員為例,其采用RTI接口模塊,由Simulink模型形成一個HLA成員,完成雷達目標航跡生成任務,并把航跡上報。如圖5所示,其中RTI接口模塊訂購了飛機的坐標。根據RTI接口模塊輸出的飛機坐標,雷達測量模塊(radar)在距離與方位上采用相互獨立的正態分布模型計算出飛機的坐標,由最小二乘法模塊(LSM)得到飛機航跡,再經RTI接口模塊發送出去。對RTI接口模塊進行屬性設置時,彈出對話框如圖6所示,根據成員的SOM,可以在一個對話框中直觀、簡單的完成時間管理、端口映射等設置,設置完成后,Simulink模型就成為可以運行的HLA成員了。然后利用MATLAB的菜單控制該成員的整個仿真過程。
在聯邦工作流程中,該成員工作在飛機發出坐標之后和航跡上報之前,所以在屬性設置時選擇時間控制和時間受限,程序根據該設置在仿真過程中自動完成時間同步的各項計算工作,對用戶完全透明。時間同步如圖7所示,其中Chat13為本成員。
圖6時間管理和各個端口映射設置
圖7各成員的時間同步監控
5結論
本文對3種使用Simulink形成HLA成員的實現方法進行了分析和總結,從各自的優缺點得出:利用SFunctions接口制作RTI接口模塊的方法相對其它兩種在快速性、工作效率和使用方便上具有絕對優勢。在最優方法工程實現中,存在數據映射和時間同步兩個關鍵問題,其中采用矩陣的方法能夠很好解決數據映射問題,采用固定差值同步起點的方法能很好解決時間同步問題。采用RTI接口模塊方法制作出的產品,用戶使用時可以充分利用MATLAB的圖形仿真界面,僅通過一個簡單對話框,完成數據映射、時間同步等各項屬性設置,直觀快速的生成HLA成員。使得HLA仿真中能夠快速使用MATLAB這一強大的數學工具。
參考文獻
[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]田新華,馮潤明,翁干飛.一種將Simulink/Stateflow模型改造成HLA成員的方法[J].系統仿真學報,2002,14(7):883—886.
[3]郭斌,熊光楞,陳曉波.MATLAB與HLA/RTI通用適配器研究與實現[J]. 系統仿真學報,2004,16(6):1275—1279.
[4]喬海泉,田新華,黃柯棣.將Simulink模型用于HLA仿真[J].系統仿真學報,2006,18(2):335—400.
[5]The Mathworks, Inc. Using Simulink, 2003 [Z].