Modbus 是一种长期以来广泛使用、用于工业设备之间数据交换的通信协议。Modbus TCP 则是该协议在 Ethernet 与 TCP/IP 上传输的版本。由于结构简单、开放,且几乎每个品牌的设备都支持,它在需要把不同厂商设备整合到一起的项目中被频繁使用。
基本逻辑:客户端与服务器
Modbus 基于请求-应答(request/response)原理。一方提问,另一方作答。不存在自发的数据发送。
- 客户端(client / 旧称 master):发起请求的一方。
- 服务器(server / 旧称 slave):应答请求的一方。驱动器、
通常是 PLC、SCADA 或 HMI。
电能分析仪、温度控制器、remote I/O。
在 Modbus TCP 中,一个客户端可同时连接多个服务器;一个服务器也可接受多个客户端。相较于运行在串行线上的 RTU,这是一项重要的灵活性。
数据模型:四张表
Modbus 将数据保存在四个不同的区域中:
| 区域 | 类型 | 访问 | 大小 | |—|—|—|—| | Coil | Bit | 读 / 写 | 1 bit | | Discrete Input | Bit | 只读 | 1 bit | | Input Register | Word | 只读 | 16 bit | | Holding Register | Word | 读 / 写 | 16 bit |
实践中使用最多的是 holding register。驱动器参数、速度参考、测量值通常保存在该区域。
常见功能码
| 码 | 操作 | |—|—| | 01 | 读 Coil | | 02 | 读 Discrete input | | 03 | 读 Holding register | | 04 | 读 Input register | | 05 | 写单个 coil | | 06 | 写单个 holding register | | 15 | 写多个 coil | | 16 | 写多个 holding register |
设备支持哪些功能码在其自身文档中说明;并非所有设备都支持所有功能码。
Modbus TCP 与 Modbus RTU 的区别
| 项目 | Modbus RTU | Modbus TCP | |—|—|—| | 物理层 | RS-485 / RS-232 串行线 | Ethernet | | 拓扑 | 线形(bus),带终端电阻 | Ethernet 网络,带 switch | | 寻址 | 1 字节的 slave 地址 | IP 地址 + unit id | | 错误检测 | CRC | TCP 自身的检测 | | 并发 | 单 master | 多客户端 | | 报文头 | 无 | MBAP 头(transaction、protocol、length、unit) |
在 Modbus TCP 中没有 CRC 字段;数据完整性由 TCP 层保证。报文之外还附加 MBAP 头。该头中的 *unit identifier* 字段,特别是在使用 gateway 的系统中,用于选择后端的串行线设备。
标准 Modbus TCP 端口是 502。
寻址混淆——最常犯的错误
在 Modbus 中流通着两种不同的地址表示法,这也是调试中最耗时的问题。
协议地址:从 0 开始。是在线缆上传输的真实值。
传统(5 位)表示法:从 1 开始,并将区域类型作为前缀携带。holding register 显示在 4xxxx 块中。
也就是说,文档中写作“40001”的寄存器,在线缆上的协议地址是 0。如果一台设备的文档使用传统表示法,而 PLC 侧的库使用协议地址,就会产生一个地址偏移。如果调试中读到意料之外的数值,这里是首先要检查的地方。
32 位数据与字节顺序
Modbus 寄存器是 16 位的。一个 32 位的值(长整型或浮点数)会被拆分到两个寄存器中传输。这里出现两个问题:
- 哪个寄存器在前——高字(word)还是低字(word)?
- 寄存器内部的字节顺序是怎样的?
由于标准在这方面未作出严格强制,厂商采用不同的做法。结果:值被读到了,但毫无意义。解决办法是检查设备文档中的字/字节顺序,并在 PLC 侧需要时进行字交换(word swap)。
同样,测量值常以按比例缩放的整数传输(例如真实值的十倍)。缩放系数同样在设备文档中。
性能与查询设计
在 Modbus TCP 中,每次查询都意味着一次往返。与其进行大量单寄存器查询,不如在一次查询中批量读取连续的寄存器,这能显著改善性能。因此,倾向于让设备上要读取的数据在地址上聚在一起。
在设计查询循环时,超时(timeout)与重试(retry)次数应现实地选择。过短的超时会产生不必要的错误报警;过长的超时则会在某台设备故障时拖慢整个扫描循环。
局限
Modbus TCP 不是实时协议。响应时间取决于网络流量、设备的处理负载与 TCP 栈;不作保证。因此它不适用于同步 motion、快速安全功能与短周期控制回路。这类需求会使用 EtherCAT 或 Profinet IRT 等实时协议。
此外,协议中没有身份验证与加密。Modbus TCP 设备不应直接暴露到企业网或互联网上,应将自动化网络隔离出来。
在何处受青睐
- 需要将不同品牌设备整合到一起的系统
- 读取电能分析仪、计量表、温度控制器等测量设备
- 监视驱动器的速度参考与状态信息
- 向 SCADA 与报表层传输数据
- 通过 gateway 将现有的 Modbus RTU 设备接入 Ethernet 网络
的场合
相关产品系列:PLC、HMI、AC 驱动器、Gateway、Ethernet Switch、通信模块
Leave a Reply