APP下载

面向RS-485控制网络的Modbus协议扩展及应用

2013-09-10胡文翔郭伟玮吴银锋

自动化仪表 2013年4期
关键词:链表通信协议寄存器

胡文翔 蔡 政 郭伟玮 吴银锋

(北京航空航天大学仪器科学与光电工程学院,北京 100191)

0 引言

Modbus协议是Modicon公司研发的一种完全开放且免费的通信协议,它支持多种电气接口,且帧格式简单紧凑,目前已经在工业领域得到了广泛应用。通过Modbus,不同厂商生产的设备可连成网络进行集中监控[1-4]。Modbus定义了常用公共功能码,同时为协议扩展预留了地址空间。Gianluca Cena等人扩展了Modbus地址域,使Modbus由支持255个从节点增加到65 535个。聂文惠等人提出了aModbus,在数据域增加物理地址信息,并应用于分布式控制。赵学军扩展了Modbus支持字节操作,并将其应用于RS-485总线测控模块[5-7]。

本文在分析Modbus标准协议及总结前人对Modbus扩展的基础上,发现Modbus仍存在以下两点不足:①通信安全性低,操作权限没有区分;②当访问离散地址寄存器时需进行多次通信,通信效率较低。针对以上两点不足,分别对协议进行了“身份认证”与“读离散寄存器”功能扩展,并将扩展协议成功应用于基于RS-485的某太阳能发电控制网络。

1 Modbus通信协议

Modbus通信协议定义了与基础通信层无关的简单协议数据单元(protocol data unit,PDU)和由特定总线或网络引入的一些附加域的应用数据单元(application data unit,ADU)[8-9]。Modbus 串行链路ADU通用帧格式由地址域、功能码、数据域和差错校验四部分组成。其中,“地址域”为设备ID地址和数据的逻辑地址,“功能码”区别通信功能,“数据域”存放通信的数据内容,“差错校验”检验接收到的报文的完整性。

Modbus通信协议是一种主/从协议,当主站发出通信请求时,从站根据接收到的ADU报文,对主站的请求作出判断并响应,当出现差错时从站响应相应的差错码和异常码。Modbus定义了一些常用的公共功能码,同时也保留了0x41~0x48和0x64~0x6E范围内的数据,供用户定义功能码[8-9]。

2 Modbus通信协议扩展

本文针对Modbus协议通信安全性差和对离散地址寄存器操作效率低这两点不足,扩展了0x41、0x42和0x43功能码,其中0x41和0x42功能码供“身份认证”使用、0x43功能码供“读离散寄存器”使用。

2.1 身份认证

Modbus通信协议的通信过程是完全开放的,主站可以对从站线圈和保持寄存器进行任意修改。为防止Modbus从站本地数据内容遭到不当或恶意修改,提高通信安全性,对主站用户操作权限设定一定的限制,使不同用户拥有不同的操作权限。协议中扩展了身份认证机制,主站需要登录获得相应的权限才能对从站进行相应权限的操作。

身份认证包括0x41、0x42两个功能码,用户通过功能码0x41登录,通过功能码0x42修改密码。身份认证(0x41、0x42)PDU帧格式如表1所示。

表1 身份认证PDU帧格式Tab.1 ID authentication PDU frame format

登录时主站向从站发送一个登录请求帧,从站接收到登录请求帧后,对用户进行身份认证,为用户分配相应的权限值,并启动一个计时器。在规定的时间内,用户拥有从站分配的权限级别,可以对相应的变量进行操作。当计时器超时,用户具有的权限值失效,从站给用户分配默认的权限值。用户重新登录后,可以再次获得相应的权限。当低权限用户进行高权限操作时,从站响应一个权限不足的报文,提示主站用户操作权限不足。

2.2 读离散寄存器

Modbus标准通信协议比较适合对地址连续的寄存器进行处理。当寄存器地址不连续时,需要通过多次通信分别进行处理,效率较低。为提高通信效率,本文扩展了“读离散寄存器”功能码。该功能码从一个从站设备中强制连续地读多个寄存器,即使所请求的寄存器地址段在该从站设备中不连续。

2.2.1 PDU 帧格式

