Modbus协议地址模型详解学习笔记

news/2025/11/3 19:52:18/文章来源:https://www.cnblogs.com/LunaNorth/p/19188042

1️⃣ 核心思想:地址 = 数据的“门牌号”

在上一篇笔记中,我们知道了Modbus有4个核心存储区:

  • 输出线圈 (0区)
  • 输入线圈 (1区)
  • 输入寄存器 (3区)
  • 输出寄存器 (4区)

但这只是“分区”。每个区里都有成千上万个“房间”(数据位或寄存器),我们需要一个“门牌号”来定位每一个房间。

一句话总结
Modbus地址模型,就是一套给每个数据点分配“门牌号”的规则。


2️⃣ PLC地址模型 vs. Modbus地址模型

图中首先对比了两种地址模型:

🔹 PLC地址模型(工业控制常用)

这是PLC(可编程逻辑控制器)内部使用的地址格式,非常直观:

  • D100 → D区第100个字(寄存器)
  • M10 → M区第10个位(线圈/开关)

这种地址的好处是:

  • 直观易懂:一看就知道是哪个区、第几个。
  • 与设备硬件对应:工程师在编程时直接使用。

但它的缺点是:

  • 不通用:不同品牌的PLC地址格式可能不同(比如西门子、三菱、欧姆龙)。
  • 不能直接用于Modbus通信:Modbus协议有自己的标准地址格式。

💡 简单理解
PLC地址就像你家小区的“楼栋+单元+房号”,比如“3号楼2单元501室”,很具体,但只适用于你这个小区。


🔹 Modbus地址模型(通信协议标准)

Modbus为了统一不同设备之间的通信,定义了一套标准化的地址格式。这套格式的核心公式是:

✅ Modbus地址 = 存储区代号 + (偏移量 + 1)

🧩 公式拆解:

  • 存储区代号:就是我们熟悉的 0, 1, 3, 4
  • 偏移量:从 0 开始计数的位置。
  • +1:这是Modbus协议的一个“历史遗留习惯”,为了兼容早期设备,地址编号从 1 开始,而不是从 0

📌 举个栗子:

你想访问 4区第100个寄存器(也就是输出寄存器区的第100个位置):

  • 存储区代号 = 4
  • 偏移量 = 99 (因为从0开始数,第100个是索引99)
  • 地址 = 4 + (99 + 1) = 4 + 100 = 4100

但在实际应用中,Modbus地址通常以 五位或六位数字 表示,所以它会被写成:

  • 长地址模型40100400100
  • 短地址模型40100

🚨 重要提醒
很多软件(如Modbus Poll)默认显示的是 “相对地址”,也就是去掉区号后的偏移量。比如你看到 100,它其实代表的是 40100(4区第100个寄存器)。这一点一定要搞清楚,否则你会找不到数据!


3️⃣ Modbus地址的两种表示方式:长地址 & 短地址

图中提到了两种主流的地址表示法:

🔹 长地址模型(六位地址模型)

这是最完整、最标准的表示法,由6位数字组成:

  • 前两位:存储区代号
  • 后四位:寄存器或线圈的编号
存储区 区号 示例地址 含义
输出线圈 0x 00001 - 065536 0区第1个到第65536个线圈
输入线圈 1x 10001 - 165536 1区第1个到第65536个线圈
输入寄存器 3x 30001 - 365536 3区第1个到第65536个寄存器
输出寄存器 4x 40001 - 465536 4区第1个到第65536个寄存器

优点:一目了然,看到地址就知道是哪个区、第几个。
缺点:数字太长,读起来有点拗口。

🔹 短地址模型(五位地址模型)

这是更常用的简化版,由5位数字组成:

  • 第一位:存储区代号
  • 后四位:寄存器或线圈的编号
存储区 区号 示例地址 含义
输出线圈 0x 00001 - 09999 0区第1个到第9999个线圈
输入线圈 1x 10001 - 19999 1区第1个到第9999个线圈
输入寄存器 3x 30001 - 39999 3区第1个到第9999个寄存器
输出寄存器 4x 40001 - 49999 4区第1个到第9999个寄存器

