基于windows的数据采集与实时显示系统的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Windows的数据采集与实时显示系统的
设计与实现
李贵明 罗家融 喻文勇
(中国科学院等离子体物理研究所 安徽合肥 230031 lgm@)
摘要数据采集与实时显示系统相结合,能够使实验人员在实验进行地过程中迅速了解设备的运行状况,从而及时做出判断和决策,对于实验的顺利进行具有重大意义。
本文以HT-7超导托卡马克聚变实验中的数据采集与实时显示系统在windows下的开发过程为例,详细介绍了在Windows系统下,数据采集与实时显示系统的组成、硬件结构和软件设计,具有广泛的适用意义。
关键词 HT-7 Windows 数据采集 实时显示
引言
基于PC硬件平台的数据采集技术近年来得到迅猛发展和广泛应用。
而将数据采集得到的数据以图形方式实时提供给科研人员,能够使实验人员迅速了解实验过程中设备的运行状况,从而及时做出判断和决策,对于实验的顺利进行具有重大意义。
HT-7是我国第一个超导托卡马克核聚变装置,中科院等离子体物理研究所已在该装置上进行了多次实验,获得了大量宝贵的实验数据和资料以及多项核聚变物理实验领域里的重大成果。
随着实验的不断深入,其稳定的放电时间已达60秒左右,这对于实验数据采集系统就提出了更高的要求。
其中的一个迫切要求就是在实验过程中(60秒以内),能实时显示当前一些重要的物理信号波形。
在PC操作系统中,Windows2000具有完善的内存管理机制和网络功能,支持多CPU以及基于Win32 API的编程接口。
本文以此为背景,设计了基于Windows的数据采集与实时显示系统。
系统设计与实现
1、系统设计方案
数据采集和实时显示系统,就是要在数据采集进行的过程中,将采集得到的数据及时反映到人机界面中,比如显示器或者绘图仪等。
有些系统还需要在实时显示前,首先对数据进行一些简单的处理。
从而使科研人员得到更直观、更清晰的数据,以利于进一步的处理。
在数据采集和实时显示系统中,将包括数据采集设备如数据采集卡,不过需要注意的是,在采集设备工作的过程中,我们必须可以随时从采集设备获取采集得到的数据,而不是必须等待采集设备本次工作完全结束,才可以对数据进行处理,那样我们将无法实现实时功能。
同时系统还要包括数据处理设备如计算机,以及数据显示设备如显示器、打印机等。
以我们的系统为例,我们采用的采集卡是研华公司的一块ISA总线的数据采集卡PCL1800,其最高采样率可达330KHz以及12位的转换精度。
其中最重要的一个特点是采集卡上有一个1K字的FIFO高速缓存(先进先出),可以在任何时刻方便地从FIFO中读取数据,从而可以实现实时显示信号波形的目的,我们采用的显示设备是具有VGA接口的大屏幕显示器。
数据采集和实时显示系统总体结构如图1所示,系统在长时间数据采集(如60秒)过程中,每经过一段时间(如1秒)的数据采集,系统就对这段时间内得到的数据进行相应的处理,在显示设备上,按照时间轴和幅值坐标的对应关系,实时绘制出这段时间内的信号波形,这样在数据采集完全结束后,我们便可以在显示设备上得到完整的信号波形。
系统采用了多线程技术以及消息传递的机制,实现了数据采集和图形显示的实时功能。
图1 数据采集和实时显示系统总体结构
1.1、系统硬件结构
数据采集需要对各种实验现场信号做出响应,最基本的是同步触发信号,用于通知采集系统何时进行数据采集。
还有一些是各种实验所独有的信号,比如各种异常信号以及时序信号等,在HT-7的数据采集和实时显示系统中,我们需要对三个信号进行响应,分别是:采集触发信号、放电中断信号(实验过程异常中止信号)和负30秒倒计时信号(时序信号,用于通知各系统实验将在30秒后开始,从而做各自的准备工作)。
由于采集卡本身只提供一个触发信号输入端口,我们就利用了其16位数字量信号输入I/O端口,将三个信号分别接到其低三位上,通过软件巡检的方式来检测各I/O口通道信号的高、低电平变化,分别做出相应的处理。
我们将三个外部触发信号接在数字量输入接口的低三位,对于各种信号组合,以及实验过程中的情况,可以分为如表1所示的四种情况。
-30秒信号触发信号中断信号相应处理
开始倒数计时
1 0 0
开始数据采集
1 1 0
实验中断处理
0 0 1
无任何信号,继续循检
0 0 0
表1 触发信号及其相应处理
PCL1800系列采集卡在板卡上有基地址(BASEPORT)选择跳线,我们可以很方便地进行选择(不能和系统已经使用的地址冲突),采集卡占用了基地址以后的连续32个I/O地址,除了BASEPORT+0(A/D转化数据)以及BASEPORT+26是16-bit(双字节)以外,其余地址都是8-bit(单字节)的。
1.2、系统软件设计
虽然Windows系统不是实时操作系统,但是它的多任务(多线程)机制允许我们在时间要求不很严格的条件下,实现实时系统的某些功能,比如其低精度定时器在秒量级是相对精确的。
同时在程序中充分利用Windows系统的多任务机制,使用多线程的编程方法,来实现数据采集和实时显示的“同步”进行。
另外,在Windows2000系统中,由于安全方面的原因,我们不能以通常的读写端口的方式(inport和outport等)来对系统或其它设备的端口直接进行读写操作,必须写设备驱动程序,才能进行相应的端口操作。
对于我们所采用的数据采集卡来说,我们只需要对其端口进行读写就可以方便的控制其进行数据采集。
因此,在我们的系统中,首先需要解决的就是实现该采集卡在Windows2000系统下的驱动和控制。
2、采集卡驱动的实现
为了解决在Windows2000系统下对PCL1800采集卡的端口读写功能,我们利用了一个可以直接对Windows9x/NT/2000/XP下直接存取I/O端口和物理存储器地址的函数库WinIO,它可以用于VC、VB以及C++Builder中。
这个函数库可以从Internet上方便地获得,它通过使用一个内核模式的设备驱动程序和一些低级编程技术绕过了Windows的保护机制来实现端口操作,同时对于WindowsNT/2000/XP系统,它可以在非管理员帐户下使用。
WinIO库提供了几个主要的函数来对IO端口进行读写操作,在Visual C++中,调用过程如下:
/*初始化WinIO*/
bool _stdcall InitializeWinIo();
/*读端口*/
bool _stdcall GetPortVal(WORD wPortAddr,PDWORD pdwPortVal,BYTE bSize);
/* wPortAddr 为端口地址;pdwPortVal为存放读入数据的指针;bSize为读入的字节数*/
/*写端口*/
bool _stdcall SetPortVal(WORD wPortAddr,DWORD dwPortVal,BYTE bSize);
/* wPortAddr 为端口地址;dwPortVal;dwPortVal为写入端口的数据;bSize为写入的字节数*/
/*清除WinIO环境*/
bool _stdcall ShutdownWinIo();
利用以上四个主要的函数,就可以实现PCL1800采集卡在Windows2000下的数据采集。
3、系统软件流程
数据采集和实时显示系统需要对数据采集和数据实时处理分别进行控制和操作,在系统软件设计过程中,必须使系统各部分协调工作,从而保证各部分的实时性和准确性,避免出现数据采集和实时显示之间互相影响,导致程序异常。
同时还要注意内存的使用和释放,避免出现内存泄漏等问题,保证程序运行的稳定性和可靠性。
HT-7装置的数据采集和实时显示系统软件主要包括三个部分:采集卡初始化和参数设置、触发等信号响应以及信号实时显示。
图2是系统软件的流程图。
图2 HT-7数据采集和实时显示系统软件流程图
程序启动以后,首先通过SOCKET通讯向服务器请求各种初始化数据,然后对采集卡进行初始化,采集卡初始化完成以后,启动采集线程,等待各种控制信号,在采集线程内做出相应地处理,由于我们选取的采集卡上有1K字的FIFO,在不同时取数的情况下,可以存储1024次采集所得到的数据,我们通过监测FIFO的状态,在其半满(HALF FULL)时,就启动一个线程,及时取出这512个数据进行处理,根据显示器象素和采样频率之间的对应关系,抽取和绘出相应的数据点。
这样,在采集结束以后,我们就在显示器上绘出了本次采集完整的信号波形。
在实验间歇的时间内,我们可以对数据进行进一步的处理,如滤波、去零漂以及截取某部分的信号进行二次重绘,为科研人员提供更为详细和直观的实验信息。
4、软件设计关键技术
由于Windows系统不是真正意义上的实时操作系统,我们不能保证其完全实时性,所以在软件设计过程中,需要注意以下问题:
及时从采集设备取出缓存中的数据,避免因不能及时取出数据而引起数据丢失 为了实现实时处理和显示,我们必须能够控制数据采集设备在任何时刻转换的数据,特别是由于采集设备本身的高速缓存都是有限的,如何在允许的时间范围内及时取出这些数据,从而避免出现数据丢失的发生,就成为程序设计重需要考虑的比较重要的问题,这可以通过降低采样率或选择带有较大缓存的采集设备来解决。
线程调用过程中,需要注意线程同步、内存管理(资源共享)等问题 线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等。
一个进程内的所有线程使用同一个地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。
线程有优先级别,优先权较低的线程必须等到优先权较高的线程执行完后再执行。
在多处理器的机器上,调度程序可将多个线程放到不同的处理器上去运行,这样可使处理器任务平衡,并提高系统的运行效率。
在线程体内,如果该线程完全独立,与其他线程没有数据存取等资源操作上的冲突,则可按照通常单线程的方法进行编程。
但是,在多线程处理时情况常常不是这样,线程之间经常要同时访问一些资源。
由于对共享资源进行访问引起冲突是不可避免的,为了解决这种线程同步问题,Win32 API提供了多种同步控制对象来帮助程序员解决共享资源访问冲突。
这些同步控制对象主要包括:
a:互斥体(Mutex)对象
互斥体对象适合用来协调多个线程对共享资源的互斥访问
b:信号(Semaphore)对象
信号对象允许同时对多个线程共享资源进行访问,在创建对象时指定最大可同时访问的线程数。
当一个线程申请访问成功后,信号对象中的计数器减一,调用
ReleaseSemaphore函数后,信号对象中的计数器加一
c:事件(Event)对象
事件对象是最简单的同步对象,它包括有信号和无信号两种状态。
在线程访问某一资源之前,需要等待某一事件的发生,这时用事件对象最合适。
d:排斥区(Critical Section)对象
使用排斥区的方法则使同步管理的效率更高。
多线程编程在Win32方式下和MFC类库支持下的原理是一致的,进程的主线程在任何需要的时候都可以创建新的线程。
当线程执行完后,自动终止线程; 当进程结束后,所有的线程都终止。
所有活动的线程共享进程的资源,因此,在编程时需要考虑在多个线程访问同一资源时产生冲突的问题。
当一个线程正在访问某进程对象,而另一个线程要改变该对象,就可能会产生错误的结果,编程时要解决这个冲突。
Windows定时器的精度问题
在一些应用中,我们需要实现程序定时响应某些事件,可以通过两种方式分别实现低精读定时器和高精度定时器。
在Windows中,可以通过调用SetTimer()函数为应用程序分配一个计时器。
当指定了一个时间间隔以后,Windows系统将每隔指定的时间向应用发送一条WM_TIMER消息,从而使应用程序能够实现定时处理。
然而,Windows提供的定时器是建立在DOS的1CH中断基础上的。
该中断每秒钟发生18.2次,即时间间隔为54.945ms。
也就是说,这种方式的定时器只能精确到大约55毫秒,对于55毫秒以下的时间精度便无能为力。
需要指出的是,由系统发给应用程序的WM_TIMER消息并不是异步的,这条消息被放在常规的消息队列中,并与其它消息一起排序。
因此,即使我们在调用SetTimer()时设定了1000毫秒的时间间隔,应用程序却不一定保证每隔一秒钟接受到一条WM_TIMER消息,如果另一个程序的忙碌时间超过一秒钟,那么我们的应用程序在那段时间内就不能接收到任何WM_TIMER消息。
通过这种方式实现的定时器只能满足对于时间要求不很严格的应用需要。
如果要实现高精度的定时器,就必须采用其它的编程方法。
Windows下有一套多媒体编程接口,这套接口函数包含于mmsystem.dll动态链接库中。
Visual C++提供了相应的头文件mmsystem.h。
在这个编程接口中,有一套定时器操作函数,可用来实现高精度的定时器,其计时精度可达1ms。
这套函数主要包括:
·timeBeginPeriod:建立应用程序使用的定时器分辨率;
·timeEndPeriod:清除前面timeBeginPeriod函数建立的定时器分辨率;
·timeSetEvent:产生一个在指定的时间或时间周期间隔内执行的定时器事件;
·timeKillEvent:删除前面timeSetEvent产生的定时器事件;
·timeGetDevCaps:返回关于定时器服务能力的信息。
这几个函数可以帮助我们获得精确计时器服务,即系统计时器。
这其中最重要的是timeSetEvent( )和timeKillEvent( ),这两个函数允许我们安装异步计时器的回调函数(CALLBACK),有些类似于在DOS环境中截取INT 8中断处理程序。
这个回调是真正异步的,完全避开了Windows的消息工具,因而具有重要意义。
利用这种定时器,我们就可以实现高精度的定时器。
在HT-7数据采集和实时显示系统中,我们的定时器只需要进行倒数计时,也就是说精度为1秒就完全可以满足我们的要求,所以我们采用了第一种Windows定时器方式。
结论
Windows系统应用于数据采集和实时显示具有极大的潜力,只要编程过程中注意到系统的局限性和一些不同于普通桌面应用的具体问题,就可以编制出高质量的数据采集和实时显示模块。
在HT-7超导托卡马克新一轮的物理实验中,我们开发的这套系统能够方便地根据实验情况,由实验人员控制各参数,进行数据采集和实时显示,特别是在稳态长脉冲实验中,系统能在第一时间为科研人员提供快速而直观的数据和信号波形,为HT-7实验的进一步开展提供了重要的参考。
参考文献
[1] Yuanxi Wan, HT-7 Team and HT-7U Team, “Overview of steady state operation of HT-7 and present
status of the HT-7U project” Nucl. Fusion 40 (2000) 1057.
[2] 谢向阳 “HT7-U采集和控制系统设计”中国科学院等离子体物理研究所博士研究生毕业论文
[3] J.R.Luo et al., “The distributed control and data system in HT-7 tokamak,” Proceeding of
the 12th IEEE real time congress on nuclear and plasma sciences, Valencia Spain 4-8 June 2001 p.299
[4] Microsoft Corporation, Technology Brief; Real Time Systems with microsoft WindowsNT
[A].Publication of the Microsoft Developer Network, microsoft Cor poration.1995.
[5] David J. Kruglinski著 潘爱民等译Visual C++技术内幕(第四版) 清华大学出版社 1999
The Design and Realization of Data Acquisition and Real-time Display
System Based on Windows
Li Guiming Luo Jiarong Yu Wenyong
(Institute of Plasma Physics, the Chinese Academy of Sciences P.O.Box 1126, Hefei 230031)Abstract: It’s possible for scientists to acquire the operation information of devices in experiments rapidly and make decision how to do in time when data acquisition system integrated with real-time display system.The integration of this two parts is very important for further experiments.In this paper,We will take the design of data acquisition and real-time display system based on windows operation system which works on HT-7 super-conduct Tokamak as a instance to introduce the composition of the system,the hardware structure and the design of software.This paper is widely applicable for many fields.
Key words:HT-7, Windows, Data Acquisition, Realtime Display
李贵明:男,1974年出生,中国科学院等离子体物理研究所在读博士研究生。
罗家融:男,1948年出生,中国科学院等离子体物理研究所博士生导师。
喻文勇:男,1978年出生,中国科学院等离子体物理研究所在读硕士研究生。