Simulink的回調函數(一)

雲龍派 發佈 2024-03-18T15:45:15.726476+00:00

為了使用戶在數據初始化,模塊拖曳和仿真結果繪圖操作等過程中能夠更加便利,表現力更加豐富,Simulink為用戶提供了一系列的回調函數,使得模型和模塊的動作,甚至跟模塊埠相連接的信號的動作都能夠由用戶自定義,用戶可以建立使用便利,具有個性化的模型執行過程。1.

為了使用戶在數據初始化,模塊拖曳和仿真結果繪圖操作等過程中能夠更加便利,表現力更加豐富,Simulink為用戶提供了一系列的回調函數,使得模型和模塊的動作,甚至跟模塊埠相連接的信號的動作都能夠由用戶自定義,用戶可以建立使用便利,具有個性化的模型執行過程。


1.回調函數的定義

callback functions(回調函數)是因某種操作而觸發對其調用的函數,如按下按鈕或雙擊操作等。對於模型來說,回調函數在Simulink中起著舉足輕重的作用。當執行一系列動作,如選中某個模塊或仿真開始時,回調函數便被觸發執行。使用回調功能可用來執行一個MATLAB腳本或調用MATLAB函數。Simulink 中回調函數的觸發可通過模塊、埠或模塊的參數設置來實現。

常用的Simulink回調函數可應用在以下場合:

打開Simulink模型時自動加載變量到工作空間;
雙擊模塊時執行MATLAB腳本;
仿真開始前進行模型參數的初始化;
仿真結束後將仿真出來的數據繪製圖像;
關閉模型時清除相關變量或關閉圖像。

2.回調跟蹤

當打開模型或對某個模型進行仿真時,回調跟蹤功能可以清楚顯示 Simulink如何調用回調函數以及以何種順序調用它們。在Preferences對話框中選擇Callback tracing選項或者在Command Window中執行set_param(0,'CallbackTracing', 'on') ,即可打開回調跟蹤功能。回調函數被調用時,在MATLAB命令窗口中將顯示回調列表。這個選項對所有Simulink 軟體都適用,而不僅僅對於當前打開的模型。如單擊 MATLAB工具欄Simulink Library按鈕打開Simulink Library Browser時會顯示回調函數過程。

>> set_param(0,'CallbackTracing','on')
Evaluating callback 'PostLoadFcn' for simulink
Callback: setsysloc_simulink(bdroot)
Evaluating callback 'LoadFcn' for simulink/Sources/Waveform Generator
Callback: set_param(gcb,'LoadFlag','1');
Evaluating MaskInitialization for 'simulink/Sources/Waveform Generator': 'if (isequal(LoadFlag,'1'))     derivedSignals.DSMaskLoad(gcbh); end  if (isequal(ApplyFlag,'1'))    ...'.
Evaluating callback 'LoadFcn' for simulink/Sources/Signal Builder
Callback: sigbuilder_block('load');
Evaluating MaskInitialization for 'simulink/Sources/Signal Builder': 'if ~strcmp(get_param(bdroot(gcbh),'SimulationStatus'),'stopped') tuvar = sigbuilder_block('maskInit'...'.
Evaluating callback 'LoadFcn' for simulink/Sinks/XY Graph
Callback: sfunxy([],[],[],'LoadBlock')
Evaluating callback 'LoadFcn' for simulink/Model-Wide Utilities/Model Info
Callback: slcm LoadBlock;
Evaluating callback 'LoadFcn' for simulink/Math Operations/Slider Gain
Callback: sliderGain_cb(gcbh, 'load');

開啟了回調函數追蹤功能之後,可以顯示任何類型的回調函數執行過程。Simulink中回調函數分為模型回調函數、模塊回調函數、埠回調函數和參數回調函數。


3.模型回調函數

可以通過手動或程序⒉種方式創建模型回調函數。在模型菜單中選擇MODELING→Model Properties可以打開模型屬性對話框,如圖所示。

回調函數說明

