您的位置 首页 新能源

根据RS-485总线的温湿度监测体系——(RS485总线体系应用之5)

1.前言伴随着计算机技术的进步,计算机与智能化仪器仪表之间的串行通讯接口也得到了同步发展。众所周知,早期的RS-232接口,只能完成单点

1.前语

伴随着计算机技能的前进,计算机与智能化仪器仪表之间的串行通讯接口也得到了同步开展。众所周知,前期的RS-232接口,只能完结单点对单点的单向通讯。后来诞生的RS-422接口,能够完结单点对多点的单向通讯。再后来诞生的RS-485接口,能够完结单点对多点的双向通讯。因为RS-485接口的先进性,敏捷在工农业各范畴得到了遍及运用。本文介绍的温湿度监测体系,便是在RS-485总线架构下,由计算机主机和若干个带RS-485接口的温湿度表构成的。该体系能够对32至128点的温湿度进行实时监测。

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/232811.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部