ModbusRTU通信报文分析—功能码02读取输入线圈笔记

news/2025/11/4 13:08:58/文章来源:https://www.cnblogs.com/LunaNorth/p/19189956

写给初学者的话
你是不是在调试Modbus设备时,看到一串十六进制数据(比如 02 02 00 0A 00 10 59 F7)就一头雾水?是不是搞不清“功能码02”、“起始地址”、“字节计数”这些词是什么意思?别担心!这篇笔记会从最基础的概念讲起,用生活化的比喻、清晰的表格和详细的步骤,带你彻底搞懂Modbus RTU协议中功能码02——读取输入线圈的完整过程。记住,功能码02就像一个“传感器状态查询器”,专门用来查看哪些传感器是触发的、哪些是没有触发的。这篇笔记内容超详细,字数很多,但每一句都是为你量身打造,慢慢看,一定能学会!


1️⃣ 核心思想:功能码02 = 查询传感器状态

在上一篇笔记中,我们已经知道:

功能码02 是用来 “读取输入线圈” 的。

那什么是“输入线圈”呢?

  • 输入线圈 (Input Coil):其实就是“传感器”或“按钮”的状态。
  • 它只有两种状态:触发 (ON) = 1未触发 (OFF) = 0
  • 在Modbus协议中,它对应的是 1区(输入线圈区)。

所以,功能码02的作用就是:

“请问从站,从某个地址开始,连续N个传感器的状态分别是触发还是未触发?”


2️⃣ 功能码02的发送报文结构

图中给出了发送报文的结构:

✅ 发送报文 = 从站地址 + 02 + 起始线圈地址 + 线圈数量 + CRC16校验

我们来逐一分解每一个部分。

🔹 第一部分:从站地址(Slave Address)

  • 这是报文的第一字节,用来指定这封“电报”是发给哪个设备的。
  • 取值范围:1 ~ 255(十进制)
  • 实际应用中,常用的地址是 1 ~ 247

一句话总结
从站地址 = 收件人地址,告诉设备“这封信是给你的”。

🔹 第二部分:功能码 02

  • 这是报文的第二字节,固定为 02
  • 它告诉从站:“我要读取输入线圈的状态”。

一句话总结
功能码02 = 我要查传感器状态

🔹 第三部分:起始线圈地址(Starting Coil Address)

  • 这是报文的第三和第四字节,用来指定从哪个地址开始读取。
  • 它是一个16位无符号整数,由高字节+低字节组成。
  • 地址是从 0 开始计数的(相对地址),而不是从 1 开始。

🧩 举例说明

你想从地址 00011 开始读取(也就是第11个输入线圈):

  • 相对地址 = 10(因为地址从1开始,偏移量从0开始)
  • 所以,起始地址 = 00 0A(高字节=00,低字节=0A)

💡 记忆口诀
“绝对地址 - 1 = 相对地址”
比如:0000100001090001110

🔹 第四部分:线圈数量(Coil Quantity)

  • 这是报文的第五和第六字节,用来指定你要读取多少个线圈。
  • 它也是一个16位无符号整数,由高字节+低字节组成。
  • 最大可以读取 2000 个线圈(协议限制)。

🧩 举例说明

你想读取16个线圈:

  • 线圈数量 = 16(十进制)
  • 十六进制 = 00 10(高字节=00,低字节=10)

一句话总结
线圈数量 = 我要查几个传感器

🔹 第五部分:CRC16校验(Cyclic Redundancy Check)

  • 这是报文的最后两个字节,用来保证报文的准确性和完整性。
  • 如果在传输过程中数据被干扰或篡改,校验码就会不匹配,接收方会丢弃这个报文。
  • CRC16校验码是根据前面所有字节(从站地址到线圈数量)计算出来的。

一句话总结
CRC16校验 = 数据的“验证码”,确保报文在传输过程中没有出错。


3️⃣ 功能码02的接收报文结构

图中也给出了接收报文的结构:

✅ 接收报文 = 从站地址 + 02 + 字节计数 + 具体数据 + CRC16校验

我们来逐一分解每一个部分。

