modbus RTU协议小结


协议格式(大端模式):

设备地址功能码数据CRC16
1byte1byteN byte2byte

0x01 读取线圈状态

  • 取得一组逻辑线圈的当前状态(ON/OFF)

主机发送

设备地址功能码开始地址长度CRC16
1byte1byte2 byte2byte2byte
addr0x010x0000 ~0xFFFF1 ~ 200(0x7D0)crc16

从机正常应答

设备地址功能码数据长度线圈状态(bitmap)CRC16
1byte1byte1 byten byte2byte
addr0x01N*N bitmapcrc16
  • N* = 表示返回线圈数量总数 / 8,如果有余数,则N = N + 1
  • 线圈状态为bitmap,即1byte表示8个线圈状态

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x01 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码开始地址高字节开始地址低字节长度高字节长度低字节
0x010x000x130x000x13

从机应答

功能码数据长度27~20线圈状态35~28线圈状态38~36线圈状态
0x010x030xCD0x6B0x05

0x02 读取输入状态

  • 获取一组开关输入的当前状态(ON/OFF)

主机发送

设备地址功能码开始地址长度crc16
1byte1byte2byte2byte2byte
addr0x020x0000 ~ 0xFFFF1 ~2000(0x7D0)CRC16

从机正常应答

设备地址功能码数据长度线圈状态(bitmap)CRC16
1byte1byte1 byten byte2byte
addr0x02N*N* × 1bytecrc16
  • N* = 表示返回输入状态总数 / 8,如果有余数,则N = N + 1
  • 输入状态为bitmap,即1byte表示8个输入状态

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x02 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码开始地址高字节开始地址低字节数量高字节数量低字节
0x020x000xC40x000x16

从机应答

功能码数据长度204~197线圈状态212~205线圈状态218~3213线圈状态
0x020x030xAC0xDB0x35

0x03 读取保持寄存器

  • 读取一个或多个保持寄存器中的数据

主机发送

设备地址功能码寄存器起始地址寄存器数量crc16
1byte1byte2byte2byte2byte
addr0x030x0000 ~ 0xFFFF1 ~125(0x007D)CRC16

从机正常应答

设备地址功能码数据长度(2*寄存器个数)寄存器数据CRC16
1byte1byte1 byten byte2byte
addr0x03N* × 2N* × 2bytecrc16
  • N* = 读取寄存器数量

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x03 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码寄存器起始地址高字节寄存器起始地址低字节读取寄存器长度高字节读取寄存器长度低字节
0x030x000x6B0x000x3

从机应答

功能码数据长度(2*寄存器数量)108寄存器数据高字节108寄存器数据底字节109寄存器数据高字节109寄存器数据底字节110寄存器数据高字节110寄存器数据底字节
0x030x060x020x2B0x000x000x000x64

0x04 读取输入寄存器

  • 读取一个或多个输入寄存器的数据

主机发送

设备地址功能码寄存器起始地址寄存器数量crc16
1byte1byte2byte2byte2byte
addr0x040x0000 ~ 0xFFFF1 ~125(0x007D)CRC16

从机正常应答

设备地址功能码数据长度(2*寄存器个数)寄存器数据CRC16
1byte1byte1 byten byte2byte
addr0x04N* × 2N* × 2bytecrc16
  • N* = 读取寄存器数量

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x04 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码寄存器起始地址高字节寄存器起始地址低字节读取寄存器长度高字节读取寄存器长度低字节
0x040x000x080x000x1

从机应答

功能码数据长度(2*寄存器数量)9寄存器数据高字节9寄存器数据底字节
0x040x020x000x0A

0x05 强制单线圈

  • 强制一个逻辑线圈的通断状态

主机发送

设备地址功能码线圈地址数据crc16
1byte1byte2byte2byte2byte
addr0x050x0000 ~ 0xFFFF0x0000 or 0xFF00CRC16

从机正常应答

设备地址功能码线圈地址线圈状态CRC16
1byte1byte2 byte2 byte2byte
addr0x050x0000 ~ 0xFFFF0x0000 or 0xFF00crc16
  • 0xFF00表示线圈ON,0x0000表示线圈OFF

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x05 + 0x800x01 or 0x02 or 0x03 or 0x03crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码开始地址高字节开始地址低字节数量高字节数量低字节
0x050x000xAC0xFF0x00

从机应答

功能码开始地址高字节开始地址低字节线圈状态高字节线圈状态底字节
0x050x000xAC0xFF0x00

0x06 设置单寄存器

  • 把数据装入一个保持寄存器中

主机发送

设备地址功能码寄存器地址寄存器数据crc16
1byte1byte2byte2byte2byte
addr0x060x0000 ~ 0xFFFF0x0000 ~ 0xFFFFCRC16

从机正常应答

