资讯动态

Modbus 寄存器怎么读?从寄存器地址到实际数值

发布时间:2026/10/17 2:17:22 来源:尧图企业网站定制
做 PLC、仪表或传感器的数据采集时经常会遇到一个问题通信正常也能读到数据但数值就是不对。温度显示成几千电压变成小数甚至同一个地址换个工具就读出了不同结果。排查这些问题要先弄清楚寄存器地址、数据类型和数值换算之间的关系。本文使用虚构的温度测点作为示例实际配置应以设备寄存器表为准。一、寄存器是什么可以把寄存器理解为设备对外提供的“带编号的数据格子”。采集软件通过地址找到对应格子读取其中的数据。Modbus 有四类常用数据对象数据对象单个对象大小常用读取功能码线圈1 位01离散输入1 位02保持寄存器16 位03输入寄存器16 位04线圈和离散输入常用于开关状态寄存器常用于温度、电压、计数等数值。一个 16 位寄存器占两个字节但它代表什么物理量由设备定义。保持寄存器在协议模型中支持读写具体地址是否允许写入还要看设备说明。参考Modbus 协议规范二、拿到寄存器表先看哪些字段假设设备手册提供了以下测点参数示例值测点名称温度寄存器参考编号40001读取功能码03数据类型INT16有符号整数寄存器数量1换算关系原始值 × 0.1单位℃这张表告诉我们读取一个保持寄存器将结果按有符号整数解析再乘以 0.1才是实际温度。因此只知道寄存器地址还不足以正确读取测点。另外设备地址和寄存器地址是两个概念。例如在 RS485 总线上设备地址用于选择哪台仪表寄存器地址用于选择该仪表中的哪项数据。三、40001、地址 0 和地址 1 有什么关系这是入门时最容易混淆的地方。在传统参考编号方式中40001 表示第一个保持寄存器对应报文中的地址 0。Modbus 报文中的寄存器地址从 0 开始。参考协议规范第 6.3 节但采集工具的输入方式不一定相同使用零起始地址的工具可能填写0。使用一起始编号的工具可能填写1。支持完整参考编号的工具可能填写40001。三种写法可能指向同一位置关键在于工具如何转换。不要看到地址就习惯性减 1。先确认手册给的是参考编号还是报文地址再确认工具使用哪种规则。还要留意十进制与十六进制例如0x0010对应十进制 16。四、一个数值为什么占两个寄存器寄存器的大小固定但数据类型的长度不同数据类型位数占用寄存器数INT16 / UINT16161INT32 / UINT32322FLOAT32322例如一个 FLOAT32 测点从地址 10 开始通常需要一起读取地址 10 和 11再组合解析。只读其中一个无法得到完整数值。同样的原始位模式按不同类型解释也会得到不同结果。例如0xFFFF按 UINT16 解析是 65535按 INT16 解析则是 -1。对于跨两个寄存器的数据还要确认高低字的排列顺序。单个寄存器在标准报文中高字节先传但跨寄存器的组合方式需要查看设备说明。工具中的“字节序”“字序”设置也应核对具体含义不能只凭选项名称判断。五、把原始值转换为实际温度回到前面的温度示例。假设读回的数据字节为00 EB0x00EB转为十进制是 235按 INT16 解析仍为 235。根据点表的换算关系实际温度 235 × 0.1 23.5℃如果直接显示 235℃可能只是漏掉了倍率并非通信故障。也要避免重复换算如果采集软件已经乘过 0.1上层程序再次乘以 0.1就会错误地显示成 2.35℃。六、数值异常时按什么顺序排查现象优先检查完全没有响应接线、串口参数、设备地址、网络连接返回非法地址异常起始地址、读取数量、地址是否实现有数据但像是其他测点功能码、地址起始规则、地址偏移正负号不对或数值离谱有符号/无符号、整数/浮点、字节序与字序恰好相差 10 倍或 100 倍倍率、单位、是否重复换算调试时先选一个能与设备屏幕对照的测点保存原始报文每次只修改一项参数。确认单个测点正确后再扩展到批量采集会更容易定位问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