
大概从2020年开始我陆续做了好几套电力电子相关的仿真模型但真正让我觉得这玩意儿能拿得出手的是这套高压直流输电在线监测仿真模型。坦白说HVDC系统本身不算冷门Simulink里有现成的示例但绝大多数示例停留在能跑出波形的阶段。这次的设计目标很明确不仅要仿真高压直流输电的运行特性还要把故障监测做进去并且让使用者能通过GUI界面直接修改参数、观察结果——而不是每次改个电阻值都要去翻Simulink模块。这篇文章就把这套模型的完整设计思路、关键实现细节和踩过的坑全部拆开讲适合三类人看正在做HVDC相关毕业设计的学生、需要快速搭建直流输电仿真平台的工程师、以及想把Simulink模型封装成“工具”而不是“脚本”的仿真爱好者。1. 高压直流输电在线监测到底在监测什么1.1 HVDC系统里哪些环节最容易出故障在设计监测逻辑之前得先把高压直流输电系统的基本结构理清楚。一个典型的双端HVDC系统包含整流侧和逆变侧中间是直流输电线路。整流侧把交流电变成直流电逆变侧再把直流电变回交流电送进受端电网。这个过程中最核心的器件是晶闸管换流器针对远距离大容量输电工程上普遍采用12脉动换流器结构。从故障监测的角度看HVDC系统里最常出问题的地方集中在三个位置换流器本身晶闸管触发故障、换相失败是直流输电特有的故障类型故障发生后直流电压会骤降直流电流急剧上升。直流输电线路极对地短路故障、极间短路故障一旦发生就是系统级的严重冲击。交流侧整流侧或逆变侧交流母线发生短路会导致换相电压畸变同样可能诱发换相失败。这套模型的核心监测对象就是上述故障。打个比方在线监测系统相当于给直流输电系统装了一个体检仪时刻盯着电压、电流这些生理指标一旦指标异常马上判断出是哪里出了问题并且给出告警。1.2 在线监测与离线仿真的本质区别很多初学者会混淆仿真和在线监测仿真这两个概念。普通的高压直流输电仿真比如Simulink自带的示例重点在于研究系统的稳态特性和暂态过程你设置一个故障时间仿真跑完然后分析波形——这是离线分析。而在线监测仿真模型核心在于实时性和自动判断。它要模拟的是如果这套监测系统真的装在换流站里它能不能在故障发生后的几个毫秒内识别出异常并给出正确的故障类型判断。所以模型里必须包含信号采集模块、特征提取模块、故障判别模块和结果输出模块。我在设计时的思路是Simulink主模型负责搭建电网和换流系统的物理模型产生真实的电气量波形同时在模型中嵌入监测逻辑——采集直流电压、直流电流和交流侧三相电压经过特征量提取后通过阈值判断来识别故障类型。GUI界面则承担参数设置和结果展示的功能。这个框架设计决定了整个模型不是单向的信号流而是存在两条路径一条是物理系统仿真路径另一条是监测算法路径。两条路径在模型中是并行执行的这才叫在线监测。2. 仿真模型的主回路搭建从交流源到直流线路的参数选择2.1 12脉动换流器与换流变压器的接线方式主回路是整个模型的基础监测模块再花哨底层的电气模型不准监测结果就是空中楼阁。Simulink里的Simscape Electrical也就是原来的SimPowerSystems提供了完整的HVDC仿真模块但我建议不要直接用现成的HVDC System示例而是自己动手搭这样才能完全掌控参数。12脉动换流器由两组6脉动换流器串联组成两组换流器分别通过Y/Y和Y/Δ接线的换流变压器供电交流侧电压相差30度电角度。这样做的好处是直流侧电压纹波明显减小交流侧谐波也大幅降低。搭建步骤如下交流电源用Three-Phase Source模块我习惯把额定电压设为230kV线电压频率50Hz短路容量根据输送功率来定。换流变压器两组变压器一组Y-Y接线一组Y-Δ接线变比根据整流侧和逆变侧的直流电压要求计算。这里要注意变压器漏抗的取值直接影响换相重叠角是控制系统设计的重要参数我取的是0.18pu。换流器用Universal Bridge模块选择晶闸管Thyristor类型桥臂数为3两组桥串联成12脉动结构。平波电抗器串联在直流线路上主要作用是抑制直流电流纹波和防止低负荷时电流断续。电感值一般取0.5H到1H之间我取的是0.6H效果比较合适。直流线路用PI型集中参数线路模型或者分布参数线路模型长度按实际工程设定比如200km。分布参数模型更接近真实波过程但仿真步长会受限可以根据需要权衡。整流侧和逆变侧的交流电压等级可以设成一样也可以设成不同比如整流侧230kV、逆变侧230kV。直流额定电压我设为±400kV即800kV双极额定电流1kA对应的双极输送功率就是800MW。这些参数不是拍脑袋定的要和控制系统里的参考值对应起来不然控制系统会失稳。2.2 平波电抗器与滤波器的取值逻辑很多初学者不重视平波电抗器和交流滤波器的参数直接拿来默认值用,结果仿真波形里全是谐波监测算法根本没法判断故障。这两个环节恰恰需要认真对待。平波电抗器是直流侧的蓄水池它的作用有两个一是平抑直流电流纹波二是在故障或扰动时抑制电流变化率。电感值太小时直流电流纹波大影响了故障阈值判断的敏感性电感值太大时系统响应变慢换相失败后的恢复时间被拉长。工程上通常按额定直流电流下电流纹波不超过10%来选。对1kA额定电流、800kV直流电压的系统0.6H左右的电感量是个合理的起点。交流侧滤波器同样重要。6脉动换流器会在交流侧产生5、7、11、13次等特征谐波12脉动结构下5、7次谐波大幅抵消但11、13次仍然显著。我给整流侧和逆变侧各加了一组高通滤波器和双调谐滤波器在Simulink里用RLC串联支路搭建即可。滤波器的存在会让交流母线电压波形更正弦监测算法提取基波幅值时更准确。这里有一个设计技巧交流母线上放一个Three-Phase V-I Measurement模块测出来的三相电压和电流直接作为监测算法的输入信号源。如果滤波器参数不对这个测量值会严重畸变后面所有的FFT分析都会失真。所以先调好主回路再做监测模块。3. 故障监测算法不是报错而是判断3.1 信号采集与特征提取怎么做监测算法是本设计的核心。它要回答三个问题有没有故障故障是什么类型故障发生在哪一侧我采用的是直流电气量交流电气量联合判据。传感器层面用Simulink里的电压电流测量模块采集以下信号整流侧直流电压Udr逆变侧直流电压Udi直流线路电流Id整流侧交流母线三相电压Ua、Ub、Uc逆变侧交流母线三相电压这些原始信号经过处理后提取出几个关键特征量直流电压平均值、直流电流平均值、直流电压纹波系数、交流电压基波幅值、交流电压谐波畸变率THD。其中FFT分析用Simulink的Powergui模块里的FFT Analysis工具可以离线做但如果要在模型运行过程中实时计算THD需要自己搭一个滑窗FFT或者用RMS模块加带通滤波器近似提取基波。我的做法是在模型里用Analog Filter Design模块加带通滤波器中心频率50Hz提取基波分量再和总信号的有效值做比值运算近似得到畸变率。这个方法比每步都做完整FFT要快很多而且在线监测场景下够用。针对换相失败故障最灵敏的特征量是直流电压的跌落和直流电流的上升。因为换相失败时逆变侧的晶闸管未能按要求关断相当于桥臂直通直流侧相当于短路电压骤降、电流飙升。这个特征非常明显检测速度可以做到几个毫秒以内。3.2 阈值判定与时窗配合的误报抑制故障判断不能只设一个阈值就完事否则系统正常运行时的波动都会引发误报。直流输电系统在功率升降、交流电压波动时直流电压和电流本来就会有变化。为了区分正常波动和故障我设计了三层判定逻辑第一层越限检测。直流电压低于额定值的80%或直流电流高于额定值的1.2倍持续超过1ms才进入疑似故障状态。这个持续时间窗口很重要可以有效滤除瞬时尖峰干扰。第二层变化率检测。故障时直流电压的变化率远大于正常扰动时的变化率所以dU/dt超过某个阈值也是判据之一。注意变化率检测容易受噪声干扰信号进判定逻辑前要先经过低通滤波。第三层交流侧特征验证。如果判定为所属极的故障还需要验证交流母线电压是否同步跌落、是否有谐波畸变。这一步是为了区分直流线路故障和换流器内部故障——前者交流侧电压通常保持基本稳定后者交流侧电压会明显畸变。这套三级判据做下来误报率显著下降。我在仿真中测试过交流系统电压在正负5%范围内波动时监测系统不会误报而设置直流线路短路故障后系统能在故障发生后约5ms内正确识别出故障类型。这个速度对在线监测来说是达标的。需要特别说明监测算法毕竟是基于仿真信号设计的实际工程中的信号噪声、传感器延迟、温度漂移等因素在仿真里很难完全复现所以仿真模型的监测效果代表了理想条件下的上限。工程化部署时还需要加滤波、去偏置、自检等环节。4. GUI界面让仿真模型变成能交付的工具4.1 参数设置面板的设计逻辑模型本身跑通了但如果没有GUI界面每次改仿真参数都要打开Simulink模型去翻模块、改对话框效率低还容易出错。这套设计的另一个亮点就是专门做了一个GUI界面把参数设置和结果显示集中在一个窗口里。GUI用MATLAB的App Designer实现。App Designer是现在MATLAB官方主推的GUI开发环境比老旧的GUIDE好用太多布局灵活代码逻辑清晰。整个界面分成三个核心区域左侧是参数设置区包含以下可设参数交流系统电压等级直流额定电压与额定电流直流线路长度故障类型选择整流侧交流短路、逆变侧交流短路、直流线路短路、换相失败故障发生时刻故障持续时间针对瞬时性故障中间是控制区包括开始仿真暂停停止按钮以及仿真进度条。右侧是结果显示区我用的是Axes组件可以同时显示直流电压、直流电流、交流三相电压和监测状态指示。参数设置区的核心是用回调函数获取用户在输入框里填写的值然后把这些值写入Simulink模型的工作区变量。Simulink模型里的参数不要写死全部定义成变量名比如Uac、Udc、Idc、LineLen、FaultType、FaultTime、FaultDur然后在模型初始化回调或PreLoadFcn里给这些变量赋初值。GUI运行时用户点了应用参数按钮回调函数就更新这些变量的值然后调用sim()函数启动仿真。这里有个细节值得一说在App Designer里调用sim()不要用默认的在模型窗口打开仿真方式那样会弹出一个独立的Simulink界面灰常不友好。正确做法是设置simulation input对象把仿真配成不打开模型窗口只在后台运行然后把仿真结果通过get()或SimulationOutput对象的变量名取回来再在GUI的Axes上重绘。这样整个操作体验就像在操作一个独立的软件而不是在操作Matlab和Simulink。4.2 图形化实时显示的实现方法在线监测最有说服力的呈现方式是动态波形。仿真跑起来以后波形应该像示波器一样实时刷新而不是等仿真全跑完了才一次性画出来。实现方法有几种我尝试过两种比较靠谱的方案方案一利用Simulink的Scope模块加Log simulation data功能仿真结束后一次性读取所有数据再在GUI里播放式重绘。这个方案实现简单但严格来说不算实时只是回放。方案二把仿真配成实时模式在仿真循环的每一步通过set_param的仿真回调或者Block Callback来更新GUI。具体做法是使用sim()加External模式或者用Simulink的Pace功能让仿真速度接近实时。然后每积累一定数量的数据点就刷新一次GUI图形。这个方案更有在线监测的味道但性能消耗大调试复杂。考虑到在线监测这个概念本身强调的是监测逻辑而不是渲染技术我在最终版本里采用了方案一的增强版设置一个时间步长每仿真200毫秒暂停一次读取最近一个时窗的数据并刷新曲线。这样在观感上已经非常接近实时监测了而且代码稳定不会因为GUI刷新瓶颈导致仿真卡顿。为了方便查看不同故障特征界面上我加了几个复选框可以自由选择显示哪条波形比如只看直流电压、只看直流电流、两者叠加对比。相邻的波形会标注当前监测状态正常用蓝色文本故障告警用红色文本同时显示对应的故障类型文字。这样即使不懂仿真技术的人也能一眼看出系统当前处于什么状态。5. GUI与Simulink的交互机制及常见报错解决5.1 参数从GUI到模型工作区的传递链路很多人没搞清楚App Designer的run函数机制容易在这里掉坑。App Designer运行后它是一个独立的同名函数和Simulink模型之间不能直接共享工作区变量。如果你在App Designer的回调里直接写Udc400e3然后指望Simulink模块里的表达式Udc能自动用这个值是行不通的。正确的传递链路是这样的% 在App Designer回调中更新基础工作区变量 assignin(base, Udc, str2double(app.UdcEditField.Value)); assignin(base, Idc, str2double(app.IdcEditField.Value)); assignin(base, FaultType, app.FaultTypeDropDown.Value);assignin(base, ...)把值写进MATLAB基础工作区Simulink模型在仿真时默认从基础工作区解析变量。还有一种比较推荐的做法用Simulink.SimulationInput对象这样不污染全局工作区更干净适合做批量仿真。simIn Simulink.SimulationInput(HVDC_Monitor_Model); simIn simIn.setVariable(Udc, 400e3); simIn simIn.setVariable(FaultType, DC_Line_Fault); simOut sim(simIn);个人建议优先用setVariable方式它只对当前这次仿真生效避免了上一次仿真遗留参数污染下一次仿真的问题。这个问题在频繁修改参数做对比实验时格外明显我也在第一次做参数扫描时被它坑过。5.2 signal数据从Simulink到GUI的回传方法仿真跑完后结果数据通过仿真输出对象返回。配置方法是在模型的Configuration Parameters里勾选Signal logging或者在每个需要观测的信号线上右键选择Log selected signals。推荐在信号线上显式标注并且启用记录这样输出结果里会有清晰的信号名字而不是一堆默认的logsout。写法如下% 仿真结束后从simOut中提取记录的信号 logsout simOut.logsout; Udc_sig logsout.getElement(Udc_measured).Values.Data; Idc_sig logsout.getElement(Idc_measured).Values.Data; t_sig logsout.getElement(Udc_measured).Values.Time; % 在GUI的坐标系上绘图 plot(app.UIAxes, t_sig, Udc_sig, b, LineWidth, 1.2); hold(app.UIAxes, on); plot(app.UIAxes, t_sig, Idc_sig, r, LineWidth, 1.2); legend(app.UIAxes, {直流电压, 直流电流});有一点要注意信号线尽量放在模型的顶层或封装的输出端口上避免从子系统内部直接引线记录。如果你封装了自己的监测子系统需要把关注的信号引到子系统的输出端口然后在顶层再连一个Goto/From标记或者To Workspace模块这样GUI拿数据更直接。我一开始图省事直接在子系统内部信号线上用了Logging结果信号名变成了一长串路径从GUI里解析数据要写一堆字符串处理代码非常麻烦。后来改成在子系统边界引线后清爽很多。5.3 模型回调与GUI刷新时机的一致性在线监测场景下GUI刷新频率不需要太高太高反而会引起视觉负担和性能瓶颈。人眼能流畅感知的帧率在20到30帧每秒左右就够了折算到仿真时间上我没有做真正的逐帧直播而是按固定间隔采样显示。实现时我在仿真代码里用了waitfor配合drawnowfor k 1:numSteps % 执行一次短时仿真每次推进一个时窗 simIn simIn.setStopTime(k * windowLength); simOut sim(simIn); % 更新GUI显示 updatePlots(app, simOut); drawnow; end每次循环只往前推一个时间窗仿真结束点逐步增加这样GUI上每次刷新时再画最近一个时间窗的数据就产生了类似滚动播放的在线监测效果。这个方法实现简单缺点是多次调用sim()会带来重复的模型编译开销。解决办法是第一次调用前先对模型执行一次Simulink.BlockDiagram.buildRapidAcceleratorTarget生成加速目标后续调用就能明显加快速度。实测下来一个20秒的仿真场景按5秒一个时窗切分,相比一次性跑完再回放总耗时只多出20%左右但交互体验好了非常多。6. 换相失败仿真验证与GUI联动实测结果6.1 典型故障场景的设计与参数配置为了验证监测算法的有效性我在GUI里预设了四类典型故障场景并逐一测试整流侧交流母线单相接地短路故障。逆变侧交流母线三相短路故障这也是最容易诱发换相失败的场景。直流线路极对地短路故障。逆变侧触发脉冲丢失导致的换相失败。以换相失败场景为例触发方式不是在Simulink里直接改晶闸管参数而是在GUI里设置触发丢失时刻。模型内部我预留了一个触发脉冲使能信号正常情况下为1在设定的故障时刻变为0持续一个工频周期后再恢复。这样做的好处是故障注入方式可控便于对监测算法进行量化评估。6.2 仿真结果与监测算法的对应关系测试结果显示换相失败故障发生后逆变侧直流电压在故障发生后的1到2毫秒内迅速下坠直流电流同时飙升。监测算法的三层判据中变化率判据最先被触发直流电压低于80%额定值的判据在约2毫秒后被触发最终故障类型判定为换相失败并在GUI界面给出红色告警全过程约5毫秒。在50Hz系统中这个检测速度是令人满意的。直流线路短路故障的特征则不同整流侧直流电压同时跌落但因为平波电抗器的限制直流电流的上升速率低于换相失败场景。所以即便两种故障都表现为直流电压下降、电流上升特征量的细微差异仍然让监测算法能够区分。我在GUI里专门做了一个故障类型识别结果文本区域每次仿真结束后不仅显示告警还会显示一条置信度条。这个置信度其实不是机器学习那种概率输出而是三个判据中有几个判据同时满足的加权分数。这样一来即使出现未预料的复杂故障操作人员也能从置信度高低看出当前判断的可信程度。7. 调试心得那些文档里不会写清楚的坑7.1 换流变压器饱和特性的处理Simulink自带的变压器模型有饱和特性设置如果你为了简化把饱和特性完全关闭会遇到一个很严重的失真问题换流器正常工作时变压器铁芯会积累磁链偏置导致励磁涌流波形不对称进而让交流侧电流的谐波含量偏离理论值。这个偏差会直接影响我的交流畸变率判据。解决方法是把变压器的饱和特性打开并按变压器容量设置合适的饱和拐点参数膝点电压与励磁电流。我最开始偷懒关掉了饱和特性结果监测算法在变压器空载合闸时误报了一次交流侧故障查了很久才意识到是励磁涌流的锅。7.2 求解器类型对故障监测延迟的影响模型默认的求解器是变步长ode45精度不错但故障发生时电气量变化很快变步长求解器会自动把步长压得很小导致仿真速度急剧下降。对于在线监测仿真我不需要极高的精度重点是捕捉故障暂态的趋势。后来我把故障相关的主回路改成了固定步长步长设为5微秒并用ode23tb刚性求解器处理。这样在保证能捕捉到晶闸管换相细节的前提下仿真速度提升了约三倍。要留意的是换相失败仿真对步长很敏感步长太大会出现虚假的换相失败步长太小则跑得极慢。5微秒是我在800kV/1kA参数下反复测试出的平衡点换到别的电压等级和电流等级这个值可能需要重新校准。7.3 波形显示的数据量控制Simulink默认会把所有记录的信号都存到内存里。如果信号多、仿真时长长内存占用很容易爆掉。我在模型里对待存储信号做了降采样处理用一个Rate Transition模块或者Signal Conversion模块把记录频率从5微秒降到50微秒。数据显示需要的分辨率远低于仿真计算分辨率50微秒的记录间隔在GUI绘图时已经非常平滑了而内存占用直接降了一个量级。8. 经验总结与后续扩展方向做完这套模型我最深的体会是一个HVDC在线监测仿真模型的难点从来不是把模型跑起来而是让模型既能反映物理过程的复杂性又能被监测逻辑稳定地解读。这两者之间存在天然的张力。物理模型太细仿真速度慢、信号噪声多物理模型太粗监测算法学到的是玩具模型里的规律脱离实际。找到这个平衡点需要大量的测试和参数调整。如果你要在这套模型上继续扩展我觉得有几个方向值得考虑加入双极模型目前模型是单极工程上高压直流输电绝大多数是双极结构正负极之间存在电磁耦合故障特征更丰富。加入直流断路器模型直流故障电流没有自然过零点短路开断是直流电网的难点在模型里加入直流断路器并监测其开断过程可以研究故障隔离策略。把监测算法换成机器学习先用这套模型生成大量含标签的故障样本再用这些样本训练分类器理论上可以得到比阈值判定更强的泛化能力。对我来说这个项目的意义不只是交付了一个能用GUI操作的仿真工具更在于通过反复调试和验证把高压直流输电从书本上的整流逆变公式变成了看得见摸得着的动态过程。如果你也想做一个类似的仿真模型我的建议是别急着在GUI上花时间先把主回路搭对、把故障特征摸清楚GUI只是最后一层包装。底子扎实了上面的东西都是锦上添花。