模板函数相关概念
Matlab提供了一个S-Function函数模板,一般直接在模板上稍加修改加以利用,模板函数可通过一下路径进行查找:
1、Polyspace\R2020a\toolbox\simulink\blocks\sfuntmpl.m
2、在matlab的命令行窗口输入edit sfuntmpl
可直接另存为到相关文件夹,并修改相关函数名
S-function name:填入S-function的函数名称;
S-function parameters:填入S-function需要输入的外部参数的名称,如果有多个变量的话,中间用逗号隔开,如a,b,c。
使用edit关联到编辑好的S-Function函数,并将函数名称修改为函数名。
S函数控制流
模板函数的定义形式为function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag),一般来说,S函数的定义形式为[sys,x0,str,ts]=sfunc(t,x,u,flag,p1,…Pn),其中的sfunc为自己定义的函数名称,以上参数中,t、x、u分别对应时间、状态、输入信号,flag为标志位,其取值不同,S函数执行的任务和返回的数据也是不同的,pn为额外的参数,sys为一个通用的返回参数值,其数值根据flag的不同而不同,x0为状态初始数值,str在目前为止的matlab版本中并没有什么作用,一般str=[]即可。
一般只需在模板函数上修改一下几处即可:
【1】[sys,x0,str,ts]=sfunc(t,x,u,flag,p1,…Pn),函数名根据喜好进行修改,u为模块输入,其次可增加p1,…Pn参数,对应于S-function模块界面的S-function parameters,可在模块界面进行外部参数设置;
【2】在function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes初始化函数里进行参数设置,状态变量个数、输入、输出及初始值设置;
【3】在相应的功能函数下进行功能函数编写,注意将相关函数名字修改与第一行一致。
例:state-space equation函数实现
输入信号u=cos(t),输出x1,x2
方法一:Simulink模块实现
使用Continuous>State-Space模块,设置参数如下:
方法二:S-Function函数实现
无S-function parameters:
初始值:
注意x1和x2的导数书写方式如下:
当输出为1个以上时,可使用一下两种方式进行书写:
方法三:Matlab代码实现
// A code block
A=[0 1;-0.8 -0.5];B=[0 ;0.9];C=[1 0;0 1];D=[0;0];
sys=ss(A,B,C,D);
x0=[1 ;3] ;t=[0:0.01:10];u=cos(t);[y T x]=lsim(sys,u,t,x0);
plot(T,x(:,1));plot(T,x(:,2));
例:y=kx函数
将使用3个S-function parameters并进行封装,代码如下:
// An highlighted block
function [sys,x0,str,ts,simStateCompliance] = kx(t,x,u,flag,k1,k2,k3)
switch flag,
case 0,
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
case 1,
sys=mdlDerivatives(t,x,u);
case 2,
sys=mdlUpdate(t,x,u);
case 3,
sys=mdlOutputs(t,x,u,k1,k2,k3); %增加k1,k2,k3
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
case 9,
sys=mdlTerminate(t,x,u
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [0 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u,k1,k2,k3) %增加k1,k2,k3
if (u<-3)
sys=k1*u;
elseif (u>-3&&u<3)
sys=k2*u;
else
sys=k3*u;
end
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];
可在S-function parameters进行参数设置,k1,k2,k3之间用逗号隔开:
封装完将k1,k2,k3设置为模块参数: