Modbus RTU协议(Modbus Remote Terminal Unit) 是一种常用于工业自动化领域的串行通信协议,尤其用于监控和控制设备之间的数据交换。它基于主从(Master-Slave)模式,主要应用于通过串行通信接口(如RS-232、RS-485等)连接PLC(可编程逻辑控制器)、传感器、仪表等设备。
1. Modbus RTU协议的基本概念
Modbus RTU模式是二进制模式,数据流以字节为单位传输,每个字节的高位首先发送。传输数据时,使用了差错检测机制,以确保数据的完整性。通常RTU模式通过RS-485总线进行通讯,因为它能够支持多个设备(最多247个设备)并且支持长距离传输。
2. Modbus RTU通信的帧结构
Modbus RTU通信的数据帧(Data Frame)包括以下几个部分:
-
地址域(Address Field):
- 1字节,表示从设备的地址。主机通过该地址识别和选择与之通信的从设备。
-
功能码(Function Code):
- 1字节,表示主机请求从设备执行的操作类型。常见的功能码包括:
- 0x01:读离散线圈(Read Coils)
- 0x02:读离散输入(Read Discrete Inputs)
- 0x03:读保持寄存器(Read Holding Registers)
- 0x04:读输入寄存器(Read Input Registers)
- 0x05:写单个线圈(Write Single Coil)
- 0x06:写单个寄存器(Write Single Register)
- 0x0F:写多个线圈(Write Multiple Coils)
- 0x10:写多个寄存器(Write Multiple Registers)
- 1字节,表示主机请求从设备执行的操作类型。常见的功能码包括:
-
数据域(Data Field):
- 由主机请求或从设备响应的数据内容组成。数据内容的格式取决于功能码。例如,读取多个寄存器时,数据域会包含多个寄存器的值。
-
错误检查域(Error Check Field):
- 2字节,用于CRC(循环冗余校验)。用于验证数据传输的完整性。
3. Modbus RTU协议中的功能码
1. 功能码 0x01 — 读线圈(Read Coils)
- 作用:读取从机设备的一个或多个离散输出线圈(Coils)的状态。线圈通常用于表示数字输出(如开关、继电器等)。
- 数据类型:每个线圈的状态是一个比特(0或1)。
- 最大读取数量:一次最多可以读取2000个线圈(由最大传输长度限制)。
请求格式:
- 功能码:0x01
- 数据字段:包含起始地址(2字节)和读取数量(2字节)。
响应格式:
- 功能码:0x01
- 字节计数:1字节,表示返回的数据字节数。
- 数据字段:按顺序返回请求的线圈状态,每8个线圈使用1个字节表示(每个字节的位表示一个线圈的状态)。
2. 功能码 0x02 — 读离散输入(Read Discrete Inputs)
- 作用:读取从机设备的一个或多个离散输入的状态。离散输入通常用于读取数字信号(如传感器、开关的状态)。
- 数据类型:每个离散输入的状态是一个比特(0或1)。
- 最大读取数量:一次最多可以读取2000个离散输入(由最大传输长度限制)。
请求格式:
- 功能码:0x02
- 数据字段:包含起始地址(2字节)和读取数量(2字节)。
响应格式:
- 功能码:0x02
- 字节计数:1字节,表示返回的数据字节数。
- 数据字段:按顺序返回请求的离散输入状态,每8个输入使用1个字节表示。
3. 功能码 0x03 — 读保持寄存器(Read Holding Registers)
- 作用:读取从机设备的一个或多个**保持寄存器(Holding Registers)**的值。保持寄存器通常用于存储模拟值(如温度、压力、流量等)或系统参数。
- 数据类型:每个寄存器为2字节(16位),可以表示整数、浮点数等。
- 最大读取数量:一次最多可以读取125个寄存器(由最大传输长度限制)。
请求格式:
- 功能码:0x03
- 数据字段:包含起始地址(2字节)和读取数量(2字节)。
响应格式:
- 功能码:0x03
- 字节计数:1字节,表示返回的数据字节数(返回数据是2字节的倍数)。
- 数据字段:按顺序返回请求的寄存器值,寄存器的内容为16位的数据。
4. 功能码 0x04 — 读输入寄存器(Read Input Registers)
- 作用:读取从机设备的一个或多个**输入寄存器(Input Registers)**的值。输入寄存器通常用于存储传感器的模拟输入值,如温度、压力等。
- 数据类型:每个寄存器为2字节(16位),可以表示整数、浮点数等。
- 最大读取数量:一次最多可以读取125个寄存器(由最大传输长度限制)。
请求格式:
- 功能码:0x04
- 数据字段:包含起始地址(2字节)和读取数量(2字节)。
响应格式:
- 功能码:0x04
- 字节计数:1字节,表示返回的数据字节数(返回数据是2字节的倍数)。
- 数据字段:按顺序返回请求的输入寄存器值,寄存器的内容为16位的数据。
5. 功能码 0x05 — 写单个线圈(Write Single Coil)
- 作用:向从机设备的单个输出线圈写入一个值。用于控制开关、继电器等设备的开/关状态。
- 数据类型:写入值为1(开)或0(关)。
请求格式:
- 功能码:0x05
- 数据字段:包含目标线圈地址(2字节)和写入值(2字节,0xFF00表示开,0x0000表示关)。
响应格式:
- 功能码:0x05
- 数据字段:返回被写入的线圈地址和写入的值。
6. 功能码 0x06 — 写单个寄存器(Write Single Register)
- 作用:向从机设备的单个保持寄存器写入一个值。用于设置或调整设备参数。
- 数据类型:写入的值为16位数据。
请求格式:
- 功能码:0x06
- 数据字段:包含目标寄存器地址(2字节)和写入值(2字节)。
响应格式:
- 功能码:0x06
- 数据字段:返回被写入的寄存器地址和写入的值。
7. 功能码 0x0F — 写多个线圈(Write Multiple Coils)
- 作用:向从机设备的多个输出线圈写入状态。可以同时设置多个线圈的开关状态。
- 数据类型:每个线圈的状态是一个比特(0或1)。
- 最大写入数量:一次最多可以写入1968个线圈。
请求格式:
功能码:0x0F
数据字段:包含起始地址(2字节)、要写入的线圈数量(2字节)、字节计数(1字节)、数据字段(多个字节,表示每个线圈的状态)。
响应格式:
功能码:0x0F
数据字段:返回被写入的线圈起始地址和数量。
8. 功能码 0x10 — 写多个寄存器(Write Multiple Registers)
- 作用:向从机设备的多个保持寄存器写入值。可以一次写入多个寄存器,通常用于配置多个参数。
- 数据类型:每个寄存器为2字节(16位)。
- 最大写入数量:一次最多可以写入123个寄存器。
请求格式:
- 功能码:0x10
- 数据字段:包含起始地址(2字节)、要写入的寄存器数量(2字节)、字节计数(1字节)、数据字段(多个字节,表示每个寄存器的值)。
响应格式:
- 功能码:0x10
- 数据字段:返回被写入的寄存器起始地址和数量。
9. 功能码 0x11 — 读文件记录(Read File Record)
- 作用:读取从机设备的一个或多个文件记录。该功能用于读取数据表或多个寄存器的值。
请求格式:
- 功能码:0x11
- 数据字段:包含文件起始地址和数量。
响应格式:
- 功能码:0x11
- 数据字段:返回读取的数据。
10. 功能码 0x14 — 读异常状态(Read Exception Status)
- 作用:读取从机设备的异常状态。主要用于诊断和检测设备的健康状况。
请求格式:
- 功能码:0x14
- 数据字段:包含设备的异常状态请求。
响应格式:
- 功能码:0x14
- 数据字段:返回异常状态。
11. 功能码 0x16 — 写文件记录(Write File Record)
- 作用:向从机设备写入一个或多个文件记录。
请求格式:
- 功能码:0x16
- 数据字段:包含要写入的文件记录内容。
响应格式:
- 功能码:0x16
- 数据字段:返回写入结果。
12. 功能码 0x17 — 常规支持(Report Slave ID)
- 作用:请求从机返回其设备标识符和状态信息。
请求格式:
- 功能码:0x17
响应格式:
- 功能码:0x17
- 数据字段:设备标识符、状态信息等。
4. Modbus RTU协议的数据传输
Modbus RTU协议的数据传输采用的是异步传输方式,设备之间的数据通信是通过串行总线(如RS-485或RS-232)实现的。数据在网络上逐位传输,传输过程中使用CRC校验来确保数据完整性。
- 主机(Master) 发起请求,从机(Slave) 响应请求。
- 每次通信只会涉及一个主机和一个从机,主机可以轮询多个从机,但每个时刻只有一个从机响应。
- 主机通过地址字段来区分各个从机设备。
- 主机通过功能码告诉从机需要执行的操作,比如读取数据或写入数据。
5. Modbus RTU的错误处理
Modbus RTU协议采用CRC-16(循环冗余校验)来进行数据校验。传输的数据经过CRC校验后,从机会在接收到请求时进行校验。如果数据完整且有效,从机会执行请求的操作并返回响应。如果校验失败,从机会发送一个异常响应,主机根据该响应判断是否重新发送请求。
常见的错误码包括:
- 0x01: 无效功能码(非法的功能码)
- 0x02: 地址错误(非法的地址)
- 0x03: 数据错误(例如请求的数据超出了设备范围)
- 0x04: 设备故障(设备发生故障,无法处理请求)
6. Modbus RTU的优缺点
优点:
- 简单性:Modbus RTU协议相对简单,易于实现,且具有广泛的应用。
- 兼容性强:支持多种不同的设备、平台和硬件接口(如RS-485、RS-232等)。
- 错误检测:通过CRC校验机制,数据传输的可靠性得到保障。
- 效率高:由于采用二进制格式,RTU模式的数据传输效率较高,适合高频率的数据交换。
缺点:
- 主从结构限制:Modbus RTU采用主从结构,主机必须主动发起通信请求,主机和从机之间的通信较为单一。
- 数据量限制:每次请求和响应的数据量受到最大字节数的限制,一般在256个字节以内。
- 没有内建安全机制:Modbus RTU协议本身不具备加密和认证机制,存在一定的安全隐患,尤其是在开放的网络环境下。
7. Modbus RTU应用场景
Modbus RTU协议广泛应用于各种工业自动化系统中,特别适合于以下场景:
- PLC控制系统:Modbus RTU通常用于PLC之间或PLC与外围设备(如传感器、执行器、变频器等)之间的通信。
- 楼宇自动化:在建筑物的楼宇自动化控制系统中,Modbus RTU用于控制和监控不同的设备,如空调、照明、安防系统等。
- 能源监控:用于对电力、气体、水等能源系统进行实时监控和控制。
- 智能制造:Modbus RTU协议用于设备之间的自动化控制和数据采集,实现智能制造和设备联网。
总结
Modbus RTU协议是工业控制系统中一种非常常见的通信协议,以其简单、可靠和高效的特点被广泛应用于各类设备的串行通信中。它适合小型到中型的系统,尤其在现场设备、PLC和传感器之间的通信中发挥着重要作用。然而,由于没有内建的安全机制,在使用时需要确保网络和通信的安全性。