Modbus-RTU报文结构及常用功能码详解
Modbus-RTU报文结构及常用功能码
Modbus是一种串行通讯协议,是Modicon公司(现在的施耐德电气)于1979年为使用可编程逻辑控制器(PLC)通信而发表的。现在的Modbus协议已经成为工业控制领域通信协议的业界标准,是工业电子设备间常用的通讯协议。
Modbus协议能够成为工业控制领域应用最广泛的协议,它具备了以下几个特点:
- 开放性架构:Modbus协议完全公开且无版权限制,企业可自由修改适配设备,降低开发成本。施耐德电气公开协议后,全球200余家企业推出兼容硬件;
- 跨平台兼容:支持RS-485、RS-232、以太网等多种物理层接口,覆盖从串行通信到TCP/IP网络的场景;
- 协议简单稳定:固定数据帧格式(地址+功能码+数据+校验)和主从通信模式,确保实时性及可靠性;
Modbus RTU协议
1. Modbus RTU协议的基本概念
Modbus RTU模式是二进制模式,数据流以字节为单位传输,每个字节的高位首先发送。传输数据时,使用了差错检测机制,以确保数据的完整性。通常RTU模式通过RS-485总线进行通讯,因为它能够支持多个设备(最多247个设备)并且支持长距离传输。
2. Modbus RTU通信的帧结构
| 用途 | 长度 | 描述 |
|---|---|---|
| 设备地址 | 1byte | 从机有唯一的地址,范围1-247.地址0是广播地址,从机不会应答 |
| 功能码 | 1byte | 主机要求从机执行的操作类型 |
| 数据 | 可变(0-252byte) | 包含了命令的具体参数,格式和长度却决于功能码 |
| CRC校验 | 2byte | 检查数据在传输过程中是否有错误 |
3. Modbus RTU协议中的功能码
常用功能码表格
| 功能码 | 名称 | 操作数据类型 | 作用 |
|---|---|---|---|
| 0x01 | 读线圈(Read Coils) | 位 | 取得一组逻辑线圈的当前状态(ON/OFF) |
| 0x02 | 读离散输入寄存器(Read Discrete Inputs) | 位 | 取得一组开关输入的当前状态(ON/OFF) |
| 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.功能码 0x01-读线圈(Read Coils)
- 作用:读从机线圈寄存器,位操作,可读单个或多个;
- 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取8个线圈。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | CRC H | CRC L |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x01 | 0x00 | 0x17 | 0x00 | 0x08 | 0x8D | 0xC8 |
Tx:01 01 00 17 00 08 8D C8
- 响应:返回数据每一位的对应的线圈状态,1表示ON,0表示OFF;
| 从机地址 | 功能码 | 返回字节数 | data | CRC H | CRC L |
|---|---|---|---|---|---|
| 0x01 | 0x01 | 0x01 | 0x17 | 0x11 | 0x86 |
Rx:01 01 01 17 11 86
2.功能码 0x02-读离散输入寄存器(Read Discrete Inputs)
- 作用:读从机离散输入寄存器,位操作,可读单个或多个;
- 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取8个线圈。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | CRC H | CRC L |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x02 | 0x00 | 0x17 | 0x00 | 0x08 | 0xC9 | 0xC8 |
Tx:01 02 00 17 00 08 C9 C8
- 响应:返回数据每一位的对应的线圈状态,1表示ON,0表示OFF;
| 从机地址 | 功能码 | 返回字节数 | data | CRC H | CRC L |
|---|---|---|---|---|---|
| 0x01 | 0x02 | 0x01 | 0x17 | 0xE1 | 0x86 |
Rx:01 02 01 17 E1 86
3.功能码 0x03-读保持寄存器(Read Holding Inputs)
- 作用:读从机保持寄存器,字节操作,可读单个或多个;
- 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取1个寄存器。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | CRC H | CRC L |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x03 | 0x00 | 0x17 | 0x00 | 0x01 | 0x34 | 0x0E |
Tx:01 03 00 17 00 01 34 0E
- 响应:返回数据;
| 从机地址 | 功能码 | 返回字节数 | data1H | data1L | CRC H | CRC L |
|---|---|---|---|---|---|---|
| 0x01 | 0x03 | 0x02 | 0x17 | 0x01 | 0x76 | 0x74 |
Rx:01 03 02 17 01 76 74
4.功能码 0x04-读输入寄存器(Read Input Inputs)
- 作用:读从机输入寄存器,字节操作,可读单个或多个;
- 发送指令:从机地址:0x01,寄存器开始地址:0x0017,共读取1个寄存器。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | CRC H | CRC L |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x04 | 0x00 | 0x17 | 0x00 | 0x01 | 0x81 | 0xCE |
Tx:01 04 00 17 00 01 81 CE
- 响应:返回数据;
| 从机地址 | 功能码 | 返回字节数 | data1H | data1L | CRC H | CRC L |
|---|---|---|---|---|---|---|
| 0x01 | 0x04 | 0x02 | 0x17 | 0x01 | 0x77 | 0x00 |
Rx:01 04 02 17 01 77 00
5.功能码 0x05-写单个线圈寄存器(Write Single Coil)
- 作用:写单个线圈,位操作,只能写一个,写0xFF00表示线圈为ON,写0x0000表示线圈为OFF
- 发送指令:从机地址:0x01,设置线圈0x0017为ON。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | DATAH | DATAL | CRC H | CRC L |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x05 | 0x00 | 0x17 | 0xFF | 0x00 | 0x3C | 0x3E |
Tx:01 05 00 17 FF 00 3C 3E
- 响应:同发送数据;
6.功能码 0x06-写单个保持寄存器(Write Single Register)
- 作用:写单个保持寄存器,字节操作,只能写一个,
- 发送指令:从机地址:0x01,设置线圈0x0017为0x2193。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | DATAH | DATAL | CRC H | CRC L |
|---|---|---|---|---|---|---|---|
| 0x01 | 0x06 | 0x00 | 0x17 | 0x21 | 0x93 | 0x61 | 0xF3 |
Tx:01 06 00 17 21 93 61 F3
- 响应:同发送数据;
7.功能码 0x0F-写多个线圈(Write Multiple Coils)
- 作用:写多个线圈寄存器,数据区的位0表示OFF,位1表示ON;
- 发送指令:从机地址:0x01,线圈地址0x0012,写5个线圈。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | 字节数 | DATAH | DATAL | CRC H | CRC L |
|---|---|---|---|---|---|---|---|---|---|---|
| 0x01 | 0x0F | 0x00 | 0x12 | 0x00 | 0x05 | 0x01 | 0x00 | 0x13 | 0x54 | 0x93 |
Tx:01 0F 00 12 00 05 01 00 13 54 93
- 响应:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | 字节数 | CRC H | CRC L |
|---|---|---|---|---|---|---|---|---|
| 0x01 | 0x0F | 0x00 | 0x12 | 0x00 | 0x05 | 0x01 | 0xCC | 0xD7 |
Tx:01 0F 00 12 00 05 01 00 13 CC D7
8.功能码 0x10-写多个保持寄存器(Write Multiple Registers)
- 作用:写多个保持寄存器,字节操作,可写多个;
- 发送指令:从机地址:0x01,寄存器地址0x0012,写2个寄存器4个字节数据。发送命令如下:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | 字节数 | DATA1H | DATA1L | DATA2H | DATA2L | CRC H | CRC L |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x01 | 0x10 | 0x00 | 0x12 | 0x00 | 0x02 | 0x04 | 0x00 | 0x13 | 0x00 | 0x11 | 0x42 | 0xB3 |
Tx:01 0F 00 12 00 05 01 00 13 00 11 42 B3
- 响应:
| 从机地址 | 功能码 | 寄存器起始地址(高8位) | 寄存器起始地址(低8位) | 寄存器数量(高8位) | 寄存器数量(低8位) | 字节数 | CRC H | CRC L |
|---|---|---|---|---|---|---|---|---|
| 0x01 | 0x10 | 0x00 | 0x12 | 0x00 | 0x02 | 0x04 | 0x0C | 0x8B |
Tx:01 0F 00 12 00 02 04 0C 8B
结语
Modbus RTU协议是工业控制系统中一种非常常见的通信协议,以其简单、可靠和高效的特点被广泛应用于各类设备的串行通信中。它适合小型到中型的系统,尤其在现场设备、PLC和传感器之间的通信中发挥着重要作用。然而,由于没有内建的安全机制,在使用时需要确保网络和通信的安全性。
推荐工具
关注我,获取更多有用的知识和工具