优点:简洁明了,大部分Modbus软件都默认使用这种格式。
缺点:最大只能表示到9999,超过这个数就需要用长地址模型。


4️⃣ 绝对地址 vs. 相对地址(重中之重!)

这是新手最容易混淆的地方!图中专门强调了这一点。

🔹 绝对地址 (Absolute Address)

  • 定义:包含存储区代号的完整地址。
  • 例子40001, 30001, 00001
  • 特点
    • 一眼就能看出是哪个区、第几个。
    • 说明书或人与人交流时常用,比如:“出口压力的数据在40010地址”。

📌 适用场景

  • 设备手册
  • 工程师之间沟通
  • 需要精确指定地址时

🔹 相对地址 (Relative Address)

  • 定义:不包含存储区代号,只表示“偏移量”。
  • 例子0, 1, 2, ..., 9999
  • 特点
    • 协议报文里实际传输的就是相对地址!因为功能码已经说明了是哪个区(比如功能码03是读输出寄存器),所以不需要再传区号。
    • 如果你在软件里看到地址是 100,它其实是 40100 的相对地址(即偏移量为100)。
    • 如果在报文中错误地使用绝对地址,会引起冲突!

📌 适用场景

  • Modbus协议数据帧内部
  • 大部分调试软件的“地址输入框”默认显示相对地址

终极记忆法

  • “绝对” = 完整门牌号(带区号)
  • “相对” = 房间号(不带区号,靠功能码知道在哪栋楼)

5️⃣ 存储区范围:每个区能存多少数据?

图中给出了每个存储区的最大容量:

  • 所有区:最多可以存储 65536 个线圈或寄存器。
  • 实际范围
存储区 地址范围(长地址) 地址范围(短地址) 相对地址范围
输出线圈 00001 - 065536 00001 - 09999 0 - 65535
输入线圈 10001 - 165536 10001 - 19999 0 - 65535
输入寄存器 30001 - 365536 30001 - 39999 0 - 65535
输出寄存器 40001 - 465536 40001 - 49999 0 - 65535

💡 为什么是65536?
因为Modbus协议规定,地址偏移量是一个16位无符号整数,最大值是 2^16 - 1 = 65535,所以从0开始数,一共可以有65536个位置。


6️⃣ 实际应用中的地址模型选择

图中提到,在实际应用中,有时不需要长地址模型,原因如下:

🔹 仪表、变频器等小型设备

  • 通常只有几十或几百个寄存器。
  • 使用 短地址模型 即可满足需求。
  • 读起来比较“拗口”(因为数字小,容易记错),但足够用。

🔹 PLC映射表

  • PLC内部地址非常多,通常需要映射到Modbus地址。
  • 这种情况下,一般采用 长地址模型,因为需要精确到每一个寄存器。

总结

  • 小设备 → 用短地址模型(5位)
  • 大系统/PLC → 用长地址模型(6位)
  • 通信报文 → 用相对地址(功能码已说明区号)

7️⃣ 实战模拟:手把手教你查地址

假设你现在有一个任务:

“我要读取PLC中‘出口压力’这个参数,手册上写着它在 40010 地址。”

📌 步骤1:判断这是什么地址?

  • 40010绝对地址,且是 短地址模型(5位)。
  • 第一位 4 → 说明是 输出寄存器区(4区)。
  • 后四位 0010 → 说明是第10个寄存器。

📌 步骤2:转换为相对地址

  • 相对地址 = 0010 - 1 = 9 (因为地址从1开始,偏移量从0开始)
  • 所以,在Modbus报文中,你要发送的地址是 0009(16进制是 0x0009)。

📌 步骤3:选择功能码

  • 你要读取的是“输出寄存器”,所以功能码是 03

📌 步骤4:构造请求帧

一个完整的Modbus RTU请求帧可能是这样的(十六进制):

[设备地址] [功能码] [起始地址高字节] [起始地址低字节] [寄存器数量高字节] [寄存器数量低字节] [CRC校验]

比如:

