基于MyEMS的产业园区光储充协同能源管理平台实践
2026/9/19 10:52:35 网站建设 项目流程

产业园区做能源管理,最让人头疼的往往不是某一个设备效率低,而是光伏、储能、充电桩各管各的:白天光伏大发时园区负荷上不去,白白浪费;晚上充电桩扎堆启动,又全压在电网上。去年我为一个典型制造型园区搭建了一套基于MyEMS的光储充协同与区域能源优化平台,才算把这些“散装士兵”统一调度了起来。这篇文章把这个项目从设计思路、平台选型、部署实施到调试排坑的完整过程整理出来,给准备做园区级能源网络的同学做个参考。项目规模不算大,但覆盖面足够广,包含约2MWp屋顶光伏、1MW/2MWh储能电站,以及分布在员工停车场和物流区的60台交流充电桩,整个控制逻辑围绕“光伏优先消纳、储能动态平移、充电有序接入”展开。

1. 为什么要在产业园区做“光储充协同”与区域能源优化

1.1 园区能源网络现状:设备孤岛与成本黑洞

大多数产业园区在早期建设时,光伏、储能、充电桩是分批次、分厂家招标的。光伏逆变器自带监控平台,储能PCS有厂家的EMS界面,充电桩运营方给一套SaaS后台,再加上原有的电力监控系统和能耗计量表计,园区能源管理人员每天要登录五六个平台,才能拼凑出“昨天发了多少电、充了多少电、变压器负载率多少”的模糊画面。

这种设备孤岛带来的直接后果就是成本失控。我见过一个园区,光伏逆变器限功率在80%,原因是担心周末负荷低导致逆流。储能系统却常年设置为“固定峰谷套利”模式,每天两充两放,完全不考虑当天是否下雨、实际负荷是否抬升。更麻烦的是60台充电桩没有任何有序调度,傍晚六点员工下班集中插枪,变压器负载率瞬间冲到90%以上,电压跌落明显,最后不得不报装增容,投资几十万。

所以做这个项目时,第一个目标不是“上线一个平台”,而是把分散的功率信息、状态信息、气象信息和电价信息汇聚到一个统一的能源网络模型里,让光伏、储能、充电桩不再各自为政,而是围绕园区的真实用电需求协同运行。这正是标题里“能源网络构建”的含义——不是拉物理线路,而是建立信息与控制的网络。

1.2 光储充协同到底在协同什么

很多人一听“光储充协同”,第一反应是“光伏发电给储能充电,储能再给充电桩放电”,这个理解太浅了。实际运行中,光储充三者之间存在三组关键矛盾需要协调。

第一组矛盾是光伏出力与负荷时序错配。光伏大发集中在10点到15点,但园区生产负荷和充电负荷高峰分别在上午9点和傍晚18点后,直接导致光伏消纳率低,多余电量只能低价上网。第二组矛盾是充电桩的随机性冲击。充电桩负荷是离散、波动的,一旦集中启动,会在分钟级造成变压器过载,储能如果不知道充电桩的动态功率,就只能在固定SOC区间盲目充放。第三组矛盾是电价信号与控制策略脱节。峰谷电价是政策给定的,但园区的实际可调资源容量、光伏预测出力、变压器余量每个时刻都在变,需要一套策略实时把“电价信号+预测数据+状态约束”转换成设备指令。

因此,协同的对象表面上是设备,实际上是能量流与时间轴之间的关系。光伏出力预测曲线、储能SOC包络、充电桩可调功率范围,三者必须放到同一个滚动优化框架中,每5到15分钟刷新一次控制指令,才算得上“协同”。

1.3 为什么选MyEMS作为能源中台

第一次接触MyEMS是在寻找开源能源管理平台的时候。它最吸引我的不是界面多漂亮,而是三个点。

第一,MyEMS已经内置了一套完整的基础能源管理模型,包括区域、计量表、采集器、能耗分项、分时计费、报表分析等,不用像纯自研那样从零写数据字典。第二,它是开源的,采集服务、数据库结构、API接口都可以自己改,后期要对接园区已有的水表、气表、冷热量表也很方便。第三,它提供RESTful API和Web界面,既能给运维人员实时监控,又能通过接口把策略结果下发给设备,适合做二次开发。