读离散寄存器(0x43)PDU帧格式如表2所示。响应PDU包括了一个参数报告表和读到的寄存器的值。参数报告表标志了所请求的寄存器地址是否存在于从站设备。若从站设备存在请求的寄存器,则参数报告表中相应的位为1,否则为0。参数报告表采用大端编码,高字节在前、低字节在后,最低位对应第一个寄存器。从站设备将不存在的寄存器剔除后返回实际读到的寄存器的值。Modbus RTU 帧最大长度为 256 B[10-11],因此,从站响应读离散寄存器ADU字节数=地址(1 B)+功能码(1 B)+参数报告表(15 B)+寄存器数据(118×2 B)+CRC(2 B)=255 B。该功能码最多可连续读118个地址的寄存器。

表2 读离散寄存器PDU帧格式Tab.2 Read discrete registers PDU frame format

2.2.2 通信效率分析

以读118个地址的寄存器操作为例,对比分析Modbus定义的公共功能码“读保持寄存器(0x03)”与“读离散寄存器(0x43)”。设该118个地址在从站设备中存在N个寄存器,由M个离散地址段组成。

当使用读保持寄存器(0x03)操作时,通信分别需要M次主站请求与M次从站应答,通信共需字节数=M次×8 B(请求ADU)+N×2 B(所有寄存器)+M次×5 B(响应ADU除去寄存器)=(13×M+2×N)B。

当使用读离散寄存器(0x43)时,通信分别需要1次主站请求与1次从站应答,通信共需字节数=8 B(请求ADU)+20 B(ADU响应除去寄存器)+N×2(所有寄存器)=(2×N+28)B。两种通信方式所需通信字节个数差值为(13×M-38)B。

当读118个地址寄存器时,读保持寄存器(0x03)与读离散寄存器(0x43)通信对比如表3所示。

表3 读保持寄存器与读离散寄存器通信对比Tab.3 Comparison of communication for read holding and discrete register

当使用读保持寄存器(0x03)时,离散次数决定主从通信次数;而当使用读离散寄存器(0x43)时,仅需1次主从通信。当118个地址完全连续时(即离散次数为0时),读保持寄存器(0x03)比读离散寄存器(0x43)通信少15 B;当离散次数为1时,虽然读保持寄存器(0x03)比读离散寄存器(0x43)通信少2 B,但需2次主从通信,因此对于实际通信效率,读离散寄存器(0x43)较高;当离散次数大于1,地址越离散时,读保持寄存器(0x03)所需主从通信次数越多,且所需通信字节数越多。因此,读离散寄存器(0x43)效率更高。

Modbus PDU中0~65 535个寻址地址的分配至关重要。通常为保证通信效率,在分配地址时应尽量连续。使用读离散寄存器(0x43)功能码,可以在地址分配上增加不连续的“空”地址情况,为后续扩展增加的地址预留空间,同时在通信时也可以读该“空”地址寄存器。当升级产品补充“空”地址寄存器时,“空”地址的寄存器内容在不修改通信请求的情况下,也可以被主站读取。另外当存在不连续地址时,使用读离散寄存器可以极大地减少通信次数与通信的等待时间。

由以上分析可知,读离散寄存器功能码既提高了对离散地址寄存器读操作的效率,同时也为工程的维护与升级提供了便利。

3 扩展协议的应用

将Modbus应用于RS-485总线控制网络,通常按照EIA/TIA485标准实现电气接口,每台设备连接到干线电缆上,形成菊花链式的拓扑结构[10-11]。控制网络监控设备往往作为主站采集、记录并控制各从站设备。为保证监控数据的实时性,监控设备与各节点设备间需一直处于数据更新的通信状态,而控制网络通信存在通信繁杂、通信阻塞、通信抢占等问题。因此,为保证通信效率与可靠性,提高通信的灵活性,将通信管理融入Modbus应用。

3.1 通信链表

将每一次通信请求封装成一个通信节点,根据通信先后顺序建立通信链表,如图1所示。

图1 Modbus通信链表Fig.1 Modbus communication link

