ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

高压直流输电在线监测Matlab仿真模型与GUI调参界面设计

高压直流输电在线监测Matlab仿真模型与GUI调参界面设计

前阵子和同行聊高压直流输电在线监测,有人第一句就问:你那个Matlab模型能不能直接用来挂现场数据?这个问题问得挺典型,说明不少人把仿真模型和真实监控系统搞混了。我这篇内容想聊的,是一套可复现的高压直流输电在线监测Matlab仿真模型,以及为了快速调整监测参数而配套设计的GUI界面。它不替代真实换流站里那套在线监测平台,而是让你在做方案验证、算法测试、教学演示的时候,不必每次改一个参数就重新搭一遍模型、改一遍代码——模型本身跑得稳,界面又能把调参过程压缩到点几个按钮、填几个数,仿真和监控之间的衔接自然会顺很多。

对于刚接触这块的朋友,这套东西最大的价值在于“看得见摸得着”。你不需要真的去接触几百千伏的设备,就能知道某个参数变化后直流电压波形怎么动、触发角跟着怎么变,GUI上实时刷新出来的曲线能直观反映系统状态。这也是我为什么一直推荐用Matlab做这类在线监测的预研——安全、快速、改起来没有心理负担。

1. 高压直流输电在线监测到底要监测什么

1.1 监测对象拆解:换流站、直流线路、控制系统

很多人一提“在线监测”,第一反应就是“监测个电压电流呗”,真做起来才发现完全不是这么回事。高压直流输电系统的监测对象至少要拆成三个层面。

第一层是换流站设备状态。整流站和逆变站是整个系统的核心枢纽,晶闸管阀组在换流过程中承受的电压电流应力非常大,监测触发角、熄弧角、换相失败次数、阀组温度这些量,比单纯看一路直流电压信息量大得多。换相失败是直流输电系统最常见的动态扰动之一,一旦发生,直流电压会瞬间跌落,交流侧电流畸变,如果不及时监测到,可能引发后续的闭锁甚至停运。

第二层是直流线路本身。直流线路的监测重点又和交流线路不一样,交流系统大家更关注绝缘状态和闪络,直流系统则要把纹波、谐波、接地故障电流看在前面。直流输电线路发生单极接地故障的概率在实际运行中很高,故障瞬间暂态过电压和过电流的形态,跟我们平时做稳态仿真看到的完全两个样,监测模型里如果没有把这些量引出来,你后面写保护逻辑就少了最重要的输入。

第三层是控制保护系统的逻辑量。指令值、反馈值、PI调节器输出、触发脉冲状态,这些信号在在线监测里面属于“软信息”,但恰恰是判断系统有没有在健康工况下运行的关键。比如定电流控制模式下,电流指令从1.0倍额定突然降到0.5倍,监测端应该看到触发角平滑调整,而不是阶跃跳变;如果波形里出现振荡,说明控制器参数匹配有问题。

把这三层拆开后,在线监测系统的功能边界就清楚了:不是简简单单在模型输出端挂几个Scope看波形,而是要对关键物理量和控制量做连续跟踪、趋势记录、异常识别。

1.2 为什么Matlab仿真适合做这件事

做在线监测研究,摆在面前的有三条路:接真机、搭动模实验平台、做数字仿真。

接真机最真实但你基本没这个机会,哪怕是电网公司自己的研究人员,能拿到的数据也有限,更不用说反复做故障注入测试。动模实验平台能比较真实地模拟换流过程,但一套平台的成本高、占地大、调试周期长,而且改一个主回路参数往往要动硬件,痛苦得很。

数字仿真在这时候就显得特别合适。Matlab/Simulink的优势不是计算速度——说实话纯电磁暂态仿真它不算最快——而是建模灵活性和参数化能力。你可以把整个高压直流输电系统拆成若干模块,电气主回路、控制策略、监测逻辑各自独立修改;SIMULINK里边的参数可以直接和GUI控件绑定,改界面上的数值,仿真模型里对应的参数跟着变,这在实际实验平台上是根本做不到的。

还有一点,用Matlab做在线监测仿真,你能很方便地把故障场景“演”出来。直流线路短路、换流变侧故障、交流系统单相接地,这些在真实系统里不能随便试,在仿真模型里只是一个开关动作或者一个故障模块配置的事。模型里把故障状态接进监测模块,就能看到在线监测系统在扰动下是怎么响应的。

2. 搭建模型前先算清楚这组参数

2.1 主回路参数估算

