simulink中S函數(shù)使用方法

S函數(shù)L1使用方法介紹

1. 流程解釋

S函數(shù)分為L(zhǎng)1和L2兩級(jí),其中L1的模塊只能單輸入單輸出,而L2是可以多輸入多輸出的。這里僅涉及L1的Matlab語言S函數(shù)使用,應(yīng)用于機(jī)器人仿真控制設(shè)計(jì)。

首先是官方流程(翻譯),如下圖:

然后是一與代碼相關(guān)的參考流程圖(有修改):

2. 偽代碼流程解釋

main
{
    初始化模型;  //0;mdlInitializeSizes
    //計(jì)算下一個(gè)采樣時(shí)間點(diǎn)(大步長(zhǎng));  //4;mdlGetTimeOfNextVarHit
    while(未到達(dá)仿真終止時(shí)間)
    {
    計(jì)算下一個(gè)采樣時(shí)間點(diǎn)(大步長(zhǎng));  //4;mdlGeTimeOfNextVarHit 根據(jù)官網(wǎng)流程修改
        計(jì)算模塊的輸出;  //3;mdlOutputs
        更新離散狀態(tài)量;  //2;mdlUpdate
        if(此模型帶有連續(xù)狀態(tài)模塊)  
        {
     here:計(jì)算模塊的輸出; //3;mdloutputs
           計(jì)算微分;  //1;mdlDerivatives
            if(精度未達(dá)標(biāo))
                goto here;
            過零檢測(cè);
            計(jì)算寫一個(gè)采樣時(shí)間點(diǎn)(大步長(zhǎng));
        }
    }
    執(zhí)行仿真終止動(dòng)作;   //9;mdlTerminate   
}

3. L1模板代碼及其解釋

%% S-Funtion Usage Template and Comprehention

%% sfun總函數(shù)
function [sys, x0, str, ts, simStateCompliance] = learnSFunction(t, x, u, flag, p1, p2)
%==============================================================================
% sys   sfun調(diào)用的系統(tǒng)模型,有sys(1~7)種狀態(tài)屬性
% x0    sys的初始狀態(tài)
% str   狀態(tài)排序字符串,一般為空
% ts    采樣時(shí)間
% 詳細(xì)使用見initialize
%
% t     系統(tǒng)時(shí)間,與u和x有關(guān)
% x     系統(tǒng)狀態(tài)變量
% u     系統(tǒng)輸入變量(simulink中給u的,用u(index)表示)
%==============================================================================
switch flag % 狀態(tài)機(jī),通過系統(tǒng)自動(dòng)計(jì)算和改變
    case 0  % 初始化
        [sys, x0, str, ts, simStateCompliance] = mdlInitializeSizes;
    case 1  % 返回定義的連續(xù)型狀態(tài)導(dǎo)數(shù)模型
        sys = mdlDerivatives(t, x, u);
    case 2  % 更新離散狀態(tài)X0,sys=X(n+1)
        sys = mdlUpdate(t, x, u);
    case 3  % 通過u將參數(shù)從模塊傳出
        sys = mdlOutputs(t, x, u);
    case 4  % 離散時(shí)使用,抓取下一個(gè)采樣的T給sys
        sys = mdlGetTimeOfNextVarHit(t, x, u);
    case 9  % sys結(jié)束時(shí)定義功能,默認(rèn)清除sys使得sys=[]
        sys = mdlTerminate(t, x, u);
    otherwise % 報(bào)錯(cuò)
        DAStudio.error('Simulation: blocks : unhandledFlag: ', num2str(flag));
end

%% 初始化函數(shù)
function [sys, x0, str, ts, simStateCompliance] = mdlInitializeSizes

size = simsizes;
size.NumInputs      = 0;    % 輸入的數(shù)量
size.NumOutputs     = 0;    % 輸出的數(shù)量
size.NumContStates  = 0;    % 連續(xù)狀態(tài)的數(shù)量
size.NunDiscStates  = 0;    % 離散狀態(tài)的數(shù)量
size.DirFeedThrough = 1;    % 是否直通(直通可以在flag3-output中使用變量u中的內(nèi)容)
size.NumSampleTimes = 1;    % ts的采樣時(shí)間數(shù)量,代表其行數(shù)(row)

sys = simsizes(size);
x0 = [];
str=[];
simStateCompliance = 'UnknownSimState';

%=============================================================================
% ts是一個(gè) NumSampleTimes*2 的矩陣,每行代表一個(gè)采樣點(diǎn),
% 每行代表[period offset],幾種寫法含義如下:
% [0 0] : 系統(tǒng)為連續(xù)時(shí)間
% [0 1] : 系統(tǒng)時(shí)間連續(xù),但以很小的步長(zhǎng)采樣
% [-2 0]: 變步長(zhǎng)時(shí)間采樣,通過flag4-mdlGetTimeOfNextVarHit抓取
% [x y] : 其余的寫法代表period為采樣總時(shí)間,offset為采樣間隔
%         其中    period>0, offset<period
%=============================================================================
ts = [0 0];


%% mdlUpdate
%=============================================================================
% 狀態(tài)更新、timehit、時(shí)間步長(zhǎng)時(shí)的具體要求
%=============================================================================
function sys=mdlUpdate(t,x,u)
sys = [];


%% 其它功能函數(shù)
function sys=mdlDerivatives(t,x,u)
sys = [];


function sys=mdlOutputs(t,x,u)
sys = [];


function sys=mdlGetTimeOfNextVarHit(t,x,u)
%  例子,設(shè)置下一抓取(hit)時(shí)間點(diǎn)為1s后
sampleTime = 1;    
sys = t + sampleTime;


function sys=mdlTerminate(t,x,u)
sys = [];


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容