Modbus
Modbus
简介
Modbus是一个位于应用层的消息传递协议,位于OSI模型第七层.它为连接在不同总线或者网络上的设备之间提供客户端/服务器通信.
自1979年以来,Modbus一直是业界公认的串行标准,至今仍在为数以百万计的自动化设备提供通信服务.
Modbus是一种请求应答协议,提供功能代码(Function Code)指定的服务.
目前它主要基于以下几种媒介实现:
- TCP/IP over Ethernet.
- Asynchronized serial transmission over a variety of media(EIA/TIA-232-E(RS-232),EIA-422,EIA/TIA-485-A(RS-485),光纤,无线广播等).
- Modbus PLUS,高速令牌传递网络.
备注: Modbus在TCP/IP协议栈上的保留端口为502.
Modbus通信协议栈
Modbus网络架构
协议描述
协议组成
Modbus定义了一个简单,独立于通信层的协议数据单元(PDU).Modbus协议在特定总线或者网络上的实现,可以在应用数据单元(ADU)中引入额外的字段.一般的Modbus数据帧如下图所示:
PDU
PDU由功能码(Function Code),数据组成:
- 功能码指明了服务器应该执行何种操作.它被编码为1个字节,取值范围为[1,255]的整数(其中128-255被保留,作为异常码使用),在一些功能码中添加子功能码(子功能代码位于数据字段内),可以为一个功能码定义多个操作.
- 数据是客户端传递给服务端为执行执行功能码指定操作的附带信息,可以是离散地址,寄存器地址,要处理项的数量等.在某些类型的请求中,数据字段可能不存在.
PDU的最大值为256字节,这个最大值受限于第一个modbus在串口网络的实现(max RS485 ADU = 256 bytes)
因此:
1 | Modbus PDU for serial line communication = 256 - Server address (1 byte) - CRC(2 bytes) = 253 bytes |
故而
1 | RS232/RS485 ADU = 253 + Server Address (1 byte) + CRC (2 bytes) = 256 bytes |
Modbus 一共定义了三种PDU
- Modbus Request PDU, mb_req_pdu.
- Modbus Response PDU, mb_rsp_pdu.
- Modbus Exception Response PDU, md_excep_rsp_pdu.
Modbus Request PDU
由功能码 + 请求数据组成:
功能码: 1个字节,
请求数据: n个字节,可取值:变量引用,变量数量,数据偏移,子功能代码等.
Modbus Response PDU
由功能码 + 响应数据组成:
功能码: 1个字节,
响应数据: n个字节,可取值:变量引用,变量数量,数据偏移,子功能代码等.
Modbus Exception Response PDU
由异常功能码 + 请求数据组成:
异常代码: 1个字节,是功能代码+0x80.
ADU
ADU(Modbus Frame with Serial Transmission)
基于串口通信的ADU由设备地址(1 bytes),PDU(253 bytes),错误校验组成(2 bytes).
ADU(Modbus Frame With TCP/IP Transmission)
基于TCP/IP实现的ADU由MBAP(7 bytes),PDU(253 bytes)组成.
MBAP由事务标识符,协议标识符,长度,单位标识符组成,如下图所示:
- 事务标识符,用于事务匹配,服务器在响应中复制客户端请求中的值.如果客户端在每次查询时生成唯一的表示符,则可以为此查询分配唯一的响应.
- 协议标识符,由于使用Modbus协议,因此此字段始终为0.
- 长度,数据长度,包括单位标识符(1 byte),函数代码(1 byte)和数据.
- 单位标识符,对应基于串口通信的Modbus协议ADU中的设备地址.此字段用于内部系统路由,如果控制器不支持路由,此字段始终为0.
备注:由于TCP/IP数据链路层的校验机制保证了数据的完整性,因此Modbus TCP的报文中不再带有数据校验.
数据编码字节序
Modbus协议在发送数据时,采用与网络一样大端字节序发送数据,首先发送MSB.
Modbus数据模型
基本表 | 对象类型 | 访问类型 | 注释 |
---|---|---|---|
离散量输入 | 单个位 | 只读 | I/O系统可提供这种类型的数据 |
线圈 | 单个位 | 读写 | 通过应用程序可以改变这种类型的数据 |
输入寄存器 | 16位 字 | 只读 | I/O系统可提供这种类型的数据 |
保持寄存器 | 16位 字 | 读写 | 通过应用程序可以改变这种类型数据 |
对于每一个基本表,协议都允许单个地选择65535个数据项.
实现示例
设备组织数据的方法有很多种,每个设备根据其应用都有自己的组织数据的方法.
- 示例1,含有四个独立块的设备
2. 示例2,含有单个独立块的设备
Modbus寻址模型
Modbus应用协议精确地定义了PDU寻址规则.
在Modbu PDU中,从065535寻址每一个数据.n的元素构成.
Modbus应用协议明确地规定了由四个块构成的Modbus数据模型,每个块由几个编号为1
在Modbus数据模型中,从1~n来编号每一个元素.
Modbus数据模型和设备应用之间的映射完全与特定设备无关.
Modbus事务定义
如图所示描述了在服务侧Modbus事务处理的一般处理流程
一旦服务器处理请求,就必须使用相应的Modbus服务器事务处理生成Modbus响应.
根据处理结果,可以建立两种类型响应:
- 一个正常的Modbus响应:响应功能码=请求功能码
- 一个异常的Modbus响应:异常功能码=请求功能码 + 0x80
用来为客户机提供处理过程中与所发现的差错相关的信息,提供异常码来表示发生差错的原因.
功能码类别
共有三类Modbus功能码,分为为:公共功能码,用户自定义功能码,保留功能码.它们的分布如下:
公共功能码
- 被确切定义的功能码.
- 保证是唯一的.
- 由MODBUS.org组织验证.
- 公开文档.
- 可进行一致性测试.
- 包含已被定义的公共功能码和保留给未来使用的功能码.
用户自定义功能码
- 共有两个用户自定义功能码区域,即十进制的65-72,100-110.
- 用户无需Modbus组织的任何批准就可以选择和实现一个功能码.
- 不能保证被选用的功能码的使用是唯一的.
- 如果用户希望将某种功能设置为一个公共功能码,那么用户必须启动RFC,以便将这种变更引入公共分类中,并且指配一个新的公共功能码.
保留功能码
某些公司在传统产品上先行使用的功能码,不作为公共使用.