很多人习惯拿到模型就开拖模块,我觉得这是仿真最容易跑偏的地方。高压直流输电系统的仿真模型必须建立在合理的主回路参数基础上,否则后面控制参数怎么调都别扭。

我这里用一个典型的双极12脉波系统作为例子。额定直流电压设为±500kV,额定输送容量1000MW,单极就是500MW。额定直流电流等于单极功率除以单极电压,也就是500MW/500kV,算出来是1000A,这个数很常规。

接下来是换流变压器侧电压的估算。12脉波换流器的直流电压和换流变阀侧空载电压之间有个基本关系式,在理想情况下直流电压等于2.7倍的阀侧线电压有效值乘以余弦触发角。实际工程中要考虑换相压降和直流压降,所以阀侧电压一般会取得比理论值高一些。

平波电抗器的选取也值得说。它的作用一是平抑直流电流纹波,二是在低负荷时维持电流连续。实际仿真里如果电抗器取小了,直流电流会出现断续,控制系统的定电流调节会变得很不稳定;取大了又会拖慢动态响应。通常仿真模型里取0.1H到0.5H之间比较合适,具体看你要仿真的工况更偏稳态还是更偏暂态。

这些参数我建议你写成一个独立的脚本或者直接做成GUI里的基础参数输入项,不要散落在Simulink的各个模块参数框里,后面调参的时候统一管理,效率高很多。

2.2 线路和负载的等效处理

直流输电线路的建模方式直接影响监测信号的形态。Simulink里传输线模型有集中参数和分布参数两种,两者的区别讲白了就是一个“压缩”一个“铺开”。

集中参数模型用电阻、电感、电容去等效整条线路,适合长度不是特别长的线路,或者在只关心系统整体稳态响应的场景下用。分布参数模型把线路特性沿长度方向铺开,对暂态过程尤其是故障行波的传播模拟得更准。在线监测这个场景,我建议主线路上用分布参数模型,因为故障暂态里的电压电流变化过程直接决定了监测算法能不能准确捕捉特征。

线路的电阻、电感、电容参数可以按单位公里值来估算。比如取单位长度电阻0.011Ω/km、电感0.88mH/km、电容13nF/km,线路长度200km的话,总阻抗就是这些值乘以长度。这个参数不算精确,但作为仿真预研已经足够反映系统的基本特性。

负载等效这块有个常见误区,就是把逆变站直接接一个电阻负载。真实直流输电系统逆变站通常是接到交流系统上的,整流站定电流控制、逆变站定电压控制,功率自然就送出去了。你挂一个纯电阻其实也能跑,但动态特性和真实情况差太多,监测出来的故障波形没有参考价值。正确做法是在逆变站后面接交流电压源,并做等效阻抗。

2.3 控制参数与监测采样率配合

高压直流输电系统的控制策略,主流方案是整流站定电流控制、逆变站定电压控制(或者定熄弧角控制)。定电流控制的PI参数如果设计不当,在线监测画面上会看到电流长时间振荡,看起来像故障,实际上只是控制参数没调好。

我给的调试思路是先调比例增益,让系统在给定值阶跃时不要发散;然后加积分增益,消除稳态误差。比例增益大了系统响应快但容易抖,小了则响应迟钝,得在阶跃响应曲线上反复观察。

采样率这个事,很多做监测的人容易忽略。Simulink仿真的计算步长和监测模块的采样率不是一回事。如果你只监测直流电压电流的平均值,1kHz的采样率够了;如果你想看纹波和谐波特征,采样率至少要放到10kHz以上。监测模块的处理能力要在模型搭建阶段就预留,否则后面加FFT分析模块时,步长不匹配的问题会逼着你回头改整个模型的求解设置。

在线监测的采样率我一般这样定:稳态监测用1k~5kHz,故障分析用10k~50kHz,两者数据分别存储,界面切换显示,避免数据量过大拖慢GUI刷新。

3. 仿真模型搭建与在线监测信号提取

3.1 主电路模型组装

Simulink里搭建高压直流输电模型,基本思路是区块化的。电源模块、整流站、直流线路、逆变站、交流受端各自独立成子系统,子系统之间通过电气端口连接。

整流站和逆变站的核心是换流桥。Simulink的电力电子库里有现成的晶闸管模块,6脉波换流桥和12脉波换流桥都能直接构建。12脉波换流器需要用两组6脉波换流桥串联、变压器一侧星形一侧三角形联结,实现30度相位差,这是变压器的联结组别要特别注意的地方。

