1前言
S-Function是system-function系統函數的縮寫,是指采用非圖形化的方式描述的一個功能塊。S-Function提供給用戶自己編寫程序來滿足自己要求模型的接口。
2 s-function總體架構
S-function包括主函數和6個子函數,子函數包括
1.mdlInitializeSizes(初始化)
2.mdlDerivatives(連續狀態微分)
3.mdlUpdate(離散狀態更新)
4.mdlOutputs(模塊輸出)
5.mdlGetTimeOfNextVarHit(計算下次采樣時刻)
2.1 s-function 執行過程
- 在仿真開始時,執行mdlInitializeSizes
- 若系統包含連續部分,則調用mdlDerivatives;若系統包含離散部分,則調用mdlUpdate
- 調用mdlOutputs,產生輸出
- 若滿足條件,則執行mdlGetTimeOfNextVarHit
- 循環執行1--3,直至仿真停止
- 執行mdlTerminate,仿真停止
2.2 s-function 輸入輸出參數與狀態變量
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)
S-function是基于狀態空間表達式而設置的仿真模塊,需要了解這個仿真模塊的輸入輸出和內部的狀態變量。
輸入變量:
t :系統時間
x :系統狀態
u : 系統輸入,即在simulink models中連接至S-function的線上的數據。注意區分x和u
flag : 系統狀態,由系統自動生成,決定了系統應當執行哪個S-function子函數
除了這四個必須有的變量,還可以自行根據需要添加變量,供子函數調用
輸出變量:
sys : 系統本身,可以理解為下一時刻的系統;同時sys的前幾個數值(sys[1]等)是系統的輸出,即在simulink中S-function伸出線上的數據
x0 : 系統初始狀態
str : 狀態排序字符串,通常指定為[]。
ts : 可認為是采樣時間
(simStateCompliance 不用管)
3 子函數
3.1 mdlInitializeSizes函數
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
% 不需要更改的內容
sizes = simsizes;
% 需要更改的內容:狀態、輸出、輸入的數量
sizes.NumContStates = 0; %連續狀態的數量
sizes.NumDiscStates = 0; %離散狀態的數量
sizes.NumOutputs = 0; %輸出的數量
sizes.NumInputs = 0; %輸入的數量
sizes.DirFeedthrough = 1; %輸出y和輸入u是否是直通(輸出的向量中是否直接含有輸入)
sizes.NumSampleTimes = 1; %采樣時間
sys = simsizes(sizes);
% 需要更改的內容:狀態變量的初始值
x0 = [];
% 不需要更改的內容
str = [];
% 按需要更改,ts的第一個數字表示采樣時間,第二個數字表示偏移量;連續系統不需要改
% [0 0]——表示默認采樣時間(默認為0.2秒采樣一次);
% [-1 0] ——表示根據連接模塊的采樣頻率進行采樣;
ts = [0 0];
% 按需要更改
simStateCompliance = 'UnknownSimState';
3.3 mdlOutputs函數
function sys=mdlOutputs(t,x,u)
sys = [];
3.4 mdlGetTimeOfNextVarHit函數
function sys=mdlGetTimeOfNextVarHit(t,x,u)
% 計算下一個采樣點的絕對時間,只有當在mdlInitializeSizes中指定了變步長離散采樣時間時,才使用該程序
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
3.5 mdlTerminate函數
function sys=mdlTerminate(t,x,u)
% 終止函數,可添加當Simulink終止時所需執行內容
sys = [];
4 舉例
4.1 二階模型
對于如下被控對象,其傳遞函數為:
仿真結果:曲線重合,三種模型表達方式相同
4.2 簡單自適應控制系統(MRAC)
4.2.1 系統模型與證明
s-function input
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 3;
sizes.NumInputs = 0;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 0;
sys = simsizes(sizes);
x0 = [0.5,0];
str = [];
ts = [];
function sys=mdlDerivatives(t,x,u)
r=sin(4*t);
nmn1=10;
nmn2=25;
sys(1)=x(2);
sys(2)=-nmn1*x(2)-nmn2*x(1)+nmn2*r;
function sys=mdlOutputs(t,x,u)
r=sin(4*t);
nmn1=10;
nmn2=25;
xm=x(1);
dxm=x(2);
ddxm=-nmn1*x(2)-nmn2*x(1)+nmn2*r;
sys(1)=xm;
sys(2)=dxm;
sys(3)=ddxm;
s-function controller
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 1;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 6;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 0;
sys = simsizes(sizes);
x0 = [0];
str = [];
ts = [];
function sys=mdlDerivatives(t,x,u)
xm=u(1);
dxm=u(2);
ddxm=u(3);
x1=u(4);
dx1=u(5);
e=x1-xm;
de=dx1-dxm;
nmn=6;
s=de+nmn*e;
v=ddxm-2*nmn*de-nmn^2*e;
gama=0.5;
sys(1)=-gama*v*s;
function sys=mdlOutputs(t,x,u)
xm=u(1);
dxm=u(2);
ddxm=u(3);
x1=u(4);
dx1=u(5);
e=x1-xm;
de=dx1-dxm;
nmn=6;
mp=x(1);
ut=mp*(ddxm-2*nmn*de-nmn^2*e);
sys(1)=mp;
sys(2)=ut;
s-function plant
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 2;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 3;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;
sys = simsizes(sizes);
x0 = [0.5,0];
str = [];
ts = [0 0];
function sys=mdlDerivatives(t,x,u)
m=2;
ut=u(2);
sys(1)=x(2);
sys(2)=1/m*ut;
function sys=mdlOutputs(t,x,u)
m=2;
sys(1)=x(1);
sys(2)=x(2);
sys(3)=m;
理想位置輸出與真實位置輸出
參數m估計值與真實值
-
仿真器
+關注
關注
14文章
1033瀏覽量
84867 -
狀態機
+關注
關注
2文章
493瀏覽量
28047 -
MRAC
+關注
關注
0文章
4瀏覽量
7205
發布評論請先 登錄
s-function的概念
建立m文件s-function
搭建最基本的S-function模塊
simulink仿真問題:s_function
什么是s-function
如何去實現S-Function與Simulink的數據交互呢
基于MATLAB的時變系統自適應控制的仿真
基于MATLAB S-Function的飛行器運動系統建模與
MATLAB的S-Function編寫指導
SIMULINK s-function的設計
使用Simulink進行S-Function建模的教程PPT課件免費下載

評論