基与Modbus规约的智能仪表与PC机通信技术实现

作者在 2008-02-28 17:17:14 发布以下内容

基与Modbus规约的智能仪表与PC机通信技术实现


摘要:本文主要介绍Modbus RTU规约,及在VB6.0编程环境下通过RS-485串口实现主控台PC机与智能仪表间基与该规约通信的具体实现法子。
症结词:Modbus RTU;通信协议;RS-485;CRC校验

1 引言

    随着时期的进步,越来越多的企业起头向生产和管理自动化改变。各种智能仪表不断地利用到生产生涯的各个领域。在工业节制方面,RS-485总线由于平衡差分传输特征具有的干扰性好、传输距离远 、有较大级连能力等特征,非常适宜于组成工业级的多机通信体系。ModBus RTU规约是Modicon公司的注册商标,是目前国际智能化仪表普遍采用的主流通信协议之一。在各个工业仪器仪表大批使用的今天,Modbus RTU协议和RS-485总线得到了最为普遍的利用。本文主要从利用的角度介绍在一个工业节制体系中,实现该技术的具体方案。

2  Modbus  RTU 通信协议简介

    (1) Modbus RTU协议简介
     ModBus RTU通信协议是Modicon公司的注册商标。采用主从问答法子工作,其规范已在国际互联网上颁布,是目前国际智能化仪表普遍采用的主流通信协议之一。目前,国内许多生产商已在他们的产品和体系中遵守该协议标准。该协议有两种传输模式即RTU模式和ASCII模式。其中RTU模式信息帧中的8位数据包含两个4位16进制字符,相对于ASCII模式,RTU模式表达相同的信息须要较少的位数,且在相同通信速率下具有更大的数据流量。因此通常情形下,一般工业智能仪器仪表都是采用RTU模式的Modbus规约。

    (2) Modbus 通信款式

    当通信命令由发送设备(上位机)发送至接收设备(下位机)时,符合相应地址码的下位机就会响应命令,并依据约定的通信协议读取信息、数据校验并且实行相应的功能操作。返回的帧构造包含地址码、功能码、数据以及CRC校验码。

    (3)高下位机通信帧约定款式     
     其中的仪表地址在使用的电压表中是为一个字节定义的,所以最多到256个。下位机与上位机的通信波特率一般可自由设定,但必须保证高下机的通信波特率对应匹配。
 

3 上位机通信软件设计方案

    上位机的通信软件采用VB6.0的开发环境。在VB6.0中对串口进行编程可以使用Mscomm控件加快开发进度。该控件主要是为RS-232的通用串口而设计。所以为了利用PC上现有的RS-232接口,通常是使用RS232/485的转换器。这些转换器一般通过逻辑门电路节制RXD、TXD和GND三针信号,从而自动对半双工或全双工的485串口进行节制。通过转换器,我们就可以像开发通用的RS-232串口一样来快速开发基于RS-485串口的上位机通信软件。

(1)初始化程序设计
    在初始化程序中,主要是设定好全部帧构造的命令数组、传输波特率、以及一些必须的串口初始设定。具体的操作如下面代码说明
Dim Tcommand(7) As Byte      ‘开辟命令帧的帧长度数组
MSComm.CommPort = 1        ‘设定须要使用的串口,当然这里可以用输入法子机动设定。暂定为1#口
MSComm.Settings=2400,n,8,1  ‘设定传输的波特率和校验法子
MSComm.InBufferSize = 1024     ‘开辟数据缓冲区
MSComm.InputMode =comInputModeBinary    ‘设定为二进制的数据流法子
MSComm.InputLen = 0                      ‘一次全部读入所须要的数据
……
   上面的代码一般都是串口初始化必须进行设定的几个部分。依据个人须要可以在VB6.0中做一个初始化界面,对各个参数(如波特率、使用串口等)进行自由设定和更改,以进步初始化设定的机动性和通用性。

(2)命令字发送
     命令字发送应该严峻依照Modbus规约所设计的帧款式和高下位机在该规约基本上所定义的通信协议。参考表1的通信协议次序,编写如下的VB代码来实现命令的发送。
Tcommand (0) = address               ‘  address为设定的接收地址输入的变量
Tcommand (1) = Val(&h + 03)
……(其他的通信协议,并企图CRC校验代码)
Tcommand (6) = CRC(1)
Tcommand (7) = CRC(0)
frmcontrol.MSComm.Output = Tcommand
……

(3)上位机接收和数据处置
     依据表2的回送通信协议,上位机解析所接收的数据,并进行必要的处置。一般而言从下位机发送上来的数据都是有必定的帧长度。特别是对于一些固化好的智能仪表。所以最好的法子是依照通信回送的帧长度,在上位机程序中分手开辟两个同样长度的数组。一个作为接收数组,用来一次性接收串口缓冲区中的数据;另一个为安全数组,用来复制接收数组中的数据并进行解析。这样可以进步全部体系的容错能力。
LoopUntil frmcontrol.MSComm.InBufferCount = 9
InByte = frmcontrol.MSComm.Input
For i = 0 To (count - 1)
   InSafeArray(i) = InByte(i)
