matlab中關於S-fun的調用以及子系統的封裝
阿新 • • 發佈:2019-01-27
irf spa 文件名 系統 關於 設置 otherwise mar 步驟
近日學習matlab建模方面的東西,mark一個網站:http://wtclab.net/txfz/jkmulu.html,邵玉斌老師的教案。
本篇記錄一個包含S函數的子系統的建立和封裝,用S函數產生任意正弦波。
matlab版本:R2017b
步驟如下:
①首先建立主系統模型。在命令行窗口輸入simulink,在彈出的窗口中新建Blank Model,接著點擊simulink工具欄的Library Browser,從中選取模塊搭建主系統模型,如下圖。
接著,雙擊Subsystem搭建子系統內部模型,如下圖。
②系統模型搭建好之後,新建M文件編寫S函數,示例代碼如下。(註意:函數名需與M文件名一致。)
function [sys,x0,str,ts] =example1Sfun(t,x,u,flag,Amp,Freq,Phase) % 正弦波信號源 switch flag case 0 % flag=0 初始化 [sys,x0,str,ts]=mdlInitializeSizes; case 3 % flag=3 計算輸出 sys=mdlOutputs(t,Amp,Freq,Phase); case {1, 2, 4, 9 } % 其他作不處理的flag sys=[]; % 無用的flag時返回sys為空矩陣 otherwiseView Code% 異常處理 error([‘Unhandled flag = ‘,num2str(flag)]); end % 主函數結束 % 子函數實現(1)初始化函數---------------------------------- function [sys,x0,str,ts] = mdlInitializeSizes % sizes = simsizes; % 獲取SIMULINK仿真變量結構 sizes.NumContStates = 0; % 連續系統的狀態數為0 sizes.NumDiscStates = 0; % 離散系統的狀態數為0 sizes.NumOutputs= 1; % 輸出信號數目是1 sizes.NumInputs = 0; % 輸入信號數目是0 sizes.DirFeedthrough = 0; % 該系統不是直通的 sizes.NumSampleTimes = 1; % 這裏必須為1 sys = simsizes(sizes); str = []; % 通常為空矩陣 x0 = []; % 初始狀態矩陣x0 (零狀態情況) ts = [0 0]; % 表示連續取樣時間的仿真 % 初始化函數結束 % 子函數實現(2)系統輸出方程函數----------------------------- function sys = mdlOutputs(t,Amp,Freq,Phase) sys = Amp*sin(2*pi*Freq*t+Phase);% 這裏寫入系統的輸出方程矩陣形式即可 % 修改這個函數可以得到任意的波形輸出 % 系統輸出方程函數結束
之後要使S-fun模塊調用編寫好的S函數,需要設置模塊的參數。進入子系統,雙擊S-Function模塊,把S函數M文件的名稱填入S-Function name,再填寫模塊的參數,如幅值(Amp)等...
③封裝子系統。右擊子系統模塊,選擇Mask-->Create Mask,進入封裝編輯界面。如下圖,在左側導航欄點擊Edit創建模塊參數,之後設置好參數的名稱、標題、初始值等。
點擊左下角的Preview可以預覽參數設置對話框。
④仿真觀察結果。
matlab中關於S-fun的調用以及子系統的封裝