MBD_入门篇_20_Simulink子系统

news2024/9/20 3:27:07

20.Simulink子系统

20.1 概述

Simulink的子系统,相当于代码的function函数,但是模型的子系统又不完全等效于代码的函数。虚拟子系统并不会生成函数,而是以代码块的形式放在相应的调用位置上。模型层面我们使用子系统去做模块化的设计,还是"高内聚,低耦合"的原则。也可以将常用模块封装成库,然后给公司里的其他员工直接调用。

20.2 回顾常用模块

20.2.1 Inport和Outport

输入模块Inport,输出模块Outport。

20.2.2 Subsystem

默认的Subsystem模块是一个虚拟子系统,不能设置生成代码的规则,最终是以代码块的形式放在相应的调用位置上。

20.3 AtomicSubsystem

AtomicSubsystem是原子子系统,相对于虚拟子系统,原子子系统它是可以设置一些生成代码的属性的。可以看到虚拟子系统(上面)的外框线比较细,原子子系统外框线是加粗的。

设置虚拟子系统的参数,勾选Treat as atomic unit,将虚拟子系统改变为原子子系统。改变完以后我们可以看到子系统的外框变成了加粗的状态,跟我们直接添加的原子子系统一样了。

虚拟子系统无法设置生成代码的属性。

原子子系统,可以设置生成代码的相应的选项。

设置生成代码子系统的行为,可以选择可重用和不可重用函数等,函数名和源文件的名字可以选择适合的进行设置。

其他的比如使能子系统,触发子系统,函数调用子系统等,都是原子子系统的变种,它们的基础首先是原子子系统而不是虚拟子系统。

20.4 使能子系统

EnabledSubsystem使能子系统。只有在子系统被使能的时候,子系统里面的逻辑才会被执行,输出执行后的结果。

可以在库浏览器里选择使能子系统进行添加。

使用模型中双击空白地方,搜索添加。

或者我们可以在普通的子系统里添加Enable模块,将原来的子系统变为使能子系统。

使能子系统里做一个累加的逻辑。

在使能子系统外面对子系统进行使能,赋值为true,进行使能。然后搭建输入和输出观测。

当enable连接的是true的时候,模型进行累加,一直加到21的时候,我们将true改为false,这个时候使能子系统保持上一个使能时刻的有效输出。

重新恢复为true,子系统再次开始被调用,输出新的累加值22.

设置状态值在被重新Enable的时候的行为,是保持上一次enable的值,还是reset为默认值。

当true到累加到21的时候,设置为false,后面运行的值两个子系统输出都一直是21。

重新设置为true,单步运行,可以看到,上面设置held的使能子系统,继续之前累加值进行累加,输出变成了22。下面的使能子系统设置的是Reset,重新使能以后,状态值从默认值0开始进行运算,1+0=1,所以输出1.

20.5 使能模块

Enable模块添加到子系统中,就会让子系统变成使能子系统。

设置Enable模块的States when enabling是选择held保持,还是选择reset复位。区别我们上一节视频内容已经讲过了。Reenable重新使能的时候,状态量的行为是保持还是复位。

勾选Show output port。

勾选完后Enable模块输出多了一个port。没什么使用场景。

20.6 触发子系统

使用边缘触发,可以设置上升沿或者下降沿或者双边沿触发子系统进行执行。

设置Trigger触发模块的触发类型,可以设置rising上升沿,falling下降沿,either双边沿和function-call函数调用。

输入从0跳到1的时候上升沿触发,从1跳变到2的时候以及后面的往上跳变,都没有再触发子系统执行。

States with enabling不能进行配置,默认就是held,但是使能子系统是可以进行配置的。显示输出port和使能子系统的一样,这里不再赘述。

20.7 函数调用子系统

类似于编程里面的函数,会其他模块调用,就会被执行。

使用Function-Call Generateor去生成一个函数调用,来调用我们的函数调用子系统。

注意设置Function-Call Generateor模块的Sample time,默认是1,表示1s。我们设置为-1,表示跟系统的默认步长一致。

设置为-1的执行结果

Function-Call Generateor模块的迭代次数设置为2的时候,每仿真一个步长,调用两次。

使用同一个Function-Call Generateor模块,加Demux拆分成两个函数调用,去调用子系统。

使用Stataflow去调度函数调用子系统,可以产生不同的周期调用和我们定义的顺序调用。

Stateflow逻辑,定义调用顺序,和Fcn2的20ms调用一次的逻辑。

States when enabling设置方式和使能子系统一样。Treat as Simulink Function放在后面的章节讲。

Sample time type默认使用triggered触发类型,一般使用场景选择。如果选择Periodic,就可以设置Sample time。

20.8 代码复用子系统

