Modbus 是工业设备常用的应用层通信协议。客户端发出请求,服务器按功能码读取或写入数据并返回响应。它规定了报文和数据模型,却不规定某个厂家的“温度”一定放在哪个寄存器;真正接设备时,必须配合设备寄存器表。本文从数据区、地址和报文三步读懂基础操作。本文的功能码和报文字节均按十六进制表示:0F 等于十进制 15,10 等于十进制 16。

一、四类数据区与常用功能码

  • 线圈(Coils):单个位,可读写;常用 01 读取、05 写单个、0F 写多个。
  • 离散输入(Discrete Inputs):单个位,只读;用 02 读取。
  • 输入寄存器(Input Registers):16 位字,只读;用 04 读取。
  • 保持寄存器(Holding Registers):16 位字,协议模型中可读写;用 03 读取、06 写单个、10 写多个。设备仍可能把某些保持寄存器设为只读。

功能码决定访问哪类数据。例如 03 与 04 都能读取 16 位寄存器,但访问的是不同数据区。先核对设备手册给出的功能码、寄存器编号、数据类型和读写权限,不能只看数值地址。

二、RTU 与 TCP 有什么区别

Modbus RTU 常运行在串行链路上,例如 RS-485。其帧由站号、功能码与数据、CRC16 校验组成。通信双方必须匹配波特率、数据位、校验位和停止位;同一总线上的设备还需要不同站号。CRC 的低字节先发送。

Modbus TCP 通过 TCP/IP 传输,常用端口 502。报文在功能码与数据前有 7 字节 MBAP 头,其中包含事务标识、协议标识、长度和单元标识。TCP 报文没有 RTU 帧尾的 Modbus CRC。若经过 TCP/RTU 网关,单元标识通常用于选择网关后的串口设备。

三、40001 与报文地址 0 为什么都对

“40001”常是保持寄存器的文档编号,其中前面的 4 表示数据区;报文中的起始地址是从 0 开始的偏移量。按这一约定,保持寄存器 40001 对应功能码 03、起始地址 0000;40002 对应地址 0001。不同设备手册与调试软件可能显示 0 基或 1 基地址,也可能只写偏移量。遇到差一位的问题,先查软件的地址约定,切勿盲目向相邻寄存器写入。

单个寄存器是 16 位。32 位整数或浮点数通常占两个寄存器,两个字之间的顺序由设备手册确定,不能仅凭 Modbus 标准猜测。温度乘以 10、压力乘以 100 等比例换算也是设备定义,不是协议自动提供的。

四、读两个保持寄存器的完整示例

假设某设备手册把温度和湿度放在保持寄存器 40001、40002,原始整数分别为 250、400,比例都是 0.1。客户端用功能码 03,从偏移量 0 连续读取 2 个寄存器。下面的十六进制字节仅用于解释报文;示例中的数值和比例不是通用设备定义。

PDU request:  03 00 00 00 02
PDU response: 03 04 00 FA 01 90

TCP request:  00 01 00 00 00 06 01 03 00 00 00 02
TCP response: 00 01 00 00 00 07 01 03 04 00 FA 01 90

请求 PDU 中,03 是功能码,00 00 是起始地址,00 02 是数量。响应中的 04 是后续数据字节数;00 FA 为十进制 250,01 90 为 400。按假设的比例换算,得到 25.0 °C 和 40.0%。TCP 示例的事务标识为 0001、协议标识为 0000、单元标识为 01;MBAP 长度分别为 0006 和 0007。相同的 PDU 若走 RTU,还要在前面加站号、后面加正确的 CRC16。

五、第一次联调怎么做

  • 先只读不写:从设备手册找一个已知、允许读取的寄存器,确认接口、站号或 IP、端口和串口参数。
  • 按手册选择数据区和功能码,明确调试软件要输入“40001”还是“偏移量 0”。
  • 一次读少量寄存器,核对响应功能码、字节数、原始值,再做有依据的单位与比例换算。
  • 超时先检查线缆、串口参数、站号或网络;收到 83 02 时,表示功能码 03 返回了异常 02(非法数据地址);应核对起始地址和读取数量。异常响应不是正常读数。

安全与进一步阅读

Modbus 读写会影响真实设备。首次测试避免写命令,生产环境应限制可访问的客户端与网络;传统 Modbus TCP 不应直接暴露在公网。需要认证与加密时,应评估设备是否支持 Modbus Security 或采取适当的网络隔离。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

laitecn@gmail.com

QQ
微信
Whatapp