王尊,羅志斌,荀慶來
(中機國際工程技術(shù)研究院有限責(zé)任公司,湖南長沙,410000)
隨著數(shù)字技術(shù)的飛速發(fā)展,基于微控制單元(MCU)的三相橋式全控整流技術(shù)已經(jīng)在工程實踐中取得了廣泛應(yīng)用[1]。市面上較為主流的MCU大多數(shù)均支持C語言為開發(fā)語言,在進行新算法的開發(fā)及程序驗證時為了降低試驗風(fēng)險,降低開發(fā)成本進行前期的數(shù)字仿真是十分有價值的。而在電力電子領(lǐng)域中Simulink是一款較為主流的數(shù)字仿真軟件,其功能強大,能夠在算法的原理性及程序邏輯合理性上的驗證起到重要作用,能夠很好地幫助工程人員較早地發(fā)現(xiàn)潛在問題。
但傳統(tǒng)的Simulink仿真乃是基于仿真模塊庫或Matlab的m腳本語言開展,僅進行原理性的驗證研究,與工程應(yīng)用存在一定的脫節(jié),對于工程應(yīng)用中前期的糾錯所提供的參考價值有限。針對上述的局限性,本文開展了基于C代碼的Simulink仿真技術(shù)應(yīng)用研究。借助Simulink仿真平臺,對工程實踐中應(yīng)用的C代碼開展數(shù)字仿真和驗證糾錯,避免問題進入工程應(yīng)用階段,為基于C語言的MCU應(yīng)用開發(fā)提供一種有力的驗證手段,縮短開發(fā)周期降低開發(fā)成本。
三相橋式全控整流技術(shù)已經(jīng)較為成熟,圖 1為其電路拓?fù)鋱D。圖中uga、ugb、ugc為電網(wǎng)三相電壓,ia、ib、ic為三相電流,L和C2分別為交流側(cè)濾波器的電感值與電容值,ua、ub、uc為變流器交流側(cè)三相電壓,C1為直流側(cè)電容,udc電容兩端電壓值。

圖1 三相橋式全控整流拓?fù)鋱D
下面以電網(wǎng)電壓矢量方向定向,根據(jù)基爾霍夫定律,得到其在兩相旋轉(zhuǎn)坐標(biāo)系上的數(shù)學(xué)模型如下[2,3]:
由于選擇以電網(wǎng)的電壓矢量為旋轉(zhuǎn)坐標(biāo)系的定向方向,因此其在交軸方向的分量為零ugd=0,同時控制無功電流id=0,可以建立以電流閉環(huán)為內(nèi)環(huán)直流側(cè)電壓閉環(huán)為外環(huán)的雙閉環(huán)全控整流系統(tǒng),其控制框圖如圖2所示。
圖中:the為電網(wǎng)電壓的鎖相角度,udc為直流側(cè)電壓值。
整個系統(tǒng)如圖 2所示,系統(tǒng)啟動時KM2閉合,經(jīng)過KM2及限流電阻對系統(tǒng)進行供電,借由功率單元里IGBT上的續(xù)流二極管進行整流并對直流測電容進行充電,完成系統(tǒng)的預(yù)充電過程。

圖2 控制框圖
充電一段時間,直流側(cè)電壓基本穩(wěn)定后,KM1合閘,KM2斷開切除預(yù)充限流電阻,系統(tǒng)由二極管開環(huán)預(yù)充電階段轉(zhuǎn)為雙閉環(huán)全控整流。系統(tǒng)通過數(shù)字鎖相環(huán)實現(xiàn)電網(wǎng)電壓的鎖相,并以網(wǎng)側(cè)電壓相位對輸入電流進行解耦,將電流解耦為id、iq電流,其中id對應(yīng)為系統(tǒng)有功電流,iq對應(yīng)為系統(tǒng)無功電流,通過PI控制器實現(xiàn)對輸入電流的閉環(huán)控制,并以解耦的電網(wǎng)電壓ugd、ugq為前饋量以提高系統(tǒng)的動態(tài)性能,最終得到的du、qu進行反派克變化得到功率單元需要輸出的電壓矢量,構(gòu)成完整的電流閉環(huán)。直流側(cè)的電壓閉環(huán)控制同樣通過PI控制器實現(xiàn),通過調(diào)節(jié)有功電流的輸入輸出來調(diào)節(jié)直流側(cè)電容的充放電以達(dá)到控制直流側(cè)電壓的目的,并實現(xiàn)能量的雙向流動。
Simulink中可調(diào)用C語言的模塊為S-Function Builer,其模塊的封裝圖示如圖 3 (a)圖所示。
圖3(b)圖為S-Function Builder的設(shè)置頁面,頁面主體為基于C語言的編輯器,語言類型可以選擇C和C++,打開模塊編輯器內(nèi)將自動生成“system_Start_wrapper”“system_Outputs_wrapper” 及“system_Terminate_wrapper”三個子函數(shù),為便于書寫下文中將寫為“Start子函數(shù)”“Outputs子函數(shù)”及“Teminate子函數(shù)”。其中Start和Teminate子函數(shù)僅在仿真運行的開始和結(jié)束時分別運行一次。Outputs子函數(shù)將在每一次S-Function Builder被調(diào)用時運行。紅框2為模塊輸入輸出變量的設(shè)置,第一欄設(shè)置變量名稱,第二欄設(shè)置變量類型,可以有輸入輸出參數(shù)三種類型,第三欄為數(shù)據(jù)類型可以設(shè)置為單個的整型和浮點型變量,也可以設(shè)置為數(shù)組,也可以設(shè)置為Bus類型,這里的Bus類型在C語言中將以結(jié)構(gòu)體的形式實現(xiàn)并支持多層結(jié)構(gòu)體嵌套。第四欄設(shè)置變量維度,第五欄可以設(shè)置實數(shù)、虛數(shù)。紅框3為模塊的一些設(shè)置如模塊的采樣模式等,可以根據(jù)需求設(shè)置,全部設(shè)置完成后點擊編譯按鈕將生成對應(yīng)的.C文件和中間文件。

