杨 维,石德乾,赵 凯,胡江峰
(西北机电工程研究所,陕西 咸阳 712099 )
火控软件是自行高炮武器系统的重要组成部分,为了进行火控软件功能、性能的调试和系统控制流程的验证,需要研制相应的调试软件。Windows系统利用普通PC机为硬件平台,软件开发手段比较丰富、通用性较强,但实时性较差[1],RTX是美国Ardence公司推出解决Windows2000(XP)强实时性的扩展模块,它不对Windows 2000(XP)系统进行任何封装或修改,通过在硬件抽象层增加实时扩展来实现基于优先级的抢占式实时任务的管理和调度,不仅可获得很好的实时特性,又可完全利用Windows 2000(XP)平台的优点。笔者利用RTX实时扩展系统[2-4]来解决Windows XP系统在开发火控控制平台软件中实时性不足这一难题,将强实时性的外同步中断服务、定时器中断服务、CAN总线数据接收、发送等工作在RTSS进程中;将实时性不强的参数设置、图形显示等工作在Win32进程中,开发出一种基于Windows XP+RTX为软件平台的火控调试平台软件[5],很好地实现了火控软件的功能和性能调试。同时,基于Windows XP+RTX的软件开发手段可进一步应用于自行高炮CAN总线的研究。
软件体系结构如图1所示。
软件分为实时进程和非实时进程,两大进程之间通过高速IPC通信和同步机制,实现数据交换。实时进程由RTX实现,主要完成同步时统信号接收、CAN总线数据的接收/发送、时标处理;非实时进程由Windows实现,主要完成CAN总线数据的处理、图形显示及参数输入功能。
采用Visual C++ 6.0和RTX SDK为开发工具,首先建立一个MFC AppWizard工程来作为Win32进程环境,然后建立一个RTX AppWizard工程来作为RTSS进程环境,在Win32工程下利用RtCreateProcess()进行调用RTSS进程编译生成的.rtss文件,此时完成两个进程的建立,进程间采用共享内存机制进行通信。
非实时部分包括主流程、参数设置界面、火控数据显示界面和与RTX进程通信的接收线程。其中参数设置界面主要用于进行航路目标参数设置,传感器属性设置及装定数据设置;火控数据显示界面实现火控计算机解算的方位角、高低角和弹丸飞行时间显示,每100 ms刷新一次。
非实时部分程序主流程如图2所示。
非实时部分程序主要用于创建与RTX进程通信的接收线程、发送共享内存、发送事件,向RTX进程发送航路数据、系统控制指令、火控控制指令和装定数据。
接收线程首先创建一个共享内存用于和RTX进程进行数据交换,接着创建一个事件对象用于和RTX进程进行同步,然后等待RTX进程发来的接收事件,如果事件到来把共享内存中的数据保存用于火控数据显示。其程序代码如下:
UINT recvDataTask(LPVOID pParam)
{
HANDLE hRecvEvent;
HANDLE hRecvShm;
PRECVMSG pRecvData;
hRecvShm=RtCreateSharedMemory(PAGE_READWRITE,0,sizeof(SERVODATA),RECV_SHM, (void**)&pRecvData);//创建共享内存
if (hRecvShm == NULL)
AfxMessageBox("Create Recv Shared Memory Failed! ");
hRecvEvent = RtCreateEvent(NULL, FALSE, FALSE, "RecvEvent");// 创建接收同步事件
if (hRecvEvent == NULL)
AfxMessageBox("Create Recv Event Failed! ");
for (;;)
{
RtWaitForSingleObject(hRecvEvent,INFINITE);//等待RTX进程发送接收事件
if (pRecvData->type == 0)
{
AddServoPoint(pRecvData->servo);
}
else if (pRecvData->type == 1)
{
AddLaserPoint(pRecvData->laser);
}
}
}
实时部分包括主进程、定时器中断服务程序、外同步中断服务程序、CAN接收、发送线程。
主进程完成定时器创建及定时中断服务程序挂接、CAN发送事件的创建、外同步中断服务程序挂接、CAN初始化、创建CAN发送线程和创建CAN接收线程等。程序流程如图3所示。
定时器中断服务程序每0.5 ms执行一次,实现定时计数器加一。如果定时计数器的值等于CAN发送线程设置的发送时刻,则发出一个CAN发送事件。如果定时计数器的值等于39(定时达到20 ms),停止定时计数。其程序代码如下:
void RTFCNDCL TimerHandler(PVOID context)
{
timerCount++;//定时计数器加1
if (sendFlag != -1 && timerCount == sendFlag)
{
RtSetEvent(hCanSendEvent);//启动CAN总线发送事件
}
if (timerCount == 39)
{
RtCancelTimer(hTimer, NULL);//停止计数
}
}
外同步中断服务程序每20 ms执行一次,设置定时器分辨率为0.5 ms,然后启动定时器。如果此时仿真已经开始,则同步计数器加一,此计数器在CAN接收线程中用于确定数据达到的时刻。其程序代码如下:
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++;//同步计数器加1
}
}
CAN接收线程用于从CAN总线上接收火控计算机解算结果,包括随动主令数据和弹丸飞行时间数据。将接收到的总线数据写入接收共享内存,同时向非实时部分发送接收事件通知从共享内存中提取数据。程序流程如图4所示。
CAN发送线程用于向CAN总线发送各种数据。程序流程如图5所示。
搭建半实物分布式仿真平台,仿真平台的节点包括跟踪雷达模拟装置、光电模拟装置、激光模拟装置、导航姿态模拟装置、同步时统装置、火控调试控制台、火控计算机等,节点之间的电气接口和CAN总线数据协议与实际装备一致。其中,同步时统装置和火控计算机与实装产品一致,同步时统装置用于提供20 ms同步信号。各个模拟装置接收到火控调试控制台发送的参数和控制指令后,按照20 ms固定时序和总线数据协议向火控计算机发送数据。图6为参数设置和系统控制界面。图7为火控数据显示界面。
笔者开发了一种基于WindowXP+RTX平台的火控调试软件,研究了软件总体结构、Win32下非实时部分的软件和RTX下实时部分的软件设计流程及其代码实现方法,整个软件采用了模块化设计,模块间通过数据接口通信,可以很方便地增加功能模块。针对自行高炮“时间同步+CAN”的总线结构,在RTSS子进程中采用外同步中断方式完成了总线时间基准的统一,避免了总线仲裁,保证了数据传输的实时性。通过构建半实物仿真系统,进行了火控软件功能调试、性能调试和系统控制流程的验证。同时,为自行高炮CAN总线的进一步研究提供了基础。
[1] William,Tom.Tools add fault tolerance,scalability to real-time Windows NT[J]. Electronic Design,1997,45(21):100.
[2] 时未东,杜承烈,宋翠叶.Windows实时扩展技术研究[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 数控软件关键技术研究[J]. 制造技术与机床,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实时环境1553B总线驱动设计与实现[J]. 测控技术,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)