3. Modbus TCP协议:与RTU的区别、IP/Port配置、连接建立与断开、多客户端场景处理

好,咱们今天聊聊Modbus TCP。说实话,这是工业通讯里最常用的协议之一了。很多刚入行的朋友总觉得Modbus TCP和Modbus RTU差不多,不就是把串口换成了网口嘛?嗯,还真不是这么简单。

3.1 Modbus TCP与RTU的核心区别

先说说最直观的区别。Modbus RTU跑在RS-232或RS-485上,是串行通讯。Modbus TCP跑在以太网上,是基于TCP/IP的。但本质区别在哪?

报文结构不同。 RTU有CRC校验,TCP没有。为什么?因为TCP/IP协议栈自己会做校验,不需要应用层再重复做。我见过有人把RTU的CRC硬塞进TCP报文里,结果对方解析不出来——画蛇添足。

对比项 Modbus RTU Modbus TCP
物理层 RS-232/485 以太网
报文头 地址+功能码+数据+CRC MBAP头(7字节)+功能码+数据
校验方式 CRC16 TCP/IP校验
从站地址 1字节(1-247) 单元标识符(1字节)
通讯方式 主从,半双工 客户端/服务器,全双工

还有一个关键点:RTU是半双工,一问一答,不能同时收发。TCP是全双工,可以同时收发数据。这意味着什么?意味着TCP的吞吐量理论上可以更高。

我个人习惯:在项目选型时,如果现场只有几个设备且距离近,用RTU成本低。如果设备多、数据量大、或者需要远程访问,直接上TCP。别为了省一个交换机钱给自己挖坑。

3.2 IP/Port配置——别小看这一步

配置IP和端口,听起来简单吧?但我见过太多人在这上面翻车。

默认端口是502,这是IANA分配给Modbus TCP的官方端口。但注意,有些设备厂商会改端口,比如西门子的S7-1200默认是102?不对,那是S7协议。Modbus TCP的话,大部分设备默认还是502。

配置时要注意三点:

  • IP地址不能冲突——这还用说?但真有人把两个设备设成同一个IP
  • 子网掩码要一致——不在同一个网段,连不上
  • 网关要配对——跨网段通讯时,网关错了就白搭

避坑指南:我曾经在一个项目里,PLC和上位机都在192.168.1.x网段,但PLC的网关设成了192.168.0.1,结果上位机发数据过去,PLC收不到。查了两小时,最后发现是网关配置问题。所以,不跨网段通讯时,网关可以留空,别乱填。

3.3 连接建立与断开——TCP的“三次握手”和“四次挥手”

Modbus TCP基于TCP协议,所以连接建立和断开遵循TCP的规则。

连接建立:三次握手

  1. 客户端发SYN包给服务器
  2. 服务器回SYN+ACK包
  3. 客户端发ACK包

握手完成后,连接建立,可以开始收发Modbus报文。

连接断开:四次挥手

  1. 主动方发FIN包
  2. 被动方回ACK包
  3. 被动方发FIN包
  4. 主动方回ACK包

嗯,这里要注意:不要频繁建立和断开连接。TCP的连接建立是有开销的,每次握手都要几十毫秒。如果每秒读写一次数据,每次都重新连接,那效率就太低了。

我曾经遇到一个项目,上位机软件每秒钟断开重连一次,结果PLC的TCP连接表被撑爆了,直接死机。后来改成保持长连接,问题解决。所以,除非有特殊需求,否则保持长连接

3.4 多客户端场景处理——这才是真正的难点

单客户端场景很简单:一个上位机连一个PLC,一问一答。但实际项目中,往往是多个客户端同时访问同一个服务器。

举个例子:一个PLC作为Modbus TCP服务器,同时被三个上位机访问。这时候会出现什么问题?

  • 连接数限制——PLC的TCP连接数有限,比如有些PLC最多支持8个连接
  • 数据冲突——两个客户端同时写同一个寄存器,谁说了算?
  • 性能下降——客户端多了,PLC的CPU负载上升,响应变慢

怎么处理?

第一,明确主从关系。多客户端场景下,最好只有一个客户端负责写操作,其他客户端只读。如果非要多个客户端写,那就要在应用层做互斥,比如用“写令牌”机制。

第二,合理分配连接。PLC的连接数是有限的,别让每个客户端都开好几个连接。我建议每个客户端只开一个连接,所有数据通过这个连接收发。

第三,设置超时和重连机制。客户端要能检测到连接断开,并自动重连。重连间隔不要太短,建议5-10秒一次,避免频繁重连导致PLC负载过高。

我建议:在多客户端场景下,可以加一个“数据网关”或“OPC服务器”。所有客户端通过OPC访问PLC,OPC服务器统一管理连接。这样PLC只需要维护一个连接,压力小很多。

3.5 知识体系结构图

下面这张图展示了Modbus TCP协议配置与调试的核心逻辑,从协议区别到实际部署,一目了然。

Modbus TCP协议配置与调试知识体系 Modbus TCP协议 与RTU的区别 报文结构:MBAP头 vs CRC 通讯方式:全双工 vs 半双工 从站地址 vs 单元标识符 IP/Port配置 默认端口502 IP冲突检查 子网掩码与网关 连接建立与断开 三次握手建立连接 四次挥手断开连接 保持长连接 多客户端场景处理 连接数限制 数据冲突处理 超时与重连 OPC网关方案

3.6 调试技巧总结

最后,分享几个调试时的实用技巧:

  • 用Wireshark抓包——这是最直接的方法。看TCP三次握手有没有完成,看Modbus报文格式对不对。我调试时必开Wireshark。
  • 先ping通再连Modbus——网络不通,一切免谈。先ping一下,确认IP能通,再配置Modbus。
  • 注意字节序——Modbus是大端模式(高字节在前)。有些设备默认是小端,需要配置。我吃过这个亏,读出来的数据全是反的。
  • 测试工具用Modscan或Modsim——这两个工具免费又好用。Modscan当客户端,Modsim当服务器,调试时很方便。

我个人习惯:调试时先用Modsim模拟服务器,用Modscan模拟客户端,确认通讯正常后再接真实设备。这样能快速定位问题是出在设备端还是上位机端。

好了,Modbus TCP的内容就讲到这里。记住一句话:TCP比RTU灵活,但坑也多。配置时细心一点,调试时耐心一点,问题总能解决。


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