news 2026/7/17 5:36:36

ModBus协议总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ModBus协议总结

ModBus协议总结

  • ModBus协议总结
  • RTU
    • 1 线圈设备读写
    • 2 读取离散值
    • 3 保持寄存器读写 通过功能码 03 06 16(0x10)
      • 功能码06
      • 功能码16
    • 读取输入寄存器数值
  • TCP

ModBus协议总结

RTU

总结modbus协议的通信和处理,首先明确同种通信方式TCP和串口(RTU)的区别:
RTU主站请求从站(串口传输)

协议字节作用
从站的地址1范围1-247 0是广播地址
功能码10x01-0x06、0x0F 、0x10
起始寄存器2寄存器地址
数据长度2寄存器数量
CRC2数据校验位

01 03 00 00 00 02 C4 0B

RTU从站设备回复请求如果成功(串口传输)

协议字节作用
从站的地址1范围1-247 0是广播地址
功能码10x01-0x06、0x0F 、0x10
字节数1寄存器地址
数据位N一个寄存器返回2个字节寄存器数量
CRC2数据校验位

01 03 04 12 34 56 78 5A 3D

如果出现一场情况将会返回异常报文

协议字节作用
从站的地址1范围1-247 0是广播地址
异常功能码1原功能码 0x03 的最高位(bit 7)置1,即 0x03 0x80 = 0x83
异常码101 02 03 04
CRC2数据校验位

01 83 02 C0 F1

常见的异常码有:

01:非法功能(不支持该功能码)。

02:非法数据地址(请求的寄存器地址超出范围)。

03:非法数据值(写入的数据值超出范围)。

04:从站设备故障。

这里把所有RTU手法总结如下:

功能码 0x01 — 读线圈
请求帧格式:
[从站地址] 01 [起始地址高] [起始地址低] [数量高] [数量低] [CRC低] [CRC高]
最大读取数量:2000个线圈(但受串口帧长度限制,实际约2000个)
正常响应帧格式:
[从站地址] 01 [字节数] [线圈状态1] [线圈状态2] … [CRC低] [CRC高]
异常响应:
[从站地址] 81 [异常码] [CRC低] [CRC高]

01 01 00 00 00 0A BC 0D

响应(假设线圈0-7全ON,线圈8-9为OFF):

01 01 02 FF 00 78 2F

1 线圈设备读写

线圈设备是一类可由信号控制的继电器设备,按位读写,主要功能码 围绕 01 05 15三个功能码 工作
01是读功能码
05是单写功能码
15是多写功能码

01 01 00 00 00 0A BC 0D

上面指令是从 01从设备读取0线圈开始读取10个线圈

01 01 02 FF 00 78 2F

收到的响应是 01从设备回复两个字节的数据 前0-8个设备状态是全1 后两个设备状态全0

01 05 00 00 FF 00 8C 3A

从站设备01,线圈0设置为ON, (ON值必须为 0xFF00,OFF值必须为 0x0000)

01 05 00 00 FF 00 8C 3A

从站设备响应

01 0F 00 00 00 0C 02 AD 0A 34 12

上面指令是从 01从设备从0线圈开始写入12线圈

01 0F 00 00 00 0C 04 08

上面指令是写入了12个响应数据

2 读取离散值

离散值是一种 外部环境决定的不可 物理按钮 限位开关 等只能读取

01 02 00 00 00 0A 78 0D

从01从设备00地址开始读取10个离散值输入

01 02 02 AD 02 5D B8

返回两个字节的返回数据

3 保持寄存器读写 通过功能码 03 06 16(0x10)

保持寄存器的读取命令在协议介绍时03 已经写出 就不在这里介绍了

功能码06

写入

01 06 00 02 00 FF 48 0B

响应

01 06 00 02 00 FF 48 0B

写入和响应返回一致信息 02寄存器 写入FF

功能码16

