Modbus简介
Modbus是莫迪康公司在1979年开发的一种应用层报文传输协议,作为一个开源协议,Modbus可以使用以太网和串行通信接口。由于易于部署和维护,可靠性强,所以Modbus已经成为工业领域标准通信协议。
Modbus类型
Modbus共有三种类型:
Modbus ASCII:
它基于ASCII字符编码,并使用一种基于字符的通信方式。
在Modbus ASCII中,每个字节被表示为两个ASCII字符,以便在不同设备之间进行可靠的传输。通信的起始标志是冒号(:),而结束标志是回车(CR)和换行(LF)字符。
Modbus RTU
它采用二进制编码,以字节为基本单位进行通信。
在Modbus RTU中,通信的起始标志是一个传输间隔(为逻辑0),而结束标志是通信间隔(为逻辑1)。
Modbus TCP/IP
它通过以太网网络进行数据传输和通信,使得Modbus通信可以与现代网络技术结合起来。
在Modbus TCP/IP中,数据以TCP/IP报文的形式进行传输。它使用标准的Ethernet网络和TCP/IP协议栈,通过IP地址和端口号来标识设备和通信通道。
Modbus RTU
Modbus RTU 采用二进制编码和CRC错误校验,因此配置为ASCII模式的设备无法和配置为RTU的设备进行通信。RTU设备通常使用三种接口进行通信:RS-232、RS-485、RS-422。
地址码 | 功能码 | 数据区 | 错误校验码 |
8位 | 8位 | N X 8位 | 16位 |
一般通信距离在15米以下时,使用RS-232接口。大于15米时,使用RS-485或者RS-422。
目前比较流行性使用RS-485接口,单位负载下可以接32个从机。通信距离最远可达到1200m。
Modbus RTU 网络上的所有设备必须使用相同的波特率,波特率的典型范围在9600到19600之间。
Modbus串行通信网络上只有一个主设备,从机只有收到主机指令之后,才会发送消息,每个从机有唯一的通信地址。如果使用RS-485接口的话,在标准负载的情况下,只能最多接32个从机,如果需要接入的从机数量超过32个的话,就需要添加中继器。
主机可以写入从机数据也可以读取从机的数据,在实际应用中,通常是SCADA和HMI等主机设备需要和其他的Modbus从机设备建立通信,必须使用菊花链的方式连接各个设备,不能使用星形网络拓扑。
功能码 | 描述 | PLC地址 | 寄存器地址 | 位/字操作 | 操作数量 |
0x01 | 读线圈寄存器 | 00001-09999 | 0x0000-0xFFFF | 位操作 | 单个或多个 |
0x02 | 读离散输入寄存器 | 10001-19999 | 0x0000-0xFFFF | 位操作 | 单个或多个 |
0x03 | 读保持寄存器 | 40001-49999 | 0x0000-0xFFFF | 字操作 | 单个或多个 |
0x04 | 读输入寄存器 | 30001-39999 | 0x0000-0xFFFF | 字操作 | 单个或多个 |
0x05 | 写单个线圈寄存器 | 00001-09999 | 0x0000-0xFFFF | 位操作 | 单个 |
0x06 | 写单个保持寄存器 | 40001-49999 | 0x0000-0xFFFF | 字操作 | 单个 |
0x0F | 写多个线圈寄存器 | 00001-09999 | 0x0000-0xFFFF | 位操作 | 单个 |
0x10 | 写多个保持寄存器 | 40001-49999 | 0x0000-0xFFFF | 字操作 | 单个 |
主机通过功能码告诉从机执行什么动作,如果从机返回的功能码一致,则表明从机已执行操作。如果从机返回的功能码的最高位为1,则表明从机没有响应操作或发送出错。
Modbus TCP/IP
Modbus使用以太网进行传输时,设备之间使用网线,通过交换机进行连接,与传统的TCP/IP协议不同,Modbus TCP/IP使用的是MBAP(Modbus Application Header)模式,Modbus协议头包在每个消息的头部。
Modbus RTU消息头部的从机地址和尾部CRC冗余校验,都可以去除,MBAP包含了将信息路由到设备地址的所有信息,Modbus协议使用502端口进行TCP/IP通信。
Modbus串行通信的RTU消息也可以也可以封装在TCP/IP数据包中进行发送,MBAP和封装RTU消息两种方式并不兼容。
目前流行的Modbus TCP/IP通信,还是使用MBAP的消息封装形式。
Modbus TCP/IP中不再使用主机从机的名称,而是使用服务器和客户端,整个TCP/IP网络中的服务器和客户端通过交换机连接,Modbus TCP/IP进行寻址时,需要进行网络配置。IP地址表示设备在网络上的具体位置,子网掩码可以减少路由表的路由项,提高转发速度。默认网关可以把消息发送到其他网络中寻找目标主机。
Modbus协议定义的数据模型
区块 | 访问长度 | 访问方式 | 说明 |
线圈 | 位(bit) | 读/写 | 可通过应用程序改写 |
离散量输入 | 位(bit) | 只读 | 数据由IO系统提供 |
输入寄存器 | 字(word) | 只读 | 数据由IO系统提供 |
保持寄存器 | 字(word | 读/写 | 可通过应用程序改写 |
Modbus协议允许设备将四种数据分别映射到不同存储区块中,各个区块之间互相独立,使用不同的功能码。可以读取到不同的数值。
Modbus协议也允许设备将四种数据映射到统一存储区块中,这样通过不同的功能码读取数据可能会得到相同的数据,比如输入寄存器和保持寄存器为同一物理区块。
Modbus协议的地址模型
Modbus数据模型 | Modbus地址范围 |
线圈地址范围 | 00001~09999 |
离散量输入地址范围 | 10001~19999 |
输入寄存器地址范围 | 30001~39999 |
保持寄存器地址范围 | 40001~49999 |
地址模型通过编号的方式对不同类型数据进行区分,Modbus地址模型的编号从1开始。理论上每一种数据,都最大支持65536个元素,但由于65536是比较大的数值,实际应用一般不需要这么大的存储区,因此PLC厂家普遍采用的是10000以内的地址范围。