01 03 00 09 00 01 84 0A
  • 01:设备地址
  • 03:功能码(读输出寄存器)
  • 00 09:起始地址(相对地址9)
  • 00 01:读1个寄存器
  • 84 0A:CRC校验

🎯 恭喜你!你已经完成了从“手册地址”到“协议报文”的完整转换!


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

❓ 问题1:为什么我输入40001读不到数据?

  • 可能原因
    1. 你输入的是绝对地址,但软件默认接受的是相对地址
    2. 你应该输入 0(相对地址),而不是 40001
    3. 检查功能码是否正确(读输出寄存器用03)。

❓ 问题2:为什么我的地址从40001开始,但别人说从40000开始?

  • 历史原因:早期Modbus实现有些是从0开始计数的,但现在标准是从1开始
  • 解决方法:看设备手册!手册会明确告诉你“地址从几开始”。

❓ 问题3:长地址和短地址怎么选?

  • 默认选短地址(5位),除非设备手册特别说明要用长地址(6位)。
  • 如果你不确定,可以在软件里试试 40001400001,看哪个能读到数据。

🎯 下一步学习建议

  1. 动手实践:使用Modbus调试工具(如Modbus Poll, QModBus),输入不同的地址和功能码,观察返回结果。
  2. 阅读设备手册:任何Modbus设备都会在手册中列出支持的地址范围和功能码,一定要学会看手册!
  3. 理解数据帧结构:地址只是Modbus数据包的一部分,后续可以学习完整的“请求帧”和“响应帧”格式。
  4. 学习CRC校验:这是确保数据传输正确的关键,虽然复杂,但了解原理很重要。

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

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

相关文章

首次博客

第一次博客作业 一、自我介绍 102301216;我是懒洋洋;我的爱好是编程和篮球;我最喜欢麻辣香锅(海棠园二层);推荐歌曲《追梦赤子心》;想说的话:代码改变世界,努力成就未来。 二、思考 2.1 初入大学时对计算机专…

CF2161 Pinely Round 5 (Div. 1 + Div. 2) 游记(VP)

中途为和队友 vp 比赛中断,实际表现应该还行。省流 中途为和队友 vp 比赛中断,实际表现应该还行。11.3 内含剧透,请vp后再来。 不是题解!!!!!!! 赛时 A 题是一个人参加 div1 和 div2 的比赛,每次参加可以增…

以太网交换技术

1. 以太网协议最通用的通信协议标准2. 单播,广播,组播单播:mac地址:00:开头 广播:mac地址:FF:FF:FF:FF:FF:FF 组播:mac地址:01:开头 3. 以太网卡 4. 以太网帧格式

2025-11-03 NOIP 模拟赛1 赛后总结

很显然,我今年被 AC 自动机做局了。 前言 先推销一下自己写的游记。 其实今年 ST3 的 AC 自动机做法非常显然,我甚至想出来了一半。但我最后跑去想 T4 了。 与 300+pts 失之交臂。 你们不觉得 Trie 树和 Fail 指针是…

flex:1 什么意思

flex: 1 是 Flexbox 布局中的一个非常常用的属性,它用于 让一个元素在容器中占据剩余的空间。具体来说,flex: 1 是 flex-grow, flex-shrink, 和 flex-basis 的简写。 解释 flex: 1 的含义:flex-grow: 1:元素将会扩…

以销定采是什么?为什么越来越重要?

我这几年一直在帮制造业企业做数字化项目,其中一个变化很明显——越来越多老板开始主动提“以销定采”这个词。 有趣的是,这个词很多人挂在嘴上, 但真要问一句: “你们现在是怎么以销定采的?” 十个里有八个会愣一…

2025年优质少儿编程机构揭秘:提供国家等级测评+优质的课程体系+一站式赛考服务!

据中国教育学会最新统计数据显示,2025年中国少儿编程学员规模突破500万人,同比增长20%,但调查显示,72%的家长在选择编程学习机构时面临“课程质量参差不齐”、“教师资质难辨”、“学员案例夸大”等核心痛点。数据…

Modbus协议功能码详解学习笔记

