<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用VB開發多通道儀表數據采集程序

      [摘要]1.前言   實時數據采集系統過去在DOS操作系統下一般是采用匯編語言開發制作。隨著Windows操作系統的普及應用,數據采集及工業控制等軟件的開發也上升到 Windows環境下?梢暬浖_發平臺...
      1.前言


        實時數據采集系統過去在DOS操作系統下一般是采用匯編語言開發制作。隨著Windows操作系統的普及應用,數據采集及工業控制等軟件的開發也上升到 Windows環境下。可視化軟件開發平臺的出現,為軟件開發提供了強大的圖形界面功能,使得開發出來的各種應用軟件具有良好的人機交互功能。匯編語言的特點是功能強、運行速度快,但編程復雜、調試難,而高級語言具有良好的可讀性及方便的調試手段。


        Visual Basic 是Windows環境下簡單、易學、高效的可視化編程語言開發系統,以其所見即所得的可視化界面設計風格和32位面向對象的程序設計等特點,已廣泛地應用于各個領域,是很多計算機軟件開發人員采用的開發工具。VB不但提供了良好的界面設計能力,而且在微機串口通信方面也有很強的功能。采用 VB開發Winodws下的數據采集和工業控制應用軟件十分方便,尤其軟件界面設計非常便捷,編程工作量較小,開發周期短,特別適合非計算機專業的工程技術人員掌握和使用。   


        2.MSComm控件特點


        MSComm控件是Microsoft提供的擴展控件,用于支持 VB程序對串口的訪問,該控制“隱藏”了大部分串口通訊的底層運行過程和許多煩瑣的處理過程,同時支持查詢方法和事件驅動通訊的機制,事件驅動通訊是交互方式處理串口事務的一種非常有效的方法,特別適合 Windows程序的編寫。在串口通訊過程中,當發送數據、收到數據或產生傳輸錯誤時,觸發MSComm控件的OnComm事件,然后可以通過判斷 CommEvent屬性值獲得事件類型,再根據事件類型進行相應數據處理。因此用其實現微機串口的數據通訊相當簡單,以很少的程序代碼就可以輕松實現串口的訪問和數據通訊。


        3.實時數據采集示例程序


        下面給出的應用實例,通過對一臺工業八通道實時檢測儀表數據通訊協議進行分析,利用VB6.0開發微機通過串口對多通道工業儀表進行實時數據采集的編程技術。給出的程序代碼具有通用性,并有詳示,可以直接或稍加改動后用于其它數據采集或實時控制程序中。


        3.1 儀表及其數據通訊協議


        這臺工業用八通道實時檢測儀表,最多可同時接八路高精度位移傳感器,用于測量多點微小形變或微量位移,儀表測量精度為0.01毫米,測量范圍最大值為50毫米。該儀表帶有一個9針的RS-232C串口,能與微機進行串口數據通訊,實時傳送檢測數據,通過微機軟件處理可實現工業實時監控。


        該儀表的串口數據通訊協議是:數據傳輸速率為9600bps,1位開始位,8位數據位,1位停止位,無奇偶校驗位。儀表每秒通過串口發送200個字節數據,由于接入的位移傳感器數量在 1-8路可調,所以發送的每幀數據長度不定長,隨傳感器數量多少而變化。儀表數據傳輸首先發送每幀數據的開始標志字節,該字節定義為二進制常數0FAH;然后發送1個字節的通道狀態字節,該字節按位順序每位代表相應的一路通道狀態,某位是1則代表該通道接有位移傳感器,某位是0則代表該通道未接位移傳感器;從第三個字節開始按位移傳感器接通的通道順序發送采集數據字節,每道數據有三個字節,前2個數據字節采用壓縮的BCD碼編碼方式,第1個數據字節是高位,第2個數據字節是低位,即一個字節表示兩位十進制數,則兩個字節表示四位十進制數,小數點采用固定形式,定義在兩字節中間;第3個數據字節為符號字節,該字節第八位為1,即1xxxxxxx則為負數,第八位為0,即0xxxxxxx則為正數。


        例如發送的字節數據為:0FAH 0B1H 26H 87H 8H 34H 62H 00H 37H 76H 0H 42H 53H 80H


        0FAH為幀開始標志字節,第一道,第五道,第六道,第八道接有位移傳感器,表示 -26.87 34.62 37.76 -42.53。


        3.2 部分參數的技術分析


        3.2.1 儀表通訊傳輸速率為9600bps,則最快速度為1.0417ms發送一個字節;儀表每秒發送200個字節,平均5.0ms發送一個字節,在查詢方式或連續讀取串口數據時要在程序中添加循環等待程序,等待接收緩沖區收到足夠的字節才能進行數據處理。


        3.2.2 儀表發送每幀數據長度不定長,為了實現實時監測功能,接收數據的讀取要盡可能的快速,則在程序開始運行時設置MSComm1的屬性


        RThreshold = 26 接收緩沖區收到26個字節產生OnComm事件


        InputLen = 1 Input每次讀取一個字節


        等到程序接收到一幀完整數據后,計算出當前幀數據長度,再將Rthreshold屬性修改為幀長度,則接收緩沖區在收到一幀數據后,MSComm控件才會觸發一個OnComm事件,這樣就會有更多的時間進行數據的計算和處理。


        3.2.3 儀表每秒發送200個字節數據,微機收到一完整幀數據至少需要t(ms)時間(只接一道傳感器t=25ms;接八道傳感器t=130ms),然后再進行數據處理。如果微機在下一幀數據接收前即t ms內能將數據計算處理完畢,則接收緩沖區內只會保存有一幀數據,不會存有兩幀以上數據,接收緩沖區的大小不會影響實時監測效果(接收緩沖區>=一完整幀長度),這時完全可以實現實時監測或實時控制;如果微機在t ms內不能將數據計算處理完畢,接收緩沖區設置的又很大,在數據計算處理完畢前,接收緩沖區內就會保存有兩幀以上數據,而且一次工作時間越長,緩沖區內滯留數據幀就越多,數據采集和數據處理之間產生逐漸增大的額外時間差,當接收緩沖區充滿后,時間差不再增大,固定在某一值,部分數據因不能及時采集到接收緩沖區中,數據產生丟失現象,真實工作情況就會和微機處理結果產生較大的時間差,對實時監測和實時控制很不利,這種情況下接收緩沖區的大小就會影響實時監測效果,所以接收緩沖區設置不能過大,讓部分數據丟失,以保證數據處理的實時性。


        3.2.4 設置MSComm控件的接收數據模式采用二進制方式,即 InputMode=comInputModeBinary,但用Input屬性讀取數據時,不能直接賦值給 Byte 類型變量,只能通過先賦值給一個 Variant 類型變量,返回一個二進制數據的數組,再轉換保存到Byte類型數變量中。


        3.2.5 VB中有 Byte類型變量,但沒有字節的位處理語句。通道狀態字節的位處理要通過對該字節的值運算進行判斷,符號字節的位處理則要判斷符號字節的值是否大于127,大于127則為負數;壓縮的BCD碼存入Byte類型變量,VB系統只按十進制數處理,這要通過一個簡單算法換算,解壓BCD碼才能還原成十進制表示數值。假如a是Byte類型變量,W是Single類型變量,將一個壓縮的BCD碼存入 a中,則算法是:


       。=(a\16)*10 + a-(a\16)*16


        則W=a-(a\16)*6


        3.3 程序代碼


        在(通用)(聲明)中定義程序所用變量:


        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 TD(8) as Boolean ‘通道狀態數組


        Dim Wmax(8) As Single ‘最大值數組


        Dim Wmin(8) As Single ‘最小值數組


        在窗體中添加名為Command1的[開始]按鈕和名為MSComm1的MSComm控件。


        [開始]按鈕的Click事件處理程序主要是對MSComm1控制的參數初始化設置,程序中大部分參數在設計時可在MSComm1控制的屬性窗口中設置:


      Private Sub Command1_Click() ‘開始按鈕


      With MSComm1


         .CommPort=2 ‘使用COM2


         .Setting="9600,N,8,1" ‘設置通信口參數


         .InBufferSize=40 ‘設置MSComm1接收緩沖區為40字節


         .OutBufferSize=2 ‘設置MSComm1發送緩沖區為2字節


         .InputMode = comInputModeBinary  ‘設置接收數據模式為二進制形式


         .InputLen = 1           ‘設置Input 一次從接收緩沖讀取字節數為1


         .SThreshold = 1 ‘設置Output 一次從發送緩沖讀取字節數為1


         .InBufferCount = 0 ‘清除接收緩沖區


         .OutBufferCount = 0 ‘清除發送緩沖區


         For i=1 to 8


         Wmax(i) = -99 ‘最大值賦初值


         Wmin(i) = 99 ‘最小值賦初值


         Next i


         w = 0 ‘數據個數計數器清零


         .RThreshold = 1 ‘設置接收一個字節產生OnComm事件


         On Error Resume Next       ‘改變錯誤處理的方式。


         Err.Clear


         If .PortOpen = False Then ‘判斷通信口是否打開


          .PortOpen = True ‘打開通信口


          If Err Then ‘錯誤處理


           MsgBox "串口通信無效"


           Exit Sub


          End If


         End If


      End With


      End Sub


        為了達到實時數據采集目的,實時數據采集處理程序采用MSComm事件驅動方式。MSComm1_OnComm 的事件處理程序只處理comEvReceive事件,首先判斷幀數據的開始字節,關閉OnComm接收事件,然后接收數據字節,將壓縮BCD進行還原轉換,再接收符號字節,判斷數據符號,判斷數據最大最小值,最后打開OnComm接收事件,等待下一次OnComm事件產生:


      Private Sub MSComm1_OnComm()


      With MSComm1


      Select Case .CommEvent ‘判斷MSComm1通訊事件


        Case comEvReceive ‘收到Rthreshold個字節產生的接收事件


         av = .Input ‘讀取一個接收字節


         ab(1) = av(0) ‘轉換保存到字節數據類型數組


         If ab(1) = 170 Then ‘判斷是否為數據開始標志,0FAH=170


           .RThreshold = 0 ‘關閉OnComm事件接收


           W=W+1     ‘計數器加1


           av = .Input ‘讀取通道狀態字節


           ab(0) = av(0) ‘轉換保存到字節數據類型數


           For i = 1 To 8 ‘通道狀態數組復位


           TD(i) = False


           Next i


           cn = 2           ‘幀長度賦初值,一個開始字,一個狀態字


           If ab(0) >= 128 Then    ‘判斷第八通狀態


           TD(8) = True       ‘第八道是真


           ab(0) = ab(0) - 128   ‘第7位置零


           cn = cn + 3       ‘幀長度加3個字節


           End If


           If ab(0) >= 64 Then     ‘判斷第七通狀態


           TD(7) = True       ‘第七道是真


           ab(0) = ab(0) - 64    ‘第6位置零


           cn = cn + 3       ‘幀長度加3個字節


           End If


           If ab(0) >= 32 Then     ‘判斷第六通狀態


           TD(6) = True       ‘第六道是真


           ab(0) = ab(0) - 32    ‘第5位置零


           cn = cn + 3       ‘幀長度加3個字節


           End If


           If ab(0) >= 16 Then     ‘判斷第五通狀態


           TD(5) = True       ‘第五道是真


           ab(0) = ab(0) - 16    ‘第4位置零


           cn = cn + 3       ‘幀長度加3個字節


           End If


           If ab(0) >= 8 Then     ‘判斷第四通狀態


           TD(4) = True       ‘第四道是真


           ab(0) = ab(0) - 8     ‘第3位置零


           cn = cn + 3       ‘幀長度加3個字節


           End If


           If ab(0) >= 4 Then     ‘判斷第三通狀態


           TD(3) = True       ‘第三道是真


           ab(0) = ab(0) - 4     ‘第2位置零


           cn = cn + 3       ‘幀長度加3個字節


           End If


           If ab(0) >= 2 Then     ‘判斷第二通狀態


           TD(2) = True       ‘第二道是真


           ab(0) = ab(0) - 2     ‘第0位置零


           cn = cn + 3       ‘幀長度加3個字節


           End If


           If ab(0) >= 1 Then     ‘判斷第一通狀態


           TD(1) = True       ‘第一道是真


           cn = cn + 3       ‘幀長度加3個字節


           End If


           For i = 1 To 8 ‘


           If TD(i) = True Then


            av = .Input    ‘讀取第一個數據字節(BCD碼高位字節)


            ab(2) = av(0)    ‘轉換保存到字節數據類型數組


            av = .Input    ‘讀取第二個數據字節(BCD碼低位字節)


            ab(3) = av(0)    ‘轉換保存到字節數據類型數組


            av = .Input    ‘讀取第三個接收字節(符號位字節)


            ab(4) = av(0)    ‘轉換保存到字節數據類型數組


            b1 = ab(2) - 6 * (ab(2) 16)   ‘高位字節壓縮BCD碼轉換為實數


            b2 = ab(3) - 6 * (ab(3) 16)   ‘低位字節壓縮BCD碼轉換為實數


            WW = b2 + b1 / 100 ‘數值組合,標定小數點


            If ab(4) > 127 Then WW = -WW ‘判斷數據符號位


            Label1(i-1) = Format(WW,"0.00")   ‘顯示毫米單位數值,2位小數


            If WW>Wmax(i) And WW<51 Then     ‘判斷最大值,儀表在剛開始工作時有干擾,會傳導一些亂碼,位移傳感器有參數偏差,最大值一般都略大于50毫米,所以取51為極限最大值,取-51為極限最小值。

             Wmax(i) = WW


             Label2(i-1)=Format(Wmax(i),"0.00") ‘顯示最大值


            End If


            If WW -51 Then ‘判斷最小值


             Wmin(i) = WW


             Label3(i-1)=Format(Wmin(i),"0.00") ‘顯示最小值


            End If


           End If


           Next i


          .RThreshold = cn ‘打開MSComm1事件接收


         Else


          .RThreshold = 1


         End If


        Case Else


      End Select


      End With


      End Sub


      日韩精品一区二区三区高清