4、Modbus地址映射:变频器寄存器地址分类与功能码详解

好,咱们今天聊点实在的。Modbus通信说白了,就是主站和从站之间互相递纸条。但纸条往哪儿递?递什么内容?这就得搞清楚变频器内部的寄存器地址是怎么划分的。

我记得刚入行那会儿,拿着说明书对着变频器一顿操作,结果读回来的数据全是乱的。后来才发现,地址映射搞错了。嗯,这个坑我替你们踩过了,今天咱们就把它填平。

4.1 变频器寄存器地址分类

变频器里的寄存器,主要分两大类:保持寄存器输入寄存器。别被名字唬住,其实很好理解。

4.1.1 保持寄存器(Holding Register)

保持寄存器,说白了就是既能读又能写的寄存器。你想修改变频器的参数,比如设定频率、加减速时间、运行方向,都得通过它。

  • 地址范围:Modbus协议里,保持寄存器的地址通常从40001开始(PLC的视角),但实际通信时用的是0x0000~0xFFFF的偏移地址。
  • 数据长度:每个寄存器16位(2个字节)。
  • 典型用途:设定频率、PID目标值、运行命令、故障复位等。

重点来了:我习惯把保持寄存器想象成变频器的「控制面板」。你拧旋钮、按按钮,本质上就是在读写这些寄存器。

4.1.2 输入寄存器(Input Register)

输入寄存器,只能读,不能写。它用来反馈变频器的实时状态,比如当前频率、电流、电压、温度等。

  • 地址范围:Modbus协议里,输入寄存器的地址通常从30001开始,偏移地址同样是0x0000~0xFFFF。
  • 数据长度:每个寄存器16位。
  • 典型用途:读取实际频率、母线电压、电机电流、故障代码。

我的小技巧:调试时,我习惯先读输入寄存器,确认变频器响应正常,再去写保持寄存器。这样能快速定位问题是出在通信上,还是出在参数设置上。

4.2 功能码详解

功能码就是主站发给从站的「指令码」,告诉从站你想干什么。变频器控制中最常用的三个功能码:03、06、16。咱们一个一个说。

4.2.1 功能码03:读取保持寄存器

功能码03,用来批量读取保持寄存器的值。一次最多可以读125个寄存器(有些设备限制更少)。

报文格式

主站发送:从站地址 + 0x03 + 起始地址高字节 + 起始地址低字节 + 寄存器数量高字节 + 寄存器数量低字节 + CRC校验
从站响应:从站地址 + 0x03 + 字节数 + 数据1高字节 + 数据1低字节 + ... + CRC校验

举个例子:我想读取变频器当前频率(假设地址是0x1000)。

发送:01 03 10 00 00 01 84 0A
响应:01 03 02 13 88 B8 3A
解读:频率值 = 0x1388 = 5000,如果精度是0.01Hz,那就是50.00Hz

注意:我曾经遇到过一台变频器,说明书上写地址是40001,但实际通信时地址偏移要减1,也就是用0x0000。这种「地址偏移陷阱」在国产变频器里特别常见,一定要看仔细了。

4.2.2 功能码06:写单个保持寄存器

功能码06,用来修改单个保持寄存器的值。适合写设定频率、启停命令这种单个参数。

报文格式

主站发送:从站地址 + 0x06 + 寄存器地址高字节 + 寄存器地址低字节 + 数据高字节 + 数据低字节 + CRC校验
从站响应:从站地址 + 0x06 + 寄存器地址高字节 + 寄存器地址低字节 + 数据高字节 + 数据低字节 + CRC校验

举个例子:我想把变频器频率设为30.00Hz(假设地址0x1000,精度0.01Hz,数据=3000=0x0BB8)。

发送:01 06 10 00 0B B8 8C 2A
响应:01 06 10 00 0B B8 8C 2A(回显,表示写入成功)

避坑指南:写频率时,一定要先确认变频器处于「运行就绪」状态,否则写入可能被忽略。我习惯在写之前先读一下状态寄存器。

4.2.3 功能码16:写多个保持寄存器

功能码16,也叫0x10,用来批量写入多个保持寄存器。一次最多可以写123个寄存器。

报文格式

主站发送:从站地址 + 0x10 + 起始地址高字节 + 起始地址低字节 + 寄存器数量高字节 + 寄存器数量低字节 + 字节数 + 数据1高字节 + 数据1低字节 + ... + CRC校验
从站响应:从站地址 + 0x10 + 起始地址高字节 + 起始地址低字节 + 寄存器数量高字节 + 寄存器数量低字节 + CRC校验

举个例子:我想同时设定频率为30.00Hz(0x0BB8)和加速度时间为10秒(假设地址0x1001,数据=100=0x0064)。

发送:01 10 10 00 00 02 04 0B B8 00 64 8C 2A
响应:01 10 10 00 00 02 41 C8

为什么用16而不是06? 我个人习惯是:如果一次要改多个参数,比如同时改频率和加减速时间,用16码效率高得多。06码一次只能改一个,来回发好几条报文,通信负担大。

4.3 地址偏移计算

地址偏移,是新手最容易翻车的地方。说白了,就是PLC地址和Modbus通信地址之间的换算

常见映射关系

PLC地址 Modbus偏移地址 说明
40001 0x0000 保持寄存器起始
40002 0x0001 保持寄存器第2个
30001 0x0000 输入寄存器起始
30002 0x0001 输入寄存器第2个

计算公式

Modbus偏移地址 = PLC地址 - 地址基值
例如:PLC地址40001 → 偏移地址 = 40001 - 40001 = 0x0000
      PLC地址40010 → 偏移地址 = 40010 - 40001 = 0x0009

血的教训:我曾经用过一个品牌的变频器,说明书上写「频率设定地址为40001」,但实际通信时它用的是0x0000。我一开始直接填40001发过去,结果变频器毫无反应。后来查了半天才发现,它内部已经把40001映射到了0x0000,我多此一举了。所以,一定要以变频器手册的Modbus地址表为准,别自己瞎猜。

4.4 实战建议

最后,给你几个我这些年总结出来的经验:

  1. 先读后写:调试时先用功能码03读一下,确认通信正常,再用06或16写。
  2. 地址确认:拿到变频器手册,先找到Modbus地址映射表,确认是PLC地址还是偏移地址。
  3. 数据格式:注意变频器数据是整数还是浮点数,有没有精度缩放。比如频率可能是0.01Hz精度,那50.00Hz就要写成5000。
  4. CRC校验:别偷懒,一定要做CRC校验。我见过太多因为CRC错误导致通信卡死的案例。

好了,这一章的内容就到这儿。下一章咱们会聊Python如何通过Modbus控制变频器,到时候我会手把手带你写代码。嗯,期待一下。