低空飞艇地面监控系统设计与实现
2011-09-11侯中峰谢利理
茹 芬,侯中峰,谢利理
(西北工业大学自动化学院,西安 710129)
1 引言
现代飞艇多利用氦气产生升力来进行浮空飞行,其优良的性价比及高可靠性,近年来已经成为国际上的研究热点,我国也正在积极研制数十万立方的平流层飞艇。作为其研究的一部分,低空实验飞艇(在500米以下飞行)是未来研制平流层飞艇的重要准备。随着高度的增加,大气压力的变化,为了保持良好的浮空姿态,飞艇会有比较复杂的自身压力调节。以某低空实验飞艇项目为背景,设计并实现了其地面监控系统软件。
2 低空飞艇地面监控系统概述
飞艇一般由艇上飞行控制系统、通讯导航系统、任务载荷系统、能源动力系统、气压调节系统、应急降落系统及地而监控系统等部分组成,可以在预定空域巡航飞行来完成空中巡查、航空拍摄、环境监测、通讯中继、广告宣传等任务。艇载计算机是艇上部分的核心,负责完成控制处理和数据通信等任务。而地面监控系统以地面计算机为核心,其作用是实时监测并记录飞艇的飞行状态、环境信息及任务设备数据,及时准确地向飞艇下达控制指令等。地面操作人员既可以通过操纵杆手动遥控飞艇飞行,也可以通过地面监控软件界面发出控制指令控制飞艇飞行[1]。整个飞艇控制系统的基本组成部分如图1所示。
3 地面监控软件设计
考虑到飞艇地面监控软件开发的效率及友好、美观的人机交互界面,软件的设计以美国NI(National Instruments)公司的虚拟仪器开发工具LabWindows/CVI[2]为平台。软件设计主要解决四个问题:①地面计算机与艇上计算机之间的实时数据交换;②操纵杆对飞艇飞行姿态的远程控制;③设计地面监控数据库,对艇上计算机下传数据进行存储、查询及过程回放等;④友好的人机交互接口。由于LabWindows/CVI集成了众多优秀的虚拟仪器控件,给软件的界面设计带来了极大的方便。当LabWindows/CVI提供的标准虚拟仪器控件不能满足需要时,可以使用VC++等其他工具开发专用的ActiveX控件,然后在实际工程中加载调用。
图1 低空飞艇控制系统组成图
3.1 底层通信程序设计
在飞艇执行飞行任务的过程中,需要与地面进行大量实时的数据交换。这些数据包括地面上传控制指令、艇上下传各种状态参数和任务设备采集的数据等。稳定可靠的通讯是飞艇安全正常飞行的重要保证。选用全双工数字电台,可以实现30~50公里范围内的点对多点通信,通讯距离长;全双工数字电台具备先进的扩频跳频技术,抗干扰能力强,稳定可靠,提供最大115.2Kbps的 RS232串口传输速率。
地面监控计算机与数字电台通过RS232串口进行通信。LabWindows/CVI提供了RS232通信函数库,使原本较为复杂的RS232通信变得容易实现。这些函数可分为打开/关闭串口函数、串口设置函数、I/O读写函数、调制解调器控制函数、寄存器状态函数和回调函数等6类。
由于LabWindows/CVI并不提供串口中断处理函数,LabWindows/CVI中串口通信是通过周期查询方式实现的。可以设置一个定时器,定期执行读取串口的程序,也可以设置一个死循环,通过延迟设置循环周期,这样必须在循环内部定义一个能够及时响应用户面板回调函数和系统内部事件的函数。串口编程需要以下几个函数:
OpenCom(COM1);//打开串口1
OpenComConfig(COM1,"COM1",9600,2,8,1,512,512);//配置串口 COM1
ComRdByte(COM1);//读串口1数据
ComRd(COM1,Inbuf,100);//从串口1 的缓冲区Inbuf中读取100个字节的数据
ComWrtByte(COM1);//向串口1写数据
ComWrt(COM1,Outbuf,100);//向串口 1 的缓冲区Outbuf中写入100个字节的数据
CloseCom(COM1);//关闭串口1
3.2 操纵杆驱动程序设计
飞艇的地面遥控采用性能优越的USB接口操纵杆SAITEK X52,利用操纵杆上的摇杆、方向舵及按钮,用以实现飞艇的俯仰、偏航等姿态的调节,对油门和各种风机的开关直接控制。在LabWindows/CVI环境下,利用微软提供的 DirectX与Windows API函数相结合,通过设置定时器,利用消息传递方式来捕获操纵杆的信息。在MMSYSTEM.H对所需的Windows API函数进行函数声明,应用程序必须包含该头文件。
程序首先需要检查操纵杆是否存在,包括检查驱动程序支持和确认操纵杆已与系统相连等两项工作。调用joyGetNumDevs函数检查系统是否配置了操纵端口和驱动程序。如果返回值为0,表明系统不支持操纵杆功能。但joyGetNumDevs并不能确定操纵杆是否已被连接上了,通过调用joyGetPosEx函数可以完成检查是否连接上操纵杆,同时确定是否有错误发生。一旦确认了操纵杆已连上,就可以接收操纵杆发来的消息。joySetCapture通知Windows操纵杆消息应发往何处以及发送的频率等。joySet-Capture中的第一个参数通知Windows谁将获取消息,第二个参数确定程序将从哪个操纵杆接收消息,第三个参数表示希望以怎样的频度接收消息(单位为毫秒),无论操纵杆是否移动都将以这个频度接收消息。joySetCapture的四个参数允许程序当操纵杆移动一定的距离后才接收消息,该距离由joySetThreshold设置。
joySetCapture被调用后,窗口将接收操纵杆事件。MM_JOY1MOVE事件在joySetCapture定义的时间间隔内发生。只有当操纵杆的按钮被按下时,MM_JOY1BUTTONUP和MM_JOY1BUTTONDOWN事件才发生。调用joyReleaseCapture通知Windows已结束对操纵杆的调用。部分程序段如下:
/*hwnd-接收消息的窗口句柄,uMsg-消息(命令),wParam和lParam是要传递的数据*/
LRESULT NewWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
JOYINFOEX JoyInfoEx;//包含操纵杆各种属性的结构体
unsigned int uJoyID;//操纵杆编号
switch(uMsg)
{
case MM_JOY1MOVE:
JoyInfoEx.dwFlags=JOY_CAL_READ3;
JoyInfoEx.dwSize=sizeof(JoyInfoEx);
JoyGetPosEx(uJoyID,&JoyInfoEx);
break;
case MM_JOY1BUTTONDOWN:
JoyInfoEx.dwFlags=
JOY_RETURNBUTTONS;
JoyInfoEx.dwSize=sizeof(JoyInfoEx);
JoyGetPosEx(uJoyID,&JoyInfoEx);
if(JoyInfoEx.dwButtons& JOY_BUTTON1)MessagePopup("ok","按钮1按下");
break;
}
return CallWindowProc(oldWndProc, hwnd,uMsg,wParam,lParam);
}
3.3 飞艇实时数据库的设计及实现
LabWindows/CVI既没有通过标准函数库来提供对数据库进行访问操作的函数,也没有在工具包中包含数据库引擎。要在LabWindows/CVI环境下使用数据库,必须安装 CVI SQL工具包[3-4]。该工具包中一共包含了11个子类的函数库,这些API(Application Programming Interface)使LabWindows/CVI编写的上层应用程序可以实现对数据库的访问。虽然LabWindows/CVI中通过Microsoft的ADO(Active Data Object,动态数据对象)接口可以支持多种类型的数据源,但最常用的还是ODBC(Open Database Connectivity,开放数据库互连)数据源。ODBC实际上是一个函数库,它提供了一个连接到底层数据库系统的公共应用程序接口,通过驱动程序与底层数据库进行通信。在开发数据库应用程序时,只需要为应用程序指定一个数据源,将数据源文件配置成已创建好的数据库文件(包括已经创建好的数据表等),即可以在 LabWindows/CVI中利用SQL语句访问由第三方工具开发的数据库。
3.3.1 数据库的连接与断开
使用DBConnect打开一个新数据连接,其唯一的参数是必须包含数据源或数据提供者名以及其他数据库需要的属性(User ID、Password、File Name等)的字符串。使用完毕调用DBDisconnect关闭连接。
int hdbc=0;//数据库连接句柄
hdbc=DBConnect("DSN=DB_Airship");//连接到数据源DB_Airship
DBDisconnect(hdbc);//断开数据库连接
3.3.2 自动 SQL映射
使用SQL库映射函数自动产生和执行SQL语句。通过调用DBBeginMap定义一个映射,其唯一的参数是来自DBConnect的连接句柄,而返回值作为映射的句柄。
int hmap=DBBeginMap(hdbc);//定义SQL连接句柄
/* 将字段映射到数组或变量*/
DBMapColumnToChar(hmap,1,11,uutNum,&uutStat,"");
DBMapColumnToDouble(hmap,2, &meas1,&meas1Stat);
DBMapColumnToDouble(hmap,3, &meas2,&meas2Stat);
DBActivateMap(hmap,"Table1");//程序映射所有的列后激活映射
DBDeactivateMap(hmap);//结束激活映射
3.3.3 数据库操作
显式SQL语句的执行如下:
hstmt=DBActivateSQL(hdbc,"SELECT UUT_NUM,MEAS1,MEAS2 FROM TESTRES WHERE MEAS2 >1.0");
除了SELECT外的大多数SQL语句不需要进一步的处理,可以使用DBImmediateSQL。
插入数据:
DBImmediateSQL(hdbc,"INSERT INTO Table1 VALUES('2860B456',0.4,0.6)");
更新数据:
DBActivateSQL(hdbc,"UPDATE Table1 SET MEAS2=500.0 WHERE UUT_NUM= '2860B456'");
删除数据:
DBImmediateSQL (hdbc,"DELETE FROM Table1 WHERE UUT_NUM= '2860B567 '");
3.3.4 取回结果
采用NUMERIC控件和STRING控件来显示数据,部分程序段如下:
while(DBFetchNext(hstmt)==DB_SUCCESS){
SetCtrlVal(panelHandle,PANEL_uutNum,uut-Num);
SetCtrlVal(panelHandle, PANEL_meas1,meas1);
SetCtrlVal(panelHandle, PANEL_meas2,meas2);}
4 结束语
地面监控系统是飞艇控制系统重要的组成部分。完整地给出了在LabWindows/CVI环境下地面监控系统基本功能的设计与实现方法,完成了底层通信程序的设计,并通过调用Windows API函数实现了对操纵杆的编程,最后详细给出了在LabWindows/CVI环境下数据库的开发过程。地面监控软件经过运行表明该系统运行稳定,功能完备实用,开发周期短,成本低,维护方便,具有较高的工程应用价值。
[1]于歌,刘刚,房建成.小型无人机地面监控系统软件设计与实现[J].机械与电子,2007(7):24-26.
[2]NI.LabWindows/CVI User Manual[M].National instruments corporation,2002.
[3]NI.LabWindows/CVI SQL Toolkit Reference Manual[M].National instruments corporation,2002.
[4]高水德,辛喆,水林娜.基于LabWindows/CVI的发动机试验数据库的设计与实现[J].微计算机信息(测控自动化),2004,20(4):33-34.