用VB實現工業控制的實時曲線和歷史曲線

在大型的工業現場控制中,一般用DCS(集散控制系統)來實現過程控制。在DCS中,實時曲線可顯示該控制點的當前趨勢,以監測該點在現場工況變化的情況下的控制穩定性,歷史曲線可觀察過去一段時間內某一點的變化趨勢,並供工藝人員分析工藝流程的穩定性和故障原因。然而在小型的工業控制中,由於控制規模小,控制迴路少,因此可用PC機就能完成整個過程控制,在實時曲線和歷史曲線方面,可用就能實現,並可與大型的DCS相媲美。
[實時曲線]
實時曲線反映的是現場數據的實時性和當前趨勢,因此在實現時需顯示曲線的動態變化,參考DCS,當前點在曲線的最右端顯示,而整個曲線動態地向左移動。

具體實現如下:
1、選擇需要顯示的窗體Form1,加入圖片框Picture1,根據實際需要設置圖片的大小並移到合適的位置,並在圖片的外面畫好量程----時間座標系;
2、 在全局模塊中定義位塊傳輸API函數BitBlt( )和全局變量:
Declare Function BitBlt Lib "GDI32" (ByVal hDestDC AS Long,ByVal X As Long,ByVal Y As Long,ByVal nWidth As Long,ByVal nHeight As Long,ByVal hSrcDC As Long,ByVal xSrc As Long,ByVal ySrc As Long,ByVal DrawStyleAs Long) As Long
Gobal S As Long `量程
Gobal L As Long `上一次的縱座標值
Gobal T As Integer `上一次時間值(分)
3、 Private Sub Form1_Load()
Picture1.AutoRedraw = False `曲線不重畫
Picture1.ScaleMode = 3 `以象素方式(Pixel)
L = -1 `設置初值
S = 400
T = -1
End Sub
4、根據現場數據採集的採樣頻率,設置定時器Timer1的定時值,曲線移動就

