1. Modbus通讯基础回顾:RS-485物理层特性、Modbus RTU/ASCII协议帧格式、主从站通讯机制
各位工程师朋友,咱们开始第一讲。做现场总线这么多年,我见过太多通讯问题,最后追根溯源,都是基础没打牢。Modbus这东西,看着简单,但坑不少。今天咱们就把地基夯实。
1.1 RS-485物理层特性
RS-485是Modbus最常用的物理层。说白了,它就是一对差分信号线,A和B。为什么用差分?抗干扰能力强啊。你想想看,干扰信号同时作用在两根线上,一减就没了。
关键参数我列一下:
| 参数 | 典型值 | 说明 |
|---|---|---|
| 传输距离 | 1200米(理论) | 实际建议800米以内 |
| 节点数 | 32个(标准) | 加中继可扩展 |
| 共模电压 | -7V ~ +12V | 超过这个范围会损坏芯片 |
| 终端电阻 | 120Ω | 线缆特性阻抗匹配 |
避坑指南:我曾经在一个项目里,现场距离也就300米,但通讯就是断断续续。查了半天,发现终端电阻没加。你想想看,信号跑到末端反射回来,跟后面的信号叠加,不乱才怪。所以,长线通讯,终端电阻必须加。
RS-485还有个特点,半双工。同一时间只能一个设备发,其他设备收。这个特性决定了Modbus的主从机制。
1.2 Modbus RTU/ASCII协议帧格式
Modbus有两种帧格式:RTU和ASCII。我个人习惯用RTU,效率高。ASCII主要是给那些只能处理ASCII字符的老设备用的。
RTU帧格式:
| 地址码 | 功能码 | 数据区 | CRC校验 |
| 1字节 | 1字节 | N字节 | 2字节 |
举个例子,读取从站地址为1的设备的保持寄存器,起始地址0,读取2个寄存器:
发送:01 03 00 00 00 02 C4 0B
接收:01 03 04 00 0A 00 14 XX XX
这里01是地址,03是功能码(读保持寄存器),00 00是起始地址,00 02是寄存器数量。C4 0B是CRC校验。
小技巧:CRC校验很多人觉得麻烦,其实有现成的计算工具。但我建议你理解一下原理,因为有时候CRC算不对,通讯就是不通。我遇到过好几次,设备手册上写的CRC算法跟标准不一样,折腾半天才发现。
ASCII帧格式:
| 起始符 | 地址码 | 功能码 | 数据区 | LRC校验 | 结束符 |
| : | 2字符 | 2字符 | N字符 | 2字符 | CR/LF |
ASCII帧用LRC校验,比CRC简单,但效率低。同样的命令,ASCII帧长度是RTU的两倍。
1.3 主从站通讯机制
Modbus是典型的主从架构。一个主站,多个从站。主站发起请求,从站响应。从站之间不能直接通讯。
通讯流程:
- 主站发送请求帧,包含目标从站地址
- 所有从站都收到这个帧,但只有地址匹配的那个才处理
- 从站执行命令,然后返回响应帧
- 主站收到响应,解析数据
注意:如果从站没响应,主站会超时重发。这个超时时间设置很关键。设太短,从站还没处理完就重发,造成总线冲突。设太长,系统响应慢。我一般设500ms,根据现场情况调整。
主站轮询周期怎么算?举个例子,你有10个从站,每个从站响应时间50ms,加上主站处理时间20ms,那一个周期就是:
总周期 = (50ms + 20ms) × 10 = 700ms
嗯,这里要注意,实际还要加上线路延迟和干扰重发的时间。我建议留30%的余量。
广播机制:地址0是广播地址,所有从站都会执行,但不返回响应。这个功能我用的不多,因为没法确认从站是否执行成功。
个人经验:有一次在钢厂调试,现场电磁环境极差。Modbus通讯时不时就丢包。我后来把每个从站的响应超时从200ms改到800ms,重试次数从3次改到5次,问题就解决了。虽然响应慢了点,但至少通讯稳定了。有时候,稳定比速度更重要。
好了,第一讲就到这里。基础打牢了,后面讲干扰分析和抗干扰策略,你才能理解为什么那么做。下一讲,咱们聊聊现场常见的干扰源。