您的位置:首页 > 其它

基于EVC开发的PDA在水情视频监测中的应用

2010-03-24 15:11 302 查看

基于EVC开发的PDA在水情视频监测中的应用

周 海
(国网电力科学研究院,南京 210003)
摘 要 介绍了基于EVC的PDA工具软件FCS300MM的开发,阐述其实现视频控制的工作方法和图像显示功能,以及它在水情测报系统视频监测中的具体工程应用。
关键字 PDA;EVC;视频监测;ACS300-MM数据采集器;FCS300MM

1 引言

随着水情测报技术的深入发展,人们不仅仅满足于水情数据信息的实时采集,更直观、更明确的视频图像信息的采用,为水情预报和水调自动化决策提供可靠准确的信息。作为同源技术的应用,水情测报技术逐步在气象环境监测、水库水质监测、电网防灾等领域得到广泛应用,水库蓝藻污染、电力线覆冰、闸门状态等不适于传感器进行实时监控的要素,通过采用视频技术,能很好地解决这个问题。水情测报站一般都位于野外环境比较恶劣的地点,对视频系统的安装调试带来很大困难,采用PDA进行系统的调试,将会给工程人员带来极大的方便。本文将介绍在水情测报系统中,基于EVC开发的PDA视频调试工具软件在工程中的应用。
水情遥测站的安装环境比较恶劣,对于视频系统的调试显得更为困难,工程人员安装完测站后,对视频监测的实际效果无法得知,需联系中心站人员进行电话问询,不能直观地判断安装调试结果,给现场的调试带来很大困难。
PDA以小巧、便携的特点,对于工程人员具有熟悉的Window风格的WinCE操作系统,配以串口的PDA能方便的与数据采集器进行数据通信链接。基于EVC3.0开发的PDA视频工具软件,可以通过友好的界面操作,实现对系统视频的控制,下发视频拍摄命令,由数据采集系统完成实时图片的拍摄后,将在PDA上显示图片,工程人员可以根据图片的拍摄效果,对视频系统的安装位置和角度进行调整,已达到最佳的视频效果。
本课题采用南瑞集团自主研发的ACS300-MM数据采集器和FCS300MM工具软件,选用HP1590 PDA 来实现视频监测器XXXX的安装调试。

2 工程应用方法

在遥测站系统的设备均已安装完成后对系统所有设备和连线进行检查,进行上电基本功能测试和具体的参数设置。
启用FCS300-MM工具软件,根据所选视频摄像头的实际参数和现场拍摄的具体要求,选择视频拍摄图像的分辨率进行该项参数的设置。
进入视频图像控制界面后,进行下载视频监视画面操作,PDA将向ACS300-MM数据采集器下发视频拍摄命令,采集器得到命令后将先通知PDA进行图像下载等待,然后去进行视频拍摄的控制,ACS300-MM完成拍摄任务后,将图像JPG数据文件下载到PDA,此时界面将显示图像下载的进度,下载完成后,FCS300-MM将在PDA上自动显示拍摄画面,并在PDA上自动保存当前图片。
由于所选拍摄图像的分辨率的不同,拍摄到的图片尺寸有大有小,而PDA的屏幕尺寸与PC机相比较有其局限性,FCS300-MM在图像显示上做了必要的处理,使得显示的画面等比例进行缩放,以最大化在PDA屏幕上显示。
工程人员根据PDA显示的当前拍摄画面,可以对视频摄像头的安装情况做出迅速的判断,进行必要的位置调整和角度修正,然后继续视频操作控制,直至达到满意的视频效果,至此即可进行安装定型加固施工。
视频图像的拍摄和图像上传中心站时间,是通过ACS300-MM数据采集器的视频定时间隔参数设置来规定的,在FCS300-MM中具有远程发送视频画面的功能,只要启用该功能,ACS300-MM将立即进行视频拍摄和图像远程传输命令,而无需等待视频定时间隔时间,大大节省了现场工程人员的施工时间。

3 软件实现方法

