1、137动态数据采集系统的图形化数据显示Graphics Mode Data Display of the Dynamic Data Acquisition System董绵绵 郭宝亿Dong Mianmian Guo Baoyi(西安工业大学电子信息工程学院, 陕西 西安 710032 )( School of Electric Information Engineering, Xi an University of Industry, Shanxi Xi an 710032 )摘 要 : 本文主要讲述了动态数据采集系统的图形化数据显示以及历史数据分析功能的实现方法, 具有实时数据绘图、历史数
2、据重绘图以及图形的分析功能。关键词 : 图形化数据显示 ; 历史数据分析 ; 数据变化趋势 ; Visual Basic中图分类号 : TP391.41 文献标识码 : A 文章编号 : 1671-4792-(2007)11-0042-03Abstract: This thesis primarily discusses the design method of software about graphics mode data display ofthe dynamic data acquisition system and historic data analyzed. The proje
3、ct requires the functions with realtime data drawing, zoom out and zoom in graphic 、 historic data drawing and reading point data from curve.Keywords: Graphics Mode Data Display; Historic Data Analyzed; Data-changing Trend; Visual Basic0 引言过程控制工程是自动控制理论体系中的重要组成部分 ,是本专业的骨干课程 , 为学生提供了很多实用的理论知识。然而课本中提及
4、的工业现场所涉及到的工业过程大多具有大惯性、 大滞后 (大延迟) 等特性, 这些环境在实验室条件下往往无法进行模拟。 这样势必造成教学理论与学生实践的分离, 使理论过于抽象, 不便于学生学习理解。 为了解决这一问题, 可将毕业设计的方向定为 : 为实验室开发大迟滞环节的模拟被控对象。 考虑到如果单纯的采用原来的模拟或数字仪表的输出显示, 不能直观的反映出被控参量的变化趋势、实验过程枯燥、 后期数据繁琐等问题, 这里借助编程工具 VB ,为实验提供数据的动态图形显示, 以及分析功能。1 总体设计首先调用通讯函数, 将通讯得到的数据存入一个公共的采样数据数组区中, 然后用该区域最新进入的数据进行动
5、态的曲线绘制, 绘制过程中可以随时停止对某路数据的显示。在用户要求数据保存时, 将数据保存在自定义格式的文件中。 最后在要求对历史数据分析的时候, 将数据从文件调入并存在采样数据区中, 这时用户可以方便的对数据进行缩放取点值分析。2 具体设计2.1 界面设计这里可以做一个菜单, 菜单提供文件操作功能以及帮助信息。 在文件菜单中提供了文件的打开 保存, 和 Word 一样这里还提供了四个历史文件记录项, 在帮助菜单中提供了该软件的系统帮助信息, 如图一所示。在主界面上, 首先是数据采集者姓名、 采集者归属单位以及采集项目名称信息。 下面是采样曲线显示区, 在右侧有对应各路曲线的显 隐控制复选框
6、( 它同时作为数据的标签使用 ) 。 在曲线显示区的下方有 9 个控制键, 其中 3 对控制键实现 Y 方向取值轴左右移动 100 、 10 、 1 个点的控制。 在左下脚的文本框数据显示区中, 动态采集时将显示出当前采集到的数据, 取值轴取出的各路曲线对应点的电压值将在标签中予以反映, 静态重绘时, 取到的值将直接在文本数据显示区中显示出来。 另外 3 个键用来控制图形的缩 放 整条曲线显示。 在工作区的右下脚, 还有 3 个按钮, 一个用来起 停绘图的复用按钮, 一个用来清除曲线重新开始记录, 一个退出按钮。图一 主界面设计图2.2 代码设计动态数据采集系统的图形化数据显示138科技广场
7、2007.11图二 系统软件设计流程图在上位机读取下位机采样数据时钟的 Timer 事件中, 首先调用通讯绘图接口函数, 对用来保存 1 路绝对时间和 8 路采样数据的全局数组数据区 tmpData 进行填充。 根据估算和实际经验这里把 tmpData 暂时定义为一个第一维为 9 , 第二维为 10000 的二维数组 “即 tmpData(0 to 10000,1 to 9) ”,在用户需要长时间采集数据时, 可以更改该值来实现。 采样次数由长整形全局变量 caiyang 记录, 在每次 timer 事件调用的通讯绘图接口函数过程中增加 1 , 因而它也很自然的成为了数据数组区采样当前值指针。
8、 接着 timer 事件调用了实时绘图函数 drawdot, 它完成了实时的绘图以及当前采样数据的显示。2.3 通讯绘图接口程序 ( com To draw )该接口函数受上位机读取下位机采样数据时钟的控制,调用通讯函数读取下位机准备好的 8 路 A/D 转换输出, 把读到的数据存入接收数组 B1 中。 下位机的每路的 A/D 输出用了一个字节表示 05V 的电压, 即返回值是 0255 , 这里将它转换为 05000mV 的数据形式, 存入数据数组区 tmpData 中。 这样的转换将便于图形的绘制以及在取值轴读取数值时的直接使用。 在读取到数据的同时, 记录了该次通讯的系统时间信息 tmp
9、time5, 它于首次通讯 tmptime1 之差得到绝对时间tmptime, 将该绝对时间存入数组 tmpData 中, 提供 tmpData中各路数据对应的时间值。For i = 1 To 8tmpData(caiyang, i) = Int(B1(i) / 256 * 5000 + 0.5)Next itmpData(caiyang, 9) = tmptime2.4 实时绘图函数 ( draw dot )由于对将来进行实验的时间长度无法估计, 以及考虑到系统功能的可扩展性, 这里做了绘图回头函数 convertX , 使绘制曲线在满图幅后自动回头从图面的最左边开始重新绘制。 这里通过 /
10、(caiyangzhq / 0.1) 作了绘图的点距调节,这样即使在低频率长周期数据采集过程中, 不至于出现画点过稀, 图面中反映趋势信息过少的缺陷。 以函数 convertX 的返回值 CurrentXX 作为当前绘图点的位置, 提供给下面的检测画点函数和擦图函数调用。Private Sub drawdot()CurrentXX = convertX(caiyang)/(caiyangzhq/0.1) 绘图回头点距调节Call drwCheck(CurrentXX) 检测画点函数Call Clsrectangle(CurrentXX) 局部清图函数Call TxTdataView(caiya
11、ng)End Sub其中, TxTdataView 是一个动态数据显示函数 , 它在界面的左下方的文本框中显示了 1 路时间信息和 8 路采样数据。2.4.1 绘图回头函数这里传入的数据为当前的采样次数, 即 controlx=caiyang 。 我们定义绘图区 x 轴的取值为 06000 , 以周期 0.1 秒为例, 在一个屏幕上所用时间即为 60 秒, 将由 caiyang指向的当前通讯数据的绝对时间 tmpData(caiyang,9) 减去它除以 60 取整后的值, 是一个 60 以内带两位小数的数据, 再将它乘以 100 , 即为一个图幅范围内 (06000) 的不带小数的画点 x
12、轴位置信息。 这样自然就实现了绘图回头的算法。2.4.2 检测画点函数它的参数 X 是由绝对时间, 经过回头函数处理的画点 x轴方向点位置信息, tmpData(i) 由全局变量 caiyang 指向的数据数组区中存储的当前采样数据 , 即为绘图的 y 轴信息。 这里使用了 Pset 绘图方法, 该点的颜色对应于图形界面上各checkbox 标签的 backcolor 属性值, 而该点是否被画出取决于界面上对应路的 checkbox 的选中状态。If Chk_in.Value=Checked Then Pic.PSet(x,tmpData(y,1),Chk_in.BackColor2.4.3
13、局部清图函数在绘制完一整图面的曲线后, 通过回头函数的调用, 曲线将自动回头, 这样就要求在绘制新点的时候应该擦除旧点, 于是这里编制了局部清图过程。 它将清除由常数CleanSpace 设定的清图范围, 并补全被擦除的坐标线。 这里擦图就使用底色在距当前点 CleanSpace 位置画竖线, 这样将覆盖掉以前绘制的图形以及坐标线。 接着需要补全被擦除的坐标线, 这里补 x 轴线时要每次补到被清除掉的线稍后的位置, 而补充 y 轴时, 利用了将当前覆盖区与横向格间距取整的方法。 这样的清图补线顺序导致了, 如果一直用 VB 的默认画图笔复制笔 vbCopyPen, 将会发生坐标线覆盖数据点的情
14、况。 为此, 在补坐标线的过程中我们改变了绘图的模式, 利用了或笔 vbMergePen , 它取当前图上颜色与笔上的颜色进行或运算从而显示两者叠加的状态。 这样补坐标线时, 画笔遇到点的颜色时, 将显示出点色与坐标色叠加出的色彩, 避免了数据点被覆盖问题的发生, 而且这种色彩的叠加状态在日常生活中也很常见, 是可以被理解的。 在每次补全坐标线完成是应该将画笔还原为复制笔, 以免在平时画点时点的颜色值与背景色相与而产生非设计时希望的颜色。2.4.4 数据保存函数数据保存程序要求保存的数据有数据采集者信息、 采集环境信息、 以及采集的数据。 其中采集者信息包括 : 采集者姓名、 采集者归属单位、
15、 采集项目名称 ; 采集环境信息包括 :总采样次数、 采样周期、 最后一次采样的绝对时间 ; 采集数据是指所有的采样数据以及各自对应的采样时间。 数据保存采用了顺序文件的格式存储。2.4.5 数据调入程序数据调入程序完成了采集者信息、 采集环境信息和采样数据数组区的填充。 静态数据的绘图是指利用文件打开时调入的数据绘制曲线。 在动态绘图时我们已经定义了图幅6000x6000 , 这里我们继续使用这一规定。 正如我们前面所讨论的, 实验的历时是不可预见的, 由回头函数产生的图形是多屏的, 而在文件打开时我们应该让用户看到完整的记录139曲线, 这里就涉及到显示比例的调整。 这里 tmpData(
16、caiyang,9)/(caiyangzhq/0.1)*100 做了不同采样周期采样时点密度的调整, 请参阅前面动态绘图部分的介绍, rT(rP)是一个缩放比例表, rP 是该表的一个指针, 在静态图形的缩放部分将做详细的介绍。 drawdotAll() 作为一个通用静态绘图函数后面将单独介绍。rP = 16Do Until tmpData(caiyang, 9) / (caiyangzhq / 0.1)* 100 * rT(rP) 6000rP = rP - 1If rP 0 Then rP = 0: Exit DoLoopCall drawdotAll()2.4.6 静态绘图函数 ( dr
17、aw dot All )静态数据绘图时涉及到对曲线上某点数据的读取、 图形的缩放控制、 曲线的显隐控制的操作。 对于取出曲线上某点数值, 我们当然可以调用 windows API 函数像画图板一样在屏幕的右下脚显示经过换算, 表示采样值的坐标信息。 这样的界面固然很友好, 但是这需要用户较高的鼠标操作技巧。于是我们提供了一个纵向的取值轴, 通过控制这个轴的移动来取出轴线所在点的数据。 这样在只有 1 屏幕的曲线时, 可以很方便的找出轴线与曲线上点的对应关系。 可是当曲线经过放大时这种对应关系变得相当的复杂, 我们固然可以找出这种对应的关系, 可是编程过程会变得相当的复杂, 还会引入有关曲线擦除
18、等方面相当多的问题, 程序的可读性将大为下降。 为了能实现良好的缩放控制, 减小编程难度, 这里实际每次放大或缩小以及当参照轴移到了绘图区最后的时候,都重新计算了绘图的起点, 所有的图形重绘以及参照轴的移动距离都以该新的绘图起点为准。屏数 =Int(tmpData(controlx,9)/(caiyangzhq/0.1)*100*rT(rP)/6000)屏距 =tmpData(controlx,9)/(caiyangzhq/0.1)*100*rT(rP) Mod 6000j0 = pingshu * 6000这里 j0 得到以 6000 为基数的距离信息作为绘图新的起点 , 将采样数组中各点的
19、时间减去绘 pingshu 屏曲线对应的时间 , 也即实现了绘图起点的移动。2.4.7 图形数据分析按钮数据分析按钮动态绘图时, 提供了曲线上数据值的读取 ; 在停止数据记录后以及数据文件打开时, 还提供了曲线的缩放功能。 由于所处的绘图状态不同这里做了不同的处理, 在动态绘图时参照轴用一条 Line 控件, 它同动态绘图一样采用了回头函数的算法, 来跟踪绘图点的数据。 而在静态绘图时, 还可以调用缩放功能, 参照轴移动到特定位置时对图形进行一次重绘, 而且这里 Line 控件的坐标由屏距量来提供。 由在重绘程序中采用了适当的算法, 在原比例绘图时最多只画出 6000 个点, 这样的重绘过程是
20、很快, 没有明显的延迟或画面的闪烁。2.4.8 部分细节处理Shine 函数 : 为了提示用户当前的绘图比例下, 图上每格代表的时间, 在绘图区右上脚有一个 Label 它在 timer 的控制下闪烁显示。 实现方法 : 不断的对 Label 的可视属性取反。Private Sub Timer2_Timer()Label5.Visible = Not Label5.VisibleLabel5.Caption=2*(caiyangzhq/0.1)/rT(rP) 利用各环节的组合来模拟各种被控对象 ; 数字、 模拟调节器的整定等。 此外, 它还提供了两路外部的输入接口, 可以提供给微型计算机控制及
21、接口技术实验等要求对高速数据采集进行图形化数据显示的领域使用。参考文献1 谭浩强 . Visual Basic 程序设计实训教程 M. 北京 :清华大学出版社 , 2006.2 刘炳文 , 李凤华 .VB6.0 Win32API 程序设计 M. 北京 :清华大学出版社 , 2001.3 石教英 , 彭群生译 . 计算机图形学算法基础 M. 北京 :机械工业出版社 , 2002.作者简介董绵绵 ( 1981 ), 女, 陕西西安人, 西安工业大学助教, 西安电子科技大学硕士研究生, 主要研究方向 : 移动通信、 通信信号处理 ;郭宝亿 ( 1979 ), 男, 陕西西安人, 西安工业大学助教, 硕士研究生。动态数据采集系统的图形化数据显示