与商业EMS相比,MyEMS的曲线是“先扎扎实实把数据采全、存好、展示好”,控制策略的灵活性需要自己写代码。这反而更符合产业园区项目的实际需求——每个园区的变压器容量、光伏接入方式、储能PCS型号、充电桩协议都不相同,很难有一款商业软件开箱即用。MyEMS做底座,自己写协同控制服务,是性价比很高的一条路。

2. 园区能源网络的整体架构与核心模型设计

2.1 物理层与采集层设计

整个系统的物理层由四部分组成:屋顶光伏通过10kV/0.4kV变压器低压侧并网,储能系统采用户外柜,接入同一个低压母线,60台交流充电桩分布在三个独立回路,供电局关口表装在高压进线侧。

采集层是整个项目的地基。我的做法是尽量不走设备厂商的云平台,而是通过网关直接读取设备本地协议。光伏逆变器支持Modbus TCP,储能PCS支持Modbus RTU,充电桩使用OCPP 1.6协议,园区电力仪表通过RS485总线接到数据采集箱。再统一通过网络上传到MyEMS采集服务。

这一步有个重要经验:采集点位一定要留足,不能只采有功功率。我调试时发现储能PCS上报的SOC值刷新很慢,需要额外读取电池簇的电压、电流、温度告警量来交叉验证。光伏逆变器还要采集每台逆变器的直流侧电压和电流,用于判断组件是否被遮挡或老化。充电桩除了采集当前充电功率,还必须采集桩的状态(空闲、充电、故障)和充电开始时间,否则做有序充电控制时找不到可中断的桩。

2.2 平台层:MyEMS中的空间、设备与计量模型

MyEMS的数据组织核心是“空间树+计量表”。建点表时,我按照“园区-配电房-母线”的层级创建空间节点,然后在每个空间下挂对应的计量表。这个过程看似简单,但直接决定了后续报表和策略的准确性。

举个例子,光伏发电量应该挂在“配电房-光伏并网柜”这个计量点,储能充放电量要区分“充电电量”和“放电电量”两块,充电桩需要按三个回路分别建立计量表,同时还要建一块“充电桩总表”用于统计园区整体充电负荷。关口表则单独建在“园区高压进线”空间下。

为了给策略模块提供输入,我额外定义了一套虚拟计量表,比如“园区净负荷 = 总进线功率 - 光伏功率”,这个值不是直接用公式计算,而是通过MyEMS的API接口在自定义程序中算好后写入的。这样做的好处是策略模块不需要关心底层设备和表计细节,只用读取一组预先定义好的虚拟点即可。

2.3 策略层:协同调度目标与约束条件

协同调度不能上来就写代码,得先把目标和约束条件理顺。

这个项目的核心优化目标有三个:一是光伏消纳率最大化,希望光伏发电尽量被园区负荷和储能充电口吃掉,减少上网电量;二是园区综合用电成本最小化,考虑峰谷电价和需量电价,尽量在电价低谷时段给储能充电,在高峰时段放电;三是充电服务不打折,员工第二天要上班,充电桩不能因为调度导致用户充不满。

约束条件相对清楚:变压器最大需量限制、光伏逆变器输出上限、储能PCS额定功率和SOC安全边界、充电桩可调度回路数量、以及储能系统不能同时充放电等设备逻辑约束。

落到实际运行,我采用的是一种“预测-优化-执行”的循环:先用光伏预测模块算出未来24小时的光伏出力曲线,再结合园区历史负荷数据和充电桩预约情况估算基础负荷曲线,然后把电价序列、设备约束、SOC方程丢进一个线性规划模型,优化出每小时储能充放电功率和充电桩回路投切计划,最后将指令通过MyEMS下发到设备。

3. 光储充协同调度的核心逻辑与实施细节

3.1 光伏数据接入与短时预测

光伏数据接入相对容易,通过Modbus TCP采集每台逆变器的实时功率、日发电量、总发电量和停机告警,采集周期设为5秒,写入MyEMS的历史数据库。但仅仅采集实时功率是不够的,协同调度需要知道“未来一个时段内还能发多少电”。

