吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

請問Simulink如何在線動態修改模塊參數呢?

冬至子 ? 來源:Matlab Fans ? 作者:Matlab_Fans ? 2023-07-20 17:23 ? 次閱讀

典型的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.jpg

使用步驟如下:

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
    DCP
    +關注

    關注

    0

    文章

    30

    瀏覽量

    17290
  • PID控制器
    +關注

    關注

    2

    文章

    173

    瀏覽量

    18671
  • GUI
    GUI
    +關注

    關注

    3

    文章

    662

    瀏覽量

    39893
  • RTW
    RTW
    +關注

    關注

    1

    文章

    9

    瀏覽量

    10991
  • simulink仿真
    +關注

    關注

    0

    文章

    75

    瀏覽量

    8611
收藏 人收藏

    評論

    相關推薦

    何在代碼中動態修改手指電容?

    何在代碼中動態修改手指電容
    發表于 05-22 07:11

    GUI控制simulink模塊參數的綜合實例

    和slider的聯合使用,及利用edit text 和slider 對simulink 參數動態修改;4、演示了simulink
    發表于 03-20 11:13

    Simulink在線修改參數

    求助各位大神!有什么方法可以實現在線修改simulink模塊參數,比如電阻模塊的阻值按照某個函
    發表于 04-24 11:46

    在gui中修改simulink參數一直報錯顯示

    在gui中修改simulink參數set_param('mo/Pulse Generator','Period',1/hz)一直報錯顯示,怎么解決,修改其他
    發表于 11-20 19:05

    何在simulink初始化電機參數

    何在simulink初始化電機參數?最近有很多同學問,在模型里面為什么有Ld、Lq、Ts等參數,這些參數如何設置。這些
    發表于 07-07 07:05

    如何對基于matlab╱simulink的礦井低壓電纜絕緣參數在線監測系統進行仿真

    電纜絕緣參數在線監測的原理是什么?如何對基于matlab╱simulink的礦井低壓電纜絕緣參數在線監測系統進行仿真?
    發表于 09-06 06:55

    怎樣使用STM32去支持并運行RTT動態模塊

    的驅動,因為最終編譯的動態模塊需要在文件系統中。進入到bsp目錄,使用env工具配置如下:為了支持動態模塊的運行,修改 bsp 對應的 rt
    發表于 06-08 10:58

    請問何在Peripheral例程修改“外圍設備首選連接參數”?

    如題,APP查看GAP 屬性外圍設備首選連接參數為:50 00 80 00 E8 03。通讀Peripheral例程,對應不上。請問何在Peripheral例程修改“外圍設備首選連接
    發表于 10-09 06:47

    何在S32K的simulink中添加FreeRTOS?

    何在 S32K 的 simulink 中添加 FreeRTOS?工具箱中沒有 FreeRTOS 模塊
    發表于 05-09 06:52

    請問N32926能否調用動態?需要修改內核嗎?

    現在需要開發一個項目,中間需要用到第三方的動態庫,請問N32926能否調用動態,需要修改內核嗎?
    發表于 06-14 09:14

    SIMULINK功能模塊的處理

    SIMULINK功能模塊的處理功能模塊的基本操作,包括模塊的移動、復制、刪除、轉向、改變大小、模塊命名、顏色設定、
    發表于 06-19 12:50 ?2552次閱讀

    simulink模塊簡單介紹

    simulink模塊介紹simulink模塊介紹simulink模塊介紹
    發表于 12-29 10:46 ?0次下載

    SIMULINK仿真基礎及模塊介紹

    SIMULINK是MATLAB軟件的擴展,它是實現動態系統建模和仿真的一個軟件包,它與MATLAB語言的主要區別在于,其與用戶交互接口是基于Windows的模型化圖形輸入,其結果是使得用戶可以把更多
    發表于 01-24 17:50 ?0次下載

    PLC控制系統如何實現在線修改程序和在線修改配置(CCOTF)

    修改,這樣就可以實現在線修改程序和在線修改配置(CCOTF)。 在線
    的頭像 發表于 09-23 09:55 ?1.4w次閱讀
    PLC控制系統如何實現<b class='flag-5'>在線</b><b class='flag-5'>修改</b>程序和<b class='flag-5'>在線</b><b class='flag-5'>修改</b>配置(CCOTF)

    如何動態修改cron參數

    按正常來講,修改定時任務的執行周期,把服務停下來,改下任務的cron參數,再重啟服務就搞搞定了。這種方式很簡單,沒有可說的,但是有沒有一種可能,在不停服務的情況下,就可以動態修改任務
    的頭像 發表于 04-12 11:04 ?1984次閱讀
    明升投注网 | 金博士百家乐官网娱乐城| 百家乐网址是多少| 边城棋牌游戏下载| 金三角百家乐官网的玩法技巧和规则 | 百家乐翻天电影| 百家乐官网桌台布| 怎样玩百家乐的玩法技巧和规则 | 百家乐新庄| 百家乐官网分析绿色版| 游戏机百家乐的技术| 百家乐官网打庄技巧| 皇冠百家乐赢钱皇冠| 大发百家乐官网现金网| 玩百家乐凤凰娱乐城| 吕梁市| 黄金城百家乐官网手机版| 真钱轮盘游戏| 百家乐澳门百家乐| 云梦县| 迪威百家乐娱乐平台| 澳门百家乐官网怎玩| 威尼斯人娱乐城游戏lm0| 百家乐官网免费送现金| 亿酷棋牌世界| 属蛇做生意坐向| 新化县| 找查百家乐玩法技巧| 百家乐官网视频游戏大厅| 威尼斯人娱乐 老品牌| 百家乐官网凯时赌场娱乐网规则| 棋牌游戏论坛| 百家乐最新投注法| 百家乐官网代理龙虎| 狮威百家乐的玩法技巧和规则| 百家乐官网赌注| 皇冠国际| 宝马会百家乐的玩法技巧和规则| 百家乐官网赢钱面面观| 澳门赌博攻略| 百家乐国际娱乐场开户注册|