ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

综合负荷模型Simulink仿真:从ZIP到感应电动机动态建模

综合负荷模型Simulink仿真:从ZIP到感应电动机动态建模 简介面向电力系统分析、规划与运行控制人员的 MatlabSimulink 综合负荷模型仿真资源用于解决负荷建模精度不足导致的稳定性评估偏差问题。压缩包内共 3 个 .m 文件整体大小仅 2KB可作为 Simulink 电力系统仿真的负荷建模基础模块直接调用。文件分别覆盖静态负荷、动态感应电动机与综合负荷三类模型静态模型依据功率与电压、频率关系描述照明、电加热等不易受电压频率变化影响的负荷动态模型针对电动机、电弧炉等敏感负荷可模拟启动、制动及负载突变综合负荷模型将两者结合支持在电压/频率波动、负载突然变化与系统故障等工况下观察系统响应。已有 93 人学习适合正在做电力系统动态仿真、负荷建模课程设计或需要快速搭建综合负荷模块的研究者与工程师使用。1. 综合负荷模型仿真从“电压掉下去回不来”说起做电力系统稳定计算的人大概率遇到过这种情况短路故障被保护切除后母线电压明明恢复了中枢点功率却在几十秒的时间里慢慢爬升用恒阻抗负荷算出来的减载方案因而少切了负荷。这正是静态负荷模型看不见的动态过程——配电网里的感应电动机在低电压下减速、在电压恢复后需要一个转差恢复时间宏观上表现为功率的慢恢复。综合负荷模型ZIP静态部分加感应电动机动态部分就是为了描述这种“先跌后恢复”的功率特性出现的而MatlabSimulink把方程组、波动输入和可视化放到同一个环境里是搭这个模型代价最低的落地方式。本文适合做稳定分析、继电保护整定或者新能源并网评估的工程师也适合把这套模型当作电网仿真课程作业的研一学生。2. 综合负荷模型的数学表达与 Simulink 实现选型综合负荷模型的核心思路不是把每台电动机、每条配电线路都建出来而是把母线看进去所见到的所有负荷聚合为一个可测量的等效模型。工程里最常用的是 ZIP 感应电动机的组合ZIP 处理静态功率感应电动机负责动态过程。在写 Simulink 模型之前先要把这两部分的数学结构落在纸面上。2.1 静态 ZIP 模型恒阻抗、恒电流、恒功率的取舍ZIP 这个名字来自三种静态元件的英文首字母Z恒阻抗、I恒电流、P恒功率。它在标幺制下的有功表达为[ P_{zip}(U) P_0 \left[ a \left( \frac{U}{U_0} \right)^2 b \left( \frac{U}{U_0} \right) c \right] ]无功同样形式只是系数可以不同。系数 a、b、c 分别是恒阻抗、恒电流、恒功率所占的比例三者相加必须等于 1。这个约束意味着负荷在全电压下总功率等于基态功率 P0Simulink 建模时可以在参数界面里加一个校验回调运行时如果 abs(abc-1) 1e-6 直接报错能省掉后面排查参数错误的时间。频率效应也要考虑一般写成 (1 Kpf * (f - f0)) 的乘子。Kpf 是有功频率因子典型范围 0.5 ~ 1.5电网频率波动不大时可以取 1。恒功率部分对电压完全不敏感适合描述整流器、变频器等电力电子负荷恒阻抗部分适合描述电阻加热、白炽灯恒电流部分则介于两者之间常用于拟合照明类负荷的中段曲线。实际聚合负荷里三个系数都不会是 0这也是 ZIP 比单纯恒阻抗更接近录波数据的原因。2.2 感应电动机的动态等效为什么要加状态变量静态 ZIP 建模有个根本缺陷它假设电压变化的瞬间负荷功率就能跳到新的稳态值。感应电动机不是这样电压跌落时电磁转矩骤减转子转速不能突变转差率在惯性作用下缓慢变化对应的有功功率呈现出“先迅速下降、再随时间恢复”的轨迹。要描述这个过程模型里必须引入状态变量。稳定分析中不需要建完整的派克方程用一阶惯性过程近似转差恢复已经足够。常见的写法是[ T_p \frac{dx_p}{dt} x_p P_{target}(U, f) ]其中 P_target 是电压变化后负荷功率的目标值Tp 是恢复时间常数状态 xp 描述的是电动机等效功率的慢动态。P_target 用幂函数形式[ P_{target} P_0 \left( \frac{U}{U_0} \right)^{\alpha} (1 K_{pf} (f - f_0)) ]α 是有功电压指数感应电动机的 α 通常在 0.1 ~ 0.5 之间远低于恒阻抗的 2这正是电动机负荷电压跌落后有功下降不多的原因。无功侧类似但 β 通常在 1 ~ 2.5因为电动机的无功吸收对电压更敏感。综合负荷的总功率写成静态部分和动态部分的加权和[ P_{total} (1 - D) \cdot P_{zip}(U, f) D \cdot x_p ]D 是电动机负荷占比在 0.2 ~ 0.7 之间配电网中带的工业负荷越多D 越大。这套一阶恢复模型在机电暂态和长期动态研究中是主流做法它不仿真电动机内部磁链只仿真转差稳定对功率的延迟影响既避开了电磁暂态小步长的计算负担又抓住了问题的核心现象。2.3 选型Matlab Function 块、Level-2 S-Function 还是 Simscape Electrical同一个模型有三种落地方式选错会直接影响后续的仿真速度和代码生成能力。实现方式依赖工具箱适合场景代码生成支持Matlab Function 块无额外依赖教学验证、参数扫描支持需符合嵌入式子集Level-2 M S-Function无额外依赖需要访问采样时间、多速率系统需转 C 后支持Simscape Electrical 的 Asynchronous MachineSimscape Electrical电磁暂态精确分析支持但模型较大我一般首选 Matlab Function 块。它既能写状态方程又能直接在模块里维护参数不需要像 S-Function 那样额外写 .m 文件再注册到模型里。Simscape 的感应电动机模块精确但参数多堵转转矩、漏抗、转子电阻这些参数从现场录波里根本辨识不出来反而难落地。3. 在 Simulink 里搭建综合负荷模型的完整步骤选定了实现方式下面从零搭一个可直接运行的综合负荷模型仿真。假设输入是母线电压幅值标幺值U和频率偏差f输出是负荷有功 P、无功 Q。3.1 建立电压激励与坐标基准新建模型后拖入一个 Step 模块作为电压激励。Step 初始值设为 1Step time 设为 2终值设为 0.8模拟 2 秒时刻电压跌落 0.2 标幺值。再拖入一个 Constant 模块值填 50作为额定频率输入。两个信号通过 Mux 合并成两维向量送入后面的负荷模型方便在同一个 Scope 里对照观察。这里要说明一个建模前提综合负荷模型的输入是电压幅值不是三相瞬时值。如果从 Simscape Electrical 的三相网络取信号需要先用 Phase 或 RMS 模块求出电压幅值再进入负荷模型避免把瞬时值当成有效值用。标幺基准 U0、系统基准功率、额定频率都当作模型参数传入不要在函数块内部写死。3.2 在 Matlab Function 块中编写 ZIP 动态恢复模型拖入一个 Matlab Function 块命名为 composite_load输入参数设置为 U、f 两个标量输出为 P_total、Q_total。在编辑器中写入function [P_total, Q_total] composite_load(U, f, P0, Q0, U0, a, b, c, D, Tp, Tq, Kpf, Kqf, alpha, beta) persistent xp xq if isempty(xp) xp P0; % 状态初值取基态有功 end if isempty(xq) xq Q0; % 状态初值取基态无功 end Ts 0.001; % 固定步长与 Simulink 配置保持一致 df f - 50; % 频率偏差 % 静态 ZIP 部分abc1 P_zip P0 * (a * (U/U0)^2 b * (U/U0) c) * (1 Kpf * df); Q_zip Q0 * (a * (U/U0)^2 b * (U/U0) c) * (1 Kqf * df); % 电动机等效动态目标值 P_target P0 * (U/U0)^alpha * (1 Kpf * df); Q_target Q0 * (U/U0)^beta * (1 Kqf * df); % 一阶恢复过程的显式欧拉积分 xp xp (P_target - xp) / Tp * Ts; xq xq (Q_target - xq) / Tq * Ts; % 总负荷由静态部分和动态部分按比例合成 P_total (1 - D) * P_zip D * xp; Q_total (1 - D) * Q_zip D * xq; end这段实现里persistent 用来保存状态变量是 Simulink Matlab Function 块写动态模型的常用手段。欧拉积分的 Ts 必须在注释里写清楚模型的 Fixed-step size 如果设为 1e-3那这里的 Ts 就是 1e-3如果仿真步长改了要同步改这个值。更稳妥的做法是把 Ts 定义成工作区变量 ts在 Simulink 的 Model Settings 的 Fixed-step size 里填 ts在 Matlab Function 块参数里也传 ts这样配置一次处处一致避免两套步长对不上导致结果发散。各参数含义P0、Q0 是基态功率标幺U0 是基准电压标幺值为 1a、b、c 是 ZIP 系数且 abc1D 是电动机占比 0~1Tp、Tq 是有功、无功恢复时间常数Kpf、Kqf 是频率因子alpha、beta 是电压指数。3.3 封装为带参数界面的 Subsystem模型跑通后把整个 Matlab Function 块连同输入信号线一起圈选右键选 Create Subsystem from Selection把变量名整理成 subsystem 级端口。然后右键 Subsystem 选择 Mask Create Mask在 Parameters 页把 P0、Q0、a、b、c、D、Tp 都加进去并在回调函数里挂一段参数校验if abs(a b c - 1) 1e-6 error(ZIP 系数之和必须等于 1); end if D 0 || D 1 error(电动机占比 D 必须在 0 到 1 之间); end封装的好处是后续团队其他人使用时只需要填基础参数不用打开函数代码做批量参数扫描时也可以通过 sim 命令直接修改 Mask 参数省去手动翻界面的时间。3.4 配置示波器并跑通最小模型拖入 Scope输入端接电压信号另一端接 P_total。仿真时间设 30 秒固定步长 1e-3开始仿真。预期结果0 到 2 秒功率稳定在 P02 秒电压跌落瞬间功率先跳一下随后按 Tp 的节奏逐步恢复到接近但低于 P0 的某个值。如果 0 秒初始功率不是 P0多半是 xp、xq 初值设置与 P0、Q0 不一致把 persistent 初值改成 P0、Q0 即可。4. 综合负荷模型仿真参数设置与发散排查模型能跑通只是第一步仿真参数设不对结果是发的改起来还会牵连一堆无头绪的问题。这一部分主要说清楚求解器、步长和代数环的关系以及发散问题按什么顺序查。4.1 求解器步长与代数环处理Matlab Function 块内部用欧拉积分时外部求解器最好选 discrete离散模式避免连续求解器对内部状态完全没有感知而采用过大步长。Model Settings 里 Solver 选 Fixed-step、discreteFixed-step size 填 ts。电压测量与负荷模型之间如果出现代数环即电压输入依赖功率输出而功率输出又影响电压就会直接导致 Simulink 报“Algebraic loop”或者发散。常见做法是在电压测量到负荷模型之间加一个 Memory 块把代数环打断。但这会引入一个步长的延迟影响精度更干净的办法是把状态变量 xp、xq 从 Matlab Function 块里提到模型层用 Integrator 块配合 Gain 搭建一阶惯性环节让求解器直接管理状态更新从根本上消除手工欧拉积分的缺陷。我喜欢用的结构是P_target 进 Sum减 xp乘 1/Tp进 Integrator输出 xp。这个接线方式在嵌入式代码生成时也更友好代码生成器能把它识别为标准一阶惯性离散状态生成 C 代码的质量比在函数块内部做欧拉积分高得多。4.2 电动机占比、动态时间常数对结果的影响同样一个电压跌落参数不同负荷表现完全不同这直接影响保护装置的减载策略评估。下表整理了几个敏感参数的典型范围和影响方向参数典型范围对动态过程的影响D电动机占比0.2 ~ 0.7D 越大跌落后功率恢复幅度越大电压恢复越困难Tp有功恢复时间0.5 ~ 5 秒Tp 越大功率恢复越慢暂态持续越久alpha有功电压指数0.1 ~ 0.5alpha 越小跌落瞬间有功下降越少静态恒功率特征越强beta无功电压指数1 ~ 2.5beta 越小低电压时无功吸收越厉害母线电压越难拉回做负荷建模报告时这组参数要作为结论的一部分写清楚因为后续别的工程师拿去复用模型时第一件事就是确认这套参数对应的负荷构成场景配电网、工业负荷、城市混合负荷的参数区间明显不同。4.3 仿真发散时的标准排查路径碰到发散先不要改求解器精度按下面顺序排查检查 abc 是否等于 1。ZIP 系数偏离约束电压变化时功率会出现不应有的跳变。检查 Ts 与模型 Fixed-step size 是否一致。步长被改过而函数块里的 Ts 没同步改是最常见的隐性错误。检查状态初值。xp、xq 必须等于 P0、Q0否则仿真前几步会有一个与模型物理意义无关的瞬态。检查输入信号单位。U 和 U0 必须同为标幺或同为有名值混用会出现除以接近 0 的数导致发散。确认求解器是否用了 ode45。如果被自动切换到连续求解器而模型里又有手工欧拉积分步长控制极不稳定尽早改成固定步长离散求解器。最后一条容易被忽略Matlab Function 块里不能有 Inf 或 NaN 传入状态方程。电压输入如果是 0且 alpha 为负值P_target 会变成无穷大一阶惯性方程直接爆掉。仿真前在函数块入口加一个 min 保护把 U 限制在大于 0.1 的范围内。5. 模型导出与联合仿真FMU、C 代码与外部数据综合负荷模型建好后很少会一直留在独立 Simulink 模型里更多要考虑与整网稳定程序、实时仿真机或外部录波数据对接。5.1 导出 FMU 到其他平台做联合仿真R2020a 之后的 Simulink 支持直接将子系统模型导出为 Functional Mock-up UnitFMU2.0我一般在 R2023b 上从模型工具栏的 Apps 里选择 Export to FMU选中封装好的 composite_load 子系统导出设置里把求解器固定为离散步长即可导出的 FMU 可以在其他机电暂态仿真平台中作为负荷模型库使用。导出前要注意模型里如果有 persistent 变量导出时会被当作局部状态处理但跨平台初始化顺序在不同 FMU 引擎里表现不一致。工程上我会把带 Integrator 块的版本专门留一份命名为 composite_load_fmu导出用这份避开 persistent 状态初始化顺序的问题。FMU 的输入输出接口会自动保留 U、f、P_total、Q_total 这几个端口接收端的功率基值要按照 FMU 内部设置重新换算。5.2 与潮流计算数据和外部模式联动做稳定分析时负荷模型的输入电压曲线通常来自潮流计算结果而不是 Simulink 里人为构造的 Step。常见做法是把潮流软件导出的 CSV 文件用readtable读入再用timeseries对象接 Signal Editor 模块电压幅值序列和相角序列分别作为两个输入信号。如果只是一批不同跌落深度的工况可以直接写循环调用 sim 命令depths [0.8 0.7 0.6 0.5]; for i 1:length(depths) set_param(composite_load_model/Step, After, num2str(depths(i))); simOut sim(composite_load_model, StopTime, 30); P_seq(:, i) simOut.yout{1}.Values.Data; endset_param 修改 Step 模块的 After 参数每次仿真前把跌落深度改掉循环跑完批量生成不同工况下的有功响应曲线方便对比负荷模型在不同电压跌落下的行为差异。这段脚本在仿真数据量不大时够用数据量大时要用 parfor 并行加速。把 Simulink 模型接到硬件或外部程序还可以用 simulator 外部模式External Mode。模型选择外部模式后可以实时修改 D、Tp 参数并观察响应适合做负荷特性参数在线整定的前期验证。外部模式下模型代码是编译后下载到目标机运行的所以 Matlab Function 块里的 persistent 代码在代码生成时如果有不支持的特性会直接在编译阶段报错反过来提醒你把模型改成纯离散标准状态结构。5.3 生成 C 代码做实时仿真综合负荷模型嵌入实时仿真系统比如用作 RTDS 或 dSPACE 的负荷侧外部模型时需要用 Embedded Coder 生成 C 代码。前提条件是模型中所有状态必须用 Integrator 块或 Discrete State Space 表示不能用手写 persistent所有输入输出是 double 类型求解器设置成离散定步长Matlab Function 块内不能使用 coder.extrinsic 调用外部函数。我一般会把模型拆成两个文件一份保留完整中文注释和 Mask 参数界面用于离线研究另一份只保留纯代数运算和标准状态块用于代码生成。两份文件用同一个测试用例交叉验证输出曲线一致后再走代码生成流程。这样既保住了离线研究的调试效率又保证实时仿真代码干净可审查。6. 用阶跃响应验证综合负荷模型参数是否合理投运前最后一个步骤是验证。阶跃响应是最便宜有效的验证手段不需要真实电网数据就能把模型行为拍下来。6.1 三种典型电压阶跃下的响应曲线判读设置三组工况电压从 1.0 跌到 0.8、0.65、0.5其他参数不变。观察 P_total 曲线有三种典型形态值得记录第一跌落后功率短暂下降后快速恢复到接近跌落前的水平说明 D 大、alpha 小电动机占比高负荷具备较强的恢复特性。第二功率跌落后恢复很慢甚至带一点过冲说明 Tp 偏大电动机惯性大这类负荷在故障切除后往往会给电压稳定带来较长的恢复期。第三功率跌落几乎不恢复说明 D 很小ZIP 静态部分主导这种场景下恒阻抗模型就能近似描述不需要动态模型。无功侧重点看低电压时无功是否明显上升。beta 在 2 左右时无功随电压下降而下降beta 降到 1 以下时低电压下无功反而可能增大这是电压稳定分析里最应该警惕的特征。6.2 快速反推负荷构成比例的小技巧如果手头有一段母线电压跌落的实测录波可以用 MATLAB 优化工具箱反向辨识 D 和 Tp 两个关键参数。把仿真代码封装成函数function P_sim predict_load(theta, U_seq, P0, a, b, c, U0) % theta(1) D, theta(2) Tp D theta(1); Tp theta(2); Ts 0.001; xp P0; P_sim zeros(size(U_seq)); for k 1:length(U_seq) P_zip P0 * (a * (U_seq(k)/U0)^2 b * (U_seq(k)/U0) c); P_target P0 * (U_seq(k)/U0)^0.3; xp xp (P_target - xp) / Tp * Ts; P_sim(k) (1 - D) * P_zip D * xp; end end注意这里面 alpha 固定取 0.3先假设典型值只拟合 D 和 Tp 两个参数。然后用 lsqcurvefit 拟合fitfun (theta, U_seq) predict_load(theta, U_seq, P0, a, b, c, U0); theta0 [0.5, 1.0]; lb [0.1, 0.2]; ub [0.9, 10]; theta_est lsqcurvefit(fitfun, theta0, U_measured, P_measured, lb, ub);得到的 theta_est 第一维就是电动机占比第二维是恢复时间常数。拟合完成后把 theta_est 代回模型重新仿真一版与实测录波叠加在同一张图画对比误差在可接受范围后把这两个值冻结作为这套综合负荷模型的最终参数配置。把 D 和 Tp 从录波里解出来你手里这个综合负荷模型就有了可验证的实测依据。本文还有配套的精品资源点击获取
返回列表