ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

基于分布式微发电机无功调节的配电网电压控制与Matlab仿真

基于分布式微发电机无功调节的配电网电压控制与Matlab仿真 这几年分布式电源装机规模上来之后配电网电压问题已经从“偶尔冒头”变成“天天都要处理”的常态化问题。前年我跟一个电压越限治理项目时遇到的情况非常典型白天光伏大发10kV馈线末端电压直接顶到1.06以上配电自动化系统里一大片越上限报警传统手段该调的变压器分接头已经调到头电容器组也全部投入电压还是压不下来。最后是靠调整馈线上几台分布式微发电机的无功输出才把电压拉回安全区间。这个仿真项目研究的就是如何通过控制分布式微发电机的无功功率注入来调节配电网电压平台是Matlab验证算例用了一套按IEEE基准风格构建的56节点中压配电网测试系统。文章会从电压偏差的物理机理讲起重点拆解无功-电压灵敏度矩阵的求法、分布式电源无功优化的建模思路、Matlab代码实现框架以及仿真结果的判读方法最后把我在实操中踩过的坑一并列出来。适合刚接触配电网电压控制、或者正在写分布式电源相关课题代码的同学参考。1. 为什么配电网电压要靠分布式微发电机来“支”一把1.1 电压越限是怎么发生的先看一个基本公式。对辐射状配电网中的某一段馈线设首端电压为U1末端电压为U2线路阻抗为RjX传输功率为PjQ忽略横分量的情况下有U2 ≈ U1 - (P·R Q·X) / U1这个式子看起来平淡但它把配电网电压问题的本质说清楚了线路上有功和无功的流动都会造成电压降落或抬升其中P·R项在配电网里尤其不能忽略因为配电网线路的R/X比值比输电网高得多普遍在1到3之间架空线和电缆差异也大。光伏大发时情况会变得很拧巴。馈线末端用户的本地负荷可能很小光伏出力远大于本地负荷多余功率就顺着馈线倒送回变电站这时P可以变成负值“压降”变成“压升”末端电压抬升到1.06、1.07是很常见的事。反过来晚间负荷高峰时段线路重载P·R和Q·X两项都是正的大数值末端电压又会快速下坠。所以配电网的电压问题往往是“早晚两头翘”中午越上限晚高峰越下限。1.2 传统调压手段的局限性配电网里三种常规调压手段变电站有载调压变压器OLTC、并联电容器/电抗器、线路串联电容。OLTC能调节的范围很大但有三个毛病一是动作机构机械寿命有限频繁调节会让维护量暴增二是分接开关调整是离散的调节步长通常0.5%~1%精细度不够三是它只能调变电站母线电压馈线中后段的电压下垂曲线整体平移末端电压和首端电压的“落差”其实没变。并联电容器本质上是离散投切设备一组电容器投下去就是固定容量的无功补偿无功需求小幅波动时容易在“投入”和“切除”之间来回震荡对电压反而造成阶梯式扰动。线路串联电容能减小电抗造成的压降但参数固定后灵活性差还容易诱发次同步谐振问题在配电网里用得很谨慎。分布式微发电机就不一样。光伏逆变器、微型燃气轮机、储能PCS本质上都是电力电子设备输出电压幅值和相位可以连续控制无功输出理论上能在0到额定容量之间平滑调节几个毫秒到几百毫秒就能完成一次指令响应。更重要的是它们就分散在馈线沿线的负荷中心附近哪段线路电压偏低就让那附近的微发电机本地补偿效果很直接。这个项目研究的核心就是给这些分散的微发电机分配“谁出力、出多少”的问题。2. 电压-无功灵敏度矩阵调控策略的“地图”2.1 灵敏度矩阵的物理含义假设56节点系统里接了m个分布式微发电机每个节点电压幅值Vi对某个DG节点j注入的无功功率Qj的变化率叫电压-无功灵敏度S_ij ∂Vi / ∂Qj举个直观的例子一段5公里长的10kV馈线末端节点接了一个光伏电站。末端电压对末端无功注入的灵敏度可能是0.004 p.u./Mvar而首端节点对同一个光伏电站无功注入的灵敏度可能只有0.0005 p.u./Mvar。也就是说同样输出1Mvar无功pic点公共连接点离它近的节点电压抬升幅度是远处节点的8倍。这个特性决定了无功补偿一定要“就近”不能隔着很长一段线路把无功从远处送过来那样不仅效果差还会在送电路径上产生额外损耗。除了空间位置灵敏度还和系统当前运行工况强相关。负荷重的时候灵敏度数值更大同一台DG在重载工况下出1Mvar无功对电压的影响比轻载工况明显得多。所以灵敏度矩阵必须“实时更新”至少要在每个控制周期重新算一次不能拿固定表一套就完事。2.2 两种求法解析法和扰动法第一种是从潮流方程的雅可比矩阵直接求。牛顿-拉夫逊法迭代收敛后雅可比矩阵J描述了节点有功、无功不平衡量与电压幅值、相角修正量之间的线性关系。把雅可比矩阵分块成四个子阵[ΔP] [Jpθ JpV] [Δθ] [ΔQ] [Jqθ JqV] [ΔV]对PQ节点要求电压幅值对无功注入的变化率可以消去有功和相角的影响得到S_VQ -(JqV - Jqθ·Jpθ⁻¹·JpV)⁻¹这个公式在数学上完全对但在Matlab里直接写矩阵求逆会遇到两个麻烦一是雅可比矩阵维数大56节点系统就是约100阶求逆运算量不小二是病态问题某些重载工况下矩阵接近奇异数值误差会被放大。第二种是扰动法工程上我更喜欢实现非常简单粗暴在基准工况下完成一次潮流计算得到V0然后在第j个DG节点上增加一个小无功扰动ΔQj重新做一次潮流计算得到Vj灵敏度就是S(:,j) (Vj - V0) / ΔQj扰动步长建议取0.005~0.02 p.u.太大则非线性误差明显太小则数值噪声占了主导。这个方法的好处是潮流程序本身已经写好了不需要额外解析推导而且它能自动包含负荷电压特性和变压器分接头位置的综合影响。代价是要多算m次潮流对56节点这种规模来说m也就十几个计算时间几乎可以忽略。下表是我实测的两个方法特点对比指标解析法雅可比逆扰动法计算精度理论精确但病态时误差大步长合适时精度足够实现难度需要矩阵分块求逆只需要重复调用潮流计算开销一次矩阵求逆m次潮流计算适应性强弱推导基于PQ节点假设与潮流模型解耦通用性强调参复杂度无需要选扰动步长2.3 56节点系统中的灵敏度分布特征这套56节点测试系统我按中压配电网的典型结构生成馈线主干长度约8公里包含了三条主馈线和若干分支线路分布式微发电机主要接在馈线中后段。实际计算出来的灵敏度矩阵一个很明显的特点是它“稀疏但不均匀”同一馈线上越靠近末端节点该节点对沿线DG无功注入的灵敏度越高而不同馈线之间的节点灵敏度几乎为零基本可以忽略。这一点对后续控制策略很有价值——不需要把56×m的完整灵敏度矩阵全塞进优化模型只需要保留每个节点对“同馈线且有电气距离较近”的那些DG的灵敏度模型规模能降一个量级。3. 控制策略设计让哪些DG出力、出多少、往哪个方向出力3.1 目标函数怎么定分布式微发电机无功调节的最终目标是在满足电压质量的前提下尽量少占用逆变器容量。我建议把目标函数写成三项的加权和min J α·ΣV偏差平方 β·网损 γ·无功调节代价逐项展开说。电压偏差平方项Σ(Vi - Vref)²Vref取1.0 p.u.这项把电压往额定值拉同时因为平方的关系越限越厉害的节点惩罚越大。网损可以通过潮流计算结果计算或者用灵敏度近似网损变化≈2·Σ(Bi·ΔVi)简化处理时也可以直接在目标里加入ΣQg²来控制无功的“总额”因为大量无功在线路上往返流动必然带来损耗增加。第三项无功调节代价给每台微发电机的无功出力加了二次成本这样能防止优化结果出现“某台DG满出力、另一台完全不出力”的极端情况让无功出力更均匀也给逆变器留出裕量应对有功波动。三个权重α、β、γ的取值需要按场景微调。白天光伏大发导致电压越上限时α要放大比如α10β1γ0.1这时目标函数的主矛盾就是把电压偏差压下去如果是正常负荷场景电压没有越限α可以调小让网损项发挥主导用少量无功转移来降损。3.2 约束条件里最容易被忽略的几条约束条件决定了优化结果能不能真正落地这里列几个关键不等式约束第一节点电压上下限。按国标中压配电网通常要求0.93~1.07 p.u.但实际控制时应更严格建议取0.95~1.05甚至0.97~1.03这样留出后续波动的裕量。第二逆变器视在功率容量约束。这是最容易被纸上谈兵忽视的地方很多初版代码只约束Qmin≤Qg≤Qmax忽略了逆变器总容量S_max。光伏逆变器本质上是要先发有功P_g剩余容量才能用于发无功所以真实的约束是-√(S_max² - P_g²) ≤ Qg ≤ √(S_max² - P_g²)如果光伏有功出力已经达到0.95倍额定容量那无功能力就只剩大约0.31倍额定容量这个数字必须实时更新。我见过不少仿真论文把光伏无功上限直接写成0.8 Mvar完全没考虑当时有功正在满发这种结果在实际系统中是不可能执行的。第三功率因数限制。很多并网协议要求功率因数在0.9~1之间换算成无功约束就是-Qg_max ≤ Qg ≤ Qg_max, Qg_max P_rated·tan(acos(0.9))电网规程有时比逆变器物理容量更严格所以建模时要同时取“物理容量约束”和“协议约束”的交集。3.3 集中式闭环控制的总流程本项目采用的是集中式优化框架分四个步骤周期执行第一步数据采集。状态估计获取各节点当前电压Vi、各DG当前有功P_g和无功Q_g、负荷有功无功以及馈线首端功率。第二步灵敏度计算。在当前工况下求电压-无功灵敏度矩阵S为下一步线性化优化做准备。第三步形成优化问题并求解。把决策变量设为各DG的无功出力调整量ΔQg用二次规划或序列二次规划求解得到一组最优无功调整量。第四步下发指令。各DG按指令执行新的无功输出等待系统稳定下个周期重新采集数据。这个流程的时间尺度通常取1~5分钟一轮与负荷和光伏出力的波动速度匹配。通信方式一般通过配电自动化主站下发到各分布式电源的AGC终端。相比分布式下垂控制每台DG各自测量本地电压然后按V-Q下垂曲线调整无功集中式优化的优点是全局性好不会出现“各扫门前雪”造成部分DG无功耗尽而另一部分闲置的局面缺点是依赖通信链路的可靠性。实际工程里我建议两者结合正常通信时走集中优化通信故障时切到本地下垂控制保证系统至少还有基本调节能力。4. Matlab实现框架数据怎么组织、潮流怎么写、优化怎么调4.1 算例数据的组织方式我接到这种项目时第一步就是把网络参数整理成标准的两个矩阵bus矩阵和branch矩阵。bus矩阵每行对应一个节点列信息依次为节点编号、有功负荷PD、无功负荷QD、初始电压幅值、初始相角、节点类型1为平衡节点2为PV节点3为PQ节点。branch矩阵每行对应一条支路列信息依次为首端节点、末端节点、线路电阻R、线路电抗X、对地电纳B、变压器变比。对于56节点配电网算例我按1.05的基准电压和100MW的基准功率做了标幺化处理。这里有个小经验配电网的基准容量不要选太大用100MW做基准时馈线末端的标幺阻抗常常是0.02这种小数量级数值上容易因为精度不够出现收敛问题建议用10MW或者1MW作为基准容量标幺值更均匀潮流收敛也快。分布式微发电机的接入信息用单独的结构体gen管理gen.node存放接入节点编号gen.Pg存放当前有功出力gen.Smax存放逆变器容量gen.nodeType记录机组类型。4.2 牛顿-拉夫逊潮流函数的简化代码这里给出一个尽量贴近工程使用的简化版潮流函数框架核心是形成雅可比矩阵和迭代修正function [V_abs, V_angle, iter, converged] nr_powerflow(bus, branch, gen, max_iter, tol) % 输入: bus - n行节点矩阵 % branch - m行支路矩阵 % gen - 分布式发电机结构体 % max_iter - 最大迭代次数 % tol - 收敛精度 n size(bus, 1); V bus(:, 4) .* exp(1j * bus(:, 5)); % 电压向量 for iter 1:max_iter % 构建节点导纳矩阵 Y form_ybus(branch, n); I Y * V; S_calc V .* conj(I); % 各节点注入功率 P_calc real(S_calc); Q_calc imag(S_calc); % 节点注入有功和无功含发电机出力 P_inj -bus(:, 2) gen.Pg_all; Q_inj -bus(:, 3) gen.Qg_all; dP P_inj - P_calc; dQ Q_inj - Q_calc; % 形成雅可比矩阵分四块 J11 dP / d_angle(V, Y); J12 dP / d_V(V, Y); J21 dQ / d_angle(V, Y); J22 dQ / d_V(V, Y); J [J11 J12; J21 J22]; % 2n×2n矩阵 dTheta_dV -(J \ [dP; dQ]); dTheta dTheta_dV(1:n); dVmag dTheta_dV(n1:2*n) .* V; % 电压幅值修正 V V dVmag .* exp(1j * dTheta); % 检查收敛 if norm([dP; dQ], inf) tol converged true; break; end end V_abs abs(V); V_angle angle(V); end实际跑56节点时牛顿-拉夫逊法在R/X比偏高的配电网里有时会振荡。我的处理办法是加一个松弛因子η0.6~0.8每次迭代只修正0.6倍的修正量虽然会多迭代几次但能显著改善收敛稳定性。另外平启动电压全部取1.0 p.u.相角取0对配电网通常很有效不需要辅助算法。4.3 灵敏度矩阵计算的实现用扰动法实现最直接也最好理解function S compute_sensitivity(bus, branch, gen, dQ_st) % dQ_st 无功劳动步长建议取 0.01 p.u. [V0, ~, ~] nr_powerflow(bus, branch, gen, 200, 1e-6); S zeros(nbus, ndg); for g 1:ndg bus_t bus; idx gen.node(g); bus_t(idx, 3) bus_t(idx, 3) dQ_st; % 在DG节点上增加无功负荷 [Vt, ~, ~] nr_powerflow(bus_t, branch, gen, 200, 1e-6); S(:, g) (abs(Vt) - abs(V0)) / dQ_st; end end注意这里仿真里加“节点无功负荷”和加“发电机无功出力”在潮流方程里的效果是等价的都是改变该节点的无功注入量符号上注意方向就可以。我习惯用负荷的正方向表示“吸收无功”所以加无功扰动就是让该节点的注入无功减少此时末端电压会下降灵敏度就是负值后续在优化代码里注意符号对齐。4.4 优化求解与主循环有了灵敏度可以把电压线性化近似成V ≈ V0 S·ΔQ然后在约束条件下求解二次规划。下面是我常用的主循环片段% 决策变量 x 为各DG的无功调整量 ndg length(gen.node); x0 zeros(ndg, 1); Q_min_scale -sqrt(gen.Smax.^2 - gen.Pg.^2); Q_max_scale sqrt(gen.Smax.^2 - gen.Pg.^2); lb Q_min_scale - gen.Qg; ub Q_max_scale - gen.Qg; alpha 10; beta 1; gamma 1e-3; options optimoptions(fmincon, Algorithm, interior-point, ... Display, iter, SpecifyObjectiveGradient, false); [x_opt, fval] fmincon((x) obj_fun(x, V0, S, alpha, beta, gamma), ... x0, [], [], [], [], lb, ub, ... (x) nlcon(x, V0, S), options); gen.Qg gen.Qg x_opt; % 更新无功出力目标函数和约束函数的子函数如下function f obj_fun(x, V0, S, alpha, beta, gamma) V_new V0 S * x; % 线性近似电压 f alpha * sum((V_new - 1.0).^2) ... % 电压偏差 gamma * sum(x.^2); % 无功调节代价 % 网损项需要重新潮流才能精确计算这里用无功代价近似 end function [cineq, ceq] nlcon(x, V0, S) V_new V0 S * x; cineq [V_new - 1.05; % 上限越限 0.95 - V_new]; % 下限越限 ceq []; end这套方案有个必须注意的地方S是当前工况下的局部灵敏度如果优化结果ΔQ很大比如超过0.1 p.u.线性化误差会明显上升。解决方法是做“序列更新”操作求出ΔQ后只执行其中一部分比如执行50%然后重新算一次潮流和灵敏度再求解下一轮。一般迭代3~5轮就能收敛到满意的结果。这种做法在控制文献里叫SQP序列规划思想工程队列里俗称“走走停停”非常实用。5. 仿真结果怎么判读越限情况、网损和DG出力5.1 三个典型场景的设置我把仿真分成三个场景模拟实际运行中最头疼的工况场景负荷水平光伏出力主要问题A午间大发中等负荷50%满发馈线末端电压越上限B晚高峰重载90%负荷零出力末端电压越下限C轻载高光伏20%负荷满发首中段电压整体偏高每个场景都先把基准电压状态跑出来再对比无控制和有DG无功优化两种情况的差别。5.2 电压分布对比控制效果的第一个证据场景A的典型结果大致长这样不控制时56节点系统中末端节点电压最高达到1.062 p.u.有7个节点超过1.05 p.u.处于越限状态。投入DG无功优化后各DG吸收感性无功相当于在节点上“吃掉”一部分无功末端电压被拉回1.035 p.u.所有节点电压都落进0.95~1.05区间。场景B的变化方向相反不控制时末端电压最低到0.942 p.u.6个节点电压低于0.95 p.u.晚高峰负荷下馈线末端的压降非常明显。优化后各DG向系统注入无功末端电压回升到0.972 p.u.。这里要特别强调一个观察维度不要只盯着最大越限节点的数值变化还要看整条电压曲线的“坡度”。无功优化本质上是在改变电压沿馈线的分布形状把原来“前高后低”或“前低后高”的曲线尽量拉平。平均电压偏差和电压标准差这两个指标更加能反映整体改善效果。5.3 控制效果核心指标对比整理成表格更直观指标场景A无控制场景A优化后场景B无控制场景B优化后最大电压(p.u.)1.0621.0350.9420.972越限节点数7060平均电压偏差(p.u.)0.0380.0120.0310.010网络损耗(MW)0.870.721.461.31DG总无功输出(Mvar)04.205.8从表里能看到两个特点。第一无功优化不仅缓和了电压越限还顺带降低了网络损耗场景A中网损下降约17%因为光伏大发时馈线上本来就有倒送功率DG吸收无功可以减少馈线末端无功倒送造成的额外损耗。第二优化出的无功总量不算小但分摊到每台DG上单台不超过1Mvar仍然在逆变器剩余容量范围内可实现性好。5.4 判断优化结果“真实性”的经验拿到仿真结果后我建议按这三条过一遍避免白算第一逐台DG检查无功出力是否满足当时有功下的容量约束。仿真中设定某台光伏P_g0.85 p.u.S_max1.0 p.u.那么Qg上限只有约0.53 p.u.优化结果里如果出现Qg0.7 p.u.说明约束漏写了或有功设定不一致要回头检查代码。第二看所有DG无功出力方向是否一致。如果结果中出现某些DG发无功而另一些同馈线DG吃无功要判断它在物理上是否合理——正常情况下同一条馈线、同一电压问题类型都是电压偏低或都偏高DG出力方向应该一致出现矛盾工况时往往是灵敏度矩阵的符号处理有问题。第三把线性化电压V0S·ΔQ与重新潮流计算的实际电压做对比偏差超过0.005 p.u.就说明线性近似偏差过大应该缩小单步调整量或增加序列迭代轮数。6. 实操过程中踩过的坑和经验盘点6.1 潮流不收敛配电网和输电网的反差我第一次把输电网习惯用的牛顿-拉夫逊代码直接套到56节点配网算例上结果在R/X比较高且重载的支路附近反复振荡怎么调初值都不行。后来跟朋友讨论才想明白输电网的X远大于R雅可比矩阵对角占优牛顿法天然稳健配电线路R和X差不多某些支路严重重载时雅可比矩阵的行列式趋近于零数值上接近奇异迭代修正量忽大忽小。处理办法有三条路一是缩小重载支路的有功功率仿真阶段保证负荷加得合理二是用松弛因子η控制步长三是改用PQ分解法或前推回代法。对于教学和验证类项目前两种最省事实际项目里如果追求绝对收敛就直接把潮流内核换成前推回代法配电网的适应性好得多。6.2 灵敏度矩阵的计算坑扰动法的步长选择是一个典型的“两难问题”。步长太小潮流收敛后的数值噪声会影响除法结果步长太大灵敏度不能代表当前工况。我踩过一次某台光伏节点电压灵敏度算出来符号是反的排查了很久最终发现是扰动步长取了0.1 p.u.无功劳动触发了线路重载潮流收敛到了另一个解附近灵敏度的线性近似完全失效。后来统一用0.005 p.u.步长再对结果做一个简单的平滑滤波问题就消失了。另外如果要算多台DG的联合影响千万不要忽略灵敏度矩阵的交互项。理论上节点i的电压变化是ΔViΣS_ij·ΔQj但实际系统中各DG同时调整无功时潮流方程的非线性会让叠加结果产生偏差。如果多台DG彼此在电气上靠得很近这个偏差会更大。稳妥做法是优化计算出ΔQ后重新潮流校验一遍。6.3 外部环境和实时性的平衡仿真阶段做完往工程落地想一步的话通信延时会成为主要矛盾。集中式优化的周期受限于遥测数据刷新和指令下发往返时间一般只能做到分钟级。而光伏出力受云层遮挡影响分钟级波动很常见存在“指令下发时工况已经变了”的风险。解决思路是内环秒级用V-Q下垂控制自动响应外环分钟级用本文的集中优化更新下垂参考点两级配合。另外协议对功率因数约束往往比单纯容量约束更严格在配电网里逆变器不是想发多少无功就能发多少无功的建模时务必把当地电网公司的并网技术规定同步量化成约束条件否则优化出来的指令到现场会被合规性拦截。6.4 有一点感悟整个项目跑下来我最大的体会是配电网电压问题里无功调节的价值不在于“把电压精确调到1.00”而在于“用可控的连续无功源去填补离散调压手段留下的空档”。分布式微发电机的优势是快、分散、连续适合做精细化解耦调节但它自身的容量又受有功出力牵制下一层约束总是比上一层多。设计控制策略时把“通信失效时该怎么办”想清楚比把优化算法在理想条件下调到极致更有工程意义。仿真阶段呢先拿本系统的灵敏度把物理规律摸透再上优化器你会少走非常多弯路。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表