nbhkdz.com冰点文库

基于VC多线程的实时数据采集系统_图文

时间:2010-05-20

2008 年第 2 期,44~47

舰船防化
CHEMICAL DEFENCE ON SHIPS

No.2, 44~47

基于 VC 多线程的实时数据采集系统

孟昭荣,江立辉,胡兴伟,柳琪
(中国船舶重工集团公司第七一八研究所,河北 邯郸,056027)

摘 要:在工业数据采集和处理系统中如何提高实时性和通用性,是设计人员要着重考虑的问题。

本文着重介绍了在 Windows 环境下,利用 VC++多线程技术,进行实时数据采集的方法,成功地实现

了数据采集的准确性和实时性,并且整个系统运行良好。

关键词:实时;数据采集;多线程;同步;双缓冲

中图分类号:TP274.2

文献标识码:A

Real-time Data Acquisition System on the Basis of VC Multi-Thread

Meng Zhao-rong, Jiang Li-hui, Hu Xing-wei, Liu Qi
(The 718th Research Institute of CSIC, Handan 056027, China)
Abstract: How to improve the real-time character and commonability in data acquisition and the process system of the industry? It is the question that the designer should consider emphatically. The author introduces the method of utilizing muiti-thread technology of VC under the Windows, can improve systematic real-time character and commonability greatly and run well. Keywords: Real-time, Data Acquisition, Multi-Thread, Synchronization, Double-buffering

0 引言
随着操作系统技术的发展,先后出现了多道程 序设计、分时系统等许多技术,提高了系统运行的 效率。多线程技术的引入,不但可以挖掘潜在的 CPU 空闲时间,而且还可以提高应用程序反应的速度, 其优点在有多个任务需要完成和有巨大数据流量的 程序中反映的尤为突出[1]。
某装置测控系统采集的物理量有压力,温度, 流量等,需要测量的参数多,测量速度快,精确度 高。由于试验任务的要求,不仅需要实时连续,长 时间的数据采集,在采集的同时,还必须动态显示 信号波形;在试验过程中还需要实时监测一些关键 点,当有异常情况发生时能及时报警并做出相应的

处理。但是 Windows 并不是实时操作系统,因而在 其环境下开发实时测控系统需要采用一些技术。本 文介绍了在 Windows 环境下利用 VC++多线程技术, 结合工程实际,给出了一个实时性和通用性较强的 实时数据采集和处理系统。
1 实时数据采集系统
某装置试验的实时数据采集要求在长时间数据 采集过程中,每经过一个时间段的数据采集,系统 就对这段时间内得到的数据进行相应的处理,在显 示设备上按照时间轴和幅值坐标的对应关系,实时 绘制出这段时间内的信号波形,边采集边分析,便 于试验人员在试验过程中迅速了解设备的运行状 况,从而及时做出判断和决策,对于试验的顺利进

2008 年第 2 期

基于 VC 多线程的实时数据采集系统

· 45 ·

行具有重大意义。 本测试系统的采集卡选用台湾凌华公司的
cPCI 总线的 9116 多功能数据采集卡,其最高采样 速率可达 250kHz 以及 16 位的转换精度[2],其中最 重要的一个特点是采集卡上有一个 2K 的 FIFO(先 进先出)高速缓存,可以在任何时刻方便地从 FIFO 中读取数据,从而可以实现实时显示信号波形的目 的。对于实时数据采集系统来说,FIFO 的高速缓存 可以使系统在任何时刻得到需要的数据,是实时数 据采集系统中重要的一环。
在测试系统中采用循环缓冲技术中的双缓冲技 术(double-buffering)。双缓冲技术是把缓存区分成 相等的两部分,当程序读取缓存区一半数据的同时 另一半正在被新的数据填充,形成数据连续采集的 过程。在这种模式下,当 FIFO 半满时(half-full), 就会产生一个中断信号,然后由 ISR(Interrupt Service Routine)完成数据传输。FIFO 系统可以使 新数据顺次排列在缓存区中,不会覆盖以前的数据, 从而防止数据丢失。整个过程无需 CPU 干预,完全 由硬件完成,有效地提高了数据的传输速率[3]。
数据采集流程图如图 1 所示。
2 VC 的多线程技术
由于某装置测试系统的多任务特点,需实现数 据采集、实时控制,动态显示图形,数据存储和人 机交互功能,而且各任务的运行速度和时间精度要 求不同,采用多线程技术和消息传递的机制可有效 地同步完成不同的任务,不受单个任务运行速度慢 或时间长或出现异常而影响其他任务实时控制。多 线程的应用使程序的并行处理得以实现,多线程使 得不同的代码可以“同时”执行。当有多个任务需 要完成时,使用多线程的好处是显而易见的。
MFC 应用程序中的线程有两种类型:用户界面 线程(User Interface Thread)和工作者线程(Worker Thread)两大类。用户界面线程可以产生自己的窗 口并负责处理相关的窗口消息,拥有单独的消息队 列,能够对事件和用户输入做出响应。工作者线程

