0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

S-function詳解與模型參考自適應(yīng)仿真案例

冬至子 ? 來源:控我所思VS制之以衡 ? 作者:控我所思 ? 2023-06-30 17:03 ? 次閱讀

1前言

S-Function是system-function系統(tǒng)函數(shù)的縮寫,是指采用非圖形化的方式描述的一個功能塊。S-Function提供給用戶自己編寫程序來滿足自己要求模型的接口

2 s-function總體架構(gòu)

S-function包括主函數(shù)和6個子函數(shù),子函數(shù)包括

1.mdlInitializeSizes(初始化)

2.mdlDerivatives(連續(xù)狀態(tài)微分)

3.mdlUpdate(離散狀態(tài)更新)

4.mdlOutputs(模塊輸出)

5.mdlGetTimeOfNextVarHit(計算下次采樣時刻)

6.mdlTerminate(仿真結(jié)束)。

2.1 s-function 執(zhí)行過程

  1. 在仿真開始時,執(zhí)行mdlInitializeSizes
  2. 若系統(tǒng)包含連續(xù)部分,則調(diào)用mdlDerivatives;若系統(tǒng)包含離散部分,則調(diào)用mdlUpdate
  3. 調(diào)用mdlOutputs,產(chǎn)生輸出
  4. 若滿足條件,則執(zhí)行mdlGetTimeOfNextVarHit
  5. 循環(huán)執(zhí)行1--3,直至仿真停止
  6. 執(zhí)行mdlTerminate,仿真停止

2.2 s-function 輸入輸出參數(shù)與狀態(tài)變量

function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)

S-function是基于狀態(tài)空間表達(dá)式而設(shè)置的仿真模塊,需要了解這個仿真模塊的輸入輸出和內(nèi)部的狀態(tài)變量。

輸入變量:

t :系統(tǒng)時間

x :系統(tǒng)狀態(tài)

u : 系統(tǒng)輸入,即在simulink models中連接至S-function的線上的數(shù)據(jù)。注意區(qū)分x和u

flag : 系統(tǒng)狀態(tài),由系統(tǒng)自動生成,決定了系統(tǒng)應(yīng)當(dāng)執(zhí)行哪個S-function子函數(shù)

除了這四個必須有的變量,還可以自行根據(jù)需要添加變量,供子函數(shù)調(diào)用

輸出變量:

sys : 系統(tǒng)本身,可以理解為下一時刻的系統(tǒng);同時sys的前幾個數(shù)值(sys[1]等)是系統(tǒng)的輸出,即在simulink中S-function伸出線上的數(shù)據(jù)

x0 : 系統(tǒng)初始狀態(tài)

str : 狀態(tài)排序字符串,通常指定為[]。

ts : 可認(rèn)為是采樣時間

(simStateCompliance 不用管)

3 子函數(shù)

3.1 mdlInitializeSizes函數(shù)

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes

% 不需要更改的內(nèi)容
sizes = simsizes;

% 需要更改的內(nèi)容:狀態(tài)、輸出、輸入的數(shù)量
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; %采樣時間

sys = simsizes(sizes);

% 需要更改的內(nèi)容:狀態(tài)變量的初始值
x0  = [];

% 不需要更改的內(nèi)容
str = [];

% 按需要更改,ts的第一個數(shù)字表示采樣時間,第二個數(shù)字表示偏移量;連續(xù)系統(tǒng)不需要改
% [0 0]——表示默認(rèn)采樣時間(默認(rèn)為0.2秒采樣一次);
% [-1 0] ——表示根據(jù)連接模塊的采樣頻率進(jìn)行采樣;
ts  = [0 0];

% 按需要更改
simStateCompliance = 'UnknownSimState';

1.jpg

3.3 mdlOutputs函數(shù)

function sys=mdlOutputs(t,x,u)

sys = [];

3.4 mdlGetTimeOfNextVarHit函數(shù)

function sys=mdlGetTimeOfNextVarHit(t,x,u)
% 計算下一個采樣點(diǎn)的絕對時間,只有當(dāng)在mdlInitializeSizes中指定了變步長離散采樣時間時,才使用該程序
sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;

3.5 mdlTerminate函數(shù)

function sys=mdlTerminate(t,x,u)
% 終止函數(shù),可添加當(dāng)Simulink終止時所需執(zhí)行內(nèi)容

sys = [];

4 舉例

4.1 二階模型

對于如下被控對象,其傳遞函數(shù)為:

1.jpg

圖片

仿真結(jié)果:曲線重合,三種模型表達(dá)方式相同

圖片

4.2 簡單自適應(yīng)控制系統(tǒng)(MRAC)

4.2.1 系統(tǒng)模型與證明

1.jpg

圖片

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;

理想位置輸出與真實(shí)位置輸出

圖片

