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报文结构及常用功能码详解的更多相关文章

  1. Nginx核心配置文件常用参数详解

    Nginx核心配置文件常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Nginx权威文档的话童鞋们可以参考Nginx官方文档介绍:http://nginx.org/ ...

  2. hbase shell基础和常用命令详解(转)

    HBase shell的基本用法 hbase提供了一个shell的终端给用户交互.使用命令hbase shell进入命令界面.通过执行 help可以看到命令的帮助信息. 以网上的一个学生成绩表的例子来 ...

  3. Tomcat记录-tomcat常用配置详解和优化方法(转载)

    常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...

  4. tcpdump常用参数详解

    tcpdump常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 好久没有更新我的博客了,看来自己最近还没有在放假中回过神来啊,哈哈~是不是也有小伙伴跟我一样呢?回归正题, ...

  5. DB2创建数据库常用参数详解

    转自http://czmmiao.iteye.com/blog/1335801 DB2创建数据库常用参数详解 本文只介绍DB2 create database语法中的常用参数http://publib ...

  6. hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服 ...

  7. tomcat常用配置详解和优化方法

    tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...

  8. html常用标签详解

    html常用标签详解 一.总结 一句话总结: 这些资料没必要自己总结,可以直接网上找,简单方便,再根据需求改一下 二.HTML常用标签详解 转自或参考:HTML常用标签详解https://blog.c ...

  9. DOS常用命令详解

    DOS常用命令详解 dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 del 删除文件 format 格式化磁盘 edit ...

  10. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

随机推荐

  1. 快速入门 DeepSeek-R1 大模型

    国内最新的神级人工智能模型已经正式发布,没错,它就是备受瞩目的DeepSeek-R1大模型.今天,我们将对DeepSeek进行一个简单的了解,并探索如何快速使用和部署这个强大的工具.值得一提的是,De ...

  2. 正权图的 Dijkstra 最短路算法

    最短路径问题是图论中最经典且重要的应用问题之一.它的目标是找到一个图中从起点到终点的最短路径,即在所有可能的路径中,选择一条边权和最小的路径.该问题广泛存在于多个实际场景中,比如交通运输.通信网络.导 ...

  3. QT5笔记:34. 视口和窗口

    ![image-20220504160327597](QT5 使用.assets/image-20220504160327597.png) 例子: void Widget::paintEvent(QP ...

  4. 【攻防世界】warmup

    warmup (反序列化与sql注入) 题目来源 攻防世界 NO.GFSJ0999 题目描述 题目提示:平平无奇的输入框 打开网址页面如下,没有有用信息. 题目给了附件,直接下载,得到源码如下: in ...

  5. iview weapp输入组件input事件顺序

    做小程序,使用ivew weapp组件框架,同时用到了i-input和i-modal,更具体说,就是在modal里面放置了input,填写数据后点击确定,实现提交数据. 出现点小问题,发现是事件顺序导 ...

  6. 红队单兵渗透工具-DudeSuite

    声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! DudeSuite 红队单兵作战渗透测试工具 DudeSuite(Dude S ...

  7. Chrome浏览器使用AdGuard去除百度热搜

    前言 百度的热搜会分散注意力,chrome 的 AdGuard 插件可以屏蔽广告,还可以屏蔽百度热搜 设置 > 用户过滤器 > 添加以下代码,即可屏蔽百度热搜 baidu.com##div ...

  8. 编写你的第一个 Django 应用程序,第1部分

    让我们通过示例来学习. 在本教程中,我们将引导您完成基本投票应用程序 它将由两部分组成: 一个公共网站,允许人们查看投票并在其中投票. 允许您添加.更改和删除投票的管理网站. 一.开发环境搭建 第一步 ...

  9. Proxmox VE安装CentOS 8.3

    相信玩服务器/VPS的对CentOS一定不陌生,CentOS 是一个基于Red Hat Linux 提供的可自由使用源代码的企业级Linux发行版本.因为是免费的,现在很多WEB服务器和VPS都经常使 ...

  10. PVE下安装Centos8.5.2111系统

    1.从阿里云镜像下载下载地址:https://mirrors.aliyun.com/centos/8/isos/x86_64/CentOS-8.5.2111-x86_64-boot.iso2.上传镜像 ...