圖3 S-Function Builder設(shè)置界面
單個或數(shù)組形式的變量的輸入、輸出只需要變量的類型和長度匹配就可以直接鏈接到模塊的輸入或輸出接口上。Bus類型的變量輸入、輸出分別需要通過Simulink中Bus Creator和Bus Selector來實現(xiàn)。
在定義Bus類型的輸入、輸出接口前需要打開總線編輯器,總線編輯界面如圖4所示,必須先在總線編輯器內(nèi)定義好對應(yīng)的總線類型變量及總線內(nèi)掛載的其他變量,支持多層總線變量嵌套。定義好變量后并將其以mat文件的形式保存到本地,模型運行前需要將mat文件中定義的變量讀取到matlab的工作空間內(nèi),否則將提示找不到對應(yīng)變量類型。

圖4 總線編輯器
將對應(yīng)總線變量導(dǎo)入到工作空間后,即可在圖 3的數(shù)據(jù)類型中找到對應(yīng)的Bus類型,并在Bus Creator和Bus Selector中設(shè)置為對應(yīng)的總線變量即可將其鏈接至模塊對應(yīng)的總線變量接口上,實現(xiàn)數(shù)據(jù)交互。完成總線編輯器的配置后,可以將設(shè)好的配置以.mat文件的形式保存至仿真目錄內(nèi)。在Matlab重啟后,或工作空間數(shù)據(jù)清除后,加載對應(yīng)的.mat文件后直接導(dǎo)入之前的配置,避免重復(fù)工作。
在進行C代碼的仿真前,需要配置好Matlab中的C代碼編譯環(huán)境,不同版本的Matlab所支持的對應(yīng)的編譯環(huán)境不盡相同,在Matlab的命令窗口內(nèi)輸入“mex -setup”指令,可以查詢當(dāng)前編譯器的情況,并查到對應(yīng)的支持表,文中的工程是基于MingW-64完成的。其安裝可以在Matlab的附加功能中根據(jù)提示步驟進行安裝,或根據(jù)支持表自行下載安裝包進行安裝配置。安裝并配置成功后同樣可以通過“mex -setup”指令查詢當(dāng)前所使用的編譯環(huán)境。
配置完成后,在進行仿真前需要通過“mex xxx.c xxx2.c”指令先對仿真用到的全部.C文件進行編譯,其中XXX為對應(yīng)文件名,包括Matlab生成的一些中間.C文件全部進行編譯,指令可添加多個.C文件同時進行編譯。如果.C文件沒有進行改動,在后續(xù)的仿真中不需要再次進行重復(fù)編譯,可以節(jié)省仿真時間,如果.C文件有修改,需要重新進行編譯才會生效,否則SimuLink將繼續(xù)使用之前的編譯文件繼續(xù)進行仿真。
C文件中用到的頭文件或全局變量可在生成的.C文件中如下圖的注釋區(qū)域內(nèi)進行申明和定義,但要注意的是Simulink的C代碼仿真暫不支持對實際的物理地址進行操作,但運行定義全局變量對全局變量的地址進行映射操作。