Timer1實現:
Private Sub Timer1_Time()
Dim w As Long, h As Long, y1 As Long, Data As Long
Dim hBmp As hDC, ShowMode As Long, ii As Long, t1 As Integer
w = Picture1.Width
h = Picture1.Height
hBmp = Picture1.hDC
ShowMode = &HCC0020 `ROP模式(複製)
Data = Get_RealDatabase( ) `從實時數據庫取當前監控值
y1 = (S - Data) / S * h `根據量程轉變成具體座標
ii = BitBlt(hBmp,0,0,w-1,h,hBmp,1,0,ShowMode) `整個曲線右移一個像素點
Picture1.Line (w - 1,y) - (w,y1) , RGB(0,255,0)
y = y1
t1 = Val(Mid$(Time$,3,2))
If T < > t1 Then `在曲線下方顯示時間(用分表示)
Picture1.CurrentX = w - 16
Picture1.CurrentY = h - 8
Picture1.Print Mid$(Time$,1,5)
T = t1
End If
End Sub
[歷史曲線]
歷史曲線反映的是過去一段時間內某個監測點的變化趨勢,其曲線走向是從左向右方向發展的,與實時曲線走向正好相反。由於歷史數據庫保存的時間長,一般爲一個月、三個月或者更長,因此其數據量特別大,在實現時只能顯示其中的一段曲線,而不能在圖片上一次畫好,否則其顯示速度將非常慢。

具體實現如下:
1、
在窗體Form2中加入圖片框Picture2,在圖片框的下方加入四個按鈕,分別爲曲線右移4小時按鈕Command1、曲線右移8小時按鈕Command2、曲線左移4小時按鈕Command3和曲線左移8小時按鈕Command4。
2、設歷史曲線一分鐘存儲一個數據,並設一個像素點畫一小段直線,因此對於8小時的曲線,圖片的寬度爲480Pixel,而對於4個小時的曲線,則兩個像素點畫一小段直線,具體設置如下:
Picture2.ScaleMode = 3 : Picture2.AutoRedraw = False
Picture2.Width = 480 : Picture2.Height = 120
3、 在窗體級變量中定義以下變量:
Dim S As Long `被測點的量程
Dim FileNo As Long `歷史數據庫的記錄號
Dim Htime As Date `被測點對應的歷史時間
4、 Private Sub Form2_Load( )
t$ = FileDateTime("C:/HDB/HistoryData.dat") `獲得歷史數據庫存儲時間
Htime = TimeValue(Mid$(t$, Len(t$)-8, 8))
Open "C:/HDB/HistoryData.dat" For Random As #1 Len = 4
`打開歷史數據庫,
每個記錄存放一 個單精度數
S = 400 `設置量程
End Sub
5、Private Sub Command1_Click( )
`曲線右移4個小時
Dim w As Long. H As Long, I As Long, j As Long
Dim y1 As Long, y2 As Long, y As Single
Picture2.Picture = LoadPicture("") `清曲線
w = Picture2.Width
h = Picture2.Height
Picture2.Line (0,0) - (w-1,h -20 -1) ,RGB(127,127,127),B `用灰色在圖片上
畫網格
For I = 1 To 4
Picture2.Line(0,I*20) - (w-1,I*20),RGB(127,127,127)
Next I
For I = 1 To 7
Picture2.Line(I*60,0) - (I*60,h-20-1),RGB(127,127,127)
Next I
y1= -1
I = 0
j=0
Do While Not EOF(#1 ) AND I < w
Get #1,y
y2 = (S -y)/S*h `根據量程轉換爲具體座標值
If y1 < > -1 Then
Picture2.Line (I , y1) - (I+2, y2) , RGB(0,255,0) `用綠色畫曲線
I = I+2
y1 = y2
End IF
j = j+1
If j = 60 Then '顯示時間(用小時顯示)
Htime = TimeValue(Htime)+TimeValue("01:00:00")
j = 0
Picture2.CurrentX= I -10
Picture2.CurrentY= h -20
Picture2.Print Hour(Htime)
End If
End Do
FileNo = Seek(#1) `獲得歷史數據庫的記錄號
End Sub
6、Private Sub Command3_Click( )
`曲線左移4個小時
Dim w As Long. H As Long, I As Long, j As Long
Dim y1 As Long, y2 As Long, y As Single
Picture2.Picture = LoadPicture("") `清曲線
w = Picture2.Width
h = Picture2.Height
Picture2.Line (0,0) - (w-1,h -20 -1) ,RGB(127,127,127),B `用灰色在圖片上
畫網格
For I = 1 To 4
Picture2.Line(0,I*20) - (w-1,I*20),RGB(127,127,127)
Next I
For I = 1 To 7
Picture2.Line(I*60,0) - (I*60,h-20-1),RGB(127,127,127)
Next I
y1= -1
I = 0
j=0
If FileNo >240 Then `記錄指針往前移240個記錄
FileNo = FileNo - 240
Seek #1,FileNo
Htime = TimeValue(Htime) - TimeValue("04:00:00") `時間左移4個小時
End If
Do While Not EOF( #1) AND I < w
Get #1,y
y2 = (S -y)/S*h
If y1 < > -1 Then
Picture2.Line (I , y1) - (I+2, y2) , RGB(0,255,0) `用綠色畫曲線
I = I+2
y1 = y2
End IF
j = j+1
If j = 60 Then '顯示時間(用小時顯示)
Htime = TimeValue(Htime)+TimeValue("01:00:00")
j = 0
Picture2.CurrentX= I -10
Picture2.CurrentY= h -20
Picture2.Print Hour(Htime)
End If
End Do
FileNo = Seek(#1) `獲得歷史數據庫的記錄號
End Sub
至於曲線左移8小時和右移8小時,可以參考上述的方法,在畫兩點之間的直線時,以一個像素點爲一小段直線,這裏不一一舉例。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章