Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

可变大小信号基础知识

Simulink® 信号可以是标量、向量(一维)、矩阵(二维)或 N 维。Simulink 可变大小信号是指信号值和信号大小(一个维度中的元素数)在模型仿真过程中可能会发生变化的信号。但是,维度数在仿真过程中不能改变。此功能允许您对具有不同资源、约束和环境的系统进行建模。

您可以使用以下模块在 Simulink 模型中创建可变大小信号:

  • Switch 或 Multiport Switch 模块,不同的输入端口具有大小不同的固定大小信号。输出是可变大小信号。

  • Selector 模块和 “Starting and ending indices (port)” 索引选项。索引端口信号可以指定输入数据信号的不同子区域,在仿真过程中生成可变大小的输出信号。

  • S-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 模块的下游。

  1. 打开示例模型。

  2. 选择输出信号标记为 aSum 模块。

  3. 在命令行窗口中键入以下内容,将模型设置为编译状态(类似于图更新)。

    sldemo_varsize_basic([],[],[],'compile')

  4. 获取模块输出端口的句柄。

    portHandles = get_param(gcb,'portHandles');
    outPortHandle = portHandles.Outport;

  5. 查询输出端口的编程参数 CompiledPortDimensionsMode

    varSize = get_param(outPortHandle,'CompiledPortDimensionsMode')
    varSize =
    
         1

    变量 varSize 的值为 1,表示信号 a 具有可变大小。

    值为 0 表示信号不具有可变大小。

  6. 终止模型编译。

    sldemo_varsize_basic([],[],[],'term')

空信号

空信号是指长度为 0 的信号。例如,大小为 [0][0x3][2x0][2x0x3] 的信号都是空信号。Simulink 允许空信号具有可变大小,同时支持大多数按元素运算。但是,Simulink 不支持为修改信号维度的模块使用空信号。不支持的模块包括沿指定维度执行运算或处理的 Reshape、Permute 和 Sum 模块。

Simulink 模块对可变大小信号的支持

Simulink Block Data Type Support 表包括支持可变大小信号的完整模块列表。

要查看该表,请执行下列操作:

  1. 打开一个 Simulink 模型。

  2. 在 MATLAB® 命令行中,输入 showblockdatatypetable

    此时将打开一个单独的窗口,显示 Simulink Block Data Type Support 表。

Variable-Size Support 列中的 X 表示支持该模块。

提示

您还可以通过在命令提示符下输入 showblockdatatypetable 来查看该表。

可变大小信号的子系统初始化

在条件执行子系统中,Outport 模块输出的初始信号大小会根据您选择的参数而有所不同。

如果您将父级子系统中的 Propagate sizes of variable-size signals 参数设置为 “During execution”,则 Output 模块的 Initial output 参数不能超过输入端口的最大大小。如果 Initial output 参数值为:

初始输出参数初始输出信号大小
非标量矩阵初始输出信号大小为 Initial output 参数的大小。
标量初始输出信号大小为标量。
默认值 []初始输出大小为空信号(维度全部为零)。

如果您将父级子系统中的 Propagate sizes of variable-size signals 参数设置为 “Only when enabling”,则 Output 模块的 Initial output 参数必须为标量值。

  • 当重新传播 Outport 模块的输入信号大小时,将通过对标量参数值进行标量扩展来设置初始输出值。

  • 如果 Initial output 参数为默认值 [],则 Simulink 将初始输出视为接地值。

  • 如果该模型在开始时间 (t = 0) 未激活父级子系统,则与 Outport 模块对应的子系统输出的当前大小将设置为最大大小。

  • 当父级子系统重新传播信号大小时,子系统可变大小输出信号的值也将重置为其初始输出参数值。

条件执行子系统模块

控制端口模块位于条件执行子系统中。您可以将这些模块的 Propagate sizes of variable-size signals 参数设置为 During executionOnly when execution is resumed(动作端口)和 Only when enabling(使能和触发或函数调用)。

切换模块

切换模块允许不同大小的输入信号并将输入信号的大小传播到输出信号,从而支持可变大小信号。您可以在 Signal Attributes 窗格中将这些模块的 Allow different data input sizes 参数设置为 on 或 off。

可变大小信号限制

下表说明了可变大小信号的限制。

限制解决方法
数组格式记录不支持可变大小信号。使用 “Structure” 或 “Structure With Time” 格式记录可变大小信号。
右键点击信号记录不支持可变大小信号。使用 To Workspace 模块(“Structure” 或 “Structure With Time” 格式)或根 Outport 模块记录可变大小信号。
基于帧的可变大小信号不能更改帧长度(第一个维度大小),但可以更改第二个维度大小(通道数)。使用基于帧的信号需要 DSP System Toolbox™ 软件。使用 Frame Conversion 模块将信号转换为基于采样的信号。
可变大小信号必须有离散采样时间。
使用 ERT S-Function、自定义存储类、函数原型控制、AUTOSAR、C++ 接口和 ERT 可重用代码接口时,Embedded Coder® 不支持可变大小信号。
Simulink 不支持可变大小参数或 DWork 向量。
Rapid Accelerator 模式不支持其根级输入端口具有可变大小信号的模型。
您用作引用模型(Model 模块)的输入或输出的虚拟总线不支持可变大小信号。将总线信号配置为非虚拟信号。有关使用总线作为引用模型的输入或输出的详细信息,请参阅模型接口上的非虚拟总线。有关控制总线虚拟性的详细信息,请参阅合成信号的类型

下列各项不支持可变大小信号:

  • 总线信号数组

  • 将初始条件指定为 MATLAB 结构体的模块

如果进入模块的信号具有可变大小,则无法将存储类应用于根级 Outport 模块(请参阅模型接口元素的 C 代码生成配置 (Simulink Coder))。将存储类应用于信号线,而不是 Outport 模块。

相关主题