Modbus RTU协议

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)
  • 数据域(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和传感器之间的通信中发挥着重要作用。然而,由于没有内建的安全机制,在使用时需要确保网络和通信的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值