基于VB的实时数据趋势曲线的实现

时间:2022-08-12 05:24:42

基于VB的实时数据趋势曲线的实现

摘要:针对国内现有的组态软件存在组态画面比较单调,且组态完的监控软件需要购买软件狗而涉及到的成本问题等实际状况,在分析了现有工业监控系统中监测数据的实时变化趋势的理论基础上,本文提出了基于VB 6.0软件编程实现监测数据实时趋势曲线的绘制方法,结合本校实验室的实际情况,在工业监控系统中的分析数据趋势变化方面取得了很好的成果。

关键词:VB;实时数据;趋势曲线

中图分类号:TP311文献标识码:A文章编号:1009-3044(2011)19-4614-04

Realizing Drawing Real-time Trend Curve on VB

ZHANG Chun-yan,GE Ming-ming,TANG Hai-feng

(Biochemical Engineering College, Beijing Union University, Beijing 100023, China)

Abstract: In domestic, the Configuration software is rather monotonous in the existence of the configuration screen, and after configuring the software, we need to purchase the dog of software. Based on analyzing the theory of the monitoring data's real-time trends in the industrial testing and controlling system, this article introduces the program of drawing the real-time trend curve with VB. With the actual situation in our laboratory, there is a good result in industrial monitoring and control system analysis of data trends.

Key words: VB; real-time data; trend curve

工业控制系统软件中,常常需要实时的将监测对象的数据趋势曲线显示出来,以便于操作人员观测,及时发现问题并解决问题。VB(Visual Basic)是面向对象的可视化设计工具,既具有效率高、界面友好的功能,又可以使用DLL来实现I/O端口的输入功能,还可以通过API函数或Mscomm控件实现串口通信。VB作为Windows软件开发工具,具有丰富的图形功能[2],可方便快速地绘制各种图形。本文将着重介绍开发测控软件中的一个重要环节――实时数据趋势曲线的实现。

1 实时趋势曲线及设计原理

趋势显示是用于显示被测、被控变量,设定值和输出值等模拟量的变化趋势,以便操作人员了解被测、被控变量的变化,从而有利于对过程的分析和研究。实时趋势显示就是将每一个采样时刻和采集数据都显示在趋势显示画面的一种趋势显示。实时趋势曲线反映的是现场数据的实时性,以监测该被测点在现场实际变化的情况下的控制稳定性,因此在实现中需显示曲线的动态变化。

无线测控软件的设计原理是通过无线接收设备将下位机传感器端的数据读取到上位机的数据库中存储,同时上位机将读到的最新数据以曲线的形式实时地显示。本文采用基本的绘图方法――line方法绘制实时曲线,通常line方法只能绘制静态曲线,但是若将曲线分成若干段,隔一定的时间间隔,就可以在绘图区将它们分别显示,如果时间间隔选择得当,那么曲线将动态显示出来。设计流程简图如图1所示。

2 实时曲线程序设计

界面上显示的曲线是从当前时刻到经过一个时间间隔之后的曲线,此处的时间间隔可以在界面上进行设置,时间间隔单位可以为分钟或小时,时间坐标经过一定的时间间隔需要进行变换,实时曲线每隔1秒(曲线的绘制时间需根据下位机上传数据的时间来设定)绘制一次[1]。为了更清楚的观测监测对象,纵坐标的数值范围也可以根据实时的数据进行调整。

创建一个form窗体,在此窗体上创建一个绘制曲线的picturebox容器。

2.1 窗体级变量声明

Dim xleft As Single, ytop As Single, xwidth As Single, yheight As Single, jiange As Integer

Dim xleftline As Single, last_data As Single

Dim rs_line As ADODB.Recordset, strSql_line As String

2.2 窗体初始化程序

在窗体加载时,调整好横纵坐标标签的位置,并读取数据库中的数据。其中,横坐标刻度线的X坐标值取决于picture1控件的left属性,Y坐标值取决于picture1控件的top属性和height属性。

