唐 振 (安徽水利水電職業(yè)技術(shù)學(xué)院機電工程系,安徽 合肥 231603)
基于VB串口通信的實時水位數(shù)據(jù)采集軟件設(shè)計
唐 振 (安徽水利水電職業(yè)技術(shù)學(xué)院機電工程系,安徽 合肥 231603)
根據(jù)水位數(shù)據(jù)監(jiān)測的需求,介紹了Visuanl Basic串口通信和Access 2003數(shù)據(jù)庫,詳細闡述了基于Visual Basic程序設(shè)計的實時水位數(shù)據(jù)采集軟件界面和基于Access 2003的數(shù)據(jù)存儲實現(xiàn)過程。功能測試表明,利用該軟件可以準確地存儲每個水位監(jiān)測點的數(shù)據(jù)并實時顯示采集數(shù)據(jù),同時能對超出警戒水位的數(shù)據(jù)進行警報,適用于Windows平臺下的水位數(shù)據(jù)采集與監(jiān)控。
Visual Basic;串口通信;數(shù)據(jù)采集;實時顯示;Access 2003
中國水資源豐富,分布廣泛,但同時中國又是個缺水的國家,每年中國的旱澇災(zāi)害均造成大量的財產(chǎn)損失[1]。因此,將水位信息實時準確地采集到監(jiān)控中心具有重要意義[2]。水位信息的采集主要依靠各監(jiān)測點的水位傳感器通過通信網(wǎng)絡(luò)傳遞給監(jiān)控中心上位機,上位機負責將接收到的數(shù)據(jù)進行存儲和顯示[3]。下面,筆者基于VB串口通信設(shè)計實時水位數(shù)據(jù)采集軟件,通過該軟件實現(xiàn)如下功能:①對各監(jiān)測點數(shù)據(jù)要能進行實時準確的存儲,并顯示其水位狀態(tài);②對各監(jiān)測點的數(shù)據(jù)進行實時顯示及圖形曲線繪制,便于查看其趨勢;③當水位信息超過警戒水位(高于上限或低于下限)時要能發(fā)出警報,提醒工作人員注意。并存儲所有超警戒水位的具體信息以便分析和查看;④對串口信息、監(jiān)測點信息、警戒水位等相關(guān)信息進行設(shè)置和修改。
Visual Basic(簡稱VB)是一款優(yōu)秀的程序設(shè)計語言,適于設(shè)計程序界面,利用MSComm控件可以非常方便地開發(fā)出串口通信應(yīng)用程序。由于MSComm控件并不是VB的標準控件,因而在使用時需要先將其添加到控件箱中,具體步驟如下:選擇“工程”|“部件”命令,在出現(xiàn)的對話框中選擇“Microsoft Comm Controls 6.0”選項并單擊確定按鈕,這就將Mscomm控件添加到控件工具箱中了。
利用MSComm控件設(shè)計串口通信程序的基本步驟包括設(shè)置MSComm控件名稱、通信端口、設(shè)置緩沖區(qū)大小、設(shè)置字符模式、設(shè)置每次讀取的字符長度、傳送緩沖區(qū)的數(shù)據(jù)、取得緩沖區(qū)數(shù)據(jù)等。MSComm控件有很多基本屬性[4],其主要屬性如表1所示。
表1 MSComm控件的主要屬性
在設(shè)計程序前,通常要對主要屬性參數(shù)進行設(shè)置,其中InputMode參數(shù)為讀取數(shù)據(jù)的類型,InputMode=0表示數(shù)據(jù)為文本型(Unicode碼),InputMode=1表示數(shù)據(jù)為二進制類型(ASCII碼或GBK碼)[5]。InputLen表示要每次讀取緩沖區(qū)中的字符數(shù),InputLen=0表示一次接收完緩沖區(qū)中的所有數(shù)據(jù),其他參數(shù)可根據(jù)其含義進行相應(yīng)設(shè)置。設(shè)置參數(shù)后,即可編寫OnComm響應(yīng)事件。
實時水位信息采集軟件界面主要包含2個部分(見圖1),一部分為系統(tǒng)功能設(shè)置區(qū),主要進行串口參數(shù)、監(jiān)測點、數(shù)據(jù)庫、警戒水位和報警信息的設(shè)置;另一部分為實時數(shù)據(jù)采集區(qū),主要功能為顯示某個監(jiān)測點的實時數(shù)據(jù)采集情況。實時采集的數(shù)據(jù)主要通過以下3方面顯示:①當前數(shù)據(jù)值,即最近一次接收到的數(shù)據(jù);②實時圖形繪制,即顯示整個水位變化的趨勢;③近期水位列表,通過該表可以直觀地看出最近的200個水位數(shù)據(jù)。
在該軟件中,實時圖形繪制主要通過VB提供的PictureBox控件來完成。在用PictureBox控件繪制曲線時,首先應(yīng)設(shè)置繪圖框的區(qū)域,可通過scale屬性來完成,并設(shè)置背景顏色,繪圖曲線的寬度等基本屬性。然后,將采集點數(shù)值(預(yù)先存儲在datatemp()數(shù)組中)通過Line屬性來完成繪圖[6]。繪圖部分的參考程序如下所示:
Private Sub draw()
Dim X1 As Integer
Dim X2 As Integer
Dim Y1 As Integer
Dim Y2 As Integer
Picture1.Cls‘清除界面
Picture1.DrawWidth = 2 ‘設(shè)置線寬
Picture1.BackColor = QBColor(15) ‘背景色
Picture1.Scale (1, 100)-(200, 0) ‘繪圖尺寸
For j = 2 To num ‘繪制圖形
X1 = j - 2: Y1 = datatemp(j - 1)
X2 = j - 1: Y2 = datatemp(j)
Picture1.Line (X1, Y1)-(X2, Y2), QBColor(0)
Next j
End Sub
通過圖形曲線只能觀察水位信息的變化過程及趨勢,并不能直接讀出水位數(shù)據(jù),所以在圖形曲線邊上再設(shè)計一個數(shù)據(jù)表格,用以顯示最近采集的200個數(shù)據(jù),以便獲取準確信息。數(shù)據(jù)表格可通過MSFlexGrid控件來實現(xiàn),使用前和添加MSComm控件方法相同,在“部件”中將“Microsoft FlexGrid Control 6.0”添加到工具箱中,然后添加到窗體上。在控件中,首先將列表框設(shè)計為2列,一列為序號(1~200),表示可以記錄200個水位數(shù)據(jù);另一列為水位值,用以存儲獲取的具體水位信息。如果要觀察更多的歷史數(shù)據(jù),可點擊“數(shù)據(jù)庫查看”按鈕打開數(shù)據(jù)庫來查看歷史數(shù)據(jù),其實現(xiàn)代碼如下:
Private Sub tabinit()
Grid.Cols = 2 ‘共2列
Grid.Rows = 201 ‘連標題共201行
Grid.ColWidth(0) = 700: Grid.ColWidth(1) = 950
Grid.Col = 0
Grid.TextMatrix(0, 0) = “序號” ‘第1列標題
Grid.TextMatrix(0, 1) = “水位值” ‘第2列標題
For j = 1 To 200
Grid.Row = j: Grid.Text =“” + Str$(j)
Next j
Grid.TopRow = 1
Grid.LeftCol = 1
End Sub
考慮到水位數(shù)據(jù)信息量并不是很大,該軟件采用微軟的Access 2003作為數(shù)據(jù)庫,為此需要建立2個數(shù)據(jù)表,即監(jiān)測點信息表和數(shù)據(jù)采集表。監(jiān)測點信息表主要用來存儲監(jiān)測點的信息,主要字段有監(jiān)測點名、監(jiān)測點地址、警戒水位上限和警戒水位下限等。數(shù)據(jù)采集表主要按照時間順序?qū)⒉杉降臄?shù)據(jù)進行存儲,其主要字段包括監(jiān)測點名稱、監(jiān)測點地址、水位數(shù)據(jù)、接收時間和數(shù)據(jù)狀態(tài)等。另外,還可單獨建立一個報警信息表,按照時間順序?qū)⒊^警戒水位信息的數(shù)據(jù)進行存儲,其主要字段有監(jiān)測點名稱、當前數(shù)據(jù)、警戒水位上限、警戒水位下限、報警類型和接收時間等,這樣以便集中查看報警信息。
在接收水位數(shù)據(jù)前,先要設(shè)計好監(jiān)測點信息表。在整個數(shù)據(jù)接收過程中,該軟件按照時間順序接收每個水位監(jiān)測點的數(shù)據(jù),并根據(jù)發(fā)來的地址信息來區(qū)分具體監(jiān)測點,然后根據(jù)數(shù)據(jù)采集表存儲相應(yīng)的數(shù)據(jù)并記錄數(shù)據(jù)狀態(tài)(如果數(shù)據(jù)正常則不記錄,如果超過警戒水位則記錄其類型),如果該數(shù)據(jù)超過警戒水位則將數(shù)據(jù)存入報警信息表。
圖1 水位信息的實時顯示界面
在實際使用該軟件使用之前,應(yīng)利用設(shè)計好的數(shù)據(jù)進行實時水位數(shù)據(jù)模擬采集,以驗證軟件功能。通過單片機發(fā)送不同的地址及數(shù)據(jù)來模擬3個監(jiān)測點的采集數(shù)據(jù)。第1個監(jiān)測點命名為“合肥董鋪水庫”,地址為“05 51 01 02 00 00”,發(fā)送的數(shù)據(jù)為從10逐漸遞增1至31,然后不斷循環(huán),發(fā)送時間間隔為1s,警戒水位上限和下限分別為28m和12m。第2個監(jiān)測點命名為“蚌埠閘管理處”,地址為“05 53 12 05 01 01”,發(fā)送的數(shù)據(jù)為從48逐漸遞增2至80,然后不斷循環(huán),發(fā)送時間間隔為2s,警戒水位上限和下限分別為75m和50m。第3個監(jiān)測點命名為“舒城萬佛湖水庫”,地址為“05 56 03 15 09 12”,發(fā)送的數(shù)據(jù)為從10逐漸遞增1至41,再逐漸遞減1至10,然后不斷循環(huán),發(fā)送時間間隔為10s,警戒水位上限和下限分別為20m和2m。
圖1顯示第1個監(jiān)測點的實時水位數(shù)據(jù)接收情況。在接收的過程中已有水位超過警戒水位,所以“警示燈”的顏色改變并發(fā)出警報。此外,從圖1中可以直觀地看出當前所采集到數(shù)據(jù)的準確值,通過實時圖形繪制中的曲線形態(tài)還可以看出整個水位信息的變化趨勢。圖2所示為3個監(jiān)測點按照時間順序接收到的水位信息數(shù)據(jù),上述數(shù)據(jù)與標準測試數(shù)據(jù)相對應(yīng),由此可以看出該軟件數(shù)據(jù)庫可以準確無誤地存儲各水位監(jiān)測點發(fā)出的信息并顯示其數(shù)據(jù)狀態(tài)。
圖2 水位信息實時存儲界面
為了實時顯示和存儲各水位監(jiān)測點數(shù)據(jù),基于Visuanl Basic串口通信和Access 2003數(shù)據(jù)庫,設(shè)計了水位數(shù)據(jù)采集軟件并進行功能測試。研究表明,該軟件能夠準確地存儲每個水位監(jiān)測點的數(shù)據(jù)并實時顯示采集數(shù)據(jù),同時能對超出警戒水位的數(shù)據(jù)進行警報,具有很好的實用性。
[1]李達,邢智慧.水資源監(jiān)測網(wǎng)絡(luò)研究[J].水資源研究,2009,21(3):9-10.
[2] 張忠遠.智能水位監(jiān)測儀的研究[D].南京:南京理工大學(xué),2008.
[3] 童旺.GPRS數(shù)據(jù)終端的設(shè)計與實現(xiàn)[D].北京:北方工業(yè)大學(xué),2007.
[4] 楊本輪.Visual Basic 開發(fā)技術(shù)大全[M].北京:清華大學(xué)出版社,2010.
[5] 劉炳文. Visual Basic 程序設(shè)計教程[M].北京:清華大學(xué)出版社,2009.
[6] 李江全.Visual Basic數(shù)據(jù)采集與串口通信測控應(yīng)用實戰(zhàn)[M].北京:人民郵電出版社,2010.
[編輯] 李啟棟
TP391
A
1673-1409(2013)22-0051-03
2013-05-16
唐振(1982-),男,講師,碩士生,現(xiàn)主要從事數(shù)據(jù)采集、嵌入式系統(tǒng)、信號處理等領(lǐng)域方面的教學(xué)與研究工作。