張培忠,高 坤,寧金貴
(中國(guó)人民解放軍63850部隊(duì),吉林 白城 137001)
導(dǎo)彈半實(shí)物仿真技術(shù)是一項(xiàng)涉及多學(xué)科、多專業(yè)的復(fù)雜系統(tǒng)工程,其中穩(wěn)定、實(shí)時(shí)、可靠的仿真軟件是一個(gè)重要組成部分。在導(dǎo)彈半實(shí)物仿真過(guò)程中,由于在仿真回路中接入了實(shí)物部件,要求仿真設(shè)備軟硬件的時(shí)間尺度與實(shí)物部件的時(shí)間尺度(自然時(shí)間尺度)一致,也就要求整個(gè)仿真系統(tǒng)是實(shí)時(shí)運(yùn)行的。一般半實(shí)物仿真系統(tǒng)都以實(shí)時(shí)操作系統(tǒng)作為運(yùn)行平臺(tái),例如YH-Astar仿真工作站,該工作站是基于Intel處理器和Windows 2000+RTX操作系統(tǒng),這就要求設(shè)計(jì)的導(dǎo)彈仿真程序也能夠在RTX實(shí)時(shí)環(huán)境中運(yùn)行。
YH-Astar仿真工作站采用YHSim一體化建模與實(shí)時(shí)仿真軟件,該軟件雖然功能強(qiáng)大,但不是通用商業(yè)軟件,升級(jí)維護(hù)不便,且不支持圖形模塊化建模,程序代碼兼容性、可移植性不足,導(dǎo)致用戶建模、校模、驗(yàn)?zāi)P势蚚1-2]。然而,Matlab/Simulink是目前計(jì)算機(jī)仿真應(yīng)用最為廣泛的軟件,支持圖形模塊化建模,程序代碼兼容性、移植性好,技術(shù)資料豐富,便于升級(jí)維護(hù),許多專用的仿真系統(tǒng)都支持Simulink模型,方便了用戶的使用[3]。從軟件功能的通用性、兼容性、完善性等多方面考慮,有必要利用Simulink開(kāi)發(fā)導(dǎo)彈半實(shí)物仿真軟件[4]。但是,用Simulink開(kāi)發(fā)的仿真程序還不能直接拿到RTX實(shí)時(shí)環(huán)境中運(yùn)行,需要經(jīng)過(guò)實(shí)時(shí)性改造和移植,才能獲得實(shí)時(shí)、穩(wěn)定運(yùn)行的仿真程序。
常用Windows系列操作系統(tǒng)不是實(shí)時(shí)系統(tǒng),RTX(Real-Time Extension)是美國(guó)Ardence公司開(kāi)發(fā)的基于Windows NT/2000/XP操作系統(tǒng)的硬實(shí)時(shí)擴(kuò)展子系統(tǒng)。RTX給Windows系統(tǒng)增加一個(gè)實(shí)時(shí)子系統(tǒng)RTSS(Real-Time Subsystem)和實(shí)時(shí)HAL(Hardware Abstract Level)擴(kuò)展,以實(shí)現(xiàn)硬實(shí)時(shí)功能。圖1為RTX的工作原理圖。
RTSS在概念上與其他Windows子系統(tǒng)(如Win32、POSIX等)類似,它擁有自己的執(zhí)行環(huán)境和API(Application Programming Interface),擴(kuò)展了自己的線程調(diào)度機(jī)制,RTX-RTSS中執(zhí)行的程序都具備比Win32程序更高的優(yōu)先權(quán),包括Windows管理的中斷及延時(shí)過(guò)程調(diào)用DPCs等。RTSS還支持 IPC(Inter Process Communication)對(duì)象,這些IPC對(duì)象可以被RTSS進(jìn)程和Win32進(jìn)程操作,從而實(shí)現(xiàn)實(shí)時(shí)進(jìn)程和非實(shí)時(shí)進(jìn)程之間的通信與同步。
RTX HAL擴(kuò)展起著中斷隔離的作用,Windows不能屏蔽RTSS管理的中斷,但在RTSS進(jìn)程運(yùn)行時(shí),可以屏蔽Windows的中斷。RTX HAL還提供高精度的時(shí)鐘和定時(shí)器,時(shí)鐘分辨率可以達(dá)到100 ns,定時(shí)器最小周期為1 μs,同時(shí)也支持 Windows 的非實(shí)時(shí)時(shí)鐘和定時(shí)器。RTX HAL的其他特征還有:提供了RTX和Windows之間的軟件中斷機(jī)制、異常處理以及對(duì)系統(tǒng)確定性的擴(kuò)展。
RTX還支持單處理器系統(tǒng)和多處理器系統(tǒng)。在多處理器系統(tǒng)中,RTX可以運(yùn)行于“共享”方式或“獨(dú)占”方式?!肮蚕怼狈绞绞侵窻TX與Windows程序共享一個(gè)處理器,其他處理器全部由Windows程序占用;“獨(dú)占”方式是指RTX獨(dú)占一個(gè)處理器,保證了其實(shí)時(shí)功能。
RTX API是基于Win32的應(yīng)用程序接口,使開(kāi)發(fā)者能夠利用Win32開(kāi)發(fā)經(jīng)驗(yàn)、現(xiàn)有代碼、開(kāi)發(fā)工具來(lái)編寫實(shí)時(shí)應(yīng)用程序。Win32和RTSS都支持RTX API。RTX API包含Win32 API的部分函數(shù),稱為RTXAPI的函數(shù)集。RTX API是為了實(shí)時(shí)應(yīng)用而經(jīng)過(guò)仔細(xì)挑選的函數(shù)集,但不包括Win32的一類函數(shù),如GUI函數(shù),這類函數(shù)通常用于實(shí)時(shí)性要求不高的場(chǎng)合。實(shí)際上,那些實(shí)時(shí)應(yīng)用不必要的、對(duì)確定性執(zhí)行不適用的Win32函數(shù)都沒(méi)包括在RTX API中。因此,通常采用Win32與RTSS相結(jié)合方式開(kāi)發(fā)實(shí)時(shí)軟件,將有實(shí)時(shí)性要求的事務(wù)放在RTSS進(jìn)程中處理,而將人機(jī)界面等對(duì)實(shí)時(shí)性要求不高的事務(wù)放在Win32進(jìn)程中處理,RTSS進(jìn)程與Win32進(jìn)程通過(guò)共享內(nèi)存的方式相互溝通,如圖2所示。
RTX為用戶和開(kāi)發(fā)人員提供了實(shí)時(shí)系統(tǒng)運(yùn)行環(huán)境(RTX Runtime)和實(shí)時(shí)系統(tǒng)開(kāi)發(fā)環(huán)境(RTX SDK)。用戶可以像開(kāi)發(fā)其他Windows應(yīng)用程序一樣,用Visual Studio開(kāi)發(fā)RTX應(yīng)用程序。安裝RTX后,在Visual Studio集成開(kāi)發(fā)環(huán)境下,增加開(kāi)發(fā)RTSS軟件的應(yīng)用程序向?qū)TX AppWizard,類似于MFC AppWizard。用戶使用該向?qū)?,可定制所需的?yīng)用程序框架,包括定時(shí)器、中斷、事件管理、端口IO及RTSS動(dòng)態(tài)鏈接庫(kù)等。用戶在該框架基礎(chǔ)上添加程序代碼,編譯鏈接后即可生成RTX應(yīng)用程序。
Matlab/Simulink是國(guó)際上仿真領(lǐng)域最常用的商業(yè)化計(jì)算機(jī)工具軟件包。它提供了一個(gè)圖形模塊化、動(dòng)態(tài)建模、仿真和綜合分析的集成環(huán)境,無(wú)需用戶手工編寫大量的程序代碼,只要通過(guò)簡(jiǎn)單的圖形模塊化鼠標(biāo)操作,就可以構(gòu)造出復(fù)雜的、可靠的、易讀的仿真程序,顯著提高了仿真程序的開(kāi)發(fā)效率和質(zhì)量[5]。雖然 Matlab/Simulink沒(méi)有硬件接口及實(shí)時(shí)仿真功能,但它的S-函數(shù)機(jī)制和Real-Time Workshop組件為開(kāi)發(fā)實(shí)時(shí)仿真軟件提供了有效的技術(shù)途徑。
首先用Matlab/Simulink建立仿真模型,這期間需要編寫S-函數(shù),用以實(shí)現(xiàn)仿真程序與仿真設(shè)備硬件接口之間的聯(lián)接,并將該S-函數(shù)加入到Simulink仿真模型中。Simulink仿真模型設(shè)計(jì)完成后,通過(guò)Real-Time Workshop將仿真模型編譯成C語(yǔ)言代碼,最后對(duì)該C語(yǔ)言代碼進(jìn)行實(shí)時(shí)性改造[6],再移植到Windows+RTX實(shí)時(shí)環(huán)境中,完成實(shí)時(shí)仿真程序設(shè)計(jì)。
Simulink是Matlab產(chǎn)品系列中非常重要的一個(gè)組件,是用圖形模塊化建模、分析和仿真各種動(dòng)態(tài)系統(tǒng)的交互環(huán)境,包括連續(xù)系統(tǒng)、離散系統(tǒng)和連續(xù)離散混合系統(tǒng)。Simulink提供了許多實(shí)現(xiàn)不同功能的圖形化模塊庫(kù),每種模塊庫(kù)包含了多種功能模塊,用戶也可以設(shè)計(jì)自己的專業(yè)模塊庫(kù)并加入其中,以擴(kuò)充Simulink的功能。由于Simulink采用圖形模塊化、交互式操作方式,用戶建模時(shí)只需使用鼠標(biāo)拖放不同模塊庫(kù)中所需要的功能模塊圖標(biāo),并將它們連接起來(lái),就可以創(chuàng)建仿真模型,從而使復(fù)雜、繁瑣的仿真模型設(shè)計(jì)問(wèn)題簡(jiǎn)單化。用戶還可以把若干個(gè)功能塊組合成子系統(tǒng),建立起分層的、多級(jí)的復(fù)雜仿真模型,使仿真模型的組成結(jié)構(gòu)清晰、明了,邏輯關(guān)系易讀,提高了仿真建模、校模、驗(yàn)?zāi)5男屎唾|(zhì)量。
Simulink圖形模塊化的“編程”方法使得用戶從編寫繁雜語(yǔ)句代碼的勞動(dòng)中解放出來(lái)。但是,創(chuàng)建一個(gè)Simulink仿真模型的時(shí)候,就等于在編程,必須考慮數(shù)值計(jì)算的問(wèn)題。首先,應(yīng)當(dāng)選擇對(duì)指定模型的微分方程求解所使用的最佳算法,Simulink提供了多種微分方程的數(shù)值解法,有各自的特點(diǎn)和適用場(chǎng)合,不同的解法通過(guò)Simulation/Configuration Parameters頁(yè)中的求解器(Solver)選項(xiàng)設(shè)置。其次,要對(duì)模型中的變量進(jìn)行分析,考慮是否需要進(jìn)行過(guò)零檢測(cè),某些變量在過(guò)零時(shí)會(huì)出現(xiàn)不連續(xù)狀態(tài),如自由下落的物體著地后,會(huì)被彈起來(lái),速度會(huì)發(fā)生跳變,這類變量,如果在動(dòng)態(tài)系統(tǒng)仿真中不對(duì)其進(jìn)行過(guò)零檢測(cè),很可能會(huì)導(dǎo)致不正確的結(jié)果。最后,要避免出現(xiàn)代數(shù)環(huán),對(duì)不能去掉的代數(shù)環(huán)進(jìn)行處理。
半實(shí)物仿真程序需要與仿真設(shè)備及實(shí)物部件之間進(jìn)行通迅,Simulink本身不具備這個(gè)功能,用戶可以通過(guò)編寫S-函數(shù),來(lái)實(shí)現(xiàn)仿真程序與硬件接口的聯(lián)接。
S-函數(shù)(System Function)是采用計(jì)算機(jī)編程語(yǔ)言方式描述的一個(gè)功能模塊,它是Simulink建模的有力擴(kuò)充,它提供了增強(qiáng)和擴(kuò)展Simulink功能的強(qiáng)大機(jī)制,同時(shí)也是使用Real-Time Workshop實(shí)現(xiàn)半實(shí)物仿真的關(guān)鍵。在用戶使用Simulink建模時(shí),S-函數(shù)的使用方法同其他功能模塊一樣,可以采用Matlab、C、C++、FORTRAN以及Ada等高級(jí)語(yǔ)言編寫S-函數(shù)。
S-函數(shù)有兩種類型,一種是M文件S-函數(shù),用Matlab語(yǔ)言來(lái)編寫;另一種是ME X文件S-函數(shù),用C、C++、Ada 或 Fortran 語(yǔ)言編寫編譯而成。本文采用C語(yǔ)言編寫MEX文件的S-函數(shù)。C語(yǔ)言編寫MEX文件的S-函數(shù)是一些符合特定語(yǔ)法結(jié)構(gòu)的回調(diào)函數(shù),每個(gè)回調(diào)函數(shù)都對(duì)應(yīng)著一個(gè)預(yù)先指定的具體任務(wù),各個(gè)回調(diào)函數(shù)在總仿真流程中所處的位置及功能如圖3所示。Matlab提供了C語(yǔ)言編寫MEX文件的S-函數(shù)的模板文件sfuntmpl_doc.c,該文件定義了各回調(diào)函數(shù)的結(jié)構(gòu),并有詳細(xì)注釋。用戶參考回調(diào)函數(shù)的注釋,依據(jù)模板文件中的回調(diào)函數(shù)結(jié)構(gòu),用C語(yǔ)言編寫MEX文件的S-函數(shù)。
Real-Time Workshop(簡(jiǎn)稱RTW)是Matlab的重要組成部分,是一個(gè)基于Simulink圖形模塊化的仿真模型轉(zhuǎn)化成程序代碼的工具。用戶使用RTW可以直接從Simulink圖形模塊化的仿真模型生成優(yōu)化的、可移植的、用戶定制的C或Ada程序代碼,并根據(jù)不同的目標(biāo)配置生成可以在多種環(huán)境下運(yùn)行的程序。
在用RTW生成程序代碼之前,需要對(duì)圖形模塊化的仿真模型進(jìn)行一些必要的設(shè)置。包括:(1)設(shè)定仿真模型的內(nèi)部參數(shù),如各積分項(xiàng)的初始條件等;(2)設(shè)定Simulink仿真參數(shù),通過(guò)Simulation/Configuration Parameters菜單設(shè)置,包括Start time、Stop time、Solver等;(3)設(shè)定RTW代碼,指定RTW系統(tǒng)目標(biāo)文件、模板聯(lián)編文件和聯(lián)編命令文件。
RTW生成的程序代碼不能直接用于Windows+RTX實(shí)時(shí)環(huán)境中,還需要對(duì)該程序代碼進(jìn)行實(shí)時(shí)性改造,再移植到RTX實(shí)時(shí)環(huán)境中。為此,先將RTW生成文件設(shè)置為grt.tlc,模板聯(lián)編文件和聯(lián)編命令文件保持默認(rèn)設(shè)置。各項(xiàng)參數(shù)設(shè)置完后,點(diǎn)擊“Build”生成C語(yǔ)言代碼。生成的C語(yǔ)言代碼文件默認(rèn)保存在 Matlab 安裝目錄下的 workmodel_grt_rtw 目錄下(model為模型名稱),包括:model.mk、model.mak、model.bat、model.h、model.c、model_data.c、model_types.h、model_private.h、rt_nonfinite.c、rt_nonfinite.h、rtmodel.h、rtwtypes.h、rtw_proj.tmw。用 VC++ 6.0打開(kāi)其中model.mak 文件,會(huì)創(chuàng)建一個(gè)Win32控制臺(tái)(Win32 Console Application)類型的工程。此工程包括上百個(gè)Matlab提供的C源文件和頭文件,在安裝目錄Matlab ROOT twclibsrc下,這些C源文件提供了模型運(yùn)行中的函數(shù)支持,比如仿真運(yùn)算、積分器等Matlab庫(kù)函數(shù)。工程的主文件為 grt_main.c,它與用戶模型無(wú)關(guān),也是Matlab提供的,在Matlab ROOT twcgrt目錄下。
利用RTW將Simulink圖形模塊化的仿真模型轉(zhuǎn)化成了C語(yǔ)言程序代碼,這是一種在Win32環(huán)境下運(yùn)行的通用程序代碼,還不具備實(shí)時(shí)性,沒(méi)有仿真步長(zhǎng)度量及推進(jìn)功能,需要對(duì)其進(jìn)行實(shí)時(shí)性改造和移植。
分析Simulink圖形模塊化的仿真模型的C語(yǔ)言程序代碼(主要是grt_main.c和model.c文件)可以發(fā)現(xiàn),仿真程序的流程依據(jù)圖4進(jìn)行的。仿真過(guò)程分為三部分:(1)初始化部分,主要由MODEL()、MdlInitializeSizes()、 MdlInitializeSampleTimes()、MdlStart()函數(shù)組成;(2)幀循環(huán)部分,主要是rt_OneStep()函數(shù),該函數(shù)主要包括了MdlOutputs()、MdlUpdate()函數(shù);(3)仿真結(jié)束處理部分MdlTerminate()。其中,需要實(shí)時(shí)處理的部分只有幀循環(huán)部分rt_OneStep()函數(shù)及其MdlUpdate()函數(shù)、MdlOutput()函數(shù),其他的初始化和仿真結(jié)束后的數(shù)據(jù)記錄、清理等工作都不需要實(shí)時(shí)處理。
RTX實(shí)時(shí)程序通常采用Win32進(jìn)程與RTSS進(jìn)程相結(jié)合的方法(見(jiàn)圖2),將需要實(shí)時(shí)處理的事務(wù)放在RTSS進(jìn)程中,其他部分放在Win32進(jìn)程中。文獻(xiàn)[1]和[2]介紹的半實(shí)物仿真程序設(shè)計(jì)就是采用這種方法,他們首先對(duì)RTW生成的模型代碼進(jìn)行實(shí)時(shí)性分離,將需要實(shí)時(shí)運(yùn)行的部分(rt_OneStep()函數(shù)及其MdlOutputs()函數(shù)、MdlUpdate()函數(shù))放到RTSS進(jìn)程中,其他部分如初始化、仿真結(jié)果記錄等放在Win32進(jìn)程中。但是,這種方法由Win32進(jìn)程和RTSS進(jìn)程共同完成仿真,要求Win32進(jìn)程和RTSS進(jìn)程共享仿真模型的數(shù)據(jù)空間,主要是共享SimStruct數(shù)據(jù)結(jié)構(gòu)。SimStruct是一個(gè)非常復(fù)雜的數(shù)據(jù)結(jié)構(gòu),其封裝了仿真模型的所有動(dòng)態(tài)信息,內(nèi)部有大量的指針變量以及指針嵌套結(jié)構(gòu)。鑒于Win32環(huán)境和RTSS環(huán)境存儲(chǔ)器的編址方式不同,共享的、同一物理存儲(chǔ)單元在Win32環(huán)境和RTSS環(huán)境的邏輯地址不同,因此要實(shí)現(xiàn)SimStruct數(shù)據(jù)結(jié)構(gòu)的共享就非常困難。
新設(shè)計(jì)的實(shí)時(shí)性改造方案是:將全部仿真程序(包括初始化、幀循環(huán)、仿真停止處理)都放在RTSS進(jìn)程運(yùn)行,Win32與RTSS仿真程序及其數(shù)據(jù)結(jié)構(gòu)無(wú)關(guān)。Win32進(jìn)程僅負(fù)責(zé)共享內(nèi)存的創(chuàng)建、RTSS進(jìn)程的載入,負(fù)責(zé)RTSS仿真過(guò)程的控制及仿真結(jié)果的顯示功能,并通過(guò)共享內(nèi)存向RTSS進(jìn)程發(fā)送控制命令、讀取RTSS仿真數(shù)據(jù)及狀態(tài)信息;而RTSS進(jìn)程則獨(dú)立運(yùn)行全部仿真程序,并通過(guò)共享內(nèi)存接收Win32進(jìn)程的控制命令及參數(shù),用定時(shí)器控制幀周期,在完成每一幀的計(jì)算后,將仿真結(jié)果存入共享內(nèi)存,供Win32進(jìn)程讀取顯示。經(jīng)過(guò)實(shí)時(shí)性改造及代碼移植后,仿真程序框架結(jié)構(gòu)如圖5所示。
依據(jù)圖5的仿真程序結(jié)構(gòu)編制仿真程序。用 VC++ 6.0創(chuàng)建一個(gè)RTSS Application類型的工程,在該工程中加入RTW生成的代碼文件,將主程序文件替換為Matlab的grt_main.c文件,然后對(duì)該文件代碼進(jìn)行修改。修改的內(nèi)容主要有:(1)在main()函數(shù)中加入RtOpenSharedMemory()函數(shù),用于打開(kāi)由Win32主程序建立的共享內(nèi)存;(2)調(diào)用RtCreateTimer()和 RtSetTimerRelative()函數(shù),創(chuàng)建定時(shí)器并設(shè)置時(shí)間間隔(即幀周期);(3)編寫定時(shí)器回調(diào)函數(shù)代碼,將單步仿真程序rt_OneStep()移到該函數(shù)中;(4)去掉原代碼中幀循環(huán)部分,改為檢查共享內(nèi)存中控制命令字節(jié)程序;(5)刪除原程序中有關(guān)顯示及數(shù)據(jù)記錄的函數(shù),如printf()、rt_StartDataLogging()、rt_UpdateTXYLogVars()、rt_StopDataLogging()等。該工程編譯連接后生成可執(zhí)行文件,擴(kuò)展名為.rtss。
用VC++ 6.0建立Win32 Console 或MFC類型的Win32工程,加入以下程序代碼:(1)調(diào)用 RtCreateSharedMemory()函數(shù)創(chuàng)建共享內(nèi)存,并進(jìn)行共享內(nèi)存的初始化,如設(shè)置仿真幀周期等;(2)通過(guò)CreateProcess()函數(shù)運(yùn)行RTSSrun程序,進(jìn)而載入并運(yùn)行由RTSS工程生成的.rtss程序;(3)查詢共享內(nèi)存的RTSS狀態(tài)字節(jié),等待RTSS進(jìn)程的“就緒”狀態(tài),然后寫“允許仿真”命令;(4)進(jìn)入幀循環(huán)階段,讀共享內(nèi)存,存儲(chǔ)、顯示仿真過(guò)程的有關(guān)數(shù)據(jù);(5)設(shè)置“結(jié)束仿真”命令;(6)仿真結(jié)束,存儲(chǔ)數(shù)據(jù),調(diào)用RtUnmapSharedMemory()函數(shù)釋放共享內(nèi)存。
以某型導(dǎo)彈的飛行彈道實(shí)時(shí)仿真為例,編制基于RTX實(shí)時(shí)環(huán)境的導(dǎo)彈仿真程序,驗(yàn)證上述方法的可行性。具體步驟是:(1)用Simulink對(duì)導(dǎo)彈飛行彈道進(jìn)行圖形模塊化仿真建模;(2)用RTW工具生成C語(yǔ)言程序代碼;(3)編寫S-回調(diào)函數(shù);(4)對(duì)C語(yǔ)言程序代碼進(jìn)行實(shí)時(shí)性改造,并移植到RTX實(shí)時(shí)環(huán)境中;(5)在程序中增加幀周期測(cè)量代碼;(6)在RTX實(shí)時(shí)環(huán)境下運(yùn)行并分析運(yùn)行結(jié)果。采用的軟件版本為Matlab 7.0/Simulink4.0。
基于Matlab/Simulink的導(dǎo)彈質(zhì)心動(dòng)力學(xué)仿真模型見(jiàn)圖6所示,導(dǎo)彈繞質(zhì)心轉(zhuǎn)動(dòng)力學(xué)仿真模型見(jiàn)圖7所示,為了縮短文章篇幅,本文省略了導(dǎo)彈質(zhì)心運(yùn)動(dòng)學(xué)仿真模型、導(dǎo)彈繞質(zhì)心轉(zhuǎn)動(dòng)的運(yùn)動(dòng)學(xué)仿真模型、幾何關(guān)系方程仿真模型、導(dǎo)彈空氣動(dòng)力學(xué)仿真模塊。將上述各個(gè)子模塊按輸入/輸出信號(hào)的對(duì)應(yīng)關(guān)系連接起來(lái),構(gòu)成導(dǎo)彈飛行彈道方程總的仿真模型,見(jiàn)圖8所示。
打開(kāi)Matlab的 “Configuration Parameters”屬性頁(yè),將“Real-Time Workshop”選項(xiàng)卡中的“RTW system target file”設(shè)置成“grt.tlc”,點(diǎn)擊“Build”按鈕,則開(kāi)始生成導(dǎo)彈飛行仿真模型的C語(yǔ)言程序代碼,并編寫S-回調(diào)函數(shù)。
按照本文3.2、3.3、3.4部分介紹的方法,對(duì)代碼進(jìn)行實(shí)時(shí)性改造和移植。本實(shí)例Win32程序采用的是MFC類型的應(yīng)用程序,在其中定義共享內(nèi)存數(shù)據(jù)結(jié)構(gòu)。Win32工程和RTSS工程編譯連接后,分別生成RTmain.exe和RTX.rtss文件。將RTX.rtss拷貝到RTmain.exe所在的目錄,執(zhí)行RTmain.exe程序,即可載入并運(yùn)行仿真程序。
RTmain.exe程序的運(yùn)行結(jié)果見(jiàn)圖9和圖10。圖9左右側(cè)圖形分別是該程序運(yùn)行后得到的“V-t”和“y-t”曲線,圖10左右側(cè)圖形分別是單幀運(yùn)行時(shí)間和幀周期圖線。從程序運(yùn)行結(jié)果可見(jiàn):(1)對(duì)于導(dǎo)彈飛行彈道的解算,實(shí)時(shí)仿真程序的單幀運(yùn)行時(shí)間僅30 μs左右,運(yùn)行速度非???,說(shuō)明實(shí)時(shí)仿真程序的代碼質(zhì)量較高;(2)幀周期時(shí)間非常準(zhǔn)確,通常情況下偏差在0.2 μs以內(nèi);(3)用其他進(jìn)程進(jìn)行抗干擾測(cè)試,例如在運(yùn)行仿真程序的同時(shí)還播放視頻,仿真幀周期也很穩(wěn)定,統(tǒng)計(jì)的最大偏差為0.7 μs。
使用Matlab/Simulink/RTW軟件工具進(jìn)行圖形模塊化設(shè)計(jì)仿真模型,并將圖形模塊化仿真模型轉(zhuǎn)換成C語(yǔ)言程序代碼,對(duì)其進(jìn)行實(shí)時(shí)性改造和移植,獲得在Windows+RTX實(shí)時(shí)環(huán)境下運(yùn)行的仿真程序。通過(guò)研究得出以下結(jié)論:
1) Simulink圖形模塊化建模功能簡(jiǎn)化了編程過(guò)程,提高了仿真建模、校模、驗(yàn)?zāi)5男屎唾|(zhì)量,便于開(kāi)發(fā)復(fù)雜系統(tǒng)的實(shí)時(shí)仿真程序;
2) 對(duì)圖形模塊化仿真模型轉(zhuǎn)換成C語(yǔ)言程序代碼,并對(duì)C語(yǔ)言程序代碼進(jìn)行實(shí)時(shí)性改造和移植后,仿真程序可以在RTSS中實(shí)時(shí)、穩(wěn)定、可靠運(yùn)行;
3) 由Win32程序監(jiān)控仿真過(guò)程,不參與實(shí)時(shí)仿真計(jì)算,與實(shí)時(shí)仿真程序RTSS之間分工明確,數(shù)據(jù)耦合簡(jiǎn)單,保證了RTSS中仿真模型可靠、實(shí)時(shí)運(yùn)行,且抗干擾能力強(qiáng)。