📄 m71.htm
字号:
<html>
<head>
<title>VB教程</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<p align="center"><script src="../../1.js"></script></a>
<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center>
<table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
<tbody>
<tr>
<td bgcolor=#000000 height=9>
<div align=center class=H1> <font color="#FFFFFF">应用VB4.0实现工业控制的实时曲线和历史曲线</font> </font> </font></div>
</td>
</tr>
<tr valign=top>
<td class=H1 height=76>
<p align="left"> <br>
<font color="#0066FF" class="unnamed1"> </font></font> <font color="#0066FF" class="unnamed1"><font color="#000000">在大型的工业现场控制中,一般用DCS(集散控制系统)来实现过程控制。在DCS中,实时曲线可显示该控制点的当前趋势,以监测该点在现场工况变化的情况下的
控制稳定性,历史曲线可观察过去一段时间内某一点的变化趋势,并供工艺人员分 析工艺流程的稳定性和故障原因。然而在小型的工业控制中,由于控制规模小,控
制回路少,因此可用PC机就能完成整个过程控制,在实时曲线和历史曲线方面,可用VB4.0就能实现,并可与大型的DCS相媲美。<br>
[实时曲线] 实时曲线反映的是现场数据的实时性和当前趋势,因此在实现时需显示<br>
曲线的动态变化,参考DCS,当前点在曲线的最右端显示,而整个曲线动态地向左移<br>
动。 <br>
具体实现如下:<br>
1、选择需要显示的窗体Form1,加入图片框Picture1,根据实际需要设置图片的大小<br>
并移到合适的位置,并在图片的外面画好量程----时间坐标系;<br>
2、 在全局模块中定义位块传输API函数BitBlt( )和全局变量:<br>
Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As
<br>
Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal
<br>
hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyle
As <br>
Long) As Long<br>
Gobal S As Long `量程<br>
Gobal L As Long `上一次的纵坐标值<br>
Gobal T As Integer `上一次时间值(分)<br>
3、 Private Sub Form1_Load()<br>
Picture1.AutoRedraw = False `曲线不重画<br>
Picture1.ScaleMode = 3 `以象素方式(Pixel)<br>
L = -1 `设置初值<br>
S = 400<br>
T = -1<br>
End Sub<br>
4、 根据现场数据采集的采样频率,设置定时器Timer1的定时值,曲线移动就在<br>
Timer1实现:<br>
Private Sub Timer1_Time()<br>
Dim w As Long, h As Long, y1 As Long, Data As Long <br>
Dim hBmp As hDC, ShowMode As Long, ii As Long, t1 As Integer<br>
w = Picture1.Width<br>
h = Picture1.Height<br>
hBmp = Picture1.hDC<br>
ShowMode = &HCC0020 `ROP模式(复制)<br>
Data = Get_RealDatabase( ) `从实时数据库取当前监控值<br>
y1 = (S - Data) / S * h `根据量程转变成具体坐标 <br>
ii = BitBlt(hBmp,0,0,w-1,h,hBmp,1,0,ShowMode) `整个曲线右移一个像素点<br>
Picture1.Line (w - 1,y) - (w,y1) , RGB(0,255,0) <br>
y = y1<br>
t1 = Val(Mid$(Time$,3,2))<br>
If T < > t1 Then `在曲线下方显示时间(用分表示)<br>
Picture1.CurrentX = w - 16<br>
Picture1.CurrentY = h - 8<br>
Picture1.Print Mid$(Time$,1,5)<br>
T = t1<br>
End If<br>
End Sub<br>
[历史曲线] 历史曲线反映的是过去一段时间内某个监测点的变化趋势,其曲线走向<br>
是从左向右方向发展的,与实时曲线走向正好相反,如图(2)所示。由于历史数据库<br>
保存的时间长,一般为一个月、三个月或者更长,因此其数据量特别大,在实现时<br>
只能显示其中的一段曲线,而不能在图片上一次画好,否则其显示速度将非常慢。<br>
具体实现如下:<br>
<br>
1、 在窗体Form2中加入图片框Picture2,在图片框的下方加入四个按钮,分别为曲<br>
线右移4小时按钮Command1、曲线右移8小时按钮 Command2、曲线左移4小时按钮<br>
Command3和曲线左移8小时按钮Command4。<br>
2、 设历史曲线一分钟存储一个数据,并设一个像素点画一小段直线,因此对于8小<br>
时的曲线,图片的宽度为480 Pixel,而对于4个小时的曲线,则两个像素点画一小<br>
段直线,具体设置如下:<br>
Picture2.ScaleMode = 3 : Picture2.AutoRedraw = False<br>
Picture2.Width = 480 : Picture2.Height = 120<br>
3、 在窗体级变量中定义以下变量:<br>
Dim S As Long `被测点的量程<br>
Dim FileNo As Long `历史数据库的记录号<br>
Dim Htime As Date `被测点对应的历史时间<br>
4、 Private Sub Form2_Load( )<br>
t$ = FileDateTime("C:\HDB\HistoryData.dat") `获得历史数据库存储时间<br>
Htime = TimeValue(Mid$(t$, Len(t$)-8, 8)) <br>
Open "C:\HDB\HistoryData.dat" For Random As #1 Len = 4 `打开历史数据库,<br>
每个记录存放一 个单精度数<br>
S = 400 `设置量程<br>
End Sub<br>
5、Private Sub Command1_Click( )<br>
`曲线右移4个小时<br>
Dim w As Long. h As Long, i As Long, j As Long<br>
Dim y1 As Long, y2 As Long, y As Single<br>
Picture2.Picture = LoadPicture("") `清曲线 <br>
w = Picture2.Width<br>
h = Picture2.Height<br>
Picture2.Line (0,0) - (w-1,h -20 -1) ,RGB(127,127,127),B `用灰色在图片上<br>
画网格<br>
For i = 1 To 4<br>
Picture2.Line(0,i*20) - (w-1,i*20),RGB(127,127,127)<br>
Next i <br>
For i = 1 To 7<br>
Picture2.Line(i*60,0) - (i*60,h-20-1),RGB(127,127,127)<br>
Next i <br>
y1= -1<br>
i = 0<br>
j=0<br>
Do While Not EOF(#1 ) AND i < w<br>
Get #1,y<br>
y2 = (S -y)/S*h `根据量程转换为具体坐标值<br>
If y1 < > -1 Then<br>
Picture2.Line (i , y1) - (i+2, y2) , RGB(0,255,0) `用绿色画曲线<br>
i = i+2<br>
y1 = y2<br>
End IF<br>
j = j+1<br>
If j = 60 Then '显示时间(用小时显示)<br>
Htime = TimeValue(Htime)+TimeValue("01:00:00")<br>
j = 0<br>
Picture2.CurrentX= i -10<br>
Picture2.CurrentY= h -20<br>
Picture2.Print Hour(Htime)<br>
End If<br>
End Do<br>
FileNo = Seek(#1) `获得历史数据库的记录号<br>
End Sub <br>
6、Private Sub Command3_Click( )<br>
`曲线左移4个小时<br>
Dim w As Long. h As Long, i As Long, j As Long<br>
Dim y1 As Long, y2 As Long, y As Single<br>
Picture2.Picture = LoadPicture("") `清曲线 <br>
w = Picture2.Width<br>
h = Picture2.Height<br>
Picture2.Line (0,0) - (w-1,h -20 -1) ,RGB(127,127,127),B `用灰色在图片上<br>
画网格<br>
For i = 1 To 4<br>
Picture2.Line(0,i*20) - (w-1,i*20),RGB(127,127,127)<br>
Next i <br>
For i = 1 To 7<br>
Picture2.Line(i*60,0) - (i*60,h-20-1),RGB(127,127,127)<br>
Next i <br>
y1= -1<br>
i = 0<br>
j=0<br>
If FileNo >240 Then `记录指针往前移240个记录<br>
FileNo = FileNo - 240 <br>
Seek #1,FileNo<br>
Htime = TimeValue(Htime) - TimeValue("04:00:00") `时间左移4个小时<br>
End If<br>
Do While Not EOF( #1) AND i < w<br>
Get #1,y<br>
y2 = (S -y)/S*h<br>
If y1 < > -1 Then<br>
Picture2.Line (i , y1) - (i+2, y2) , RGB(0,255,0) `用绿色画曲线<br>
i = i+2<br>
y1 = y2<br>
End IF<br>
j = j+1<br>
If j = 60 Then '显示时间(用小时显示)<br>
Htime = TimeValue(Htime)+TimeValue("01:00:00")<br>
j = 0<br>
Picture2.CurrentX= i -10<br>
Picture2.CurrentY= h -20<br>
Picture2.Print Hour(Htime)<br>
End If<br>
End Do<br>
FileNo = Seek(#1) `获得历史数据库的记录号<br>
End Sub <br>
至于曲线左移8小时和右移8小时,可以参考上述的方法,在画两点之间的直线时,<br>
以一个像素点为一小段直线,这里不一一举例。<br>
<br>
<br>
(通讯地址:南京炼油厂计量站 邮政编码:210033)</font></font>
</font> <br>
</table>
</div>
<p align="center"><a href="../../pian/vb.htm">回首页</a>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -