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. 玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之保障热门产品发售服务安全稳定

    本文分享自天翼云开发者社区<玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之保障热门产品发售服务安全稳定>,作者:天翼云社区官方账号 随着社会经济的发展和人民生活水平的提高,越 ...

  2. JMeter下载与环境配置

    前置 使用JMeter前需要先配置好Java的环境变量,不会的朋友可以阅读:https://www.cnblogs.com/test-gang/p/18144441 JMeter下载 JMeter官网 ...

  3. MacSecureCRT配置

    一.调整连接服务器超时时间 Options->Global Options->General->Default Session-> 右侧Edit Default Setting ...

  4. nacos(三): 创建第一个生产者producer(单体)

    因为springcloud各个版本之间适配非常神经质,所以事件明确,在本实验环节中:使用的是JDK8,选择的springboot版本是2.7.6. 可以借助阿里云的脚手架(点此进入)帮我们创建第一个s ...

  5. Vue3 性能优化十大技巧:打造高性能应用的终极指南

    在现代前端开发中,性能优化是提升用户体验和系统效率的关键.Vue3 作为目前最流行的前端框架之一,提供了许多内置的性能优化工具和方法.本文将深入探讨 Vue3 中的十大性能优化技巧,帮助你从零开始构建 ...

  6. 饥荒联机版 mod

    Extra Equip Slots Extra Equip Slots 额外装备槽:护甲.背包.护符各用各的插槽 Wormhole Marks [DST] Wormhole Marks DST] 相通 ...

  7. 重生之数据结构与算法----队列&栈

    简介 上文说到,数据结构只有两种.其它的数据结构都是它的整花活. 栈 栈只能在表的一端(称为栈顶)进行插入和删除操作,遵循 "后进先出"(Last In First Out,LIF ...

  8. 【日常运维笔记】linux系统修改密码

    1.问题描述:xshll无法正常登录服务器,使用宝塔系统后台linux工具修改密码,重启服务器,依然无法登录,怀疑密码未重置成功,我们登录root,重置密码. 使用命令passwd修改密码,需要注意的 ...

  9. 自己写的第一个java项目!

    项目名为"零钱通" 细节参考 [零基础 快速学Java]韩顺平 零基础30天学会Java 基本版: 1 package project; 2 3 import java.text. ...

  10. Bash Shell 30min 过家家

    带你捅破窗户纸 - 备注 : @博客园 : 1. 为什么不支持 pdf 上传了呀 2. 网站分类不好用 3. 排版OA工具升级下, 例如 markdown 写出来好丑. 尝试升级下呢 ? 后记: 学如 ...