1. Modbus协议基础:起源、RTU与ASCII模式区别、TCP/IP协议栈映射

1.1 Modbus的起源——一个老协议为什么还活着?

说起Modbus,我得先聊聊它的历史。1979年,Modicon公司(就是现在的施耐德电气)为了配合自家的PLC,搞出了这个通信协议。你想想看,那是四十多年前的事了。那时候互联网还没影儿,串口通信是主流。

我个人习惯把Modbus叫做「工业界的通用语」。为什么这么说?因为它太简单了。简单到什么程度?一个主站发请求,从站回响应,没了。没有复杂的握手,没有花哨的加密,就是纯粹的「你问我答」。

我在项目中遇到过不少次,甲方要求用Profinet或者EtherCAT,结果现场设备全是老旧仪表,只支持Modbus RTU。最后还得老老实实加个网关转一下。说白了,Modbus的生命力就在于它的「低门槛」——任何单片机,只要有个串口,就能跑起来。

1.2 RTU与ASCII模式——两种串口传输方式

Modbus在串口上有两种模式:RTU和ASCII。很多人搞不清区别,我直接给你讲透。

1.2.1 RTU模式(二进制传输)

RTU模式,数据以二进制形式传输。每个字节8位,效率高,速度快。但有个坑——它没有固定的起始和结束标记,靠的是「静默时间」来判断帧边界。

关键点:RTU模式下,报文之间必须有至少3.5个字符时间的静默间隔。如果间隔小于1.5个字符时间,接收方会认为这是同一帧的数据。

我曾经调试过一个项目,PLC和变频器通信老是丢包。查了半天,发现是上位机发送间隔太短,变频器把两帧数据当成一帧处理了。嗯,这里要注意,很多国产设备对时序要求没那么严格,但进口设备往往很敏感。

1.2.2 ASCII模式(文本传输)

ASCII模式,每个字节拆成两个ASCII字符发送。比如0x1A,RTU直接发1A,ASCII要发字符'1'和'A'(即0x31、0x41)。效率低了一半,但好处是肉眼可读,调试方便。

ASCII模式用固定的帧头(0x3A,即冒号':')和帧尾(0x0D 0x0A,即回车换行)来界定报文。所以它对时序要求没那么苛刻,适合通信质量差的线路。

对比项 RTU模式 ASCII模式
数据编码 二进制,8位 ASCII字符,16位
效率 高(约2倍于ASCII)
帧界定 静默时间(3.5字符) 固定字符(: 和 CR/LF)
调试难度 需要工具解析 肉眼可读
适用场景 高速、可靠线路 低速、噪声大线路

我的建议:能上RTU就上RTU。ASCII模式现在基本只用在老旧设备或者调试阶段。我见过一些德国老设备,只支持ASCII,那没办法,只能迁就。

1.3 TCP/IP协议栈映射——Modbus怎么跑在以太网上?

Modbus TCP/IP,说白了就是把Modbus的报文封装到TCP包里,通过以太网传输。它去掉了RTU的CRC校验(因为TCP/IP底层已经做了),也去掉了地址字段(因为IP地址就是标识)。

你想想看,Modbus RTU的报文结构是:
地址 + 功能码 + 数据 + CRC

而Modbus TCP的报文结构变成了:
MBAP头 + 功能码 + 数据

MBAP头是什么?就是Modbus应用协议头,包含事务标识符、协议标识符、长度和单元标识符。其中单元标识符就是原来RTU里的从站地址。

核心区别:Modbus TCP默认端口是502。我见过不少新手把端口配成5020,结果死活连不上。记住,502,不是5020,也不是5002。

1.3.1 协议栈映射关系

Modbus TCP/IP在OSI模型中的位置是这样的:

  • 应用层:Modbus应用协议(功能码+数据)
  • 传输层:TCP(可靠连接,端口502)
  • 网络层:IP(路由寻址)
  • 链路层:以太网(MAC地址)

说白了,Modbus TCP就是把原来串口上的那套东西,原封不动地塞进了TCP的载荷里。但有个细节要注意——Modbus TCP是「客户端/服务器」模式,不是主从模式。客户端主动发起请求,服务器被动响应。这和RTU的主从模式在逻辑上是一样的,但叫法不同。

避坑指南:我曾经遇到一个项目,现场用交换机级联了十几台Modbus TCP设备。结果发现,当一台设备掉线时,整个网络都卡死了。为什么?因为TCP的超时重传机制!设备掉线后,客户端还在不断重试,占满了带宽。解决方案是设置合理的超时时间,一般建议500ms~2s。

1.4 知识体系结构图

下面这张图,是我梳理的Modbus协议基础的核心逻辑。你看一眼就能明白整个脉络:

Modbus协议基础核心逻辑 Modbus起源(1979年) 串口通信(RS-232/485) 以太网通信(TCP/IP) RTU模式(二进制) ASCII模式(文本) Modbus TCP(端口502) 核心:主从/客户端-服务器模式 请求-响应机制,功能码+数据

1.5 几个容易踩的坑

最后,我把自己这些年踩过的坑总结一下,你记好了:

  1. 波特率匹配:RTU模式下,主站和从站的波特率、数据位、停止位、校验位必须完全一致。少一位都不行。我见过有人把数据位设成7位,结果通信时好时坏。
  2. 地址范围:Modbus标准地址范围是1~247。地址0是广播地址,248~255保留。别问我为什么有人把从站地址设成255,问就是没看手册。
  3. 字节序:Modbus默认是大端模式(高位在前)。但有些国产设备用的是小端。如果你读到的数据是0x1234,显示出来却是0x3412,那就是字节序反了。
  4. 超时设置:TCP模式下,超时时间别设太短。我一般设1秒。太短容易误判为通信故障,太长又影响响应速度。

一个小技巧:调试Modbus通信时,我习惯先用串口助手抓一下原始报文。看看地址对不对,功能码对不对,CRC校验对不对。这三样对了,90%的问题都能解决。

好了,Modbus协议基础就讲到这里。记住一句话:Modbus不复杂,复杂的是现场环境。把基础打牢了,后面排查故障才能游刃有余。


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