混吃等死,小富即安,飞黄腾达,是因为各有各的缘法,未必有高下之分。1️⃣ 核心思想:通信 = 数据交互 + 行为指令 在上一篇笔记里,我们知道了:通信的本质是数据交互 —— 设备之间要交换数据。但光有“数据”还不…

议论文素材分类整理

目录 I.「名人」分类(按时代顺序)古代专题 魏晋风度 专题 唐宋八大家近代史专题 革命先烈 专题 新文化运动现代史专题 专题 改革开放歪果仁II.「名言」分类古诗文 近现代 外国III.「tag」分类家国情怀(爱国)民族英…

使用WSL挂载U盘及SD卡外设的方案

使用WSL挂载U盘及SD卡外设的方案今天在学习linux驱动开发的时候,因为使用的是WSL,导致我的内存卡识别不到,无法烧录所用程序,下面是解决方案通过指令sudo mount -t drvfs F:\ ./mnt/f(SD卡格式为FAT32),可以将对…

ESP32 I2C通信

I2C简述 两线式串行总线(SDA和SCL),半双工通信方式(支持来回通信,但每次只能一方通过) 通用函数:Wire.begin() 作为主机加入 Wire.begin(27) 只有一个参数的是作为从机加入 主机向从机发送数据 befinTransmission()开…

day06-自动出题工作流

今日内容 1 自动出题工作流 # 1 需求分析-传统出题需教师手动筛选知识点、设计题型、斟酌难度,耗时且繁琐。自动出题工作流可依据预设的知识点大纲,快速从题库中匹配对应内容,生成不同题型的题目。例如,从高中生物…

推送docker镜像到github

最近在给新生赛出题,服务器没法直接在本地build镜像,学了下怎么推送到github上然后再拉取到服务器在本地的docker上build一个镜像 docker build -t image_name .把镜像标记为ghcr.io的格式 docker tag image_name:la…

软件工程学习日志2025.11.3

软件设计模式 - 建造者模式实战 • 实验来源:石家庄铁道大学信息学院实验5 • 实验类型:模仿型实验 • 核心目标:深入理解建造者模式的原理并掌握实际应用 🔍 建造者模式核心理解 模式动机 建造者模式的核心价值在…

day05-智能换脸-12306出行建议-提取音频工作流

今日内容 1 智能换脸1.1 目标 # 1 用户上传两张人像,把其中一张人脸换到另一个人脸上----》Coze工作流-工作流、智能体---》使用代码调用---》借助于api-python代码、java,go。。。。-postman调用-后期做成软件-app,…

x./AC自动机

前置::trie , kmp AC自动机 #include <bits/stdc++.h> using namespace std; typedef long long ll;const int MAXN = 2e5 + 5; // 模式串长度之和int tr[MAXN][26], fail[MAXN], tot = 0; int e[MAXN], sum[M…

P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题

最大公约数(即 gcd)和最小公倍数(即 lcm)的求法。该题的关键点在于,两个数的积等于它们最大公约数和它们最小公倍数的积。公式表示为 \(a \times b = \text{gcd}(a,b) \times \text{lcm}(a,b)\)。设作为答案的两个…

SQL Server 并发控制 第四篇:Snapshot Isolation (SI) 和 Read Committed Snapshot Isolation (RCSI)

乐观控制模式假定阻塞很少,快照隔离通过使用行版本控制来避免大多数锁定和阻塞。当数据被修改时,受影响行的已提交版本会被复制到 tempdb 并赋予版本号,此操作称为写时复制 (Copy on Write),并用于所有的插入、更新…

godot 描边插件

1:https://github.com/Magodra/GlowBorderEffect 2: outline.gdshader 不支持半透明:shader_type spatial; render_mode unshaded;/*Normal/Depth outline shader. Apply to nodes as a next pass shader texture.In…

对递归两层含义的理解

对递归两层含义的理解目录背景知识Definition从堆栈的角度理解递归缺点和For循环的区别总结Reference背景知识 先了解一下内存结构,但这个不是必须的。Definition 递归是一个循环结构,主要用来处理需要循环执行的任务…