购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 Modbus通信协议

2.3.1 Modbus协议概述

1.Modbus协议

Modbus协议是一种Modicon公司(现属施耐德)开发的通信协议,最初的目的是实现可编程控制器之间的通信。该公司后来还推出了增强型Modbus协议——Modbusplus(MB+)。该串行网络上可连接32个节点,利用中继器可扩展至64个节点。Modbus通信协议被自动化行业广泛认可,成为一种事实上的标准协议。Modbus协议定义了一种公用的消息结构,无论它们是经过何种网络进行通信的都不受影响。协议规定了信息帧的格式,描述了服务器端请求访问其他客户端设备的过程,如怎样回应来自其他设备的请求及怎样侦测错误并记录。通过Modbus协议在网络上通信时,必须清楚每个设备地址,根据设备地址来决定要产生何种行动。

2.主从查询-回应

Modbus通信属于主从通信模式,其工作方式表现为请求/应答,每次通信都是主站先发送指令,可以是广播或向特定从站单播,从站响应指令,要求应答或报告异常;当主站不发送请求时,从站不会自己发出数据,从站和从站之间不能直接通信。在Modbus通信网络中,主站/从站的确定根据应用需求而定。例如,PLC与多台变频器通过Modbus协议通信,一般PLC作为主站,变频器作为从站。当计算机与多台PLC通过Modbus协议通信时,计算机是主站,PLC是从站。

Modbus协议建立了主站的查询信息:设备(或广播)地址、功能代码、所有要发送的数据和错误检测域。从站的回应消息也由Modbus协议构成,包括确认要行动的域、要返回的数据和错误检测域。如果在消息接收过程中发生错误,或从站不能执行其命令,那么从站将建立错误消息并把它作为回应发送出去。图2.6所示为主从查询-回应过程,查询消息中的功能代码告之被选中的从站要执行何种功能。数据段包含从站要执行的功能的所有附加信息。例如,功能代码03是要求从站读保持寄存器并返回其内容。数据段必须包含要告之从站的信息:从哪个寄存器开始读及要读的保持寄存器的数量。错误检测域为从站提供了一种验证消息内容是否正确的方法。如果从站产生正常的回应,那么回应消息中的功能代码是查询消息中的功能代码的回应。数据段包括从站收集的数据:寄存器值或状态。如果有错误发生,那么功能代码将被修改,以用于指出回应消息是错误的,且数据段包含描述此错误信息的代码。错误检测域允许主站确认消息内容是否可用。

图2.6 主从查询-回应过程

还能将Modbus这种主从工作方式看作典型的源/目的(Source/Destination)通信模式。源端每次只能和一个目的地址通信,源端提供的实时数据必须满足每个目的端的实时性要求。对于广播方式,有些目的端可能不需要源端发出的数据,因此浪费了时间。此外,随着节点增多,源端每次通信轮询需要的时间更多,从而导致源端与目的端的实时数据通信周期增加。

2.3.2 常用Modbus协议及报文解析

1.Modbus体系结构

Modbus协议是OSI参考模型中的应用层报文传输协议,借由各种类型的传输介质连接不同的网络通信设备,完成主站/从站之间的信息交换。

如图2.7所示,Modbus协议分为三层,即物理层、数据链路层和应用层,对应于OSI参考模型的层次。在工业现场中存在各种网络,可能采用不同的通信介质,Modbus支持串行链路及以太网通信链路,使得协议的应用场景较为广泛。

常用的Modbus串行通信协议有两种报文格式:一种是Modbus ASCII;另一种是Modbus RTU。一般来说,通信数据量少时采用Modbus ASCII协议,通信数据量大且是二进制数时,多采用Modbus RTU协议。工业上一般都采用Modbus RTU协议。