当有抢占通信请求时,抢占通信节点插入通信链表并立即通信;当链表中存在抢占通信请求时,新的抢占通信请求加在最后一个抢占通信请求后。为保证通信的成功率,每个通信请求可尝试多次请求通信,通信成功或尝试次数用完后进行下一通信请求。遍历完整个通信链表后,主站根据当前子节点连接状态,重新建立通信链表。

在软件实现上,Modbus提供了链表建立与修改的各函数,方便应用过程中灵活地对通信请求进行调整。

3.2 控制网络主站通信过程

上电时,控制网络监控设备(主站)通过读设备识别码(0x2B),发出从地址1 ~247 的通信请求[10-11],并根据从设备响应,判断挂载在RS-485总线上的设备并记录;同时根据挂载的设备建立通信请求链表,开始遍历通信链表。当某设备某一通信请求尝试多次后无应答时,认为该设备脱离RS-485总线。当遍历完通信链表后,根据当前连接的设备重新建立通信链表。当有设备接入变化时,也可通过手动触发中断,重新判断子节点设备并建立通信链表。主站通信过程如图2所示。

图2 主站通信过程Fig.2 Master station communication process

当用户操作监控设备时,用户操作请求作为抢占通信请求,通过中断添加到通信链表。用户通过登录(0x41)获得操作权限(默认权限为只读),登录成功后,可获得修改参数的操作权限,从而对从站设备进行操作控制。

4 结束语

针对Modbus标准协议在通信安全性和通信效率方面存在的不足,本文扩展了“身份认证”和“读离散寄存器”功能,扩展功能弥补了Modbus标准协议在安全方面的不足并提高了通信效率。将扩展协议应用于基于RS-485总线的某太阳能发电控制网络,应用结果表明,所开发的控制网络通信安全可靠、效率高,具有一定的推广应用价值。

[1]王佳承,费敏锐,王海宽.基于Modbus的多现场总线集成测控系统设计[J].自动化仪表,2009,30(6):20 -25.

[2]封亚斌.采用串口通信技术实现Modbus数据通信[J].自动化仪表,2004,25(10):56 -58.

[3]华镕.从Modbus到透明就绪—施耐德电气工业网络的协议、设计、安装和应用[M].北京:机械工业出版社,2009:5-8.

[4]李伟.基于Modbus协议的工控节点设计与实现[J].计算机工程,2010,36(16):226 -231.

[5] Cena G,Cereia M,Bertolotti I C,et al.A Modbus extension for inexpensive distributed embedded systems[C]//IEEE International Workshop on Factory Communication Systems(WFCS)2010,Torino,2010:251-260.

[6]聂文惠,鞠时光,王英粟,等.利用优化的MODBUS协议实现分布式控制[J].微计算机信息,2010,26(4):44 -46.

[7]赵学军.RS485总线测控模块的MODBUS扩展协议设计[J].自动化与仪表,2007,22(2):37 -40.

[8]国家质量监督检验检疫总局.GB/T 19582.1-2008基于Modbus协议的工业自动化网络规范第1部分:Modbus应用协议[S].北京:中国标准出版社,2008.

[9] Modbusorg.Modbus application protocol v1.1b[EB/OL].[2012 -03 -15].http://www.modbus.org/doc/Modbus_Application_Protocol_V1_1b.pdf.

[10]国家质量监督检验检疫总局.GB/T 19582.2-2008基于Modbus协议的工业自动化网络规范第2部分:Modbus协议在串行链路上的实现指南[S].北京:中国标准出版社,2008.

[11]Modbus org.Modbus overserial line specification and implementation guide V1.02[EB/OL].[2012 - 03 - 15].http://www.modbus.org/docs/Modbus_over_serial_lin-e_V1_02.pdf.

猜你喜欢

链表通信协议寄存器
基于Wireshark的列控中心以太网通信协议解析器的研究与实现
如何用链表实现一元多项式相加
Lite寄存器模型的设计与实现
二进制翻译中动静结合的寄存器分配优化方法
跟麦咭学编程
移位寄存器及算术运算应用
车载网络通信协议标准化问题研究
基于MTF规则的非阻塞自组织链表
电动汽车充电接口及通信协议新国标发布
C语言中指针链表的学习探讨