3、系统架构设计:物理层、信息层、应用层的分层架构与接口标准
做综合能源系统,我最怕一上来就谈「大而全」。你想想看,一个系统里既有光伏、又有储能、还有冷热联供,数据流从传感器一路跑到云端调度中心,如果架构没理清楚,后期维护就是一场噩梦。
我个人习惯,先把系统拆成三层:物理层、信息层、应用层。这三层各管各的事,中间用标准接口对话。说白了,就像盖楼——地基、框架、装修,每一层都有它的规矩。
3.1 物理层:设备与硬件的「硬骨头」
物理层是系统的最底层,也是我踩坑最多的地方。它包括所有一次设备:光伏板、风机、储能电池、充电桩、冷热机组、管道阀门……嗯,还有那些藏在柜子里的控制器和传感器。
核心任务:把能量转换好,把数据采集准。
我在项目中遇到过一个问题:某个光伏电站的逆变器通讯协议是私有Modbus,而能量管理系统只认IEC 61850。结果呢?数据死活读不上来。后来加了一个协议转换网关才搞定。
物理层的关键接口标准:
| 接口类型 | 典型协议 | 适用场景 |
|---|---|---|
| 串行通讯 | RS-485 / Modbus RTU | 电表、传感器、就地控制器 |
| 以太网通讯 | Modbus TCP / IEC 61850 | 逆变器、储能PCS、站控层 |
| 无线通讯 | LoRa / 4G / NB-IoT | 分散式设备、远程监测点 |
| 现场总线 | CAN / Profibus | 储能BMS、车辆充电接口 |
你可能会问:「这么多协议,怎么选?」我的建议是:能走以太网就别走串口,能走标准协议就别用私有协议。实在避不开私有协议,记得留好协议转换的硬件接口。
3.2 信息层:数据流动的「高速公路」
信息层是系统的神经中枢。它负责把物理层采集到的数据,清洗、存储、转发给应用层。说白了,就是让数据在正确的时间,到达正确的地方。
信息层的三大组件:
- 数据采集与边缘计算:RTU、边缘网关,负责协议解析、数据预处理、断点续传
- 数据总线与消息队列:Kafka、RabbitMQ、MQTT Broker,负责高并发数据流转
- 数据存储:时序数据库(InfluxDB、TDengine)+ 关系数据库(PostgreSQL)
我记得有一次做园区级综合能源项目,数据量一上来,Kafka的Topic设计不合理,导致消费者组频繁重平衡。后来重新设计了分区策略,才稳定下来。这里有个小技巧:按设备类型分Topic,按区域分Partition。
• 数据上报:MQTT v5.0(支持遗嘱消息、保留消息)
• 实时流处理:Kafka + Flink
• 历史数据查询:RESTful API + JSON格式
• 配置下发:gRPC(双向流,低延迟)
信息层还有一个容易被忽视的点:数据质量。我曾经遇到过传感器漂移导致数据异常,应用层直接误判为设备故障。后来在信息层加了数据清洗规则——比如电压突变超过20%就标记为可疑数据,不直接上报。
3.3 应用层:业务逻辑的「大脑」
应用层是用户直接打交道的部分。它不关心底层是Modbus还是MQTT,只关心业务能不能跑通。
应用层的典型功能模块:
- 能量管理:负荷预测、发电预测、经济调度
- 运维管理:设备状态监测、告警管理、工单派发
- 交易结算:碳交易、需求响应、电费结算
- 可视化大屏:实时数据看板、历史趋势分析
应用层与信息层的接口,我习惯用微服务架构。每个功能模块独立部署,通过API Gateway统一对外暴露接口。这样做的好处是:某个模块挂了,不影响其他模块。
3.4 三层架构的协同与接口标准
三层架构不是孤立的。它们之间通过标准接口协同工作。我画了一张图,帮你理解这个关系:
从这张图你能看到:数据从物理层向上流,指令从应用层向下流。每一层的接口标准不同,但必须保证互操作性。
接口标准选型建议:
- 物理层→信息层:优先MQTT(轻量、支持QoS),次选Modbus TCP(成熟、稳定)
- 信息层→应用层:优先RESTful API(通用、易调试),实时场景用WebSocket
- 跨层配置下发:用gRPC(双向流、强类型)
site/device_type/device_id/data_type。建议你在项目一开始就定好命名规则。
3.5 接口标准实战:一个数据上报的例子
光说不练假把式。我拿一个光伏逆变器数据上报的场景,给你看看三层之间怎么配合。
物理层:逆变器通过Modbus TCP,每5秒上报一次数据,包括电压、电流、功率、温度。
// 物理层数据格式(Modbus寄存器值)
{
"device_id": "PV_INV_001",
"timestamp": 1710000000,
"registers": {
"voltage": 380.5, // 寄存器地址 0x100
"current": 120.3, // 寄存器地址 0x101
"power": 45.7, // 寄存器地址 0x102
"temp": 35.2 // 寄存器地址 0x103
}
}
信息层:边缘网关收到Modbus数据后,解析成JSON,通过MQTT上报到Kafka。
// 信息层MQTT消息(Topic: site/solar/pv_inv_001/telemetry)
{
"device_id": "PV_INV_001",
"ts": 1710000000,
"voltage": 380.5,
"current": 120.3,
"power": 45.7,
"temp": 35.2,
"quality": 1 // 0=无效, 1=有效
}
应用层:能量管理服务通过RESTful API查询最近1小时的数据,用于负荷预测。
GET /api/v1/telemetry?device_id=PV_INV_001&start=1709996400&end=1710000000
Response:
{
"device_id": "PV_INV_001",
"data": [
{"ts": 1709996400, "power": 45.7},
{"ts": 1709996405, "power": 46.1},
...
]
}
你看,三层各司其职,接口清晰。物理层只管采集和上报,信息层只管转发和存储,应用层只管查询和计算。谁都不越界,出了问题也好排查。
• 物理层:统一协议,预留转换接口
• 信息层:高可用、可扩展、数据质量可控
• 应用层:微服务化、接口幂等、松耦合
• 跨层:命名规范统一,接口文档先行
嗯,架构设计这块,说白了就是「分而治之」。把大系统拆成小模块,每个模块只做一件事,做好一件事。这样后期不管是扩容还是维护,你都会感谢当初的自己。