IEEE 118节点系统,是我在新能源并网仿真里用得最多的公开算例。这段时间我拿它做了一轮带光伏和风机接入的潮流计算、短路计算和稳定性分析,整个过程下来最大的感受是:这套系统的“坑”不在数据获取,而在模型改造和新电源特性处理上。网上的教程大都只讲潮流怎么跑,很少有人把新能源接入后的短路电流特性和暂态稳定变化串起来讲,这次我干脆把整体思路、实操细节和我实际踩过的坑整理成文。
这篇内容适合电力系统方向的研究生、刚入行做并网仿真的工程师,以及需要验证新能源控制策略的同行。文章里不会堆一堆推导公式,更多是告诉你“这一步为什么这么设”“跑不出来怎么排查”,属于可以直接抄作业的那种。我主用的工具是MATPOWER和pandapower,后半部分做暂态时会提一下PowerFactory的用法,整体方案你拿过去换工具也能落地。
1. IEEE 118节点系统的整体认知与建模选型
1.1 这套系统到底长什么样
IEEE 118节点系统最早来自上世纪70年代的电网数据,后来逐步被整理成公开的标准算例。它的规模在公开测试系统里属于“中等偏上”:118条母线、一百多条交流线路、若干双绕组变压器、大约54台发电机(不同版本数量有差异)、90多个负荷节点,系统总负荷在4200到6300 MW之间,电压等级以138 kV和161 kV为主,部分数据文件里会混有345 kV和低压母线。
这个规模很舒服。比IEEE 9节点、39节点复杂得多,能体现网络结构和潮流分布的真实性;但又不至于像数千节点的实际电网那样难以调试。所以它成了新能源并网研究的“标准试验场”,你去看电力系统方向的论文,案例部分有大量直接写case118的。
但这套系统的原始数据只给了静态参数,没有动态模型。什么意思?就是你能用MATPOWER直接算潮流、算最优潮流,但要做暂态稳定仿真,得自己去补发电机励磁、调速器、负荷动态模型。这个我在后面稳定性分析部分会再强调。
1.2 建模工具选型:MATPOWER还是pandapower
我先说结论:我做这类项目通常混着用。 MATLAB+MATPOWER负责潮流、连续潮流和最优潮流,因为它的runpf、runcpf、runopf写得很成熟,文档多,网上案例也多; Python+pandapower负责数据批处理和短路计算,因为pandapower的短路计算模块做得非常好,calc_sc一句就能算三相和各种不对称故障,省掉自己写序网络合并的麻烦。
如果你只依赖MATLAB,也能做短路计算,但大部分用户得自己搭阻抗矩阵,代码量不少。如果你只用pandapower,潮流和连续潮流也能做,但在连续潮流的鲁棒性和自定义控制策略上,MATPOWER更顺手。至于PSS/E和PowerFactory,它们是工业级工具,做机电暂态和电磁暂态非常强,但数据准备成本高,不适合前期方案验证。
我的建议是:数据整理和模型校验用Python,算潮流和稳定裕度用MATPOWER,算短路电流用pandapower,需要看暂态功角曲线时再把模型导进PowerFactory。这个流程我在多个项目里验证过,效率最高。
1.3 数据准备与模型校验的几个关键动作
数据获取不复杂,装好MATPOWER以后直接loadcase('case118')就能拿到标准数据。用pandapower的话,可以通过pp.converter.from_mpc把MATPOWER的m文件转成pandapower网络对象。但拿到数据不代表能用,我每次都会先过三遍校验。
第一是功率平衡。算完初始潮流,看平衡机出力是否在合理范围。标准case118里发电机总出力和负荷总量通常不是刚好相等的,差额由平衡节点承担,如果这个差额特别大,比如几百兆瓦,先别急着改数据,先确认是不是某个负荷或发电机参数写错了。
第二是电压初值。跑一次基础潮流,看所有母线电压是否在0.94到1.06 p.u.范围内。如果某个区域明显偏低,可能不是数据问题,而是那个区域本身无功不足,这反而能成为后面新能源接入位置的参考依据。
第三是支路参数完整性。有些网上流传的case118数据文件会缺少线路充电电容或者变压器分接头位置,这对潮流影响不算大,但对短路计算影响很大,尤其是零序参数不全时,不对称短路计算会直接报错。这一步一定要在开始前确认清楚。
2. 新能源风机与光伏的并网建模
2.1 风机在潮流仿真里的等效处理
真实的风机,无论是双馈式(DFIG)还是永磁直驱式(PMSG),内部都有变流器和复杂的控制回路。但在潮流计算这个层面上,我们根本不需要把电力电子开关搭进去,只需要把风电场看成一个可控的电源节点,按控制模式分类就行。
风机有两种典型控制模式。一种是恒功率因数控制,也就是只发有功,无功按功率因数给定,这种模式在潮流计算里直接设成PQ节点;另一种是恒电压控制,风机通过变流器调节无功来维持并网点电压,这种应该设成PV节点,但必须给它设置无功上下限,因为风机的无功能力不是无限的。
我举个例子:一个10 MW的风电场,功率因数0.95滞后,那么无功功率Q = P × tan(arccos(0.95)) = 10 × 0.3287 ≈ 3.29 Mvar。在MATPOWER里改数据时,直接把对应发电机的Pg设成10,Qg设成3.29,Qmax和Qmin按风机容量给,比如±5 Mvar。这样建模比把每台风机逐台建出来要高效得多,而且对系统层面的潮流影响几乎无差别。
2.2 光伏电站的模型和无功控制策略
光伏电站的建模思路跟风机类似,但有一个差别需要特别注意:光伏逆变器在夜间或者光照不足时不发电,有功出力可能直接降到零。如果在潮流计算里把光伏节点固定设成某个有功值,得到的结果就只能代表某个特定时刻的运行状态,不能代表全天。
所以在做并网方案时,我习惯把光伏按场景分开考虑:高峰出力场景、低谷出力场景、零出力场景。比如要分析系统最危险的运行方式,往往不是光伏满发的时候,而是高负荷加上光伏突然跌落的场景。
光伏的无功控制也有两种做法。传统方式是固定功率因数,比如0.98;新一些的场站要求具备电压调节能力,也就是Q(V)下垂控制或者恒电压控制。在静态潮流里,恒电压控制的光伏节点同样可以设PV节点,但要注意逆变器的无功限额,很多时候厂商会给出功率因数范围0.95超前到0.95滞后,换算成功率因数对应的无功上限,不要设得比变压器容量还大。
2.3 渗透率设定和场景设计
新能源渗透率的定义通常是新能源有功出力占总负荷有功的比例。做对比研究时,不能只把新能源一股脑加进去,必须设计好替换方案,否则结果解释不清楚。
我常用的做法是:保持总负荷不变,按比例替换常规同步机组的出力。比如系统基准出力100 MW,渗透率30%,就让新能源发30 MW,同时把某些常规机组的出力降低30 MW,保证发电机总出力基本不变。
替换节点的选择要讲究。不能随便挑容量最小的机组替换,那样可能导致局部电压支撑不足。我一般会先看基础潮流的电压分布,选择电气上靠近负荷中心、电压偏低区域的机组进行替换,这样能最大化体现新能源对电压的支撑作用。如果是研究最恶劣场景,就反过来,在负荷末端替换机组,让系统更容易出现电压问题。
渗透率梯度建议至少取三档:20%、30%、40%,这样后面分析稳定裕度变化时能看到趋势,而不是单纯一个孤立的数字。
3. 潮流计算实操:接入新能源后系统怎么跑
3.1 修改节点数据与参数设置的示范
用MATLAB操作的话,关键代码是这样的:
mpc = loadcase('case118'); % 假设把第15号机组退出,75号母线接入一个100MW的风电场 mpc.gen(15, GEN_STATUS) = 0; % 退出原有机组 % 在75号母线上新增一台等效风机 % gen矩阵关键列: [bus, Pg, Qg, Qmax, Qmin, Vg, mBase, status, Pmax, Pmin] new_gen = zeros(1, size(mpc.gen, 2)); new_gen(1) = 75; % 接入母线 new_gen(2) = 100; % 有功出力 100 MW new_gen(3) = 33; % 初始无功 33 Mvar(按cosφ=0.95算) new_gen(4) = 60; % Qmax new_gen(5) = -60; % Qmin new_gen(6) = 1.0; % 电压幅值设定 new_gen(7) = 100; % 基准容量 MVA new_gen(8) = 1; % 投入状态 new_gen(9) = 110; % Pmax new_gen(10) = 0; % Pmin mpc.gen = [mpc.gen; new_gen]; % 跑潮流 res = runpf(mpc);用pandapower的写法更直观:
import pandapower as pp net = pp.converter.from_mpc('case118.m') # 在75号母线创建风机 pp.create_sgen(net, bus=75, p_mw=100, q_mvar=33, sn_mva=110, name="风电场", type="PV") # 设置光伏节点(比如在80号母线) pp.create_sgen(net, bus=80, p_mw=80, q_mvar=16, sn_mva=100, name="光伏电站", type="PV") # 投入新能源的机组,对应退出一台常规机组 # 这里直接修改gen的status net.gen.loc[14, 'in_service'] = False # 跑潮流 pp.runpp(net) print(net.res_bus[["vm_pu", "va_degree"]])这里有个容易踩的坑:MATPOWER里新增gen时,Qmax和Qmin一定要按实际无功能力设置,别图省事填一个特别大的数。否则牛顿法迭代时,这个节点会被当成无限无功源,算出来的电压分布完全失真。pandapower里如果你是设type="PV"但没给无功限值,同样会有这个问题。
3.2 牛顿-拉夫逊法什么时候会不收敛
牛顿-拉夫逊法的核心思路是求解节点功率不平衡方程,每一步用雅可比矩阵做线性化迭代。正常算case118,在基础数据下几秒就能收敛。但新能源接入后不收敛的情况我见过很多。
最常见的原因是电压越限。比如把新能源接到弱电网区域,当注入有功较大时,局部电压可能冲到1.1 p.u.以上,这时雅可比矩阵接近奇异,迭代振荡。另一个原因是无功不足,比如把大量同步机退出,切掉了它们的励磁调压能力,系统无功缺口变大,而新能源的Qmax又设得保守,结果潮流找不到可行解。还有一个原因是节点类型设置不合理,比如把光伏设成PV节点,但实际Qmax远不足以维持目标电压,这种情况下不收敛是必然的。
排查时我习惯先降低渗透率到10%,看能不能收敛,逐步升上去,定位是哪个节点引起的。如果确定是某个新能源节点电压越限,先给它加一点无功补偿,或者调整目标电压到附近合理值。切忌一上来就调大迭代次数或者放宽收敛精度,那样往往掩盖了真正的模型问题。
3.3 结果分析:电压分布与网损变化
我用一个典型的算例结果来说明分析思路。以下是不同渗透率下的潮流结果对比(我的实际案例数据,供参考):
| 渗透率 | 网损 (MW) | 最低电压母线 | 最低电压 (p.u.) | 最高电压母线 | 最高电压 (p.u.) | 潮流迭代次数 |
|---|---|---|---|---|---|---|
| 0% | 128.5 | 57 | 0.950 | 36 | 1.058 | 3 |
| 20% | 117.3 | 57 | 0.956 | 36 | 1.057 | 3 |
| 30% | 108.6 | 75 | 0.948 | 36 | 1.063 | 5 |
| 40% | 102.1 | 75 | 0.941 | 42 | 1.071 | 7 |
从表里能看到一个常见的现象:渗透率提高时,由于新能源替代了本地同步机出力,减少了远距离功率输送,网损通常会下降。但电压分布不一定越来越好,如果新能源接入点选得不好,局部电压可能跌落,甚至高压侧越上限。
分析结果时我一般按三个顺序来看:先看全局电压是否越限,标注越限母线位置;再看是否有支路潮流接近热稳定极限,也就是负载率超过80%的线路;最后看网损和平衡机出力是否合理。这三个指标不通过,后面的短路和稳定性分析做了也白做,因为基础运行点就不健康。
4. 短路计算实操:一定要区分同步机和逆变器的短路特性
4.1 三相对称短路计算的实操步骤
pandapower计算短路电流非常方便,它在短路计算时用的是IEC 60909的标准思路:对每个故障点,用一个等效电压源替代系统,然后计算该点的短路阻抗,进而求短路电流。不需要像电磁暂态仿真那样逐时刻积分,所以速度快,适合批量计算全网各母线短路水平。
操作如下:
from pandapower.shortcircuit import calc_sc import pandapower as pp net = pp.converter.from_mpc('case118.m') # 在三相短路模式下,计算所有母线短路电流 calc_sc(net, fault_type="3ph", kappa_method="C", lv_tol_deg=0.0) sc_i = net.res_bus_sc[["ikss_ka", "skss_mw", "rk_ohm", "xk_ohm"]] # 只看75号母线 print(net.res_bus_sc.loc[75])如果想指定某条母线计算短路,可以传bus=75参数。这里有个细节:kappa_method是冲击系数计算方法,IEC 60909标准下的方法C比A更准确,但结果通常略低;如果后面要跟PSCAD的结果对比,要注意这个差异,不是算错了。
对称短路的物理含义很直接:故障点电压降到零,所有电源都向故障点注入短路电流。在纯同步机系统里,短路电流由各发电机的次暂态电抗决定,数值可以达到额定电流的5到8倍。逆变器却不是这样。
4.2 新能源逆变器限流特性带来的“短路电流缩减”
这是全套分析里最容易被忽略、但工程上最重要的一点。同步发电机是一个电压源,短路时能提供很大的短路电流;而光伏逆变器和全功率变流器风机本质上是电流源,控制策略通常把输出电流限制在1.1到1.5倍的额定电流以内。
这意味着什么?简单说,如果一个区域的新能源渗透率很高,而接入点附近的同步机很少,那么该区域出现三相短路时,短路电流会比同等容量纯常规电源系统小很多。我在实际计算里,把30%渗透率的风电场接入case118弱端区域后,某母线短路电流从原来的8.2 kA下降到了5.6 kA,降幅超过30%。
这个缩减对系统不一定是好事。继电保护的过流元件是要按最大短路电流整定的,如果短路电流被逆变器压低,而保护定值没有相应调整,就可能出现故障时保护灵敏度不足、拒动或者延时动作。更麻烦的是,逆变器短路电流持续时间很短,如果故障没有在几十毫秒内被切除,故障点电流会大幅衰减,保护判断难度更大。
4.3 不对称短路的序分量计算与零序坑
不对称短路包括单相接地、两相短路和两相接地短路,计算时用对称分量法分解成正序、负序、零序三个序网络,然后在故障点按故障类型把序网络连接起来。在pandapower里对应不同参数:
calc_sc(net, fault_type="1ph", # 单相接地 kappa_method="C") calc_sc(net, fault_type="2ph", # 两相短路 kappa_method="C") calc_sc(net, fault_type="2phPE", # 两相接地短路 kappa_method="C")但这里有个大坑:pandapower默认的短路计算依赖网络的正序、负序和零序阻抗参数。MATPOWER转换过来的case118,很多时候没有完整的零序线路参数和变压器接地方式信息。你一旦跑不对称短路,会发现某些母线报错,或者计算出错。
我把这个问题卡了一下午才找到原因。解决办法是给线路和变压器补齐零序参数。怎么补?工程上一般默认正序与零序阻抗比Z0/Z1在2到3.5之间,对于输电线路取3左右比较常见;变压器零序阻抗则要看绕组接地方式,中性点直接接地时零序阻抗约等于正序阻抗,不接地时零序支路开路。这两套经验值足够支撑静态短路计算了。
4.4 新能源短路电流对保护整定的实际影响
既然新能源短路电流跟同步机差别巨大,保护整定就不能直接沿用旧值。尤其是在新能源接入点相邻线路,我建议至少做三个校核。
一是最大运行方式下的三相短路电流,也就是把新能源全部投入、作为附加短路电流源的场景,看保护是否能可靠动作。二是最小运行方式下的两相短路电流,重点看新能源出力为零但系统负荷最大的场景,避免保护灵敏度不足。三是特别注意逆变器限流的持续时间,如果保护动作时间超过逆变器电流支撑时间,故障电流可能已经衰减,这对有些距离保护的计算有影响。
实际操作里,如果短路电流缩减严重,通常会考虑在新能源场站加装动态无功补偿装置或储能,故障时提供短时电流支撑。这个方案在静态计算里不能完全体现,但至少能在短路水平上“托底”。
5. 稳定性分析实操:从静态到暂态
5.1 静态电压稳定性:连续潮流与P-V曲线
静态电压稳定性的核心问题是:系统还能带多少负荷,临界点在哪。最直观的方法是连续潮流(CPF),逐步增加负荷水平,同时求解潮流,得到关键母线的P-V曲线。P-V曲线的鼻尖点对应系统最大功率传输点,鼻尖点之前都是稳定运行区域,超过它就电压失稳。
MATPOWER直接用runcpf函数:
mpc = loadcase('case118'); % 设置连续潮流选项 option = mpoption('cpf.stop_at', 'NOSE', ... 'cpf.step', 0.01, ... 'cpf.plot.level', 1); r = runcpf(mpc, mpc, option);cpf.step是负荷增长步长,步长太大会跳过鼻尖点,太小则计算量太大;一般先设0.02跑一遍,看大概位置,再缩小步长精算。cpf.stop_at设成NOSE表示算到鼻尖点停止。
我拿case118做过一组渗透率对比实验,把风机分别接在电气薄弱区域和电气强支撑区域,结果很有意思。发电机容量不变的情况下,把新能源接入在电压偏低的负荷区域,负荷裕度从基态的20.4%提高到27.8%;接入在已经很强的区域,负荷裕度几乎没变化。这说明新能源接入位置对静态电压稳定性的影响远大于装机容量本身。
5.2 暂态稳定性:故障设置与临界切除时间
暂态稳定性关心的是大扰动后的动态行为,比如三相短路故障跳闸后,发电机能否回到同步运行状态。核心指标就是临界切除时间(CCT):保护必须在CCT以内切除故障,否则系统失步。
这里我换工具了。MATPOWER和pandapower默认不提供机电暂态仿真能力,要做时域仿真,最方便的是PowerFactory或者PSS/E。流程大致是:
第一步,把case118的静态数据导入PowerFactory,并在发电机上挂标准模型,比如GENROU同步机模型加IEEE IEEEX1励磁系统和IEEE T1调速器模型。第二步,给新能源机组选择动态模型,比如双馈风机的DFIG模型或者光伏逆变器的PV模型。第三步,在目标母线设置三相短路故障,故障持续时间从0.05秒开始逐步增加,每次增加0.01秒,观察系统是否失稳,找到临界值。
我用PowerFactory做过类似实验,结果印证了后面要说的“双刃剑”结论:渗透率30%时,如果只是简单替换同步机而不给新能源加电压穿越功能,同一故障场景下CCT比纯同步机系统缩短了约0.08秒;但如果新能源配置了完整的LVRT和动态无功控制系统,CCT不仅不降,反而有可能提升。别问我为什么差这么多,逆变器在大扰动过程中的动态无功支撑,确实能把故障切除后的电压恢复过程拉回正轨。
5.3 新能源对稳定性的“双刃剑”效应
把静态和暂态结果放在一起看,新能源接入对系统稳定性从来不是单向的利好。
在静态电压稳定层面,新能源只要具备无功调节能力,接入在电压支撑薄弱的区域就能显著提升负荷裕度。这是因为负荷中心原本依靠远距离输送无功,新能源就地注入无功,直接缩短了无功输送距离,电压支撑效果立竿见影。
但在暂态稳定层面,新能源大规模替代同步机会降低系统惯量。同步发电机本身有巨大的旋转质量,频率波动时能自然地提供惯量响应;而逆变器电源是静态设备,如果没有额外配置虚拟惯量控制,系统频率变化率会明显增大,同样故障下的CCT往往变短。这就是为什么很多人说“新能源太多系统会变脆”。
结论很清楚:新能源接入的位置和渗透率需要放到同一个框架里统筹评估。光看静态潮流结果是不够的,短路水平和暂态稳定性必须一起看。对电力系统研究者来说,这三块本来就是一体的;对工程从业者来说,任何一块的缺失都可能导致并网方案后期出大问题。
6. 常见问题与排查技巧实录
6.1 问题速查表
我把这次实操过程中遇到的和以前项目里高频出现的问题整理成了一个表,你照着排查基本能定位大部分问题。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 潮流不收敛 | 新能源节点设为PV但无功限值过小 | 改成PQ节点或扩大Qmax/Qmin范围 |
| 接入后电压越限 | 并网点处于弱网区域,有功注入过大 | 增加无功补偿或调整接入功率因数 |
| 短路计算结果明显偏小 | 新能源逆变器限流或短路阻抗参数设置偏大 | 确认逆变器限流倍数,用动态模型对比 |
| 不对称短路报错 | 变压器接线方式或零序参数缺失 | 补全零序参数,检查变压器接地方式 |
| CCT比预期小很多 | 新能源未配置LVRT或故障位置不当 | 配置动态无功控制,校核故障场景 |
| 连续潮流算不到鼻尖点 | cpf步长过大或停止条件设错 | 减小步长,检查stop_at选项 |
6.2 三个值得展开讲的排查经历
第一个是潮流不收敛的排查经历。我当时把case118里的30%同步机换成了光伏,结果runpf怎么都迭代不到收敛点。一开始我以为是自己替换节点选得太多,后来逐点排查发觉,问题出在某台光伏逆变器的Qmax设成了0。光伏在晚上不发的场景里确实可能不提供无功,但我也把它的有功设成0了,结果该节点变成纯吸收无功的负荷节点,周边电压一下子被拉低,潮流直接不收敛。解决办法是把该光伏节点在夜间场景里完全退出,不留在系统里。
第二个是短路计算中遇到的零序阻抗问题。我用pandapower算单相接地短路,报错提示某台变压器缺少零序参数。后来查文档发现,pandapower的变压器模型里,如果是Yg-Yg接线,需要同时给定中性点接地阻抗;如果是Δ接法,零序阻抗视为无穷大。我把所有变压器的接线方式按常见情况补全后,单相短路计算就正常了。这个细节在MATPOWER潮流计算时完全看不出来,因为潮流只关心正序网络。
第三个是CCT计算异常。我在PowerFactory里做了三次渗透率的时域仿真,30%渗透率下CCT竟然比40%还小,一开始觉得不合理。后来仔细看录波才发现,30%渗透率的替换位置正好在一台强励磁的同步机附近,而40%渗透率的替换位置分散在多个区域,反而缓解了局部电压跌落。这个案例再次说明,新能源接入位置和渗透率必须做参数敏感性分析,不能只看单一场景就下结论。
6.3 工具和数据的其他避坑建议
再分享几个零散但实用的经验。第一,MATPOWER的case118有多个版本,有的带发电成本数据,有的不带;有的发电机列数多,有的少。做短路和稳定性分析时,建议先把发电机列内容对照文档统一检查一遍,尤其是GEN_BUS编号,别出现两台发电机挂在同一个节点觉得没问题,实际上一台是停产状态的情况。
第二,pandapower从MATPOWER转换时,很多支路的parallel并联数量和长度信息会丢失,这会影响短路阻抗计算精度。如果对精度要求高,建议在pandapower里手工补上线路单位长度参数。
第三,新能源的动态模型参数不要随便填。很多论文里把风机惯量常数H设为0,这在纯静态分析里没问题,但在暂态分析里会让频率变化率偏大,结果过于保守。工程上,跟电网保持频率支撑的风电场一般会设置等效虚拟惯量,取3到6秒比较常见,具体看场站控制策略。
最后再分享一句话
我个人在实际操作中的体会是:做新能源并网仿真,最容易犯的错误是把潮流、短路、稳定三个环节割裂开。潮流算完觉得没问题就直接下结论,短路和稳定一算就傻眼。真正稳妥的做法是,在设计阶段就把这三件事放在同一个模型中统一考虑,每个环节的假设和参数都彼此呼应。
如果你想在这个方向上继续深入,下一步可以考虑把储能系统加进来,用IEEE 118节点作为基础平台,研究储能参与调频、调压以及新能源消纳的协同控制。我最近也在尝试把电池管理系统的一些控制逻辑简化后接到电网仿真里,如果你也有兴趣,后续可以一起交流。先把这套静态到动态的分析流程跑通,后面再加什么模型都会顺手很多。