通信协议基础:OSI七层模型与TCP/IP四层模型、Modbus协议原理与报文结构、DNP3协议特点与应用场景

各位同学,今天我们来聊聊通信协议。说实话,做微电网通信这些年,我见过太多因为协议选型不当导致的坑。有的项目,Modbus轮询周期太长,数据还没读完,现场已经跳闸了。还有的项目,DNP3配置得过于复杂,一个点表搞了三个月还没对完。

所以,这一节我们不讲虚的。直接上干货:OSI模型、TCP/IP模型、Modbus、DNP3。这些都是微电网通信的基石。

一、OSI七层模型与TCP/IP四层模型

先问大家一个问题:两台设备之间,数据是怎么传过去的?

你可能会说,不就是网线一连,IP一配,就通了吗?

嗯,表面上看是这样。但实际传输过程中,数据要经过层层封装和解封装。这就是分层模型存在的意义。

1. OSI七层模型

OSI模型,全称开放系统互连参考模型。它把通信过程分成七层:

层级 名称 核心功能 微电网中的例子
7 应用层 用户接口、应用协议 Modbus、DNP3、IEC 61850
6 表示层 数据格式转换、加密 ASN.1编码、TLS加密
5 会话层 建立、管理、终止会话 TCP连接建立
4 传输层 端到端可靠传输 TCP/UDP端口
3 网络层 路由选择、寻址 IP地址、子网划分
2 数据链路层 帧封装、差错检测 以太网MAC地址
1 物理层 比特流传输、电气特性 RS-485、以太网PHY

我个人习惯,把这七层记成一句话:「物链网传会表应」。你想想看,数据从应用层下来,每经过一层,就加一个头。到了物理层,变成比特流发出去。接收端再一层层拆开。

关键点:OSI模型是理论参考,实际工程中很少完全照搬。但它教会我们一件事——分层解耦。每一层只关心自己的事,不越界。

2. TCP/IP四层模型

TCP/IP模型,说白了就是OSI的简化版。它把七层合并成了四层:

  • 应用层:对应OSI的5、6、7层。HTTP、FTP、Modbus TCP、DNP3都在这一层。
  • 传输层:对应OSI的第4层。TCP提供可靠连接,UDP提供快速传输。
  • 网络层:对应OSI的第3层。IP协议负责寻址和路由。
  • 网络接口层:对应OSI的1、2层。以太网、Wi-Fi都在这里。

我在项目中遇到过一个问题:用Modbus TCP采集逆变器数据,偶尔会出现丢包。排查了半天,发现是传输层用了UDP。换成TCP后,问题解决了。所以,选协议时一定要搞清楚传输层用的是TCP还是UDP。

我的建议:微电网内部通信,优先用TCP。实时性要求极高的保护信号,可以考虑UDP+应用层重传机制。

二、Modbus协议原理与报文结构

Modbus,这可能是工业通信领域最「长寿」的协议了。1979年诞生,到现在还在大量使用。为什么?因为它简单、可靠、开放。

1. Modbus的两种传输模式

模式 数据编码 校验方式 典型应用
RTU 二进制 CRC-16 RS-485串口通信
ASCII 十六进制字符 LRC 调试、低速链路
TCP 二进制 无(依赖TCP校验) 以太网通信

实际项目中,RTU模式用得最多。ASCII模式我几乎没用过,除了早期调试时为了看报文方便。

2. Modbus RTU报文结构

一个标准的Modbus RTU报文,长这样:

| 地址码 (1字节) | 功能码 (1字节) | 数据区 (N字节) | CRC校验 (2字节) |

举个例子,读取从站地址为1的设备的保持寄存器,起始地址0x0000,读取2个寄存器:

请求报文:01 03 00 00 00 02 C4 0B
响应报文:01 03 04 00 0A 00 14 7A 9E

我来拆解一下:

  • 01:从站地址,表示设备1
  • 03:功能码,读取保持寄存器
  • 00 00:起始地址,从0x0000开始
  • 00 02:读取2个寄存器
  • C4 0B:CRC校验

响应报文里,04表示数据长度4字节,00 0A是第一个寄存器的值(10),00 14是第二个寄存器的值(20)。

