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

首先,利用过年的几天时间系统学习了一下s-function如何编写,并用其编写了park变换和反park变换。
我的学习过程是,先是看matlab给的官方文档,链接(https://download.csdn.net/download/weixin_44048068/12118519);
然后根据官方文档,在matlab里调出示例来学习
在这里插入图片描述
最后,根据根据官方文档,试着按它给出的示例去编写自己的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)
即实现的功能就是单位延时。
在这里插入图片描述
在这里插入图片描述
稍微复杂一点的示例,就是我编写的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和亲自动手编写。

S-Function 可以使用MATLAB®,C,C ,Ada,或Fortran 语言来编写。使用MEX 实用工具,将C,C ,Ada,和Fortran 语言的S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到MATLAB 中。 S-Function 使用一种特殊的调用格式让你可以与Simulink 方程求解器相互作用,这与发生在求解器和内置Simulink 块之间的相互作用非常相似。S-Function 的形式是非常通用的,且适用于连续、离散和混合系统。 S-function 为你提供了一种在Simulink 模型中增加自制块的手段,你可以使用MATLAB,C,C ,Ada,或Fortran 语言来创建自己的块。按照下面一套简单的规则,你可以在S-function 中实现自己的算法。在你编写一个S-Functin 函数,并将函数名放置在一个S-Functin 块中(在用户定义的函数块库中有效)之后,通过使用masking 定制用户界面。 目录 S-FUNCTION 概述.......... 1 什么是 S-FUNCTION...... 2 在模型中使用S-FUNCTION...... 3 向 S-Function 传递参数....... 3 何时使用 S-Function 4 S-FUNCTION 的工作原理.......... 5 Simulink 块的数学关系........ 5 仿真过程......... 5 S-Function 回调程序. 6 S-FUNCTION 的实现...... 8 M-文件的S-Function.......... 8 MEX 文件的S-function ....... 8 MEX 文件与M-文件的S-function 比较... 9 S-FUNCTION 的概念..... 10 直接馈通....... 10 动态维矩阵... 10 设置采样时间和偏移量.......11 S-FUNCTION 范例........ 14 M 文件S-function 范例...... 15 C S-Function 范例... 16 Fortran S-Function 范例.... 18 C S-Function 范例......... 18 Ada S-Function 范例......... 18 编写 M S-FUNCTION.... 19 概述........ 20 S-Function 参数...... 20 S-Function 的输出... 20 定义 S-FUNCTION 块特性....... 22 处理 S-FUNCTION 参数 22 M 文件的S-FUNCTION 范例... 23 范例 1——简单的M 文件S-Function ... 23 范例 2——连续状态S-Function . 25 范例 3——离散状态S-Function . 27 范例 4——混合系统S-Function . 28 范例 5——变步长S-Function ..... 31 ii 使用C 语言编写S-FUNCTION .......... 33 概述........ 34 创建 C MEX S-Function.... 35 自动生成 S-FUNCTION 36 配置生成的 S-Function...... 37 S-Function Builder 如何生成S-Function......... 37 设置 include 路径.... 37 S-FUNCTION BUILDER 的对话窗........ 39 Initialization 选卡..... 39 Data Properties 选卡......... 40 Libraries 选卡.......... 42 Outputs 选卡 43 Continuous Derivatives 选卡....... 45 Discrete Update 选卡........ 46 Build Info 选卡........ 47 一个基本的 C MEX S-FUNCTION 范例....... 48 定义与包含... 49 回调函数的实现...... 50 Simulink/Real-Time Workshop 接口..... 51 Building Timestwo 范例..... 51 C S-FUNCTION 模板..... 52 S-Function 源文件必需的内容..... 52 SimStruct...... 53 编译 C S-Function.. 53 SIMULINK 如何与C S-FUNCTION 相互作用 54 进程层面....... 54 数据层面....... 56 编写回调函数... 59 将 LEVEL 1 C MEX S-FUNCTION 转换到LEVEL 2 . 60 创建 C S-FUNCTION 63 创建 ADA S-FUNCTION.......... 64 创建 FORTRAN S-FUNCTION 65 实现块特性 67 对话框参数....... 68 iii 可调参数....... 68 运行参数 70 创建运行参数.......... 70 更新运行参数.......... 71 创建输入和输出端口... 72 创建输入端口.......... 72 创建输出端口.......... 73 输入的标量扩展...... 74 掩码多端口 S-Function...... 75 自定义数据类型.......... 76 采样时间 77 基于块的采样时间... 77 指定基于端口的采样时间.. 79 基于块与基于端口的混合采样时间 ........ 81 多速率 S-Function 块......... 82 多速率 S-Function 块的同步........ 83 工作向量 84 工作向量与过零检测.......... 85 包括指针工作向量的范例.. 85 内存分配....... 86 FUNCTION-CALL 子系统.......... 87 错误处理 89 防超程代码... 89 SsSetErrorStatus 的终止条件..... 90 数组边界检查.......... 90 S-FUNCTION 范例........ 91 连续状态的 S-Function 范例........ 92 离散状态的 S-Function 范例........ 93 混合系统的S-Function 范例........ 93 变步长的 S-Function 范例. 94 过零检测的 S-Function 范例........ 94 时变连续传递函数的 S-Function 范例... 94
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值