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