CodeReuseSubsystem代码复用子系统,是在AtomicSubsystem原子子系统的基础上,修改了生成代码的配置而来的。

默认的Function packaging选择的是Reusable function。

代码复用子系统和虚拟子系统,原子子系统都是可以相互转换的。

首先搭建一个简单的模型逻辑。

选中逻辑部分使用Ctrl+G封装成虚拟子系统。

鼠标右键,在弹出来的菜单中选择Create Subsystem from Selection,或者使用快捷键Ctrl+G.

封装完是下面的框线比较细的。

修改属性,变为原子子系统。

设置生成代码的属性,变为和代码复用子系统一样。这种操作在模型的逻辑打好以后,需要封装的逻辑块输入和输出比较多的时候,我们不想拖一个默认的单个输入输出的代码复用子系统进行修改,就可以直接封装为虚拟子系统后再进行修改属性。

20.9 使能和触发子系统

Enabled and Triggered Subsystem子系统,是使能子系统和触发子系统合起来的一种子系统。

使能和触发同时满足才能执行子系统的逻辑。其他的地方和单独的使能子系统还有单独的触发子系统是相同的。

选择Trigger类型为Function-call的时候,报错。不能设置使能和函数调用同时满足的子系统。

20.10 ForIteratorSubsystemFor循环子系统

For循环子系统,可以实现循环计算。

子系统里可以设置输入输出,里面还有一个For Iterator模块。

可以对它进行进行设置,控制迭代的次数。

设置开始的状态是held还是reset。

搭建模型,做一个累加的模块,执行5次运算。

仿真,第0s的时候,输出结果是累加的5.

单步执行,第0.01s的时候,输出结果变成了10,我们选择是held。

我们修改staring mode为reset,重新开始仿真,第0s也是同样的结果是5.第0.01s的时候输出结果还是5,模型里的delay的状态值被reset。

设置迭代的地方是内部还是外部,默认选择的是内部,在下面的Iteration limit(N)对话框里设置迭代次数,现在设置的是5.

选择外部模式,迭代次数由外部port输入进来。

通过子系统外部输入进去迭代次数。

将数组的维度接到迭代次数的port上。

当我们设置显示迭代变量的时候,迭代模块就会将迭代的变量输出。

修改模型,变成求迭代次数的和。

2次的时候结果是1+2=3.

1+2+3+4+5=15

通过外部设置下一次迭代的值。

Index Mode选择是从1开始还是从0开始。

设置为从0开始,模块图标发生改变,显示0:N-1.

从0开始加。0+1+2+3+4=10。

设置输出迭代变量的类型。

20.11 WhileIteratorSubsystemWhile循环子系统

While循环子系统,可以实现循环计算。

可以指定while迭代子系统的最大迭代次数,只要满足了最大迭代次数,就会退出循环,保护机制。

显示迭代次数,作为输出。迭代次数输出的数据类型。

while先判断条件,再执行动作,如果条件第一次都不满足,那循环一次也不会执行。

do-while,先执行动作,再判断条件,不管条件满不满足,动作至少都会执行一次。

两个输入port,IC可以控制整个while循环要不要执行,如果是true就会执行,如果是false,直接不执行。cond是循环过程中控制循环结束的条件,如果循环的时候,cond等于false,那循环就会结束。

20.12 If条件子系统

If Block可以设置If的条件。

需要跟If Action Subsystem一起使用。

设置If模块的输入数量。

设置If的表达式,比如u1 > 0.

Elseif的表达式,需要把所有的Elseif表达式都写在这个对话框里,用,隔开。

Elseif的表达式,与运算使用&而不是&&(c语言语法)。

再写一个Elseif表达式,中间用,隔开

设置完后多加了几个port。

显示else与否。

修改逻辑,If Action Subsystem的输出需要用merge模块组合在一起。

用switch模块去做分支的处理。

20.13 SwitchCase子系统

Switch Case可以去根据不同的输入产生不同的分支。Switch Case模块可以设置Condition的,从而产生多种分支。

设置{1,2,[3,4],[5,6,7]},四条分支。同时勾选default,表示前面4条分支都不满足的时候,会走default分支。

模块外观改变,显示出相应的分支。

添加Switch Case Action Subsystem,修改模型,进行仿真,结果跟我们预期的是一样的。

20.14 SubsystemExample子系统

Simulink自带的子系统的一些使用例子。不用来生成代码,只是简单看看里面的例子。

添加到模型以后,双击打开就可以看到里面的例子了。

自带的几种子系统例子。

可以学习一下其中的一些例子,但是里面的例子并不是所有都适合建模生成代码的。

20.15 ModelReference

