摘 要:本文对计算机与西门子 BW500表的通讯做了详细的说明与分析。
关键词: RS-232;串口;波特率,RS485,Modbus RTU协议
一.引言
随着新钢公司的发展,对皮带秤的送料数据的准确性,实时性及其可靠性的要求越来越高,但是目前公司各个生产单位的皮带秤数据不准确,数据也没有实现WEB实时数据查询,而且存在许多软故障,也不能适应发展的信息处理要求。这样不仅仅增加了计量单位的工作量,也影响了生产单位的生产.为此,我公司决定自行开发数据控制与传输计量软件。
二 .研究内容及措施
1系统硬件构成
如下图所示:
系统硬件由现场仪表和数据采集计算机、WEB服务器三部分组成,从每台BW500表的RS-485接口接一根线出来到发送光端机,然后光信号通过光缆到仪控车间,仪表车间再通过光缆将数据传输到所大院的监控班的接收光端机,数据采集计算机通过串口从接收光端机采集数据.
2.软件构成
软件由仪表通讯协议、数据采集传输程序、实时查询程序,历史数据查询程序,历史曲线绘制程序,送料时间统计程序,远程清零程序,处理数据库程序组成.
软件运行环境:
操作系统: Windows 2000 Server
编程语言: Microsoft Visual Studio 2003 Asp.Net
数据库:Sql Server 2000
3. 西门子BW500仪表的通讯协议介绍:
西门子BW500仪表通过串口发送和接收数据,采用的是Modbus 协议,该协议是主从协议,也可成为询问-响应协议,有两种类型,一是Modbus RTU协议,二是Modbus ASCII协议,这里采用的是Modbus RTU协议,该协议的特点是数据的吞吐量大.
3.1协议的格式:
站地址: 正在访问的网络的从站地址
功能代码: 号码代表Modbus命令,两者任意一个
03 读功能
06,16 写功能
信息: 取决于功能代码
错误检查: 对于RTU进行循环冗余检查(CRC),对于ASCII
3.2 BW500的寄存器图
在这里只用到了这几个参数:流量,速度,总计1
3.3对BW500进行通讯上的设置
P772 波特率
带主站设备的通信率用于选择端口,端口1 到3(P772-01 到-03)。
波特率的选择应能反应连接的硬件的速度和使用的协议。
值
1 4800 波特率
P773 奇偶
系列端口奇偶用于选择端口,端口1到3(P773-01 到-03)。
确保BW500和所有连接设备间的通信参数是一样的。
例如,很多调制解调器的默认值为N-8-1 表示没有奇偶,8 个数字
位和1个停止位。
值
0 无
P775停止位
用于选择端口,端口1 到3(P775-01 到-03)数据位间的位数。
值
1或2(f=1)
3.4BW500表的接线图
4.1 数据采集实现的基本原理如图:
发送打开串口指令
a.负责数据采集的计算机 现场仪表
发送读指令
b.负责数据采集的计算机 现场仪表
发送关闭串口指令
a.负责数据采集的计算机 现场仪表
4.2 数据采集的代码实现
数据采集程序每30秒采集一台皮带秤仪表的数据,实现每天24小时数据采集.数据采集程序的设计语言是Microsoft Visual Studio 2003,在程序中使用的是Visual Studio 6.0 中的MSComm控件.
下面的程序实现的是对一台仪表的数据采集:
发送读的指令
Dim tmpstr, tmpstr1, tmpstr2, tmpstr3 As String
Dim k, k1 As Integer
Dim CmdLenth As Integer
If Not MSComm1.PortOpen Then '打开串口
MSComm1.PortOpen = True
End If
Dim SendStr(7) As Byte
Dim RcvStr() As Byte
Dim data() As String
'以下采用的是Modbus RTU通讯协议
'计算机远程读取仪表数据(rate,load,speed,rotal1,rotal2)
SendStr(0) = 1 ,从站号是2
SendStr(1) = &H3 ,读多个字的命令代码
SendStr(2) = &H3 ,起始地址高字节
SendStr(3) = &HF1,起始地址低字节
SendStr(4) = 0,数据长度高字节
SendStr(5) = &HA ,数据长度低字节
Call crc16(SendStr, 5)
SendStr(6) = HiByte
SendStr(7) = LoByte
CmdLenth = 5 + SendStr(5) * 2
MSComm1.RThreshold = 512
MSComm1.Output = SendStr
Dim inx() As Byte
Try
MSComm1.InputLen = CmdLenth
inx = MSComm1.Input
If UBound(inx) = "-1" Then
Exit Sub
End If
ReDim data(UBound(inx))
MSComm1.InBufferCount = 0
For k = 0 To UBound(inx)
If Len(Hex(inx(k))) = "1" Then
data(k) = "0" & Hex(inx(k))
Else
data(k) = Hex(inx(k))
End If
tmpstr = tmpstr & "," & Hex(inx(k))
Next
TextBox1.Text = tmpstr
For k1 = 3 To 6
tmpstr1 = tmpstr1 & data(k1).ToString
Next
For k1 = 11 To 14
tmpstr2 = tmpstr2 & data(k1).ToString
Next
For k1 = 15 To 18
tmpstr3 = tmpstr3 & data(k1).ToString