合成信号的类型
为了降低模型中的外观复杂度,可以将信号合并为合成信号。合成信号包含的信号称为元素。元素保留它们各自的身份,这让您可以从合成信号中提取它们。
根据合成信号类型,您可以通过名称或索引访问合成信号元素。
基于名称的合成信号允许使用信号层次结构,称为总线。
基于索引的合成信号是平面结构的,无论您是否是在不同的阶段创建它们。它们要求所有输入信号具有相同的数据类型。
当您将多个信号组合为一个合成信号时,您可以决定它们是否影响仿真和代码生成。
虚拟合成信号通过将两条或多条信号线合并为一条线,简化模型的视觉外观。它不会在任何功能上对信号进行组合,因此不会影响仿真或代码生成。在仿真和生成代码中,虚拟合成信号可以直接访问元素,因此比非虚拟合成信号的执行速度更快。
非虚拟合成信号在外观和功能上对信号进行组合,从而会影响仿真和代码生成。
模型可以使用这些合成信号类型的组合。
编译模型后,您可以通过合成信号的线型来识别其类型。为合成信号创建信号线或打开包含合成信号的模型时,合成信号与标量信号具有相同的线型。要编译模型并显示合成线型,请在建模选项卡上选择更新模型。
编译后的合成线型 | 合成信号类型 |
---|---|
![]() | 虚拟总线 |
![]() | 非虚拟总线 |
![]() | 启用非标量信号信息叠加时的基于索引的合成信号 |
![]() | 包含非虚拟总线的基于索引的合成信号(称为总线数组) |
虚拟总线
此模型显示一条虚拟总线,其中包含信号 a
、b
和 c
。
Bus Creator 模块在子系统或模型中创建总线。Bus Selector 模块提取总线的指定元素。
此模型显示穿过子系统边界的等效虚拟总线。
Out Bus Element 模块在子系统或模型接口上创建总线。In Bus Element 模块在子系统或模型接口上提取总线的指定元素。
您可以使用虚拟总线来包含具有不同采样时间的总线元素。
要定义虚拟总线的属性,您可以指定 Simulink.Bus
对象数据类型或使用 In Bus Element 和 Out Bus Element 模块指定元素属性。
要创建虚拟总线,请参阅将信号线组合为虚拟总线。
非虚拟总线
此模型显示包含信号 a
、b
和 c
的非虚拟总线。
Bus Creator 模块在子系统或模型中创建总线。Bus Selector 模块提取总线的指定元素。
此模型显示使用 Out Bus Element 和 In Bus Element 模块穿过模型引用边界的等效非虚拟总线。
您可以使用非虚拟总线来:
将总线数据打包为生成的 C 代码中的结构体。
构造总线数组。
通过 S-Function 对接外部代码。
总线数据需要跨 MATLAB Function 模块或 Stateflow® 图边界。
使用 Scope 模块显示和记录总线。
非虚拟总线的所有元素必须使用相同的采样时间。您可以使用 Rate Transition 模块更改总线中单个信号或所有信号的采样时间。
Simulink.Bus
对象数据类型必须定义要做为非虚拟的总线。当您选择模块参数(如以非虚拟总线输出)时,总线变为非虚拟总线。选择使总线非虚拟化会导致仿真和代码生成应用由 Bus
对象定义的结构体。当总线为虚拟总线时,Bus
对象将仅验证总线的属性。
不同的总线类型在生成代码的效率、大小和可读性方面可能存在显著差异。要使总线出现在生成的代码中,它必须为非虚拟总线。只有虚拟总线的元素出现在生成的代码中。
例如,假设一条总线穿过 Unit Delay 模块。为简单起见,该总线只包含三个元素:a
、b
和 c
。下表显示非虚拟总线对生成代码的影响。
生成的代码 | 虚拟总线 | 非虚拟总线 |
---|---|---|
| 虚拟总线不需要类型定义。 |
typedef struct { real_T a; real_T b; real_T c; } BusObject; |
| 生成的代码为虚拟总线的每个元素定义一个 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; | 生成的代码使用
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 Concatenate 或 Matrix Concatenate 模块对信号进行组合,这些信号必须具有相同的数据类型。当数据类型是 Bus
对象时,输入必须为非虚拟总线。
串联的非虚拟总线也称为总线数组。在总线数组中,所有元素均为非虚拟总线,它们使用相同的 Bus
对象来指定属性。总线数组相当于 MATLAB® 中的结构体数组。您可以使用总线数组对多通道系统进行建模。虽然所有通道都具有相同的属性,但每个通道可能具有不同值。
在此模型中,Vector Concatenate 模块创建一个总线数组。
有关总线数组的详细信息,请参阅使用总线数组组合非虚拟总线。
复路信号
此模型显示将三个输入信号并排放置在一起的复路信号。
Mux 模块创建复路信号。Demux 模块提取所有信号,这些信号的组合方式可能不同于输入信号。Selector 模块根据指定的索引提取信号。提取的信号可以按不同于输入信号的方式进行组合。
您可以使用复路信号对多个向量执行计算。您还可以使用 Mux 模块创建由函数调用组成的向量。
Mux 模块的输入信号可以是标量、向量和复路信号的任意组合,但它们必须具有相同的数据类型和数值类型。复路输出信号中信号的显示顺序与 Mux 模块的输入信号相同。您可以使用多个 Mux 模块分多个阶段创建复路信号,但结果是平面结构,就像您只使用一个 Mux 模块一样。