2024年7月3日发(作者:)
在工控制软件中,实时曲线的绘制用途非常的广泛,它可以很直观的显示出监控
数据的变化值和变化趋势。在VB中实现曲线的绘制有很多种方法,本文介绍一
种非常简单的方法来实现实时曲线的绘制。
在VB中实现实时曲线的绘制,要利用VB的PictureBox(图像)控件,和画线
函数line(x1,y1)-(x2,y2)。PictureBox控件,可以作为一个“容器”,在它的里面可
以包含很多的对象。也可以执行很多VB的内部函数。
要实现实时曲线的绘制,肯定要有外部实时数据的输入,这里假设是有一个数据
从计算机的串口输入 定义该数据变量为DataFromCom。实时曲线反映的就是
该数据。
打开VB6.0中文版,新建一个项目和窗体,修改窗体的属性,将“Heigh”修改为:
8000,“Width”修改为在窗体中放如一个PictureBox控件。然后重新定义
PictureBox控件的一些基本属性,在VB中选中PictureBox控件,直接在它的
属性框中,修改一些属性参数。“名称”改为Pic。 “AutoRedraw”改为:True。
“BackColor”改为:&H00004000&(墨绿色背景颜色)。”Heigh”改为:5000。“Width”
改为:8000。如图1所示:
然后要重新定义PictureBox控件的坐标系。图像框的默认坐标系,是从左上角
开始的,不符合我们的画线要求。修改坐标系的目的是让曲线从图像框的左边正
中间,开始画线。修改图像框的坐标系,这里定义一个过程PicScale(),代码如下:
Private Sub PicScale(picX As PictureBox)
(0, eight)-(idth, -eight)
End Sub
一般的实时曲线显示的时候在屏幕的正中间有一条基准线,这里也要画出这条基
准线,用一个过程PicMidleLine()来实现,代码如下:
Private Sub PicMidleLine( picX As PictureBox)
(0, 0)-(idth, 0), vbGreen '画出中线
End Sub
要画一条实时曲线,坐标轴的设定很重要,在这里把X轴设定为时间轴,Y轴设
定为数据轴。对应X轴我们定义一个时间变量TimeCount,TimeCount会随着时
间逐渐递增,每次递增,对应着一个从串口读过来的数据DataFromCom,这样
图像框中的(x,y)坐标点实际上就对应着(TimeCount,DataFromCom)如果只
是当TimeCount发生变化时就在图像框上画一个点,就只需调用VB中的画像
素的函数point(x,y),这里x,y为所画的点的坐标。单这样画出来的是一个个不
连续的点。我们想要的是实时的连续的曲线,所以要调用VB中的画线的函数
line(x1,y1)-(x2,y2),这里(x1,y1)(x2,y2)为所要画的线的起点和终点的坐标。
只要把上次串口读过来的数据(这里把它定义为变量DataFromComLast)和现
在串口读过来的数据(DataFromCom)和TimeCount相对应,调用
line(x1,y1)-(x2,y2)函数就可以在图像框中画出实时的曲线了。把它写成一个过程
如下面的代码:
Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer,
DataFromComX As Integer, DataFromComLastX As Integer)
If TimeCountX - 1 > 0 Then
(TimeCountX - 1, DataFromComLastX)-(TimeCountX,
DataFromComX), vbWhite
End If
End Sub
有了三个过程就可以在图像框中画出一条实时的曲线了。
DrawRealLine()过程中的 (TimeCountX - 1,
DataFromComLastX)-(TimeCountX, DataFromComX), vbWhite所画线的起始
点和结束点都是以像素为单位的,这样以来如果不改变的话,画出来的线将是一
个屏幕上像素相连的很密的曲线,通过调整line(x1,y1)-(x2,y2)
中的x的值,就可以画出分布密度不一样的曲线,这里为了在屏幕上能够看到不
是很密的曲线我们把x乘以一个系数10,修改为:
((TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10,
DataFromComX), vbWhite
这比较容易在屏幕上看到稀疏的曲线。
由于是仅仅讲解如何画出实时的曲线,读者的计算机上未必有和串口相连的设
备,这里用一个定时器控件来模拟从串口读过来的数据。在窗体上放入一个
Timer控件,修改Timer控件的属性为:“Enable”该为True,“Interval”改为300。
双击Timer控件在它的过程中,添加代码后如下:
Private Sub Timer1_Timer()
DataFromComLast = DataFromCom
Randomize
DataFromCom = 3000 * Rnd
TimeCount = TimeCount + 1
DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLast
End Sub
这样在运行后就可以看到我们想要的实时曲线了,如下图:
图 2
下面是完整的代码:
Option Explicit
Dim DataFromCom As Integer '从串口读过来的实时值
Dim DataFromComLast As Integer '上次的串口值
Dim TimeCount As Integer
Private Sub Form_Load()
PicScale Pic '调整图像框的坐标系
PicMidleLine Pic '在图像框中画一条中线
End Sub
Private Sub PicScale(picX As PictureBox) '调整图像框的坐标系
(0, eight)-(idth, -eight)
End Sub
Private Sub PicMidleLine(picX As PictureBox) '在图像框中画一条中线
(0, 0)-(idth, 0), vbGreen '画出中线
End Sub
Private Sub DrawRealLine(picX As PictureBox, TimeCountX As Integer,
DataFromComX As Integer, DataFromComLastX As Integer)
If TimeCountX - 1 > 0 Then
((TimeCountX - 1) * 10, DataFromComLastX)-(TimeCountX * 10,
DataFromComX), vbWhite
End If
End Sub
Private Sub Timer1_Timer()
DataFromComLast = DataFromCom
Randomize
DataFromCom = 3000 * Rnd
TimeCount = TimeCount + 1
DrawRealLine Pic, TimeCount, DataFromCom, DataFromComLast '画出实时
的曲线
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
在VB中绘制实时曲线是比较难的,一般要应用第三方控件或是Windows API函
数来完成,但是如果你对实时曲线的要求不是很高,只要能表示出当前的一般情况
的话,我们可以直接应用VB提供给我们的空间来完成.
原则上讲,直接在Form里绘制曲线都是可以的,MSDN上面很多例程就
是直接在Form里面绘制图形的,Form作为绘制图形的容器,不过一般应用中
Form中不可避免的会有很多其他控件,所以我们选择PictureBox作为绘制曲线
的容器.
实时曲线的绘制一般借助于Timer控件来完成,使用Timer控件,定期将
串口或是其他仪器中监测到的数据送往PictureBox1,而曲线的绘制一般画成折
线图,采用PictureBox1的Line方法绘制.具体实现如下:
1.选择需要显示的窗体Picture1,加入图片框Picture1,根据实际需要设
置图片的大小并移到合适的位置,并在图片的外面画好量程----时间坐标系;然
后加上Timer控件以及两个CommandButton,界面就基本设置好了.
2.建立坐标系,根据Picture1的大小和高度设置画出坐标系的X轴和Y轴:
Picture1 .ScaleMode = 1 „以VB的基本单位作为建立坐标轴以及绘制图形的
单位;
h
tX = eft +100
tY = op
eight - 100
(eft+100,op+100)-(
eLeft+100, eight - 100)
tX = eft +100
tY = eight
“(0,0)”
(eft + 100, eight -
100)-(idth - 100, eight - 100)
tX = idth
tY = eight
idth-100
draw = True „必要时,用存储在内存中的图象进行重绘
3.绘制曲线并保存,我们这里以正弦曲线作为绘制曲线的数据来源,具体
应用是可以采用由串口或其他仪器采集得到的数据.首先我们绘制一条中线,然后
在Timer控件的Time事件中绘制曲线:
(eft, CInt(eight /
2))-(idth, CInt(eight / 2)) „绘制中线
Private Sub Timer1_Timer()
Dim y1 As Integer
y1 = CInt(Sin((x - ) / 20 / 180 * pi) * eight / 2)
y1 = CInt((eight + 1000) / 2) - y1
(x, y)-(x + 20, y1)
x = x + 20
y = y1
If x >= idth Then
SavePicture , "c:" „保存图画,
实时曲线的绘制一般借助于Timer控件来完成,使用Timer控件,定期将串口或是其他仪器中
监测到的数据送往PictureBox1,而曲线的绘制一般画成折线图,采用PictureBox1的Line方法
绘制.具体实现如下:
1.选择需要显示的窗体Picture1,加入图片框Picture1,根据实际需要设置图片的大小并移到
合适的位置,并在图片的外面画好量程----时间坐标系;然后加上Timer控件以及两个
CommandButton,界面就基本设置好了.
2.建立坐标系,根据Picture1的大小和高度设置画出坐标系的X轴和Y轴:
Picture1 .ScaleMode = 1 „以VB的基本单位作为建立坐标轴以及绘制图形的单位;
h
tX = eft 100
tY = op
eight - 100
(eft 100,op 100)-(eft 100,
eight - 100)
tX = eft 100
tY = eight
“(0,0)”
(eft 100, eight - 100)-(idth -
100, eight - 100)
tX = idth
tY = eight
idth-100
draw = True „必要时,用存储在内存中的图象进行重绘
3.绘制曲线并保存,我们这里以正弦曲线作为绘制曲线的数据来源,具体应用是可以采用由串
口或其他仪器采集得到的数据.首先我们绘制一条中线,然后在Timer控件的Time事件中绘
制曲线:
(eft, CInt(eight / 2))-(idth,
CInt(eight / 2)) „绘制中线
Private Sub Timer1_Timer()
Dim y1 As Integer
y1 = CInt(Sin((x - ) / 20 / 180 * pi) * eight / 2)
y1 = CInt((eight 1000) / 2) - y1
(x, y)-(x 20, y1)
x = x 20
y = y1
If x >= idth Then
SavePicture , "c:" „保存图画,可以根据实际需要命名图片
x = 0
y = eight / 2
„清屏重画
End If
End Sub
从上面的过程可以看出,其实对于要求不高的实时曲线的绘制还是比较简单的,在这里我采
用的是清屏重画图像,如果要实现图像往左移动,图像仍然保留的效果,可以采用Windows的
Bitblt函数,可以让图像每次移动一个象素或是多少个twip,具体实现可以参见<<应用VB4.0
实现工业控制的实时曲线和历史曲线>>( ).
以上只是实时曲线绘制的一点简单说明,具体应用中可能需要花更多的功夫修饰图像,显示
时间(可以依据上面的代码中的实现),但是基本原理大同小异.
发布者:admin,转转请注明出处:http://www.yc00.com/news/1719963710a2759446.html
评论列表(0条)