第二章 系统集成基础:接口协议、数据格式与通信方式

各位同学,大家好。我是老张,在储能系统集成这行摸爬滚打了十来年。今天咱们聊点实在的——系统集成的基础。说白了,就是让不同厂家的设备能“说上话”,能“听懂对方的意思”。

你想想看,一个储能电站里,有PCS、BMS、EMS、空调、消防……这些设备来自天南海北的供应商。怎么让它们协同工作?靠的就是接口协议、数据格式和通信方式。这三样东西,是系统集成的“三驾马车”。

核心观点:系统集成的本质,就是解决“异构系统间的信息孤岛”问题。协议是语言,格式是语法,通信方式是传输通道。

系统集成基础 接口协议 Modbus / IEC 104 / MQTT 数据格式 JSON / XML 通信方式 串口 / 以太网 / 无线 三者缺一不可,共同构成系统集成的技术底座

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的电池数据。

  1. 通信方式: RS-485总线(BMS和EMS在同一机柜内)。
  2. 接口协议: Modbus RTU(BMS作为从站,EMS作为主站)。
  3. 数据格式: Modbus寄存器中的原始二进制数据(16位整数)。

再比如:

场景: 储能云平台需要接收电站的实时数据。

  1. 通信方式: 4G无线网络(电站偏远,没有光纤)。
  2. 接口协议: MQTT(轻量、支持断线重连)。
  3. 数据格式: JSON(便于解析和存储)。

我的习惯: 在项目设计阶段,我会先画一张“通信架构图”,把每个设备用什么协议、什么格式、什么方式都标清楚。这张图就是后续开发的“宪法”。

好了,这一章的内容就到这里。记住:协议、格式、方式,是系统集成的“铁三角”。理解透了,后面的实战才能游刃有余。


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