Modbus
工业领域最广泛使用的简单通讯协议,寄存器读写模型,无语义。
数据采集Modbus RTU / TCP
Modbus · Modbus RTU / TCP
工业领域最广泛使用的简单通讯协议,寄存器读写模型,无语义。
为什么它还在用
因为简单、免费、几乎所有 PLC 和仪表都支持。Modbus TCP 在以太网上跑,Modbus RTU 走 RS-485 串口,老设备上后者更常见。
代价
Modbus 只有寄存器地址,没有语义——40001 是什么,需要人去查设备手册并维护一张点表。设备一多,这张点表本身就成了维护负担。这也是同样设备接第二家系统时要重做一遍的原因。
Modbus 四类数据区和常用功能码
读设备数据基本只用到 01–04 四个读功能码。做只读采集时,应明确不使用 05、06、15、16 这些写功能码。
| 数据区 | 传统地址前缀 | 读功能码 | 典型内容 |
|---|---|---|---|
| 线圈(可读写位) | 0xxxx | 01 | 输出点、启停标志 |
| 离散输入(只读位) | 1xxxx | 02 | 开关量输入、报警位 |
| 输入寄存器(只读 16 位) | 3xxxx | 04 | 仪表测量值 |
| 保持寄存器(可读写 16 位) | 4xxxx | 03 | 产量计数、设定值、状态字 |
Modbus TCP 默认端口 502。Modbus RTU 走 RS-485,一条总线上只能有一个主站,靠站号区分从站。
Modbus 点表怎么写:一个示例
下表为示例,地址是虚构的,实际以设备手册为准。
| 信号名 | 地址 | 类型 | 采样周期 | 用途 |
|---|---|---|---|---|
| 运行状态 | 40001 | 16 位整数,1 = 运行 | 1 秒 | 判定停机 |
| 累计产量 | 40010–40011 | 32 位无符号整数 | 5 秒 | 产量与节拍 |
| 报警代码 | 40020 | 16 位整数 | 1 秒 | 停机原因提示 |
点表除了地址,还必须写明数据类型、字节顺序、倍率和单位,否则换一个人接手就得重新试一遍。
Modbus 读不到数据或数值不对,先查这几处
- 地址差 1:手册写 40001,协议里实际发送的是偏移 0。有的软件按 1 起始,有的按 0 起始,读出来的值“像是隔壁的”就是这个问题。
- 32 位数值乱跳:两个寄存器的高低字顺序反了。浮点数和长整数都会遇到,四种字节序挨个试。
- RTU 完全无响应:站号、波特率、数据位、校验位四项必须和设备一致;A/B 线接反也是常见原因。
- RTU 时通时断:总线上已有一个主站(例如触摸屏)在轮询,第二个主站接上去会冲突。
- TCP 连上但读不到:检查单元标识(Unit ID),经网关转 RTU 的设备尤其要核对。
涉及 RS-485 接线和进电气柜的操作,应断电并由持证电工完成,不改动安全回路。不同品牌 PLC 的接法见设备联网:这台设备到底怎么接,取舍见三种数据采集方式。
常见问题
Modbus RTU 和 Modbus TCP 有什么区别?
数据模型和功能码相同,区别在传输层。RTU 走 RS-485 串口,单主站轮询,靠站号寻址并带 CRC 校验;TCP 走以太网,默认端口 502,允许多个客户端同时连接。老设备和仪表多为 RTU,可通过网关转成 TCP 再接入。
Modbus 能不能采到停机原因?
只能采到设备自己知道的那部分。报警代码、急停、门开这类信号可以读出来,作为停机原因的提示;缺料、等检验、换型这类设备不知道的原因,仍然要由操作工在停机当下选择,Modbus 帮不上忙。
用 Modbus 读 PLC 会影响设备运行吗?
只用读功能码、轮询频率合理时,一般不影响控制逻辑。风险来自两处:一是误用写功能码改了设定值,二是轮询过密占满通讯资源。采集程序应限定为只读,周期从 1 秒起步,不要一上来就几十毫秒。
最近更新:2026-09-21 · 出版:工厂数字化编辑部(TEEPTRAK)
微信:Teeptrak-SZ