菜鸟科技网

Modbus协议命令有哪些具体类型?

Modbus协议是一种广泛应用于工业自动化领域的通信协议,由Modicon公司(现为施耐德电气)于1979年推出,旨在实现不同设备之间的串行通信,该协议基于主从架构,支持多种物理层(如RS-232、RS-485、以太网等)和传输模式(ASCII、RTU、TCP/IP),具有简单、开放、可靠的特点,成为工业设备互连的事实标准,Modbus协议的核心是通过特定的命令格式实现主从设备之间的数据交换,主要包括读取线圈状态、读取离散输入、读取保持寄存器、读取输入寄存器、写入单个线圈、写入单个寄存器、写入多个线圈和写入多个寄存器等功能命令,这些命令通过不同的功能码(Function Code)进行区分,每种功能码对应特定的操作类型,其数据帧结构通常包含设备地址、功能码、数据地址、数据数量和校验码等字段,确保通信的准确性和可靠性。

Modbus协议命令有哪些具体类型?-图1
(图片来源网络,侵删)

Modbus协议命令详解

Modbus协议的命令根据功能类型可分为两大类:一类是读操作命令,用于从从设备获取数据;另一类是写操作命令,用于向从设备写入数据,以下对常用命令的功能码、数据格式及应用场景进行详细说明:

读操作命令

  • 功能码01(读取线圈状态):用于读取从设备中线圈的开关状态(1为ON,0为OFF),其数据帧结构中,数据地址通常以0x0000开始,线圈数量最大为2000(0x07D0),主设备发送命令“01 01 00 00 00 08 CRC”,表示从设备01读取起始地址为0x0000的8个线圈状态,从设备返回数据格式为“01 01 05 01 00 01 00 00 CRC”,其中05表示返回5个字节的数据,后续字节为线圈状态按位组合的结果。

  • 功能码02(读取离散输入):与功能码01类似,但读取的是从设备的离散输入状态(通常为物理输入点的状态),数据地址和数量规则与功能码01一致,适用于需要监测外部开关信号的场景。

  • 功能码03(读取保持寄存器):用于读取从设备的保持寄存器数据(通常为配置参数或测量值),寄存器地址以0x0000开始,每个寄存器占16位,最大读取数量为125(0x7D),读取设备01的0x0000至0x0004共5个寄存器,主设备发送“01 03 00 00 00 05 CRC”,返回数据格式为“01 03 0A 00 01 00 02 00 03 00 04 00 05 CRC”,其中0A表示返回10个字节(5个寄存器×2字节)。

    Modbus协议命令有哪些具体类型?-图2
    (图片来源网络,侵删)
  • 功能码04(读取输入寄存器):用于读取从设备的输入寄存器数据(通常为传感器或变送器的实时数据),寄存器地址和数量规则与功能码03一致,适用于需要获取模拟量输入值的场景。

写操作命令

  • 功能码05(写入单个线圈):用于向从设备写入单个线圈的开关状态,数据帧中包含线圈地址和状态值(0xFF00表示ON,0x0000表示OFF),将设备01的线圈0x0000置为ON,主设备发送“01 05 00 00 FF 00 CRC”,从设备返回确认帧“01 05 00 00 FF 00 CRC”。

  • 功能码06(写入单个寄存器):用于向从设备写入单个寄存器的16位数据,数据帧包含寄存器地址和数据值,向设备01的寄存器0x0000写入0x1234,发送“01 06 00 00 12 34 CRC”,返回确认帧“01 06 00 00 12 34 CRC”。

  • 功能码15(写入多个线圈):用于批量写入线圈状态,数据帧中需包含线圈数量和状态值列表(每个字节表示8个线圈状态),向设备01的0x0000至0x0004共5个线圈写入状态,发送“01 0F 00 00 00 05 06 01 00 01 00 00 00 00 CRC”,其中06表示后续6个字节为数据。

    Modbus协议命令有哪些具体类型?-图3
    (图片来源网络,侵删)
  • 功能码16(写入多个寄存器):用于批量写入寄存器数据,是最常用的写操作命令之一,数据帧中需包含寄存器数量和数据值列表(每个寄存器2字节),向设备01的0x0000至0x0002共3个寄存器写入0x1234、0x5678、0x9ABC,发送“01 10 00 00 00 03 06 12 34 56 78 9A BC CRC”,其中06表示后续6个字节为数据。

Modbus协议命令数据帧结构

Modbus协议的数据帧结构因传输模式(RTU/TCP)不同而有所差异,以下以RTU模式为例说明:

字段 长度(字节) 说明
设备地址 1 从设备的唯一标识,范围0-247(0和255为广播地址)
功能码 1 区分命令类型(如01、03、16等)
数据地址 2 寄存器或线圈的起始地址(大端格式)
数据数量 2 读取或写入的数据数量(大端格式)
数据值 N×2 写入操作时的寄存器数据(N为数量)
CRC校验码 2 用于错误检测的循环冗余校验(RTU模式特有)

TCP模式的数据帧在RTU基础上增加了MBAP报头(7字节),包含事务标识符、协议标识符、长度和单元标识符(相当于设备地址),但无需CRC校验,改用TCP校验和。

应用场景与注意事项

Modbus协议广泛应用于PLC、变频器、传感器、HMI等工业设备的通信,在实际应用中,需注意以下问题:

  1. 地址映射:不同设备对寄存器地址的映射可能不同,需参考设备手册确认地址范围(如有些设备从1开始编号,而非0)。
  2. 通信参数:主从设备的波特率、数据位、停止位、校验位必须一致,RS-485网络需终端电阻匹配。
  3. 超时处理:主设备需设置合理的超时时间,避免从设备无响应时通信阻塞。
  4. 错误处理:从设备返回的异常响应(功能码最高位为1)需解析错误码(如非法地址、非法数据量等)。

相关问答FAQs

Q1: Modbus协议中功能码与数据地址的关系是什么?
A1: 功能码定义了操作类型(如读/写、线圈/寄存器),而数据地址指定了操作的具体目标位置,功能码03(读保持寄存器)的数据地址0x0000表示第一个保持寄存器,0x0001表示第二个,依此类推,需要注意的是,部分设备手册中地址从1开始编号,实际通信时需减1转换为0-based地址。

Q2: 如何解决Modbus通信中的“非法数据地址”错误?
A2: “非法数据地址”错误(异常响应功能码为0x82、0x83等)通常由以下原因导致:① 数据地址超出从设备支持的寄存器/线圈范围;② 地址映射错误(如将输入寄存器地址用于读取保持寄存器),解决方法包括:① 检查设备手册确认地址范围;② 验证功能码与数据类型是否匹配;③ 使用Modbus调试工具(如Modbus Poll)监控通信帧,定位具体错误地址。

分享:
扫描分享到社交APP
上一篇
下一篇