在库浏览器中,名字叫Model。它是可以引用其他现成的模型,比较适合做集成,将模块化的其他的部分交给不同的工程师开发,再用Model Reference引用到一个模型里进行集成,其他的单独模块更新后,大的模型也会自动更新,不需要我们手动再去集成,避免手动操作出错和一些重复性的劳动。

我们对Reference的模型进行仿真,是不会影响到Reference的模型的。

双击模块,选择被引用的模型。

选择相应的Model,点击打开。

可以选择几种模式,根据仿真的情况去选择。

其他两个选项保持默认就可以。点击Ok后,ModerReference模块将被引用的模型的输入输出接口显示出来。

对模型连接输入和输出,进行仿真,看到结果跟原来的模型的逻辑是一致。

20.16 SubsystemReference

在库浏览器中,名字叫Subsystem Reference。它是可以引用其他现成的子系统,它跟Model Reference是比较像的,但是它的存储内容会更少。

我们在模型中先添加一个子系统,鼠标右键点开Block Parameter,点到Subsystem Reference,点击Convert,进行转换。

保存为下面的名字。

点击Ok,完成引用。

引用后进行仿真,跟我们期望的运行一致。

保存在路径中,图标有区别。

打开Subsystem文件,工具栏跟Model不一样。

20.17 VariantSubsystem

添加Variant Subsystem模块。使用这个模块可以配置使用不同的Subsystem,假如某些功能有高中低配,我们可以使用这个模块来选择它的配置。

在工作空间定义A变量,等于1。

鼠标右键点击模块,在弹出的菜单中选择Block Parameter进行配置。

默认选择的是配置方式是表达式,在具体的配置里现在写的是true和false,执行true的子系统,不执行false。

在相应的子系统条件上添加,当A == 1的时候,执行Subsystem,否则执行Subsystem1。

可以看出来激活的是Subsystem,也就是第一个子系统。

Subsystem的逻辑是输入+1。

Subsystem1的逻辑是输入+2。

进行仿真1+1 = 2,仿真的结果是2。

将A设置为0。

然后模型中可以看到激活的是Subsystem1。

进行仿真,仿真结果是1+2等于3。

配置控制模式可以选择expression表达式,label标签和sim codegen switching仿真和代码生成切换。expression代表比如A==1,A>3这种逻辑表达式,或者是true,fasle等等。label就是比如设置两种label,A和B,选择执行哪个label就会用哪个相应的子系统。sim codegen switching是会自动选择是仿真模式还是代码生成模式,会使用不同的子系统,比如Normal仿真模式的时候,或者是SIL、HIL等模式就会使用代码生成的子系统。

使用label进行选择激活的子系统。

sim codegen switching模式下可以选择仿真使用一个子系统,生成代码或者是SIL、HIL等使用另一个子系统。

变种激活时间设置,有update diagram,update diagram analyze all choices,code compile,startup。

模式和激活时间的表格。

有这几个工具。

第一个图标是用来创建和添加新的Subsystem变种,下面一个是创建Model。

点击第一个图标后,添加相应的子系统。

选择第三个图标,可以对条件进行编辑。

创建Condition表达,比如我们设置A==2.

设置完成。

可以都设置在表达式里。

将A赋值为2.

激活最下面的子系统。

打开当前激活的子系统。

刷新对话框的额内容。

选中传播外部条件,可以将外部没有使用的模块变灰色。

将Subsystem2改为两个输入,加法运算。其他的两个子系统还是单个输入。

激活Subsystem2的时候。

将A赋值为1.

仿真看到In2变灰。

点击到内部可以看到激活的是单个输入的Subsystem。

不勾选这个选项,仿真的时候外部的模块还是显示的黑色。

20.18 VariantModel

添加Variant Model模块。

里面是通过Model Reference去选择使用的模型。

选择完模型后,跟Variant Subsystem就很像了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mini-Gemini: 探索多模态视觉语言模型的新境界

一、背景 在数字化时代,人工智能的发展正以前所未有的速度推进。特别是在多模态学习领域,结合视觉和语言的能力已成为研究的热点。最近,一篇名为“Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models”的文章在arX…

[已解决]react打包部署

react打包部署 问题 npm install 命令无反应 思路 换成 yarn install 安装完hadoop的环境后,使用node的yarn会报错: 我们在cmd使用where yarn,如下: 看你想保留哪一个,我平时node用的多,就把hadoop的y…

飞书API(5):查看多维表 28 种数据类型的数据结构

一、引入 前面我们用于测试的数据集其实都是比较常用的数据,比如说文本、数字、单选等,但飞书多维表并不仅仅只有这些数据,截止发文,飞书多维表应用上支持28种数据类型,在数据层面飞书官方只提供了23种数据类型&#…

Cadence软件安装

