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

S-function入门及案例详解(1)——S-function基础介绍及基本案例 本专题将用三篇文章对S-function进行介绍及其案例详解。欢迎关注~ 目录一、S-Function简介二、详解sfuntmpl函数2.1 sfuntmpl函数介绍2.2 mdlInitializeSizes函数2.3 mdlDerivatives函数2.4 mdlUpdate函数2.5 mdlOutputs函数2.6 mdlGetTimeOfNextVarHit函数2.7 mdlTerminate函数三、案例1——对波形的幅值进行放大3.1 案例分析3.2 案例详解3.3 输出波形四、案例2——对波形的 阅读详情

文章目录

前言

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);
  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模型中进行验证,如下所示:

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

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

Tips

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

分析和应用

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

总结

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

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

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


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

 

Simulink导入新工具箱toolbox matlab simulink导入库 阅读详情

相关推荐

如何为你的硬件开发Simulink Toolbox(4)

这次我们从实现一个对模型选项进行设置的block开始,串联起几个Simulink Toolbox的控制文件,并写一个简单的S-Function文件,Simulink本身也提供了类似的block,例如下面这几个。 我们不使用它生成任何的代码,而是利用Simulink的callback机制和m语言,自动化完成模型选项的设置。 首先我们拖一个Simulink->User Defined Functions->S-Function到我们的libaray,修改成下面的样子。 首先Crea..

gnr_123的专栏 1022

关于simulink中的函数function模块

前言:我们前面提到过当遇到库中没有我们需要的模块时,我们可以自己书写s函数,其实s函数是一个比较高端的工具,是用来书写一些比较复杂的模块,而遇到一些简单的模块,我们可以用库里面的fcn模块和matlab function模块 这两个模块形式如图: 点开这些模块: fcn模块最简单,直接在对话框中输入简单的函数表达输入输出的关系。 而matlab function模块会显示一个文本,需要你去书写一...

zouxu634866的博客 6万+

Simulink/Requirements Toolbox 实战指南:需求管理与模型验证全流程解析

本文深入解析了如何利用Simulink与Requirements Toolbox进行高效的需求管理与模型验证。通过将自然语言需求转化为可链接、可追踪的“活”对象,该工具组合解决了开发过程中的“对齐”与“追溯”难题,并支持与外部工具集成、建立可追溯性矩阵、基于需求的自动化测试及变更管理,为安全关键系统开发提供了符合行业标准的全流程解决方案。

weixin_29196891的博客 279

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

近期对Simulink Toolbox库模块中掌握有真空地带的模块,抽时间填补了一下,把它总结分享出来。这里边包括尝鲜一些第一次用的模块,巩固一下不是很熟练的模块,还有对一些模块小细节的查漏补缺。本文是该专题的第六篇文章,主要讲解了TLC的背景知识,展示了它的使用方法,最后分析了该模块的特点和适用场景。

Mr.Cssust的博客 1892

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

近期对Simulink Toolbox库模块中掌握有真空地带的模块,抽时间填补了一下,把它总结分享出来。这里边包括尝鲜一些第一次用的模块,巩固一下不是很熟练的模块,还有对一些模块小细节的查漏补缺。本文是该专题的第五篇文章,主要讲解了C MEX S-Fuction模块的背景知识,展示了它的使用方法,最后分析了该模块的特点和适用场景。

Mr.Cssust的博客 2164

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

近期对Simulink Toolbox库模块中掌握有真空地带的模块,抽时间填补了一下,把它总结分享出来。这里边包括尝鲜一些第一次用的模块,巩固一下不是很熟练的模块,还有对一些模块小细节的查漏补缺。本文是该专题的第一篇文章,主要讲解了powergui模块的背景知识,展示了它的交互式仿真和自动化仿真两种使用方法,最后分析了该模块的特点和适用场景。

Mr.Cssust的博客 9673

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

近期对Simulink Toolbox库模块中掌握有真空地带的模块,抽时间填补了一下,把它总结分享出来。这里边包括尝鲜一些第一次用的模块,巩固一下不是很熟练的模块,还有对一些模块小细节的查漏补缺。本文是该专题的第七篇文章,主要讲解了S-Function Buider的基本知识,展示了它的使用方法,最后分析了该模块的特点和适用场景。