避坑指南:我曾经在项目里遇到过CRC计算错误的问题。原因是单片机用的CRC算法和Modbus标准不一致。Modbus用的是CRC-16/MODBUS,不是普通的CRC-16/IBM。这两个多项式一样,但初始值和输出处理不同。切记!

3. Modbus TCP报文结构

Modbus TCP去掉了CRC校验,加了一个MBAP头:

| MBAP头 (7字节) | 功能码 (1字节) | 数据区 (N字节) |

MBAP头包含:事务标识符(2字节)、协议标识符(2字节,固定为0x0000)、数据长度(2字节)、单元标识符(1字节)。

同样的读取操作,Modbus TCP报文:

00 01 00 00 00 06 01 03 00 00 00 02

注意看,00 06表示后面数据长度是6字节(单元标识符+功能码+数据区)。

三、DNP3协议特点与应用场景

DNP3,全称分布式网络协议。它比Modbus复杂得多,但功能也强大得多。在电力行业,尤其是变电站自动化、微电网控制中,DNP3是主流协议之一。

1. DNP3的核心特点

  • 事件驱动:不是轮询,而是设备主动上报变化。这大大减少了网络流量。
  • 时间戳:每个数据点都带精确时间戳,便于事后分析。
  • 多主站支持:一个从站可以同时和多个主站通信。
  • 安全认证:支持SAv5安全认证,防止恶意攻击。
  • 数据分片:大数据包可以分片传输,适合低速链路。

关键区别:Modbus是「你问我答」,DNP3是「有事说事」。在微电网中,如果设备数量多、数据变化频繁,DNP3的优势非常明显。

2. DNP3的报文结构

DNP3的报文结构比Modbus复杂,分为三层:

| 传输层头 | 数据链路层头 | 应用层头 | 应用数据 |

一个典型的DNP3请求报文(读取AI点):

05 64 0C C0 01 00 00 00 01 00 00 00 C4 01 00 00 00 01

我来简单解释:

  • 05 64:数据链路层起始字节和长度
  • 0C C0:控制字节,表示主站请求
  • 01 00 00 00:目的地址(从站地址1)
  • 01 00 00 00:源地址(主站地址1)
  • C4 01:应用层头,功能码0x01(读取)
  • 00 00 00 01:对象头和变体

说实话,DNP3的报文解析比Modbus麻烦很多。我建议直接用现成的协议栈,比如opendnp3,别自己从头写。

3. DNP3在微电网中的应用场景

场景 推荐协议 原因
光伏逆变器数据采集 Modbus RTU/TCP 逆变器普遍支持Modbus,简单够用
储能系统BMS通信 Modbus TCP 数据量大,TCP保证可靠性
微电网控制器与保护装置 DNP3 需要事件上报、时间戳、安全认证
并网点监测 DNP3 需要与调度中心对接,DNP3是电力行业标准

我的经验:如果微电网规模小(10个节点以内),Modbus完全够用。如果规模大、要求高,或者需要和上级调度系统对接,果断上DNP3。别为了省事用Modbus硬扛,后期维护会让你崩溃。

四、知识体系结构图

下面这张图,是我自己总结的通信协议知识体系。你把它存下来,以后做方案设计时对照着看。

微电网通信协议知识体系 OSI七层模型 理论参考,分层解耦 TCP/IP四层模型 工程实践,TCP/UDP选择 Modbus协议 简单可靠,轮询机制 DNP3协议 事件驱动,电力行业标准 微电网通信应用场景 光伏逆变器 Modbus RTU/TCP 储能BMS Modbus TCP 控制器与保护 DNP3 并网点监测 DNP3 核心原则:根据场景选协议,不盲目追求复杂,也不过度简化 小规模用Modbus,大规模用DNP3,TCP保证可靠性

好了,这一节的内容就到这里。通信协议这块,说白了就是「选对工具干对活」。Modbus和DNP3各有各的适用场景,没有绝对的好坏。关键是你得清楚自己的需求是什么。

下一节,我们会深入讲讲数据采集系统的硬件设计。到时候我会分享一些实际项目中的选型经验和踩坑记录。


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