第二章 系统集成基础:接口协议、数据格式与通信方式
各位同学,大家好。我是老张,在储能系统集成这行摸爬滚打了十来年。今天咱们聊点实在的——系统集成的基础。说白了,就是让不同厂家的设备能“说上话”,能“听懂对方的意思”。
你想想看,一个储能电站里,有PCS、BMS、EMS、空调、消防……这些设备来自天南海北的供应商。怎么让它们协同工作?靠的就是接口协议、数据格式和通信方式。这三样东西,是系统集成的“三驾马车”。
核心观点:系统集成的本质,就是解决“异构系统间的信息孤岛”问题。协议是语言,格式是语法,通信方式是传输通道。
2.1 接口协议:设备间的“共同语言”
接口协议,就是设备之间沟通的“规矩”。没有规矩,不成方圆。我见过太多项目,因为协议不匹配,调试阶段搞得鸡飞狗跳。
2.1.1 Modbus 协议
Modbus 是工业领域的老大哥,1979年就诞生了。它简单、可靠,至今仍是储能系统里最常用的协议之一。
Modbus 有两种主要变体:
- Modbus RTU: 基于串口通信(RS-232/RS-485),数据以二进制形式传输。效率高,但距离有限(一般不超过1200米)。
- Modbus TCP: 基于以太网,数据封装在TCP/IP包里。速度快,距离远,适合大规模组网。
我的经验: 在储能项目中,BMS和PCS之间的通信,我习惯用Modbus RTU。原因很简单——抗干扰能力强。有一次在西北某光伏储能项目,现场电磁环境恶劣,Modbus TCP频繁掉线,换成RTU后稳如老狗。
Modbus 数据模型:
| 对象类型 | 访问方式 | 典型用途 |
|---|---|---|
| 线圈(Coil) | 读写 | 开关控制(如断路器分合) |
| 离散输入(Discrete Input) | 只读 | 状态检测(如门禁状态) |
| 输入寄存器(Input Register) | 只读 | 模拟量采集(如温度、电压) |
| 保持寄存器(Holding Register) | 读写 | 参数设置(如充放电功率) |
// Modbus RTU 读取保持寄存器示例(C语言伪代码)
uint16_t read_holding_register(uint8_t slave_id, uint16_t reg_addr) {
uint8_t request[8] = {0};
request[0] = slave_id; // 从站地址
request[1] = 0x03; // 功能码:读取保持寄存器
request[2] = (reg_addr >> 8) & 0xFF; // 寄存器地址高字节
request[3] = reg_addr & 0xFF; // 寄存器地址低字节
request[4] = 0x00; // 读取数量高字节
request[5] = 0x01; // 读取数量低字节(读取1个寄存器)
// 计算CRC校验
uint16_t crc = calculate_modbus_crc(request, 6);
request[6] = crc & 0xFF;
request[7] = (crc >> 8) & 0xFF;
// 发送请求并接收响应...
// 解析响应数据...
}
2.1.2 IEC 104 协议
IEC 104 是电力系统的“官话”。它源自IEC 60870-5-104标准,主要用于电网调度和变电站自动化。在储能领域,当储能系统需要与电网调度中心(SCADA/EMS)对接时,IEC 104几乎是标配。
IEC 104 的特点:
- 面向连接: 基于TCP/IP,客户端-服务器模式。
- 遥测、遥信、遥控、遥调: 四遥功能齐全。
- 自带时间标签: 支持SOE(事件顺序记录),精度可达毫秒级。
注意: IEC 104 的ASDU(应用服务数据单元)结构比较复杂。我曾经在调试时,因为一个字节的“传送原因”填错,导致调度端死活不认数据。排查了整整两天……嗯,从那以后,我每次都会用协议分析仪抓包对比。
2.1.3 MQTT 协议
MQTT 是物联网时代的“新贵”。它轻量、发布/订阅模式、支持QoS(服务质量等级)。在储能云平台、远程运维场景中,MQTT越来越流行。
MQTT 的核心概念:
- Broker(代理): 消息中转站,负责接收和分发消息。
- Topic(主题): 消息的分类标签,如
energy/storage/battery/voltage。 - QoS(服务质量): 0(最多一次)、1(至少一次)、2(恰好一次)。
// MQTT 发布消息示例(Python + paho-mqtt)
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("broker.example.com", 1883, 60)
# 发布电池电压数据
payload = '{"voltage": 48.5, "unit": "V", "timestamp": 1700000000}'
client.publish("energy/storage/battery/voltage", payload, qos=1)
client.disconnect()
我的建议: 在储能项目中,如果数据需要上云,优先考虑MQTT。它比Modbus TCP更省带宽,而且支持断线重连。但要注意,MQTT本身不保证数据顺序,如果业务要求严格时序,需要自己加序列号。
2.2 数据格式:信息的“包装方式”
协议决定了怎么传输,数据格式决定了传输的内容长什么样。就好比写信,协议是邮局,数据格式是信纸上的文字。
2.2.1 JSON
JSON(JavaScript Object Notation)是目前最流行的数据交换格式。它轻量、易读、支持嵌套结构。
{
"device_id": "BMS-001",
"timestamp": 1700000000,
"data": {
"total_voltage": 768.5,
"total_current": 120.3,
"soc": 85.2,
"soh": 97.8,
"cells": [
{"id": 1, "voltage": 3.201},
{"id": 2, "voltage": 3.198},
{"id": 3, "voltage": 3.205}
]
}
}
JSON 的优点:
- 人类可读性强,调试方便。
- 几乎所有编程语言都支持。
- 支持数组和嵌套对象,表达能力强。
避坑指南: JSON 没有数据类型约束。我曾经遇到一个坑——某设备上报的SOC字段,有时是数字(85.2),有时是字符串("85.2")。解析端没做类型校验,直接导致计算错误。所以,一定要在接口文档里明确字段类型,并在代码里做防御性校验。
2.2.2 XML
XML(可扩展标记语言)是“老前辈”了。它比JSON更严谨,支持命名空间、Schema校验,但也更冗长。
<?xml version="1.0" encoding="UTF-8"?>
<DeviceData>
<DeviceID>BMS-001</DeviceID>
<Timestamp>1700000000</Timestamp>
<Measurements>
<TotalVoltage unit="V">768.5</TotalVoltage>
<TotalCurrent unit="A">120.3</TotalCurrent>
<SOC unit="%">85.2</SOC>
</Measurements>
</DeviceData>
XML 的适用场景:
- 需要严格数据校验的场景(如电力行业标准协议)。
- 需要携带元数据(如单位、精度)的场景。
- 与老旧系统对接时(很多SCADA系统只认XML)。
我的选择: 新项目我基本都用JSON。XML太啰嗦了,同样的数据量,XML比JSON大30%-50%。但在电力调度领域,XML仍然是主流,因为IEC 61850等标准强制要求。
2.3 通信方式:数据的“运输通道”
通信方式决定了数据怎么从A点到达B点。在储能系统里,常见的通信方式有三种。
2.3.1 串口通信(RS-232 / RS-485)
串口通信是工业界的“老兵”。RS-232点对点,RS-485支持多站(最多32个节点)。
- 优点: 简单、可靠、成本低。
- 缺点: 速度慢(一般115200bps以下)、距离有限。
- 典型应用: BMS与PCS之间的短距离通信。
2.3.2 以太网通信
以太网是当前的主流。从百兆到千兆,从铜缆到光纤,选择多样。
- 优点: 速度快(100Mbps起步)、距离远(光纤可达几十公里)。
- 缺点: 设备成本高、配置复杂(IP、子网掩码、网关)。
- 典型应用: 储能电站内部局域网、与调度中心的通信。
2.3.3 无线通信
无线通信是“灵活派”。4G/5G、Wi-Fi、LoRa、ZigBee……各有千秋。
- 4G/5G: 适合远程运维、云平台接入。覆盖广,但有流量费用。
- Wi-Fi: 适合站内无线监控。成本低,但稳定性不如有线。
- LoRa: 适合低功耗、远距离、小数据量的场景(如温湿度传感器)。
实战建议: 在储能系统里,核心控制链路(BMS↔PCS↔EMS)我强烈建议用有线通信(RS-485或以太网)。无线可以作为辅助监控通道,但千万别把命脉交给无线——我见过一个项目,Wi-Fi干扰导致PCS误动作,差点烧了电池。
2.4 三者如何协同工作?
协议、格式、方式,不是孤立存在的。它们需要搭配使用。举个例子:
场景: 储能EMS需要读取BMS的电池数据。
- 通信方式: RS-485总线(BMS和EMS在同一机柜内)。
- 接口协议: Modbus RTU(BMS作为从站,EMS作为主站)。
- 数据格式: Modbus寄存器中的原始二进制数据(16位整数)。
再比如:
场景: 储能云平台需要接收电站的实时数据。
- 通信方式: 4G无线网络(电站偏远,没有光纤)。
- 接口协议: MQTT(轻量、支持断线重连)。
- 数据格式: JSON(便于解析和存储)。
我的习惯: 在项目设计阶段,我会先画一张“通信架构图”,把每个设备用什么协议、什么格式、什么方式都标清楚。这张图就是后续开发的“宪法”。
好了,这一章的内容就到这里。记住:协议、格式、方式,是系统集成的“铁三角”。理解透了,后面的实战才能游刃有余。
公众号:蓝海资料掘金营,微信deep3321