Mr.Cssust的博客 1021

手把手教你学matlab(8.29)--simulink:DC-DC Buck-Boost 转换器仿真实例

通过以上步骤,你应该能够建立一个带有反馈控制的 DC-DC Buck-Boost 转换器仿真模型,并观察其性能。Simulink 提供了丰富的工具和模块,可以帮助你进一步优化和调整仿真模型。

MHD0815的博客 316

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

近期对Simulink Toolbox库模块中掌握有真空地带的模块,抽时间填补了一下,把它总结分享出来。这里边包括尝鲜一些第一次用的模块,巩固一下不是很熟练的模块,还有对一些模块小细节的查漏补缺。本文是该专题的第二篇文章,主要讲解了MATLAB Fuction模块的背景知识,展示了它的求解使用方法,最后分析了该模块的特点和适用场景。

Mr.Cssust的博客 1501

Simulink软件二次开发:Simulink软件的二次开发工具箱使用

S-Function(System Function)是Simulink中用于创建自定义模块的高级接口。它允许用户使用MATLAB或C/C++语言来定义模块的行为,从而实现更复杂、更特定的功能。S-Function模块可以访问和修改模块的输入、输出、状态和参数,提供了一种灵活的方式来扩展Simulink的功能。在Simulink中,模型参数的自定义设置是实现模型个性化和优化的关键步骤。通过设置参数,可以调整模型的行为,使其更符合特定的应用场景或实验需求。

kkchenjj的博客 1242

CST 2023安装避坑指南:从下载到破解的完整流程(附常见报错解决方案)

本文提供CST 2023三维全波电磁场仿真软件的完整安装指南,涵盖从下载到破解的全流程,并附常见报错解决方案。详细解析安装步骤、许可证配置优化及高频问题诊断,帮助用户快速部署并优化软件性能,适用于射频电路设计、天线优化等场景。

7z8x2c4v6b9的博客 657

如何为你的硬件开发Simulink Toolbox(1)

什么是Simulink Toolbox? 在基于模型的开发过程中,普遍使用RCP(Rapid Control Prototype)进行算法/功能的开发和验证,像dSPACE公司的Micro AutoboxII产品在汽车电子行业应用十分广泛。 使用RCP我们可以将Matlab/Simulink环境下用建模方式开发的软件下载到RCP硬件中运行,而不仅仅停留在仿真的层面,一来对主业不是嵌入式软件...

gnr_123的专栏 2670

别再乱按F8了!Win10系统修复的正确姿势:用管理员CMD运行sfc /scannow

本文详细介绍了Windows 10系统修复的正确方法,重点推荐使用管理员CMD运行`sfc /scannow`命令。相比传统的F8键和重装系统,这一方法更高效且安全,能解决大多数系统文件损坏问题。文章还提供了管理员CMD的启动方式、sfc命令的完整参数解析以及实战故障排除流程图,帮助用户快速恢复系统健康。

weixin_29218963的博客 463

MATLAB--simulink工具箱的使用(1)

MATLAB–simulink工具箱的使用(1) simulink打开方式和基本操作方法 simulink工具箱是matlab用来对动态系统进行建模,仿真和分析的软件包。它提供了一个图形化用户界面,由此更为直观。 simulink工具箱的位置 打开matlab,在“主页”菜单栏找到simulink图表,点击即可进入。 点击Blank Model,创建一个新的model,即可进入界面。 simulink的基本操作 模型界面 点击库浏览器Library Browser图标(如下) 即可进入包含各

weixin_46049321的博客 1万+

Kafka 系列 —(17)Kafka 流式处理:Kafka Streams架构、使用场景、框架选择

本文介绍了KafkaStreams的架构特点、应用场景及与其他流处理框架的比较。KafkaStreams作为嵌入式分布式流处理库,其核心架构包含流处理器、任务、拓扑和本地状态存储,具备自动容错和伸缩能力。适用于实时监控、ETL、聚合、Join、物化视图等低延迟场景。与Flink、Spark相比,KafkaStreams适合简单架构和微服务,而Flink适合大规模处理,Spark更适合批处理。选择框架需根据具体场景需求,如微服务推荐KafkaStreams,大规模处理推荐Flink。

moton2017的博客 1631