Modbus TCP是随以太网兴起而产生的新协议,它是建立在标准的TCP基础上的Modbus扩展协议。Modbus应用数据单元ADU加上TCP/IP组成了Modbus TCP的数据帧。Modbus TCP的典型特征是面向连接。Modbus TCP在Modbus的基础上增加了连接操作,涵盖数据交换和连接操作。在TCP中,一个连接请求很容易被识别并建立,一个连接可以承载多个独立的数据交换。此外,TCP允许大量的并发连接,连接发起者可以自由选择另外建立一个连接或保持一个长期连接。

图2.7 Modbus协议结构

串行链路上的Modbus协议采用主站/从站模式,且仅能存在一个Modbus主站,但可以存在多个Modbus从站,通过设备站号/地址来识别。发出数据请求的是主站,做出数据应答的是从站。TCP/IP上的Modbus协议采用客户机/服务器模式,发出数据请求的一方为客户机,做出数据应答的一方为服务器。Modbus TCP以太网作为物理层,将Modbus报文嵌入TCP/IP应用层,通信质量取决于TCP/IP及物理通道,依托于TCP/IP的传输层协议,TCP保证了Modbus协议在通信过程中的安全性、可靠性及准确性。

Modbus协议的一系列操作都是以Modbus寄存器为基础的,Modbus寄存器是逻辑上的寄存器,并非真实的物理寄存器。Modbus协议定义了4种寄存器,即保持寄存器、线圈寄存器、输入寄存器及离散寄存器,如表2.3所示。不同寄存器代表不同的Modbus数据模型,具有不同的物理意义。

表2.3 Modbus寄存器的特性

Modbus协议标准也规定了对Modbus数据模型的操作,不同Modbus功能码代表不同操作,如表2.4所示。

表2.4 功能码

2.Modbus报文解析

Modbus协议规定了与数据链路层、物理层无关的通用协议数据单元(Protocol Data Unit,PDU),通用Modbus报文结构如图2.8(a)所示。但Modbus在通信时,总要依赖物理网络,因此,要把PDU映射到物理网络上,这就形成了应用数据单元(Application Data Unit,ADU)。Modbus协议采用大端模式,即在传输两个或两个以上字符时,先发送地址和数据的高字节。

对于串行链路上或以太网上的Modbus协议,其通用Modbus报文结构需要在Modbus协议数据单元添加固定格式。Modbus在串行链路上的报文结构在PDU基础上添加了地址域和校验字节,Modbus RTU报文结构如图2.8(b)所示。ADU为256字节,其中,地址占用1字节,校验码占用2字节。每个从站地址均在1~147(不包括预留的)中,地址0用于广播(此时从站不需要响应主站),主站不需要地址。

Modbus TCP弱化了设备地址,用IP地址来取代设备地址。同时,鉴于TCP本身带有校验,因此,Modbus TCP报文不再保留地址域和CRC校验,只包含协议数据单元。Modbus TCP报文在Modbus协议数据单元头部添加了MBAP报文头,其中包括长度、单元标志符等字段域,共7个字节,如图2.9所示。Modbus TCP在通信时,使用502端口,因此,系统要进行预留。

下面举一个Modbus TCP功能码为01的客户机和服务器通信的案例,已知服务器(PLC)中物理线圈(Y32~Y37)的存储值为35,即Y37、Y36、Y34和Y32为ON,其他位为OFF。线圈对应的寄存器地址范围为0x0020~0x0025。现在客户机要求读取服务器中物理线圈(Y32~Y37)的状态。从物理层到TCP层的报文不做分析,从应用层Modbus应用数据ADU开始分析,请求报文是0000 0000 0006 02 01 0020 0006,回应报文是0000 0000 0004 06 01 01 35,如表2.5和表2.6所示。

图2.8 通用Modbus报文结构和Modbus RTU报文结构

图2.9 Modbus TCP报文结构

表2.5 客户机向服务器发送请求报文解析

表2.6 服务器向客户机发送回应报文解析

