基于VB实时数据采集与处理的多线程设计
- 格式:pdf
- 大小:142.39 KB
- 文档页数:3
基于Excel VBA的嵌入式实时数据采集与处理系统设计随着科技的不断发展和不断更新换代,越来越多的企业、机构和个人开始将自动化技术应用到自己的生产和管理中。
在这个过程中,Excel VBA 巨大的数据处理能力得以充分发挥。
Excel VBA,作为一种目前非常流行的基于 Windows 平台的编程语言,几乎可以帮助用户实现所有数据操作的设计需求。
尤其是在实时数据采集以及数据处理方面,VBA 无疑是一个卓越的工具。
近年来,VBA 已经越来越广泛地应用于各种领域,成功地解决了众多企业在实时数据采集和处理过程中遇到的各种难题。
本文旨在探讨基于 Excel VBA 的嵌入式实时数据采集与处理系统的设计和运作原理。
一、 VBA 基础VBA 的全称是”Visual Basic for Applications”,表面上看起来与 Visual Basic 有一定的关联。
它早在 Windows 系统推出之前就已经诞生了,并且得到了广泛的应用。
VBA 的主要作用是为 Office 软件提供了一层可编程的接口(API),用户可以调用其提供的接口中的任何一个功能。
由于 VBA 能够利用 Excel 自带的工具,实现与 Excel 直接交互,因此 VBA 编程非常适合于 Excel 操作。
而且由于 Excel 具有完善的图表和数学计算功能,它可以非常简单高效地完成数据处理的工作,并且可以实时实现数据采集和处理的功能。
二、嵌入式实时数据采集与处理系统“嵌入式实时数据采集与处理系统”是基于嵌入式系统的数据采集和处理系统,就是在嵌入式系统中实现实时数据采集和处理,将数据加工成有用的信息进行分析和处理。
这种系统利用各种硬件和软件技术,将数据从传感器和其他设备中读取,将其实时处理为符合要求的格式,再将其发送到特定的目标。
具体来说,在这种系统中,从传感器、信号源和其他现场设备中获取的原始数据存储在放置在数据采集系统内的嵌入式处理器芯片中。
VB .NET多线程编程的详细说明介绍传统的Visual Basic开发人员已经建立了同步应用程序,在这些程序中事务按顺序执行。
尽管由于多个事务多多少少地同时运行使多线程应用程序效率更高,但是使用先前版本的Visual Basic很难建立这类程序。
多线程程序是可行的,因为操作系统是多任务的,它有模拟同一时刻运行多个应用程序的能力。
尽管多数个人计算机只有一个处理器,但是现在的操作系统还是通过在多个执行代码片断之间划分处理器时间提供了多任务。
线程可能是整个应用程序,但通常是应用程序可以单独运行的一个部分。
操作系统根据线程的优先级和离最近运行的时间长短给每一个线程分配处理时间。
多线程对于时间密集型事务(例如文件输入输出)应用程序的性能有很大的提高。
但是也有必须细心的地方。
尽管多线程能提高性能,但是每个线程还是需要用附加的内存来建立和处理器时间来运行,建立太多的线程可能降低应用程序的性能。
当设计多线程应用程序时,应该比较性能与开销。
多任务成为操作系统的一部分已经很久了。
但是直到最近Visual Basic程序员才能使用无文档记录特性(undocumented)或者间接使用COM组件或者操作系统的异步部分执行多线程事务。
.NET框架组件为开发多线程应用程序,在System.Threading名字空间中提供了全面的支持。
本文讨论多线程的好处以及怎样使用Visual Basic .NET开发多线程应用程序。
尽管Visual Basic .NET和.NET框架组件使开发多线程应用程序更容易,但是本文作了调整使其适合高级读者和希望从早期Visual Basic转移到Visual Basic .NET的开发人员。
多线程处理的优点尽管同步应用程序易于开发,但是它们的性能通常比多线程应用程序低,因为一个新的事务必须等待前面的事务完成后才能开始。
如果完成某个同步事务的时间比预想的要长,应用程序可能没有响应。
多线程处理可以同时运行多个过程。
VB下开发设计实时的数据采集曲线1. 引言在笔者参与过的开发的机组轴瓦控制系统中,要求能够实时采集轴瓦转动速度值V,并能根据实时采集到的数据绘制出V在10分钟内变化的短期趋势图和一日内变化的长期趋势图,以便观测轴瓦转动的趋势情况,查看控制效果。
该系统在VB6.0环境下进行开发,开始时采用了VB包含的Activex控件技术绘制曲线,在效果不理想的情况下,笔者利用VB绘画函数,最终成功实现了实时数据采集曲线的绘制与显示。
笔者将以轴瓦实时采集速度值V的短期趋势图为例,谈一下实时采集曲线的设计与实现过程。
2. 绘图控件的选择系统开发初期,采用VB内所含的Activex控件技术来解决实时采集曲线的绘制问题。
VB控件中提供了外部Activex控件Mschart来给该应用程序添加图表功能,用它能创建包括条形、饼形、线形等不同类型的三维图表。
利用该控件,可对表中的所有项目进行完全控制,例如标题、图表、脚注、轴、数据点系列等等,甚至还能旋转图表,为每一元素加上背景、设置光源,把它们放在想要的地方。
本系统中需要实时测量轴瓦速度V的实际值,并根据实时更新的短期速度数据数组、长期速度数据数组分别绘制短期趋势曲线图与长期趋势曲线图,这两个趋势图均是速度值(Y轴)和时间(X轴)的关系曲线,并随着时间变动实时更新,以便观测。
短期趋势图的绘制,由于测量10分钟内的数据,每一秒测量一次,因此每10分钟内都有600个数据,为绘制曲线,还要赋予一个初值,所以速度短期数据定义为长度为601的数组。
将数据初始化后,利用Mschart控件得到如下图1所示的短期趋势模拟图。
该图的静态显示外观比较理想,但是每秒一次的数据更新使屏幕每秒钟都会引起由于重绘带来的闪烁,这大大降低了图形界面的可视性与美观性。
由此可见,M schart控件不太适用于绘制实时数据采集系统的相关曲线。
为了解决这个难题,笔者尝试利用了VB提供的绘画函数等简单易用的多媒体实现技术,并取得了非常好的效果,以下是我们的实现步骤。
基于VB的多路数据采集系统设计
周学礼;叶飞;吕忠斌
【期刊名称】《电工电气》
【年(卷),期】2010(000)005
【摘要】以SST89C58单片机为核心,辅以必要的外围电路,设计了一种计算机监控的多路数据采集系统.系统采用ADC0809芯片进行数据采集,ZLG7289芯片进行通道选择,通过RS-232串口实现单片机和PC机的数据通信,进行上位机的控制和显示.整个数据采集系统能完成8路数据采集,并能自由切换采集通道,可灵活地在上位机和下位机之间切换,根据不同需要用于多种数据采集系统中.
【总页数】4页(P9-12)
【作者】周学礼;叶飞;吕忠斌
【作者单位】常熟理工学院物理与电子工程学院,江苏,常熟,215500;常熟理工学院物理与电子工程学院,江苏,常熟,215500;常熟理工学院物理与电子工程学院,江苏,常熟,215500
【正文语种】中文
【中图分类】TM73
【相关文献】
1.基于VB6.0的多路数据采集与处理系统 [J], 祁建广;李宝营;孙玉明
2.基于VB和单片机的多路数据采集系统设计 [J], 冯传均;戴文峰;何央
3.基于VB的多路数据采集系统上位机软件设计 [J], 张瑜;韩玉杰;闵昆龙
4.基于VB的多路数据采集系统的实现 [J], 石永帅
5.基于单片机和LabVIEW的多路数据采集系统设计构想 [J], 霍海波
因版权原因,仅展示原文概要,查看原文内容请购买。
基于VB的实时采集数据库编程 吉同舟,赵芙生,张金龙(南京师范大学 电气与电子工程学院,江苏 南京 210042) [摘 要] 介绍了利用VB提供的数据管理器和报表设计器,实现数据实时采集记录、报表输出和自动删除的编程。
[关键词] 实时采集;VB数据库;编程 [中图分类号] TP311.132 [文献标识码] A [文章编号] 1003─188X(2002)03─0178─02 随着微型计算机应用技术和数据检测技术的迅速发展,以微机为处理中心的数据检测系统,以它独特的优点和强大的生命力,在各个领域中发挥出愈来愈强大的作用。
掌握并运用数据检测系统对生产过程和设备进行监测、定量分析、故障诊断和优化控制极为重要。
1 实时采集的特点和实现 在工业现场和其他恶劣条件下,经常要测取点多而分散的模拟信号(如电压、电流、电阻应变和热电偶、热电阻测量等)和数字量信号(如开关状态检测、事件捕获、测频计数等)。
检测系统应具有测量精度高、抗干扰能力强、智能化程度高、使用简单灵活和安装维护方便等特点。
近年来,“研华工控”、“威达工控”等分别推出了数据采集与控制卡(或模块)、通讯网络系统及应用软件,成为人们从事工控的得力助手和理想工具。
商家为每个数据采集与控制卡(或模块)配有基于Windows的驱动程序,在数据采集应用中利用Microsoft Windows环境的优势和特点,在可视的编程环境下(如Visual Basic和Borland Delphi)利用DLLs可轻松创建用户的接口和图形。
2 数据库设计 当我们从数据采集与控制卡(或模块)获得所需的各种数据,并利用这些数据来编写各种应用程序时,首先涉及到数据库的设计。
VB提供了具有Jet数据库引擎(Database Engine)的数据管理器(Data Manager);数据管理器为VB与数据库的链接提供 了基本的方法,可以帮助VB程序建立和维护数据库,并可通过查询方式查找数据库中有关的信息,而不必另外再通过数据库软件来管理数据库。
收稿日期:2004-04-29作者简介:李永策(1973-),男,硕士生,主要从事计算机辅助设计与应用研究。
基于VB 实时数据采集与处理的多线程设计李永策,徐颖强(西北工业大学机电学院,陕西西安710072) 摘要:针对VB 创建多线程方面的不足,探讨了运用VB 调用通讯函数,并有效的挖掘了VB 强大的界面开发功能,实现了多线程的数据采集和处理,解决了实时数据采集引发的程序阻塞问题,最后给出了一个可行的应用实例。
关键词:VB ;多线程;数据采集与处理中图分类号:TP27412 文献标识码:A 文章编号:100020682(2005)0120035203Multithread design of real time data gathering and processing based on VBLI Y ong 2ce ,X U Y ing 2qiang(College o f Mechanical and Electrical Engineering ,Northwestern Polytechnical Univer sity ,Shaanxi Xi πan 710072,China ) Abstract :According to the lack of establishing mulltithread of VB ,this paper discusses to trans fer com 2munication function by using of VB in taking great advantage of the powerful interface design function of VB ,and a multithread design of real time data gathering and processing is im plemented to s olve the problem of pro 2gramme obstructing.At last an approved exam ple is enumerated.K ey w ords :VB ;multithread ;data gathering and processing0 引言 在多种可视化编程语言中,VB 具有界面设计功能强的特点,选择它作为开发平台,可以快速地创建应用程序。
该特点使其在测控系统的数据采集和处理中应用比较广泛,但是在数据实时处理时,往往出现执行操作界面的菜单命令明显反应变慢,操作不便,实时监控数据时引发了程序阻塞。
导致此问题的原因是仅通过一个任务体系解决大数据量的实时传输与处理,而应用多线程的编程思想,把实时数据的采集与界面的操作通过不同的线程来完成,就会解决此问题。
然而,用VB 开发多线程的实时数据采集与处理系统有一定的难度。
笔者系统地论述了VB 的多线程设计,建立了相应的算法,结合数控压力校验系统,给出了设计的流程,并通过实例说明多线程算法的可行性。
1 进程与线程 Windows 操作系统既支持多进程,又支持多线程。
进程是应用程序的一次执行,每个进程是由私有的虚拟地址空间、代码、数据和其他系统资源组成的。
而线程是比进程更小的能独立运行的基本单位,是进程的执行路径,它包含独立的堆栈和CPU 寄存器状态,每个线程是进程内部的可执行路径,是进程的执行单元。
从根本上说,线程是可由系统调度的最简单代码单元,负责执行包含在进程的地址空间中的程序代码。
一个进程一般都要有一个线程,叫做主线程,进程也可以包括多个线程,所有属于该进程的线程都共享进程的资源,如CPU 、地址空间以及对象句柄等。
在多线程程序中,每一个线程都有自己的堆栈,并独立于应用程序内的其他线程而运行,多个线程可以同时运行。
利用多线程机制可以实现进程内的各个子任务并行执行,从而提高系统的实时性能。
把实时数据的读取与处理数据的界面操作交给不同的两个线程并发执行,即可解决上面提到的问题。
多线程模式的工作原理和编程机制对于VB 并不完全适合,在VB 中较少涉及到多线程的问题,这是因为VB 并不具备线程安全性。
通过VB 实现多线程应用程序时,应用程序必须满足放弃用户交互,即不能有类似于窗口之类的用户界面。
因此不能用VB 的串口通信控件MSC omm 来进行实时数据的采集,可以通过动态链接库D LL 的函数调用实现串行通信。
・53・2005年第1期 工业仪表与自动化装置与VB 相比较,VC 的MFC 库支持Windows 所提供的辅助线程和用户界面线程,用户界面线程通常有窗口,因此它具有自己的消息循环,这是VB 所不能及的。
关于线程间通信,VB 和VC 都可以通过全局变量实现,但VC 还可以利用线程同步技术来实现。
相比之下,VC 的多线程机制要比VB 安全,功能也强大。
2 VB 多线程的设计 VB 多线程的创建需要在通用模块中声明Win32API 动态链接库,而此动态链接库具有创建线程的函数,创建线程的流程图如图1所示。
图1 创建线程 根据线程函数的地址定义线程体名,关于此线程体的应用代码加入到公用模块中,由创建线程到停止线程的流程如图2所示。
3 某压力校验系统实时数据采集与处理 线程的设计 压力指示表、压力变送器和压力开关是工业上图2 实时数据采集与处理线程工作流程使用最为广泛的仪表,工业生产很多都是高温高压的过程,且很多设备处于极限运行状态。
因此压力仪表的稳定性和准确性就显得尤为重要。
此数控压力校验系统按照无纸化管理和网络共享来实现集压力测量、压力仪表校验、误差自动处理、校验表格和证书自动生成、历史数据自动存储和可分类查询的标准校验系统。
311 创建实时数据采集与处理的线程算法 在通用模块中声明创建线程的函数:Public Declare Function Create Thread Lib ″ker 2nel32″(ByVal 1pThreadAttributes As long ,By Val dw 2StackSize As Long ,ByVal 1pStartAddress As Long ,ByVal 1pParameter As Any ,ByVal dwCreationFlags As Long ,1pThreadId As Long )As Long参数含义:1pThreadAttributes 如果传递NU LL ,该线程使用默认安全属性。
如果希望所有的子进程能够继承该线程对象的句柄,必须将它的bInheritHandle 成员被初始化为TRUE 。
dwStackSize 设定线程堆栈的地址空间。
如果非0,函数将所有的存储器保留并分配给线程的堆栈。
如果是0,Create Thread 就保留一个区域,并且将链接程序嵌入.exe 文件的/ST ACK 链接程序,开关信息指明的存储器容量分配给线程堆栈。
1pStartAddress 线程函数的地址。
1pParameter 传递给线程函数的参数。
dwCreationFlags 如果是0,线程创建后立即进行调度。
如果是CRE ATE -S USPE NDE D ,系统对它进行初始化后暂停该线程的运行。
lpThreadId 用来存放系统分配给新线程的I D 。
接下来再声明两个API 函数,是用来退出线程的。
Public Declare Sub ExitThread Lib ″kernel32″(ByVal hThread As Long ,1pExitC ode As Long )As LongPublic Declare Function G etExitC odeThread Lib ″ker 2nel32″(ByVal dwExitC ode As Long )定义两个变量,变量hThread 是线程的句柄。
Dim hThread As Long ,idThread As Long 创建线程的代码如下:Public Sub StartThread (ByVal i As Long ) idThread =0 hThread =CreateThread (0&,0&,AddressO f thread1proc ,i &,0&,idThread ) I f hThread =0Then MsgBox ″创建线程失败″End Sub停止线程的代码如下:Public Function Stop Thread ()As Long D o Call G etExitC odeThread (hThread ,StopThread ) D oEvents Loop While StopThread =STI LL -ACTI VE CloseHandle hThread hThread =0End Function在创建线程的代码中用了AddressO f 语法,所创建的线程从thread1proc 处开始,线程体名是thread1proc ,在公用模块中加入应用代码;Public Function thread1proc ()As Long在此加入实时数据采集和处理的应用代码・63・工业仪表与自动化装置 2005年第1期End Function在调试运行的时候应该注意,在编译环境和EXE模式下效果会不同,在编译模式下容易非法操作。
还有在线程中,不能用D oEvents,可以多次调用StartThread来达到多线程,局部变量各自独立。
312 实时数据采集与处理的实现选择四零四科技公司所出品的Pcomm Pro软件中的通信用动态链接库的D LL文件Pcomm.dll进行串口通信。
首先要进行声明,所声明的函数包括通信端口的打开(sio-open)/关闭(sio-close)、传输参数设置(sio-ioct1)及硬件线路控制(sio-DTR)等。
在V B环境下使用Pcomm Pro函数库先要引入函数声明,让程序知道函数所在的位置。
此通信函数库已经预先准备了常用的模块,只要引入到所创建的工程中即可。
该程序用到的模块是Pcomm.bas(常数定义及函数声明模块),当函数库安装后,这个模块就存在于计算机中,将其复制到工程目录中,在工程使用中加入模块功能即可。
部分重要的代码如下:・ 打开C OM1端口Public Sub C OMOpen() Call sio-open(1) Call sio-ioct1(1,B9600,BIT-8)End Sub・ 读端口数据Public Function C OMRead()As Boolean Dim TT& Dim result As Long Dim ReceiveData(5)As Byte On Error Resume Next TT=G etT ickC ount()R0:result=sio-read(1,ReceiveData(0),1) I f result=0Then I f G etT ickC ount()-TT<=1000Then G o T o R0 End if……Eng Function・ 处理读取数据并根据运行方式输出: db1H=ReceiveData(3)’高字节 db1L=ReceiveData(4)’低字节 ReadData=db1H3256+db1L在程序设计时,要注意上位机与压力表之间的通讯协议。