DIgSILENT PowerFactory 里做 BESS 充放电控制,再把风电和储能合到一个系统里做联合仿真,这件事听起来不算复杂,但真上手会发现坑不少。我最近刚完成一个风储联合并网仿真项目,规模不大——一台直驱永磁风机配一套 1MW/2MWh 的磷酸铁锂储能,目标是验证并网点功率平滑效果和一次调频能力。平台选了 DIgSILENT,一是因为它建模的图形化风格适合快速迭代控制逻辑,二是 RMS 稳定仿真和短路计算在同一工程里能无缝切换。这篇文章把我从建模到出结果的完整过程记录下来,包括电池模型怎么搭、充放电控制策略怎么写、参数怎么整定,以及初始化失败、功率震荡这类大概率会遇到的坑,希望给同样在 PowerFactory 里搞储能仿真的同行省点时间。
1. 项目思路拆解:风储联合到底要解决什么问题
1.1 风功率波动的本质与储能的定位
风电的出力波动是天然的,风速的变化直接映射到机械功率上,而风机变流器只能通过变桨和最大功率跟踪来缓解一部分。拿我项目里用的那台 1.5MW 直驱风机来说,实测数据里五分钟内功率波动可以到额定功率的 30%,这种波动对并网点电压和联络线潮流影响相当明显。
从电网角度看,两个指标最要命:一是并网点有功功率的短时变化率,另一个是特定时间窗口内的功率波动幅度。很多并网导则对这两个指标都有明确限值,比如 1 分钟内有功变化不宜超过装机容量的某个百分比。风电自己解决不了这个问题,光靠弃风又太浪费,所以储能就派上用场了:在功率上升时吸收多余能量,在功率跌落时补上缺口,本质上是给风电场加了一个缓冲水池。
储能的定位决定了控制策略的写法。如果只做平滑,那核心就是一个滤波算法加一个功率跟踪环路;如果还要参与一次调频,那就要在平滑的基础上叠加频率-有功下垂响应。这两种功能对 SOC 管理的需求不一样:平滑要求储能时刻保留足够的充放电裕度,而调频更关心响应速度和调节容量。项目前期一定要把这两个目标想清楚,否则后面的控制逻辑会越改越乱,最后变成参数之间互相打架。
1.2 为什么用 DIgSILENT PowerFactory
选平台这件事我纠结过一阵子,因为市场上有 PSS/E、PSASP、MATLAB/Simulink 搭配 Simscape Electrical 等选项。MATLAB 自由度最高,但建电网模型非常累;PSS/E 在潮流和稳定计算上很强,但控制环节的搭建不够直观;PSASP 在国网体系里常用,对外部研究者不太友好。我最终选了 DIgSILENT PowerFactory,主要看中三点。
第一,PowerFactory 是对象导向和数据库式的工程组织方式,风机、变压器、线路、储能、控制器都以对象形式存在于同一个工程里,改一个参数全局同步,不像脚本式工具那样到处找卡片。第二,它原生支持复合模型框架,可以把变流器控制、电池 SOC 计算、滤波逻辑都用框图搭出来,然后自动生成动态仿真模型,这一点对反复调控制器参数特别方便。第三,RMS 稳定仿真和潮流计算互相衔接,初始化在点下运行的瞬间自动完成,不用手工做初值。
当然 PowerFactory 也有它的学习门槛,尤其是 Composite Frame 和 DSL(DIgSILENT Simulation Language)这层概念,第一次接触容易懵。后面我会用实际案例把这一套逻辑讲清楚。
1.3 项目整体架构规划
动手前我先把整个系统画了个粗拓扑,这个习惯建议大家都保留。电网侧是一个 110kV 理想电源加等效短路阻抗,然后降一个 35kV 汇集母线,风电单元和储能系统分别通过各自的升压变接到 35kV 母线上。实际工程里储能可能会接在风电场内部 10kV 段,或者直接接在升压站低压侧,两种方案在 PowerFactory 里的差别不大,就是把连接点位置换一下。
控制层面分三层。最外层是系统级控制,包括平滑算法和调频逻辑,输出储能的有功/无功指令;中间层是储能换流器的功率跟踪控制,把指令变成电流环的参考值;最内层是电流环,决定最终注入电网的电流。在 PowerFactory 里,系统级控制用 DSL 写成 Common Model,换流器部分直接用 Static Generator 的控制器模板来配置。三层各管各的,这样调参的时候能分模块排查问题,不用整个模型从头查到尾。
在仿真层面,我先做稳态潮流验证模型接线和初始功率分配,然后做 RMS 动态仿真来看波动场景,最后如果有需要再做短路电流校核。这个项目里频率波动和功率平滑都需要毫秒到秒级的时间尺度,RMS 仿真足够,不需要上 EMT。
2. BESS 建模:从电池到并网接口
2.1 电池本体:先用等效电路,别一上来就追求电化学模型
在 PowerFactory 里建模电池,首要任务是决定模型精度。电化学模型(比如 P2D 模型那类)在系统仿真平台里很少用,因为参数太多、计算量太大,而且对系统级研究没有必要。绝大多数风储联合仿真用的都是等效电路模型:一个受 SOC 控制的开路电压源,串联内阻,再并联一个或者两个 RC 网络来模拟极化效应。
我用的是一阶 RC 等效电路,电压表达式可以写成:V_bat = E0(SOC) - I_bat * R0 - V_RC。其中 E0 随 SOC 变化,典型磷酸铁锂曲线的形状是 SOC 在 0.2 到 0.9 区间内电压平台较平,两端跌落较快;R0 取 0.2mΩ 到 1mΩ 这个量级,具体看电芯规格和并联数。RC 网络的时间常数一般几秒到几十秒,用来模拟电池的动态响应。
在 PowerFactory 里的实现方法,可以直接用 DSL 写一个电压源加状态方程的 Common Model,也可以偷懒一点:把电池的直流侧特性折算到交流侧,在变流器控制里直接限制有功指令,变流器模型内部自带直流电压机制。第一种更真实,第二种更快。我项目里两种都试过,如果你只研究并网点的功率控制,第二种完全够用;如果还要研究电池端电压、电流、SOC 动态,那就必须建模电池本身,没有捷径。
2.2 变流器与并网环节
变流器是储能和电网的接口。PWM 整流/逆变器在动态仿真里可以写成平均值模型,因为开关级的 PWM 动态对系统级研究没有意义。PowerFactory 里最常用的办法是直接用 Static Generator(ElmGenstat)来代表整个储能换流器,给定有功功率和无功功率,或者给定有功功率并控制无功电压。基本原理是:变流器在交流侧看起来像一个可控电流源,注入电网的功率跟随控制器输出。
当然,换流器不是直接并网的,中间还有滤波电抗器和升压变。滤波电抗可以用一个阻抗 Z_f 来表示,数值取决于载波频率和滤波要求,一般在 0.1 到 0.3pu 之间。升压变则直接用 Transformer 对象,低压侧接变流器,高压侧接汇集母线。
这里特别提醒一点:在 RMS 仿真里,Static Generator 的输出功率是基波正序功率,它不会体现谐波,也不会体现换流器的过流能力限制。如果你的研究涉及低电压穿越或者故障穿越,那必须用 EMT 仿真加详细的变流器模型,这个我后面在“常见问题”章节里再展开。
2.3 容量参数与 SOC 初值
BESS 的额定功率和容量直接决定仿真结果。项目里配置的是 1MW/2MWh,功率容量比是 0.5,也就是满功率充放可以持续 2 小时。这个配置在平滑场景下基本够用,但如果要持续参与调频,2 小时会显得紧张,需要把调频限幅和 SOC 保护结合起来做,不能指望着模型自己“消化”。
SOC 初值很关键。起点设成 0.5 是最稳妥的,给双向调节都留足空间。如果初值设得太高或太低,很容易在仿真一开始就触发 SOC 保护,然后看到一堆莫名其妙的功率跳变,此时第一个要怀疑的就是 SOC 初值。另外电池的充电和放电效率不一样,锂电一般充电效率 95% 左右,放电效率 98% 左右,在控制回路上要分开设置,否则长时间仿真下来 SOC 会出现缓慢漂移,影响长工况的结论可靠性。
3. 充放电控制策略的设计与实现
3.1 最基础也最常用的 PQ 控制
储能换流器最经典的控制就是 PQ 控制,外环给有功无功参考值,内环电流跟踪。在 PowerFactory 里 Static Generator 本身就支持设定有功和无功功率参考值,所以最朴素的做法就是直接填固定值。但实际风储联合需要的是动态指令,所以要把参考值改成外部信号,来自系统级控制器。
PQ 控制的本质是解耦,有功和无功各自独立控制,这样可以分别实现功率平滑和电压支持。有功环用 PI 控制器,输入是有功误差,输出是 d 轴电流参考;无功环类似,输出 q 轴电流参考。PI 参数整定可以用带宽法:电流内环带宽一般取 500Hz 到 1000Hz,p 取 L 乘以带宽,i 取 R 乘以带宽;功率外环带宽取 10Hz 左右,再往下一点,避免和内环交接频率重叠。
在实际项目中,我建议先只开 PQ 控制,让储能输出一个阶跃功率指令,观察跟踪速度和超调,把电流内环、功率外环分别调好,再做联合控制。这样可以避免“所有环节同时不对”时无从下手的问题,也便于后续在报告里单独说明每个环节的整定依据。
3.2 平滑风功率:低通滤波加 SOC 修正
风储平滑的核心算法其实很简单:对风电功率做一阶低通滤波,滤波后的值作为并网目标功率,储能补偿的功率就是目标功率减去实际风电功率,公式如下:
P_target = P_lpf,其中 P_lpf = P_wind / (1 + T*s);P_bess = P_target - P_wind
T 是滤波时间常数,一般取 60 到 300 秒。T 越大平滑效果越强,但需要的储能容量也越大。这个参数是平滑效果和容量需求之间的直接权衡,建议先用历史风速数据做离线扫参,确定合理的 T 值,再拿来做动态仿真,不要凭感觉拍脑袋。
直接套低通滤波有一个问题:SOC 不受约束,长时间运行会跑偏。解决办法是加 SOC 修正环节:当 SOC 高于某个阈值时,让 P_target 适当抬高一点,利用风电功率多出来的部分给电池放电;当 SOC 低于阈值时,让 P_target 降低一点,电池吸收功率充电。具体实现可以用一个 SOC 偏差的 PI 或者滞回环节叠加到滤波输出上。
这个修正不能加得太猛,否则并网功率会被“修正”出明显的新波动。我的经验是修正环的带宽取滤波带宽的十分之一以下,比如滤波时间常数 120 秒,那 SOC 修正环的时间常数取 600 秒以上,这样修正动作足够缓慢,不会破坏平滑效果。调这个参数时耐心很重要,SOC 是慢变量,必须跑完长仿真才能看出趋势。
3.3 一次调频:下垂控制怎么搭
如果储能要参与一次调频,下垂控制是标配。频率偏差乘以一个下垂系数得到有功增量,叠加到原来的功率指令上:
P_bess = P_base + K_f * (f_ref - f_meas)
K_f 的单位是 MW/Hz,取值取决于调频容量和死区设置。比如 ±1% 的频率偏差对应 100% 调频容量,那 K_f = P_rated / 0.5Hz,也就是 2pu/Hz,折算到标幺值再乘容量系数即可。具体数值可以按并网导则对调频死区和调差率的要求反推。
在 PowerFactory 里测量频率可以直接引母线频率信号,用 Phase Measurement 或者直接从 ElmGenstat 的端子获取。注意频率信号本身含有噪声,在下垂环节前面加一个一阶低通或滞回,避免储能因为频率抖动频繁出力。下垂控制整定的时候要跟平滑控制的输出叠加,两个控制目标如果同时在作用,需要设置优先级或者限幅,防止平滑指令和调频指令同时抢功率,超出换流器容量上限。
3.4 控制模式切换与防抖
实际工程里储能不会永远工作在一种模式。我项目里设计了三种模式:平滑模式、调频模式、待机模式。平滑模式和调频模式可以叠加,待机就是指令为零。模式之间的切换条件如果写得不好,会出现频繁切换抖动,整个储能出力曲线会很难看,也给实际运行带来隐患。
解决抖动用滞回:进入平滑模式需要波动持续超过阈值 30 秒,退出则需要波动小于阈值且保持 30 秒,两个阈值之间留出区间。在 DSL 里可以用有限状态机来实现,PowerFactory 的 DSL 虽然没有完整的状态机支持,但可以用布尔变量加延时逻辑实现类似效果。更省事的做法是把模式切换放到 DPL 脚本里做,在仿真过程中动态修改控制器参数,不过这样对 DPL 的熟练度要求比较高,脚本报错时排查也相对麻烦。
4. 在 PowerFactory 中从零搭建仿真系统
4.1 新建工程与基准参数设置
打开 PowerFactory 后第一步是新建工程,在工程里选择基准功率和基准频率。基准功率一般选 100MVA,也可以选系统总装机容量;如果系统是 50Hz,频率基准就写 50Hz。基准功率的选择影响所有标幺值参数的换算,建议固定一个值然后全工程统一,不要中途更换,否则后续对参数时很容易混乱。
然后建立电网模型。我搭的是一个单机无穷大简化模型:一个 110kV 电压源(ElmNet 里用 External Grid)带短路容量设定,短路容量给 2000MVA,对应一个 6Ω 左右的系统阻抗。这个数值会影响并网点的电压波动幅度,值得认真设,如果短路容量给得太大会让并网点电压“刚性”得不真实,太小又会放大电压波动,最好结合实际接入点的短路阻抗数据来填。然后是变压器、母线和线路,PowerFactory 里母线叫 Busbar,变压器用 Two-winding Transformer 对象,填上额定容量、变比和短路电压百分比。
4.2 风电单元建模
风电单元我用了一个直驱永磁同步风机的简化模型,没有去搭完整的齿轮箱和变流器,因为项目重点关注的是并网功率特性。PowerFactory 里风机模型一般先创建一台 Static Generator,然后把风功率曲线(P 对风速)做成一个查表,用风速信号作为输入,输出就是风机出力。
更准确的建模方式是用 PowerFactory 自带的风电机组标准模型,或者从 DIgSILENT 官网下载机组模板,里面有完整的变桨控制、转子侧变流器控制和网侧变流器控制。我这次因为手里有实测功率数据,就直接用实测曲线驱动 Static Generator,把数据导入成 CSV,用 DPL 读取,再在 RMS 仿真里作为输入信号。
如果你没有实测数据,可以用 Weibull 分布生成风速序列,或者用 PowerFactory 内置的阵风/渐变风模型,两者都够用。仿真用的风速序列最好是 600 秒以上的连续数据,因为低通滤波的时间常数是 120 秒,序列太短看不到完整的平滑效果,结果会缺乏说服力。
4.3 BESS 并网拓扑搭建
BESS 的搭建分三层:电池、换流器、变压器。电池用 DSL Common Model 实现,我给它定义了三个状态变量:SOC、极化电压、电流;参数包括额定容量 2MWh、初始 SOC 0.5、内阻和极化时间常数。换流器用 Static Generator 表示,设置额定容量 1MVA,额定电压 0.4kV,运行模式选外部控制,有功和无功参考值都由外部信号输入,不填固定值。
变压器选 0.4/35kV,容量 1.25MVA,留一点裕量,短路阻抗 6%,连接组别 Dyn11。这是因为储能换流器侧是三相四线制,Dyn11 可以提供接地参考,选别的组别也不是不行,但 Dyn11 在同类项目里最省心。在 35kV 侧接一个断路器和一个测量元件,用来记录储能注入电网的功率。
控制器的搭建在 Composite Frame 里完成。我建了一个 Frame,里面包含一个信号输入元件(风速和频率)、一个电池模型、一个控制器模型和一个测量输出元件。Controller 用 DSL 写,内部包含滤波、SOC 修正、下垂和限幅逻辑。这里要提醒第一次用 Composite Frame 的人:Frame 的引脚连接一定要和实际物理连接一致,否则初始化阶段就会报错。我的习惯是先画框图,再在 Frame 里放模型,然后连引脚,每连一根线都检查一下信号方向,宁可慢一点也别返工。
4.4 控制环节的参数整定
参数整定在 PowerFactory 里最常用的方法是扫描。我先把 PI 控制器的比例和积分系数拉开一个范围,用 DPL 循环跑多个算例,然后把结果输出到外部文件对比。比如电流内环,我在 Kp 为 0.1 到 1、Ki 为 1 到 20 的范围内扫了一个网格,用阶跃响应看超调和调节时间,选了一个 Kp=0.5、Ki=10 的组合,跟踪速度和超调都比较满意。
功率外环的整定思路类似,但要考虑和电流内环的带宽分离。外环带宽约 10Hz,对应的 PI 参数根据滤波器电感计算。低通滤波时间常数 T 是通过离线扫参确定的,我读入风速数据后,在 T=60、120、180、300 秒下分别计算平滑后的并网功率波动幅度,发现 T=120 秒时能压到限值以内且储能功率不超过 1MW,于是取了 120 秒。
SOC 修正环参数先粗调,Kp 取 0.05,Ki 取 0.01,时间常数 600 秒,然后跑一个 3600 秒的长仿真观察 SOC 曲线。如果 SOC 漂移到 0.2 以下或者 0.8 以上,再调整修正强度。这个过程比较费时但非常必要,因为 SOC 失控是风储联合仿真里最容易出现的问题,而且它往往不是仿真中途报错,而是结果图里 SOC 一路冲到顶或者跌到底,不细看很容易漏掉。
4.5 仿真场景设置与运行
场景设计围绕两个目标:平滑效果验证和一次调频验证。平滑场景输入风速序列,风速做阶跃波动和连续波动两种;调频场景在电网侧加一个频率扰动,比如 0.05Hz 的阶跃,或者一个持续 3 秒的斜坡,观察储能出力响应。两个场景要分开跑,这样报告里可以分别说明平滑能力和调频能力,不会混在一起被审稿人挑刺。
在 PowerFactory 里建场景用 Calculation 页面里的 RMS Simulation,仿真时间一般设 600 到 3600 秒,步长用 0.01 秒。初始值从潮流计算结果获取,点“初始值计算”后 PowerFactory 会自动算平衡。这一步如果报错,通常说明模型初始化条件不满足,后面我会列一个排查清单,照着查基本能定位。
仿真过程中可以用 PowerFactory 的在线曲线窗口实时观察几个关键量:并网点有功功率、储能有功功率、SOC、频率和母线电压。我发现实时观察比跑完再看结果文件效率高很多,因为参数不对时你能立刻看到振荡趋势,不用等仿真结束后再翻数据,跑完再调一轮,时间成本差好几倍。
4.6 结果提取与后处理
仿真结果可以用 PowerFactory 自带的曲线工具直接导出,也推荐用 DPL 脚本批量提取,尤其是有多个工况要对比时。我写了一个简单的 DPL 脚本,遍历三个工况文件,提取并网点有功、储能有功、SOC,输出成 CSV,然后统一用 Python 做后处理画图。这样有一个好处:所有对比图的横纵坐标一致,后处理代码只需要一份,不用每个图单独写处理逻辑。
这里有一个细节值得单独说:PowerFactory 导出的 CSV 时间戳和变量名排列顺序可能与预期不同,建议导出前先把要提取的变量列表固定下来,导出后检查第一行表头,再用 pandas 读的时候做好列映射。我给变量命名的时候统一加了前缀(比如 BESS_P、BESS_SOC),这样后处理的时候可以按名字过滤,不用记列号,脚本可读性好很多。
5. 常见问题与排查技巧实录
5.1 初始化失败:大多数是模型定义问题
PowerFactory 在运行 RMS 仿真前会自动做初始化计算,最常见的一句话是 "Initial conditions could not be established"。这个报错的原因五花八门,按我的经验,出现频率最高的是这几类,整理成一个速查表供参考:
| 可能原因 | 典型表现 | 排查办法 |
|---|---|---|
| Composite Frame 引脚信号未对齐 | 初始化直接报错,提示信号连接无效 | 逐根检查 Frame 内部连线,确认信号类型和方向 |
| 电池模型初始状态未给出 | SOC 初值变量为空,DSL 里引用 NaN | 给所有初值变量赋值,避免从 NaN 开始积分 |
| 控制器存在代数环 | 初始化计算不收敛,迭代次数超限 | 断开控制环,先接固定功率基准值验证接线 |
| 变压器、母线参数冲突 | 潮流计算能过,初始化失败 | 检查变压器短路电压、分接头、连接组别是否一致 |
排查顺序建议:先做潮流计算,看 BESS 的功率是否与预期一致;再做短路计算验证接线;最后才做 RMS 初始化。如果 RMS 初始化还报错,把模型里的控制环节全部断开,接固定功率基准值,看能不能初始化成功。能成功就把控制环节逐步接回去,每接一个跑一次初始化,直到定位出错的地方。这种方法笨一点但很可靠,比盯着报错信息猜快得多。
5.2 SOC 越限与功率震荡
SOC 越限是很常见的问题,也是相对好解决的。根治方案就是在控制里加饱和限幅和软保护。我实现上用的是双层保护:第一层是指令限幅,在储能功率指令处限制最大充放电功率,保证换流器和电池都在安全范围;第二层是 SOC 修正环,温和地把 SOC 拉回中间区间。如果这两层还不够,再考虑在 DPL 里做强制充放电逻辑,SOC 低到下限就强制转充电模式,高到上限就强制转放电模式。
功率振荡的诱因一般是控制带宽设置不合理。比较典型的场景是:功率外环带宽和电流内环带宽太接近,导致系统出现 15 到 30Hz 的振荡,曲线图上看就是高频小幅度锯齿。解决办法是把外环带宽降到内环的十分之一以下,同时检查滤波环节是否引入了额外相位滞后。另一个常见诱因是下垂控制的频率测量噪声,加低通滤波之后振荡一般会消失,频率测量滤波时间常数取 0.1 到 0.5 秒通常就够。
5.3 控制方向搞反
这是我在项目中实际踩过的一个坑。设置储能充电时,有功功率指令取负值表示充电,但我在 SOC 修正环里把符号搞反了,结果 SOC 高了反而要求继续充电,系统完全发散。排查这个问题的办法是在控制器输入端加一个阶跃信号,把储能相关环节全部分离出来,观察有功指令和 SOC 的变化方向是否正确。
方向问题的本质是物理符号约定不一致:PowerFactory 里通常规定发电机输出为正,负载消耗为正,储能充电时有功为负。在写 DSL 之前,先明确你的功率参考方向是“流入电网为正”还是“储能充电为正”,然后在所有环节统一,否则大概率会出问题。我自己后来养成了一个习惯:每个变量加注释写明正方向,控制逻辑里的加减关系一眼就能看懂,排查时省了很大力气。
5.4 仿真速度与数据导出
RMS 仿真速度一般不会成为瓶颈,但如果你的步长设成 0.0001 秒或者仿真时长到 10 小时,速度就会很感人。步长 0.01 秒、仿真 3600 秒,普通笔记本跑几分钟到十几分钟,可以接受。如果嫌慢,可以考虑把不需要记录的信号关闭记录功能。PowerFactory 默认可能记录很多中间变量,实测数据文件会非常大,后处理也会变慢,把不必要的记录关掉能快不少。
数据导出方面,我的建议是用 DPL 脚本批量导出,而不是手工逐条导出。手工导出不但慢,而且容易漏信号,尤其在对比多个工况时特别容易乱。脚本里先固定时间窗,再统一变量名,输出文件用时间戳做后缀防止覆盖。还有一个常见问题是导出数据的采样率过高,Excel 或 pandas 画图时卡顿。可以在 DPL 脚本里做重采样,比如每 100 个点取 1 个,曲线形状基本不变,文件体积缩小两个数量级,处理起来流畅很多。
6. 写在最后的几点心得
这个项目从建模到出结果大概花了两周,中间有三天在调试初始化错误,另外两天在折腾 SOC 修正的参数。回头来看,最值得分享的经验是:在 DIgSILENT 里做风储联合仿真,不要一开始就追求所有环节同时正确,而是先把基础的 PQ 控制跑通,再加平滑算法,再加调频逻辑,每一步都在稳定收敛的基础上迭代。跳步图快的结果往往是多个问题叠加在一起,排查时根本分不清是模型问题、控制问题还是参数问题。
另外一个体会是,仿真前要把物理量纲和坐标系统一好。PowerFactory 里的标幺制以工程基准为基础,电机惯例和负载惯例混着用最容易出错。我建议每个变量都写清楚单位、正方向、基准值,哪怕只是草稿纸上的手写表,调试时省下的时间远大于写它的时间。
最后再分享一个小技巧:多做参数敏感性扫描,不要只跑一个工况。用一个基准风速曲线,把滤波时间常数和下垂系数各取几个值跑一组算例,输出到同一个对比图里。这样你不仅知道这个参数下的结果,还能看出参数变化之后趋势是什么,写报告的时候图和结论都硬气很多,审阅的人也会觉得你是真的把这个系统摸透了。