好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

LabWindowsCVI多线程技术数据采集系统的构建.docx

4页
  • 卖家[上传人]:汽***
  • 文档编号:421501129
  • 上传时间:2023-09-23
  • 文档格式:DOCX
  • 文档大小:103.17KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 基于 LabWindows/CVI 多线程技术数据采集系统的构建摘要:在简要介绍虚拟仪器实验室的基础上,本文对LabWindows / CVI软件开发平台下利用 多线程技术实现实时数据采集进行了研究与设计,重点讨论了在数据采集过程中数据采集卡 驱动的制作,多线程技术的应用以及对数据库存储的操作,大大提高CPU的利用率关键字: LabWindows/ CVI 多线程 数据采集Abstract: On the basis of introduction of virtual instrument laboratory,the paper studies how to acquire data withmulti—thread technology based on LabWindows/CVI,and discusses the drive of PMD-1208FS,application of multi—thread technology and the operation of the database save, raise the CPU utilization consumedly.Key words:LabWindows/CVI Multi-threadtechnology Data acquisition1 引言虚拟仪器技术是近几年发展起来的新一代仪器技术,它通过应用程序与各功能化模块结 合,用户利用友好的图形界面来控制计算机,完成对仪器控制、数据采集、分析、存储及显 示等,正是由于这种由传统仪器到虚拟仪器的转变和实现.促进测控技术的发展和更新。

      虚 拟仪器实验室是利用计算强大的显示、运算、处理功能,将一个具体的实际系统实验用计算 机来模拟.配以生动形象的声音、图像或图形达到与实际系统实验逼近的效果学生可以 在网上或独立的计算机上进行实验.在时间空间上突破了常规实验方法的限制数据采集系 统是虚拟仪器实验室的一个重要组成部分,也是系统获取原始数据的主要手段:本文针对此 研究平台LabWindows / CVI的多线程实时数据采集技术,大大提高CPU的利用率.2.多线程技术线程是指进程内部的可独立执行的单元,是操作系统对系统资源的基本调度单位单线 程程序只有一个线程即主线程 ,多线程程序是在同一时间段内至少有2个线程在执行程序代 码,其中每1个线程都有自己的堆栈,并独立于应用程序内的其它线程而运行,在实时控制 中,常会遇到多任务同时进行工作的情况,比如数据采集和处理并行进行一若采用单线程编 程方法,需要等到一遍数据采集完之后才能进行数据处理,大大降低 程序的执行效率.系 统的实时性也难以得到保证,而多线程技术的应用可以把这些任务分给几个单独的线程, 1 个线程进行数据采集,其它线程进行数据处理或其它工作,这样就能最大限度的保证数据采 集的实时性,又能及时响应用户的其它操作,尤其在采集数据很大、数据处理任务很重时更 加明显。

      3 LabWindows / CVI下的多线程设计LabWindows / CVI是在Windows环境下.面向计算机测控领域的虚拟仪器软件开发平 台它以ANSI C为核心,将功能强大、应用广泛的C语言与测控专业工具有机地结合起来, 并支持多线程,利用它的集成开发环境,在编程过程中直接调用用户界面函数和高级分析库 函数,从而大大缩短软件的开发时间在典型的LabWindows / CVI多线程程序中,使用主线程创建、显示并运行用户界面,在 次线程中运行其它的对时间要求很高的操作在CVI中,设计多线程数据采集时,应首先创 建线程池和新线程即数据采集线程;然后调用函数使主线程在结束之前处于等待状态,直到 线程函数执行结束,这样可以使主线程在次线程结束前退出时,次线程能完全释放它们所占 用的资源;再运行数据采集线程函数;最后结束线程函数后还要释放线程和线程池:在创建 多线程后,实现线程间的信息交换也是必须考虑的一个问题:CVI专门提供了一个数据管道 用于两个线程之间的通信:数据管道实际上是一个先进先出的队列,并且可以响应一定的事 件:在建立线程安全队列TSQ的同时,设置对应于某一事件的回调函数,当有线程向线程安 全队列TSQ添加数据或读取数据时,就会触发预先定义好的事件响应函数,这些函数存在于 数据处理线程中.从而完成相应的数据处理功能。

      多线程处理架构如图一所示:图一4. 数据采集系统的设计 数据采集系统主要完成的任务有实时采集波形,产生任意波形,对输入信号的波形进行 直观的显示,并对幅值、频率、 置位连续调控;将采集的信号存人数据库或输出等这些 任务要求通过设计不同的程序模块来完成,并设计用户界面程序,由用户界面程序控制其它 各功能程序的运行流程图如图二所示4.1系统硬件介绍本系统硬件部分采用PMD1208—FS多功能数据采集卡,PMD1208—FS是一款支持USB2.0高速采集设备,支持八模拟通道输入(通道自带A/D),双通道12位模拟输出,16根 数字I/O线,支持8通道11位单极性或4通道双极性输入4.2数据采集卡驱动的制作首先安装PMD1208—FS多功能数据采集卡的驱动光盘,在安装目录下面有C,VB,DELPHI 的一些实例,在这里我们采用支持C的函数,认真阅读用户手册及实例的编写,调用针对本 系统采集的函数,部分函数介绍如下:int EXTCCONV cbAInScan int BoardNum, int LowChan, int HighChan, long Count, long*Ra te, int Gain, HGLOBAL MemHandle, int Opt ions);//读设定通道范围内模拟输入信号 int EXTCCONV cbDeclareRevision(float *RevNum);//初始化函数int EXTCCONV cbErrHandling (int ErrReporting, int ErrHandling);//对并发的函数调 用设置错误处理在LabWindows / CVI调用这些函数时需加载采集卡自带的通用函数链接库。

      4.3采集线程设计 程序中采用多线程编程技术,实现了波形显示时能同时进行数据存储,并且保证保数据 采集的实时连续性;提高了执行效率和CP U的利用率程序以用户界面接口为主线程,完成用 户的输入及显示的任务用户界面具有合理的控制界面和参数设汁,能及时响应用户的各种 操作,数据采集线程在响应界面采集指令后启动,并作为后台线程负责现场数据的采集如 图三所示,选择通道一后采集数据创建采集线程函数代码如下:static int CVICALLBACK ThreadFunctiondaq (void *functionData) { char *date,*time;float EngUnits;float RevLevel = (float)CURRENTREVNUM;int Samples;int Rate;double *ADData;short Status = RUNNING;unsign Options;switch (event){case EVENT_COMMIT:ULStat = cbDeclareRevision(&RevLevel);// 链接数据采集卡函数库GetCtrlVal (panelHandle, PANEL_SAMPLES1, &Samples);GetCtrlVal (panelHandle, PANEL_RATE1, &Rate);ADData = (double*)cbWinBufAlloc(Samples);// 根据样点数自动生成数组长度 if (!ADData) /* Make sure it is a valid pointer */{exit(1);}cbErrHandling (PRINTALL, DONTSTOP);Options = CONVERTDATA + BACKGROUND + CONTINUOUS + SINGLEIO;ULStat = cbAInScan (BoardNum, LowChan, HighChan, Samples, &Rate, Gain,ADData, Options);// 采集数据PlotY (panelHandle, PANEL_GRAPH, &ADData, samples, VAL_INTEGER,VAL_THIN_LINE, VAL_SIMPLE_DOT,VAL_SOLID, 1, VAL_YELLOW);// 将数据输出到面板空间中ULStat = cbStopBackground (BoardNum,AIFUNCTION);return 0;}4.4数据库存储线程设计创建数据库存储线程,进行数据采集的同时对数据进行存储操作,代码设计如下:static int CVICALLBACK ThreadFunctionsave (void *functionData){ hdbc = DBConnect ("DSN=caiji");if (hdbc <= 0) {ShowError(); goto Error;}/* begin map for constructed SQL statement */hmap = DBBeginMap (hdbc);if (hmap <= 0) {ShowError(); goto Error;}//获取存储数据date=DateStr();time = TimeStr ();Fmt (timers, "%s<%s %s", date,time);resCode = DBMapColumnToChar (hmap, " 日期", 10, timers, &uutStat, "");if (resCode != DB_SUCCESS) {ShowError(); goto Error;}resCode = DBMapColumnToDouble (hmap, "数值", &ADData[0], &meas1Stat);if (resCode != DB_SUCCESS) {ShowError(); goto Error;}/* the previously specified variables.) */hstmt = DBActivateMap (hmap, "table1");if (hstmt <= 0) {ShowError(); goto Error;}/* Create the new record */resCode = DBCreateRecord (hstmt);if (resCode != DB_SUCCESS) {ShowError(); goto Error;}/* Insert the record into the database */resCode = DBPutRecord (hstmt);if (resCode != DB_SUCCESS) {ShowError(); goto Error;}resCode = DBDeactivateMap (hmap);if (resCode != DB_SUCCESS) {ShowError(); goto Error;}resCode = DBDisconnect (hdbc);if (resCode != DB_SUCCESS) {ShowError(); goto Error;}cbWinBufFree((double*)ADData);Error:break; }。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.