定义
Modbus 是工业领域广泛使用的串行通信协议,包括 Modbus RTU(基于 RS-485 串口)和 Modbus TCP(基于以太网)。用于 PLC、传感器、仪表、变频器等工业设备的数据采集与控制,支持功能码 01/02/03/04/05/06/15/16 进行线圈与寄存器读写。
协议变体
Modbus RTU:基于 RS485 半双工,主从轮询,CRC 校验,典型波特率 9600;Modbus ASCII:可读性更好,效率较低;Modbus TCP:基于以太网,在 TCP 502 端口,增加 MBAP 头,便于跨网络。工业网关、RTU、DTU 常支持 Modbus RTU 采集,并转换为 Modbus TCP、MQTT、OPC UA 等上报。
功能码与数据区
01 读线圈、02 读离散输入、03 读保持寄存器、04 读输入寄存器、05 写单线圈、06 写单寄存器、15 写多线圈、16 写多寄存器。寄存器地址通常 0~65535,不同设备对地址映射(如 40001 保持寄存器)有约定。工业网关需根据设备手册配置从站地址、寄存器映射、数据类型(INT16/UINT32/Float 等)。
应用场景
PLC、变频器、仪表、传感器数据采集;SCADA、DCS、MES 设备接入;AMR 抄表、EMS 能源管理;工业物联网边缘网关协议转换。Modbus 为事实工业标准,设备支持广泛,集成成本低。
地址模型与主站轮询节拍
线圈和寄存器不是同一种量
协议把现场量分成几块互不通用的表。线圈和离散输入是位,保持寄存器和输入寄存器是字。读线圈的功能码不能拿去读模拟量,写单个寄存器和写一段寄存器的报文长度也不一样。主站发出的是“从站号 + 功能码 + 起始地址 + 数量”,从站只回答自己的那一帧。总线上没有设备会主动上报,所以扫描周期完全由主站排程决定,从站数量一多,最坏响应时间就是把每台的超时加在一起。
串行版本在差分或三线链路上半双工传输,帧尾靠静默间隔判断,校验用循环冗余。以太网版本把同样的功能码装进 TCP,端口约定在 502,前面多了事务标识,可以同时有多路请求,但设备内部的处理队列未必撑得住并发。网关若把串行从站映射成多个 TCP 连接同时去读,底层仍然只有一条半双工线,请求会在网关里排队,超时时间要按排队后的时间重算。
半双工总线只能有一个主站
使用串行链路时,一条物理总线只允许一个主站轮询。第二个主站、一台插上的调试笔记本或一个也在广播的网关,都会把应答帧撞碎。从站地址必须在这条总线上唯一。波特率、校验位和停止位三台设备有一台不一致,这一台就会永远超时,而其他从站仍正常,故障看起来像“单台设备坏了”。
它适合点表稳定、刷新在百毫秒到数秒、由采集侧主动读取的仪表、变频器和小型控制器。不适合大量突发报警,也不适合让从站随时插话。需要事件推送时,应在网关里把轮询结果转成别的上报方式,而不是指望从站自己说话。与 PLC 通信时,先确认对方把数据放在保持寄存器还是输入寄存器,再决定功能码。
字序、位序和地址偏移
地址偏移是集成时最常翻车的地方。有的手册从 0 编写保持寄存器,有的把 40001 当作第一个字,组态软件若再自动减一,读到的就是相邻寄存器,数值看起来“有数但不对”。32 位整数和浮点跨两个寄存器,字序可能是高字在前,也可能是低字在前,字节在字内还会再颠倒。不对照手册用已知物理量做一次换算,缩放后的工程值会差出一个数量级。
写操作比读操作更危险。把遥控点写成线圈、把设定值写成错误的寄存器,现场设备会立刻动作。上线时应先只读,核对从站号、功能码和一两个已知量,再开放写。异常码要单独解析:从站回答“非法地址”和主站自己超时不是同一种故障。多主站抢总线、广播写无法确认、以及把 EtherNet/IP 的对象模型当成寄存器平坦地址,都会得到无法复现的偶发错误。