可变大小信号基础知识
Simulink® 信号可以是标量、向量(一维)、矩阵(二维)或 N 维。Simulink 可变大小信号是指信号值和信号大小(一个维度中的元素数)在模型仿真过程中可能会发生变化的信号。但是,维数在仿真过程中不能改变。此功能允许您对具有不同资源、约束和环境的系统进行建模。
您可以使用以下模块在 Simulink 模型中创建可变大小信号:
Switch 或 Multiport Switch 模块,不同的输入端口具有大小不同的固定大小信号。输出是可变大小信号。
具有起始和结束索引(端口) 索引选项的 Selector 模块。索引端口信号可以指定输入数据信号的不同子区域,在仿真过程中生成可变大小的输出信号。
S-Function 模块,将输出端口配置为支持可变大小信号。输出不仅包括值,还包括信号的维度。
MATLAB Function 模块,将输出配置为支持可变大小信号。
可变大小信号如何传播
在 Simulink 环境中,可变大小信号可在模型执行过程中通过以下两种方式之一改变其大小:
在模型执行的每一步。
模型中的各种模块会在执行输出方法的过程中修改信号大小。
仅在初始化条件执行子系统过程中
在子系统(例如执行子系统、使能子系统和函数调用子系统)中发生明确的模式切换事件时改变信号大小。
下面以一个具有状态的 Discrete 2-Tap Filter 模块为例来说明两种传播方式的主要区别。
Discrete 2-Tap Filter
假定此滤波器的输入信号维度在仿真过程中由 4 变为 1。Unit Delay 模块的状态应该在何时以及如何从 4 变为 1 以继续处理输入是不明确的。为了确保一致,两个 Unit Delay 模块必须同步更改状态行为。在信号大小会在执行过程中随时改变的环境中,为了避免不确定情况的出现,Simulink 通常不允许使用状态数量取决于输入信号大小的模块。
为了便于比较,下面假定该 Discrete 2-Tap Filter 模块位于函数调用子系统中。假定此子系统使用第二种方法传播可变大小信号。在这种情况下,仅在初始化该子系统时,输入信号的大小才从 4 变为 1。在初始化时,该子系统将其所有状态(包括两个 Unit Delay 模块的状态)重置为初始值。重置子系统可确保明确无误地为滤波器的输入信号指定状态。
Mode-Dependent Variable-Size Signals说明如何以互补方式使用两种可变大小信号传播方法为复杂系统建模。
以编程方式确定信号线是否具有可变大小
以下示例说明如何在命令提示符下或在脚本中使用命令确定信号线是否具有可变大小。在包含子系统或引用模型的较大模型或层次结构中,可以使用此方法确定信号是否因为上游模块而具有可变大小。
示例模型 sldemo_varsize_basic
中包含一个信号 a
,它处于 Switch 模块的下游。
打开示例模型。
选择输出信号标记为
a
的 Sum 模块。在命令行窗口中键入以下内容,将模型设置为编译状态(类似于图更新)。
sldemo_varsize_basic([],[],[],'compile')
获取模块输出端口的句柄。
portHandles = get_param(gcb,'portHandles'); outPortHandle = portHandles.Outport;
查询输出端口的编程参数
CompiledPortDimensionsMode
。varSize = get_param(outPortHandle,'CompiledPortDimensionsMode')
varSize = 1
变量
varSize
的值为1
,表示信号a
具有可变大小。值为
0
表示信号不具有可变大小。终止模型编译。
sldemo_varsize_basic([],[],[],'term')
空信号
空信号是指长度为 0
的信号。例如,大小为 [0]
、[0x3]
、[2x0]
和 [2x0x3]
的信号都是空信号。Simulink 允许空信号具有可变大小,同时支持大多数按元素运算。但是,Simulink 不支持为修改信号维度的模块使用空信号。不支持的模块包括沿指定维度执行运算或处理的 Reshape、Permute 和 Sum 模块。
Simulink 模块对可变大小信号的支持
Simulink Block Data Type Support 表包括支持可变大小信号的完整模块列表。
要查看该表,请执行下列操作:
打开一个 Simulink 模型。
在 MATLAB® 命令行中,输入
showblockdatatypetable
。此时将打开一个单独的窗口,显示 Simulink 模块数据类型支持表。
可变大小支持列中的 X
表示支持该模块。
提示
您还可以通过在命令提示符下输入 showblockdatatypetable
来查看该表。
可变大小信号的子系统初始化
在条件执行子系统中,Outport 模块输出的初始信号大小会根据您选择的参数而有所不同。
如果您将父级子系统中的传播可变大小信号的大小参数设置为执行期间,则 Output 模块的初始输出参数不能超过输入端口的最大大小。如果初始输出参数值为:
初始输出参数 | 初始输出信号大小 |
---|---|
非标量矩阵 | 初始输出信号大小为初始输出参数的大小。 |
标量 | 初始输出信号大小为标量。 |
默认值 [] | 初始输出大小为空信号(维度全部为零)。 |
如果您将父级子系统中的传播可变大小信号的大小参数设置为仅在启用时,则 Output 模块的初始输出参数必须为标量值。
当重新传播 Outport 模块的输入信号大小时,将通过对标量参数值进行标量扩展来设置初始输出值。
如果初始输出参数为默认值
[]
,则 Simulink 将初始输出视为接地值。如果该模型在开始时间 (
t = 0
) 未激活父级子系统,则与 Outport 模块对应的子系统输出的当前大小将设置为最大大小。当父级子系统重新传播信号大小时,子系统可变大小输出信号的值也将重置为其初始输出参数值。
条件执行子系统模块
控制端口模块位于条件执行子系统中。您可以将这些模块的传播可变大小信号的大小参数设置为 During execution
、Only when execution is resumed
(动作端口)和 Only when enabling
(使能和触发或函数调用)。
Trigger - 触发器类型设置为函数调用
切换模块
切换模块允许不同大小的输入信号并将输入信号的大小传播到输出信号,从而支持可变大小信号。您可以在“信号属性”窗格中将这些模块的允许不同数据输入大小参数设置为 on 或 off。
可变大小信号限制
下表说明了可变大小信号的限制。
限制 | 解决方法 |
---|---|
数组格式记录不支持可变大小信号。 | 使用结构体、带时间的结构体或数据集格式记录可变大小信号。 |
可变大小信号必须有离散采样时间。 | — |
使用 ERT S-Function、自定义存储类、函数原型控制、AUTOSAR 模型接口、C++ 接口和 ERT 可重用代码接口时,Embedded Coder® 不支持可变大小信号。 | — |
Simulink 不支持可变大小参数或 DWork 向量。 | — |
快速加速模式不支持其根级输入端口具有可变大小信号的模型。 | — |
您用作引用模型(Model 模块)的输入或输出的虚拟总线不支持可变大小信号。 | 将总线配置为非虚拟。有关使用总线作为引用模型的输入或输出的详细信息,请参阅在模型接口处使用总线。有关控制总线虚拟性的详细信息,请参阅合成接口规范。 |
配置为使用局部求解器的引用模型不支持模型接口上的可变大小信号。 | — |
将初始条件指定为 MATLAB 结构体的模块不支持可变大小信号。 | — |
仅在普通仿真模式下,总线数组才支持可变大小信号。 | — |
一些仿真模式不支持具有可变大小信号的总线数组的信号记录。 | 在普通模式下仿真模型,使用信号记录记录具有可变大小信号的总线数组。 (自 R2023a 起) |
MATLAB Function 模块和 Stateflow® 图不支持具有有界可变大小信号的总线数组。有界可变大小信号表示具有已知上界的可变大小信号。 | — |
一些仿真模式不支持具有可变大小信号的非虚拟总线的信号记录。 | 在普通模式或加速模式下仿真模型以记录:
(自 R2023a 起) |
信号记录不支持具有可变大小信号的虚拟总线,这些信号不包含在嵌套的非虚拟总线中。 | — |
如果进入模块的信号具有可变大小,则无法将存储类应用于根级 Outport 模块(请参阅C Data Code Interface Configuration for Model Interface Elements (Simulink Coder))。 | 将存储类应用于信号线,而不是 Outport 模块。 |