通信协议基础:OSI七层模型、TCP/IP协议栈、串口通信与Modbus入门
各位同学,咱们今天聊点实在的。
做EMS系统,说白了就是跟设备打交道。设备怎么跟你说话?靠的就是通信协议。我干了十几年工业物联网,见过太多项目死在「协议不通」这个坎上。今天我把这块硬骨头掰碎了讲给你听。
1. OSI七层模型:通信界的「通用语言」
先问个问题:两台设备怎么才能互相理解?
你想想看,一个传感器是德国造的,PLC是日本的,上位机是国产的。它们硬件不同、软件不同、电压不同。怎么聊?
OSI七层模型就是来解决这个问题的。它把通信过程拆成七层,每层只管自己的事。
| 层级 | 名称 | 一句话解释 |
|---|---|---|
| 第7层 | 应用层 | 你看到的界面、数据格式 |
| 第6层 | 表示层 | 数据加密、压缩、翻译 |
| 第5层 | 会话层 | 建立、管理、断开连接 |
| 第4层 | 传输层 | 保证数据完整到达 |
| 第3层 | 网络层 | 找路、路由选择 |
| 第2层 | 数据链路层 | 帧封装、差错检测 |
| 第1层 | 物理层 | 电压、线缆、接口 |
我的经验:实际做项目时,你根本不需要背这七层。但你要知道——问题出在哪一层,就找哪一层的原因。我曾经有个项目,Modbus报文死活收不到,折腾了两天。最后发现是物理层的RS485线接反了。嗯,就是这么低级。
2. TCP/IP协议栈:工业互联网的「高速公路」
OSI七层模型太理想化了。实际工业场景里,大家用的都是TCP/IP协议栈。它只有四层,更实用。
- 应用层:HTTP、MQTT、Modbus TCP 都在这一层
- 传输层:TCP(可靠)和 UDP(快速)
- 网络层:IP协议,负责寻址
- 网络接口层:网卡、驱动程序
我个人习惯把TCP/IP理解成「寄快递」:
- 应用层:你要寄的东西(数据)
- 传输层:快递单号(TCP保证不丢件)
- 网络层:地址填写(IP地址)
- 网络接口层:快递员开车送(物理传输)
避坑指南:我曾经在项目里用UDP传关键数据,结果丢包了。后来老老实实改成TCP。记住:工业现场,可靠性永远第一。除非你对实时性要求极高且能容忍丢包,否则别碰UDP。
3. 串口通信:RS232 vs RS485
聊完网络,咱们接地气一点。串口通信在工业现场太常见了。你随便打开一个电表、变频器、PLC,背后大概率是RS485接口。
| 特性 | RS232 | RS485 |
|---|---|---|
| 传输距离 | 约15米 | 可达1200米 |
| 通信方式 | 点对点 | 多点(最多256个节点) |
| 信号线 | 3根(TX、RX、GND) | 2根(A、B差分) |
| 抗干扰 | 弱 | 强(差分信号) |
| 典型应用 | 调试口、短距离 | 工业总线、远程采集 |
为什么RS485在工业里这么火?说白了就两点:距离远、抗干扰强。你想想看,一个工厂几百米长,用RS232早就不行了。RS485用差分信号传输,两根线绞在一起,噪声互相抵消。这个设计很巧妙。
注意:RS485虽然能挂多个设备,但同一时刻只能有一个设备发送数据。这就是为什么Modbus要用「主从模式」——主机问,从机答。谁先说话谁就乱套了。
4. Modbus协议入门:工业界的「普通话」
好了,物理层搞定了,线也接好了。现在设备之间怎么「说话」?
Modbus就是那个「普通话」。它诞生于1979年,到现在还在用。为什么?因为简单、开放、够用。
4.1 Modbus的两种传输方式
- Modbus RTU:二进制传输,效率高。工业现场90%都在用这个。
- Modbus ASCII:文本传输,可读性好。调试时偶尔用。
我个人几乎只用RTU。ASCII太浪费带宽了,同样的数据量,RTU能快一倍。
4.2 Modbus的四种数据类型
| 类型 | 范围 | 读写 | 典型用途 |
|---|---|---|---|
| 线圈(Coil) | 00001-09999 | 读写 | 开关、继电器 |
| 离散输入(Discrete Input) | 10001-19999 | 只读 | 按钮、传感器状态 |
| 输入寄存器(Input Register) | 30001-39999 | 只读 | 模拟量输入、温度值 |
| 保持寄存器(Holding Register) | 40001-49999 | 读写 | 设定值、累计量 |
4.3 一个完整的Modbus RTU报文
举个例子:读取从机地址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校验(保证数据没错)
从机回复里,00 0A 和 00 14 就是两个寄存器的值,换算成十进制分别是10和20。
我的经验:刚开始学Modbus时,我总记不住地址范围。后来我总结了个口诀:「线圈0开头,离散1开头,输入3开头,保持4开头」。你记不住没关系,查表就行。但CRC校验一定要会算,很多通信问题都是CRC算错了。
5. 知识体系总览
下面这张图,是我自己画的。它把今天讲的内容串起来了。你保存好,以后做项目时拿出来对照。
你看这张图,从上到下就是数据从应用层一路走到物理层的过程。反过来,从下到上就是设备收到数据后一层层解析的过程。
避坑指南:我曾经在调试一个Modbus RTU设备时,发现数据偶尔会错。查了半天,最后发现是RS485的终端电阻没加。记住:长距离RS485通信,两端一定要加120欧姆终端电阻。不加的话,信号反射会导致数据错乱。
好了,今天的内容就到这里。通信协议这块,说白了就是「约定」。大家约好用同样的方式说话,设备就能听懂。你先把OSI模型、TCP/IP、串口、Modbus这四块吃透,后面讲具体采集实战时,你会觉得特别顺。