通信协议基础: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 0A00 14 就是两个寄存器的值,换算成十进制分别是10和20。

我的经验:刚开始学Modbus时,我总记不住地址范围。后来我总结了个口诀:「线圈0开头,离散1开头,输入3开头,保持4开头」。你记不住没关系,查表就行。但CRC校验一定要会算,很多通信问题都是CRC算错了。

5. 知识体系总览

下面这张图,是我自己画的。它把今天讲的内容串起来了。你保存好,以后做项目时拿出来对照。

EMS通信协议知识体系 物理层:RS232 / RS485 数据链路层:Modbus RTU / ASCII 网络层+传输层:TCP/IP协议栈 应用层:Modbus TCP / 数据采集 OSI七层模型(参考框架) 实际工业现场:串口→Modbus→TCP/IP→应用

你看这张图,从上到下就是数据从应用层一路走到物理层的过程。反过来,从下到上就是设备收到数据后一层层解析的过程。

避坑指南:我曾经在调试一个Modbus RTU设备时,发现数据偶尔会错。查了半天,最后发现是RS485的终端电阻没加。记住:长距离RS485通信,两端一定要加120欧姆终端电阻。不加的话,信号反射会导致数据错乱。

好了,今天的内容就到这里。通信协议这块,说白了就是「约定」。大家约好用同样的方式说话,设备就能听懂。你先把OSI模型、TCP/IP、串口、Modbus这四块吃透,后面讲具体采集实战时,你会觉得特别顺。

专注资料整理