GB/T××××—××××2第一部分:Modbus协议1引言1.1范围MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。自从1979年出现工业串行链路的事实标准以来,MODBUS使成千上万的自动化设备能够通信。目前,继续增加对简单而雅观的MODBUS结构支持。互联网组织能够使TCP/IP栈上的保留系统端口502访问MODBUS。MODBUS是一个请求/应答协议,并且提供功能码规定的服务。MODBUS功能码是MODBUS请求/应答PDU的元素。本文件的作用是描述MODBUS事务处理框架内使用的功能码。1.2规范性引用文件1.RFC791,互联网协议,Sep81DARPA2.MODBUS协议参考指南RevJ,MODICON,1996年6月,doc#PI_MBUS_300MODBUS是一项应用层报文传输协议,用于在通过不同类型的总线或网络连接的设备之间的客户机/服务器通信。目前,使用下列情况实现MODBUS:以太网上的TCP/IP。各种媒体(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行传输。MODBUSPLUS,一种高速令牌传递网络。MODBUS应用层基于TCP的ModbusTCPIP其它MODBUS+/HDL主站/从站以太网II/802.3其它物理层EIA/TIA-232或EIA/TIA-485以太网物理层图1:MODBUS通信栈2缩略语ADU应用数据单元GB/T××××—××××3HDLC高级数据链路控制HMI人机界面IETF因特网工程工作组I/O输入/输出设备IP互连网协议MAC介质访问控制MBMODBUS协议MBAPMODBUS协议PDU协议数据单元PLC可编程逻辑控制器TCP传输控制协议3背景概要MODBUS协议允许在各种网络体系结构内进行简单通信。MODBUSONMB+MODBUSONRS232MODBUSONRS485驱动器PLCHMII/OI/OI/OPLC驱动器PLCHMII/O驱动器PLCI/OI/O驱动器I/O网关网关网关MODBUS通信MODBUSONTCP/IP图2:MODBUS网络体系结构的实例每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用MODBUS协议来启动远程操作。在基于串行链路和以太TCP/IP网络的MODBUS上可以进行相同通信。一些网关允许在几种使用MODBUS协议的总线或网络之间进行通信。4总体描述4.1协议描述MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS协议映射能够在应用数据单元(ADU)上引入一些附加域。GB/T××××—××××4地址域功能码数据差错校验ADUPDU图3:通用MODBUS帧启动MODBUS事务处理的客户机创建MODBUS应用数据单元。功能码向服务器指示将执行哪种操作。MODBUS协议建立了客户机启动的请求格式。用一个字节编码MODBUS数据单元的功能码域。有效的码字范围是十进制1-255(128-255为异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。向一些功能码加入子功能码来定义多项操作。从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息。功能码仅说明操作。如果在一个正确接收的MODBUSADU中,不出现与请求MODBUS功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。如果出现与请求MODBUS功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。例如,客户机能够读一组离散量输出或输入的开/关状态,或者客户机能够读/写一组寄存器的数据内容。当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常响应来说,服务器仅对原始功能码响应。启动请求功能码数据请求操作码接收响应数据响应执行操作启动响应客户机服务器图4:MODBUS事务处理(无差错)对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1。GB/T××××—××××5启动请求功能码数据请求差错码接收响应异常码在操作中检测的差错启动差错客户机服务器图5MODBUS事务处理(异常响应)F注释:需要管理超时,以便明确地等待可能不会出现的应答。串行链路上第一个MODBUS执行的长度约束限制了MODBUSPDU大小(最大RS485ADU=256字节)。因此,对串行链路通信来说,MODBUSPDU=256-服务器地址(1字节)-CRC(2字节)=253字节。从而:RS232/RS485ADU=253字节+服务器地址(1byte)+CRC(2字节)=256字节。TCPMODBUSADU=249字节+MBAP(7字节)=256字节。MODBUS协议定义了三种PDU。它们是:lMODBUS请求PDU,mb_req_pdulMODBUS响应PDU,mb_rsp_pdulMODBUS异常响应PDU,mb_excep_rsp_pdu定义mb_req_pdu为:mb_req_pdu={function_code,request_data},其中function_code-[1个字节]MODBUS功能码request_data-[n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。定义mb_rsp_pdu为:mb_rsp_pdu={function_code,response_data},其中function_code-[1个字节]MODBUS功能码response_data-[n个字节],这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。定义mb_excep_rsp_pdu为:mb_excep_rsp_pdu={function_code,request_data},其中function_code-[1个字节]MODBUS功能码+0x80exception_code-[1个字节],在下表中定义了MODBUS异常码。4.2数据编码lMODBUS使用一个‘big-Endian’表示地址和数据项。这意味着当发射多个字节时,首先发送最高有效位。例如:寄存器大小值GB/T××××—××××616–比特0x1234发送的第一字节为0x12然后0x34F注释:更详细的信息参见[1]。4.3MODBUS数据模型MODBUS以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:基本表格对象类型访问类型内容离散量输入单个比特只读I/O系统提供这种类型数据线圈单个比特读写通过应用程序改变这种类型数据输入寄存器16-比特字只读I/O系统提供这种类型数据保持寄存器16-比特字读写通过应用程序改变这种类型数据输入与输出之间以及比特寻址的和字寻址的数据项之间的区别并没有暗示任何应用操作。如果这是对可疑对象核心部分最自然的解释,那么这种区别是可完全接受的,而且很普通,以便认为四个表格全部覆盖了另外一个表格。对于基本表格中任何一项,协议都允许单个地选择65536个数据项,而且设计那些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。很显然,必须将通过MODBUS处理的所有数据放置在设备应用存储器中。但是,存储器的物理地址不应该与数据参考混淆。要求仅仅是数据参考与物理地址的链接。MODBUS功能码中使用的MODBUS逻辑参考数字是以0开始的无符号整数索引。lMODBUS模型实现的实例下例实例示出了两种在设备中构造数据的方法。可能有不同的结构,这个文件中没有全部描述出来。每个设备根据其应用都有它自己的数据结构。实例1:有4个独立块的设备下例实例示出了设备中的数据结构,这个设备含有数字量和模拟量、输入量和输出量。由于不同块中的数据不相关,每个块是相互独立。按不同MODBUS功能码访问每个块。GB/T××××—××××7设备应用存储器MODBUS访问MODBUS服务器设备MODBUS请求输入离散量线圈输入寄存器保存寄存器图6:带有独立块的MODBUS数据模型实例2:仅有1个块的设备在这个实例中,设备仅有1个数据块。通过几个MODBUS功能码可能得到一个相同数据,或者通过16比特访问或1个访问比特。设备应用存储器MODBUS请求输入离散量线圈输入寄存器保存寄存器MODBUS服务器设备RRWWMODBUS访问图7:仅带有1个块的MODBUS数据模型4.4MODBUS事务处理的定义下列状态图描述了在服务器侧MODBUS事务处理的一般处理过程。GB/T××××—××××8等待MB指示确认操作码确认数据地址确认数据值执行MB操作发送Modbus响应发送Modbus异常响应异常码_1异常码_2异常码_3异常码_4_5_6[接收MB指示][无效的][有效的][无效的][无效的][有效的][有效的][无效的][有效的]图8:MODBUS事务处理的状态图一旦服务器处理请求,使用合适的MODBUS服务器事务建立MODBUS响应。根据处理结果,可以建立两种类型响应:l一个正MODBUS响应:●响应功能码=请求功能码l一个MODBUS异常响应(参见第6.14节):l用来为客户机提供处理过程中与被发现的差错相关的信息;l响应功能码=请求功能码+0x80;l提供一个异常码来指示差错原因。5功能码分类有三类MODBUS功能码。它们是:公共功能码l是较好地被定义的功能码,l保证是唯一的,lMODBUS组织可改变的,l公开证明的,l具有可用的一致性测试,lMBIETFRFC中证明的,GB/T××××—××××9l包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。用户定义功能码l有两个用户定义功能码的定义范围,即65至72和十进制100至110。l用户没有MODBUS组织的任何批准就可以选择和实现一个功能码l不能保证被选功能码的使用是唯一的。l如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。保留功能码l一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。12711010072651公共功能码用户定义功能码公共功能码用户定义功能码公共功能码图9:MODBUS功能码分类GB/T××××—××××105.1公共功能码定义6功能码描述6.101(0x01)读线圈在一个远程设备中,使用该功能码读取线圈的1至2000连续状态。请求PDU详细说明了起始地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈1-16为0-15。根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为1=ON和0=OFF。第一个数据字节的LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。请求PDU功能码1个字节0x01起始地址2个字节0x0000至0xFFFF线圈数量2个字节1至2000(0x7D0)响应PDU功能码码子码(十六进制)页物理离散量输入读输入离散量020211内部比特读线圈010110比特访问或写单个线圈050516物理线圈写多个线圈150F37输入存储器读输入寄存器040414读多个寄存器03031316比特访问内部存储器写单个寄存器060617或写多个寄存器161039物理输出存储器读/写多个寄存器231747屏蔽写寄存器221646读文件记录2061442数据访问文件记录访问写文件记录2161544封装接口读设备识别码4