通信协议基础: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硬扛,后期维护会让你崩溃。
四、知识体系结构图
下面这张图,是我自己总结的通信协议知识体系。你把它存下来,以后做方案设计时对照着看。
好了,这一节的内容就到这里。通信协议这块,说白了就是「选对工具干对活」。Modbus和DNP3各有各的适用场景,没有绝对的好坏。关键是你得清楚自己的需求是什么。
下一节,我们会深入讲讲数据采集系统的硬件设计。到时候我会分享一些实际项目中的选型经验和踩坑记录。
公众号:蓝海资料掘金营,微信deep3321