Main Content

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

合成信号的类型

为了降低模型中的外观复杂度,可以将信号合并为合成信号。合成信号包含的信号称为元素。元素保留它们各自的身份,这让您可以从合成信号中提取它们。

根据合成信号类型,您可以通过名称或索引访问合成信号元素。

  • 基于名称的合成信号允许使用信号层次结构,称为总线

  • 基于索引的合成信号是平面结构的,无论您是否是在不同的阶段创建它们。它们要求所有输入信号具有相同的数据类型。

当您将多个信号组合为一个合成信号时,您可以决定它们是否影响仿真和代码生成。

  • 虚拟合成信号通过将两条或多条信号线合并为一条线,简化模型的视觉外观。它不会在任何功能上对信号进行组合,因此不会影响仿真或代码生成。在仿真和生成代码中,虚拟合成信号可以直接访问元素,因此比非虚拟合成信号的执行速度更快。

  • 非虚拟合成信号在外观和功能上对信号进行组合,从而会影响仿真和代码生成。

模型可以使用这些合成信号类型的组合。

合成信号特性基于名称的访问基于索引的访问
外观上的组合

虚拟总线

复路信号

功能上的组合

非虚拟总线

串联信号

编译模型后,您可以通过合成信号的线型来识别其类型。为合成信号创建信号线或打开包含合成信号的模型时,合成信号与标量信号具有相同的线型。要编译模型并显示合成线型,请在 Modeling 选项卡上选择 Update Model

编译后的合成线型合成信号类型
虚拟总线
非虚拟总线
启用 Nonscalar Signals 信息叠加时的基于索引的合成信号
包含非虚拟总线的基于索引的合成信号(称为总线数组

虚拟总线

此模型显示一条虚拟总线,其中包含信号 abc

Bus Creator 模块在子系统或模型中创建总线。Bus Selector 模块提取总线的指定元素。

此模型显示穿过子系统边界的等效虚拟总线。

Out Bus Element 模块在子系统或模型接口上创建总线。In Bus Element 模块在子系统或模型接口上提取总线的指定元素。

您可以使用虚拟总线来包含具有不同采样时间的总线元素。

要定义虚拟总线的属性,您可以指定 Simulink.Bus 对象数据类型或使用 In Bus ElementOut Bus Element 模块指定元素属性。

要创建虚拟总线,请参阅将信号线组合为虚拟总线

非虚拟总线

此模型显示包含信号 abc 的非虚拟总线。

Bus Creator 模块在子系统或模型中创建总线。Bus Selector 模块提取总线的指定元素。

此模型显示使用 Out Bus ElementIn Bus Element 模块穿过模型引用边界的等效非虚拟总线。

您可以使用非虚拟总线来:

  • 将总线数据打包为生成的 C 代码中的结构体。

  • 构造总线数组。

  • 通过 S-Function 对接外部代码。

  • 总线数据需要跨 MATLAB Function 模块或 Stateflow® 图边界。

  • 使用 Scope 模块显示和记录总线。

非虚拟总线的所有元素必须使用相同的采样时间。您可以使用 Rate Transition 模块更改总线中单个信号或所有信号的采样时间。

Simulink.Bus 对象数据类型必须定义要做为非虚拟的总线。当您选择模块参数(如 Output as nonvirtual bus)时,总线变为非虚拟总线。选择使总线非虚拟化会导致仿真和代码生成应用由 Bus 对象定义的结构体。当总线为虚拟总线时,Bus 对象将仅验证总线的属性。

不同的总线类型在生成代码的效率、大小和可读性方面可能存在显著差异。要使总线出现在生成的代码中,它必须为非虚拟总线。只有虚拟总线的元素出现在生成的代码中。

例如,假设一条总线穿过 Unit Delay 模块。为简单起见,该总线只包含三个元素:abc。下表显示非虚拟总线对生成代码的影响。

生成的代码虚拟总线非虚拟总线

model_types.h 文件

虚拟总线不需要类型定义。

Bus 对象在生成的代码中显示为结构体。

typedef struct {
  real_T a;
  real_T b;
  real_T c;
} BusObject;

model.h 文件

生成的代码为虚拟总线的每个元素定义一个 Unit Delay 模块。

typedef struct {
  real_T UnitDelay_1_DSTATE;  /* '<Root>/Unit Delay' */
  real_T UnitDelay_2_DSTATE;  /* '<Root>/Unit Delay' */
  real_T UnitDelay_3_DSTATE;  /* '<Root>/Unit Delay' */
} DW_model_T;

生成的代码使用 BusObject 结构体为非虚拟总线定义一个 Unit Delay 模块。

typedef struct {
  BusObject UnitDelay_DSTATE;  /* '<Root>/Unit Delay' */
} DW_model_T;

要创建非虚拟总线,请参阅Create Nonvirtual Buses

如果您打算为使用总线的模型生成代码,请参阅Generate Efficient Code for Bus Signals (Simulink Coder)。非虚拟总线的生成代码可能会包含某些总线信号的多个副本。

串联信号

此模型显示将输入矩阵并排放置在一起的串联信号。

Matrix Concatenate 模块创建串联信号。元素可以是向量或矩阵,这取决于您如何配置此模块。Selector 模块根据指定的索引提取信号。提取的信号可以按不同于输入信号的方式进行组合。

您可以在数学运算中使用串联信号。

要用 Vector ConcatenateMatrix Concatenate 模块对信号进行组合,这些信号必须具有相同的数据类型。当数据类型是 Bus 对象时,输入必须为非虚拟总线。

串联的非虚拟总线也称为总线数组。在总线数组中,所有元素均为非虚拟总线,它们使用相同的 Bus 对象来指定属性。总线数组相当于 MATLAB® 中的结构体数组。您可以使用总线数组对多通道系统进行建模。虽然所有通道都具有相同的属性,但每个通道可能具有不同值。

在此模型中,Vector Concatenate 模块创建一个总线数组。

有关总线数组的详细信息,请参阅使用总线数组组合非虚拟总线

复路信号

此模型显示将三个输入信号并排放置在一起的复路信号。

Mux 模块创建复路信号。Demux 模块提取所有信号,这些信号的组合方式可能不同于输入信号。Selector 模块根据指定的索引提取信号。提取的信号可以按不同于输入信号的方式进行组合。

您可以使用复路信号对多个向量执行计算。您还可以使用 Mux 模块创建由函数调用组成的向量。

Mux 模块的输入信号可以是标量、向量和复路信号的任意组合,但它们必须具有相同的数据类型和数值类型。复路输出信号中信号的显示顺序与 Mux 模块的输入信号相同。您可以使用多个 Mux 模块分多个阶段创建复路信号,但结果是平面结构,就像您只使用一个 Mux 模块一样。

相关主题