搭建顺序我建议从电源开始。交流源设置为等效无穷大系统,短路容量给大一点,避免仿真过程中因为内阻抗太大导致电压波动失真。然后是换流变压器,注意联结组别和变比要和前面计算的阀侧电压对应起来。晶闸管阀组需要接触发脉冲信号,这个信号从控制子系统里面来,先建立空的控制子系统占位,后面再填内容。

直流线路用分布参数传输线模块,在模块对话框里填长度和单位长度参数。直流电抗器串接在直流极线出口,位置不要放错,它在换流器和直流线路之间。

把这些搭完后,先做一个最简单的开环测试:不给触发脉冲,看看模型能不能初始化成功。这一步如果没过,后面控制闭环调试时问题更难排查。

3.2 触发控制与闭环调节的实现

触发控制是整个高压直流输电模型里最见功力的部分。整流站的晶闸管需要按工频周期逐相触发,触发角的生成要经过锁相环和触发脉冲发生器。

Simulink的标准做法是用锁相环锁定换流母线电压的相位,然后用相位信号加上触发角得到每相晶闸管的触发时刻,再通过脉冲发生器把窄脉冲送到晶闸管的控制端口。这里的角度单位很容易搞错,锁相环输出通常用弧度,触发角习惯用度,必须在转换处乘以pi/180或者在模块里设置好单位匹配。

闭环调节的核心是整流站定电流控制。把直流电流测量值和电流指令值做个比较,误差进入PI调节器,PI输出就是触发角的调整量。需要注意,触发角有一个最小值限制,通常是5度左右,在这个范围以下换流器无法正常工作,会在触发角调节器里加饱和限幅。

逆变站这边常用定电压或定熄弧角控制,仿真里用定电压控制更直观一些。直流电压反馈和电压指令比较,通过PI调节器控制逆变侧触发角。两侧控制器的PI参数不要照抄经典系统的,因为你的主回路参数、系统阻抗可能和参考不一样,必须通过阶跃响应来调整。

3.3 从模型中提取在线监测信号

在线监测信号提取这块,我觉得是仿真模型里最容易被做“浅”的部分。不少人就是从测量模块拖几根线接进Scope就完事,观测和分析其实是两回事。

我的做法是在每个监测点加一个“信号预处理”子系统。举个例子:直流电压测量值进入预处理子系统后,先分三路——一路做均值滤波得到稳态值,一路做差分来捕捉突变时刻,一路送FFT分析谐波分布。三路结果分别输出到数据记录和GUI显示缓冲里,这样在线监测系统就有了基本的分析能力,不只是看波形。

故障工况的注入也要在监测信号里体现。直流线路单极接地故障,监测系统应该同时看到电压跌落、电流突变、保护启动信号这三个层次的变化。为了能在GUI上演示故障过程,模型里要预留故障时间设置口,通常用一个可编程故障模块,设置故障起始时间、持续时间和故障阻抗。

在线监测还要有个“状态量越限”的逻辑,比较监测值和阈值,一旦越限就输出告警标志。阈值怎么设,可以从仿真的正常工况里提取基准值,再乘一个裕度系数。这部分逻辑我建议用Matlab函数块或者Stateflow来实现,比纯Simulink模块搭起来更清晰。

4. GUI界面参数设计与联动实现

4.1 先想清楚界面里该放哪些参数

做GUI之前,我把参数列了一个清单,这个步骤看起来不起眼,实际能省很多返工的力气。参数按照“需不需要在线调整”分成两类。

第一类是主回路参数,额定电压、额定功率、线路长度、平波电抗器电感值。这些参数理论上应该在仿真开始前就设好,不太需要运行中修改,但为了方便做工况对比,我也把它们放进GUI,点“应用参数”后才生效。

第二类是控制与监测参数,电流给定值、PI控制器的比例和积分增益、监测报警阈值。这类参数在在线监测场景下的调整频率最高,是GUI的核心关注对象。

有一个容易犯的错,就是把所有参数不分主次全部铺到界面上。界面一复杂,操作的人反而不知道重点在哪。我最终界面上只保留了12个左右的参数输入项,其余在脚本里给默认值。

4.2 App Designer和Simulink联动的基本原理

Matlab做GUI有App Designer、GUIDE和编程式Figure三种方式。GUIDE基本已经边缘化,新代码我建议直接用App Designer,界面要整齐得多,回调函数的管理也更清晰。