我的做法是在MyEMS之外单独跑一个光伏预测服务,输入是天气预报中未来一小时的总辐照度预报、当地历史发电曲线以及当前实时功率。预测算法不需要太复杂,我用的是最直接的比例系数法:先根据光伏装机容量和当日辐照度预测值计算理论出力峰值,再利用最近三天的实际出力曲线修正云层影响系数,生成未来1小时内、时间分辨率为15分钟的预测曲线。

有个坑是逆变器限功率的影响。如果园区因为负荷限制,人为调度逆变器降载,那么采集到的历史出力数据本身是“被截断”的,直接用这样的数据训练预测模型会把系统预测值偏小。所以我会在数据采集层额外记录逆变器是否限功率以及限功率的设定值,预测时优先基于未限功率时段的数据进行修正。

3.2 储能充放电策略的边界条件

储能是协同的“缓冲池”,但也是最容易出问题的环节。储能PCS的本地EMS一般有自己的充放电计划,协调平台下发指令时,必须保证指令与设备安全保护逻辑不冲突。

在项目初始阶段,我直接通过Modbus寄存器写入充电功率值,结果发现运行几天后出现过一次功率波动。查日志发现,PCS在收到外部功率指令时,如果SOC已经很低,设备内部仍会自动抬高充电功率来保护电池,与指令值存在偏差。后来我在策略里加入了SOC边界动态修正:

  • 当SOC高于90%时,禁止下发继续充电指令,并逐步降低充电功率;
  • 当SOC低于20%时,禁止放电,且如果预测到未来高峰时需要放电,需要提前在低价时段预留充电空间;
  • 每次下发功率调整幅度不能超过PCS额定功率的30%,避免功率突变引起并网点电压波动。

储能控制周期我们设置为15分钟一次,但特殊情况下可以缩短到5分钟。比如午间光伏突然从30%负载率跳到80%负载率,这时如果还等15分钟,储能可能没有提前留出充电空间,白白浪费光伏。因此预测服务一旦发现光伏出力变化率超过阈值,会主动触发一次即时优化,重新计算储能和充电桩的指令。

3.3 充电桩有序充电与负荷约束

充电桩调度是这60台桩最大的差异点。60台桩分布在三个回路,每个回路有一个总开关,回路下驳接20台交流桩。如果做“有序充电”时直接控制单台桩的启停,通信压力会非常大,而且员工充电体验会很差。我最终选择的是“分组轮控+功率调节”的组合策略。

具体做法是,将60台桩分成三组,每组20台接入一个回路,在总进线处安装电能质量监测。平台通过区分配电房的负荷余量,决定每个回路允许同时充电的最大台数。当变压器负荷接近上限时,系统先暂停已经充满或充电时长超过6小时的桩,再按“先到先充、后到等待”的队列顺序控制剩余桩。

这套策略在前端展示上就是给充电桩加了一个“可调度状态”,员工扫码后如果系统判定当前负荷紧张,会在手机端提示“排队充电中”,而不是直接拒绝服务。对于已经接入的车辆,切换顺序时优先满足小功率车辆,把连续充电时间长的桩切出。实际运行下来,充电桩利用率没有下降,但峰值时段的变压器负载率下降了约12%。

3.4 区域级优化:从“单设备策略”到“园区总目标”

有了单个设备的控制逻辑之后,最后一步是把它整合成区域级优化。我写了一个调度服务,当作MyEMS的一个扩展组件来运行,按15分钟的周期执行一次。

调度服务的输入包括:关口表实时功率、光伏预测曲线、储能SOC、充电桩可调度容量、当前电价时段,输出为储能充放电功率和充电桩回路投切指令。目标函数简化之后是:在当前15分钟时段内,让“园区向电网购买的电量成本”最小,同时让“光伏上网电量”最少。

这里有一个被很多人忽视的小细节:区域能源优化的口径必须站在关口表看,不能只看单个设备。比如储能放电确实能减少园区从电网买电,但如果在放电的同时充电桩正好满负荷,变压器负载率仍然可能超过安全阈值。所以在优化模型里,我加了关口功率上限约束,通过关口表实时功率闭环修正每个回路的可接入容量,策略才真正生效。

4. 从零部署MyEMS到跑通协同控制的实操记录

4.1 环境准备与MyEMS容器化部署