🔹 第一部分:从站地址(Slave Address)

  • 这是报文的第一字节,与发送报文中的从站地址相同。
  • 它告诉主站:“这是谁回复的”。

一句话总结
从站地址 = 回复人地址,告诉主站“这是我回复的”。

🔹 第二部分:功能码 02

  • 这是报文的第二字节,固定为 02
  • 它告诉主站:“我正在回复你关于输入线圈的查询”。

一句话总结
功能码02 = 我在回复传感器状态

🔹 第三部分:字节计数(Byte Count)

  • 这是报文的第三字节,用来指定后面“具体数据”部分有多少个字节。
  • 它是一个8位无符号整数,最大值是 255
  • 因为每个字节可以存储8个线圈的状态(1个bit代表1个线圈),所以最多可以返回 255 * 8 = 2040 个线圈的状态。

🧩 举例说明

你请求读取16个线圈:

  • 16个线圈需要多少字节?
    • 每个字节存8个线圈 → 16 / 8 = 2 → 正好2字节
  • 所以,字节计数 = 02

一句话总结
字节计数 = 数据部分有多少个字节

🔹 第四部分:具体数据(Data)

  • 这是报文的第四字节及以后,用来存放实际的线圈状态。
  • 每个字节的每一位(bit)代表一个线圈的状态:
    • 1 = 触发(ON)
    • 0 = 未触发(OFF)
  • 数据的顺序是从低位到高位,再从左到右。

🧩 举例说明

假设你读取了16个线圈,它们的状态是:

线圈编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
状态 1 0 1 1 0 0 1 0 1 1 0 1 0 1 0 1

那么,具体数据应该如何排列?

  • 第1个字节:存储线圈1~8的状态 → 01001101(二进制)→ 4D(十六进制)
  • 第2个字节:存储线圈9~16的状态 → 10101010(二进制)→ AA(十六进制)

💡 重要提醒
在Modbus协议中,数据的位序是从低位到高位排列的!也就是说,第0位是最低位,第7位是最高位

所以,正确的排列应该是:

  • 线圈1 → bit0
  • 线圈2 → bit1
  • ...
  • 线圈8 → bit7
  • 线圈9 → bit0(下一个字节)
  • 线圈10 → bit1(下一个字节)
  • ...
  • 线圈16 → bit7(下一个字节)

因此,具体数据 = 4D AA

🔹 第五部分:CRC16校验

  • 这是报文的最后两个字节,用来保证报文的准确性和完整性。
  • CRC16校验码是根据前面所有字节(从站地址到具体数据)计算出来的。

一句话总结
CRC16校验 = 数据的“验证码”,确保报文在传输过程中没有出错。


4️⃣ 完整案例解析:读取2号从站从10开始的16个输入线圈

图中给出了一个完整的案例:

发送报文02 02 00 0A 00 10 59 F7
接收报文02 02 02 15 00 F3 28

下面我们来一步一步解析这个案例。

📌 步骤1:发送报文解析

发送报文 = 02 02 00 0A 00 10 59 F7

部分 字节位置 内容 说明
从站地址 第1字节 02 发送给设备2
功能码 第2字节 02 读取输入线圈
起始地址 第3-4字节 00 0A 从地址10开始(即00011)
线圈数量 第5-6字节 00 10 读取16个线圈
CRC16校验 第7-8字节 59 F7 CRC16校验码

发送报文含义
“设备2,请告诉我从地址10开始的16个输入线圈的状态。”

📌 步骤2:接收报文解析

接收报文 = 02 02 02 15 00 F3 28

部分 字节位置 内容 说明
从站地址 第1字节 02 设备2回复的
功能码 第2字节 02 回复的是输入线圈状态
字节计数 第3字节 02 数据部分有2个字节
具体数据 第4-5字节 15 00 线圈状态数据
CRC16校验 第6-7字节 F3 28 CRC16校验码

接收报文含义
“设备2回复:从地址10开始的16个输入线圈的状态是 15 00。”

📌 步骤3:解析具体数据 15 00

现在,我们要把 15 00 转换成16个线圈的状态。

