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. FreeSql学习笔记——7.分组聚合

    前言   分组就是将元数据通过某些条件划分为组,而聚合就是对这些组进行整合操作:在sqlserver数据库中使用的关键字group by使符合条件的集合通过某些字段分好组,再使用聚合函数(如max() ...

  2. 动手学深度学习-python基础知识介绍part1

    基础详解-part1 import torch x=torch.arange(12) x x.shape x.numel() #数组中元素的总数 # 修改形状 x.reshape(3,4) torch ...

  3. pagehelper分页查询的一个坑,明明下一页没有数据了却还是返回了数据

    pagehelper分页查询的一个坑,明明下一页没有数据了却还是返回了数据 解决:关闭这该死的合理化,如下配置: pagehelper:# helperDialect: mysql reasonabl ...

  4. Element-UI 使用心得之el-card

    el-card 是Element-UI  内置的卡片组件,使用起来很方便,但是对Vuejs和html 不是精通的话,根据自己的要求布局,会出现自己的小困惑,必须添加垂直居中,按照CSS 布局设置,总是 ...

  5. 解决黑群晖 Docker 日志八小时时间差的有效方法

    步骤一:登录黑群晖控制台 首先,我们需要登录到黑群晖控制台.可以通过SSH登录,或是直接在黑群晖控制台界面上操作. 步骤二:停止相关的Docker容器 在解决时间差问题之前,我们需要停止相关的Dock ...

  6. Azure Data Factory - [01] 触发器

    题记部分 一.概述   Azure Data Factory(后面简称ADF)的触发器是一种机制,用于在特定事件发生时自动执行数据管道.触发器可以基于事件间隔.数据变化或其他外部事件来启动数据管道的执 ...

  7. 有关算法与数据结构的考题解答参考汇总 [C++] [链表] · 第三篇

    早先年考研的主考科目正是[算法与数据结构],复习得还算可以.也在当时[百度知道]上回答了许多相关问题,现把他们一起汇总整理一下,供读者参考. [1] 原题目地址:https://zhidao.baid ...

  8. Go1.24版本终于来了!各位开发者,准备好迎接这些激动人心的新功能了吗?让我们一起来探讨下Go1.24中有哪些精彩的亮点?

    前言 Gopher们,Go 1.24.0 正式发布了!与 Go 1.23.0 相比,这个版本带来了众多改进.让我们一同看看 Go 1.24.0 都有哪些新变化吧! 在 Windows 下,请在 htt ...

  9. Keepalived学习,双机主备高可用

    一.主机安装 1.解压 tar -zxvf keepalived-2.0.18.tar.gz 2.解压后进入到解压出来的目录,看到会有configure,那么就可以做配置了 3.使用configure ...

  10. Caused by: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String 解决办法

    使用MyBatis 更新数据库数据的时候 遇到了这个错误: Caused by: java.lang.IllegalArgumentException: invalid comparison: jav ...