S-function入门及案例详解(2)——S-function基本案例介绍

目录

一、案例1——对波形的幅值进行放大

1.1 案例分析

设置波形幅值放大器,对输入波形进行3倍放大,即y=3*u。

1.2 案例详解

步骤1.可以修改sfuntmpl函数的名称(这里修改为fuzhi)

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

步骤2.进行初始化
一个输出,一个输入,输入与输出为直通,
因此,将相应属性设置为1:

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; 

步骤3.修改mdlOutputs函数相关代码

function sys=mdlOutputs(t,x,u)

sys = 3*u;

步骤4.新建一个simunk文件,将s-function的参数改为如下形式
S-function入门及案例详解(2)——S-function基本案例介绍
步骤5.搭建simulink
S-function入门及案例详解(2)——S-function基本案例介绍

1.3 输出波形

S-function入门及案例详解(2)——S-function基本案例介绍
可以发现,输出波形为输入的3倍,成功~

二、案例2——对波形的幅值进行放大拓展

2.1 案例分析

设置波形幅值放大器,对输入波形进行放大,输出y=gain*x。

2.2 案例详解

步骤1.可以修改sfuntmpl函数的名称(这里修改为fuzhi),并在括号内增加输入参数

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

步骤2.在case3和mdlOutputs中均加入gain参数,并修改mdlOutputs函数

  case 3,
    sys=mdlOutputs(t,x,u,gain);

function sys=mdlOutputs(t,x,u,gain)
	sys = gain*u;

步骤3.进行初始化
一个输出,一个输入,输入与输出为直通,
因此,将相应属性设置为1:

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; 

步骤4.新建一个simunk文件,将s-function的参数改为如下形式
S-function入门及案例详解(2)——S-function基本案例介绍
【这里设置为gain=4】

步骤5.搭建simulink
(同上)

2.3 输出波形

S-function入门及案例详解(2)——S-function基本案例介绍
可以发现,输出波形为输入的4倍,成功~

三、案例3——对波形的幅值进行放大拓展

3.1 案例分析

设置波形幅值放大器,对输入波形进行放大,要求由用户指定倍数,即用户指定gain,输出y=gain*x。

3.2 案例详解

步骤1-3同上

步骤4.新建一个simunk文件,将s-function的参数改为如下形式
右击“s-function”——>点击“Mask”——>选择“Create Mask”
S-function入门及案例详解(2)——S-function基本案例介绍
选择“Parameters & Dialog”——>选择“Edit”。
S-function入门及案例详解(2)——S-function基本案例介绍
“Prompt”为提示,这里输入GAIN;“Name”为参数,要与输入参数一致,这里为gain;
S-function入门及案例详解(2)——S-function基本案例介绍

步骤5.右击“Block Parameters”,打开
S-function入门及案例详解(2)——S-function基本案例介绍
将s-function的参数改为如下形式:
S-function入门及案例详解(2)——S-function基本案例介绍

步骤6.搭建simulink
(同上)

步骤7.双击s-function,设置gain
这里设置为gain=6

3.3 输出波形

S-function入门及案例详解(2)——S-function基本案例介绍
可以发现,输出波形为输入的6倍,成功~

四、案例4——对离散输入进行延时

4.1 案例分析

设置一个延时模块,对离散输入进行延时输出。
x(n+1)=u(n);y(n)=x(n);

4.2 案例详解

步骤1.可以修改sfuntmpl函数的名称(这里修改为fuzhi)

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

步骤2.进行初始化
离散状态,一个输出,一个输入,
因此,将相应属性设置为1:

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 1;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1; 

设置初始值:

x0  = 2;

设置采样时间:【0.5s采样一次】

ts=[0.5 0];

步骤3.修改mdlUpdate函数和mdlOutputs函数

mdlUpdate函数为下一个状态函数,这里修改为:

function sys=mdlUpdate(t,x,u)

sys = u;

mdlOutputs函数为输出函数,这里修改为:

function sys=mdlOutputs(t,x,u)

sys = x;

步骤4.搭建simulink

S-function入门及案例详解(2)——S-function基本案例介绍

4.3 输出波形

S-function入门及案例详解(2)——S-function基本案例介绍
蓝色表示原始阶跃输入,黄色表示延时输入(初始状态为2,0.5s采样一次);

五、案例5——对输入进行积分

5.1 案例分析

设置一个求导,对输入进行求导输出。
dx=u;y=x;

5.2 案例详解

步骤1.可以修改sfuntmpl函数的名称(这里修改为fuzhi)

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

步骤2.进行初始化
连续状态,一个输出,一个输入,
因此,将相应属性设置为1:

sizes.NumContStates  = 1;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; 

设置初始值:

x0  = 0;

设置采样时间:【连续系统无法设置采样时间,因此这里为[0 0]】

ts=[0 0];

步骤3.修改mdlDerivatives函数和mdlOutputs函数

mdlDerivatives函数为求导,这里修改为:

function sys=mdlDerivatives(t,x,u)

sys = u;

mdlOutputs函数为输出函数,这里修改为:

function sys=mdlOutputs(t,x,u)

sys = x;

步骤4.搭建simulink
S-function入门及案例详解(2)——S-function基本案例介绍

5.3 输出波形

S-function入门及案例详解(2)——S-function基本案例介绍
蓝色表示原始常数输入,黄色表示进行积分操作。

上一篇:把锅甩给自己,把爽留给客户!


下一篇:Matlab S-funciton