App Designer和Simulink的联动核心就一句话:通过工作区传递参数。GUI里的输入框控件在回调函数里把数值写入Matlab基础工作区,然后调用sim命令启动仿真,Simulink模型里的参数引用基础工作区的同名变量。这个过程我用代码来说明更直白:

function applyParams(app) % 将GUI界面的参数写入MATLAB基础工作区 assignin('base', 'UdN', app.UdNEditField.Value); assignin('base', 'Prated', app.PratedEditField.Value); assignin('base', 'Lline', app.LlineEditField.Value); assignin('base', 'kp_I', app.KpEditField.Value); assignin('base', 'ki_I', app.KiEditField.Value); % 启动仿真模型 sim('hVDC_Monitor_Model.slx'); end

这段代码里,udn、Prated这些变量在Simulink模型的参数框里写的是变量名而不是具体数值。仿真跑起来以后,求解器会自动去基础工作区获取变量值,这样就实现了“界面改参数、模型同步更新”的效果。

运行时调整参数的情况复杂一点,需要用到Simulink的运行时参数接口,通过get_param和set_param直接操作模型内部参数,适合在仿真不中断的情况下调PI参数。这个用法在GUI回调里也很常见,但要注意set_param对参数名的写法非常敏感,写错一个字母就会报错。

4.3 界面布局的安排逻辑

布局直接决定操作效率,我最终采用三区布局:左侧参数输入区、右上曲线显示区、右下状态信息区。

左侧参数输入区做成一个个“标签+输入框”的组合,在App Designer里用Grid布局管理器排布,可读性好。每个输入框标注清晰,连带单位写清楚,比如“直流电压额定值 (kV)”,避免用户填错数量级。

右上曲线显示区放了两个坐标轴,上边显示直流电压和直流电流波形,下边显示触发角变化和告警标志。双坐标轴的好处是不同量纲的信号能放在同一时间轴上对比,故障场景下电压电流和触发角的联动关系一眼就能看出来。

右下状态信息区放了一些数值列表,显示当前监测到的稳态值、越限状态、最近一次的告警时间。这个区域看起来只是展示一些数字,其实对在线监测的体验影响很大,用户不仅需要看波形,还需要有“仪表盘”一样的数字读数来判断当前状态。

界面里还要加“开始仿真”“停止仿真”“导出数据”三个功能按钮。导出数据这个按钮别省掉,在线监测产生的数据如果只能看不能存,后续做离线分析的时候就得重新跑仿真,非常浪费。

4.4 仿真结果回显与动态更新细节

仿真结束后要把结果回显到GUI,这里有个性能问题。如果仿真时间做得很长,结果里可能存了几十万个采样点,直接全部画到坐标轴上,GUI会卡到没法操作。

我的做法是在结果回传时做抽样显示。仿真数据保存为结构体,GUI读入后先判断数据长度,超过一定阈值就对结果显示前做降采样,只保留固定数量的数据点,保证坐标轴绘制流畅。如果用户需要完整数据,通过导出数据按钮存成Mat文件或者CSV。

动态更新的另一个细节是坐标轴范围的自动缩放。初始设计时我把坐标轴的范围设为固定值,结果发现正常运行和故障状态的电压电流幅值差异太大,固定范围要么把波形压扁,要么把故障特征挤到一个角落。后来改成基于历史数据的自适应范围,每次刷新时根据当前数据上下浮动20%来设定坐标轴范围,效果好得多。

数据存储环节要注意,在线监测的数据文件应当包含仿真参数快照,这样重新打开数据文件时能知道当时系统是在什么参数条件下运行的。数据文件里存一个struct,某个字段保存GUI所有参数值,另一个字段保存曲线数据。这个小设计给后续复盘节省了大量的时间。

5. 调试踩坑实录与排查速查表

5.1 仿真不收敛或数值发散的常见原因

跑高压直流输电模型,几乎每个人都遇到过仿真中途报错或者波形剧烈震荡的情况。我调试过程中发现最大的坑是求解器设置。

默认的变步长求解器在大功率电力电子仿真里经常出问题。晶闸管换流过程中开关动作频繁,变步长求解器为了满足误差要求会把步长不断缩小,导致仿真速度变得极慢;反之,如果误差容限设置太宽,步长又可能过大,漏掉换流过程的细节,波形出现尖刺。

我的建议是仿真固定步长求解器,步长根据你关注的最高频率确定。比如你想监测高达50kHz的信号,步长至少设在20微秒以下,一般我会留5倍的余量,用1e-6秒的步长跑。固定步长配合电力电子专用求解器,稳定性明显提升。

