简介:该资源是一份基于Matlab/Simulink搭建直流电网的课程报告PPT,面向电气工程、电力电子及高压直流输电方向的学生与研究者,适合作为课程设计、实验报告或答辩展示的参考模板。内容围绕直流配电网结构展开,包含与无穷大电源相连的换流站、可控交流负载、可控直流负载与储能系统,并给出AC/DC、DC/AC、DC/DC三模块的建模思路、参数设置与仿真波形分析,还延伸到三相断路孤岛效应的拓展验证,附有研究背景、小组分工与时间安排、结论与问题探讨,便于读者对照理解VSC-HVDC的基本原理与仿真调试流程。压缩包内共1个pptx文件,约3.24MB,为完整答辩演示文稿,含拓扑图、仿真截图与结果说明。目前已有247人学习浏览,适合需要快速搭建直流电网仿真模型、整理报告框架或补充排错思路的读者参考借鉴。
1. 直流电网仿真为什么先用 Simulink 跑通再谈报告
直流电网里没有工频过零点,母线电压是被换流器主动撑起来的。光伏、储能、恒功率负载挂在同一条母线上,任何一支路投切都会在直流侧激起衰减很慢的振荡;恒功率负载的负阻抗特性还会吃掉母线阻尼,下垂系数或者电压环带宽稍有偏差,波形几分钟内就会发散发直。用 Simulink 加 Simscape Electrical 的意义在于拓扑可以按电气图直接搭,开关器件按事件触发求解,控制环用离散模块实现,跟实际控制器的代码结构能对齐,调参也不是盲调。
这份「基于 Simulink 搭建直流电网(报告PPT)」的读者通常有两类:一类要在有限时间里做出能出波形的直流微网模型,另一类要把仿真结果整理成能汇报的材料。前者关心元件参数、求解器和代数环,后者关心数据导出与自动化生成。下面按建模、控制、批量出报告、模型整理的顺序走一遍。
2. 用 Simscape Electrical 搭出可运行的直流电网最小模型
2.1 直流电网需要哪些模块,库在什么位置
先明确一件事:直流电网仿真不要从零手写状态方程,除非你只做单变流器单负载。多源多负载的拓扑一旦超过三条支路,手工推传递函数的时间远超建模时间,而且改一次拓扑就要重推一遍。常规做法是用 Simscape Electrical 里的 Specialized Power Systems 元件库,开关器件用理想开关加反并联二极管,先把电气部分跑通,再往里加控制环。
最小可运行模型通常包含这几类模块,库路径大致如下(不同版本分类略有出入,用库浏览器搜索更快):
| 支路角色 | 模块 | 库路径(大致) |
|---|---|---|
| 直流母线支撑 | Series RLC Branch(BranchType 设为 C) | powerlib/Elements |
| 直流源 | DC Voltage Source | powerlib/Electrical Sources |
| 变流器 | Universal Bridge 或 Average-Value Converter | powerlib/Power Electronics |
| 负载 | Series RLC Branch(R 型)或三种负载组合 | powerlib/Elements |
| 测量 | Voltage Measurement / Current Measurement | powerlib/Measurements |
| 求解入口 | powergui | powerlib |
搭之前建议先用脚本建骨架,比在画布上拖拽更容易复现,也方便之后做参数扫描。下面这段脚本建一个「直流源 + 母线电容 + 电压测量」的最小可跑框架:
% 建一个最小直流母线骨架,方便后续往上挂支路 mdl = 'dc_grid_min'; if bdIsLoaded(mdl), close_system(mdl, 0); end new_system(mdl); open_system(mdl); load_system('powerlib'); % Specialized Power Systems 元件库 % 母线支撑电容,1 mF 是常见起点 add_block('powerlib/Elements/Series RLC Branch', [mdl '/C_bus'], ... 'BranchType', 'C', 'Capacitance', '1e-3', ... 'Position', [320 200 360 260]); % 母线电压测量,后面接 Scope 和 To Workspace add_block('powerlib/Measurements/Voltage Measurement', [mdl '/V_bus'], ... 'Position', [400 200 430 240]); % powergui 是电力系统仿真的必需模块,缺了会直接报错 add_block('powerlib/powergui', [mdl '/powergui'], ... 'Position', [40 40 110 90]); save_system(mdl);add_block的第一个参数是库内完整路径,第二个是目标模型里的模块路径,Position只影响画布布局、不影响仿真。BranchType和Capacitance是模块的对话框参数名,用get_param(...,'DialogParameters')能列出全部可设项,改参数时按这个键名来不会写错。
2.2 母线电容、线路电感与变流器参数怎么定
参数不是随便填的,每个数字背后都对应一个约束。母线电容决定恒功率负载扰动下的电压跌落深度,线路电感决定变流器出口电流的纹波和环流,开关频率决定求解步长的量级。下面这张表是 750 V 等级直流微网里比较常见的取值区间:
| 参数 | 典型取值 | 约束来源 |
|---|---|---|
| 母线额定电压 | 750 V | 器件耐压与线损的折中 |
| 开关频率 | 10 kHz | 兼顾开关损耗与电流纹波 |
| 母线电容 | 0.5~2 mF | 恒功率负载跳变时的电压跌落 |
| 变流器出口电感 | 0.3~1 mH | 电流纹波与动态响应速度 |
| 下垂系数 | 0.2~1.0 Ω | 均流精度与母线压降的权衡 |
一个可以直接用的估算:负载功率阶跃 ΔP、允许的母线电压跌落 ΔV、控制环响应时间 Δt,需要的母线电容约 C ≥ ΔP·Δt / (V·ΔV)。比如 5 kW 阶跃、允许跌 15 V、控制器 2 ms 内响应,750 V 母线上算出来约 0.9 mF,取 1 mF 留点余量。这个公式不精确,但比随手填一个 10 mF 靠谱得多——电容取太大会拖慢电压环,反而让动态变差。
变流器建模分两档:要看开关纹波和死区效应就用 Universal Bridge 搭真实开关模型;只关心毫秒级动态就用 Average-Value Converter,仿真速度能快一到两个数量级。我一般先用平均模型把控制环调通,再换成开关模型验证纹波和损耗,省掉大量等待时间。
2.3 powergui 与求解器:定步长还是变步长
电力电子模型卡在求解器上的情况非常多,多数是 powergui 里的仿真类型没选对。默认的 Continuous 模式对含开关的模型容易在开关时刻出现数值振荡,而且步长会被迫压得很小导致仿真极慢。含开关器件的直流电网一般用 Discrete 模式配固定步长:
% powergui 切离散模式,采样步长取开关周期的 1/100 set_param([mdl '/powergui'], 'SimulationMode', 'Discrete', ... 'SampleTime', '1e-6'); % 求解器用固定步长离散,与上面的采样时间保持一致 set_param(mdl, 'Solver', 'FixedStepDiscrete', ... 'FixedStep', '1e-6', 'StopTime', '0.5');SampleTime决定电力系统部分离散步长,FixedStep决定整个模型求解步长,两者取一样能避免插值误差。10 kHz 开关对应 100 μs 周期,取 1 μs 意味着一个开关周期内有 100 个采样点,电流纹波能算准,再往下压收益很小、耗时翻倍。如果模型里有高频 LLC 或者软开关过程,按最高开关频率的 100 倍来定步长。
提示:仿真跑不动先看步长和开关频率的比值,再查代数环,最后才怀疑模型本身。多数「仿真太慢」的根因是变步长求解器在开关点反复回退。
3. 母线电压控制:下垂控制与电压外环的 Simulink 实现
3.1 下垂系数怎么整定,压降和均流怎么权衡
多台变流器并联接同一条直流母线,如果不加均流措施,输出电压略高的那台会扛下几乎全部负载,输出略低的几乎空载,这是硬特性外源的必然结果。工程上给每台变流器加一条下垂特性:输出电压随输出电流(或功率)线性下降。Simulink 里就是一个增益加一个减法,形式为 V_ref = V_nom − R_d·I_o。
下垂系数 R_d 越大,均流越好,但母线压降越大。下表是 750 V 母线、两台 10 A 变流器并联时的实际效果:
| R_d (Ω) | 满负载母线压降 | 10% 电流偏差下的不均流度 | 适用场景 |
|---|---|---|---|
| 0.2 | 4 V | 约 25% | 母线电压精度要求高 |
| 0.5 | 10 V | 约 10% | 大多数直流微网 |
| 1.0 | 20 V | 约 5% | 变流器容量差异大 |
下垂系数不能只按均流选,还要看负载对电压的敏感度。如果后级有恒功率负载,母线电压跌太多会让负载电流进一步上升,形成正反馈。稳妥做法是取下垂系数后,回头跑一遍负载阶跃,确认最低点仍在负载允许范围内。
3.2 电压外环 PI 的搭建、限幅与抗饱和
下垂给的是电压参考值,真正把母线电压拉到参考值的是电压外环。结构很直白:母线电压实测值与参考值相减,误差进 PI,输出电流指令给内环或直接给变流器占空比。Simulink 里用 Discrete PID Controller 模块或者自己用增益加离散积分器搭,后者更容易加限幅和抗饱和逻辑。
% 电压外环 PI 参数,控制周期取 10 us Kp = 0.8; % 比例增益,决定电压恢复速度 Ki = 120; % 积分增益,消除稳态电压误差 Ts = 1e-5; % 控制环离散周期 I_max = 30; % 电流指令限幅,保护变流器 % 用脚本批量写入 PID 模块参数 set_param([mdl '/V_PI'], 'Controller', 'PI', ... 'P', num2str(Kp), 'I', num2str(Ki), ... 'SampleTime', num2str(Ts), ... 'LimitOutput', 'on', 'UpperSaturationLimit', num2str(I_max), ... 'LowerSaturationLimit', num2str(-I_max));比例增益的粗略起点是 Kp ≈ C_bus / (2·Ts),对应把电压环带宽压到开关频率的十分之一以下,避免和控制内环打架。积分增益从 Kp/10 开始往上加,直到电压恢复时间满足要求,再加就可能超调甚至振荡。限幅一定要开,否则负载突加时积分项会累积到很大,负载消失后电压冲到额定值以上,恢复过程拖得很长,这就是典型的积分饱和。
注意:限幅值要和变流器实际电流能力一致。设成理论值 2 倍,仿真里看着正常,实物上就是过流保护动作。
3.3 代数环、单位延迟和常见报错排查
下垂控制最容易踩的坑是代数环。电压参考依赖输出电流,输出电流又依赖电压参考,如果这条路径上没有任何状态变量或者延迟,Simulink 会报「algebraic loop」。排查分三步:先用sldiagviewer或者模型诊断面板定位环路经过哪些模块;再确认环路里是否有可以直接改写成状态形式的环节;最后才在关键位置插 Unit Delay 打断。
% 把代数环报错从警告升级为错误,强制暴露问题 set_param(mdl, 'AlgebraicLoopMsg', 'error'); % 保存诊断信息,便于逐条核对 sldiagviewer.reportDiagnostics();插入 Unit Delay 会引入一个控制周期的延迟,对母线电压环来说通常可以接受,但如果插在电流内环里,可能让相位裕度掉几个度。另一种更干净的做法是把下垂环的输出经过一阶低通滤波,既打断了代数环,又抑制了电流采样噪声直接耦合到电压参考。低通时间常数取控制周期的 5 到 10 倍,既能滤噪又不明显影响动态。
直流电网仿真里还有几类常见报错值得记一下:母线电容缺初始电压导致仿真从零起振,给电容设InitialVoltage即可;负载用恒功率模块时母线电压振荡发散,通常是下垂系数过大或者电压环增益过高;开关频率设置与步长不匹配,波形上会出现明显毛刺,把步长压到周期的 1/100 以内一般能解决。
4. 批量仿真到报告:脚本跑参数、导出数据、自动生成 PPT
4.1 用 sim 命令做参数扫描与批量运行
手工改一个参数、点一次运行、看一眼波形,跑五组就要半小时。用脚本把模型参数化,一次跑完并记录指标,是整理报告的效率分水岭。做法是把要扫描的参数在模型里做成变量,然后用set_param在循环里改值,用sim命令触发运行。
% 扫描五组下垂系数,记录稳态电压和最低跌落 R_d_list = [0.2 0.4 0.6 0.8 1.0]; mdl = 'dc_grid_droop'; load_system(mdl); result = zeros(numel(R_d_list), 3); for k = 1:numel(R_d_list) % 用变量名绑定参数,避免字符串拼接出错 set_param([mdl '/R_droop'], 'Gain', num2str(R_d_list(k))); out = sim(mdl, 'ReturnWorkspaceOutputs', 'on', ... 'SaveOutput', 'on', 'StopTime', '0.5'); vdc = out.get('Vdc'); % To Workspace 记录的母线电压 t = vdc.Time; d = vdc.Data; result(k, :) = [R_d_list(k), min(d), d(end)]; end disp(array2table(result, 'VariableNames', ... {'R_d','V_min','V_steady'}));ReturnWorkspaceOutputs打开后,sim返回的是 SimulationOutput 对象,用get按信号名取数据,比依赖工作区变量名更稳。SaveOutput配合 To Workspace 模块记录信号,两者缺一,后面取数据会落空。StopTime在命令行覆盖模型里的设置,便于对不同工况用不同仿真时长。
跑参数扫描时有一点要留意:每组仿真结束后,工作区里的旧数据不会自动清掉,如果信号名有重名会取到上一轮结果。循环里用out.get按对象取数就能规避这个问题,比evalin('base', ...)安全得多。
4.2 To Workspace 与数组读:把波形变成可分析的数据
To Workspace 模块的 Save format 有三个常用选项:Timeseries、Structure With Time 和 Array。要画图、要算极值,选 Timeseries 最省事,Data和Time两个字段直接可用;要做批量数据拼接或者喂给别的算法,选 Array,输出就是纯数值矩阵,不带时间列,读取时自己配时间向量。
% 把 To Workspace 设为数组格式,便于矩阵运算 set_param([mdl '/Vdc'], 'SaveFormat', 'Array', ... 'VariableName', 'Vdc_arr', 'SampleTime', '-1'); % 仿真后 Vdc_arr 是 N×1 的数值列,配时间向量即可分析 t = (0:size(Vdc_arr,1)-1)' * 1e-6; % 固定步长 1 us V_ripple = max(Vdc_arr) - min(Vdc_arr);SampleTime设为-1表示继承上游信号采样时间,电力系统部分信号一般是固定步长,继承就够了。数组格式丢掉时间列之后,时间向量必须自己按步长重建,重建的步长和 powergui 里的 SampleTime 必须一致,否则画出来的波形时间轴是错的,这种错误在汇报时很容易被追问。
数组读还有一层价值:把多组仿真结果按列拼成一个大矩阵,一次性做统计或者画族图,比一组一组画快得多。矩阵运算部分的写法没有特殊要求,mean、max、std都是按列操作,拼好直接算。
4.3 用 Report Generator 把结果填进 PPT 模板
报告 PPT 反复手工截图粘贴是纯体力活。Report Generator 的思路是先做一个 pptx 模板,在母版里定义好版式名和占位符名,再用脚本往占位符里填文字和图片。模板里的版式名要和脚本里的字符串完全一致,这是最常见的失败原因。
import mlreportgen.ppt.* % 第二个参数是模板文件,版式名在母版里预定义 ppt = Presentation('dc_grid_report.pptx', 'dc_grid_template.pptx'); open(ppt); % 结果页:标题用占位符替换,图用 Picture 插入 slide = add(ppt, 'Title and Content'); replace(slide, 'Title', '不同下垂系数下的母线电压'); replace(slide, 'Body', ... sprintf('R_d=0.5 时最低电压 %.1f V,稳态 %.1f V', ... V_min, V_steady)); add(slide, Picture('vdc_compare.png')); close(ppt); rptview(ppt);Presentation第二个参数省略时用内置空白模板,生成的版式很朴素;给了模板文件,才能用自定义版式名。replace的第一个参数是占位符名字,在 PowerPoint 母版的版式里能看到;名字写错不会报错,只会静默不替换,这是排查时最耗时间的一类问题。图片建议先存成 png,用print或exportgraphics导出固定尺寸,脚本在别的机器上跑时也能得到一致版面。
把仿真循环和报告生成串在一起,就形成了一条从参数到 PPT 的流水线:改参数列表、跑一轮、输出报告,中间不用人工介入。汇报前需要改结论,改脚本里的文案就行,不用重新截图。
5. 模型整理与静态检查:让直流电网模型能交付、能复用
5.1 分层、命名与信号线的整理习惯
模型跑通之后不整理,过两周自己都看不懂。直流电网模型建议从第一层就分三块:电气主电路、控制系统、测量与记录。主电路再按支路拆子系统,控制部分按外环、内环、调制拆。子系统命名用英文加下划线,信号线统一命名,避免出现几十条Signal 1到Signal 47。
参数不要散落在各模块对话框里,全部提到模型工作区的变量里,用Simulink.Parameter或者数据字典集中管理。改一个下垂系数要翻五个模块改五次,是交付模型最典型的问题。信号记录统一用 To Workspace 加日志,别用一堆 Scope 截图。
5.2 Model Advisor 静态检查项怎么挑
Model Advisor 的检查项很多,直流电网模型优先跑这几类:求解器设置一致性、代数环检查、未连接端口与未使用信号、单位与量纲一致性、采样时间传播。命令行方式跑一遍更省事:
% 加载模型后按检查 ID 跑指定项 load_system('dc_grid_droop'); ModelAdvisor.run('dc_grid_droop', ... {'mathworks.maab.jc_0001', 'mathworks.design.UnconnectedLines'}, ... 'DisplayResults', 'Details');检查结果里,未连接端口和重复信号名这两项修起来最快、收益最直接。求解器一致性检查能发现功率级步长和控制环步长比例失调的问题,这种问题在波形上表现为高频振荡,肉眼很难归因。
5.3 导出 FMU 与生成 C 代码的边界
模型要交给别人做联合仿真,导出 FMU 是通用性最好的选择,在 Simulink 里通过导出功能选择协同仿真或模型交换模式,生成的 fmu 文件能被多数支持 FMI 的仿真工具直接加载。要注意的是,含 Simscape 电力系统元件的部分通常无法直接导成 FMU,常见的做法是把电气部分和控制部分分开,只导出控制逻辑,电气模型在目标平台里另外搭。
要往嵌入式目标上部署控制器,走代码生成路线更合适,把控制子系统单独拎出来配成代码生成模型,选固定步长离散求解器,配置目标文件后生成 C 代码。这一步的前提是控制部分本身已经离散化、没有连续状态、没有代数环,前面几章做的整理工作在这里全部变现。电气主电路部分不参与代码生成,它只是仿真验证用的被控对象。
本文还有配套的精品资源,点击获取