我用的是Linux服务器,建议至少4核8G内存、100G磁盘,生产环境可以更高。部署时我没有用源码方式,而是采用docker compose编排。需要准备的镜像包括MyEMS数据库、管理后端、Web前端,以及采集服务。

docker-compose.yml的关键片段可以写为:

version: '3.8' services: myems-db: image: mysql:8.0 container_name: myems-db restart: always environment: MYSQL_ROOT_PASSWORD: "yourpassword" MYSQL_DATABASE: "myems" volumes: - /opt/myems/db:/var/lib/mysql ports: - "3306:3306" myems-api: image: myems/api:latest container_name: myems-api restart: always depends_on: - myems-db environment: - TZ=Asia/Shanghai ports: - "8000:8000" volumes: - ./myems-api/upload:/upload - ./myems-api/log:/var/log/myems myems-web: image: myems/web:latest container_name: myems-web restart: always depends_on: - myems-api ports: - "80:80"

这只是一个示意模板,不同版本镜像名和配置项会有差异。实际操作时建议先到MyEMS官方文档下载对应的部署包,把配置文件里的数据库地址、端口改成自己的环境。部署完成后,先通过浏览器打开Web界面,确认数据库初始化和登录正常。

4.2 配置Modbus设备接入与数据清洗

设备接入是工作量最大的环节。MyEMS默认提供myems-modbus-tcp采集服务,它可以按配置去读取Modbus TCP从站数据。配置核心文件时,需要写清楚每个设备对应的“从站地址、寄存器地址、点位名称、换算比例”。

以光伏逆变器为例,通常厂商都会提供Modbus点位表。假设某台逆变器的“实时功率”寄存器地址为0x0110,数据类型是32位无符号整数,那么采集服务配置大概是:

{ "devices": [ { "name": "PV-Inverter-01", "protocol": "modbus-tcp", "host": "192.168.10.11", "port": 502, "slave_id": 1, "points": [ { "name": "active_power", "register": 0x0110, "type": "uint32", "scale": 1 } ] } ] }

不同设备的寄存器地址差异很大,尤其是储能PCS,有的厂商把功率值放在保持寄存器,有的放在输入寄存器,有的采用16位补码,有的用32位浮点,稍不留神采集回来的数据就是乱码。我的习惯是先使用Modbus调试工具手动读一遍每个点位,确认数据类型和字节序后再填入配置文件。

数据清洗也不能忽略。Modbus通讯偶尔会出现超时或脏数据,采集层会把异常值原样存库,导致后续策略计算出错误指令。我在采集层加了一个简单的“速率过滤器”:实时功率如果与上一时刻相比突变了超过设备额定容量的50%,且在下一秒没有维持,就判定为异常数据,用上一有效值替代。

4.3 建立园区能源网络拓扑并配置采集器

在MyEMS的Web界面中,我们首先建立空间树。我的空间树层级是:园区总空间 > 一期配电房 > 0.4kV A/B段母线 > 各回路馈线。每个馈线空间下挂对应的计量表,例如“光伏并网柜”,电表类型选择“电度表”,并关联采集服务上报的数据库表。

这里有个操作细节:配置能源网络拓扑时,最好把每个计量点的名称和物理位置一起写在备注里。项目后期排查问题,如果只看到“active_power”这样的字段名,没人能分清是哪台设备。我用“PV_INV_01_ACTIVE_POWER”这种可读性强的命名规则,配合MyEMS里的标签功能,整个数据流清晰很多。

数据库层面,MyEMS内部会对每个计量表生成实时表和历史表。采集服务将收到的数据写入相应的实时点,Web前端每几秒刷新一次。为了减轻数据库压力,我关闭了一些不需要的秒级存储,仅保留分钟级历史,而策略需要的高频数据由采集服务通过Redis缓存临时保存。

4.4 下发协同策略的两种常用方式

控制指令下发是大家最关心也最容易卡住的一步。MyEMS本身侧重于监测和分析,直接通过标准功能去写储能PCS寄存器的场景不多,所以需要自己扩展。

我的实际做法有两种。一种是“直接Modbus写入”:写一个Python策略服务,读取MyEMS数据库中的预测和状态数据,计算得到储能功率值后,直接通过pymodbus库把数值写入储能PCS的功率寄存器。这种方式链路短,实时性好,但要注意写入时做好“功率斜坡限制”,防止设备报警。