圖5 頭文件及全局變量定義
由于Start子函數(shù)的調(diào)用機制是僅在仿真開始時被調(diào)用一次,因此非常適合用于進行程序的初始化,只需在Start的子函數(shù)內(nèi),進行對應(yīng)的初始化操作即可。
由于Outputs子函數(shù)將在每次模塊被調(diào)用時運行一次,因此需要進行仿真驗證的C代碼的主函數(shù)需要在該子函數(shù)內(nèi)進行調(diào)用。但在調(diào)用前需要對輸入、輸出變量進行關(guān)聯(lián),如圖 6所示,我們定義接口變量將會以變量指針的形式作為Outputs子函數(shù)的輸入,在調(diào)用需驗證的C代碼之前,需要將定義的接口變量與對應(yīng)的函數(shù)變量進行關(guān)聯(lián),可以直接作為需要驗證的C代碼主函數(shù)的輸入變量,也可以賦值到全局變量上,再由主函數(shù)去讀取全局變量的對應(yīng)地址的變量值來實現(xiàn)變量的輸入。變量的輸出與輸入類似,在主函數(shù)運算完成后,可以直接將主函數(shù)的返回值賦值到輸出接口變量上,也可以借由對全局變量的指針操作來實現(xiàn)數(shù)據(jù)的關(guān)聯(lián),將反饋數(shù)據(jù)關(guān)聯(lián)至接口變量上,實現(xiàn)仿真數(shù)據(jù)的輸入輸出。

圖6 Outputs子函數(shù)輸入變量
在同一個Simunlink仿真中,支持調(diào)用多個S-Funtion Builder模塊,支持多個模塊在不同的仿真頻率下進行仿真,并調(diào)用不同的函數(shù),但是每一個模塊之間定義的內(nèi)部的全局變量在仿真中并不關(guān)聯(lián),如果需要關(guān)聯(lián),需要定義接口變量在模塊的外部對其進行賦值處理才能實現(xiàn)不同模塊之間的數(shù)據(jù)交互。抑或是采用外部觸發(fā)的形式,通過信號來觸發(fā)程序塊的運行,以模擬MCU中斷服務(wù)函數(shù)和外部觸發(fā)程序塊的運行邏輯。
在上述的設(shè)置下模塊將以所設(shè)定的固定頻率或者以輸入變量的固定頻率來進行仿真,但在實際應(yīng)用中除了固定頻率運行的周期性的運算,還存在不少由外部條件或者由不固定時長的計時器來觸發(fā)運行的程序段,上述的設(shè)置將難以實現(xiàn)對這部分內(nèi)容的仿真驗證。
為實現(xiàn)外部觸發(fā)的操作,需要借助于Simulink中的Function -Call Subsystem來 實 現(xiàn),F(xiàn)unction-Call Subsystem只有在收到觸發(fā)信號時,才會調(diào)用其內(nèi)部封裝的子函數(shù)并運行一次,因此將S-Function Builder模塊封裝于Function-Call Subsystem內(nèi),并將其采樣模式設(shè)置為繼承即可實現(xiàn)C代碼的外部觸發(fā)調(diào)用機制。Function-Call Subsystem的觸發(fā)信號可以由Simulink的Stateflow進行給出,在Stateflow里選擇Chart并在其編輯頁面內(nèi)設(shè)置好觸發(fā)機制,再將觸發(fā)信號給到Function-Call Subsystem的觸發(fā)接口即可實現(xiàn)程序的外部觸發(fā)運行。
以MCU為控制核心的自動化裝備和電力電子裝置的開發(fā)和應(yīng)用已經(jīng)愈發(fā)廣泛和成熟,而市面主流的MCU大多都支持以C語言為開發(fā)語言,在開發(fā)的初期階段直接以實物運行來調(diào)試無疑會帶來一定的設(shè)備和人身風(fēng)險,增加了調(diào)試難度,也提高了開發(fā)成本。因此在程序的開發(fā)初期和算法驗證的階段,直接在數(shù)字仿真平臺上對工程算法文件進行驗證和糾錯,將能夠在一定程度上規(guī)避掉一些風(fēng)險,且數(shù)字仿真平臺搭建難度低,過程數(shù)據(jù)更易捕捉,調(diào)試手段多,無形中也縮短了開發(fā)工作量。
本文以實際工程應(yīng)用遇到的三相橋式全控整流裝置的研發(fā)項目為例,開展了其基于C語言的Simulink的仿真技術(shù)研究,詳細(xì)分享了在該新型數(shù)字仿真平臺搭建過程中實現(xiàn)的包括模塊調(diào)用、變量鏈接、程序調(diào)用以及不同的觸發(fā)機制等操作,涵蓋了在工程應(yīng)用中可能會需要用到的情況和實現(xiàn)方法。并以實際的工程為例進行了應(yīng)用和測試,驗證了其方法的可行性。