🧮 第一步:将十六进制转换成二进制

  • 1500010101
  • 0000000000

🧮 第二步:按位解析

字节 二进制 对应线圈编号 状态
15 0 0 0 1 0 1 0 1 1 2 3 4 5 6 7 8 0 0 0 1 0 1 0 1
00 0 0 0 0 0 0 0 0 9 10 ... 0 0 0 0 0 0 0 0

💡 注意
在Modbus协议中,位序是从低位到高位排列的!也就是说,第0位是最低位,第7位是最高位

所以,正确的解析应该是:

  • 第1个字节 1500010101 → 从右到左:

    • bit0 = 1 → 线圈1 = 触发
    • bit1 = 0 → 线圈2 = 未触发
    • bit2 = 1 → 线圈3 = 触发
    • bit3 = 0 → 线圈4 = 未触发
    • bit4 = 1 → 线圈5 = 触发
    • bit5 = 0 → 线圈6 = 未触发
    • bit6 = 0 → 线圈7 = 未触发
    • bit7 = 0 → 线圈8 = 未触发
  • 第2个字节 0000000000 → 从右到左:

    • bit0 = 0 → 线圈9 = 未触发
    • bit1 = 0 → 线圈10 = 未触发
    • bit2 = 0 → 线圈11 = 未触发
    • bit3 = 0 → 线圈12 = 未触发
    • bit4 = 0 → 线圈13 = 未触发
    • bit5 = 0 → 线圈14 = 未触发
    • bit6 = 0 → 线圈15 = 未触发
    • bit7 = 0 → 线圈16 = 未触发

最终结果

线圈编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
状态 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0

🎉 恭喜你!你已经成功解析了功能码02的接收报文!


5️⃣ 常见问题与避坑指南

❓ 问题1:为什么我发送的报文没有响应?

  • 可能原因
    1. 从站地址错误 → 检查设备地址是否正确。
    2. 功能码错误 → 检查功能码是否为 02
    3. 起始地址错误 → 检查地址是否从 0 开始。
    4. 线圈数量错误 → 检查数量是否在 1 ~ 2000 之间。
    5. 校验码错误 → 使用正确的CRC16算法计算校验码。
    6. 通信参数错误 → 检查波特率、数据位、停止位、校验位是否一致。

❓ 问题2:为什么接收报文中的字节计数是2,而我只读了16个线圈?

  • 原因:因为16个线圈需要2个字节来存储(每个字节存8个线圈)。
  • 16 / 8 = 2 → 正好2字节。

一句话总结
字节计数 = ceil(线圈数量 / 8)

❓ 问题3:如何手动计算CRC16校验码?

  • 不要手动计算! 使用Modbus调试软件或编程库(如Python的pymodbus)自动生成。
  • 如果你一定要手动计算,可以使用在线CRC计算器,选择“Modbus RTU CRC16”。

6️⃣ 实战模拟:手把手教你构造和解析报文

假设你现在有一个任务:

“我要读取设备 01 的输入线圈,从地址 00001 开始,读取8个线圈。”

📌 步骤1:构造发送报文

  1. 从站地址 = 01
  2. 功能码 = 02
  3. 起始地址 = 00 00(相对地址0)
  4. 线圈数量 = 00 08(读取8个线圈)
  5. CRC16校验 = B2 0D(由软件自动计算)

发送报文 = 01 02 00 00 00 08 B2 0D

📌 步骤2:假设接收报文

假设设备回复:

接收报文 = 01 02 01 FF 8C 4B

📌 步骤3:解析接收报文

  1. 从站地址 = 01 → 设备1回复的
  2. 功能码 = 02 → 回复的是输入线圈状态
  3. 字节计数 = 01 → 数据部分有1个字节
  4. 具体数据 = FF → 二进制 11111111
  5. CRC16校验 = 8C 4B → 校验通过

📌 步骤4:解析具体数据 FF

  • FF11111111 → 从右到左:
    • bit0 = 1 → 线圈1 = 触发
    • bit1 = 1 → 线圈2 = 触发
    • bit2 = 1 → 线圈3 = 触发
    • bit3 = 1 → 线圈4 = 触发
    • bit4 = 1 → 线圈5 = 触发
    • bit5 = 1 → 线圈6 = 触发
    • bit6 = 1 → 线圈7 = 触发
    • bit7 = 1 → 线圈8 = 触发

