目录
1. Modbus协议基础
1.1 什么是Modbus?
Modbus = 工业设备的通用语言
生活比喻:Modbus就像联合国的通用翻译系统
🌍 联合国会议场景:
中国代表 → 翻译官 → 美国代表
法国代表 → 翻译官 → 日本代表
所有人都用英语作为通用语言交流
🏭 工业现场场景:
西门子PLC → Modbus → 施耐德变频器
ABB传感器 → Modbus → 台达触摸屏
不同品牌设备都用Modbus协议交流
1.2 Modbus协议历史
发展历程:
📅 1979年:Modicon公司发明Modbus
├── 🎯 目标:让不同设备能够通信
├── 📡 最初:基于串行通信(RS-232/RS-485)
└── 🌟 特点:简单、开放、免费
📅 1999年:Modbus-IDA成立
├── 📋 标准化Modbus协议
├── 📖 发布官方规范文档
└── 🌐 推广TCP/IP版本
📅 现在:工业通信标准
├── 🏭 全球使用最广泛的工业协议
├── 💰 节省成本(开源免费)
└── 🔧 易于实现和维护
1.3 Modbus协议族
Modbus协议家族:
🏠 Modbus协议家族
├── 📡 Modbus RTU(串行通信版本)
│ ├── RS-232连接
│ ├── RS-485连接
│ └── 二进制数据格式
│
├── 🌐 Modbus TCP(以太网版本)
│ ├── TCP/IP网络
│ ├── 基于以太网
│ └── 二进制数据格式
│
├── 📝 Modbus ASCII(串行ASCII版本)
│ ├── RS-232/RS-485连接
│ ├── ASCII字符格式
│ └── 易于调试(已较少使用)
│
└── 📧 Modbus TCP/IP
├── 基于TCP/IP协议栈
├── 标准502端口
└── 支持多客户端连接
1.4 Modbus通信模型
🎭 主从架构
就像古代皇帝与大臣:
👑 主站(Master)= 皇帝
├── 发号施令:发送查询命令
├── 等待回复:等待从站响应
├── 控制通信:决定何时通信
└── 处理错误:处理通信异常
🙇♂️ 从站(Slave)= 大臣
├── 等待命令:监听主站查询
├── 执行命令:根据命令操作数据
├── 回复结果:返回执行结果
└── 被动响应:不主动发起通信
通信规则:
1. 只有皇帝可以主动说话
2. 大臣只能在被问到时回答
3. 一次只有一个对话进行
4. 必须按照固定格式对话
🔄 请求响应模式
通信过程:
⏰ 时间轴通信示例:
t1: 主站 → 从站1:"报告你的温度值"
t2: 从站1 → 主站:"当前温度25.5°C"
t3: 主站 → 从站2:"启动电机"
t4: 从站2 → 主站:"电机已启动"
t5: 主站 → 从站3:"读取压力值"
t6: 从站3 → 主站:"当前压力1.2MPa"
特点:
✅ 确定性:严格的时序控制
✅ 可靠性:每个命令都有响应
❌ 效率限制:一问一答模式
❌ 实时性限制:轮询所有设备需要时间
2. Modbus RTU详解
2.1 RTU是什么?
RTU = Remote Terminal Unit(远程终端单元)
生活比喻:RTU就像电报通信
📡 古代电报系统:
- 用摩尔斯电码(点点划划)
- 通过电线传输信号
- 接收方解码还原消息
- 简洁高效,适合长距离
🏭 Modbus RTU:
- 用二进制编码(0和1)
- 通过串行线传输数据
- 接收方解析数据帧
- 紧凑高效,适合工业现场
2.2 RTU物理层
🔌 连接方式
RS-485连接(最常用):
🏭 典型工厂布线:
主站(PLC) ←→ 终端电阻 ←→ 从站1 ←→ 从站2 ←→ ... ←→ 从站N ←→ 终端电阻
物理连接:
A+ ←→ A+ ←→ A+ ←→ A+
B- ←→ B- ←→ B- ←→ B-
GND ←→ GND ←→ GND ←→ GND(可选)
布线要求:
📏 最大距离:1200米(无中继器)
👥 最大设备:32个(不加中继器)
🔧 终端电阻:120Ω(网络两端)
🌡️ 工作温度:-40°C到+85°C
RS-232连接(点对点):
💻 电脑 ←→ 单个设备
连接线:
TXD ←→ RXD
RXD ←→ TXD
GND ←→ GND
限制:
📏 最大距离:15米
👥 设备数量:只能1对1
⚡ 传输速度:115200 bps
🔧 适用场景:调试、配置
⚡ 通信参数
串行通信配置:
🔧 标准配置:
波特率:9600 bps(常用)
数据位:8位
停止位:1位
校验位:无校验(None)
流控制:无
📊 波特率选择:
1200 bps ← 远距离、抗干扰
2400 bps ← 一般工业应用
4800 bps ← 平衡选择
9600 bps ← 最常用
19200 bps ← 高速应用
38400 bps ← 短距离高速
57600 bps ← 特殊应用
115200 bps ← 调试用
2.3 RTU数据帧格式
📦 帧结构详解
RTU帧就像一封标准信件:
📮 Modbus RTU数据帧:
┌─────────┬──────────┬────────────┬───────────┬─────────┐
│ 静默 │ 从站地址 │ 功能码 │ 数据 │ CRC │
│ 3.5字符 │ 1字节 │ 1字节 │ N字节 │ 2字节 │
└─────────┴──────────┴────────────┴───────────┴─────────┘
类比信件格式:
静默时间 ← 信件间的间隔
从站地址 ← 收件人地址
功能码 ← 信件类型(查询/命令)
数据 ← 信件内容
CRC校验 ← 邮政编码验证
🔍 各字段详解
1. 静默时间(3.5字符时间):
⏰ 静默时间作用:
- 标记帧的开始和结束
- 防止帧粘连
- 给接收方处理时间
计算公式:
静默时间 = 3.5 × (1 + 8 + 1) × (1/波特率)
例子(9600波特率):
静默时间 = 3.5 × 10 × (1/9600) = 3.65毫秒
🚨 重要提醒:
超过1.5字符时间无数据 = 帧结束
少于3.5字符时间的间隔 = 帧内数据
2. 从站地址(1字节):
📍 地址范围:1-247
├── 0:广播地址(所有从站)
├── 1-247:单个从站地址
└── 248-255:保留地址
实际应用:
🏭 生产线A:
├── 从站1:温度传感器
├── 从站2:压力传感器
├── 从站3:流量计
└── 从站4:变频器
地址设置原则:
✅ 同一网络内地址唯一
✅ 地址分配要有规律
✅ 预留地址供扩展使用
3. 功能码(1字节):
🔧 常用功能码:
├── 01:读线圈状态
├── 02:读离散输入状态
├── 03:读保持寄存器
├── 04:读输入寄存器
├── 05:写单个线圈
├── 06:写单个寄存器
├── 15:写多个线圈
└── 16:写多个寄存器
异常响应:功能码 + 0x80
例子:03功能码异常 → 0x83
4. 数据字段(变长):
📊 数据内容根据功能码而定:
读取操作:
├── 起始地址(2字节)
└── 数量(2字节)
写入操作:
├── 地址(2字节)
├── 数量(2字节)
├── 字节数(1字节)
└── 数据值(N字节)
例子(读取3个寄存器):
起始地址:0x0000(寄存器40001)
数量:0x0003(3个寄存器)
5. CRC校验(2字节):
🛡️ CRC-16校验算法:
目的:检测传输错误
多项式:0xA001
范围:从站地址到数据字段的所有字节
计算步骤:
1. 初始值:0xFFFF
2. 对每个字节进行异或运算
3. 右移8次,每次检查最低位
4. 如果最低位为1,异或多项式
5. 最终结果的低字节在前,高字节在后
验证过程:
发送方:计算CRC附加到帧末
接收方:重新计算CRC比较
一致:数据正确
不一致:数据有误,丢弃帧
2.4 RTU通信时序
⏰ 时序要求
严格的时间控制:
📡 RTU时序规范:
帧间间隔:≥ 3.5字符时间
├── 帧开始标志
├── 防止帧粘连
└── 给设备处理时间
字符间间隔:≤ 1.5字符时间
├── 同一帧内字符间隔
├── 超过1.5字符时间视为帧结束
└── 保证帧的完整性
响应超时:通常100ms-2000ms
├── 主站等待从站响应的最大时间
├── 超时则认为通信失败
└── 根据网络距离和设备性能调整
🔄 典型通信序列
读取寄存器示例:
⏰ 时间线:
t0: 主站发送查询帧
[静默3.5字符] [01] [03] [00 00] [00 01] [84 0A]
t1: 从站接收完整帧(检查CRC)
t2: 从站解析命令(读寄存器40001)
t3: 从站准备响应数据
t4: 从站发送响应帧
[静默3.5字符] [01] [03] [02] [00 64] [B8 FA]
t5: 主站接收响应(检查CRC)
t6: 主站解析数据(值=100)
总耗时:通常10-50毫秒(取决于波特率和处理速度)
2.5 RTU实际案例分析
📊 读取温度传感器数据
完整通信过程:
🌡️ 场景:读取1号温度传感器的当前温度
1. 主站发送查询帧:
从站地址:01(1号设备)
功能码:04(读输入寄存器)
起始地址:00 00(寄存器30001)
数量:00 01(1个寄存器)
CRC:31 CA
完整帧:01 04 00 00 00 01 31 CA
2. 从站响应帧:
从站地址:01
功能码:04
字节数:02(2字节数据)
数据:01 F4(温度值500,实际25.0°C)
CRC:2E 8B
完整帧:01 04 02 01 F4 2E 8B
3. 数据解析:
原始值:0x01F4 = 500
实际温度:500 ÷ 10 = 25.0°C
🎛️ 控制变频器启停
控制命令示例:
⚡ 场景:启动2号变频器
1. 主站发送控制帧:
从站地址:02(2号设备)
功能码:05(写单个线圈)
线圈地址:00 00(线圈1)
数据:FF 00(ON状态)
CRC:8C 3A
完整帧:02 05 00 00 FF 00 8C 3A
2. 从站确认帧:
从站地址:02
功能码:05
线圈地址:00 00
数据:FF 00(确认已设置为ON)
CRC:8C 3A
完整帧:02 05 00 00 FF 00 8C 3A
3. 执行结果:
变频器收到命令后启动电机
线圈状态改为1(运行状态)
3. Modbus TCP详解
3.1 TCP版本概述
Modbus TCP = Modbus + TCP/IP网络
生活比喻:TCP版本就像现代互联网通信
📡 RTU版本 = 传统电话线通信:
- 一条线路,多个分机
- 串行传输,一个一个说话
- 距离有限,需要专用线路
🌐 TCP版本 = 现代网络通信:
- 以太网络,每个设备独立IP
- 并行传输,可以同时通信
- 距离无限,通过互联网连接
3.2 TCP网络架构
🌐 网络拓扑
标准以太网拓扑:
🌍 工厂网络架构:
📊 HMI/SCADA系统
|
🔄 以太网交换机
/ | | \
📡 📡 📡 📡
PLC1 PLC2 变频器 温控器
(192.168.1.10)(192.168.1.11)(192.168.1.12)(192.168.1.13)
每个设备特点:
✅ 独立IP地址
✅ 可同时通信
✅ 标准网线连接
✅ 支持远程访问
🔧 TCP连接特性
连接模式对比:
🔗 TCP连接特点:
├── 面向连接:建立TCP连接后通信
├── 可靠传输:TCP保证数据完整性
├── 全双工:可同时收发数据
├── 多客户端:一个服务器支持多个客户端
└── 标准端口:502端口
🆚 与RTU对比:
RTU:主从模式,一问一答
TCP:客户端/服务器模式,可并发通信
RTU:物理地址(1-247)
TCP:网络地址(IP地址)
RTU:CRC校验
TCP:TCP层自动校验
3.3 TCP数据帧格式
📦 MBAP头部详解
Modbus TCP帧结构:
📬 Modbus TCP数据帧:
┌─────────────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ 事务ID │ 协议ID │ 长度 │ 单元ID │ Modbus PDU │
│ 2字节 │ 2字节 │ 2字节 │ 1字节 │ 变长 │
└─────────────┴─────────────┴─────────────┴─────────────┴─────────────┘
\________________MBAP头部(7字节)________________/
MBAP = Modbus Application Protocol Header
PDU = Protocol Data Unit(功能码+数据)
各字段详细说明:
🎫 事务ID(Transaction ID)
🎫 事务ID作用:
- 配对请求和响应
- 支持并发通信
- 范围:0x0000-0xFFFF
实际应用:
客户端发送:事务ID = 0x0001,读取温度
客户端发送:事务ID = 0x0002,读取压力
服务器响应:事务ID = 0x0001,温度数据
服务器响应:事务ID = 0x0002,压力数据
好处:
✅ 可以同时发送多个请求
✅ 响应可以乱序返回
✅ 提高通信效率
🏷️ 协议ID(Protocol ID)
🏷️ 协议标识:
- 固定值:0x0000
- 表示Modbus协议
- 为将来扩展预留
格式:
高字节:0x00
低字节:0x00
📏 长度字段(Length)
📏 长度计算:
- 后续字节数(不包括事务ID、协议ID、长度字段本身)
- 包括:单元ID + 功能码 + 数据
- 范围:0x0001-0x00FF
计算示例:
读取1个寄存器:
单元ID(1) + 功能码(1) + 起始地址(2) + 数量(2) = 6字节
长度字段 = 0x0006
🏠 单元ID(Unit ID)
🏠 单元标识:
- 设备标识符(类似RTU的从站地址)
- 范围:0x00-0xFF
- 0xFF:广播地址
- 0x00:通常用于单设备
用途:
1. 网关场景:TCP到RTU转换
2. 多单元设备:一个IP多个逻辑设备
3. 兼容性:保持与RTU的一致性
📊 Modbus PDU
📊 PDU内容:
├── 功能码(1字节)
└── 数据字段(变长)
与RTU的区别:
RTU:从站地址 + 功能码 + 数据 + CRC
TCP:功能码 + 数据(无地址,无CRC)
原因:
- IP地址替代了从站地址
- TCP层提供了错误检测
3.4 TCP通信过程
🤝 建立连接
TCP连接建立过程:
🔗 TCP三次握手:
客户端 服务器(端口502)
| |
|----SYN----> | 建立连接请求
| |
|<---SYN+ACK---- | 确认并请求连接
| |
|----ACK----> | 确认连接建立
| |
现在可以发送Modbus数据...
优势:
✅ 一次连接,多次通信
✅ 连接状态监控
✅ 自动重连机制
📡 数据传输
完整的Modbus TCP通信示例:
📊 读取保持寄存器示例:
1. 客户端发送请求:
TCP头部:[源端口][目标端口502][序列号][确认号][标志]
MBAP头部:[00 01][00 00][00 06][01]
PDU:[03][00 00][00 01]
解释:
事务ID:0x0001
协议ID:0x0000(Modbus)
长度:0x0006(6字节)
单元ID:0x01
功能码:0x03(读保持寄存器)
起始地址:0x0000(寄存器40001)
数量:0x0001(1个寄存器)
2. 服务器响应:
TCP头部:[目标端口][源端口502][序列号][确认号][标志]
MBAP头部:[00 01][00 00][00 05][01]
PDU:[03][02][01 F4]
解释:
事务ID:0x0001(匹配请求)
协议ID:0x0000
长度:0x0005(5字节)
单元ID:0x01
功能码:0x03
字节数:0x02(2字节数据)
数据:0x01F4(值500)
3.5 TCP连接管理
🔄 连接状态处理
连接生命周期:
🔄 连接状态图:
建立连接
断开 ←----------→ 连接中
↑ ↓
| 通信中
| ↓
└←----超时/错误----┘
状态处理:
连接中:
- 保持心跳检测
- 监控数据传输
- 处理网络异常
断开状态:
- 自动重连机制
- 指数退避算法
- 连接失败告警
💓 心跳保活
保持连接活跃:
💓 TCP Keep-Alive机制:
├── 定期发送保活探测包
├── 检测连接是否有效
├── 及时发现网络故障
└── 自动清理无效连接
Modbus应用层心跳:
├── 定期读取设备状态寄存器
├── 监控设备在线状态
├── 快速检测设备故障
└── 维护设备通信状态
心跳参数设置:
保活时间:7200秒(2小时)
保活间隔:75秒
保活次数:9次
🔀 多客户端支持
并发连接管理:
🔀 多客户端架构:
设备服务器
/ | \
客户端1 客户端2 客户端3
(HMI) (SCADA) (数据采集)
连接管理:
├── 最大连接数限制(通常8-32个)
├── 连接优先级管理
├── 资源访问权限控制
└── 连接状态监控
实际应用:
🖥️ HMI界面:实时监控显示
📊 SCADA系统:历史数据采集
🔧 维护工具:参数配置和诊断
📱 移动APP:远程监控控制
4. RTU vs TCP对比分析
4.1 技术特性对比
📊 详细对比表
特性 | Modbus RTU | Modbus TCP |
---|---|---|
物理层 | RS-232/485串行 | 以太网TCP/IP |
传输速度 | 1.2K-115.2K bps | 10M-1G bps |
传输距离 | 1200米(RS-485) | 无限制(网络) |
设备数量 | 32个(单段) | 理论无限制 |
数据格式 | 二进制紧凑 | 二进制+TCP头 |
错误检测 | CRC-16校验 | TCP校验和 |
连接方式 | 主从模式 | 客户端/服务器 |
并发性 | 串行一对一 | 并发多连接 |
实时性 | 高(直接传输) | 中等(网络延迟) |
成本 | 低(简单硬件) | 中等(网络设备) |
安装复杂度 | 简单(点对点线) | 中等(网络配置) |
维护难度 | 简单 | 需要网络知识 |
4.2 性能对比分析
⚡ 响应时间对比
RTU响应时间:
⏱️ RTU通信时间计算:
发送时间 = 字节数 × 10位 ÷ 波特率
处理时间 = 设备处理延迟(1-50ms)
传输时间 = 距离延迟(忽略不计)
例子(9600波特率,读1个寄存器):
请求帧:8字节 × 10位 ÷ 9600 = 8.33ms
响应帧:7字节 × 10位 ÷ 9600 = 7.29ms
处理时间:10ms
总时间:8.33 + 7.29 + 10 = 25.62ms
✅ 优势:确定性延迟,实时性好
❌ 劣势:受波特率限制,速度不高
TCP响应时间:
⏱️ TCP通信时间计算:
网络延迟 = 往返时间RTT(1-100ms)
处理时间 = 设备处理延迟(1-50ms)
传输时间 = 数据量 ÷ 网络速度(通常忽略)
例子(局域网,读1个寄存器):
网络RTT:1ms
处理时间:10ms
总时间:1 + 10 = 11ms
✅ 优势:高带宽,支持大数据量
❌ 劣势:网络抖动影响实时性
📈 吞吐量对比
数据传输效率:
📊 RTU吞吐量:
波特率9600:理论960字节/秒
实际考虑协议开销:~400字节/秒
读100个寄存器需要:~0.5秒
📊 TCP吞吐量:
100Mbps网络:理论12.5MB/秒
实际考虑协议开销:~8MB/秒
读100个寄存器需要:<1ms
结论:
RTU适合:少量数据,高实时性要求
TCP适合:大量数据,高吞吐量要求
4.3 应用场景选择
🏭 工业现场应用
RTU最佳场景:
🔧 传统制造业:
├── 生产线控制系统
├── 设备间距离较远
├── 环境恶劣(电磁干扰)
└── 对实时性要求极高
🌡️ 过程控制:
├── 化工厂监控系统
├── 电力系统SCADA
├── 水处理控制系统
└── 暖通空调控制
🚗 车载系统:
├── 汽车生产线
├── 船舶控制系统
├── 火车控制系统
└── 飞机维护系统
选择理由:
✅ 抗干扰能力强
✅ 实时性确定
✅ 成本低廉
✅ 维护简单
TCP最佳场景:
🏢 现代工厂:
├── MES制造执行系统
├── 设备数据采集
├── 生产管理系统
└── 质量追溯系统
🌐 远程监控:
├── 分布式发电站
├── 石油管道监控
├── 环境监测站点
└── 智慧城市系统
☁️ 工业4.0:
├── 工业互联网平台
├── 边缘计算应用
├── 云端数据分析
└── AI质量检测
选择理由:
✅ 支持大数据量
✅ 远程访问方便
✅ 系统集成容易
✅ 扩展性好
4.4 混合部署策略
🔄 网关转换方案
RTU到TCP网关:
🌐 典型网关架构:
现场设备(RTU) ←→ 网关 ←→ 以太网 ←→ 上位机(TCP)
|
协议转换器
├── RTU接口
├── TCP接口
├── 数据缓存
└── 协议映射
网关功能:
📡 协议转换:RTU ←→ TCP
💾 数据缓存:提高响应速度
🔧 设备管理:统一配置界面
📊 数据预处理:过滤、计算、报警
分层网络架构:
🏗️ 三层网络模型:
┌─────────────────────────────────┐
│ 企业层(TCP) │ ERP/MES系统
│ 以太网 + Modbus TCP │
├─────────────────────────────────┤
│ 控制层(TCP/RTU) │ PLC/DCS系统
│ 工业以太网 + 现场总线 │
├─────────────────────────────────┤
│ 设备层(RTU) │ 传感器/执行器
│ RS-485 + Modbus RTU │
└─────────────────────────────────┘
数据流向:
设备层 → 控制层 → 企业层
实时控制 ← 控制层 ← 生产计划
5. 数据模型深度解析
5.1 Modbus数据区域
📚 四大数据区域详解
就像图书馆的分区管理:
📚 Modbus数据图书馆:
├── 📋 线圈区(Coils)- 开关书架
│ ├── 地址:00001-09999
│ ├── 类型:读写布尔值
│ └── 用途:控制继电器、阀门、电机启停
│
├── 👁️ 离散输入区(Discrete Inputs)- 状态书架
│ ├── 地址:10001-19999
│ ├── 类型:只读布尔值
│ └── 用途:按钮状态、限位开关、报警信号
│
├── 📊 输入寄存器区(Input Registers)- 测量书架
│ ├── 地址:30001-39999
│ ├── 类型:只读16位整数
│ └── 用途:传感器数值、模拟量输入
│
└── ⚙️ 保持寄存器区(Holding Registers)- 配置书架
├── 地址:40001-49999
├── 类型:读写16位整数
└── 用途:设定值、参数配置、控制输出
🎯 地址映射规则
Modbus地址系统:
🔢 地址表示方法:
协议地址:从0开始(内部使用)
用户地址:从1开始(人员使用)
例子:
用户地址40001 = 协议地址0x0000
用户地址40002 = 协议地址0x0001
用户地址30001 = 协议地址0x0000
地址计算公式:
协议地址 = 用户地址 - 地址偏移量
偏移量:
线圈:00001 → 偏移1
离散输入:10001 → 偏移10001
输入寄存器:30001 → 偏移30001
保持寄存器:40001 → 偏移40001
5.2 数据类型与编码
📊 基本数据类型
布尔值(1位):
💡 线圈和离散输入:
├── 值:0(OFF/False)或 1(ON/True)
├── 传输:按字节打包,不足位补0
└── 应用:开关状态、报警状态
打包示例:
8个线圈状态:[1,0,1,1,0,0,1,0]
打包后:0xCD(11001101)
解包过程:
接收字节:0xCD = 11001101
线圈状态:
线圈1: 1 (bit 0)
线圈2: 0 (bit 1)
线圈3: 1 (bit 2)
线圈4: 1 (bit 3)
线圈5: 0 (bit 4)
线圈6: 0 (bit 5)
线圈7: 1 (bit 6)
线圈8: 0 (bit 7)
16位整数(寄存器):
🔢 寄存器数据格式:
├── 大小:16位(2字节)
├── 范围:-32768 到 +32767(有符号)
│ 0 到 65535(无符号)
├── 字节序:大端序(高字节在前)
└── 传输:按寄存器顺序发送
例子:
数值:1234(0x04D2)
传输顺序:[0x04][0xD2]
高字节0x04在前,低字节0xD2在后
负数表示:
数值:-1234
二进制:1111101100101110(二进制补码)
十六进制:0xFB2E
传输:[0xFB][0x2E]
🔄 复合数据类型
32位浮点数(IEEE 754):
🌊 浮点数处理:
占用:2个连续寄存器
格式:IEEE 754单精度
例子:温度值25.6°C
IEEE 754编码:0x41CD3333
寄存器分布:
寄存器1:0x41CD(高16位)
寄存器2:0x3333(低16位)
读取步骤:
1. 读取2个寄存器
2. 组合成32位数据
3. 按IEEE 754解码
4. 得到浮点值25.6
32位整数:
📏 长整数处理:
占用:2个连续寄存器
范围:-2,147,483,648 到 +2,147,483,647
例子:计数值100000
十六进制:0x000186A0
寄存器分布:
寄存器1:0x0001(高16位)
寄存器2:0x86A0(低16位)
字节序选择:
大端序:高位在前(Modbus标准)
小端序:低位在前(某些设备)
设备文档要明确说明!
字符串数据:
📝 字符串编码:
编码:通常ASCII或UTF-8
存储:每个寄存器存储2个字符
例子:设备名称"TEMP_01"
字符串长度:7字符
寄存器需求:4个(7÷2向上取整+1)
存储布局:
寄存器1:'T'(0x54) + 'E'(0x45) = 0x5445
寄存器2:'M'(0x4D) + 'P'(0x50) = 0x4D50
寄存器3:'_'(0x5F) + '0'(0x30) = 0x5F30
寄存器4:'1'(0x31) + '\0'(0x00) = 0x3100
5.3 设备数据映射实例
🌡️ 温度传感器映射
典型温度变送器:
📊 设备:智能温度变送器
地址范围:30001-30010(输入寄存器)
数据映射表:
地址 | 描述 | 数据类型 | 单位