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

2023-10-14 12:10

本文主要是介绍开箱报告,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库中的位置如下图所示。

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

        本文以电路建模仿真为例,介绍如何利用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的命令窗口中运行该动态方程,得到的电流和电压曲线,与前一篇文章一致,如下所示:

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

编写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);otherwiseDAStudio.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]=mdlInitializeSizessizes = 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模型中进行验证,如下所示:

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

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

Tips

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

分析和应用

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

总结

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

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

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


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

 

这篇关于开箱报告,Simulink Toolbox库模块使用指南(四)——S-Fuction模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210399

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

2025最新版Python3.13.1安装使用指南(超详细)

《2025最新版Python3.13.1安装使用指南(超详细)》Python编程语言自诞生以来,已经成为全球最受欢迎的编程语言之一,它简单易学易用,以标准库和功能强大且广泛外挂的扩展库,为用户提供包罗... 目录2025最新版python 3.13.1安装使用指南1. 2025年Python语言最新排名2.

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

Rsnapshot怎么用? 基于Rsync的强大Linux备份工具使用指南

《Rsnapshot怎么用?基于Rsync的强大Linux备份工具使用指南》Rsnapshot不仅可以备份本地文件,还能通过SSH备份远程文件,接下来详细介绍如何安装、配置和使用Rsnaps... Rsnapshot 是一款开源的文件系统快照工具。它结合了 Rsync 和 SSH 的能力,可以帮助你在 li