付 瑋,王婧宇,吳中華
(西北工業(yè)大學(xué) 陜西 西安 710129)
控制系統(tǒng)的穩(wěn)定性、可靠性是系統(tǒng)能否安全運(yùn)行的基本前提。隨著當(dāng)今先進(jìn)控制技術(shù)的不斷更新與發(fā)展,控制系統(tǒng)變得越來越復(fù)雜,控制系統(tǒng)的仿真也提出了更高的要求,不僅要求計(jì)算機(jī)操作系統(tǒng)具有強(qiáng)大的通用功能,還要求其具有優(yōu)秀的實(shí)時(shí)性。
因此,本文提出一種基于RTX+Matlab+LabWindows/CVI的仿真平臺(tái)架構(gòu)。對(duì)某汽車行駛控制系統(tǒng)進(jìn)行了實(shí)時(shí)仿真。建立仿真模型后,通過自主研發(fā)Real-Time Work Shop內(nèi)相關(guān)編聯(lián)文件與目標(biāo)語(yǔ)言文件,可將simulink仿真模型轉(zhuǎn)換成可移植的RTX代碼,該程序具有高實(shí)時(shí)性,可達(dá)到預(yù)期實(shí)時(shí)要求。數(shù)據(jù)顯示等非實(shí)時(shí)任務(wù)由Win32進(jìn)程完成,該程序由LabWindows/CVI編寫,在RTSS進(jìn)程和Win32進(jìn)程間建立IPC通信和同步機(jī)制,以實(shí)現(xiàn)兩者之間的數(shù)據(jù)交換、互斥與同步。
RTX采用HAL擴(kuò)展技術(shù)為Windows操作系統(tǒng)安裝實(shí)時(shí)子系統(tǒng)RTSS。為了保證RTSS線程的實(shí)時(shí)性,RTX增加了在Windows和RTX線程間的中斷隔離,當(dāng)RTSS線程運(yùn)行時(shí),屏蔽所有Windows控制中斷。RTSS有其獨(dú)立的進(jìn)程線程管理、進(jìn)程間通訊、中斷、時(shí)鐘、I/O管理機(jī)制。具有128個(gè)優(yōu)先級(jí),對(duì)應(yīng)Win32的32個(gè)線程優(yōu)先級(jí)[1]。
RTSS的線程優(yōu)先于所有Windows線程,提供了對(duì)IRQ、I/O、內(nèi)存的精準(zhǔn)控制,能確保實(shí)時(shí)任務(wù)的可靠執(zhí)行。通過高速的IPC通信和同步機(jī)制,RTX進(jìn)程可方便地實(shí)現(xiàn)與Windows應(yīng)用程序之間的數(shù)據(jù)交換[1]。RTX只需安裝在Windows系統(tǒng)下,減少了仿真成本,而且RTX和Windows系統(tǒng)采用進(jìn)程間通信,大大提高了實(shí)時(shí)通信的穩(wěn)定性。
同時(shí)RTX擁有3個(gè)精度達(dá)1 ms的時(shí)鐘,最小定時(shí)周期可分別達(dá)到100、200、500 ms。事件的精確執(zhí)行在實(shí)時(shí)系統(tǒng)中是相當(dāng)嚴(yán)格的。RTX內(nèi)核利用搶占式調(diào)度方式,在保證臨界線程的上下文切換的同時(shí)還確保線程切換時(shí)間保持在500 ns到2μs范圍內(nèi)。
RTX的內(nèi)存分配都在非分頁(yè)內(nèi)存池內(nèi),以保證其進(jìn)程在運(yùn)行過程中不會(huì)被置換出內(nèi)存,從而確保了對(duì)外部事件響應(yīng)的確定性,避免了使用虛擬內(nèi)存因缺頁(yè)產(chǎn)生的延遲。RTSS運(yùn)行時(shí)只占用250 kB的內(nèi)存,內(nèi)存占用率極低[1]。同時(shí),RTX對(duì)Windows系統(tǒng)在Ring 0級(jí)進(jìn)行了穩(wěn)定的、高性能的實(shí)時(shí)擴(kuò)展,同時(shí)支持30 kHz持續(xù)穩(wěn)定的中斷觸發(fā)。實(shí)時(shí)進(jìn)程運(yùn)行時(shí),屏蔽一切Windows中斷和錯(cuò)誤報(bào)告,由此去掉了由線程切換、中斷調(diào)度而產(chǎn)生的延遲[1]。
表1 RTX與WIN32的優(yōu)先級(jí)對(duì)照Tab.1 Comparison of the priority between RTX and WIN32
圖1 RTX體系結(jié)構(gòu)Fig.1 Configuration of RTX system
RTW(Real-Time Workshop)是MathWorks公司提供的基于MATLAB和Simulink的一種工具,它能直接從Simulink的模型中產(chǎn)生針對(duì)應(yīng)用優(yōu)化的、可移植的代碼,并根據(jù)目標(biāo)配置自動(dòng)生成多種環(huán)境下的程序[2,6,11]。該生成過程包含如下4個(gè)步驟:
1)創(chuàng)建、分析Simulink模型并對(duì)模型描述文件進(jìn)行編譯。
2)通過目標(biāo)語(yǔ)言編譯器TLC轉(zhuǎn)換模型并生成代碼。
3)程序聯(lián)編文件(makeflie)的生成。
4)在自定義程序創(chuàng)建文件的控制下,由聯(lián)編實(shí)用程序生成可執(zhí)行程序。
由于RTW暫時(shí)還沒有支持RTX的目標(biāo)語(yǔ)言文件與相關(guān)編聯(lián)文件,所以該功能需根據(jù)此流程自行編寫。
圖2 RTW生成C代碼流程圖Fig.2 Ccode generation process in RTW
通過編寫相關(guān)的model.tlc與model.tmf文件,配置相關(guān)參數(shù),生成針對(duì)RTX相應(yīng)的實(shí)時(shí)性代碼。其中,model.tlc文件存儲(chǔ)simulink的相關(guān)配置信息與目標(biāo)語(yǔ)言信息等參數(shù),model.tmf則為生成文件model.mk的模板,RTW根據(jù)要求對(duì)model.tmf中的參數(shù)進(jìn)行設(shè)置,最終生成model.mk與model.mak文件[9]。其中model.mak文件為makefile制作文件,可在VC6.0中直接打開并轉(zhuǎn)換成.dsp工程文件。
創(chuàng)建rtx.tmf文件,編寫代碼,包括 MAKECMD=nmake,HOST=PC,BUILD=yes,SYS_TARGET_FILE=rtx.tlc 等。 同時(shí),創(chuàng)建編寫相應(yīng)rtx.tlc文件,部分注釋及代碼如下:
%%SYSTLC:Generic Real-Time Target
%% TMF:rtx_default_tmf MAKE:make_rtw EXTMODE:ext_comm
%%SYSTLC:Create Visual C/C++Solution File for the"rtx"target
%% TMF:rtx.tmf MAKE:make_rtw EXTMODE:ext_comm
%%$RCSfile:rtx.tlc,v$
...
rtwoptions (9).makevariable ='TMW_EXTMODE_TESTING';
rtwoptions(9).tooltip= ['Internal testing flag for Simulink external mode'];
使用LabWindows/CVI構(gòu)架平臺(tái),它是National Instruments公司推出的交互式C語(yǔ)言開發(fā)平臺(tái)。他的集成化開發(fā)環(huán)境、交互式編程方法、函數(shù)面板和豐富的庫(kù)函數(shù)大大增加了語(yǔ)言的功能,為熟悉C語(yǔ)言的開發(fā)人員提供了一個(gè)理想的軟件開發(fā)平臺(tái)[7-8]。
該平臺(tái)系統(tǒng)在LabWindows/CVI環(huán)境下運(yùn)行,應(yīng)用控件包括NUMERIC控件,COMMAND BUTTON控件,LED控件,AsyncTimer異步時(shí)鐘控件,STRIPCHART控件等。
該平臺(tái)使用多媒體定時(shí)器實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)采集與顯示,它使用自己?jiǎn)为?dú)的線程來調(diào)用一個(gè)回調(diào)函數(shù),并且該線程優(yōu)先級(jí)高,每隔一定時(shí)間就發(fā)送一個(gè)消息而不管其它消息是否已執(zhí)行完,采用多媒體定時(shí)器可以達(dá)到1ms的最小時(shí)間精度[2,10,3]。所以,利用多媒體定時(shí)器產(chǎn)生定時(shí)中斷來顯示數(shù)據(jù)完全滿足仿真系統(tǒng)的實(shí)時(shí)性要求。定時(shí)器中段代碼如下:
int CVICALLBACK TIME(int panel,int control,int event,void
*callbackData,int eventData1, int eventData2)
{
if(pdata->endflag==0)
{SetCtrlVal(panelHandle,PANEL_NUMERIC1,pdata->Out);PlotStripChart(panelHandle,PANEL_STRIPCHART,&(pdata->Out),1,0,0,VAL_DOUBLE)
;
number++;
SetCtrlVal(panelHandle,PANEL_NUMERIC1_2,number);}
else SetAsyncTimerAttribute (timerhandle,ASYNC_ATTR_ENABLED,0);
return 0;}
仿真數(shù)據(jù)采集和顯示平臺(tái)如圖3所示。
圖3 仿真數(shù)據(jù)采集和顯示平臺(tái)Fig.3 Data collection and manifestation platform
通過編寫相關(guān)文件后,可通過RTW直接生成高實(shí)時(shí)性的RTSS代碼,該代碼中使用RtCreateTimer()函數(shù)創(chuàng)建定時(shí)器,使用RtSetTimerRelative()函數(shù)設(shè)置定時(shí)器的時(shí)間相關(guān)參數(shù),精度可以達(dá)到0.1微秒(1×10-7s)。將任務(wù)放在定時(shí)器中斷函數(shù)中即可實(shí)現(xiàn)仿真的每一幀的高精度時(shí)間控制。大致程序如下:
RtCreateTimer(…,TimerHander,…);//創(chuàng)建時(shí)鐘
RtSetTimerRelative(…,FrameTime,…);//設(shè)置時(shí)鐘參數(shù)
Void RTFCNDCL TimerHandler(PVOID context)//定時(shí)中斷函數(shù)
{
rt_OneStep(S);
pdata->Out=rtY.Out1;
}
RTSS支持IPC對(duì)象,這使得實(shí)時(shí)程序與非實(shí)時(shí)程序之間的通訊和同步成為可能[1]。RTSS與WIN32進(jìn)程通信可使用共享內(nèi)存(Shared Memory Object)、信號(hào)量(Semaphore Object)、事件(Event Objects)和互斥(Mutex Objects)。與Win32下IPC不同的是RTSS的IPC對(duì)象都分配在不分頁(yè)內(nèi)存池,而且支持等待的優(yōu)先級(jí)。當(dāng)有多個(gè)不同優(yōu)先級(jí)的RTSS線程在等待,系統(tǒng)可以保證按照線程優(yōu)先級(jí)的高低來獲取資源[1]。仿真流程圖如圖4所示。
圖4 仿真流程圖Fig.4 Process diagram of simulation
通過創(chuàng)建相應(yīng)結(jié)構(gòu)體,放入共享內(nèi)存中可進(jìn)行RTSS與WIN32進(jìn)程通信[4]。該結(jié)構(gòu)體包含了所有需要在WIN32進(jìn)程中顯示的數(shù)據(jù)與信號(hào)量,結(jié)構(gòu)體部分信息如下:
typedef struct
{
double Out;
int endflag;
...
double Gain;
double time;
}*PDATA;
RTX提供了特有的API函數(shù)RtCreateSharedMemory()和RtOpenSharedMemory()來創(chuàng)建和打開共享內(nèi)存與Win32進(jìn)程進(jìn)行數(shù)據(jù)交互[5]。本仿真程序通過在Win32進(jìn)程中創(chuàng)建共享內(nèi)存并且在RTSS進(jìn)程中打開共享內(nèi)存進(jìn)行數(shù)據(jù)交互。并且通過 RtCreateEvent()與 RtWaitForSingleObject()進(jìn)行 Win32進(jìn)程與RTSS進(jìn)程之間相互通信。
首先搭建某汽車行駛控制系統(tǒng)仿真模型,如圖5所示。
由于已經(jīng)編寫過相關(guān)的制作文件和目標(biāo)語(yǔ)言文件,所以可通過RTW直接生成針對(duì)RTX的實(shí)時(shí)代碼。配置相關(guān)參數(shù)后,生成代碼。產(chǎn)生vehicle_control.rtss文件用于實(shí)時(shí)仿真系統(tǒng)。
首先打開仿真數(shù)據(jù)采集和顯示平臺(tái),進(jìn)行與RTSS進(jìn)程的鏈接,通過共享內(nèi)存與RTSS通信。若連接成功,則可設(shè)置仿真時(shí)間與增益等相關(guān)參數(shù)。仿真步長(zhǎng)設(shè)置為0.02 s,仿真時(shí)間設(shè)置為20 s。
圖5 汽車行駛控制仿真模型Fig.5 Simulation model of vehicle control
圖6 仿真結(jié)果顯示Fig.6 Manifestation of simulation result
仿真結(jié)果表明,該真系統(tǒng)具有相對(duì)較高的實(shí)時(shí)性,充分滿足了該汽車行駛控制系統(tǒng)仿真的實(shí)時(shí)性要求。與在WIN32環(huán)境下進(jìn)行的Simulink仿真結(jié)果對(duì)比后可得出,該實(shí)時(shí)仿真平臺(tái)能精確地實(shí)時(shí)顯示仿真數(shù)據(jù),有效的避免了因Simulink運(yùn)行在Windows中的低實(shí)時(shí)性。對(duì)于一般實(shí)時(shí)仿真系統(tǒng)來說,該系統(tǒng)可以非常好的滿足實(shí)時(shí)性要求。
[1]張福凱.基于RTX的無人機(jī)飛行控制系統(tǒng)實(shí)時(shí)仿真[D].西安:西北工業(yè)大學(xué),2013.
[2]郭朕凱,盧京潮.RTW在某型直升機(jī)飛控系統(tǒng)半物理仿真中的應(yīng)用[J].火力與指揮控制,2009,34(12):160-165.GUO Zhen-kai,LU Jing-chao.Application of RTW in a helicopter flight control system hardware-in-the-loop simulation[J].Fire Control&Command Control,2009,34(12):160-165.
[3]于強(qiáng),何寧,李亮,等.Windows下基于LabWindows/CVI 8.0的實(shí)時(shí)數(shù)據(jù)采集[J].工業(yè)控制計(jì)算機(jī),2009,22(10):66-67.YU Qiang,HE Ning,LI Liang,et al.Real-time data acquisition based on Labwindows/CVI 8.0 under Windows[J].Industrial Control Computer,2009,22(10):66-67.
[4]陳向群,馬洪兵.現(xiàn)代操作系統(tǒng)[M].第3版.北京:機(jī)械工業(yè)出版社,2009.
[5]楊建和.基于LabWindows/CVI數(shù)據(jù)采集系統(tǒng)的設(shè)計(jì)[D].北京:北京郵電大學(xué),2012.
[6]陳永春.從Matlab/Simulink模型到代碼實(shí)現(xiàn)[M].1版.北京:清華大學(xué)出版社,2002.
[7]史君成,張淑偉,律淑珍.LabWindows虛擬儀器設(shè)計(jì)[M].北京:國(guó)防工業(yè)出版社,2007.
[8]孫曉云.基于LabWindows/CVI的虛擬儀器設(shè)計(jì)與應(yīng)用[M].第2版.北京:電子工業(yè)出版社,2010.
[9]鄭智琴.Simulink電子通信仿真與應(yīng)用[M].1版.北京:國(guó)防工業(yè)出版社,2002.
[10]王曉東,尚耀星,吳帥.基于LabWindows/CVI和RTX的實(shí)時(shí)測(cè)控軟件設(shè)計(jì)[J].科技信息,2008(19):397-398.WANG Xiao-dong,SHANG Yao-xing,WU Shuai.Design of real-time control software with LabWindows/CVI and RTX[J].Science Technology Information,2008(19):397-398.
[11]賈秋玲,袁冬莉,欒云鳳.基于MATLAB7.x/Simulink/stateflow系統(tǒng)仿真、分析及設(shè)計(jì)[M].1版.西安:西北工業(yè)大學(xué)出版社,2006.