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 知识体系图:一张图看懂

下面这张图,我把从站地址、功能码、异常响应的关系画出来了。你一看就明白。

Modbus从站通信核心要素 主站 请求 从站 响应 从站地址 范围:1 - 247 常用功能码 01: 读线圈 02: 读离散输入 03: 读保持寄存器 04: 读输入寄存器 写功能码 05: 写单个线圈 06: 写单个寄存器 15: 写多个线圈 16: 写多个寄存器 异常响应码 01: 非法功能码 02: 非法数据地址 03: 非法数据值 04: 从站设备故障 调试口诀 地址唯一不能少,功能码要对号。 异常码里藏玄机,地址值域查仔细。 先读后写是规矩,调试从此不着急。

这张图把三个核心要素串起来了。主站发请求,里面包含从站地址和功能码。从站收到后,要么正常响应,要么返回异常码。你调试的时候,只要抓住这三个点,问题基本就能定位。

本章小结:

  • 从站地址范围1-247,0是广播地址,别搞混
  • 8个常用功能码,读用03/04,写用06/16,开关量用01/02/05/15
  • 异常码是调试的“故障灯”,01/02/03/04最常见
  • 收到异常码,先查地址映射表,再查数据类型和量程

公众号:蓝海资料掘金营,微信deep3321