Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

合成信号的类型

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

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

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

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

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

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

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

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

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

虚拟总线

复路信号

功能上的组合

非虚拟总线

串联信号

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

编译后的合成线型合成信号类型
Virtual bus line style虚拟总线
Nonvirtual bus line style非虚拟总线
Nonscalar signal line启用非标量信号信息叠加时的基于索引的合成信号
Array of buses line style包含非虚拟总线的基于索引的合成信号(称为总线数组

虚拟总线

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

Model with a virtual bus between a Bus Creator block and a Bus Selector block

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

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

Model with a virtual bus that connects two subsystems

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

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

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

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

非虚拟总线

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

Model with a nonvirtual bus between a Bus Creator block and a Bus Selector block

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

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

Model with a nonvirtual bus that connects two subsystems

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

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

  • 构造总线数组。

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

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

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

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

Simulink.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)。非虚拟总线的生成代码可能会包含某些总线信号的多个副本。

串联信号

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

Model with a concatenated signal between a Matrix Concatenate block and two Selector blocks

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

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

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

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

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

Model with an array of buses between a Vector Concatenate block and a Selector block

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

复路信号

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

Model with a mux signal between a Mux block, Demux block, and Selector block

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

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

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

相关主题