1. Modbus TCP 概述:协议起源、OSI模型定位、与Modbus RTU/ASCII的区别
1.1 协议起源:一个“老古董”为何至今活跃?
说起Modbus,很多年轻工程师可能会觉得这是上个世纪的东西。没错,它诞生于1979年,比我还大几岁。当时Modicon公司(没错,就是后来被施耐德收购的那家)为了给自己的PLC之间通信,搞出了这个协议。
你可能会问:一个40多年前的协议,现在还在用?
我刚开始做自动化项目时也有这个疑问。直到我在一个水处理项目中,看到现场几十台设备全是Modbus通信,从PLC到变频器、从温控表到流量计,清一色支持Modbus。那一刻我明白了——简单、开放、可靠,这三个词就是Modbus的生命力所在。
Modbus TCP是Modbus协议在以太网上的“变种”。说白了,就是把原来串口上跑的Modbus帧,原封不动地塞进TCP/IP包里。嗯,就是这么直接。
核心要点:Modbus TCP = Modbus应用层协议 + TCP/IP传输层。它保留了Modbus的报文结构,只是换了个“运输方式”。
1.2 OSI模型定位:它到底在网络的哪一层?
很多初学者搞不清Modbus TCP在OSI七层模型中的位置。我习惯这样理解:
- 物理层和数据链路层:以太网(IEEE 802.3)
- 网络层:IP协议
- 传输层:TCP协议(端口502)
- 应用层:Modbus应用协议
你看,Modbus TCP实际上跨越了传输层和应用层。它依赖TCP保证数据可靠到达,自己只负责“数据怎么解读”。
我曾经遇到一个现场问题:设备之间偶尔通信超时,排查了半天,最后发现是TCP窗口设置不合理。所以记住,Modbus TCP的稳定性,很大程度上取决于底层TCP/IP的配置。
避坑指南:Modbus TCP默认端口是502。我曾经见过有人把端口改成其他值,结果防火墙一拦,设备全连不上。嗯,除非你有特殊需求,否则别改端口。
下面这张图可以帮你快速理解Modbus TCP在协议栈中的位置:
1.3 与Modbus RTU/ASCII的区别:三个“兄弟”怎么选?
Modbus家族有三个主要成员:RTU、ASCII和TCP。很多工程师问我:到底该用哪个?
我的回答是:看你的物理层和距离需求。
| 特性 | Modbus RTU | Modbus ASCII | Modbus TCP |
|---|---|---|---|
| 物理层 | RS-232/RS-485 | RS-232/RS-485 | 以太网 |
| 数据格式 | 二进制(紧凑) | ASCII字符(可读) | 二进制(TCP帧内) |
| 传输效率 | 高 | 低(约RTU的一半) | 高 |
| 最大距离 | 约1200米(RS-485) | 约1200米(RS-485) | 100米(网线),可扩展 |
| 节点数 | 最多247个 | 最多247个 | 理论上无限制 |
| 校验方式 | CRC16 | LRC | TCP校验和 |
| 典型应用 | 工业现场总线 | 老旧设备/调试 | 工厂以太网/上位机 |
说说我的实际经验:
- Modbus RTU:我最常用的。在一条RS-485总线上挂十几个设备,成本低、稳定。但要注意终端电阻和接地,我吃过亏。
- Modbus ASCII:说实话,现在很少用了。只有在调试阶段,或者某些老设备只支持ASCII时才会碰到。它的优点是报文可读,但效率太低。
- Modbus TCP:如果你要连接上位机、SCADA系统,或者设备分布在较大范围,TCP是首选。不需要考虑地址冲突,直接IP寻址。
重要提醒:Modbus RTU和Modbus TCP的报文结构不同。RTU有CRC校验,TCP没有(由TCP层保证)。如果你用网关做协议转换,一定要确认网关是否正确处理了校验和超时机制。
1.4 报文结构对比:一眼看出区别
我们来看看三种协议的报文格式。我习惯用“帧”来理解:
Modbus RTU帧:
| 地址(1B) | 功能码(1B) | 数据(NB) | CRC16(2B) |
Modbus ASCII帧:
| ':'(1B) | 地址(2B) | 功能码(2B) | 数据(2NB) | LRC(2B) | CRLF(2B) |
Modbus TCP帧:
| 事务标识(2B) | 协议标识(2B) | 长度(2B) | 单元标识(1B) | 功能码(1B) | 数据(NB) |
看到区别了吗?TCP帧多了个MBAP头(事务标识、协议标识、长度),但没有CRC。为什么?因为TCP/IP协议栈已经保证了数据完整性,不需要再算一遍CRC。
个人经验:刚开始学Modbus TCP时,我总纠结“没有CRC会不会丢数据”。后来做了个测试:在100Mbps的工业以太网上连续跑24小时,零丢包。TCP的重传机制比CRC靠谱多了。
1.5 什么时候选Modbus TCP?
我总结了三个场景,你遇到任何一个,都可以优先考虑Modbus TCP:
- 需要高速通信:比如PLC和上位机之间频繁交换数据,串口的速度(通常115200bps)不够用。
- 设备分布范围广:一个车间到另一个车间,距离超过几百米。用网线加交换机,比拉RS-485线方便得多。
- 需要和IT系统对接:比如MES系统要采集设备数据,直接走以太网,不用额外转换。
但如果你只是控制几个变频器,距离又近,用Modbus RTU更经济。别为了“先进”而盲目上TCP,成本会翻倍。
好了,这一章就到这里。Modbus TCP的起源、定位和区别,你应该心里有数了。下一章我们直接上手抓包分析,看看报文到底长什么样。
公众号:蓝海资料掘金营,微信deep3321