PDA是通过RS232串口与ACS300-MM进行数据通信链接的,在PDA上运行FCS300-MM工具软件,来实现水情测报系统视频监测的安装调试。
本课题采用Windows CE下软件开发工具eMbedded Visual C++3.0(EVC)进行软件开发,EVC与Visual C++6.0具有很大相似之处,但在串口通信、线程处理上均有差异,且EVC只支持部分Win32API,这将对编程带来一定的困难,笔者为此编写了部分函数以实现API的功能。FCS300-MM视频控制流程如图1所示。



图1 视频控制软件流程

3.1 串口通信的建立

应用软件先对串口通信进行初始化,在EVC中建立串口链接方法如下:
CreateFile(TEXT("COM1:"),GENERIC_READ | GENERIC_WRITE,0,
NULL,OPEN_EXISTING,0,NULL );
参数中串口号必须写成TEXT("COM1:"),因EVC不支持重叠I/O模式,所以参数dwFlagsAdnAtrributes必须设置为NULL,共享参数设置为NULL,这是与VC有重要区别的。
对读写超时处理进行设置:
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout =
0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant =
5000;
SetCommTimeouts( m_hIDComDev,
&CommTimeOuts );
对DCB进行初始化的设置:
dcb.DCBlength = sizeof( DCB );
GetCommState( m_hIDComDev,&dcb );
dcb.BaudRate = nBaud;
dcb.ByteSize = 8;
dcb.StopBits=ONESTOPBIT;
dcb.Parity=NOPARITY;
dcb.fOutxCtsFlow=FALSE;
dcb.fOutxDsrFlow=FALSE;

3.2 视频控制

由FCS300-MM向数据采集器ACS300-MM发起视频GETVIDEO拍摄命令,ACS300-MM将响应该命令,并立即返回带有延迟时间的回执,告知PDA当前正在进行视频拍摄,需等待若干秒,它完成拍摄后将发出结束等待命令。此间PDA根据延时规定的时间进行等待。
ACS300-MM完成拍摄后将回应ACK给PDA,此时即可进行图像的下载流程,因JPG图像文件较大,下载将进行多包的数据传送,下载由PDA发起,每接收完一包数据后,将按包序号顺序进行下一包数据的发送请求,直至数据全部下载完成。
视频控制的功能主要由串口的读写编程实现,由以下方法实现的简单描述:
1)串口数据发送
串口的发送比较简单,实现方法如下:
int CSerial::SendData( const char *buffer,int size )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
DWORD dwBytesWritten = 0;
int i;
for( i=0; i<size; i++ )
{
WriteCommByte( buffer[i] );
dwBytesWritten++;
}
return( (int) dwBytesWritten );
}
BOOL CSerial::WriteCommByte( unsigned char ucByte )
{
BOOL bWriteStat;
DWORD dwBytesWritten;
bWriteStat = WriteFile( m_hIDComDev,(LPSTR) &ucByte,1,&dwBytesWritten,NULL);
if(!bWriteStat)
{
return(FALSE);
}
return( TRUE );
}
2)串口数据接收
串口数据的接收采用查询的方式实现:
先进行串口的数据查询:
int CSerial::ReadDataWaiting( void )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev,&dwErrorFlags,&ComStat );
return( (int) ComStat.cbInQue );
}
串口数据到达后,进行提取数据的操作:
int CSerial::ReadData( void *buffer,int limit )
{
if( !m_bOpened || m_hIDComDev == NULL ) return(0);
BOOL bReadStatus;
DWORD dwBytesRead,dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev,&dwErrorFlags,&ComStat );
if( !ComStat.cbInQue ) return( 0 );
dwBytesRead = (DWORD) ComStat.cbInQue;
if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;
bReadStatus = ReadFile( m_hIDComDev,buffer,dwBytesRead,&dwBytesRead,NULL);
if( !bReadStatus )
{
return( 0 );
}
return( (int) dwBytesRead );
}
然后根据通信协议进行数据的分析。

3.3 视频图像显示

