2、Modbus协议基础:Modbus RTU vs TCP、物理层与电气特性、主从架构详解
好,咱们正式开始讲Modbus协议的基础。这一节很关键,是后面所有实战的根基。我见过不少新手,上来就写代码,结果通信死活调不通,最后发现是物理层接错了线。所以,咱们先把地基打牢。
2.1 Modbus RTU 与 Modbus TCP:到底有啥区别?
很多人一上来就问:“RTU和TCP哪个好?” 其实没有好坏,只有适不适合。说白了,它们俩是“同一个灵魂,不同的躯壳”。
Modbus RTU,走的是串口(RS-232/RS-485)。数据是一帧一帧发的,每一帧里都有地址、功能码、数据和校验。它的特点是:可靠、简单、成本低。我在一个老旧的水质监测站里见过,传感器离主机几百米远,用的就是RS-485走Modbus RTU,一根双绞线搞定,稳得很。
Modbus TCP,走的是以太网。它把RTU的帧封装到了TCP/IP包里。说白了,就是把串口那套搬到了网络上。它的特点是:速度快、距离远、便于组网。现在很多新的传感器都直接带网口,插根网线就能用。
我给大家整理了一个对比表,一目了然:
| 特性 | Modbus RTU | Modbus TCP |
|---|---|---|
| 物理层 | RS-232 / RS-485 | 以太网 (RJ45) |
| 传输距离 | RS-485可达1200米 | 100米(交换机可扩展) |
| 传输速率 | 9600bps ~ 115200bps | 10/100Mbps |
| 节点数量 | 最多247个(RS-485) | 理论上无限制 |
| 校验方式 | CRC16(必须) | TCP/IP自带校验 |
| 典型应用 | 工业现场、长距离 | 工厂局域网、远程监控 |
核心区别一句话:RTU是串口上的“点对点”或“总线”通信,TCP是网络上的“客户端-服务器”通信。
2.2 物理层与电气特性:别小看这根线
嗯,这里要注意。很多通信问题,根源都在物理层。你想想看,软件写得再好,信号传不过去,一切都是白搭。
2.2.1 RS-485:工业现场的主力军
我个人习惯,做水质监测首选RS-485。为什么?因为它抗干扰能力强,能走远。RS-485用的是差分信号,说白了就是两根线(A和B)传一个信号,靠的是两根线的电压差来判断是0还是1。这种设计天然抗共模干扰。
关键电气参数:
- 差分电压: 大于200mV算有效,一般驱动芯片能输出±1.5V到±5V。
- 共模电压范围: -7V 到 +12V,超出这个范围可能会烧芯片。
- 终端电阻: 120Ω,在总线两端各接一个。我遇到过好几次,忘了接终端电阻,长距离通信时数据就乱跳。
避坑指南:我曾经在一个项目中,把RS-485的A和B线接反了。结果主机死活读不到数据,折腾了半天。后来用万用表一量,才发现线序错了。记住:A接A,B接B,别搞混!
2.2.2 RS-232:短距离的“老将”
RS-232现在用得少了,但在一些老设备上还能见到。它是单端信号,一根线传一个信号,地线共用。距离一般不超过15米,速率也不高。优点是简单,缺点是抗干扰差、距离短。
2.2.3 以太网:现代传感器的标配
现在很多新的水质传感器都支持Modbus TCP,直接走以太网。物理层就是标准的RJ45接口和网线。注意,工业环境最好用屏蔽网线(STP),抗干扰更好。而且,如果现场有强电磁干扰,建议用工业交换机,别用家用的。
2.3 主从架构详解:谁说了算?
Modbus协议的核心思想就是主从架构。说白了,就是“一个老板,多个员工”。老板(主机)发号施令,员工(从机)执行并回复。
2.3.1 主机(Master)
主机是整个通信网络的大脑。它负责发起所有的通信请求。在咱们的水质监测系统里,主机通常就是PLC、工控机或者带串口的电脑。主机可以主动读取从机的数据,也可以写入数据控制从机。
主机的特点:
- 只能有一个主机(在一条总线上)。
- 所有通信都由主机发起。
- 从机之间不能直接通信。
2.3.2 从机(Slave)
从机就是那些传感器、执行器。它们只能被动响应主机的请求。每个从机都有一个唯一的地址,范围是1到247。地址0是广播地址,所有从机都会接收,但不会回复。
从机的特点:
- 可以有多个从机(最多247个)。
- 不能主动发数据,只能等主机来问。
- 收到主机请求后,必须回复(除非是广播)。
我的经验:给传感器分配地址时,我习惯从1开始顺序分配,并且把地址写在标签上贴在设备上。不然时间一长,你根本记不住哪个地址对应哪个传感器。别问我怎么知道的...都是泪。
2.3.3 通信流程:一问一答
Modbus的通信流程特别简单,就是“一问一答”。主机发一个请求帧,从机收到后,处理完再发一个响应帧。如果从机没收到或者收到错误,主机可以重发。
举个例子,主机想读取地址为1的传感器的pH值:
主机发送(请求):
地址: 0x01
功能码: 0x03 (读取保持寄存器)
起始地址: 0x0000 (假设pH值存在这里)
寄存器数量: 0x0001
CRC16: 0x840A
从机回复(响应):
地址: 0x01
功能码: 0x03
字节数: 0x02
数据: 0x0238 (假设pH=7.12,具体编码看协议)
CRC16: 0xB8E0
你看,就这么简单。主机问“你pH值是多少?”,从机答“是7.12”。
2.4 总结一下
这一节咱们讲了Modbus RTU和TCP的区别,RS-485和以太网的物理特性,还有主从架构的玩法。说白了,Modbus就是个“老板问,员工答”的简单协议。但越简单的东西,越要注重细节。接线、地址、校验,哪一步出问题,通信都搞不定。
下一节,咱们会深入Modbus的功能码和数据模型,看看怎么用代码实现这些通信。到时候,我会带着大家手写一个Modbus RTU的驱动,保证让你彻底搞明白。