设备地址功能码寄存器地址寄存器数据CRC16
1byte1byte2 byte2 byte2byte
addr0x060x0000 ~ 0xFFFF0x0000 ~ 0xFFFFcrc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x06 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码寄存器地址高字节寄存器地址低字节寄存器数据高字节寄存器数据低字节
0x060x000x010x000x3

从机应答

功能码寄存器地址高字节寄存器地址低字节寄存器数据高字节寄存器数据底字节
0x060x000x010x000x3

0x07 读取异常状态(serial line only)

  • 获取8个内部线圈的通断状态,这8个线圈的地址由控制器决定

主机发送

设备地址功能码crc16
1byte1byte2byte
addr0x07CRC16

从机正常应答

设备地址功能码异常数据CRC16
1byte1byte1 byte2byte
addr0x070x00 ~ 0xFFcrc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x07 + 0x800x01 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码
0x07

从机应答

功能码异常数据
0x070x6D

0x08 回送诊断校验(serial line only)

  • 把诊断校验报文送至从机,以对通信进行评鉴

主机发送

设备地址功能码子功能码数据crc16
1byte1byte2byteN × 2byte2byte
addr0x08CRC16

从机正常应答

设备地址功能码子功能码数据CRC16
1byte1byte2 byteN × 2byte2byte
addr0x08crc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x08 + 0x800x01 or 0x03 or 0x04crc16

子功能码列表

子功能码描述主机发送数据从机返回数据
0x0000返回查询数据数据返回发送数据
0x0001重新启动通信0000(重新启动) or FF00(清零通信事件)0000 or FF00
0x0002返回诊断寄存器0000诊断寄存器内容
0x0003更改ASCII输入分隔符分隔符( : )返回分隔符
0x0004强制Listen模式0000无数据返回
0x0005 ~ 0x09保留
0x000A清零计数和诊断寄存器00000000
0x000B返回消息计数0000消息总数
0x000C返回通信错误计数0000CRC错误计数
0x000D返回异常计数0000返回异常计数
0x000E返回从机消息计数0000从机消息计数
0x000F返回从机无应答计数0000返回从机无应答计数
0x0010返回从机NAK计数0000返回从机NAK计数
0x0011返回从机busy计数0000返回从机busy计数
0x0012返回字符overrun计数0000返回字符overrun计数
0x0013保留
0x0014清零overrun计数和标志00000000
21~65535

案例(设备地址和CRC16忽略不表)
主机请求

功能码子功能码高字节子功能码低字节数据高字节数据低字节
0x080x000x000xA50x37

从机应答

功能码子功能码高字节子功能码低字节数据高字节数据低字节
0x080x000x000xA50x37

0x09 编程(用于484)

  • 使主机模拟编程器作用,修改PC从机逻辑

0x0A 控询(用于484)

  • 可使主机与一台正在执行长程序任务的从机通信,探询该从机是否已完成其操作任务,仅在含有功能码0x09的报文发送后,本功能码才发送

0x0B 读取通信事件计数

  • 可使主机发出单询问,并随即判断操作是否成功,尤其是该命令或其他应答产生通信错误时

主机发送

设备地址功能码crc16
1byte1byte2byte
addr0x0BCRC16

从机正常应答

设备地址功能码状态计数CRC16
1byte1byte2 byte2byte2byte
addr0x0B0x0000 ~ 0xFFFF0x0000 ~ 0xFFFFcrc16
  • 返回状态0xFFFF表示正常通信

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x0B + 0x800x01 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码
0x0B

从机应答

功能码状态高字节状态低字节计数高字节计数低字节
0x080xFF0xFF0x010x08

0x0C 读取通信事件记录

  • 可使主机检索每台从机的modbus事务处理通信事件记录,如果某项事务处理完成,记录会给出有关错误

主机发送

设备地址功能码crc16
1byte1byte2byte
addr0x0CCRC16

从机正常应答

设备地址功能码事件数量状态事件计数消息计数事件(N-6)CRC16
1byte1byte1 byte2byte2byte2byte(N - 6) byte2byte
addr0x0CN*0x0000 ~ 0xFFFF0x0000 ~ 0xFFFF0x0000 ~ 0xFFFFcrc16
  • 返回状态0xFFFF表示正常通信

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x0C + 0x800x01 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码
0x0C

从机应答

功能码事件数量状态高字节状态底字节事件计数高字节事件计数底字节消息计数高字节消息计数底字节事件0事件1
0x0C0x080x000x000x010x080x010x210x200x00

0x0D 编程(184/384 484 584)

  • 使主机模拟编程器作用,修改PC从机逻辑

0x0E 控询(184/384 484 584)

  • 可使主机与一台正在执行长程序任务的从机通信,探询该从机是否已完成其操作任务,仅在含有功能码0x0D的报文发送后,本功能码才发送

0x0F 强制多线圈

  • 强制一串连续逻辑线圈的通断

