典型的Simulink模塊雙擊時(shí)會彈出對話框,在對話框中可以設(shè)置模塊參數(shù),如:雙擊正弦波模塊(SineWave),可以設(shè)置正弦波幅值和頻率;雙擊增益模塊(Gain),可以設(shè)置增益值;雙擊PID控制器模塊(PID Controller),可以設(shè)置PID參數(shù)值;雙擊傳遞函數(shù)模塊(Transfer Fcn),可以設(shè)置傳遞函數(shù)的分子和分母系數(shù)。
但很多時(shí)候,需要在 Simulink仿真過程中修改模塊的對話框參數(shù) (稱為在線修改或動態(tài)修改模塊參數(shù)),如:希望在仿真過程中改變正弦波的頻率,實(shí)現(xiàn)掃頻信號;希望在仿真過程中改變增益模塊增益值,實(shí)現(xiàn)變增益;希望在仿真過程中改變PID控制器增益,實(shí)現(xiàn)自適應(yīng)的PID控制;希望在仿真過程中改變傳遞函數(shù)的分子或分母系數(shù),實(shí)現(xiàn)時(shí)變的傳遞函數(shù)。
本文詳細(xì)介紹Simulink如何在線修改(動態(tài)修改)模塊參數(shù)的方法,并提供原創(chuàng)的DynamicChange Parameter模塊(簡稱DCP模塊),可以輕松解決在線修改(動態(tài)修改)模塊參數(shù)問題,提供詳細(xì)幫助文件和大量例程,簡單易用。
1. 方法
Simulink中的對話框參數(shù)有三種類型:Tunable(可調(diào));Nontunable(不可調(diào));SimOnlyTunable(不可動態(tài)調(diào)整)。需要動態(tài)調(diào)整的參數(shù),必須為可調(diào)(Tunable)類型。
鄭志波《Simulink 模塊參數(shù)在線修改方法的研究》中提到了兩種在線更新參數(shù)的方法:1. 使用全局變量,在m文件中動態(tài)修改全局變量的值,進(jìn)而達(dá)到修改參數(shù)的目的;2. 使用set_param函數(shù),在m文件中動態(tài)設(shè)置對話框參數(shù)。
經(jīng)測試,第一種方法不可行。如圖2所示,Modify_c函數(shù)中對全局變量進(jìn)行動態(tài)更新,使c的取值由0每隔1s增加至11,Simulink運(yùn)行完成后全局變量的c更新為11,模型對全局變量的更新是成功的,但對話框參數(shù)并未隨全局變量的改變而改變,增益c仍然為0。原因是:simulink模塊對變量的讀入只在模型初始化(或開始運(yùn)行)的回調(diào)函數(shù)中執(zhí)行,在仿真進(jìn)行的過程中,盡管對話框參數(shù)的變量值改變了,但是系統(tǒng)并不會讀取更新后的參數(shù)值,仿真中使用的參數(shù)值仍是變量的初始值0。
第二種方法是可行的,該方法可用S函數(shù)來實(shí)現(xiàn),將模塊名和參數(shù)名都作為S函數(shù)的參數(shù),需要改變的參數(shù)值作為S函數(shù)的輸入,在S函數(shù)的狀態(tài)更新(Updata)回調(diào)函數(shù)中,使用set_param函數(shù)對對話框參數(shù)進(jìn)行動態(tài)更新。
本人采用Level-2的S函數(shù)實(shí)現(xiàn)了上述第二種方法,并將其封裝為模塊形式(下文中稱此模塊為DCP模塊),方便在其它模型中調(diào)用。
3. DCP模塊
DCP模塊經(jīng)封裝后,與Simulink自帶模塊完全相同,有兩個(gè)輸入端口,雙擊模塊會彈出屬性對話框,可以在對話框中設(shè)置需要動態(tài)改變的模塊參數(shù)信息。
輸入接口:
接口1 [var] : 需要設(shè)定的參數(shù)值;
接口2[flag] : flag=0時(shí)忽略接口1的輸入,不對參數(shù)進(jìn)行更新;flag~=0時(shí)更新參數(shù)。
對話框參數(shù):
模塊名[block_name] :格式為“mdl文件名/子模型名/模塊名(tag)”,字符串形式;
參數(shù)名[par_name] : 需要動態(tài)修改的參數(shù)變量名,字符串形式,如需要修改增益模塊的增益值,則輸入“Gain”。一般來說,手動輸入模塊名、參數(shù)名比較復(fù)雜而且容易出錯,模塊中采用函數(shù)自動提取模塊名和變量名,用戶只需在所提供的GUI中作出選擇即可。
重置[Reset] : 此復(fù)選框選中時(shí),彈出選擇模塊和參數(shù)設(shè)置GUI,如圖4所示。
圖4 模塊和參數(shù)設(shè)置GUI
采樣模式: 1×2矩陣;設(shè)置模塊的采樣方式(與S函數(shù)中的采樣方式定義相同)。
[0 offset] : 連續(xù)采樣時(shí)間,offset給定時(shí)間偏置;
[ts offset] : 離散采樣時(shí)間,ts為采樣時(shí)間;
[-1, 0] : 繼承采樣時(shí)間,取決于上一模塊的采樣方式和時(shí)間;
參數(shù)維數(shù): 1×2矩陣([行數(shù) 列數(shù)]),表示需要修改參數(shù)的維數(shù)(即接口1中輸入數(shù)據(jù)的維數(shù)),使用本模塊必須保證參數(shù)的維數(shù)不變。
4.使用
DCP模塊配套文件有:
使用步驟如下:
1)將DCP文件夾放置在Matlab工作目錄下;
2)運(yùn)行1次AddFilePath.m文件(僅首次使用DCP模塊時(shí)需要執(zhí)行此步驟);
3)兩種方式將DCP模塊加入到Simulink中:方法一,打開Simulink Library Browser -> User Defined Block模塊組 -> DCP模塊 -> 將DCP模塊拖入Simulink模型中;方法二,復(fù)制例程中的DCP模塊至需要的Simulink模型中。
4)雙擊DCP模塊,彈出屬性設(shè)置對話框,點(diǎn)擊Reset復(fù)選框,彈出模塊和參數(shù)設(shè)置GUI,選擇需要在線修改的模塊和參數(shù),設(shè)置采樣時(shí)間和參數(shù)維度,點(diǎn)擊“OK”確定;
5)將需要修改的參數(shù)值接入DCP模塊的輸入接口1,輸入接口2用于進(jìn)行時(shí)序控制,如不需要進(jìn)行時(shí)序控制,輸入接口2可以接入常數(shù)1。
5. 例程
5.1 DCP模塊實(shí)現(xiàn)可變增益
模型 :DCP_Test01_stairGain.slx
功能描述 :通過動態(tài)改變增益值,實(shí)現(xiàn)階梯上升曲線;
改變參數(shù)的條件 :通過設(shè)置DCP 為離散定步長采樣方式,并給定固定采樣時(shí)間0.1s,來實(shí)現(xiàn)每隔0.1s 改變一次增益值。
結(jié)果 :
說明 :實(shí)際設(shè)定的參數(shù)比期望設(shè)定的要滯后一拍,這說明參數(shù)的更新需要在下一個(gè)步長起作用,0~0.1s內(nèi)設(shè)定的參數(shù)值2為Gain模塊的初始值。
5.2 DCP模塊實(shí)現(xiàn)正弦掃頻信號
模型 :DCP_Test02_sweep.mdl
功能描述 :通過動態(tài)改變正弦波模塊的頻率,實(shí)現(xiàn)掃頻曲線。頻率間隔為1Hz,每個(gè)頻率保持時(shí)間為1s;
改變參數(shù)的條件 :通過輸入接口1 中參數(shù)par_val 的輸入波形來控制,接口1 中輸入的參數(shù)為階梯波(可在Scope__Frequence 中查看),DCP 模塊中的set_param 函數(shù)只會在階梯波發(fā)生突變的時(shí)間執(zhí)行,其它時(shí)間DCP 模塊會執(zhí)行,但其中的set_param 函數(shù)不會執(zhí)行,這不會占用太多的資源。
結(jié)果 :
說明:在整數(shù)秒時(shí)刻(1、2、3 …)頻率突變。
5.3 DCP模塊實(shí)現(xiàn)時(shí)變傳遞函數(shù)
模型 :DCP_Test03_variGs.mdl
功能描述 :通過動態(tài)改變傳遞函數(shù)模塊的分母向量實(shí)現(xiàn)時(shí)變的傳遞函數(shù),在仿真時(shí)間為5s 時(shí),傳遞函數(shù)分母由[1 2 50]突變?yōu)閇1 4 100];
參數(shù)改變的條件 :在仿真時(shí)間等于5s 時(shí),使DCP 模塊的接口2 的flag 值從0 突變到1(這里通過一個(gè)階躍來實(shí)現(xiàn)這個(gè)突變)。DCP 模塊中的set_param 函數(shù)前5s 由于flag=0 不會執(zhí)行;階躍后flag=1,set_param 函數(shù)執(zhí)行一次;之后又由于接口1 中的輸入保持恒定,set_param 函數(shù)也不會再執(zhí)行。
結(jié)果 :
5.4 DCP模塊實(shí)現(xiàn)積分分離PID控制算法
模型 :DCP_Test04_int_separatePID.mdl
功能描述 :通過動態(tài)改變PID 控制器積分增益的值(由0 變?yōu)?.01),來控制積分環(huán)節(jié)的投入與分離,對一個(gè)純滯后的一階系統(tǒng)進(jìn)行控制;仿真表明:積分分離式PID 可無超調(diào)收斂到給定值,常規(guī)PID 有超調(diào),不投入積分時(shí),又會存在穩(wěn)態(tài)誤差。
參數(shù)改變的條件 :當(dāng)偏差信號(指令信號減去給定信號)的絕對值小于閾值(這里取0.3)時(shí),積分增益由0 突變?yōu)?.01,之后保持不變。本例與前述例子的不同之處在于,使用一個(gè)布爾條件作為DCP 模塊接口2 的flag 值。
注意 :由于DCP 模塊中的第二個(gè)接口定義的是double 類型的數(shù)據(jù),所以判斷條件的結(jié)構(gòu)(為布爾量)不能直接接入,需通過一個(gè)數(shù)據(jù)類型轉(zhuǎn)換(Data Type Conversion)模塊進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換之后再輸入到DCP 模塊的接口2。數(shù)據(jù)類型轉(zhuǎn)換模塊的路徑為:Simulink –> Signal Attributes -> Data Type Conversion。
結(jié)果 :
6. 適用范圍
使用set_param修改模塊參數(shù)耗時(shí)較長,如將set_param循環(huán)10000次消耗4.9s,過于頻繁的調(diào)用DCP模塊會使模型仿真速度很慢。為了盡量減少set_param不必要的執(zhí)行,DCP模塊中采用了以下方法:
1)當(dāng)輸入接口1中輸入的變量值與上一采樣時(shí)間相等,即var(k) = var(k-1)時(shí),set_param不執(zhí)行;
2)當(dāng)輸入接口2中輸入0值,即flag=0時(shí),set_param不執(zhí)行;
下面情況請慎用本模塊:需要設(shè)定的參數(shù)連續(xù)變化,即在求解器的每個(gè)時(shí)間(步長)內(nèi)都要執(zhí)行set_param,這將嚴(yán)重影響仿真效率。此時(shí)建議使用“轉(zhuǎn)換”的思想,將對話框參數(shù)變成輸入接口。
DCP 模塊的功能通俗的講,就是將模塊的“對話框參數(shù)”變成一個(gè)“輸入接口”,通過在這個(gè)接口中引入動態(tài)信號(simulink 中連線傳遞的都是動態(tài)信號),來達(dá)到動態(tài)改變參數(shù)的目的。 DCP模塊帶來方便的同時(shí),頻繁執(zhí)行set_param會降低Simulink運(yùn)行速度,因此參數(shù)連續(xù)變化時(shí)需要一種效率更高的解決辦法。
變參數(shù)的問題稍作變化可以得到解決,如例程1 中的變增益問題:如下所示,可直接使用乘法模塊,將信號增益轉(zhuǎn)換成信號乘法,從而實(shí)現(xiàn)將“對話框參數(shù)”轉(zhuǎn)換成“輸入?yún)?shù)”。
當(dāng)然這只是一個(gè)簡單的例子,對于復(fù)雜的問題道理也是相同的,即:使用恰當(dāng)?shù)哪K,將“對話框參數(shù)”轉(zhuǎn)變?yōu)椤拜斎虢涌凇薄M笥袡C(jī)會的話,我將向大家介紹幾種實(shí)現(xiàn)時(shí)變傳遞函數(shù)的方法。
7. 不足之處
1)由于S 函數(shù)中未定義RTW 相關(guān)回調(diào)函數(shù),使用了DCP 模塊的simulink 模型不能編譯。
2)set_param 是在S 函數(shù)中的Updata 回調(diào)函數(shù)中,simulink 的運(yùn)行模式是先執(zhí)行Output回調(diào)函數(shù),再執(zhí)行Updata 回調(diào)函數(shù),所以DCP 模塊中設(shè)置的參數(shù)只能在下一步長中生效,當(dāng)前步長的計(jì)算中仍使用的舊參數(shù),即使用本模塊有一拍的固有延時(shí)(延時(shí)時(shí)間為一個(gè)仿真步長)。觀察Test01 的結(jié)果,0-0.1s 內(nèi),輸出為Gain 的初始值,0.1-0.2s 內(nèi),輸出為0(0 是在0.1s 時(shí)由DCP 設(shè)置的),0.2-0.3s 內(nèi)為0.1 …… 一般來說,當(dāng)simulink 的仿真步長足夠小時(shí),上述的延時(shí)可以忽略不計(jì)。
-
DCP
+關(guān)注
關(guān)注
0文章
30瀏覽量
17247 -
PID控制器
+關(guān)注
關(guān)注
2文章
173瀏覽量
18588 -
GUI
+關(guān)注
關(guān)注
3文章
660瀏覽量
39698 -
RTW
+關(guān)注
關(guān)注
1文章
9瀏覽量
10974 -
simulink仿真
+關(guān)注
關(guān)注
0文章
75瀏覽量
8578
發(fā)布評論請先 登錄
相關(guān)推薦
評論