S-function入门及案例详解(1)——S-function基础介绍及基本案例
S-function是Simulink最具魅力的地方,為了方便更快速了解Simulink基礎知識,本專題將利用五篇文章對S-function進行介紹及其案例詳解。歡迎關注~
目錄
- 一、S-Function概述
- 1.1 簡介
- 1.2 特點
- 1.3 Level1與Level2形式
- 1.4 S-function模塊
- 二、S-function的幾個相關概念
- 2.1 直接饋通
- 2.2 采樣時間與偏移量
- 三、S-function仿真流程
- 四、S-function函數(shù)詳解
- 4.1 sfuntmpl函數(shù)介紹
- 4.2 mdlInitializeSizes函數(shù)
- 4.3 mdlDerivatives函數(shù)
- 4.4 mdlUpdate函數(shù)
- 4.5 mdlOutputs函數(shù)
- 4.6 mdlGetTimeOfNextVarHit函數(shù)
- 4.7 mdlTerminate函數(shù)
- 小結
一、S-Function概述
1.1 簡介
S-Function是system-function系統(tǒng)函數(shù)的縮寫,是指采用非圖形化的方式(即計算機語言,卻別與Simulink的系統(tǒng)模塊)描述的一個功能塊。說得簡單,S-Function就是用MATLAB所提供的模型不能完全滿足用戶,而提供給用戶自己編寫程序來滿足自己要求模型的接口。
1.2 特點
S-function具有一下特點:
(1)S-function為Simulink的系統(tǒng)函數(shù);
(2)采用非圖形化的方法實現(xiàn)一個動態(tài)系統(tǒng);
(3)可以使用多種語言進行編寫;
(4)能夠響應Simulink求解器命令;
(5)可以開發(fā)新的Simulink模塊;
(6)擴展Simulink功能。M文件的S-function可以擴展圖形能力,C-MEX的S-function可以提供與操作系統(tǒng)的接口;
(7)可以與已有的代碼相結合進行仿真;
(8)可以采用文本方式輸入復雜的系統(tǒng)方程;
(9)S-function的語法結構是為實現(xiàn)一個動態(tài)系統(tǒng)而設計;
1.3 Level1與Level2形式
M文件形式有兩種,Level1和Level2,二者的包裝模塊是不同的。
| level1 | 運行速度快,能處理矩陣數(shù)據(jù) | 只能處理點數(shù)據(jù),不能處理復數(shù)以及基于幀的數(shù)據(jù) |
| level2 | 能夠處理的數(shù)據(jù)類型多,包括矩陣、復數(shù)以及基于幀的數(shù)據(jù) | 運行速度慢 |
1.4 S-function模塊
S-function模塊,位于Simulink/User-Defined Functions模塊庫中,是使S-function圖形化的模板工具,用于為S-function創(chuàng)建一個定值的對話框和圖標。
S-function模塊使得對S-function外部輸入?yún)?shù)的修改更加靈活,可以看作是S-function的一個外殼或這面板。S-function模塊及其參數(shù)對話框如下:
該模塊的參數(shù)設置如下:
- S-function name:填入S-function的函數(shù)名稱,這樣就建立了S-function模塊與M文件形式的S-function之間的對應關系;
- S-function parameters:填入S-function需要輸入的外部參數(shù)的名稱,如果有對各變量,則變量中間用逗號隔開,如a,b,c;
- S-function modules:僅當S-function是用C語言編寫并用MEX工具編譯的C-MEX文件時,才需要填寫該參數(shù);
設置完這些參數(shù)后,S-function模塊就成了一個具有指定功能的模塊,它的功能取決于S-function的內(nèi)容,可以通過修改S-function來改變該模塊的功能。
二、S-function的幾個相關概念
2.1 直接饋通
直接饋通是指輸出直接受控于一個輸入口的值。有一個很好的經(jīng)驗方法可用于判斷輸入是否為直接饋通:
如果輸出函數(shù)(mdlOutputs或flag==3)是輸入u的函數(shù),即,如果輸入u在mdlOutputs中被訪問,則存在直接饋通。
例如,如果系統(tǒng)是y=k*u,其中,u是輸入,k是增益,y是輸出,這就是具有直接饋通輸入的系統(tǒng)。
正確設置直接饋通標志是十分重要的,因為這不僅關系到系統(tǒng)模型中的系統(tǒng)模塊的執(zhí)行順序,還關系到對代數(shù)環(huán)的檢測和處理。
2.2 采樣時間與偏移量
采樣時間是按照固定格式成對指定的:[采樣時間 偏移時間]。
| [0 0] | 連續(xù)采樣時間 |
| [-1 0] | 繼承S-function輸入信號或父層模型的采樣時間 |
| [0.5 0.1] | 離散采樣時間,從0.1s開始每0.5s采樣一次 |
三、S-function仿真流程
S-function包括主函數(shù)和6個功能子函數(shù),包括mdlInitializeSizes(初始化)、mdlDerivatives(連續(xù)狀態(tài)微分)、mdlUpdate(離散狀態(tài)更新)、mdlOutputs(模塊輸出)、mdlGetTimeOfNextVarHit(計算下次采樣時刻)和mdlTerminate(仿真結束)。
在S-function仿真過程中,利用switch-case語句,根據(jù)不同階段對應的flag值(仿真流程標志向量)來調用S-function的不同子函數(shù),以完成對S-function模塊仿真流程的控制。
S-function仿真流程如下:
一個更直觀的流程圖如下,大家可以好好理解一下:
四、S-function函數(shù)詳解
利用命令
edit sfuntmpl可以進入sfuntmpl函數(shù)中,這個函數(shù)由一個主函數(shù)和六個子函數(shù)構成,下面進行一一介紹。
4.1 sfuntmpl函數(shù)介紹
函數(shù)名sfuntmpl可以自由定義,但文件名要與函數(shù)名一致。函數(shù)如下:
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)switch flag,% Initialization %case 0,[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;% Derivatives %case 1,sys=mdlDerivatives(t,x,u);% Update %case 2,sys=mdlUpdate(t,x,u);% Outputs %case 3,sys=mdlOutputs(t,x,u);% GetTimeOfNextVarHit %case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);% Terminate %case 9,sys=mdlTerminate(t,x,u);% Unexpected flags %otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));end輸入量:
t——當前時間;
x——狀態(tài)向量;
u——輸入向量;
flag——標志位(默認為0);
輸出量:
sys——一個通用的返回參數(shù)。返回值取決于flag的值。例如:flag=3,sys則包含了S-function的輸出;
x0——狀態(tài)初始值(如果系統(tǒng)中沒有狀態(tài),則向兩位空);
str——默認為空,無需設置;
ts——采樣時間,包含采樣時間和偏移量;
simStateComplicance——附加變量;
case 0:調用mdlInitializeSizes函數(shù),初始化子函數(shù),必須執(zhí)行;
case1:調用mdlDerivatives函數(shù),連續(xù)狀態(tài)的導數(shù);
case2:對離散狀態(tài)進行更新,更新到x(n+1);
case3:調用mdlOutputs函數(shù),系統(tǒng)輸出y;
case4:調用mdlGetTimeOfNextVarHit函數(shù),下一個采樣時間點;
case9:調用mdlTerminate函數(shù),函數(shù)終止;
接下來對這五個子函數(shù)進行分別介紹。
4.2 mdlInitializeSizes函數(shù)
mdlInitializeSizes函數(shù)代碼如下:
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes% sizes = simsizes;sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 0; sizes.NumInputs = 0; sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1; % at least one sample time is neededsys = simsizes(sizes);% initialize the initial conditions x0 = [];% str is always an empty matrix str = [];% initialize the array of sample times ts = [0 0];simStateCompliance = 'UnknownSimState';其中size屬性如下:
sizes.NumContStates = 0; %連續(xù)狀態(tài)的數(shù)量
sizes.NumDiscStates = 0; %離散狀態(tài)的數(shù)量
sizes.NumOutputs = 0; %輸出的數(shù)量
sizes.NumInputs = 0; %輸入的數(shù)量
sizes.DirFeedthrough = 1; %輸出y和輸入u是否是直通
sizes.NumSampleTimes = 1; %采樣時間
x0表示初始狀態(tài);ts表示采樣時刻;
【注意】:
ts的第一個數(shù)字表示采樣時間,第二個數(shù)字表示偏移量;
[0 0]——表示默認采樣時間(默認為0.2秒采樣一次);
[-1 0] ——表示根據(jù)連接模塊的采樣頻率進行采樣;
4.3 mdlDerivatives函數(shù)
連續(xù)狀態(tài)的導數(shù),默認為空。
函數(shù)代碼如下:
4.4 mdlUpdate函數(shù)
離散狀態(tài)的更新。
函數(shù)代碼如下:
4.5 mdlOutputs函數(shù)
輸出。
函數(shù)代碼如下:
4.6 mdlGetTimeOfNextVarHit函數(shù)
下一個采樣時間點,在一秒鐘之后進行下一次采樣。
函數(shù)代碼如下:
4.7 mdlTerminate函數(shù)
終止函數(shù)。
函數(shù)代碼如下:
小結
| 0 | mdlInitializeSizes | 定義S-function模塊的基本特性,包括采樣時間,連續(xù)和離散狀態(tài)的初始化條件,以及sizes數(shù)組 |
| 1 | mdlDerivatives | 計算連續(xù)狀態(tài)變量的導數(shù) |
| 2 | mdlUpdate | 更新離散狀態(tài)、采樣時間、主步長等必需條件 |
| 3 | mdlOutputs | 計算S-function的輸出 |
| 4 | mdlGetTimeOfNextVarHit | 計算下一個采樣點的絕對時間,只有當在mdlInitializeSizes中指定了變步長離散采樣時間時,才使用該程序 |
| 9 | mdlTerminate | 執(zhí)行Simulink終止時所需的任何任務 |
ok!下一篇文章S-function入門及案例詳解(2)——S-function基本案例介紹將介紹一下S-function的基礎案例。
如果對你有所幫助,記得點個贊喲~
總結
以上是生活随笔為你收集整理的S-function入门及案例详解(1)——S-function基础介绍及基本案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 16F877A和24C02通信汇编语言,
- 下一篇: outlook中的邮件归档