PDA将视频拍摄的JPG文件完全下载后,将以当前操作的时间(年、月、日、时、分,如200807081030.JPG,即2008年7月8日10时30分拍摄的图像)为文件名保存,并即刻自动显示图像。
因视频摄像头的图像分辨率可以设置,所以拍摄的图片尺寸大小也有不同。在图像显示时,在EVC编程中,笔者采用图像等比例缩放的方法,将拍摄的图像,无论尺寸大小,均以PDA屏幕的最大化显示,具体实现详见如下代码中的注释。
void CPhotoShow::OnPaint()
{
CPaintDC dc(this);
CDC *pDC=GetDC();
//获取PDA屏幕界面客户区可显尺寸
CRect rect;
GetClientRect(rect);
int w=rect.Width();
int h=rect.Height();
dc.SetBkMode( TRANSPARENT );
CBitmap mBitmap;
// photofilename为图像存储路径文件名,注意EVC中的文件路径为绝对路径。
mBitmap.Attach( SHLoadImageFile(photofilename) );
BITMAP mInfo;
mBitmap.GetBitmap( &mInfo );
CDC mPicDC;
mPicDC.CreateCompatibleDC( &dc );
CBitmap* pOldBitmap = mPicDC.SelectObject( &mBitmap );
//获取源图像的尺寸大小
int bw=mInfo.bmWidth;
int bh=mInfo.bmHeight;
int cx,cy;//图像显示的左上角坐标
int sx,sy;//图像显示的右下角坐标
//显示图像的等比例缩放
if(w>bw && h>bh)//源图像的宽、高尺寸均小于目标显示区域尺寸
{
cx=(w-bw)/2;cy=(h-bh)/2;//源图像在目标显示区域居中显示
sx=bw;sy=bh;
}
else//源图像尺寸不完全位于目标显示区域
{
//计算源图像与目标区域的对应宽度和高度的比例,根据比例关系,若宽度比例大
//于高度比例,则以宽度的压缩比例为图像显示基准,将目标区域的宽度设为显示
//图像的宽度,而高度则根据比例进行计算设置;反之则反。
int kx=bw/w;
int ky=bh/h;
if(kx>ky)
{
cx=0;cy=(h-bh*w/bw)/2;
sx=w;sy=bh*w/bw;
}
else
{
cx=(w-bw*h/bh)/2;cy=0;
sx=bw*h/bh;sy=h;
}
}
//根据计算的等比例缩放关系,设置对应坐标,进行图像显示
dc.StretchBlt(cx,cy,sx,sy,&mPicDC,0,0,mInfo.bmWidth,mInfo.bmHeight,SRCCOPY);
mPicDC.SelectObject( pOldBitmap );
mBitmap.DeleteObject();

4 结语

南瑞集团的水情测报系统的视频监测技术,已经在防治太湖蓝藻污染工程中得到使用,PDA工具软件FCS300MM的运行,为现场的视频安装调试提供了极大的帮助。工程技术人员根据它提供的现场视频画面,及时调整修正视频设备安装位置和角度,确保工程的顺利完成。本文涉及的基于EVC开发的PDA软件,在水情测报系统视频监测中的成功使用,必将在电力线覆冰、闸门状态控制等领域得到推广应用,希望能为国内同行提供一些借鉴。

参考文献

[1]微软公式.WindowsCE通信指南[M].北京:希望出版社,1999
[2]NickGrattan.MarshallBrain.WindowsCE3.0 ApplicationProgramming.Prentice HallPTR,2000
[3]李现勇.Visual C++串口通信技术与工程实践.北京:人民邮电出版社,2002
[4]官章全.Visual C++6.0类库大全.北京:电子工业出版社,1999
[5]汪兵.EVC高级编程及其应用开发.北京:中国水利水电出版社,2005
收稿日期:7月11日 修改日期:8月5日
作者简介:周海(1975-),男,硕士,工程师,长期从事水情测报系统的研究工作,专业方向为嵌入式软件、气象环境监测系统等的研究与开发。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: