本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

可变大小信号基础知识

关于可变大小信号

Simulink® 信号可以是标量、向量(一维)、矩阵(二维)或 N 维。有关这些信号类型的信息,请参阅《Simulink 用户指南》中的信号基础知识

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 模块的下游。可在命令提示符下使用命令确定 a 是否具有可变大小。

  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 模块。

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

在条件执行子系统中,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 模块对应的子系统输出的当前大小将设置为最大大小。

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

相关主题