2. 从站设备地址与功能码:地址范围(1-247)、常用功能码(01/02/03/04/05/06/15/16)、异常响应码
好,咱们接着聊。上一章我们把Modbus的物理层和主从关系理清了。这一章,咱们要深入从站的“身份证”和“指令集”。说白了,就是搞清楚:你怎么找到这个设备?你能让它干什么?它干不了的时候怎么告诉你?
我个人习惯,调试一个新风场的主控PLC之前,一定会先翻翻它的Modbus地址映射表。这张表就是你和设备沟通的“词典”,没有它,寸步难行。
2.1 从站地址:1-247,不是随便写的
Modbus协议规定,从站地址范围是1到247。0地址是广播地址,248到255是保留地址。嗯,这里要注意,0地址只能写,不能读,因为所有从站都会响应,但不会回复,否则总线就乱套了。
我在项目中遇到过,有人把从站地址设成了0,结果主站发出去的广播写命令,所有设备都执行了,但主站收不到任何确认。排查了半天,最后发现是地址配置错了。所以,从站地址必须唯一,且必须在1-247之间。
核心要点:
- 有效地址:1 - 247
- 广播地址:0(只写不读)
- 保留地址:248 - 255
- 每个从站地址在总线上必须唯一
2.2 常用功能码:你的“遥控器”按键
功能码就是主站发给从站的指令,告诉从站你要干什么。常用的其实就8个,我按使用频率给你排个序。
| 功能码 | 名称 | 操作对象 | 说人话版本 |
|---|---|---|---|
| 03 | 读取保持寄存器 | 保持寄存器 (Holding Register) | 读参数、读设定值 |
| 04 | 读取输入寄存器 | 输入寄存器 (Input Register) | 读实时测量值(只读) |
| 01 | 读取线圈状态 | 线圈 (Coil) | 读开关量输出状态 |
| 02 | 读取离散输入状态 | 离散输入 (Discrete Input) | 读开关量输入状态(只读) |
| 06 | 写单个寄存器 | 保持寄存器 | 写一个参数 |
| 05 | 写单个线圈 | 线圈 | 启停一个设备 |
| 16 | 写多个寄存器 | 保持寄存器 | 批量写参数 |
| 15 | 写多个线圈 | 线圈 | 批量设置开关 |
你想想看,在风电场景里,03和04功能码用得最多。比如读取风速、转速、功率这些模拟量,都是用04功能码读输入寄存器。而读取变桨角度、偏航位置这些设定值,通常用03功能码读保持寄存器。
我曾经调试一个变桨系统,发现读回来的桨距角总是跳变。排查到最后,发现是主站用了03功能码去读一个输入寄存器。设备手册上明明写着“输入寄存器用04读”,但工程师图省事,统一用了03。结果呢?读回来的数据全是乱的。所以,功能码和寄存器类型必须严格对应,别混用。
我的小技巧:
调试时,先用03功能码读一遍所有保持寄存器,确认设备的基本参数。再用04功能码读一遍输入寄存器,确认实时数据。这样能快速判断设备是否在正常工作。
2.3 异常响应码:设备在“说”什么?
主站发指令,从站不一定每次都乖乖响应。如果从站发现指令有问题,它会返回一个异常响应。这个响应帧里,功能码的最高位会被置1(即原功能码+0x80),后面跟着一个字节的异常码。
常见的异常码就这几个,我列出来,你记一下:
| 异常码 | 名称 | 含义 | 常见原因 |
|---|---|---|---|
| 01 | 非法功能码 | 设备不支持这个功能 | 用了03去读离散输入 |
| 02 | 非法数据地址 | 要读写的地址不存在 | 地址超出设备映射表范围 |
| 03 | 非法数据值 | 要写入的数据不合理 | 写入值超出量程 |
| 04 | 从站设备故障 | 设备内部出问题了 | 硬件故障、固件崩溃 |
| 06 | 从站设备忙 | 设备正忙,稍后再试 | 正在执行其他命令 |
举个例子,你发了一条指令:01 03 00 00 00 01 84 0A,意思是让地址01的从站,用03功能码,从地址0x0000开始读1个寄存器。如果从站返回:01 83 02 C0 F1,那你就得注意了。这个83就是03 + 0x80,表示异常响应。后面的02就是异常码,意思是“非法数据地址”。
为什么会这样?很可能你读的地址0x0000,在这个从站里根本不存在。我建议你,收到异常码02时,第一件事就是去查设备手册的地址映射表,确认地址是否正确。
避坑指南:
我曾经调试一个偏航驱动器,主站发06功能码写参数,总是返回异常码03。查了半天,发现是写入的值是浮点数,但设备只支持整数。所以,写入前一定要确认数据类型和量程,别想当然。
2.4 知识体系图:一张图看懂
下面这张图,我把从站地址、功能码、异常响应的关系画出来了。你一看就明白。
这张图把三个核心要素串起来了。主站发请求,里面包含从站地址和功能码。从站收到后,要么正常响应,要么返回异常码。你调试的时候,只要抓住这三个点,问题基本就能定位。
本章小结:
- 从站地址范围1-247,0是广播地址,别搞混
- 8个常用功能码,读用03/04,写用06/16,开关量用01/02/05/15
- 异常码是调试的“故障灯”,01/02/03/04最常见
- 收到异常码,先查地址映射表,再查数据类型和量程
公众号:蓝海资料掘金营,微信deep3321