在對話框中選擇Callbacks選項卡可手動創建模型的回調功能。上圖左側的Modelcallbacks區域顯示各個回調函數的名字,表徵了被調用的時刻,從上到下按照時間先後排序。選中其中任意一個,右側則變為所選回調函數的內容編輯框。如在左側選中PreLoadFcn 時右側編輯框上面變為Model preload function,這時可在編輯框中編寫函數內容。

在 Command Window或M腳本文件中可以通過M代碼設置模型的回調函數。使用set_param命令指定一個MATLAB表達式,這個表達式表示回調函數的內容。舉例說明set _ param設置回調函數的方法:當雙擊test28.slx打開它時,同時會啟動一個消息框顯示「歡迎來到微信公眾號雲龍派 !」的字符串,如圖所示。

set_param('test28','PreLoadFcn','msgbox("歡迎來到微信公眾號雲龍派","information")');

註:set_param的參數均以字符串形式輸入;最後一個參數為回調函數的MATLAB代碼內容;作為字符串形式傳遞給 set_param的第三個參數要以單引號括起來。由於msgbox函數中也需要單引號括起來的字符串,因此就出現了字符串中嵌套字符串的情況,這時最外層的字符串使用單引號括起來,內部的單引號全部改用雙單引號。

通過MATLAB提供的demo模型clutch系統(sldemo_clutch. mdl)可查看同時使用多個回調功能的情況。這個模型定義的回調函數包括:PreLoadFcn、PostLoadFcn , StartFcn,StopFcn和 CloseFcn。

在Command Window中輸入sldemo_clutch並按下回車,可打開下圖的離合器鎖止模型:

>> sldemo_clutch
Evaluating callback 'PostLoadFcn' for sldemo_clutch
Callback: sldemo_clutchplot
>> 

運行此模型的仿真會出現一個GUI面板,勾選輸入/輸出則會將相應的變量顯示到圖形界面,如圖所示。繪製出的圖形和彈出的GUI控制面板是通過StartFcn和 StopFcn回調函數實現的。


4.模塊回調函數

可以通過手動或者M代碼創建模塊回調函數。手動創建模塊的回調函數時通過模塊回調函數的對話框實現。右擊模塊,在右鍵菜單里選擇properties打開模塊屬性對話框,其第三個頁面是Callbacks列表和回調函數內容編輯框,如圖所示。

回調函數說明

注意:如果一個 Simulink模型已經通過MATLAB函數或腳本內部加載,並執行編譯或仿真,則不要在模型內回調函數或模塊回調函數中調用run命令,這樣做會帶來意想不到的後果(如產生錯誤或不正確的結果)。

圖中左側羅列了21個回調函數,可選中其中一個,在右側填人回調函數的代碼內容。或者使用set_param指定一個 MATLAB表達式作為某個回調函數的內容。如設定某模塊被刪除時顯示字符串「This block is being deleted.」 ,在命令窗口中輸入下面的代碼並按回車執行:

>> get_param(gcbh,'Name')


ans =


    'Gain'


>> set_param(gcbh,'DeleteFcn','msgbox("This block is being deleted")')
>> 

命令執行之後,在保證選中該模塊的情況下按下Delete鍵,模塊會被刪除,並彈出如圖所示的消息框。

注意:一個封裝子系統的回調函數不能直接引用封裝子系統的參數。因為Simulink 在Base Workspace計算模塊回調函數的值,而封裝的參數存在於封裝子系統的私有MaskWorkspace 中,必須使用get_param來獲取封裝的參數值。例如, get_param(gcb, 'g_gain'),在這裡參數gain是該子系統封裝之後的封裝參數名。


5.參考內容

[1] 孫忠瀟.Simulink仿真及代碼生成技術入門到精通[M].北京:北京航空航天大學出版社,2015.


本文內容來源於網絡,僅供參考學習,如內容、圖片有任何版權問題,請聯繫處理,24小時內刪除。


作 者 | 郭志龍
編 輯 | 郭志龍
校 對 | 郭志龍

關鍵字: