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 = [];