S-Function小结

模板函数相关概念

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函数实现

state-space equation
输入信号u=cos(t),输出x1,x2

方法一:Simulink模块实现

结构图
使用Continuous>State-Space模块,设置参数如下:
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设置为模块参数:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值