s-function学习总结(看完这一篇就够了)

首先,利用过年的几天时间系统学习了一下s-function如何编写,并用其编写了park变换和反park变换。
我的学习过程是,先是看matlab给的官方文档,链接(https://download.csdn.net/download/weixin_44048068/12118519);
然后根据官方文档,在matlab里调出示例来学习
s-function学习总结(看完这一篇就够了)_第1张图片
最后,根据根据官方文档,试着按它给出的示例去编写自己的s-function
一下,我给出一个示例,并照着这个示例记下自己学习过程中的一些感悟,防止遗忘。。。

代码

function [sys,x0,str,ts]=sfun_unitdelay(t,x,u,flag)
switch flag,
    case 0
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 2
        sys=mdlUpdate(t,x,u);
    case 3
        sys=mdlOutputs(t,x,u);
    case {1,4,9}
        sys=[];
    otherwise
        error(['unhandled flag=',num2str(flag)]);
end
function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=1;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=0;
str=[];
ts=[0.1,0];
function sys=mdlUpdate(t,x,u)
sys=u;
function sys=mdlOutputs(t,x,u)
sys=x;

代码详解

整体架构最好按官方示例去写,即一个主函数,通过flag去调用它的骨架函数(子函数)。主函数格式如下

function [sys,x0,str,ts]=**sfun_unitdelay**(t,x,u,flag)
switch flag,
    case 0
        [sys,x0,str,ts]=mdlInitializeSizes;
    case 2
        sys=mdlUpdate(t,x,u);
    case 3
        sys=mdlOutputs(t,x,u);
    case {1,4,9}
        sys=[];
    otherwise
        error(['unhandled flag=',num2str(flag)]);
end

黑体的函数名可以任意设置,在simulink里调用该function要保证名字一致。
具体实际需要用到哪些子函数,就写哪些,不用的一律幅值为空。像本例是一个延时子函数,用到了更新离散状态这个子函数(mdlUpdate),也用到了计算输出这个子函数(mdlOutputs),因此这两个子函数要调用,其余没用到的赋值为空。
函数初始化这个子函数(mdlInitializeSizes)不管你编写什么东西,这个必不可少,其格式最好也参考模板。

接下来介绍子函数:
1:初始化(目的:为了使 Simulink 认识 M 文件 S-function)

function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=1;
sizes.NumOutputs=1;
sizes.NumInputs=1;
sizes.DirFeedthrough=0;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=0;
str=[];
ts=[0.1,0];

为了给 Simulink 提供初始化信息,必须在 mdlInitializeSizes 的开头调用 simsizes:
即:sizes = simsizes;
用到一个离散状态,故sizes.NumDiscStates=1;
一个输入一个输出,故sizes.NumOutputs=1;
sizes.NumInputs=1;
输出与输入没有直接关系,即D=0,故sizes.DirFeedthrough=0;
采样时间的数量至少为1,故sizes.NumSampleTimes=1;
在初始化 sizes 结构之后,再次调用 simsizes:故sys = simsizes(sizes);
x0,初始状态值(如果系统中没有状态,则向量为空)
str,保留以后使用。 M 文件 S-function 必须设置该元素为空矩阵, []
ts, 一个两列的矩阵, 包含了块的采样时间和偏移量(如果希望你的 S-function 按照其所连接块的速率来运行,则应设置为[-1, 0];)

注:可以外加用户自定义参数,格式为function [sys,x0,str,ts]=sfun_unitdelay(t,x,u,flag,a,b,c)
sizes.NumOutputs=-1;表示输出不止一个,有好几个(可以达到省事的目的)

2:其余函数

function sys=mdlUpdate(t,x,u)
sys=u;
function sys=mdlOutputs(t,x,u)
sys=x;

此处是来描述:
x(n+1)=u(n)
y(n)=x(n)
即实现的功能就是单位延时。
s-function学习总结(看完这一篇就够了)_第2张图片
s-function学习总结(看完这一篇就够了)_第3张图片
稍微复杂一点的示例,就是我编写的park变换,有兴趣的童鞋也可以来自己编写练练手。
https://blog.csdn.net/weixin_44048068/article/details/104088063

两个适合练手的S-FUNCTION例子

https://download.csdn.net/download/weixin_44048068/12120838
https://download.csdn.net/download/weixin_44048068/12120788

总结

快速掌握s-function 的方法,就是参考官方文档,学习demo和亲自动手编写。

你可能感兴趣的:(simulink)