參數(shù)m估計值與真實(shí)值

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1018

    瀏覽量

    83765
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    492

    瀏覽量

    27548
  • MRAC
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    7174
收藏 人收藏

    評論

    相關(guān)推薦

    s-function的概念

    s-function是一個動態(tài)系統(tǒng)的計算機(jī)語言描述,在MATLAB里,用戶可以選擇用m文件編寫,也可以用c或mex文件編寫,在這里只給大家介紹如何用m文件編寫s-function
    發(fā)表于 07-13 14:15

    建立m文件s-function

    輸出參數(shù),最好不做修改。接下去的工作就是根據(jù)所編s-function要完成的任務(wù),用相應(yīng)的代碼去替代模板里各個子函數(shù)的代碼即可。Simulink在每個仿真階段都會對s-function進(jìn)行調(diào)用,在調(diào)用
    發(fā)表于 07-13 14:16

    橫潤科技《MATLAB的S-Function編寫指導(dǎo)

    橫潤科技《MATLAB的S-Function編寫指導(dǎo)pdf格式100頁,介紹simulink中s函數(shù)的編寫。
    發(fā)表于 08-05 10:04

    搭建最基本的S-function模塊

    simulink中搭建模型,都是先搭simulink中有的東西,然后碰到simulink中沒有的才會去建S-function,那么在這個時候,你就很清楚你的S-function具體是干什么的,他應(yīng)該有什么輸出,有
    發(fā)表于 12-24 12:22

    matlab原版 developing S-function

    matlab原版 developing S-function
    發(fā)表于 11-14 11:31

    simulink仿真問題:s_function

    我在仿真時,用一個FCN,就是z形式的傳遞函數(shù),運(yùn)行是可以的。但是當(dāng)我用s-function,即離散化語言來表達(dá)這個傳遞函數(shù), 替換原來的FCN,其他的都沒變,現(xiàn)象就出不來了。有大牛知道是怎么回事嘛???謝謝了
    發(fā)表于 08-17 15:52

    S-function的工作原理解析

    S-function函數(shù)S-function工作原理
    發(fā)表于 12-31 06:17

    什么是s-function

    S-function一、什么是s-function(1)非圖形化地實(shí)現(xiàn)一個動態(tài)系統(tǒng)(2)支持多種語言編寫(3)s-function是以現(xiàn)代控制理論的狀態(tài)方程為基礎(chǔ)的二、如何編寫一個自己
    發(fā)表于 08-30 08:10

    如何去實(shí)現(xiàn)S-Function與Simulink的數(shù)據(jù)交互呢

    什么是S-Function?如何使用S-Function函數(shù)呢?如何去實(shí)現(xiàn)S-Function與Simulink的數(shù)據(jù)交互呢?
    發(fā)表于 11-22 07:48

    基于MATLAB的時變系統(tǒng)自適應(yīng)控制的仿真

    本文介紹了基于MATLAB 的仿真工具SIMULINK,對于線性時變系統(tǒng)的模型參考自適應(yīng)控制的仿真研究,并給出了仿真結(jié)果。關(guān)鍵詞: MATL
    發(fā)表于 06-13 08:59 ?36次下載

    基于MATLAB S-Function的飛行器運(yùn)動系統(tǒng)建模與

    本文講述了使用Matlab/S-Function 建模與仿真的一種方法。主要介紹如何對飛行器的運(yùn)動學(xué)方程進(jìn)行S 函數(shù)建模,并分析了S 函數(shù)各模塊的編寫及功能。分析表明對于復(fù)雜的運(yùn)動系
    發(fā)表于 12-16 13:36 ?60次下載

    MATLAB的S-Function編寫指導(dǎo)

    S-Function(系統(tǒng)函數(shù))為擴(kuò)展Simulink®的性能提供了一個有力的工具。以下下節(jié)闡述了什么是S-Function,為什么可以使用S-Function,以及怎樣編寫自己的S-
    發(fā)表于 08-16 16:39 ?146次下載

    SIMULINK s-function的設(shè)計

    SIMULINK  s-function的設(shè)計Simulink為用戶提供了許多內(nèi)置的基本庫模塊,通過這些模塊進(jìn)行連接而構(gòu)成系統(tǒng)的模型。對于那些經(jīng)常使用的模塊進(jìn)行組合并封裝可以構(gòu)
    發(fā)表于 06-19 12:55 ?2278次閱讀

    系統(tǒng)辨識與自適應(yīng)控制MATLAB仿真

    自適應(yīng)控制MATLAB仿真
    發(fā)表于 11-29 15:59 ?0次下載

    使用Simulink進(jìn)行S-Function建模的教程PPT課件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用Simulink進(jìn)行S-Function建模的教程PPT課件免費(fèi)下載包括了:1 Simulink S函數(shù)仿真應(yīng)用,2 M-file S-functi
    發(fā)表于 10-08 08:00 ?0次下載
    使用Simulink進(jìn)行<b class='flag-5'>S-Function</b>建模的教程PPT課件免費(fèi)下載