Modbus是一种串行通信协议,最初由Modicon公司(现为施耐德电气的一部分)在1979年为使用其PLC(可编程逻辑控制器)而开发。Modbus已成为工业领域内广泛使用的一种通信协议,特别是对于监控和控制系统。Modbus协议支持多种通信方式,包括RTU(Remote Terminal Unit,远程终端单元模式)、TCP/IP和ASCII(美国标准信息交换码)等。
本文主要介绍Modbus RTU、Modbus TCP和Modbus ASCII的报文结构。
1.Modbus RTU
1.1简介
Modbus RTU(Remote Terminal Unit)是一种在串行通讯中广泛使用的协议,主要应用于工业领域的设备之间。这个协议是基于主/从(或客户端/服务器)架构,允许主机(通常称为Master)与多个从机(通常称为Slave)进行通信。在Modbus RTU协议中,数据通过二进制形式传输,使得通信更加高效。
1.2报文格式
一个典型的Modbus RTU报文结构如下:
用途
设备地址
功能码
数据
CRC校验
长度
8bit
8bit
可变(0到252个8bit)
16bit
描述
每个从机都有一个唯一的地址。地址范围从0到247。地址0是广播地址,向所有从机发送消息,但从机不会对广播信息进行应答。
用于指定主机要求从机执行的操作类型
数据部分的长度可变,包含了命令的具体参数,确切格式和长度取决于功能码。
用于检查数据在传输过程中是否有错误。
1.3报文详解
1.3.1设备地址
1.3.1.1地址范围
- 在Modbus RTU中,每个从机被分配一个唯一的地址,用于在网络上标识。
- 这个地址是一个8位的数值,范围从0到247。
- 通常情况下,地址0是保留的,用于广播命令,即发送给网络上所有设备的命令。
- 地址248到255通常是保留给特殊功能或未来使用的。
1.3.1.2地址配置
- 设备地址通常需要在设备接入Modbus网络之前就进行配置。
- 不同的设备制造商可能会提供不同的方法来设置这些地址,例如通过拨码开关、软件界面或者直接通过Modbus命令。
1.3.1.3通信过程
- 当主机向从机发送命令时,主机会在消息的开始部分包含从机的地址。从机收到消息后,会先检查消息地址,如果消息是发给自己的,则会执行,否则会抛弃。
- 对广播地址(0),所有设备都会执行该命令。
1.3.1.4地址冲突
- 如果两个或更多的设备被设置成相同的地址,会导致地址冲突,进而导致通信失败。
1.3.2 功能码
在 Modbus 标准协议中,功能码总共分为三类:公用功能码、自定义功能码、保留功能码。
- 公用功能码即经过Modbus协会确认,并提供了公开文档的功能码。在文档中被明确定义,确保唯一。
- 自定义功能码为各厂家(用户)自定义的功能码,不保证唯一性。
- 保留功能码是在报文格式不给范的时候使用的一些功能码,现在已经不作为公共使用了。
(公用功能码和自定义功能码的区别可以近似对比计算机的熟知端口和注册端口)
1.3.2.1 读取功能码
- 01 (0x01): 读线圈状态(Read Coils)- 用于读取一组逻辑线圈的当前状态(ON/OFF)。
- 02 (0x02): 读离散输入状态(Read Discrete Inputs)- 用于读取一组离散输入的状态(ON/OFF)。
- 03 (0x03): 读保持寄存器(Read Holding Registers)- 用于读取一组保持寄存器中的二进制内容。
- 04 (0x04): 读输入寄存器