开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块

这篇具有很好参考价值的文章主要介绍了开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

前言

S-Fuction模块

电路方程模型

编写S函数

仿真验证

Tips

分析和应用

总结


前言

        见《开箱报告,Simulink Toolbox库模块使用指南(一)——powergui模块》

        见《开箱报告,Simulink Toolbox库模块使用指南(二)——MATLAB Fuction模块》

        见《开箱报告,Simulink Toolbox库模块使用指南(三)——Simscape 电路仿真模块》

S-Fuction模块

        S-Fuction模块是用户使用MATLAB、C、C++语言等编写的Simulink模块,是扩展Simulink模块库的一种机制。S-Fuction使用一种特殊的语法,使用户能够与Simulink引擎进行交互,非常接近自带库摸块与Simulink引擎之间发生的交互。

        用户使用S-Fuction开发的Simulink模块可以是一种控制算法,也可以是一种状态模型,可以容纳连续系统、离散系统或者混合系统。如果要将S-Fuction用于代码生成,用户还可以通过编写目标语言编译器(TLC)文件来自定义为S-Fuction生成的代码。其在Simulink Toolbox库中的位置如下图所示。

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块,Matlab/Simulink,汽车,电路建模,算法仿真,matlab,S-Function

        Mathworks官方Help对该模块的说明如下所示。

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块,Matlab/Simulink,汽车,电路建模,算法仿真,matlab,S-Function

        本文以电路建模仿真为例,介绍如何利用S-Fuction搭建电路模型。

电路方程模型

   这里沿用前一篇文章中的12V蓄电池给两个负载供电的电路,见 《开箱报告,Simulink Toolbox库模块使用指南(三)——Simscape 电路仿真模块》

        根据欧姆定律,写出该电路系统的状态方程如下:

        状态方程(1):

        t = 0

        12V = I*(2Ω+1Ω*5Ω/(1Ω+5Ω))

        U = I*1Ω*5Ω/(1Ω+5Ω)

        求解得:

        I(A) = 72/17 = 4.235

        U(A) = 60/17 = 3.529

        状态方程(2):

        t = pi/2

        12V = I*(2Ω+1Ω*6Ω/(1Ω+6Ω))

        U = I*1Ω*6Ω/(1Ω+6Ω)

        求解得:

        I(A) = 21/5 = 4.2

        U(A) = 18/5 = 3.6

        动态方程:

        根据前面两个稳态方程的解,可以列出如下动态方程:

        t(S) = (0 : 1000)*0.001

        I(A) = 72/17 + |4.235-4.2|*sin(2pi * 50t + pi)

        U(A) = 60/17 + |3.529-3.6|*sin(2pi * 50t)

        在Matlab的命令窗口中运行该动态方程,得到的电流和电压曲线,与前一篇文章一致,如下所示:

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块,Matlab/Simulink,汽车,电路建模,算法仿真,matlab,S-Function

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块,Matlab/Simulink,汽车,电路建模,算法仿真,matlab,S-Function

        至此,可以证明该电路系统的方程模型是正确的。

编写S函数

        根据官方的S-Fuction模板,写出的S函数完整代码如下:

function [sys,x0,str,ts,simStateCompliance] = CircuitPlant(t,x,u,flag)
 
switch flag,
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
  case 1,
    sys=mdlDerivatives(t,x,u);
  case 2,
    sys=mdlUpdate(t,x,u);
  case 3,
    sys=mdlOutputs(t,x,u);
  case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);
  case 9,
    sys=mdlTerminate(t,x,u);
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
 
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
 
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 3;	%Number of discrete states.
sizes.NumOutputs     = 3;		%Number of outputs.
sizes.NumInputs      = 0;		%Number of inputs.
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   % at least one sample time is needed
sys = simsizes(sizes);
 
x0  = [0;72/17;60/17];	&Initial state conditions
str = [];
ts  = [0.001 0];	%Discrete sample time where, [PERIOD OFFSET],PERIOD > 0 & OFFSET < PERIOD.
simStateCompliance = 'UnknownSimState';
 
 
function sys=mdlDerivatives(t,x,u)
 
sys = [];
 
 
%
%=============================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=============================================================================
%
function sys=mdlUpdate(t,x,u)
 
I = 72/17 + abs(4.235-4.2)*sin(2*pi * 50*t + pi);
U = 60/17 + abs(3.529-3.6)*sin(2*pi * 50*t);
sys = [t,I,U];
 
 
%
%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================
%
function sys=mdlOutputs(t,x,u)
 
% sys = [x(1);x(2);x(2)];
sys = x;
 
function sys=mdlGetTimeOfNextVarHit(t,x,u)
 
sampleTime = 1;    
sys = t + sampleTime;
 
 
function sys=mdlTerminate(t,x,u)
 
sys = [];

仿真验证

        将上述编写好的S-Fuction模块,放入Simulink模型中进行验证,如下所示:

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块,Matlab/Simulink,汽车,电路建模,算法仿真,matlab,S-Function

        运行上述模型,得到的电流和电压曲线,也与前一篇文章一致,如下所示:

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块,Matlab/Simulink,汽车,电路建模,算法仿真,matlab,S-Function

        至此,可以证明该S-Fuction模块可以较好地模拟,前一篇文章中使用物理模块搭建的电路模型。

Tips

        S-Fuction模块的完整运行机制如下图所示。本文所举的例子是用的离散模型,所以只涉及其中的主仿真步。这里需要注意的是,模型初始化函数只在模型仿真开始时执行一次,后面的计算输出和更新离散状态是每个仿真步都要执行一次的,比如本文是0.001s执行一次。每次执行的顺序是,先执行计算输出函数,后执行离散状态更新函数,所以当看到输出结果比输入信号延迟一个周期,就是这个机制的原因。