这里再举一个Modbus TCP功能码为03的客户机和服务器通信的案例。客户机IP地址为192.169.1.75,服务器IP地址为192.168.1.100。客户机读取服务器的11个保持寄存器(从400001到400011)。用Wireshark抓取客户机查询服务器通信,如图2.10所示。这里可以看到,作为应用层,Modbus TCP在TCP层的下面,而Modbus在Modbus TCP层的下面。从图2.10中还可以看出Modbus TCP报文结构、Modbus报文结构。可以看出,查询时,客户机发送的Modbus TCP报文为03 c3 00 00 00 06 01 03 00 00 00 0b,其中,Modbus报文是03 00 00 00 0b。

图2.10 Wireshark抓取的客户机查询服务器通信数据包

用Wireshark抓取服务器响应客户机的数据包,如图2.11所示。Modbus服务器返回的Modbus TCP报文如图2.11中加底色的部分(从03 c3开始,到02 58结束)。其中,7f fe是第一个寄存器(在图2.11中是Register 0,即400001)采样的数值(十进制为32766),其他寄存器的数值都为0。TCP报首从01 f6开始,到Modbus TCP报文起始的03前结束,共20个字节。其中,01 f6是源端(从站或服务器)的端口号502。

图2.11 Wireshark抓取的服务器响应客户机的数据包

2.3.3 Modbus通信仿真工具

Modbus Poll和Modbus Slave分别是常用的Modbus主站和Modbus从站的模拟程序,实用性强,十分便于Modbus通信程序的开发和调试。

(1)Modbus主站仿真软件Modbus Poll。

该软件主要用于测试和调试Modbus从站,支持Modbus RTU、ASCII、TCP/IP等通信协议。它支持多文档接口,即可以同时监视多个从站/数据域。在每个窗口简单地设定从站的ID、功能、地址、大小和轮询间隔等。用户可以从任意一个窗口读/写寄存器/线圈值,也可以双击该数值来改变一个单独的寄存器或多个寄存器/线圈值。软件提供多种数据格式,包括浮点、双精度、长整型(可以交换字节序列)等。

(2)Modbus从站仿真软件Modbus Slave。

该软件可以仿真32个从站/地址域,每个接口都提供了对Excel报表的OLE自动化支持,主要用来模拟Modbus从站设备,接收主站的命令包,并发送数据包。该软件可以帮助Modbus通信设备开发人员进行Modbus通信协议的模拟和测试,用于模拟、测试、调试Modbus通信设备。可以在32个窗口中模拟多达32个Modbus子设备。该软件与Modbus Poll的用户界面相同,支持的Modbus功能码有01(读取线圈状态)、02(读取输入状态)、03(读取保持寄存器)、04(读取输入寄存器)、05(强置单线圈)、06(预置单寄存器)、15(强置多线圈)、16(预置多个寄存器)、22(位操作寄存器)和23(读/写寄存器)。

(3)Modbus Poll与Modbus Slave通信模拟。

这里,为方便起见,在一台计算机中分别运行Modbus Poll与Modbus Slave软件,在两个软件的连接设置中进行连接参数设置,如图2.12所示。设置Modbus UDP/IP连接,IP地址就是计算机的网卡IP地址,端口号默认为502。注意保持主站和从站的网络参数一致。

如果选串行通信方式测试Modbus Poll与Modbus Slave之间的通信,除了需要设置串行通信参数,还要用虚拟串口软件虚拟出一个串口用于主站/从站通信。同样,主站/从站之间的通信参数要一致。

在Modbus Poll的Setup中选择保持寄存器。连接成功后,可以在主站或从站修改寄存器数据,在从站或主站能看到参数的传递,两者的数值是一定的,图2.13所示为采用Modbus UDP协议通信时Modbus Poll与Modbus Slave的通信界面。

图2.12 Modbus Poll与Modbus Slave的连接设置界面

图2.13 采用Modbus UDP协议通信时Modbus Poll与Modbus Slave的通信界面 4k7RjGlaeSkS1/M7Mi0tJInja+gD7ueJ6njxxxAzefhjMkuFNBFKgTxbLlm1mgsY

点击中间区域
呼出菜单
上一章
目录
下一章
×