最终结果:8个线圈全部为“触发”状态!


🎯 下一步学习建议

  1. 动手实践:使用Modbus调试软件(如Modbus Poll, QModBus),输入不同的地址、线圈数量,观察返回结果。
  2. 学习其他功能码:功能码01(读取输出线圈)、03(读取输出寄存器)、04(读取输入寄存器)等,它们的结构类似,只是操作对象不同。
  3. 阅读设备手册:任何Modbus设备都会在手册中列出支持的功能码、地址范围和通信参数,一定要学会看手册!
  4. 学习CRC16校验:虽然不需要手动计算,但了解其原理有助于深入理解协议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年实验室 CMA/CNAS 认证咨询公司全新推荐

发布时间:2025 年 11 月 3 日 作者:实验室合规研究小组 在国家市场监管总局持续强化检验检测机构资质要求的背景下,CMA 计量认证与 CNAS 实验室认可已成为实验室合规运营的硬性门槛。以下基于三家主流咨询机构官网最…

2025年11月沈阳酒店深度评测排名:从用户需求角度解析优质选择

作为计划前往沈阳的旅客,您可能正在寻找一家既能满足便捷出行需求,又能提供特色服务的酒店。无论是商务出行还是休闲旅游,选择一家地理位置优越、设施齐全的住宿场所至关重要。沈阳作为东北地区的重要城市,酒店行业…

2025 年 11 月 T2紫铜棒厂家推荐排行榜,国标T2紫铜棒,高精度紫铜棒,耐磨紫铜棒,定制紫铜棒公司推荐

2025 年 11 月 T2紫铜棒厂家推荐排行榜:国标T2紫铜棒、高精度紫铜棒、耐磨紫铜棒、定制紫铜棒公司深度解析 行业背景与发展现状 T2紫铜棒作为工业领域重要的基础材料,在电力、电子、机械制造等行业中具有不可替代的地…

2025 年 11 月 6082 铝板厂家推荐排行榜,6061铝板,7075铝板,5083铝板,2024铝板,优质铝合金板材供应商精选

2025年11月6082铝板厂家推荐排行榜:优质铝合金板材供应商精选 随着现代工业对材料性能要求的不断提升,铝合金板材在航空航天、交通运输、机械制造等领域的应用日益广泛。其中6082铝板以其优良的耐腐蚀性、焊接性能和…

2025 年 11 月 7050 铝板厂家推荐排行榜,7050 铝板,7050 铝板厂家,7050 铝板批发,7050 铝板公司推荐,专业实力与客户满意度深度解析

2025年11月7050铝板厂家推荐排行榜:专业实力与客户满意度深度解析 随着航空航天、国防军工、交通运输等高端制造领域的快速发展,7050铝板作为高强铝合金材料的代表,其市场需求持续增长。7050铝板以其优异的强度、耐…

2025 年 11 月 T2紫铜排厂家推荐排行榜,优质T2紫铜排,高精度紫铜排,导电紫铜排,耐磨紫铜排公司推荐

2025年11月T2紫铜排厂家推荐排行榜:优质高精度导电耐磨紫铜排企业权威指南 行业背景与发展现状 T2紫铜排作为工业领域重要的基础材料,在电力、电子、机械制造等行业中扮演着关键角色。随着新能源、5G通信、智能制造等…

P12.常见的transforms(二)

P12.常见的transforms(二)12.1Resize使用 1.Resize使用1_输入的size为sequence 【注:“忽略大小写,进行提示匹配”的设置:一般情况下,你需要输入R,才能提示出Resize;我们想设置,即便你输入的是r,也能提示出R…

AT_abc200_d [ABC200D] Happy Birthday! 2 题解报告

题目传送门 经历 学校拿来当考试题,第一眼看到这题,觉得是数学结论题,想了一会公式,结果脑子烧了,决定打个暴搜。 事实上,我似乎打出了正解:数学结论加暴搜,只是没有结合。 简单题意 给你 \(N\) 个数,要求选出…