主机发送

设备地址功能码开始地址线圈数量数据长度数据CRC16
1byte1byte2 byte2byte1byteN* byte2byte
addr0x0F0x0000 ~0xFFFF0x0001 ~0x07B0N*crc16

从机正常应答

设备地址功能码开始地址线圈数量CRC16
1byte1byte1 byte2 byte2byte
addr0x0F0x0000 ~0xFFFF0x0001 ~0x07B0crc16
  • N* = 表示返回线圈数量总数 / 8,如果有余数,则N = N + 1
  • 线圈状态为bitmap,即1byte表示8个线圈状态

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x0F + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码开始地址高字节开始地址底字节线圈数量高字节线圈数量底字节数据长度数据高字节数据底字节
0x0F0x000x130x000x0A0x020xCD0x01

从机应答

功能码开始地址高字节开始地址底字节线圈数量高字节线圈数量底字节
0x0F0x000x130x000x0A

0x10 预置多寄存器

  • 把数据存储到一串连续的保持寄存器中

主机发送

设备地址功能码寄存器起始地址寄存器数量数据长度crc16
1byte1byte2byte2byte1byte2byte
addr0x100x0000 ~ 0xFFFF1 ~123(0x007B)N* × 2CRC16
  • N*=寄存器数量

从机正常应答

设备地址功能码寄存器起始地址寄存器数据CRC16
1byte1byte2 byte2 byte2byte
addr0x100x0000 ~ 0xFFFF1 ~123(0x007B)crc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x10 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码寄存器起始地址高字节寄存器起始地址低字节寄存器数量高字节寄存器数量底字节数据长度数据高字节数据底字节数据高字节数据底字节
0x100x000x010x000x020x040x000x0A0x010x02

从机应答

功能码寄存器起始地址高字节寄存器起始地址低字节寄存器数量高字节寄存器数量底字节
0x100x000x010x000x02

0x11 报告从机标识

  • 可使主机判断编址从机的类型及该从机运行指示灯的状态

主机发送

设备地址功能码crc16
1byte1byte2byte
addr0x11CRC16

从机正常应答

设备地址功能码数据长度server ID运行状态指示其他数据CRC16
1byte1byte1 byte1byte2byte
addr0x11device specific0x00=OFF 0xFF=ONcrc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x11 + 0x800x01 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码
0x11

从机应答

功能码数据长度server ID运行状态指示其他数据
0x11device specific0x00 or 0xFFother data

0x12 884和MICRD 84

  • 使主机模拟编程器作用,修改PC状态逻辑

0x13 重置通信链路

  • 发生非可修改错误后,使从机复位于已知状态,可重置顺序字节

0x14 读取通用参数

  • 显示扩展存储器文件中的数据信息

主机发送

设备地址功能码数据长度子请求1类型子请求1 file编号子请求1记录编号子请求1记录长度子请求n类型crc16
1byte1byte1byte1byte2byte2byte2byte1byte2byte
addr0x140x07 ~ 0xF5060x0001~ 0xFFFF0x0000~0x270FNCRC16

从机正常应答

设备地址功能码应答数据长度子请求1 file应答长度子请求1 类型子请求1记录数据子请求n file应答长度CRC16
1byte1byte1 byte1 byte1byteN × 2 byte1byte2byte
addr0x140x07 ~ 0xF50x07 ~ 0xF506datacrc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x14 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码数据长度子请求1类型子请求1 file编号高字节子请求1 file编号底字节子请求1记录编号高字节子请求1记录编号高字节子请求1记录长度高字节子请求1记录长度底字节子请求2类型子请求2 file编号高字节子请求2 file编号底字节子请求2记录编号高字节子请求2记录编号高字节子请求2记录长度高字节子请求2记录长度底字节
0x140x0E0x060x000x40x000x010x000x020x060x000x30x000x090x000x02

从机应答

功能码应答数据长度子请求1 file应答长度子请求1 类型子请求1记录数据高字节子请求1记录数据底字节子请求1记录数据高字节子请求1记录数据底字节子请求2 file应答长度子请求2 类型子请求2记录数据高字节子请求2记录数据底字节子请求2记录数据高字节子请求2记录数据底字节
0x140x0C0x050x060x0D0xFE0x000x200x050x060x330xCD0x000x40

0x15 写入通用参数

  • 把通用参数写入扩展存储文件或修改之

主机发送

设备地址功能码数据长度子请求1类型子请求1 file编号子请求1记录编号子请求1记录长度数据子请求n类型crc16
1byte1byte1byte1byte2byte2byte2byteN × 2 byte1byte2byte
addr0x150x09 ~ 0xFB060x0001~ 0xFFFF0x0000~0x270FNCRC16

从机正常应答

