建模與仿真:?jiǎn)螜C(jī)無(wú)窮大系統(tǒng)實(shí)戰(zhàn)與避坑指南)
簡(jiǎn)介一份整理自于群教授《MATLAB_Simulink電力系統(tǒng)建模與仿真》的學(xué)習(xí)資料面向電力系統(tǒng)從業(yè)者、工程師與科研人員幫助讀者系統(tǒng)掌握基于MATLAB/Simulink的建模與仿真方法。內(nèi)容從MATLAB基本語(yǔ)法、數(shù)據(jù)類型與控制結(jié)構(gòu)講起逐步過(guò)渡到Simulink圖形化建模界面與工作流程隨后深入電力系統(tǒng)核心元件如發(fā)電機(jī)、變壓器、線路、負(fù)荷的模塊配置與參數(shù)設(shè)置并講解同步發(fā)電機(jī)勵(lì)磁控制、系統(tǒng)頻率調(diào)整等動(dòng)態(tài)過(guò)程的建模方法。教程還覆蓋仿真時(shí)間步長(zhǎng)、初始條件設(shè)置、結(jié)果分析與可視化以及電網(wǎng)故障分析、新能源并網(wǎng)等實(shí)際案例可用于課程學(xué)習(xí)、課題研究或工程驗(yàn)證。壓縮包為zip格式整體大小約24.93MB屬于教程文檔類資料便于按章節(jié)翻閱。目前已有4803人學(xué)習(xí)下載適合初學(xué)者系統(tǒng)入門(mén)也為中高級(jí)研究者提供參考。1. 電力系統(tǒng)建模與仿真為什么我勸你先別繞開(kāi) Simulink電力系統(tǒng)建模與仿真很多人一上手就想著純寫(xiě) M 腳本把發(fā)電機(jī)、變壓器和線路的微分方程組自己排一遍結(jié)果被數(shù)值穩(wěn)定性問(wèn)題按在地上反復(fù)摩擦。標(biāo)題里的“于群 MATLAB_Simulink電力系統(tǒng)建模與仿真”對(duì)應(yīng)的是 MATLAB 文檔體系里 Simulink / Simscape Electrical 這條完整鏈路你不是從零寫(xiě)求解器而是把元件模型拖進(jìn)畫(huà)布、填對(duì)參數(shù)、設(shè)好求解器然后讓波形替你說(shuō)話。這套方法特別適合三類人剛進(jìn)電力系統(tǒng)方向的碩博生需要快速驗(yàn)證控制或保護(hù)策略的工程師以及想把“建模過(guò)程”本身留成可追溯 matlab 文檔的團(tuán)隊(duì)。它解決的痛點(diǎn)很直接——讓拓?fù)淇梢?jiàn)、參數(shù)可查、運(yùn)行可持續(xù)改。2. 把 MATLAB 文檔當(dāng)成地圖Simulink 電力系統(tǒng)建模的選型與初始化動(dòng)手建模型之前先記住一個(gè)原則Simulink 建模最大的資產(chǎn)不是畫(huà)布上的線而是 MATLAB 文檔里那套“每個(gè)模塊、每個(gè)參數(shù)都有據(jù)可查”的體系。很多人對(duì)著模型改半天轉(zhuǎn)發(fā)給同事卻連“這個(gè)參數(shù)為什么設(shè) 0.1”都講不清原因就是一開(kāi)始把文檔扔到一邊。于群這套資料的真實(shí)價(jià)值恰恰是把“查文檔、改參數(shù)、看波形”串成一條可以反復(fù)走的流程。下面從選型、環(huán)境檢查和文檔用法三個(gè)層面展開(kāi)。2.1 為什么選 Simulink 而不是純 M 腳本模型本身就是文檔純 M 腳本建模不是不能做而是維護(hù)成本太高。電力系統(tǒng)暫態(tài)仿真至少包含同步電機(jī)、變壓器磁路、線路分布參數(shù)、斷路器動(dòng)作和故障模塊每個(gè)對(duì)象都要自己搭方程光三相坐標(biāo)變換和相序網(wǎng)絡(luò)就要處理半天。Simulink 的 Specialized Power Systems 庫(kù)舊稱 SimPowerSystems把這一層封裝好了同步電機(jī)模塊內(nèi)部實(shí)現(xiàn)了 Park 方程和機(jī)械運(yùn)動(dòng)方程三相變壓器建模時(shí)自動(dòng)處理聯(lián)結(jié)組別和漏抗線路支持 PI 模型和分布參數(shù)模型。你要做的不是重新推導(dǎo)公式而是選擇與實(shí)際電網(wǎng)一致的元件模型。更重要的是“模型即可執(zhí)行文檔”。把一個(gè)持續(xù)改進(jìn)的 Simulink 模型放到團(tuán)隊(duì)環(huán)境里別人看拓?fù)浣Y(jié)構(gòu)就能理解方案再配合 MATLAB 文檔中的模塊參數(shù)頁(yè)每個(gè)參數(shù)都能回溯到官方定義。相比 M 腳本只能用注釋和變量名提示Simulink 的圖形化表達(dá)更適合電力系統(tǒng)這樣多端口、多耦合的仿真對(duì)象。后續(xù)做故障分析、保護(hù)整定或控制器驗(yàn)證模型的復(fù)用性都會(huì)比腳本高很多。這就是我為什么一上來(lái)就強(qiáng)調(diào)選型先想清楚用什么建模再看怎么建。Simulink 特別適合“既要能出波形又要方便給別人講清楚”的場(chǎng)景如果你只是做一個(gè)純算法推導(dǎo)、不涉及元件交互的課題那反而沒(méi)必要拖出 SimulinkM 腳本更快??上Ф鄶?shù)電力系統(tǒng)題目都繞不開(kāi)電磁暫態(tài)和機(jī)械暫態(tài)的耦合所以 Simulink 才是多數(shù)人的第一選擇。等到了多機(jī)系統(tǒng)、微網(wǎng)或交直流混合電網(wǎng)階段你會(huì)發(fā)現(xiàn)團(tuán)隊(duì)協(xié)作時(shí)大家認(rèn)的也是 Simulink 模型而不是一堆散落的 m 文件。2.2 用命令行把工具箱和環(huán)境檢查清楚少進(jìn)一個(gè)黑匣子建模前先別急著拖模塊先回答三個(gè)問(wèn)題Simulink 裝了嗎Simscape Electrical 裝了嗎授權(quán)里有沒(méi)有 Simscape Electrical 的 License這三個(gè)問(wèn)題的答案直接決定后面能做多少事。很多人在命令行里敲了sim才看到一連串 toolbox missing那才是真翻車。與其到時(shí)候后悔不如一開(kāi)始就把環(huán)境查清楚。常見(jiàn)做法是打開(kāi) MATLAB先敲這一段% 檢查三個(gè)最關(guān)鍵的環(huán)境項(xiàng) ver(Simulink) % 輸出 Simulink 版本信息 ver(Simscape) % 輸出 Simscape 基礎(chǔ)庫(kù)版本 license(test, Simscape_Electrical) % 有授權(quán)返回 1沒(méi)有返回 0邏輯很簡(jiǎn)單ver是 MATLAB 查已安裝工具箱的函數(shù)license是查許可狀態(tài)的函數(shù)。第二行里的Simscape是基礎(chǔ)庫(kù)第三行的Simscape_Electrical是電力系統(tǒng)專業(yè)庫(kù)注意這個(gè)工具箱在不同版本的 MATLAB 文檔里也可能寫(xiě)成 “Simscape Electrical Toolbox”。如果幫助文檔里搜“電力系統(tǒng)”老資料叫 SimPowerSystems新資料叫 Specialized Power Systems路徑其實(shí)指向同一個(gè)地方別被名字繞暈。如果你的環(huán)境沒(méi)有Simscape_Electrical后面所有電源、電機(jī)、變壓器模塊都拉不出來(lái)。這里有一條判斷依據(jù)powerlib這個(gè)函數(shù)能直接打開(kāi)專用元件庫(kù)如果它能運(yùn)行說(shuō)明環(huán)境基本就位如果它報(bào)“庫(kù)不存在”多半是缺少工具箱回到 MATLAB 安裝器里補(bǔ)裝并重新激活即可。補(bǔ)裝的時(shí)候注意MATLAB 安裝器里不同工具箱的勾選是獨(dú)立的光裝了 MATLAB 主包不等于裝了 Simscape這一步很容易被忽略。除了環(huán)境檢查我一般還會(huì)打開(kāi) MATLAB 文檔首頁(yè)把 “Simscape Electrical Toolbox 功能列表” 掃一遍。文檔里的庫(kù)分類列表就是最好的索引Machines電機(jī)、ElementsRLC 元件、Power Electronics電力電子、Sources電源、Measurements測(cè)量等。你要找的發(fā)電機(jī)和變壓器分布在 Machines 和 Elements 下故障模塊則在 Circuit Breakers 一類。先瀏覽這個(gè)列表等建模型時(shí)就能少走彎路。這個(gè)功能列表比任何入門(mén)教程都準(zhǔn)確因?yàn)樗S版本實(shí)時(shí)更新比我記憶中的庫(kù)路徑可靠得多。提示R202x 之后“SimPowerSystems”這個(gè)名字在新文檔里基本不再出現(xiàn)統(tǒng)一走 Simscape Electrical 的 Specialized Power Systems。搜索資料時(shí)優(yōu)先搜“Specialized Power Systems”否則容易查到十年前的老界面對(duì)不上號(hào)。2.3 最快路徑先改官方示例再自己搭模型環(huán)境檢查完不要從一個(gè)空白模型開(kāi)始硬建。MATLAB 文檔里有一個(gè)很實(shí)用的習(xí)慣每個(gè)模塊頁(yè)都帶 “Examples”每個(gè)示例模型都可以下載并打開(kāi)修改參數(shù)存成自己的模型。我自己的流程是先找到最接近需求的官方示例另存為項(xiàng)目文件然后一層層拆掉不要的部分保留電機(jī)、變壓器和線路再替換成自己的參數(shù)。具體執(zhí)行可以用命令行也可以純操作 GUI% 打開(kāi)電力系統(tǒng)專用元件庫(kù)并在瀏覽器中查三相故障模塊 powerlib doc(simscape/three-phase-fault) % 若路徑報(bào)錯(cuò)直接在文檔搜索框輸入 three phase fault這兩行命令的作用是powerlib打開(kāi)可視化庫(kù)方便手動(dòng)查看模塊doc打開(kāi)的是模塊的官方幫助頁(yè)。官方幫助頁(yè)里通常包含參數(shù)定義、數(shù)學(xué)描述和至少一個(gè)可復(fù)制的例子這是新手最容易忽略的 matlab 文檔入口。很多模塊的 mask 參數(shù)也就是雙擊模塊后那一堆輸入框在幫助頁(yè)里有逐項(xiàng)解釋遠(yuǎn)比在論壇里搜零散的中文回答靠譜。在“先抄后改”的階段注意一個(gè)細(xì)節(jié)官方示例往往依賴某些回調(diào)腳本InitFcn或基礎(chǔ)工作區(qū)變量另存到新文件夾后要把這些依賴一起帶走或者在模型回調(diào)里用edit查看腳本內(nèi)容。如果漏了這一步模型在新目錄下打開(kāi)會(huì)報(bào) “Undefined variable”然后你就開(kāi)始了一場(chǎng)和黑匣子的戰(zhàn)斗。我一般會(huì)在模型屬性里查看 “Callbacks” 中每一行確認(rèn)沒(méi)有隱藏的初始化代碼再繼續(xù)改。更穩(wěn)妥的做法是直接搜索evalin(base, ...)這類調(diào)用凡是出現(xiàn)了就要么把變量搬進(jìn)模型工作區(qū)要么把腳本作為模型的一個(gè)初始化文件放進(jìn)同一目錄。這一章的最終目的是讓你建立起“Simulink 模型 matlab 文檔 示例代碼”三位一體的工作習(xí)慣。選型要落在 Simulink 上環(huán)境要確認(rèn)到工具箱級(jí)別建模要先從官方示例入手。有了這個(gè)地基下一章搭出來(lái)的單機(jī)無(wú)窮大系統(tǒng)才不是空中樓閣。3. 搭一個(gè)單機(jī)無(wú)窮大系統(tǒng)Simulink 電力系統(tǒng)建模仿真的最小閉環(huán)先從結(jié)論說(shuō)起我不建議你上來(lái)就搭三機(jī)九節(jié)點(diǎn)或 IEEE 39 節(jié)點(diǎn)系統(tǒng)。電力系統(tǒng)建模與仿真的第一道坎是“看懂一個(gè)簡(jiǎn)單系統(tǒng)的全部環(huán)節(jié)”單機(jī)無(wú)窮大系統(tǒng)剛好覆蓋同步電機(jī)、變壓器、輸電線路、無(wú)窮大母線、短路故障五個(gè)要素而且發(fā)散時(shí)你只有少數(shù)幾個(gè)懷疑點(diǎn)不會(huì)像大系統(tǒng)那樣無(wú)從下手。把這一步跑通后面再擴(kuò)展到多機(jī)系統(tǒng)才有底。3.1 為什么單機(jī)無(wú)窮大系統(tǒng)是最合適的起步對(duì)象單機(jī)無(wú)窮大系統(tǒng)Single Machine Infinite BusSMIB本質(zhì)上是一個(gè)理想化概念一臺(tái)同步發(fā)電機(jī)經(jīng)變壓器和線路接到一個(gè)容量遠(yuǎn)大于單機(jī)的電網(wǎng)母線電壓和頻率被視為恒定。它不會(huì)出現(xiàn)在真實(shí)電網(wǎng)里但在仿真里是驗(yàn)證電機(jī)模型、勵(lì)磁控制和暫態(tài)穩(wěn)定性的最小單元。很多教科書(shū)、包括于群那套電力系統(tǒng)建模與仿真資料中第一步都是這個(gè)東西因?yàn)槟隳苤庇^看到故障前、故障中、故障切除后的電流變化和電壓跌落。具體到 Simulink 建模SMIB 需要四類元件同步電機(jī)的機(jī)械和電氣接口雙繞組變壓器線路等值電路以及代表電網(wǎng)的無(wú)窮大母線。你在元件庫(kù)里選機(jī)型時(shí)常看到Synchronous Machine pu Standard它內(nèi)部包含阻尼繞組、勵(lì)磁繞組和機(jī)械運(yùn)動(dòng)方程變壓器選Three-Phase Transformer (Two Windings)線路選Three-Phase PI Section Line或Distributed Parameters Line。少數(shù)情況下還要加Three-Phase V-I Measurement和Three-Phase Fault來(lái)完成測(cè)量和故障注入。為什么要用無(wú)窮大母線而不是直接接一個(gè)電壓源因?yàn)闊o(wú)窮大母線不僅提供額定電壓還隱式地提供一個(gè)短路容量足夠大的戴維南等值電源。你若只用理想電壓源忽略短路容量故障時(shí)節(jié)點(diǎn)電壓會(huì)被源拉死波形看起來(lái)完全不對(duì)。Simulink 里的Three-Phase Source模塊可以設(shè)置短路容量設(shè)成無(wú)窮大時(shí)短路容量一般比發(fā)電機(jī)容量高 10 倍以上算是一個(gè)簡(jiǎn)單的工程經(jīng)驗(yàn)。同步電機(jī)的內(nèi)部參數(shù)中慣性常數(shù)和電抗是后續(xù)穩(wěn)定分析的重點(diǎn)第一次建模型不用改得太精細(xì)等你要復(fù)現(xiàn)功角搖擺曲線時(shí)再逐個(gè)調(diào)。3.2 元件擺放與接線順序一個(gè)可以抄的模型拓?fù)湎旅孢@套順序是我自己在空白模型上操作的常規(guī)套路你可以直接照抄也可以根據(jù)手頭參數(shù)調(diào)整。新建一個(gè) Simulink 模型按下面順序逐步添加元件每加一個(gè)就先雙擊查看 mask 參數(shù)避免后面連線時(shí)找不到端口。第一步放 Powergui。沒(méi)有 PowerguiSpecialized Power Systems 里的電機(jī)、變壓器可能啟動(dòng)不了初始化。Powergui 在庫(kù)路徑Simscape / Electrical / Specialized Power Systems / Powergui下也可以直接在命令窗口執(zhí)行powerlib然后從庫(kù)窗口把 Powergui 拖入模型。第二步放同步電機(jī)。選Synchronous Machine pu Standard設(shè)置額定視在功率200e6單位 VA額定線電壓10e3單位 V頻率 50Hz。如果你是驗(yàn)證保護(hù)或穩(wěn)定不用把內(nèi)部電抗改到特別精確先使用默認(rèn)的標(biāo)幺值參數(shù)后面要細(xì)調(diào)時(shí)再看X_d、X_d、T等參數(shù)。真正要改的往往是“機(jī)械輸入”和“電氣接口”的類型。第三步放變壓器。使用Three-Phase Transformer (Two Windings)把一次側(cè)接到電機(jī)端口二次側(cè)接到線路。聯(lián)結(jié)組別建議用 Yn-D也就是一次側(cè)星形帶中性點(diǎn)、二次側(cè)三角形。這樣后續(xù)做單相接地故障時(shí)零序電流有流通路徑如果兩側(cè)都用星形不接地單相短路故障根本仿不像。這是一個(gè)經(jīng)常被忽略的坑先記下來(lái)。第四步放線路。先用Three-Phase PI Section Line簡(jiǎn)化為一段集中參數(shù)線路長(zhǎng)度給 100km正序電阻和電感用默認(rèn)典型值。分布式參數(shù)線路更適合長(zhǎng)距離分析但對(duì)初學(xué)來(lái)說(shuō) PI 模型更容易理解波形也更容易檢查。線路模塊的“頻變參數(shù)”選項(xiàng)在電力系統(tǒng)暫態(tài)中會(huì)更準(zhǔn)確但仿真速度會(huì)明顯變慢初學(xué)階段先不要開(kāi)。第五步放無(wú)窮大母線。用Three-Phase Source電壓等級(jí)與變壓器二次側(cè)一致頻率 50Hz短路容量設(shè)為10e9VA也就是 10GVA 左右。如果母線電壓等級(jí)需要 110kV那變壓器的二次側(cè)和線路參數(shù)也要同步改成 110kV 等級(jí)別讓一次側(cè) 10kV 的發(fā)電機(jī)和 110kV 母線直接相連。第六步放測(cè)量與故障。Three-Phase V-I Measurement可以串在線路和母線之間Three-Phase Fault放在測(cè)量點(diǎn)之后設(shè)置切換時(shí)間[0.2 0.3]表示 0.2 秒發(fā)生短路、0.3 秒被斷路器切除。如果你習(xí)慣用腳本控制流程可以用下面這段把 Powergui 放進(jìn)去% 新建一個(gè)測(cè)試模型并添加 Powergui 塊庫(kù)路徑以本機(jī) powerlib 為準(zhǔn) mdl smib_demo; new_system(mdl); add_block(simscape/Electrical/Specialized Power Systems/Powergui, [mdl /Powergui]); open_system(mdl);這段腳本里new_system創(chuàng)建空白模型add_block的源路徑以你本機(jī)庫(kù)為準(zhǔn)——如果你的版本里路徑分層有差異先運(yùn)行powerlib找到 Powergui 的完整路徑再替換。用腳本建立模型的好處是可控和可重現(xiàn)這也是 matlab 文檔里推廣的一種做法把“手工點(diǎn)擊”變成“代碼記錄”以后換機(jī)器、換版本重跑腳本就能得到同一套模型骨架。3.3 Powergui 與第一個(gè)波形仿真前要放好的三個(gè)關(guān)鍵參數(shù)所有元件都拖進(jìn)來(lái)之后不是直接點(diǎn)綠色運(yùn)行按鈕就能看到漂亮波形。第一次跑 SMIB我先調(diào)三個(gè)地方Powergui 的仿真類型、同步電機(jī)的初始條件、故障模塊的切換時(shí)間。第一Powergui 里選擇Continuous仿真類型并在通用參數(shù)里把系統(tǒng)頻率設(shè)為 50Hz。Specialized Power Systems 很多模塊依賴這個(gè)頻率計(jì)算感抗和容抗如果你默認(rèn)是 60Hz而線路參數(shù)按 50Hz 輸入波形會(huì)出現(xiàn)頻率偏移初看很難定位。第二同步電機(jī)的穩(wěn)態(tài)初始條件必須初始化。在 Powergui 里打開(kāi)Machines Initialization工具輸入發(fā)電機(jī)的有功、無(wú)功和機(jī)端電壓再讓工具自動(dòng)計(jì)算初始狀態(tài)值。這一步不做仿真從頭開(kāi)始就以非穩(wěn)態(tài)為起點(diǎn)電壓和電流會(huì)跳變甚至直接 NaN。很多人第一次建電機(jī)模型就栽在這里后面排查半天才發(fā)現(xiàn)是初始化問(wèn)題。第三故障模塊的觸發(fā)時(shí)間。Three-Phase Fault的切換時(shí)間參數(shù)寫(xiě)成[0.2 0.3]也可以寫(xiě)作0.2 0.3。不要設(shè)置成[0.2 inf]因?yàn)闊o(wú)窮大表示故障永遠(yuǎn)不清除你看到的只是永久性短路的暫態(tài)而不是完整的“故障→切除→恢復(fù)”過(guò)程。下面是一段可以直接跑的參數(shù)和仿真腳本% 設(shè)置模型級(jí)參數(shù)并運(yùn)行仿真 set_param(smib_demo/Powergui, SimulationMode, continuous, Freq, 50); set_param(smib_demo/Three-Phase Fault, SwitchingTimes, 0.2 0.3); % 參數(shù)名以當(dāng)期文檔為準(zhǔn) simOut sim(smib_demo, StopTime, 1.0);代碼里set_param第一行把 Powergui 的仿真模式設(shè)為連續(xù)并鎖定 50Hz第二行設(shè)置故障塊的切換時(shí)間sim命令啟動(dòng)仿真并返回輸出對(duì)象。你需要在測(cè)量模塊上右鍵把 “Voltage” 和 “Current” 信號(hào)標(biāo)記為 Log Selected Signals才能讓simOut里真正帶出波形數(shù)據(jù)。StopTime設(shè)為 1 秒意思是仿真窗口覆蓋故障前 0.2 秒、故障中 0.1 秒和切除后的恢復(fù)過(guò)程既能看到暫態(tài)峰值也不至于跑得太慢。如果打開(kāi) Scope 直接看波形注意觀察三個(gè)特征故障發(fā)生瞬間電流是否抬升故障切除后電壓是否恢復(fù)恢復(fù)過(guò)程中是否存在衰減振蕩。這三個(gè)特征驗(yàn)證模型沒(méi)建錯(cuò)后面再做控制策略或保護(hù)整定才有意義。第一次建模型請(qǐng)先把故障塊斷開(kāi)先跑一個(gè)無(wú)故障穩(wěn)態(tài)確認(rèn)電壓電流都是正弦再切入故障。這個(gè)習(xí)慣能省下大量排查時(shí)間。4. 常見(jiàn)問(wèn)題排查步長(zhǎng)、外部模式與參數(shù)設(shè)置踩坑記錄這部分是這套建模資料里我認(rèn)為最值錢(qián)的內(nèi)容。很多人問(wèn)“為什么我的模型跑出來(lái)全是 NaN”基本都不是模型原理錯(cuò)了而是求解器、外部模式或故障設(shè)置里某一個(gè)細(xì)節(jié)沒(méi)配對(duì)。下面按排查頻率給出四組說(shuō)明和五條踩坑記錄。4.1 求解器選擇與步長(zhǎng)為什么我的仿真一開(kāi)始就 NaNSimulink 默認(rèn)求解器是 ode45屬于顯式 Runge-Kutta 方法適合一般連續(xù)系統(tǒng)。但電力系統(tǒng)暫態(tài)仿真帶有明顯的剛性特征電磁暫態(tài)時(shí)間常數(shù)在毫秒級(jí)機(jī)電暫態(tài)時(shí)間常數(shù)在數(shù)十毫秒到秒級(jí)比值相差很大。此時(shí) ode45 為了穩(wěn)定會(huì)不斷把步長(zhǎng)壓到很小仿真卡頓且容易在剛性點(diǎn)附近發(fā)散導(dǎo)致剛開(kāi)始就跑 NaN。這不是模型錯(cuò)了而是求解器不適合。我一般把電力系統(tǒng)仿真首選ode23t或ode15s。ode23t適合中等剛性的問(wèn)題在 50Hz 電力系統(tǒng)暫態(tài)里表現(xiàn)穩(wěn)定ode15s適合剛性更強(qiáng)、且對(duì)階數(shù)要求不高的場(chǎng)景。兩者的共同點(diǎn)是隱式求解可以用相對(duì)大的步長(zhǎng)保持?jǐn)?shù)值穩(wěn)定代價(jià)是單步計(jì)算稍慢但在整體效率上明顯優(yōu)于顯式求解器。求解器類型適用場(chǎng)景常見(jiàn)誤用ode45顯式 RK光滑的非剛性系統(tǒng)直接套在電機(jī)故障模型上步長(zhǎng)崩潰ode23t隱式梯形中等剛性電力系統(tǒng)暫態(tài)適合大多數(shù) SMIB 和暫態(tài)場(chǎng)景ode15s隱式多步強(qiáng)剛性、含電力電子開(kāi)關(guān)步長(zhǎng)過(guò)小的話也會(huì)慢到無(wú)法忍受ode23顯式 RK低精度、無(wú)突兀開(kāi)關(guān)帶斷路器動(dòng)作后容易超調(diào)模型配置建議用代碼固定% 固定求解器與最大步長(zhǎng)防止其他人亂改 cs getActiveConfigSet(smib_demo); set_param(cs, Solver, ode23t); % 中等剛性首選 set_param(cs, MaxStep, 1e-3); % 限制最大步長(zhǎng)保證采樣精度 set_param(cs, RelTol, 1e-3); % 相對(duì)誤差默認(rèn) 1e-3 即可這里getActiveConfigSet從模型拿到配置對(duì)象set_param對(duì)它寫(xiě)入三個(gè)參數(shù)求解器、最大步長(zhǎng)、相對(duì)誤差。MaxStep1e-3表示求解器最長(zhǎng)走 1 毫秒一步對(duì) 50Hz 系統(tǒng)意味著每個(gè)周波走 20 個(gè)點(diǎn)足夠看波形也不會(huì)把計(jì)算量拉爆。若你想看更細(xì)的暫態(tài)比如斷路器開(kāi)斷時(shí)刻的電壓尖峰把MaxStep降到1e-4多花一點(diǎn)時(shí)間換取更平滑的曲線我自己在保護(hù)分析時(shí)偶爾會(huì)這樣用。4.2 Simulink 外部模式在線調(diào)參但別一開(kāi)頭就用外部模式External Mode是 Simulink 與外部目標(biāo)機(jī)通信的仿真運(yùn)行模式適用于快速原型驗(yàn)證宿主 MATLAB 把模型編譯后下載到目標(biāo)機(jī)運(yùn)行同時(shí)可以在線修改參數(shù)、看波形。對(duì)于電力系統(tǒng)實(shí)時(shí)仿真常見(jiàn)做法是配一臺(tái)實(shí)時(shí)目標(biāo)機(jī)或 Simulink Desktop Real-Time 環(huán)境先離線驗(yàn)證再進(jìn)入外部模式做信號(hào)級(jí)測(cè)試。但我的建議是剛接觸電力系統(tǒng)建模先不要碰外部模式。原因很簡(jiǎn)單外部模式的調(diào)試鏈路等于多了一個(gè)黑匣子——模型、實(shí)時(shí)目標(biāo)機(jī)、通信、時(shí)鐘任何一個(gè)環(huán)節(jié)出問(wèn)題都會(huì)讓你誤以為電力系統(tǒng)模型錯(cuò)了。先把 Normal 模式跑通保存好一組穩(wěn)定波形再升級(jí)到外部模式心里才有底。如果確實(shí)要用外部模式步驟一般是三件事在模型設(shè)置里把仿真模式改為External選擇實(shí)時(shí)目標(biāo)文件如 slrealtime 對(duì)應(yīng)文件或桌面目標(biāo)再點(diǎn)“構(gòu)建并連接”。用腳本做代碼生成時(shí)也可以這樣控制但注意區(qū)分兩種目標(biāo)文件% 以 ERT 目標(biāo)生成嵌入式 C 代碼不是外部模式 cfg getActiveConfigSet(smib_demo); set_param(cfg, SystemTargetFile, ert.tlc); % 嵌入式代碼目標(biāo) set_param(cfg, GenCodeOnly, on); % 只生成代碼不運(yùn)行 slbuild(smib_demo);這段腳本生成的是一份可在嵌入式處理器上編譯的 C 代碼輸出文件通常在模型的slprj目錄下GenCodeOnlyon表示不繼續(xù)編譯生成可執(zhí)行文件。如果你要做外部模式應(yīng)該把目標(biāo)文件換成實(shí)時(shí)仿真目標(biāo)并在運(yùn)行時(shí)設(shè)置里打開(kāi)外部模式通信。很多人在論壇上遇到的“外部模式連接失敗”往往是沒(méi)有按目標(biāo)機(jī)手冊(cè)選擇正確的目標(biāo)文件就開(kāi)始點(diǎn)連接結(jié)果一直在兜圈子。注意常規(guī)模型里出現(xiàn)From Workspace模塊、evalin回調(diào)或基礎(chǔ)工作區(qū)變量時(shí)代碼生成和外部模式都可能失敗。凡是準(zhǔn)備生成代碼的模型參數(shù)盡量改成模型工作區(qū)或 MATLAB 參數(shù)對(duì)象這是個(gè)長(zhǎng)期主義做法。4.3 三個(gè)必須調(diào)對(duì)的位置故障相、短路容量和故障時(shí)刻三相故障模塊不是只能做三相短路。它的界面里有一組故障相選擇復(fù)選框默認(rèn)三個(gè)勾全都打上做的是 ABC 三相短路接地。想做單相接地、兩相短路或兩相接地必須手動(dòng)取消或勾選對(duì)應(yīng)相。這個(gè)細(xì)節(jié)常被忽略不少人以為放一個(gè) Three-Phase Fault 就能模擬所有故障類型結(jié)果看到的波形永遠(yuǎn)是三相對(duì)稱短路和論文里的不對(duì)稱故障對(duì)不上。無(wú)窮大母線的短路容量同樣關(guān)鍵。Three-Phase Source 模塊除了電壓和頻率還有一個(gè)短路容量參數(shù)我一開(kāi)始就用默認(rèn)值結(jié)果故障電流小得離譜。把短路容量設(shè)到發(fā)電機(jī)容量的 10 倍以上才算接近“無(wú)窮大”的含義如果需要更精確可以從潮流計(jì)算中獲得戴維南等值參數(shù)再填寫(xiě)。故障時(shí)刻則要注意寫(xiě)在模塊“切換時(shí)間”而非“仿真時(shí)間”里。很多人以為仿真開(kāi)始時(shí)間即故障時(shí)刻其實(shí)模塊內(nèi)部使用獨(dú)立的切換時(shí)間默認(rèn)可能是[Inf]表示不動(dòng)作。你需要在參數(shù)里寫(xiě)成[0.2 0.3]并且仿真的StopTime必須大于 0.3否則根本看不到切除后的恢復(fù)過(guò)程。4.4 五條踩坑記錄每一條都是血淚經(jīng)驗(yàn)以下是五條真實(shí)高頻的踩坑記錄全部按“現(xiàn)象 → 原因 → 解決”組織排查時(shí)可以按順序?qū)φ?。?1 條一仿真就 NaN波形直接飛到 1e30。原因 90% 是同步電機(jī)沒(méi)有正確初始化。很多第一次建 SMIB 的人直接給電機(jī)一個(gè)電壓然后點(diǎn)運(yùn)行Powergui 還沒(méi)參與初始化電機(jī)內(nèi)部狀態(tài)和網(wǎng)絡(luò)節(jié)點(diǎn)電壓不匹配第一步就把微分方程解開(kāi)碰破了。解決在 Powergui 的Tools Initial State Setting里選擇Set Initial States或打開(kāi)Machines Initialization工具自動(dòng)求一次穩(wěn)態(tài)初始值再刪掉故障塊重跑一次穩(wěn)態(tài)物理通道。若仍發(fā)散檢查母線是否有接地路徑——變壓器二次側(cè)為星形不接地時(shí)單相短路也沒(méi)有完整通路先改成 Yn-Δ 接法。第 2 條波形在高頻處出現(xiàn)鋸齒毛刺且毛刺集中在故障切除時(shí)刻。原因通常是斷路器以理想開(kāi)關(guān)模型瞬間切換電流等效于在仿真頻域引入了極高頻率分量而MaxStep太大求解器沒(méi)有在開(kāi)關(guān)瞬間附近細(xì)分步長(zhǎng)。解決把MaxStep由1e-3調(diào)到1e-4并在故障塊參數(shù)里打開(kāi)Breaker resistance串聯(lián)一個(gè)很小的阻尼電阻典型為 0.01Ω抑制電流斬?cái)嘁l(fā)的數(shù)值振蕩。注意不要用連續(xù)變阻來(lái)模擬斷路器那會(huì)改變故障電流峰值。第 3 條想做單相接地卻只能得到三相短路。原因Three-Phase Fault 的故障相默認(rèn)三相全選你沒(méi)有取消不需要的相。解決雙擊故障塊找到故障類型或故障相選擇只勾選 Phase A同時(shí)接地路徑選擇ground或經(jīng)過(guò)阻抗接地。如果模型中變壓器一次側(cè)為三角形聯(lián)結(jié)零序電流沒(méi)有路徑單相接地仿真結(jié)果也不真實(shí)這一步需要回看變壓器聯(lián)結(jié)組別。第 4 條外部模式連接提示 Target Not Responding。原因目標(biāo)機(jī)配置不對(duì)或者模型里含有From Workspace、To Workspace這類不適合實(shí)時(shí)運(yùn)行的塊代碼生成在目標(biāo)機(jī)上被卡住。解決先把模型仿真模式切回 Normal確認(rèn)離線仿真完全正常再用“代碼生成”按鈕先編譯一次觀察是否報(bào)缺少變量最后再切到 External 并按目標(biāo)機(jī)的文檔檢查通信端口和 IP。不要同時(shí)打開(kāi)多個(gè)外部模式會(huì)話同一個(gè)目標(biāo)通常只允許一個(gè)宿主連接。第 5 條生成 C 代碼時(shí)報(bào) “Undefined variable” 或 “Missing Parameter”。原因你的 Simulink 模型里仍有大量參數(shù)存在于基礎(chǔ)工作區(qū)代碼生成時(shí)目標(biāo)機(jī)沒(méi)有 MATLAB 環(huán)境訪問(wèn)不到這些變量。解決把需要生成代碼的參數(shù)改為模型工作區(qū)Model Workspace對(duì)象或在 MATLAB 里使用Simulink.Parameter并設(shè)置StorageClass為ExportedGlobal同時(shí)檢查模型回調(diào)中是否有隱藏的evalin(base, ...)調(diào)用并清除。這個(gè)習(xí)慣最好在搭模型時(shí)就養(yǎng)成而不是等生成代碼階段再補(bǔ)課。5. 進(jìn)階用 SimulationInput 批量掃描把模型變成可交付的 matlab 文檔最后這部分寫(xiě)點(diǎn)能提升效率的東西參數(shù)批量掃描與結(jié)果文檔化。別小看這一步多數(shù) Simulink 電力系統(tǒng)項(xiàng)目最大的工作量不是“搭模型”而是“調(diào)參數(shù)和解釋波形”。手動(dòng)改一次參數(shù)、運(yùn)行一次、截圖一次做十個(gè)工況就要花掉一整天用腳本批量跑十分鐘能把幾十個(gè)工況跑完還能把結(jié)果統(tǒng)一導(dǎo)成一個(gè)數(shù)據(jù)文件交給下游同事。Simulink 官方支持的核心方式是Simulink.SimulationInput數(shù)組配合sim或parsim并行運(yùn)行。它的價(jià)值在于不修改模型內(nèi)部任何參數(shù)而是在運(yùn)行前注入變量從而保持原始模型不被“玩壞”。代碼是這樣的% 故障時(shí)刻批量掃描比較 0.15s 和 0.25s 短路的暫態(tài)響應(yīng) mdl smib_demo; simin(1) Simulink.SimulationInput(mdl); simin(1) simin(1).setVariable(fault_time, 0.15); simin(2) Simulink.SimulationInput(mdl); simin(2) simin(2).setVariable(fault_time, 0.25); out parsim(simin, ShowSimulationManager, on);這段代碼里Simulink.SimulationInput為每個(gè)工況創(chuàng)建一個(gè)獨(dú)立運(yùn)行實(shí)例setVariable注入你要掃的參數(shù)parsim并行運(yùn)行所有實(shí)例并返回結(jié)果數(shù)組。注意故障塊內(nèi)部要寫(xiě)成使用fault_time變量的形式例如切換時(shí)間寫(xiě)成[fault_time fault_time0.1]而不是硬編碼數(shù)值。parsim并行時(shí)每個(gè)工作進(jìn)程都要能訪問(wèn)模型和變量不要在循環(huán)里用assignin(base, ...)那個(gè)在并行場(chǎng)景下大概率失敗。跑完之后最容易被忽略的是結(jié)果整理。out里的每個(gè)Simulink.SimulationOutput都帶logsout需要手動(dòng)提取波形和指標(biāo)拼成一個(gè)表格或數(shù)據(jù)集% 提取每輪掃描中的電壓波形和峰值 for i 1:numel(out) V out(i).logsout.getElement(Vabc).Values; % 電壓波形 peak max(abs(V.Data(:,1))); % 找第一相最大電壓 fprintf(Case %d: 電壓峰值 %.2f V\n, i, peak); end這里getElement取得已記錄的信號(hào)Values.Data是采樣矩陣?yán)ㄌ?hào)里的(:,1)取第一相。把峰值、時(shí)間和工況參數(shù)一并存入array2table最后導(dǎo)出 CSV整個(gè)流程就可以復(fù)制到報(bào)告中。文檔落地我通常用publish或slreportgen庫(kù)把 M 腳本轉(zhuǎn)成帶波形的 HTML 或 PDF這就是標(biāo)題里所謂 “matlab 文檔” 的一種交付形態(tài)。我自己的習(xí)慣是在每個(gè)項(xiàng)目目錄下放一個(gè)run_cases.m把模型名、參數(shù)表、仿真腳本、結(jié)果導(dǎo)出寫(xiě)在同一份文件里并把對(duì)應(yīng)的 Simulink 模型以.slx形式連同備份快照都存在同一目錄。這樣哪怕三個(gè)月后回看也能清楚某個(gè)波形對(duì)應(yīng)哪個(gè)工況。以前我吃過(guò)一個(gè)虧模型跑通了但沒(méi)把參數(shù)掃描邏輯留在腳本里結(jié)果評(píng)審時(shí)要重?fù)Q故障時(shí)間對(duì)著 GUI 找半天從此我把所有能腳本化的環(huán)節(jié)都腳本化了。數(shù)據(jù)不丟、參數(shù)可查、一次跑完才是 Simulink 電力系統(tǒng)建模與仿真真正的收尾標(biāo)準(zhǔn)。希望這一篇能幫你少踩幾個(gè)一樣的坑也希望你能早點(diǎn)把模型變成一個(gè)能傳承的 matlab 文檔。本文還有配套的精品資源點(diǎn)擊獲取