让 AI 学会“慢思考”:MCP Sequential Thinking 深度部署与使用指南

摘要: MCP Sequential Thinking 是一种让AI具备"慢思考"能力的技术,通过动态调整思维路径解决复杂问题。本文详细介绍了在Windows、macOS和Linux系统下的部署方法,包括环境准备、配置文件修改等步骤。该技术通过"产生想法-评估需求-修正路径"的循环机制,显著提升AI在代码设计、数学证明等复杂任务中的表现。文章还提供了验证安装方法、使用示例和常见问题解答,帮助开发者解锁AI的深层思考能力。(149字)

weixin_43236925的博客 1913

S-function的使用

《MATLAB/Simulink系统仿真超级学习手册》石良臣 matlab2018a——S-function使用说明

m0_62299908的博客 1万+

终端效率神器:Tmux 安装与使用全指南

终端效率神器:Tmux 安装与使用全指南

身在被窝_心在编程 1360

Simulink建模基础:Simulink Function子系统及其代码

本文研究Simulink Function子系统的用法和该模块生成的代码。 文章目录1 问题引入2 Simulink Function子系统建模2.1 Simulink Function子系统2.2 Function Caller模块 1 问题引入 博主在其他的博客中研究了许多模块和子系统,以及它们生成的代码。通常来说,博主研究的方法是建立一个Inport,一个outport,以及两者之间的控制逻辑,譬如如下的Gain模块。 配置好该模型,并生成代码如下。 其中的step函数就可以反映出模型的算法,输入

u013288925的博客 1万+

LeetCode 面试经典 150 题回顾

最经典 150 题,掌握面试所有知识点 面试经典 150 题 : 题目分析、解题思路、复杂度分析、代码展示

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

【全局路径规划模块全覆盖算法】(三)代码实现:Boustrophedon Cellular Decomposition Path Planning用珊格地图生成每个cell的覆盖路径

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Boustrophedon Cellular Decomposition Path Planning用珊格地图生成每个cell的覆盖路径做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1834

基于simulink实现LTE-UAV无人机飞行模拟

在现代技术的帮助下,无人机已经成为了许多行业的重要工具。无人机的使用范围越来越广泛,不仅用于军事侦察和打击,还用于民用领域,如航拍、物流和农业等。随着LTE技术的发展,无人机可以通过LTE网络进行控制和通信。因此,对于无人机的飞行模拟和测试显得尤为重要。在本文中,我们将介绍如何使用Simulink实现LTE-UAV无人机飞行模拟。首先,我们需要了解什么是Simulink。Simulink是MATLAB的一个扩展工具箱,它可以用于建立、模拟和分析动态系统模型。

m0_57702748的博客 444

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动

openGauss学习笔记-280 openGauss性能调优-实际调优案例09-修改启动参数解决TPCC大幅度波动280.1 现象描述280.2 优化分析 openGauss学习笔记-280 ope

超哥的博客 309

SIMULINK s-function的设计

SIMULINK s-function的设计Simulink为用户提供了许多内置的基本库模块,通过这些模块进行连接而构成系统的模型。对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块,但它依然是基于Simulink原来提供的内置模块。 而Simulink s-function是一种强大的对模块库进行扩展的新工具。 一、s-function的概念 s-function是一个动...

weixin_30652271的博客 441

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Simulink模块使用

这样我们就只输出了一个常数。

qiu421的博客 5309

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Matlab simulink建模与仿真 第二章(常用模块库)【下】

(1)开关模块可实现选择功能,它有3个输入端口和1个输出端口,输入端口从上到下(或从左到右)编号,第一个和第三个输入端口为数据端口,第二个输入端口为控制端口,当控制端口2满足所选标准时,输出端口与输入端口1导通,否则输出端口与输入端口3导通。②对双目运算,有上表所示的六种,对关系运算模块的两个输入,由上至下(或由左至右)第一个输入为操作数1,第二个输入为操作数2,操作数1在关系运算符的左边,操作数2在关系运算符的右边,若关系表达式成立则输出逻辑1,否则输出逻辑0。

Zevalin的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 开箱报告,Simulink Toolbox库模块使用指南(三)——Simscape 电路仿真模块
下一篇: 开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)
Mr.Cssust
Mr.Cssust 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄9年 8610粉丝 162原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Cssust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值