matlab中关于S-fun的调用以及子系统的封装
Posted daniublog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中关于S-fun的调用以及子系统的封装相关的知识,希望对你有一定的参考价值。
近日学习matlab建模方面的东西,mark一个网站:http://wtclab.net/txfz/jkmulu.html,邵玉斌老师的教案。
本篇记录一个包含S函数的子系统的建立和封装,用S函数产生任意正弦波。
matlab版本:R2017b
步骤如下:
①首先建立主系统模型。在命令行窗口输入simulink,在弹出的窗口中新建Blank Model,接着点击simulink工具栏的Library Browser,从中选取模块搭建主系统模型,如下图。
接着,双击Subsystem搭建子系统内部模型,如下图。
②系统模型搭建好之后,新建M文件编写S函数,示例代码如下。(注意:函数名需与M文件名一致。)
function [sys,x0,str,ts] =example1Sfun(t,x,u,flag,Amp,Freq,Phase) % 正弦波信号源 switch flag case 0 % flag=0 初始化 [sys,x0,str,ts]=mdlInitializeSizes; case 3 % flag=3 计算输出 sys=mdlOutputs(t,Amp,Freq,Phase); case {1, 2, 4, 9 } % 其他作不处理的flag sys=[]; % 无用的flag时返回sys为空矩阵 otherwise % 异常处理 error([‘Unhandled flag = ‘,num2str(flag)]); end % 主函数结束 % 子函数实现(1)初始化函数---------------------------------- function [sys,x0,str,ts] = mdlInitializeSizes % sizes = simsizes; % 获取SIMULINK仿真变量结构 sizes.NumContStates = 0; % 连续系统的状态数为0 sizes.NumDiscStates = 0; % 离散系统的状态数为0 sizes.NumOutputs = 1; % 输出信号数目是1 sizes.NumInputs = 0; % 输入信号数目是0 sizes.DirFeedthrough = 0; % 该系统不是直通的 sizes.NumSampleTimes = 1; % 这里必须为1 sys = simsizes(sizes); str = []; % 通常为空矩阵 x0 = []; % 初始状态矩阵x0 (零状态情况) ts = [0 0]; % 表示连续取样时间的仿真 % 初始化函数结束 % 子函数实现(2)系统输出方程函数----------------------------- function sys = mdlOutputs(t,Amp,Freq,Phase) sys = Amp*sin(2*pi*Freq*t+Phase);% 这里写入系统的输出方程矩阵形式即可 % 修改这个函数可以得到任意的波形输出 % 系统输出方程函数结束
之后要使S-fun模块调用编写好的S函数,需要设置模块的参数。进入子系统,双击S-Function模块,把S函数M文件的名称填入S-Function name,再填写模块的参数,如幅值(Amp)等...
③封装子系统。右击子系统模块,选择Mask-->Create Mask,进入封装编辑界面。如下图,在左侧导航栏点击Edit创建模块参数,之后设置好参数的名称、标题、初始值等。
点击左下角的Preview可以预览参数设置对话框。
④仿真观察结果。
以上是关于matlab中关于S-fun的调用以及子系统的封装的主要内容,如果未能解决你的问题,请参考以下文章