Private Sub Form_Load()

Dim i As Integer /* 调整横坐标刻度线 */

For i = 1 To 9 Step 2

Line1(i).x1 = Picture1.left + i * 1000:Line1(i).x2 = Picture1.left + i * 1000

Line1(i).Y1 = Picture1.top+Picture1.height

Line1(i).Y2 = Picture1.top+Picture1.height+40

Next i

For i = 0 To 10 Step 2

Line1(i).x1 = Picture1.left + i * 1000:Line1(i).x2 = Picture1.left + i * 1000

Line1(i).Y1 = Picture1.top+Picture1.height

Line1(i).Y2 = Picture1.top+Picture1.height+90

Next i

/* 调整横坐标时间标签的位置 */

Call show_time

/* 调整纵坐标数值标签的位置 */

For i = 1 To 5

Label4(i).Top = Label4(0).Top - Picture1.left * i

Label4(i).Left = Label4(0).Left - 100

Next i

/* 调用绘制曲线背景界面的函数 */

jiange = Val(Combo2.Text)

Call zuobiaoxi

xleftline = xleft

strSql_line = "select * from TestData"

Set rs_line = getRS(strSql_line)

End Sub

2.3绘制坐标网格的程序

为了实现界面美观,给趋势曲线界面绘制背景网格线。

Sub zuobiaoxi()

Picture1.DrawWidth = 1:Picture1.FillStyle = 0

xleft = 0:ytop = Val(Label4(5).Caption)

xwidth = jiange * 60:yheight = Val(Label4(5).Caption) - Val(Label4(0).Caption)

Picture1.Scale (xleft, ytop)-(xwidth, ytop + yheight)

Dim fenduan As Integer:fenduan = 20

Dim a As Integer

For a = 0 To fenduan

If a Mod 4 = 0 Then

Picture1.DrawStyle = 0

Else

Picture1.DrawStyle = 2

End If

Picture1.Line (xleft + a * (xwidth / fenduan), ytop)-(xleft + a * (xwidth / fenduan), ytop + yheight), RGB(220, 220, 220)

Next a

For a = 0 To 10

If a Mod 2 = 0 Then

Picture1.DrawStyle = 0

Else

Picture1.DrawStyle = 2

End If

Picture1.Line (xleft, ytop + a * yheight / 10)-(xwidth, ytop + a * yheight / 10), RGB(220, 220, 220)

Next a

End Sub

2.4 横坐标时间刻度的程序

创建一个标签控件数组Label3,以便显示趋势曲线的时间显示区间。区间的大小由jiange变量的值决定。由于篇幅有限,这里仅介绍以“分钟”作为间隔单位,关于以“小时”为间隔单位的程序代码,可依据此程序自行设计。

Sub show_time()

/* 刻度 */

Dim h As String, m As String, s As String

Label3(0).Caption = Time

h = Hour(Label3(0).Caption):m = Minute(Label3(0).Caption)

s = Second(Label3(0).Caption)

For i = 1 To 5

If (Minute(Label3(0).Caption) + Int((jiange / 5)) * i) >= 60 Then

m = Minute(Label3(0).Caption) + Int((jiange / 5)) * i - 60

If Hour(Label3(0).Caption) >= 23 Then

h = Hour(Label3(0).Caption) + 1 - 24

Else

h = Hour(Label3(0).Caption) + 1

End If

Else

m = Minute(Label3(0).Caption) + Int((jiange / 5)) * i

End If

If m < 10 Then

Label3(i).Caption = Trim(Str(h)) & ":0" & Trim(Str(m)) & ":" & Trim(Str(s))

ElseIf s < 10 Then

Label3(i).Caption = Trim(Str(h)) & ":" & Trim(Str(m)) & ":0" & Trim(Str(s))

ElseIf m < 10 And s < 10 Then

Label3(i).Caption = Trim(Str(h)) & ":0" & Trim(Str(m)) & ":0" & Trim(Str(s))

Else