另一种是“MQTT指令中转”:如果充电桩或者储能PCS已经接入了MQTT网关,策略服务把指令发布到对应的MQTT主题,由边缘网关转发给设备。这种方式适合设备协议碎片化、无法直接开Modbus写口的场景。我第一次调试充电桩时就是采用MQTT,在平台侧发出“A回路限制功率至20kW”的指令,网关收到后再转成厂家私有协议下发。

5. 项目落地中的常见问题与排查技巧

5.1 光伏发电功率数据跳变,怎么定位

遇到过光伏功率曲线出现毛刺,有时候0kW持续几十秒,然后又跳到400kW。排查时我先在MyEMS历史库里查看跳变时光伏并网柜的实时功率,再对比逆变器台账,发现是组串式逆变器的485总线松动,通讯中断后数据保持寄存器值为0,恢复通讯后又上传缓存功率。

这种通讯中断引起的跳变如果不处理,会让调度策略把光伏出力预测值低估,导致储能提前放电。解决方案是在采集层增加“心跳”字段,超过60秒未刷新数据的设备直接标记为离线,调度服务只使用在线且质量良好的设备数据。另外在项目现场巡检时,要把所有数据采集箱的接线端子重新压紧一次,这个动作比改代码有效得多。

5.2 储能SOC越界导致保护停机

接入储能的第一周,因为策略里把“低电价充电、高电价放电”逻辑写得过于激进,导致每天傍晚储能SOC降到5%左右才停止放电,触发了PCS的低压保护,整个储能系统退出运行,直到第二天运维人员手动重启。

这个问题在策略层面很容易改,只要把SOC下限从20%提到15%,同时增加“放电末期功率递减”的逻辑,就能避免保护停机。不过我想提醒的是,SOC本身就有误差,特别是磷酸铁锂电池在不同温度下SOC估算值会漂移。不能只依赖BMS上报的SOC,还要在充电桩和负荷高峰期关注电池簇电压。我在MyEMS里自定义了一个告警规则:当SOC低于18%且电池簇电压低于某个阈值时,提前释放“禁止放电”信号,给策略留出反应时间。

5.3 充电桩同时充电造成变压器过载

测试阶段有一天下午,三组充电桩同时爆发充电需求,A回路充电桩数量由2台涨到8台,变压器负载率瞬间超过100%,关口开关没有跳,但无功补偿装置开始报警。

回看策略日志,发现我的有序充电逻辑只在“当前时刻”检查了变压器负载率,但忽略了充电桩的启动时间。当系统判断变压器余量充足,允许A回路增加桩数时,B回路和C回路也同时发了新增指令,三路新增电流叠加后冲击过大。修复方式是在策略里增加“启动队列错峰时间”,每路之间的新增桩启动时间至少错开30秒,并且每次允许新增桩数不超过两台。投入运行后,再没有出现过瞬时过载。

5.4 区域优化指令下发不生效的问题

调试优化服务时,发现储能PCS收到了写入成功的响应,但实际功率没有变化。排查下来,问题出在PCS工作模式上。它默认处于“本地自动”模式,外部指令需要先把模式切换为“远方调度”,且需要同时写入“功率设定值”和“模式切换寄存器”,只写功率寄存器是不生效的。

这类问题在通信层往往没有报错,所以排查时不能只看“写操作返回成功”,还要在Web界面上关注设备是否切换到了远方模式。我给策略服务增加了回读校验:下发指令5秒后,重新读取PCS的运行模式和实际功率,如果偏差超过阈值,就再次下发,并记录告警。现在回想,接入任何储能PCS之前,先仔细看厂家的控制字定义文档,能省掉一大半调试时间。

多说一句,这类园区能源项目从来不是一次交付就完事。光伏组件的衰减、充电桩数量的增加、峰谷电价政策的调整,都会让协同策略的参数需要重新整定。我把这套系统的控制参数全部做成了MyEMS空间节点下的“配置标签”,每次调整都在平台上保留记录,这样运行半年后再回看时,能很清楚地知道哪些参数因为什么原因被改过。这种“能追溯”的小习惯,在后期运维中帮了大忙。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询