设备地址功能码应答数据长度子请求1类型子请求1 file编号子请求1记录编号子请求1记录长度数据子请求n类型crc16
1byte1byte1byte1byte2byte2byte2byteN × 2 byte1byte2byte
addr0x150x09 ~ 0xFB060x0001~ 0xFFFF0x0000~0x270FNCRC16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x15 + 0x800x01 or 0x02 or 0x03 or 0x04 or 0x08crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码数据长度子请求1类型子请求1 file编号高字节子请求1 file编号底字节子请求1记录编号高字节子请求1记录编号高字节数据高字节数据底字节数据高字节数据底字节数据高字节数据底字节数据高字节数据底字节
0x150x0D0x060x000x40x000x070x000x030x060xAF0x040xBE0x100x0D

从机应答

功能码数据长度子请求1类型子请求1 file编号高字节子请求1 file编号底字节子请求1记录编号高字节子请求1记录编号高字节数据高字节数据底字节数据高字节数据底字节数据高字节数据底字节数据高字节数据底字节
0x150x0D0x060x000x40x000x070x000x030x060xAF0x040xBE0x100x0D

0x16 保持寄存器掩码

  • 用于设置或清除寄存器中的某位
  • (Current Contents AND And_Mask) OR (Or_Mask AND (NOT And_Mask))

主机发送

设备地址功能码参考地址(0对应1地址寄存器)AND掩码OR掩码crc16
1byte1byte2byte2byte1byte2byte
addr0x160x0000 ~ 0xFFFF0x0000 ~ 0xFFFF0x0000 ~ 0xFFFFCRC16

从机正常应答

设备地址功能码参考地址AND掩码OR掩码crc16
1byte1byte2 byte2 byte2byte2byte
addr0x160x0000 ~ 0xFFFF0x0000 ~ 0xFFFF0x0000 ~ 0xFFFFcrc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x16 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码参考地址高字节参考地址低字节AND掩码高字节AND掩码底字节OR掩码高字节OR掩码底字节
0x160x000x040x000xF20x000x25

从机应答

功能码参考地址高字节参考地址低字节AND掩码高字节AND掩码底字节OR掩码高字节OR掩码底字节
0x160x000x040x000xF20x000x25

0x17 读写多寄存器

  • 在单个RTU中结合了读和写操作,而且写操作由于读操作

主机发送

设备地址功能码读寄存器起始地址读寄存器数量写寄存器起始地址写寄存器数量数据长度数据crc16
1byte1byte2byte2byte2byte2byte1byteN* × 2 byte2byte
addr0x170x0000 ~ 0xFFFF0x0001 ~ 0x007D0x0000 ~ 0xFFFF0x0000 ~ 0x0079N* ×2CRC16
  • N*=写寄存器数量

从机正常应答

设备地址功能码数据长度寄存器数据crc16
1byte1byte1 byteN* × 2 byte2byte
addr0x17N* ×2crc16

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x17 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码读寄存器开始地址高字节读寄存器开始地址低字节读寄存器数量高字节读寄存器数量底字节写寄存器开始地址高字节写寄存器开始地址低字节写寄存器数量高字节写寄存器数量底字节数据长度数据高字节数据底字节数据高字节数据底字节数据高字节数据底字节
0x170x000x030x000x060x000x0E0x000x030x060x000xFF0x000xFF0x000xFF

从机应答

功能码数据长度读寄存器高字节读寄存器低字节读寄存器高字节读寄存器低字节读寄存器高字节读寄存器低字节读寄存器高字节读寄存器低字节读寄存器高字节读寄存器低字节读寄存器高字节读寄存器低字节
0x170x0C0x000xFE0x0A0xCD0x000x010x000x030x000x0D0x000xFF

0x18 读取FIFO队列

  • 读取FIFO队列寄存器

主机发送

设备地址功能码FIFO指针地址crc16
1byte1byte2byte2byte
addr0x180x0000 ~ 0xFFFFCRC16

从机正常应答

设备地址功能码数据长度FIFO寄存器数量(<=31)FIFO数据crc16
1byte1byte2 byte2 byteN* × 2byte2byte
addr0x18N*crc16
  • N*=FIFO寄存器数量

从机异常应答

设备地址功能码异常数据CRC16
1byte1byte1byte2byte
addr0x18 + 0x800x01 or 0x02 or 0x03 or 0x04crc16

案例(设备地址和CRC16忽略不表)
主机请求

功能码FIFO指针地址高字节FIFO指针地址低字节
0x180x040xDE

从机应答

功能码数据长度高字节数据长度低字节FIFO寄存器数量高字节FIFO寄存器数量低字节数据高字节数据低字节数据高字节数据低字节
0x180x000x060x000x020x010xB20x120x84

22~64 保留,做扩展功能所用

65~72 保留,做用户的功能的扩展编码

73~119 非法功能

120~127 保留,做内部使用

128~255 保留,用于异常应答

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值