写入3个寄存器数值,从地址0105 开始的3个寄存器 总字节长度为6

01 10 01 05 00 03 06 11 02 03 04 05 66 4A 12

响应 从寄存器地址 0105开始成功写入了3个寄存器

01 10 01 05 00 03 1E 1E

读取输入寄存器数值

输入寄存器只读,修改由器件内部的操作控制
从00寄存器开始读取 1个寄存器的数据

01 04 00 00 00 01 31 CA

返回两个字节数据

01 04 02 01 00 78 F4

TCP

tcp和命令和RTU相同,但封装格式不同

协议字节作用
事务标识符2客户端每次发送请求时递增(建议从 1 开始)。服务器在响应时原样复制此 ID。这是 TCP 支持并发通信的关键
协议标识符2 固定为 0x0000,表示这是一个 Modbus 协议包
长度2告诉接收方,从“单元标识符”开始到数据结束,还有多少个字节
单元标识符1“从站地址”的替身。用于标识目标设备。在纯 TCP/IP 网络中,它相当于 RTU 的从站地址
功能码1与 RTU 完全一致。包括 0x01 读线圈、0x03 读寄存器、0x06 写寄存器等
数据域N格式和 RTU 也完全一致,采用大端模式,存放具体的操作参数,如寄存器起始地址、数量或要写入的值
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 5:36:30

Python GUI实战:用Tkinter、PyQt5和Pygame分别实现五子棋游戏

1. 项目概述:为什么用Python做五子棋GUI是个好主意?如果你对Python编程已经入门,掌握了基础语法,想找一个能串联起多个知识点的综合实战项目,那用Python实现一个带图形界面的五子棋游戏,绝对是个绝佳的选择…

作者头像 李华
网站建设 2026/7/17 5:36:05

Windows 11第二任务栏功能解析与优化指南

1. Windows 11任务栏的进化与第二任务栏功能解析Windows 11的任务栏设计一直是用户关注的焦点。微软在最新更新中引入的第二任务栏功能,实际上是对用户多年需求的回应。这个功能并非简单的界面叠加,而是基于Windows Shell Experience Host的深度改造。传…

作者头像 李华
网站建设 2026/7/17 5:35:45

AI+菌株设计的“伪AI“识别清单:3个月量化验证红线

写在前面:一个老兵的观察 我做了30多年生物合成产业,从摇瓶做到千吨级发酵罐产线,从拍脑袋优化做到数字化控制。最近三四年,"AI菌株设计"的标签几乎贴满了每一个融资BP和展会海报。我见过真正改变游戏规则的AI工具&…

作者头像 李华
网站建设 2026/7/17 5:35:04

C++输出流格式化难题:从std::cout到声明式格式化工具的实现

1. 项目概述:从“凑合能用”到“精准优雅”的格式化之路在C的日常开发里,尤其是处理日志输出、数据报告或者调试信息时,std::cout是我们最熟悉的老朋友。但不知道你有没有过这样的体验:想输出一个浮点数,只保留两位小数…

作者头像 李华
网站建设 2026/7/17 5:32:36

ICM创芯微 CM1003-BBD DFN1.9x1.6-6 BMS电池保护芯片

特性高精度电压检测功能过充电保护电压 3.500V ~ 4.600V,精度 25mV过充电解除电压 3.100V ~ 4.600V,精度 45mV过放电保护电压 2.000V ~ 3.400V,精度 50mV过放电解除电压 2.000V ~ 3.400V,精度 100mV放电过流保护电压 0.015V ~ 0.2…

作者头像 李华
网站建设 2026/7/17 5:32:08

OpenAI模型API调用参数完全解析(上)

OpenAI模型API调用参数完全解析(上)用AI API写了无数行代码,但你真懂这些参数吗?temperature调到0.8和0.2有什么本质区别?top_p和temperature该配合用还是二选一?presence_penalty和frequency_penalty到底谁…

作者头像 李华