楊 維,石德乾,趙 凱,胡江峰
(西北機電工程研究所,陜西 咸陽 712099 )
火控軟件是自行高炮武器系統(tǒng)的重要組成部分,為了進行火控軟件功能、性能的調(diào)試和系統(tǒng)控制流程的驗證,需要研制相應(yīng)的調(diào)試軟件。Windows系統(tǒng)利用普通PC機為硬件平臺,軟件開發(fā)手段比較豐富、通用性較強,但實時性較差[1],RTX是美國Ardence公司推出解決Windows2000(XP)強實時性的擴展模塊,它不對Windows 2000(XP)系統(tǒng)進行任何封裝或修改,通過在硬件抽象層增加實時擴展來實現(xiàn)基于優(yōu)先級的搶占式實時任務(wù)的管理和調(diào)度,不僅可獲得很好的實時特性,又可完全利用Windows 2000(XP)平臺的優(yōu)點。筆者利用RTX實時擴展系統(tǒng)[2-4]來解決Windows XP系統(tǒng)在開發(fā)火控控制平臺軟件中實時性不足這一難題,將強實時性的外同步中斷服務(wù)、定時器中斷服務(wù)、CAN總線數(shù)據(jù)接收、發(fā)送等工作在RTSS進程中;將實時性不強的參數(shù)設(shè)置、圖形顯示等工作在Win32進程中,開發(fā)出一種基于Windows XP+RTX為軟件平臺的火控調(diào)試平臺軟件[5],很好地實現(xiàn)了火控軟件的功能和性能調(diào)試。同時,基于Windows XP+RTX的軟件開發(fā)手段可進一步應(yīng)用于自行高炮CAN總線的研究。
軟件體系結(jié)構(gòu)如圖1所示。
軟件分為實時進程和非實時進程,兩大進程之間通過高速IPC通信和同步機制,實現(xiàn)數(shù)據(jù)交換。實時進程由RTX實現(xiàn),主要完成同步時統(tǒng)信號接收、CAN總線數(shù)據(jù)的接收/發(fā)送、時標處理;非實時進程由Windows實現(xiàn),主要完成CAN總線數(shù)據(jù)的處理、圖形顯示及參數(shù)輸入功能。
采用Visual C++ 6.0和RTX SDK為開發(fā)工具,首先建立一個MFC AppWizard工程來作為Win32進程環(huán)境,然后建立一個RTX AppWizard工程來作為RTSS進程環(huán)境,在Win32工程下利用RtCreateProcess()進行調(diào)用RTSS進程編譯生成的.rtss文件,此時完成兩個進程的建立,進程間采用共享內(nèi)存機制進行通信。
非實時部分包括主流程、參數(shù)設(shè)置界面、火控數(shù)據(jù)顯示界面和與RTX進程通信的接收線程。其中參數(shù)設(shè)置界面主要用于進行航路目標參數(shù)設(shè)置,傳感器屬性設(shè)置及裝定數(shù)據(jù)設(shè)置;火控數(shù)據(jù)顯示界面實現(xiàn)火控計算機解算的方位角、高低角和彈丸飛行時間顯示,每100 ms刷新一次。
非實時部分程序主流程如圖2所示。
非實時部分程序主要用于創(chuàng)建與RTX進程通信的接收線程、發(fā)送共享內(nèi)存、發(fā)送事件,向RTX進程發(fā)送航路數(shù)據(jù)、系統(tǒng)控制指令、火控控制指令和裝定數(shù)據(jù)。
接收線程首先創(chuàng)建一個共享內(nèi)存用于和RTX進程進行數(shù)據(jù)交換,接著創(chuàng)建一個事件對象用于和RTX進程進行同步,然后等待RTX進程發(fā)來的接收事件,如果事件到來把共享內(nèi)存中的數(shù)據(jù)保存用于火控數(shù)據(jù)顯示。其程序代碼如下:
UINT recvDataTask(LPVOID pParam)
{
HANDLE hRecvEvent;
HANDLE hRecvShm;
PRECVMSG pRecvData;
hRecvShm=RtCreateSharedMemory(PAGE_READWRITE,0,sizeof(SERVODATA),RECV_SHM, (void**)&pRecvData);//創(chuàng)建共享內(nèi)存
if (hRecvShm == NULL)
AfxMessageBox("Create Recv Shared Memory Failed! ");
hRecvEvent = RtCreateEvent(NULL, FALSE, FALSE, "RecvEvent");// 創(chuàng)建接收同步事件
if (hRecvEvent == NULL)
AfxMessageBox("Create Recv Event Failed! ");
for (;;)
{
RtWaitForSingleObject(hRecvEvent,INFINITE);//等待RTX進程發(fā)送接收事件
if (pRecvData->type == 0)
{
AddServoPoint(pRecvData->servo);
}
else if (pRecvData->type == 1)
{
AddLaserPoint(pRecvData->laser);
}
}
}
實時部分包括主進程、定時器中斷服務(wù)程序、外同步中斷服務(wù)程序、CAN接收、發(fā)送線程。
主進程完成定時器創(chuàng)建及定時中斷服務(wù)程序掛接、CAN發(fā)送事件的創(chuàng)建、外同步中斷服務(wù)程序掛接、CAN初始化、創(chuàng)建CAN發(fā)送線程和創(chuàng)建CAN接收線程等。程序流程如圖3所示。
定時器中斷服務(wù)程序每0.5 ms執(zhí)行一次,實現(xiàn)定時計數(shù)器加一。如果定時計數(shù)器的值等于CAN發(fā)送線程設(shè)置的發(fā)送時刻,則發(fā)出一個CAN發(fā)送事件。如果定時計數(shù)器的值等于39(定時達到20 ms),停止定時計數(shù)。其程序代碼如下:
void RTFCNDCL TimerHandler(PVOID context)
{
timerCount++;//定時計數(shù)器加1
if (sendFlag != -1 && timerCount == sendFlag)
{
RtSetEvent(hCanSendEvent);//啟動CAN總線發(fā)送事件
}
if (timerCount == 39)
{
RtCancelTimer(hTimer, NULL);//停止計數(shù)
}
}
外同步中斷服務(wù)程序每20 ms執(zhí)行一次,設(shè)置定時器分辨率為0.5 ms,然后啟動定時器。如果此時仿真已經(jīng)開始,則同步計數(shù)器加一,此計數(shù)器在CAN接收線程中用于確定數(shù)據(jù)達到的時刻。其程序代碼如下:
void RTFCNDCL SyncInterruptHandler(void * nContext)
{
LARGE_INTEGER liPeriod; //定時器周期
liPeriod.QuadPart = 5000; /*0.5ms*/
timerCount = -1;
if(!RtSetTimerRelative(hTimer,&liPeriod, &liPeriod))
{
RtPrintf("RtSetTimerRelative error = %d ",GetLastError());
ExitProcess(1);
}
if (simulationbegin == 1) //仿真開始標志
{
SyncNum++;//同步計數(shù)器加1
}
}
CAN接收線程用于從CAN總線上接收火控計算機解算結(jié)果,包括隨動主令數(shù)據(jù)和彈丸飛行時間數(shù)據(jù)。將接收到的總線數(shù)據(jù)寫入接收共享內(nèi)存,同時向非實時部分發(fā)送接收事件通知從共享內(nèi)存中提取數(shù)據(jù)。程序流程如圖4所示。
CAN發(fā)送線程用于向CAN總線發(fā)送各種數(shù)據(jù)。程序流程如圖5所示。
搭建半實物分布式仿真平臺,仿真平臺的節(jié)點包括跟蹤雷達模擬裝置、光電模擬裝置、激光模擬裝置、導航姿態(tài)模擬裝置、同步時統(tǒng)裝置、火控調(diào)試控制臺、火控計算機等,節(jié)點之間的電氣接口和CAN總線數(shù)據(jù)協(xié)議與實際裝備一致。其中,同步時統(tǒng)裝置和火控計算機與實裝產(chǎn)品一致,同步時統(tǒng)裝置用于提供20 ms同步信號。各個模擬裝置接收到火控調(diào)試控制臺發(fā)送的參數(shù)和控制指令后,按照20 ms固定時序和總線數(shù)據(jù)協(xié)議向火控計算機發(fā)送數(shù)據(jù)。圖6為參數(shù)設(shè)置和系統(tǒng)控制界面。圖7為火控數(shù)據(jù)顯示界面。
筆者開發(fā)了一種基于WindowXP+RTX平臺的火控調(diào)試軟件,研究了軟件總體結(jié)構(gòu)、Win32下非實時部分的軟件和RTX下實時部分的軟件設(shè)計流程及其代碼實現(xiàn)方法,整個軟件采用了模塊化設(shè)計,模塊間通過數(shù)據(jù)接口通信,可以很方便地增加功能模塊。針對自行高炮“時間同步+CAN”的總線結(jié)構(gòu),在RTSS子進程中采用外同步中斷方式完成了總線時間基準的統(tǒng)一,避免了總線仲裁,保證了數(shù)據(jù)傳輸?shù)膶崟r性。通過構(gòu)建半實物仿真系統(tǒng),進行了火控軟件功能調(diào)試、性能調(diào)試和系統(tǒng)控制流程的驗證。同時,為自行高炮CAN總線的進一步研究提供了基礎(chǔ)。
[1] William,Tom.Tools add fault tolerance,scalability to real-time Windows NT[J]. Electronic Design,1997,45(21):100.
[2] 時未東,杜承烈,宋翠葉.Windows實時擴展技術(shù)研究[J].計算機工程,2011,37(23):63.
SHI Wei-dong,DU Cheng-lie,SONG Cui-ye. Research on Windows real-time extension technology[J].Computer Engineering,2011,37(23):63.(in Chinese)
[3] McHale,John. Verturcom releases enhanced Windows NT real-time kernel[J]. Military&Aerospace Electronics,1999,10(7):4.
[4] 楊銅,鄭魁敬. 基于Windows XP+RTX 的 PC 數(shù)控軟件關(guān)鍵技術(shù)研究[J]. 制造技術(shù)與機床,2011,12(1):68.
YANG Tong, ZHENG Kui-jing. Research on key technology of PC-NC software based on Windows XP+RTX[J]. Manufacturing Technology & Machine Tool, 2011,12(1):68.(in Chinese)
[5] 劉江,高潔,翟亞東.基于RTX實時環(huán)境1553B總線驅(qū)動設(shè)計與實現(xiàn)[J]. 測控技術(shù),2011,30(6):77.
LIU Jiang,GAO Jie,ZHAI Ya-dong. Design and implement of 1553B bus driver based on RTX[J].Measurement & Control Technology, 2011,30(6):77.(in Chinese)