• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于RS-485總線的溫濕度監測系統——(RS485總線系統應用之5)

    基于RS-485總線的溫濕度監測系統——(RS485總線系統應用之5)

    作者: 時間:2016-12-15 來源:網絡 收藏
    1.前言

    伴隨著計算機技術的進步,計算機與智能化儀器儀表之間的串行通訊接口也得到了同步發展。眾所周知,早期的RS-232接口,只能完成單點對單點的單向通訊。后來誕生的RS-422接口,可以完成單點對多點的單向通訊。再后來誕生的RS-485接口,可以完成單點對多點的雙向通訊。由于RS-485接口的先進性,迅速在工農業各領域得到了普及應用。本文介紹的溫濕度監測系統,就是在RS-485總線架構下,由計算機主機和若干個帶RS-485接口的溫濕度表構成的。該系統可以對32至128點的溫濕度進行實時監測。

    本文引用地址:http://www.czjhyjcfj.com/article/201612/330199.htm

    2.硬件系統的設計

    2.1硬件系統設備的選型

    作為硬件系統的主角——計算機,應選擇奔騰4以上的臺式計算機,操作系統應選擇安裝Windows2000或Windows XP或更高。溫濕度表應選擇壁掛式且帶RS-485接口的,最好是220V交流供電。如選用電池供電的,需要經常檢查和更換電池,還會頻發因電解質泄漏而腐蝕電路的故障,增加應用時期的維護工作量。此外,還需要一個RS-232/485轉換器組網用的電纜線應采用帶屏蔽線的RS-485專用雙絞線電纜。

    2.2基于485總線的硬件系統結構

    由RS-485接口設備構成的網絡,一般應采用一線到底的總線結構,不支持星形或樹形等復雜的網絡。各溫濕度表安裝地點與485總線的距離應盡量短。否則,將增加分支引線中的反射信號對總線信號的影響,造成通訊數據出錯。由于計算機只配備1~2個RS-232串行接口,需要在RS-232接口處串接一個RS-232/485轉換器。如果總線的長度大于300米時,應在485總線的起點和終點處的AB兩線之間并接120Ω電阻,以實現總線的阻抗匹配

    普通的帶RS-485接口的設備,接入485總線的數量通常不能大于32個,帶加強型芯片的設備可以接入128個或更多。圖1是由32個設備組成的溫濕度監測系統的組網結構圖。

    圖1

    3.軟件系統的設計

    軟件系統采用VB6設計。為了保證軟件系統能夠不斷升級,在設計系統框架時,應該對今后可能需要增加的功能模塊留出擴充余地。本系統的框架結構如下所示:


    3.1軟件系統各界面的設計

    軟件系統啟動時,首先顯示一個歡迎界面,停留若干秒后自動轉入主程序界面。如圖2、圖3所示。


    圖2



    圖3

    各功能模塊的顯示界面主要有“查詢溫濕度數據”界面、“系統參數設置”界面和“串口調試”界面,參見圖4、圖5、圖6。


    圖4


    圖5、圖6

    3.2定時讀寫各溫濕度表數據的程序設計

    在軟件系統各功能模塊中,最核心的部分就是定時讀寫各溫濕度表的溫濕度數據。因此,下面將該模塊的程序清單詳細列出。

    Private Declare Function timeGetTime Lib "winmm.dll" () As Long

    Public btLoCRC As Byte, btHiCRC As Byte, t1 As Long

    Public WPath1 As String, WPath2 As String, WFilename1 As String, WFilename2 As String, WFilename3 As String

    Public RoomNumber As String, CommNumber As String, Baudrate As String, ReadT As String, WriteT As String

    Public IntMinute1 As Integer, IntMinute2 As Integer, ReadTval As Integer, WriteTval As Integer

    Public Rnumber As Integer, ii As Integer, i As Integer, j As Integer, k As Integer, Crc

    Dim RoomAddress(32), Roomname(32) As String, TemperatureData(32), HumidityData(32)

    Private Sub ReadFiles()’讀系統運行參數子程序

    Open "D:Program FilesTmeasurewsboot.txt" For Input As #1 Len = 32

    Input #1, WPath1, WPath2

    Input #1, WFilename1, WFilename2, WFilename3

    Input #1, RoomNumber, CommNumber, Baudrate, ReadT, WriteT

    For i = 1 To Val(RoomNumber)

    Input #1, RoomAddress(i), Roomname(i)

    Form2.Frame1(i - 1).Caption = Roomname(i) & "(地址" & RoomAddress(i) & ")"

    Next i

    Close #1

    End Sub

    Private Sub Form_Load()’主窗口程序

    Me.BorderStyle = 1

    Me.Height = 6660’設定窗口高度

    ReadFiles

    Data1.DatabaseName = WPath1 & WFilename1 & WFilename2 & ".mdb"

    Data1.RecordSource = "溫濕度數據"

    Rnumber = Val(RoomNumber)

    ReadTval = Val(ReadT)

    WriteTval = Val(WriteT)

    IntMinute1 = Val(ReadT)

    With MSComm1’打開串口

    If .PortOpen = False Then

    .CommPort = Val(CommNumber)’指定使用的串口

    .Settings = Baudrate & "N,8,1"

    .NullDiscard = False’和下一句配合使之可以發送0(零)字符

    .InputMode = comInputModeBinary’發送二進制數值(=comInputModeText發送字符)

    .InputLen = 8 + 1’一次性從接收緩沖區中讀取所有數據(8個字節為一組)

    .InBufferCount = 0’清空接收緩沖區

    .OutBufferCount = 0’清空發送緩沖區

    .SThreshold = 8’設置成發送8個字節就產生OnComm事件

    .RThreshold = 5 + 2 * 2’設置成接收9個字節就產生OnComm事件

    .InBufferSize = 1024

    .OutBufferSize = 1024

    .PortOpen = True

    Else

    MsgBox "串口已經打開"

    End If

    End With

    Timer1.Interval = 1000

    Timer1.Enabled = True

    End Sub

    Private Sub Timer1_Timer()’定時讀各溫濕度表數據

    Timer1.Enabled = False

    Dim tbisend(7) As Byte

    Dim strTempFile As String, m As Integer

    Dim conn As New ADODB.Connection

    If MSComm1.PortOpen = True Then

    For k = 1 To Rnumber

    ii = k

    tbisend(0) = "&h" + Hex(k)’被呼叫子機的地址碼

    tbisend(1) = "&h" + Hex(4)’4是讀寄存器的功能碼

    tbisend(2) = "&h" + Hex(0)’被讀寄存器的起始地址高字節

    tbisend(3) = "&h" + Hex(0)’被讀寄存器的起始地址低字節

    tbisend(4) = "&h" + Hex(0)’一次讀寄存器的個數的高字節

    tbisend(5) = "&h" + Hex(2)’一次讀寄存器的個數的低字節

    Crc = CRC16(tbisend, 6, btLoCRC, btHiCRC)

    tbisend(6) = "&h" + Hex(btLoCRC)’CRC低位

    tbisend(7) = "&h" + Hex(btHiCRC)’CRC高位

    If MSComm1.PortOpen = False Then MSComm1.PortOpen = True

    MSComm1.Output = tbisend’發送數據

    t1 = timeGetTime

    While timeGetTime < t1 + 40’延時的循環等待(延時40毫秒,控制精度1毫秒)

    DoEvents’以便接收到被呼叫的從機發來的數據

    Wend

    MorphDisplay1(k - 1).Value = TemperatureData(k)

    MorphDisplay2(k - 1).Value = HumidityData(k)

    Next k

    IntMinute2 = Val(Right(Time, 2))

    If IntMinute2 < IntMinute1 Then

    WriteTval = WriteTval – 1

    If WriteTval = 0 Then

    Data1.Refresh

    If Data1.Recordset.EOF = False Then Data1.Recordset.MoveLast

    If conn.State = adStateOpen Then conn.Close’向溫濕度數據庫文件寫入測量數據

    conn.ConnectionString = "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " & WPath1 & WFilename1 & WFilename2 & ".mdb; Mode = ReadWrite; Persist Security Info = False"

    conn.Open

    s1 = "Insert Into溫濕度數據(日期,時間,1溫,1濕,2溫,2濕,3溫,3濕,4溫,4濕,5溫,5濕,"

    s2 = "6溫,6濕,7溫,7濕,8溫,8濕,9溫,9濕,10溫,10濕) Values "

    s3 = "(#" & Date & "# ,#" & Time & "#," & TemperatureData(1) & "," & HumidityData(1) & ","

    s4 = "" & TemperatureData(2) & "," & HumidityData(2) & "," & TemperatureData(3) & ","

    s5 = "" & HumidityData(3) & "," & TemperatureData(4) & "," & HumidityData(4) & ","

    s6 = "" & TemperatureData(5) & "," & HumidityData(5) & "," & TemperatureData(6) & ","

    s7 = "" & HumidityData(6) & "," & TemperatureData(7) & "," & HumidityData(7) & ","

    s8 = "" & TemperatureData(8) & "," & HumidityData(8) & "," & TemperatureData(9) & ","

    s9 = "" & HumidityData(9) & "," & TemperatureData(10) & "," & HumidityData(10) & ")"

    conn.Execute s1 & s2 & s3 & s4 & s5 & s6 & s7 & s8 & s9

    conn.Close

    End If

    WriteTval = Val(WriteT)

    End If

    End If

    End If

    Timer1.Interval = ReadTval

    Timer1.Enabled = True

    End Sub

    Private Sub MSComm1_OnComm()’接收各溫濕度表數據程序

    Dim TemperatureData6 As String, HumidityData6 As String

    Dim INByte() As Byte

    If MSComm1.CommEvent = comEvReceive Then’如有接收事件發生則......

    INByte = MSComm1.Input

    If INByte(0) = ii And INByte(1) = 4 Then’如果收到的地址碼=被叫從機并且功能碼=讀寄存器,

    ’則將收到的CRC碼與收到數據計算出的CRC碼比較

    Crc = CRC16(INByte, UBound(INByte) - LBound(INByte) - 1, btLoCRC, btHiCRC)

    If INByte(UBound(INByte) - 1) = btLoCRC And INByte(UBound(INByte)) = btHiCRC Then ’如校驗正確則轉換

    TemperatureData6 = Hex(INByte(3)) & Format(Hex(INByte(4)), "00")’先轉換成十六進制

    HumidityData6 = Hex(INByte(5)) & Format(Hex(INByte(6)), "00")

    TemperatureData(ii) = Format(Val("&H" & TemperatureData6) / 10, "##0.0")’再轉換為十進制

    HumidityData(ii) = Format(Val("&H" & HumidityData6) / 10, "##0.0")

    End If

    End If

    MSComm1.InBufferCount = 0’清接收緩存

    End If

    End Sub

    Function CRC16(Data() As Byte, No As Integer, CRC16Lo As Byte, CRC16Hi As Byte) As String’CRC校驗函數

    Dim CL As Byte, CH As Byte, SaveLo As Byte, SaveHi As Byte

    CRC16Hi = &HFF’為16位CRC校驗寄存器賦初始值FFFF

    CRC16Lo = &HFF

    CH = &HA0’為16位CRC校驗多項式賦初始值A001

    CL = &H1

    For i = 1 To No

    CRC16Lo = CRC16Lo Xor Data(i - 1)’每一個數據與CRC校驗寄存器進行異或

    For j = 1 To 8

    SaveHi = CRC16Hi

    SaveLo = CRC16Lo

    CRC16Hi = CRC16Hi 2’高位右移一位

    CRC16Lo = CRC16Lo 2’低位右移一位

    If ((SaveHi And &H1) = &H1) Then’如果高位字節最右一位為1

    CRC16Lo = CRC16Lo Or &H80’則低位字節最左一位補1,否則自動補0

    End If

    If ((SaveLo And &H1) = &H1) Then’如低位字節最右一位為1,則與CRC校驗多項式異或

    CRC16Hi = CRC16Hi Xor CH

    CRC16Lo = CRC16Lo Xor CL

    End If

    Next j

    Next i

    End Function

    4.結束語

    經過對軟件系統的多次修改和完善,本系統已經于2009年10月交付用戶使用。受篇幅限制,以上僅扼要介紹了系統的主要設計思路與方法,未能將程序清單全部列出。如果發現本文或在應用中存在錯誤,歡迎指正。

    參考文獻:

    ① 《微型計算機原理與接口技術》中國科學技術大學出版社作者:周荷琴 吳秀清

    ② 《單片機原理及串行外設接口技術》北京航空航天大學出版社作者:李朝青等

    ③ 《RS-232串口通信大全》下載網址:http://download.csdn.net/source/2443662



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 随州市| 福安市| 钟山县| 大英县| 班戈县| 阿合奇县| 仙桃市| 高邑县| 吉木萨尔县| 繁昌县| 阿鲁科尔沁旗| 孟津县| 顺昌县| 亚东县| 金昌市| 忻州市| 金昌市| 青岛市| 屏东市| 阜平县| 金山区| 内丘县| 舒兰市| 文水县| 屏东市| 岑巩县| 伊川县| 右玉县| 黄骅市| 江油市| 临江市| 鹤庆县| 卢氏县| 永胜县| 黑龙江省| 信阳市| 新晃| 鹤峰县| 资兴市| 深水埗区| 翼城县|