Cadence软件 iscape 用于安装cadence家的安装软件 解压缩安装包tar -xvf IScape04.23.tar.gz运行bash IScape/iscape/bin/iscape.sh 设置默认安装路径(可选)IC618 这里使用的是IC618.320版本作为示例,其他版本安装过程差不多 安装 首先安装终端模拟器,不然安装之后会失败…

【前端】校园二手书交易系统javascript+css+html (源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Vnode是如何产生的?

源码 流程图 源码解读 Vue.js2.0中有两种生成方式:第一种是直接在Vue对象的option中添加render字段;第二种是像Vue.js 1.x版本那样写一个模板或者指定一个el根元素,它会首先转换成模板,经过HTMI语法解析器生成一个 ast 抽象语法树…

JAVAEE——IP协议

文章目录 IP协议IP协议报头格式IP协议报头的各个区段四位版本四位首部长度八位服务类型16位总长度16位标识,3位标志,13位片偏移八位生存时间八位协议 地址管理IP地址解决提议1:动态分配Ip地址解决提议2:NAT机制 IP协议 IP协议报头…

【新手入门必看】从零开始学指针

我使用VS CODEMSYS2的编译环境进行学习&#xff0c;想使用VS CODE进行C/C代码编写的小伙伴参考这篇文章进行环境配置VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09; 一、指针的引入 指针地址 #include <stdio.h>int main() {int a 10;printf(&quo…

编写函数fun,函数的功能是:根据以下公式计算s,计算结果作为函数值返回;n通过形参传入。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 编写…

Java:二叉树(1)

从现在开始&#xff0c;我们进入二叉树的学习&#xff0c;二叉树是数据结构的重点部分&#xff0c;在了解这个结构之前&#xff0c;我们先来了解一下什么是树型结构吧&#xff01; 一、树型结构 1、树型结构简介 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>…

深度学习系列64:数字人openHeygen详解

1. 主流程分析 从inference.py函数进入&#xff0c;主要流程包括&#xff1a; 1&#xff09; 使用cv2获取视频中所有帧的列表&#xff0c;如下&#xff1a; 2&#xff09;定义Croper。核心代码为69行&#xff1a;full_frames_RGB, crop, quad croper.crop(full_frames_RGB)。…

openobserve-filebeat配置

优势 rustgolang开发的日志工具组合&#xff0c;自带日志数据存储&#xff0c;简化部署和管理。日志数据可配置保留x天。从日志文件中采集&#xff0c;做到非侵入式日志集中管理。 可从日志内容中提取信息进行报警等二次开发。 下载 openobserve-v0.10.1-windows-amd64 fil…

VL02N交货单清除字段:VLSTK(分配状态)

VL02N交货单清除字段&#xff1a;VLSTK(分配状态) 通过查找增强对应的BADI&#xff1a;LE_SHP_DELIVERY_PROC 修改方法&#xff1a;IF_EX_LE_SHP_DELIVERY_PROC~CHANGE_DELIVERY_HEADER&#xff0c;代码如下&#xff1a;

JSS作业

JSS作业&#xff1a; 1: <script>var cnt parseInt(window.prompt("请输入打印的行数&#xff1a;"));for (var i 1; i < cnt; i){for (var j 1; j < i; j){document.write("*")}document.write("<br>")} </script>…

XTuner 微调 LLM:1.8B、多模态、Agent

两种微调范式&#xff1a;增量预训练和指令微调 在大语言模型下游应用中&#xff0c;主要有两种微调范式&#xff1a;增量预训练和指令微调。增量预训练旨在让模型学习特定领域的常识&#xff0c;而不需要有监督标注的数据&#xff1b;指令微调则是通过高质量的对话数据训练模型…

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

vulfocus靶场couchdb 权限绕过 (CVE-2017-12635)

Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台&…

动态内存管理 柔性数组

文章目录 动态内存函数 malloc freecallocrealloc 重新开辟空间realloc 也可以第一个参数为NULL&#xff0c;则是直接开辟内存&#xff0c;类似于malloc用法 常见的动态内存错误对空指针进行解引用操作对开辟的内存越界访问对非动态开辟的内存使用free释放使用free释放动态开辟…

《Linux运维总结:Kylin V10+ARM架构CPU基于docker-compose一键离线部署redis6.2.8之容器版哨兵集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;《Linux运维篇&#xff1a;Linux系统运维指南》 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要面向不通的客户安装我们的业务系统&…

停更这大半年-我去考了个研

解释一下2023年我几乎没有更新文章 还有私信也没有回&#xff0c;因为我几乎没有登陆过csdn了 我从2023年3月份开学就开始准备考研了 其实3月28号就出结果了&#xff0c;后面有事情就给忘了&#xff0c;给我的粉丝解释一下&#xff08;虽然粉丝也不多&#xff09;。后面应该会…