Next i
其代码中的inbyte()就是接收数组,而InSafeArray()就是我们再开辟的安全数组。

(4)CRC校验的实现法子
    依照Modbus规约的校验法子,RTU模式的校验法子为CRC校验法子;而ASCII模式为LRC校验。一般的智能仪表多采用RTU的CRC校验法子。依据生成多项式的不同,CRC校验通常有以下几种:CRC-12 (传6bit);CRC-16(美国标准,传8bit);CRC-CCITT(欧洲标准,传8bit);CRC-32(point-to-point同步传输中使用) 。目前仪表类比拟普遍的是CRC-16的校验码。其生成多项式为X16+X15+X2+1。在算法实现上,我们可以先预置一个16位的寄放器FFFF(全1),然后把8位的2进制数据(一个字节)与16位的CRC寄放器低8位异或,并把后果放回CRC寄放器同时寄放器内容右移,MSB补0,并反省移出的LSB。如果LSB为0则连续右移动,为1则CRC寄放器与多项式异或。反复上面操作到一个8bit字节完成,再连续对下一个数据进行相同处置,直到所有数据停止。这个时候CRC寄放器中的数据就是我们所要的CRC码了。实现代码如下:

CRC16Lo = &HFF                              ‘CRC16Lo为CRC寄放器低8位
  CRC16Hi = &HFF                              ‘CRC16Hi为CRC寄放器高8位
  CL = &H1
  CH = &HA0                                    ‘A001 H 是CRC-16多项式代码
  For i = 0 To UBound(Data)
     CRC16Lo = CRC16Lo Xor Data(i)             ‘每一个数据与CRC寄放器异或
      For index = 0 To 7
         UseHi = CRC16Hi
         UseLo = CRC16Lo
         CRC16Hi = CRC16Hi 2
         CRC16Lo = CRC16Lo 2                  ‘右移一位
         If ((UseHi And &H1) = &H1) Then       ‘如果高位字节最后一位是1的话
             CRC16Lo = CRC16Lo Or &H80          ‘低位字节右移后前面补1
         End If
         If ((UseLo And &H1) = &H1) Then        ‘如果LSB 为1,则与多项式进行异或
               CRC16Hi = CRC16Hi Xor CH
               CRC16Lo = CRC16Lo Xor CL
         End If
         Next index
     Next i

4 下位机工作体系设计简介

下位机一般是使用固化好通信协议及工作指令的单片机。因为测控体系多采用的是单发多收的通信机制,所以在下位机要容许用户预先设定本机的地址码,并且保证不能反复。此外,要注意通信波特率必须与上位机的波特率相匹配。在下位机软件开发中,要遵守Modbus规约的通信帧构造对上位机传输的命令进行解析:非呼叫对象应能及时重新恢复等待接收状况;响应呼叫的下位机要解析命令代码并进行相应的功能处置,对非法的命令操作要能回送报错信息。
在具体的工程开发中,下位机多是采用各个厂家出品的基与Modbus规约的智能仪表。这样虽然简化了我们开发的工作量,但是下位机的合理支配与设计能降低体系误码率、进步可靠性。因此是每个工业体系设计人员所不应该疏忽的主要部分。在工业节制中,因为各种干扰源的存在且一般下位机数量较大,要对RS-485芯片选型有很认真的考虑。条件容许的话尽量选用抗电击和有较大级连驱动能力的芯片。理论上485芯片的级连能力至少32门,目前很多芯片厂家都能使工业级的级连数到达128以上。在实际利用中应该让体系具有必定的富余度,一般级连数不能超过该器件满载的70%。在选配RS232到RS485转换头的时候也应该尽量选用有源的转换器,以进步驱动能力和稳固性。此外,工业现场的降噪、隔离、布线、屏蔽等等方法的合理与否也会对最后体系的稳固产生影响。

5 停止语

作者在实际的测控体系项目开发中,通过VB6.0联合SQL数据库编程,开发了基于该通信协议的上位机的测控管理软件,并利用RS-485总线实现了对基于该规约的各种下位机的监控和数据处置。在生产运动自动化,通信协议规范化,信息交流国际化的今天,充分利用现有的成熟而规范的通信协议能最大限度地勤俭开发成本,降低开发风险,进步体系的兼容性和可移植性。Modbus RTU规约作为智能仪器仪表领域大批使用的国际化通信协议,必将得到更加普遍的推广和利用。

6 参考文献

【1】 Visual Basic 6.0程序员指南;(美)Microsoft公司著;北京盼望电子出版社;1999.2;P9-22,P304-394
【2】 实用Visual Basic 6教程;(美)Bob Reselman,Richard Peasley著;清华大学出版社;2001.3; P489-500
【3】 基于MODBUS协议通信的设计与实现  ; 潘洪跃  ;计量技术 ; 2002. No 4 ;P35-36

通讯规约 | 阅读 3746 次
文章评论,共0条
游客请输入验证码
浏览28495次
最新评论