最近要用simulink做仿真,需要用S函数,因此记录一下,防止以后再用找不到资料。
第一步:新建simulink模型
主页面点击新建->Simulink Model新建一个Simulink模型。
进入之后点击Blank Model建立一个空白模型。
这时候按住ctrl+S保存一下,会弹出一个选择保存路径和起一个文件名字的弹框,我这里选择是MATLAB->bin里面新建了一个文件夹保存,这样模型就建立完成了。
第二步:加入s函数块
点击simulink library打开simulink的块仓库,在Simulink->User-Defined Functions里面找到下图中4,也就是S-Function块,点击拖到simulink里面。这里直接搜s函数会出现其他不相干的函数,直接按这个路径找就可以。
拖入之后就可以进行下一步了。
第二步:s函数m文件的建立
回到命令行窗口,Ctrl+N新建一个脚本,Ctrl+S保存一下,名字就是要编写的S函数的名字。
保存到和第一步一样的文件路径里面。
键入:edit sfuntmpl,打开s函数例程,选择全部,复制粘贴到刚刚建立的脚本m文件里面,然后作为自己的s函数的m文件。(键入sfundemos会打开s函数的块例程,目前不知道什么用处。)
复制完之后删掉注释,就变成下面的样子。
第三步:s函数的编写
建立完之后开始进行s函数的编写,s函数按照官方描述是可以实现任意复杂系统的编写的,我这里水平有限,先试一下简单的函数。
y=5*x1+3*x2;
要实现上面这个函数,可以看到有两个输入x1,x2,一个输出y,因此在初始化函数里面设置sizes.NumInputs为 2,sizes.NumOutputs为 1,另外还要注意sizes.DirFeedthrough也要设置,这个根据输出里面有没有输入出现来设置的,若输出的表达式里面有输入,则设置为1,否则设置为0。其他为默认。
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 1;
sizes.NumInputs = 2;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [0 0];
simStateCompliance = 'UnknownSimState';
设置完初始化函数之后,设置输出函数,输出函数的函数参数为t,x,u,这里只使用u,按照上面式子直接写下来。保存函数。
function sys=mdlOutputs(t,x,u)
x1 = u(1);
x2 = u(2);
y = 5*x1+3*x2;
sys = [y];
第四步:s函数的块关联
打开simulink界面,点击s函数块,在s函数的函数名处填刚刚建立的函数的名字,点击OK。
下面来进行验证一下。搭建如下模型,step的幅值都设为1,时间分别设为0.5和1。
可以看到,满足y=5*x1+3*x2。