Modbus-RTU报文结构及常用功能码详解的更多相关文章
- Nginx核心配置文件常用参数详解
Nginx核心配置文件常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Nginx权威文档的话童鞋们可以参考Nginx官方文档介绍:http://nginx.org/ ...
- hbase shell基础和常用命令详解(转)
HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...
- Tomcat记录-tomcat常用配置详解和优化方法(转载)
常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...
- tcpdump常用参数详解
tcpdump常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 好久没有更新我的博客了,看来自己最近还没有在放假中回过神来啊,哈哈~是不是也有小伙伴跟我一样呢?回归正题, ...
- DB2创建数据库常用参数详解
转自http://czmmiao.iteye.com/blog/1335801 DB2创建数据库常用参数详解 本文只介绍DB2 create database语法中的常用参数http://publib ...
- hbase shell基础和常用命令详解
HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服 ...
- tomcat常用配置详解和优化方法
tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...
- html常用标签详解
html常用标签详解 一.总结 一句话总结: 这些资料没必要自己总结,可以直接网上找,简单方便,再根据需求改一下 二.HTML常用标签详解 转自或参考:HTML常用标签详解https://blog.c ...
- DOS常用命令详解
DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...
- STL之map与pair与unordered_map常用函数详解
STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...
随机推荐
- FreeSql学习笔记——7.分组聚合
前言 分组就是将元数据通过某些条件划分为组,而聚合就是对这些组进行整合操作:在sqlserver数据库中使用的关键字group by使符合条件的集合通过某些字段分好组,再使用聚合函数(如max() ...
- 动手学深度学习-python基础知识介绍part1
基础详解-part1 import torch x=torch.arange(12) x x.shape x.numel() #数组中元素的总数 # 修改形状 x.reshape(3,4) torch ...
- pagehelper分页查询的一个坑,明明下一页没有数据了却还是返回了数据
pagehelper分页查询的一个坑,明明下一页没有数据了却还是返回了数据 解决:关闭这该死的合理化,如下配置: pagehelper:# helperDialect: mysql reasonabl ...
- Element-UI 使用心得之el-card
el-card 是Element-UI 内置的卡片组件,使用起来很方便,但是对Vuejs和html 不是精通的话,根据自己的要求布局,会出现自己的小困惑,必须添加垂直居中,按照CSS 布局设置,总是 ...
- 解决黑群晖 Docker 日志八小时时间差的有效方法
步骤一:登录黑群晖控制台 首先,我们需要登录到黑群晖控制台.可以通过SSH登录,或是直接在黑群晖控制台界面上操作. 步骤二:停止相关的Docker容器 在解决时间差问题之前,我们需要停止相关的Dock ...
- Azure Data Factory - [01] 触发器
题记部分 一.概述 Azure Data Factory(后面简称ADF)的触发器是一种机制,用于在特定事件发生时自动执行数据管道.触发器可以基于事件间隔.数据变化或其他外部事件来启动数据管道的执 ...
- 有关算法与数据结构的考题解答参考汇总 [C++] [链表] · 第三篇
早先年考研的主考科目正是[算法与数据结构],复习得还算可以.也在当时[百度知道]上回答了许多相关问题,现把他们一起汇总整理一下,供读者参考. [1] 原题目地址:https://zhidao.baid ...
- Go1.24版本终于来了!各位开发者,准备好迎接这些激动人心的新功能了吗?让我们一起来探讨下Go1.24中有哪些精彩的亮点?
前言 Gopher们,Go 1.24.0 正式发布了!与 Go 1.23.0 相比,这个版本带来了众多改进.让我们一同看看 Go 1.24.0 都有哪些新变化吧! 在 Windows 下,请在 htt ...
- Keepalived学习,双机主备高可用
一.主机安装 1.解压 tar -zxvf keepalived-2.0.18.tar.gz 2.解压后进入到解压出来的目录,看到会有configure,那么就可以做配置了 3.使用configure ...
- Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String 解决办法
使用MyBatis 更新数据库数据的时候 遇到了这个错误: Caused by: java.lang.IllegalArgumentException: invalid comparison: jav ...