長沙交通學院信息與計算科學系 (410077) 李湘江
---- 本文介紹VB6.0利用MSComm通信控件,開發微機通過串口對工業儀表進行實時數據采集的編程技術。給出的程序代碼具有通用性,并有詳細的注釋,可以直接或稍加改動后用于其他數據采集或實時控制程序中。
----一臺工業專用實時檢測儀表,接高精度位移傳感器,用于測量微小形變或微量位移,儀表測量精度為0.01毫米,測量范圍最大值為50毫米。該儀表帶有一個9針的RS-232C 串口,能與微機進行串口數據通信,實時傳送檢測數據,通過微機軟件處理可實現工業實時監控。
----該儀表的串口數據通信協議是:數據傳輸速率為 9600bps,1位開始位,8位數據位,1位停止位,無奇偶校驗位。儀表每秒發送50幀檢測數據,每幀數據由4個字節組成。第一個字節定義為二進制常數0F0H,是每幀數據開始的標志字節;后面連續2個字節為數據字節,采用壓縮的BCD碼編碼方式,高位在前,低位在后,即一個字節表示兩位十進制數,則兩個字節表示四位十進制數,小數點采用固定形式,定義在兩字節中間;第四個字節為符號字節,該字節第八位為1,即:1XXXXXXX,則為負數;第八位為0,即: 0XXXXXXX,則為正數。
----例如:0F0H 26H 87H 80H 0F0H 34H 62H 00H 表示 -26.87 34.62。
----通信傳輸速率為9600bps,則最快速度1.04ms發送一個字節,儀表每秒發送50幀數據,每幀數據有4個字節,即每秒發送200個字節,平均5.0ms 發送一個字節,連續讀取串口數據時要在程序中添加循環等待程序。
----為了實現實時監測功能,接收數據的讀取要盡可能的快速,則設置MSComm1的屬性如下:
RThreshold = 1
接收緩沖區收到一個字節產生OnComm事件
InputLen = 1 每次讀取一個字節
----儀表每秒發送50幀數據,微機收到一幀完整數據至少需要20 ms時間,然后再進行數據處理。如果微機在下一幀數據接收前即20ms內能將數據計算處理完畢,則接收緩沖區內只會保存有一幀數據,不會存有兩幀以上數據,接收緩沖區的大小不會影響實時監測效果(接收緩沖區>4字節),這時完全可以實現實時監測或實時控制;如果微機在20ms內不能將數據計算處理完畢,接收緩沖區設置得又很大,在數據計算處理完畢前,接收緩沖區內就會保存有兩幀以上數據,而且一次工作時間越長,緩沖區內滯留數據幀就越多,數據采集和數據處理之間產生逐漸增大的額外時間差,當接收緩沖區充滿后,時間差不再增大,固定在某一值,部分數據因不能及時采集到接收緩沖區中,數據產生丟失現象,真實工作情況就會和微機處理結果產生較大的時間差,對實時監測和實時控制很不利,這種情況下接收緩沖區的大小就會影響實時監測效果,所以接收緩沖區設置不能過大,以保證數據處理的實時性。
----設置接收數據模式采用二進制形式,即 InputMode=comInputModeBinary,但用Input屬性讀取數據時,不能直接賦值給 Byte 類型變量,只能通過先賦值給一個 Variant 類型變量,返回一個二進制數據的數組,再轉換保存到Byte類型數變量中。
----VB中有Byte類型變量,但沒有字節的位處理語句,符號字節的位處理要判斷符號字節的值是否大于 127,大于127則為負數;壓縮的BCD碼存入 Byte類型變量,VB系統只按十進制數處理,這要通過一個簡單算法換算,解壓BCD碼才能還原成十進制表示數值。假如a是Byte類型變量,D是Single類型變量,將一個壓縮的BCD 碼存入a中,則算法是:
D=(a\16)*10 + a-(a\16)*16
則D=a-(a\16)*6
----程序清單:
----在通用聲明中定義程序所用變量:
Dim ab(4) As Byte
‘字節數據類型數組,用來存儲接收到的一組字節數據
Dim av As Variant ‘用來從接收緩沖區讀取數據
Dim i As Integer
Dim j As Integer
Dim w As Integer ‘接收數據個數計數器
Dim b1 As Single
Dim b2 As Single
Dim WW As Single ‘十進制檢測值
Dim MaxW As Single ‘最大值
Dim MinW As Single ‘最小值
----在窗體中添加名為Command1的[開始]按鈕和名為 MSComm1的MSComm控件。
---- [開始]按鈕的Click事件處理程序主要是對MSComm1控制的參數初始化設置,程序中大部分參數在設計時可在MSComm1控制的屬性窗口中設置:
Private Sub Command1_Click()
‘開始按鈕
With MSComm1