使用git clone配合git sparse-checkout拉取大型仓库

git clone --no-checkout(注意是两个短横线,不是四个)的作用是:克隆远程仓库,但不自动检出(checkout)工作目录中的文件。详细解释 正常执行 git clone <repo> 时,Git 会做两件事:把整个仓库(包括所有历…

AT_indeednow_2015_qualb_4 高橋くんと数列 题解报告

题目传送门 题意 给你一个长度为 \(N\) 序列 \(A\),保证每一个数 \(A_i \le C\),要求对于从 \(1\) 到 \(C\) 中的每一个数都在序列中寻找闭区间,使得区间中至少有一个数等于它,输出从 \(1\) 到 \(C\) 中的每一个数…

TOON 协议与 AIDotNet.Toon 实践指南

TOON 协议与 AIDotNet.Toon 实践指南一、TOON 是什么 官方定义要点摘录(来源:toon-format/toon 仓库 README):Token-efficient:通常比 JSON 少 30–60% 的 tokens(Key Features 列表) LLM-friendly guardrails:…

杂题选做-4

#31 P2824 注意到只有一次询问,那么我们可以离线处理。 然后我们考虑一个弱化的问题,值域只有 \(\{0,1\}\)。 那么我们我们在处理的时候可以直接将区间 \([l,r]\) 内的一的数量 \(k\) 询问出来,然后将 \([l,r-k]\) …

2025 年 11 月江阴商标注册服务商权威推荐榜:专业代理机构实力解析与高效申请指南

2025 年 11 月江阴商标注册服务商权威推荐榜:专业代理机构实力解析与高效申请指南 在当今知识产权保护日益重要的商业环境中,商标注册已成为企业品牌建设与市场保护的重要环节。江阴作为长三角地区重要的制造业基地和…

2025 年 11 月江阴商标注册服务商权威推荐榜:专业代理机构与高效申请流程口碑之选

2025 年 11 月江阴商标注册服务商权威推荐榜:专业代理机构与高效申请流程口碑之选 在知识产权保护日益重要的今天,商标注册已成为企业品牌建设的关键环节。江阴作为长三角地区重要的制造业基地,企业对商标注册服务的…

详细介绍:安全框架 SpringSecurity 入门(超详细,IDEA2024)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

洛谷 P1780 染色的立方体 题解报告

赛时经历 赛时没有注意复杂度,以为暴力搜索会超时,于是喜提爆零。 思路 暴力搜索加贪心。 暴力搜索部分 复杂度证明 大家应该都玩过骰子吧,玩久了就会发现,一个骰子如果分出方向的话,一共有 \(24\) 种摆放方法。 …

P11.常见的transforms(一)

P11.常见的transforms(一)11.1_call_使用11.2ToTensor使用 1.代码如下:点击查看代码 from PIL import Image from torch.utils.tensorboard import SummaryWriter from torchvision import transformsimg = Image.o…

2025年11月上海装修公司榜单:松江千州装饰真实口碑深度解析

站在收房钥匙与装修合同之间,多数上海业主的第一道焦虑是“谁能把图纸变成可住的家,又不让钱包失控”。2025年三季度上海市消保委统计,家装投诉量仍居服务类前五,其中“工期拖延、增项、售后失联”占七成。政策层面…

2025年11月上海装修公司排行榜:从设计到交付的完整评价指南

站在收房钥匙与装修合同之间,多数上海业主的第一道焦虑是“到底把家交给谁”。市区老房翻新、松江新城首套、徐汇学区房改造,不同场景背后却是同一串痛点:预算随时失控、工期一拖再拖、隐蔽工程看不见摸不着、设计师…

2025年11月上海装修公司排名榜:十强对比看谁更值

在上海这样的一线城市,装修不仅关乎居住舒适度,更直接影响资产保值。多数业主面临“预算有限、工期紧张、风格难定、增项频发”四大痛点,同时担心设计落地差、隐蔽工程隐患、售后无人响应。2025年上海市住建委公开数…