图 1 数据采集程序流程图[4] Fig. 1 Flowchart of data collecting program
适用于处理后台任务,而不影响用户对应用程序的 使用。工作者线程仅仅由一个函数体实现,其实现 简单,便于编程者控制,适用于一些费时的后台任 务处理[5]。
在多线程应用程序中,两个或更多的线程同时 访问同一数据会导致不可预知的结果,因此保持线 程间的同步是一个不可或缺的环节。使隶属于同一 进程的各线程协调一致的工作称为线程的同步。 MFC 提 供 了 四 种 同 步 方 法 : 临 界 区 ( Critical Section)、信号灯(Semapore)、互斥量(Mutex) 和事件(Event)[6]。
本测试系统使用了事件和互斥量两种同步机 制。事件是通过将自身设置为有信号或无信号来通

· 46 ·

舰船防化

2008 年第 2 期

知其它线程,与线程相配合能对消息做出较快反应, 适合于工控程序。互斥量适合用来协调多个线程对 共享资源的同步访问。
以下是在 VC++开发环境下利用多线程技术进 行监控线程即工作者线程的关键代码: //创建线程,初始化线程
m_pCheckThread = (CCheckThread*) AfxBeginThread(RUNTIME_CLASS(Ccheck
Thread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); //将对话框指针传给监控线程
m_pCheckThread->SetOwner(this); ///////监控工作线程
UINT CheckThread(LPVOID pParam) {
//获取主窗口指针 //以CMZRDlg对象指针为参数 CMZRDlg *pDlg=(CMZRDlg *)pParam; if(NULL == pParam) {
//如果参数为空,提示错误 AfxMessageBox("参数传递出错,线程终 止!", MB_OK|MB_ICONERROR); AfxEndThread(2); } pDlg->m_MutexJTstate.Lock();

态 pDlg->m_MutexJTstate.Unlock(); pDlg->m_MutexJTexit.Lock(); pDlg->m_bJTexit = false;
//监控工作线程的运行状态false:运行 true:退出 pDlg->m_MutexJTexit.Unlock(); exitOK = false;
do
{ //判断线程是否退出 pDlg->m_MutexJTexit.Lock(); exitOK = pDlg->m_bJTexit; pDlg->m_MutexJTexit.Unlock();
}while(exitOK == false); //pDlg->PostMessage(WM_QUIT, 0, 0); //向主对话框发送退出消息 pDlg->m_MutexJTstate.Lock();

pDlg->m_nJTstate = 3; 态

//监控工作线程的状

pDlg->m_MutexJTstate.Unlock();

return 0; } //监控工作线程结束
3 系统软件流程

pDlg->m_nJTstate = 1; //监控工作线程的状态 //0:没有启动1:进入线程2:开始工作3:正常退出
pDlg->m_MutexJTstate.Unlock();
pDlg->m_ListRecord.AddString("监控线程开始 执行");
bool exitOK;//用于退出监控线程 pDlg->m_MutexJTstate.Lock();
pDlg->m_nJTstate = 2; //监控工作线程的状

本测试系统设计中采用了人机交互线程、数据 采集与实时显示线程、数据处理线程和监控线程。 人机交互线程作为主线程,属于用户界面线程,主 要完成界面管理、功能控制、系统管理等,并负责 响应按键与界面输入的数据;监控线程属于无窗口 的用户界面线程,用于实时的监控关键测量点,当 发生异常时及时报警。数据采集与实时显示线程和 数据处理线程属于工作者线程,无窗口显示,主要 在后台执行。程序结构如图 2 所示。
程序开始工作后,首先进行采集卡和试验参数

2008 年第 2 期

基于 VC 多线程的实时数据采集系统

· 47 ·

4 结语

VC++多线程技术应用于实时数据采集系统具 有极大的潜力。我们设计开发的实时数据采集系统, 能够方便地根据试验情况,由试验人员控制各参数, 进行数据采集和实时显示,特别是在长时间试验中, 系统能在第一时间为科研人员提供快速而直观的数 据和信号波形。本测试系统的通用性强、可靠性高, 并具有一定的借鉴性。

图 2 程序结构图 Fig. 2 Program structure diagram
的初始化工作,比如采集卡的采样速率、通道参数 的设定、传感器参数设定、试验时间的设定以及时 序参数的设定等。然后创建人机交互线程、数据采 集与实时显示线程、数据处理线程和监控线程。监 控线程从创建开始就一直在执行,用来响应控制按 钮和阀门等开关状态,当监视的关键测量点发生变 化时就向主线程发送消息,主线程根据接收到的不 同消息进行相应的处理。数据采集与实时显示线程 以及数据处理线程创建时即被挂起,处于等待状态, 等待相应事件的触发,此时它不消耗 CPU 任何时 间。数据采集与实时显示线程接收到 WM_StartAI 消息时就启动线程,根据设定的采样时间和采样速 率进行数据采集。当 FIFO 半满时产生 AiHalfReady Event 事件,程序自动调用对该事件的响应函数及 时取出数据进行处理,然后以时间坐标为横轴,绘 出相应的数据点。这样在采集结束后,就在显示器 上绘出了本次采集完整的信号波形。当数据采集结 束或监控线程监测到异常时主线程发送 WM_TEST_END 消息立即结束数据采集线程同时 启动数据处理线程,数据处理线程主要完成数据存 盘、数据分析计算、打印试验纪录。线程执行完后, 自动终止线程。当按下停止按钮时,试验结束,撤 销创建的各线程,释放所使用的内存空间。

参考文献
1 Michael J.Young(美).Visual C++ 6 从入门到精通 [M].电子工业出版社 2 cPCI-9116 Series 16-bit Multifunction DAS Card User’s Manual[M].ADLINK Technology Inc. 3 PCIS_OCX 程序员手册[M].ADLINK Technology Inc. 4 DAQBench User’s Guide[M].ADLINK Technology Inc. 5 王华,叶爱亮,等.Visual C++6.0 编程实例与技巧[M].机 械工业出版社 6 许福,舒志,张威.Visual C++程序设计技巧与实例[M].中 国铁道出版社
作者简介:孟昭荣 (1971~),女,工程师,在读硕士。1994 年毕业于河北机电学院,从事测量控制的研究工作。
产品介绍系列(六)
KJ0601 产品实物图


基于VC多线程的实时数据采集系统_图文.pdf

基于VC多线程的实时数据采集系统_IT/计算机_专业资料 暂无评价|0人阅读|0次下载 | 举报文档 基于VC多线程的实时数据采集系统_IT/计算机_专业资料。 ...

基于VC多线程的实时数据采集系统.pdf

基于VC多线程的实时数据采集系统_工学_高等教育_教育专区。数据的采集与处理舰船

基于VC多线程的实时数据采集系统_孟昭荣.pdf

基于VC多线程的实时数据采集系统_孟昭荣 - 舰船防化 2008 年第 2 期,

基于VC多线程的实时数据采集系统_论文.pdf

基于VC多线程的实时数据采集系统 - 在工业数据采集和处理系统中如何提高实时性和

基于USB和多线程的实时数据采集系统.pdf

基于USB和多线程的实时数据采集系统 - 说明基于USB技术的实时数据采集系统的硬件、软件实现;重点介绍PDIUSBD12带并行总线的USB接口器件以及基于多线程思想设计应用程序...

实时数据采集系统设计与实现_图文.ppt

预期:为EAST的持续放电设计一套基于mdsplus的实时 数据采集系统 (系统要求:实时,...采集线程 存储线程 存储函数修改新函数特点: 优点: 存储数据的同时,存储了时间...

基于VC++6.0的高速串口通信数据采集系统_图文.pdf

徐晓苏 基于VC++多线程技术的模拟惯性测量组件设计[期刊论文]-中国惯性技术学报 2009(1) 6.汪日伟.张桦.王春东.雷鸣.王法玉.薛彦宾 机器人并行实时采集系统的...

VC环境下高速实时数据采集的实现.pdf

VC环境下高速实时数据采集的实现 - 为了满足发动机试验工程背景的需要,研究了在VC 环境下,利用多线程技术进行发动机高速数据采集系统的设计,对设计中的几个关键性...

基于VC++的实时数据采集系统中定时器的使用与比较.pdf

基于VC++的实时数据采集系统中定时器的使用与比较_电子/电路_工程科技_专业资料...优先级、定时精度等方面的差别,通过比较得到:在多线程、多任务的数据采集系统或...

基于VC++60的串口实时数据采集及实时曲线显示_图文.pdf

基于VC++60的串口实时数据采集及实时曲线显示_计算机软件及应用_IT/计算机_专业...基于VC多线程的实时数据... 4页 免费 基于VC_6_0的高速串口通... 2...

基于VC++的XCTD串口实时数据采集系统的实现.pdf

基于VC++的XCTD串口实时数据采集系统的实现 - 以863课题\XCTD投弃式温盐深剖面测量技术研究\为背景,提出了XCTD实时数据采集系统的设计方法.该系统以单片机和PC机为...

基于单片机的实时数据采集系统设计_图文.pdf

相应增大,若采用这种主从式网络进行多点采集,实时性难以满足,甚 至会造成系统...软件采用基于Windows的VC6.0开发。接收数据采用VC的Mscomm控件,在程序中通过事件...

多线程技术在复杂数据采集系统中的应用_图文.pdf

多线程编程技术设计主控界面 ,实现数据显示实时更新 ,方便操作人员对数据采集的...基于 VC + + 6. 0 的高速串口 通信数据采集系统 [J ] . 微计算机信息 ,...

基于VC++线程的动态数据曲线的绘制方法.pdf

基于VC++线程的动态数据曲线的绘制方法 - 利用VC 中静态文本框控件资源,采用线程方法实现了一工控系统界面中对各种动态实时曲线的绘制,其实用性非常好.

基于VC++线程的动态数据曲线的绘制方法_图文.pdf

系统 中,实 现对 各 种被 控 对象 实 需要 时状 态数据 的采集 及控 ...基于VC多线程的实时数据... 4页 免费 在VC中创建DLL文件的方法... 3页...

基于VC ++的实时数据采集系统中定时器的使用与比较_论文.pdf

基于VC ++的实时数据采集系统中定时器的使用与比较_专业资料。实时数据采集系统...在多线程、多任务的数据采集系统或采样周期较短,采用多媒体定时器可以获得较高...

基于VC和数据库的实时温度监控系统软件的开发_图文.pdf

基于VC数据的实时温度监控系统软件的开发 - 使用VC++实现简单组态软件的编写... 基于VC数据的实时温度监控系统软件...关串口通信的线程,串口的创建、设置、...

工控机实现40通道实时数据采集系统的研究_图文.pdf

《工业控制计算机》2005年18卷第9期 17 工控机实现40通道实时数据采集系统的...基于VC多线程的实时数据... 4页 免费 基于VC_的实时数据采集系... 3页 ...

VC环境下高速实时数据采集的实现.pdf

VC ++ 环境下 , 利用多线程技术进行发 要 动机高速数据采集系统的设计 , 对...但是 Windows 并不是实时操 作系统 ,它是基于消息驱动机制 ,没有提供足够的实...

VC环境下高速实时数据采集的实现.pdf

研究了在 VC ++ 环境下,利用多线程技术进行发 动机高速数据采集系统的设计, ...但是 Windows 并不是实时操 作系统, 它是基于消息驱动机制, 没有提供足够的实...