1. 程式人生 > >matlab中關於S-fun的調用以及子系統的封裝

matlab中關於S-fun的調用以及子系統的封裝

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為空矩陣
otherwise 
% 異常處理 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);% 這裏寫入系統的輸出方程矩陣形式即可 % 修改這個函數可以得到任意的波形輸出 % 系統輸出方程函數結束
View Code

之後要使S-fun模塊調用編寫好的S函數,需要設置模塊的參數。進入子系統,雙擊S-Function模塊,把S函數M文件的名稱填入S-Function name,再填寫模塊的參數,如幅值(Amp)等...

技術分享圖片

③封裝子系統。右擊子系統模塊,選擇Mask-->Create Mask,進入封裝編輯界面。如下圖,在左側導航欄點擊Edit創建模塊參數,之後設置好參數的名稱、標題、初始值等。

技術分享圖片

技術分享圖片

點擊左下角的Preview可以預覽參數設置對話框。

技術分享圖片

④仿真觀察結果。

matlab中關於S-fun的調用以及子系統的封裝