开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块,Matlab/Simulink,汽车,电路建模,算法仿真,matlab,S-Function

分析和应用

        S-Fuction模块在Simulink模型仿真和自动生成代码方面的应用功能非常强大,主要得益于MATLAB为开发人员留出了一个扩展Simulink模块库的机制,开发人员能基于该模块开发自己的模块库。项目中使用S-Fuction模块后,将会给开发人员更大的发挥空间,去开发特殊的模块库,能够真正与自己的需求高度匹配。一方面弥补特定需求模块的空白,另一方面也能对一些模块进行充分地裁剪。另外S-Fuction模块还能将一些已开发的功能固化下来,便于后期的移植复用,这样能使很多项目开发的代码量大大减少,同时也意味着软件开发全流程的人力和时间投入大幅缩减。主要适用于有架构支撑、模块化开发的大型软件项目,可以合理协调团队成员的分工合作,提高代码可控性,增加代码的复用率,减少代码移植障碍。

总结

        以上就是本人在使用S-Fuction模块时,一些个人理解和分析的总结,首先介绍了该模块的背景知识,然后展示它的使用方法,最后分析了该模块的特点和适用场景。

        后续还会分享另外几个最近总结的Simulink Toolbox库模块,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。

        另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。


        版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

 文章来源地址https://www.toymoban.com/news/detail-661188.html

到了这里,关于开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Shell 命令集合 系统设置 】Linux 加载和卸载内核模块 modprobe命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 modprobe命令是Linux系统中用于加载和卸载内核模块的工具。内核模块是一种可以动态加载到内核中的代码,它们可以扩展内核的功能,添加新的驱动程序或功能。 modprobe命令的主要作用有以下几个方面: 加载内核模块:modprobe命令可以根据

    2024年02月04日
    浏览(42)
  • 【Shell 命令集合 系统设置 】⭐Linux 向内核中加载指定的模块 insmod命令 使用指南

    Shell 命令专栏:Linux Shell 命令全解析 insmod命令是Linux系统中的一个命令,用于向内核中加载指定的模块。它的作用是将指定的模块文件加载到内核中,使得系统可以使用该模块提供的功能。 模块是一种可以动态加载到内核中的代码,它可以扩展内核的功能。在Linux系统中,模

    2024年02月07日
    浏览(47)
  • Spark初学者指南:使用指南和示例

    本文介绍了如何使用Spark处理大规模数据集,并提供了一个Scala编写的Word Count示例,指导您从安装和配置到编写和运行Spark应用程序。无需担心,即使您是Spark初学者,也可以按照本文的步骤来学习和使用Spark。 Spark是一个流行的分布式计算框架,用于处理大规模数据集。它使

    2024年02月06日
    浏览(41)
  • 【12】Git工具 协同工作平台使用教程 Gitee使用指南 腾讯工蜂使用指南【Gitee】【腾讯工蜂】【Git】

    tips:少量的git安装和使用教程,更多讲快速使用上手Gitee和工蜂平台      Git - Downloads (git-scm.com) 找到对应操作系统,对应版本,对应的位数   下载后根据需求自己安装,然后用git --version验证是否成功   使用 SSH 密钥可以让你在与 Git 服务器进行通信时,实现更安全的身份

    2024年02月13日
    浏览(30)
  • Jmeter进阶使用指南-使用断言

    Apache JMeter是一个流行的开源负载和性能测试工具。在JMeter中,断言(Assertions)是用来验证响应数据是否符合预期的一个重要组件。它是对请求响应的一种检查,如果响应不符合预期,那么断言会标记为失败。 以下是如何在JMeter中使用断言的基本步骤: 添加断言 :首先,你

    2024年02月09日
    浏览(31)
  • Matlab使用指南

    zcy 2.1 数据类型 matlab中有15种基本数据类型,每种数据类型均以数组/矩阵的形式出现 整数 matlab支持1、2、4、8字节的有符号整数和无符号整数 浮点数 有单精度和双精度两种浮点数 复数 复数包含实部和虚部,可以用i或者j来表示虚部 2.2 基本矩阵操作 2.2.1 矩阵的构造 2.2.2 矩阵

    2024年02月06日
    浏览(36)
  • myspl使用指南

    mysql数据库 使用命令行工具连接数据库 -u表示后面是用户名 -p表示后面是密码 -h表示后面是主机名,登录当前设备可省略。 如我们要登录本机用户名为root,密码为123456的账户: 按回车,然后再输入密码即可。 使用代码连接 显示mysql中的所有数据库(mysql中可以有很多个数据

    2024年02月10日
    浏览(34)
  • Ollydbg使用指南

    OllyDebug,简称OD,一种反汇编软件,动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3 级的调试器。OllyDebug的使用界面是可视化操作。 OD有很多民间的版本,菜单栏和和工具栏的配置可能有所差别。比较好用的是吾爱破解和吾爱汇编的中文Ollydbg版本。 深入学习OllyDBG的调试技

    2023年04月08日
    浏览(55)
  • Github的使用指南

    打开giuhub官网,右上角点击你的头像,随后点击 your repositories 点击New开始创建仓库 如下图为创建仓库的选项解释 出现如下界面就可以进行后续的git指令操作了 进入需上传项目的所在目录,打开git命令行,输入如下命令开始初始化git仓库,这将在你的项目文件夹中创建一个名

    2024年02月12日
    浏览(28)
  • Docker 网络使用指南

    目录 前言 Docker网络类型 Docker 网络概念 使用 Docker 网络 运行容器并连接到网络 检查网络 清理网络资源 Docker Compose网络 Docker 是一种容器化平台,它允许你将应用程序和它们的依赖项打包成一个称为容器的独立单元。Docker 提供了一种轻量级、可移植和自包含的方式来部署应用

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包