Label3(i).Caption = Trim(Str(h)) & ":" & Trim(Str(m)) & ":" & Trim(Str(s))

End If

Next i

End Sub

2.5 纵坐标数值刻度的程序

为了更清晰的观察曲线的变化趋势,操作人员需要随时调整曲线的数值界限,为此,创建一个文本框控件数组,设置其name属性值为Vertical_Txt。其中index属性值为0的文本框用来调整纵坐标的最小值,index属性值为1的文本框用来调整纵坐标的最大值。再创建一个标签控件数组,Label4用来显示纵坐标值,index属性值从0到5,共6个成员。纵坐标刻度调整功能的实现由文本框的Change事件触发。

Private Sub Vertical_Txt_Change(Index As Integer)

Dim i as integer

Select Case Index

Case 0:

If Val(Vertical_Txt (0).Text) < Val(Label4(5).Caption) Then

For i=0 to 4

Label4(i).Caption = Val(Vertical_Txt (0).Text) + (Val(Label4(5).Caption) - Val(Label4(0).Caption)) / 5*i

Next i

End If

Case 1:

If Val(Vertical_Txt (1).Text) > Val(Label4(0).Caption) Then

For i=5 to 1

Label4(i).Caption = Val(Vertical_Txt (1).Text) + (Val(Label4(5).Caption) - Val(Label4(0).Caption)) / 5*(5-i)

Next i

End If

End Select

/* 当纵坐标的数值刻度调整时,横坐标的时间刻度也需实时调整 */

Picture1.Cls

Call zuobiaoxi

xleftline = 0

Label3(0).Caption = Time

Call show_time

End Sub

2.6 曲线绘制程序

Timer控件是实时曲线绘制的重要控件。设定好合适的采样时间间隔,就可以绘制出动态的实时趋势曲线,控件Timer1的interval属性值假设为1000,即采样时间间隔为1s,曲线向前移动的位移量为(Timer1.Interval \ 1000),即1个单位。实时趋势曲线绘制功能的实现由Timer事件触发。

Private Sub Timer1_Timer()

If Label3(5).Caption = Time Then/*完成一次采用周期后,重新调整横坐标*/

Label3(0).Caption = Label3(5).Caption

xleftline = 0

jiange = Val(Combo2.Text)

If jiange = 0 Then jiange = 10

Call show_time:Call zuobiaoxi

End If

Picture1.Line (xleftline, ytop + (ytop - last_data))-(xleftline + Timer1.Interval \ 1000, ytop + (ytop - rs_line!TestData)), vbRed

xleftline = xleftline + Timer1.Interval \ 1000

last_data = rs_line!TestData

If rs.EOF = True Then

Picture1.Line (xleftline, ytop + (ytop - last_data))-(xleftline + Timer1.Interval \ 1000, ytop + (ytop - last_data)), vbRed

Else

rs_line.MoveNext

EndIf

End Sub

3 运行界面

程序启动后的运行界面如图2所示。

纵坐标调整后的曲线界面如图3所示。

图2 实时曲线启动画面 图3 纵坐标调整后的运行界面

4 结论

实时数据曲线绘制是测控系统中的重要功能模块,本文详细介绍了利用VB编程绘制实时数据曲线的绘制方法。本文仅给出了在同一个绘图窗口中绘制一条动态数据曲线,如需要同时显示多条数据曲线,只需把文中程序作简单扩充即可。

实时趋势曲线为我校某实验室中央空调测控系统的一部分,经测试运行,能很好的反映被监控对象的趋势变化,系统稳定性好,且本程序具有一定的通用性和实用价值。

参考文献:

[1] 张国忠,聂文霞,陈正.基于VB的实时数据趋势曲线的实现[J].电脑学习,2000(10):24-26.

[2] 关维娟,陈清华.利用VB编程实现实时数据曲线绘制[J].信息技术,2005(10):76-78.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:虚拟演播室技术在电视节目制作中的应用 下一篇:CyboCon无模型控制器在炼化装置上的应用