还有一个常见问题是模型初始化失败。高压直流输电系统有大电容大电感,如果电源初始相位设置不当,启动瞬间可能产生异常的过电流。在直流电抗器和换流变里注意设置初始电流为零,让模型从零状态开始建立稳态,而不是默认的稳态初始化。

5.2 GUI参数和模型不同步的坑

GUI参数和模型不同步,最典型的表现是:界面上改了额定电压,波形却一点变化都没有。这个问题容易在两种情况下出现。

第一种是把参数以具体数值写死在了Simulink模块里,GUI无论怎么改都影响不到模型。排查方法很简单,打开模块参数框,看填入的是数值还是变量名。如果是数值,改成GUI里写的那几个变量名,然后勾选“参数数据源变量”。

第二种是Simulink模型没有从基础工作区读取参数。仿真运行过程中,如果你在基础工作区改了变量值,正在运行的Simulink模型不会自动感知,除非你在GUI回调里显式调用set_param或者sim卡住了等待更新。这个问题的避免思路是区分“启动前参数”和“运行中参数”。启动前参数通过工作区传递,运行中参数通过set_param直接写入模型内部对象。

我给个很实用的做法:模型里所有和GUI联动的参数都用同一个前缀命名,比如gui_UdN、gui_Idc、gui_kp,这样无论是排查还是写回调,看到变量名就知道它是从界面进来的,不会和模型内部计算用的中间变量混淆。

5.3 常见问题排查速查表

我把调试中遇到的问题整理成一张速查表,系统性地记录下来,后续再做类似项目时按表排查:

现象可能原因排查思路
仿真启动即报错“仿真停止”模型初始化失败、电气节点未正确连接先检查是否存在开路节点,所有电气端口必须接在闭合回路中
直流电压波形振荡发散PI参数过大、平波电抗器取值过小减小比例增益,观察波形是否收敛,再逐步调积分
触发角超出正常范围锁相环相位不准、PI输出未限幅检查锁相环输出信号,在PI输出端加饱和模块
GUI改了参数波形不变模型模块内参数是硬编码数值检查参数框里填的是变量名还是数值,变量名必须和GUI一致
波形刷新卡顿回传数据量过大,GUI绘全数据处理慢结果显示前先降采样,限制坐标轴上数据点数量
故障波形不明显故障模块未连接主电路或阻抗设置过大检查故障模块位置,尝试将故障阻抗调小
稳态数据和理论值偏差大换流变阀侧电压取值不合理根据直流电压和控制角重新核算变比

调试的过程中要多注意保留对比数据。改一组参数前先记录当前的波形和数据,改完后再对比,这样能快速定位参数的作用方向。反正我在做了多次这种对比以后,确实发现比盲调效率高出不少。

6. 关于这套模型后续还能怎么扩展

模型和GUI做到这一步,已经能覆盖常规的高压直流输电在线监测仿真需求。如果你想把它的价值再挖掘一下,有几个方向我觉得很值得尝试。

把监测数据接上故障诊断算法。现在模型里已经有了告警判断逻辑和故障注入接口,数据出口预留了,接一个简单的故障类型识别算法并不难。比如用直流电压暂降深度、电流突变极性做简单的特征量分类,能识别出单极接地和双极短路的差异,这就比纯看波形又进了一步。

把界面做成可扩展的监测方案验证平台。现在GUI里的参数都是固定的,你可以加一个“自定义参数导入”功能,让用户从表格里导入一组参数批量跑仿真,自动生成对比报告。这个功能对需要做多工况参数扫描的场景特别有用,能节省大量重复操作的时间。

把仿真模型的数据接口设计成和真实监测系统的数据格式兼容的格式。预留一个数据转换层,把Simulink仿真结果的数据格式映射到实际在线监测系统的常用数据格式,后面如果有机会接入真实系统的历史数据做回放验证,模型就能直接复用。

最后说一点我自己的体会。做这种偏基础性的仿真和界面设计,别把自己困在“做出来就行”的低标准里。参数设计这件事,表面上是布置几个输入框的事,背后是对整个高压直流输电系统工作原理的理解深度。你能不能在GUI里把关键参数梳理清楚,能不能让界面的操作逻辑和系统真实的调节逻辑对齐,这些细节决定了这套东西是“演示玩具”还是“真能用来做研究的工具”。我在这套模型上迭代了好几版,最大的感受就是:把底层参数吃透,做出来的界面才有灵魂,不然就是一顿操作猛如虎,波形还是乱飞舞。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进