主要内容

Merge

R2026b

将多个信号合并为一个信号

  • Merge block

库:
Simulink / Signal Routing
HDL Coder / Ports & Subsystems

描述

Merge 模块可将多个输入合并为单个输出。输出值始终等于其驱动模块最近计算的输出。通过设置输入数目参数来指定输入数目。

请将一个 Merge 模块用于将在不同时间更新的输入信号交叉成一个合并信号,交叉值在合并信号中保留其各自的身份和时间。要将同时更新的信号合并成数组或矩阵信号,请使用 Vector Concatenate 模块。

Merge 模块的使用原则

使用 Merge 模块时,请遵循以下原则:

  • 始终使用条件执行子系统来驱动 Merge 模块,而不涉及任何中间模块。

  • 确保在任何时间步都最多只有一个驱动条件执行子系统在执行中。

  • 确保所有输入信号具有相同的采样时间。

  • 不要为 Merge 模块的输入信号创建分支。

  • 不要记录输入到 Merge 模块的信号。

  • 不要指定 Merge 模块的模块执行优先级。有关详细信息,请参阅指定模块执行顺序、执行优先级和标记。

  • 对于驱动 Merge 模块的所有条件执行子系统 Outport 模块,请将禁用时的输出设置为保持。

  • 如果 Model 模块的输出来自 MATLAB Function 模块或 Stateflow® 图,不要将该输出端口连接到 Merge 模块的输入端口。

  • Merge 模块支持将不同任务中的信号合并到一个根 Outport 模块。

对于一个 Merge 模块的每个输入,最顶层的非虚拟源必须为条件执行子系统(不包括 For Iterator 或 While Iterator 子系统)。

下一个图显示了有效的 Merge 模块用法,它合并来自两个条件执行子系统的信号。

Simulink block diagram showing valid Merge block usage. In3 signal enables one of two Enabled Subsystem blocks at a time using a NOT block to invert the enable signal. The In1 signal feeds Enabled Subsystem, and the In2 signal feeds Enabled Subsystem1. The outputs of both enabled subsystems connect to a Merge block, whose output connects to Out1.

总线支持

Merge 模块支持总线。输入可以是满足下列限制条件的虚拟或非虚拟总线信号:

  • 输入数目必须大于一。

  • 初始输出必须为零、非零标量或有限数值结构体。

  • 必须清除允许端口宽度不等复选框。

  • 所有输入都必须为总线且必须相同(所有元素的层次结构相同,并具有相同的名称和属性)。

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

合并 S-Function 输出

对于来自 S-Function 模块的信号,仅当用来存储 S-Function 模块输出的内存可重用时,才能使用 Merge 模块合并该信号。如果某个模型将不可重用的 S-Function 模块端口连接到 Merge 模块,则当您尝试更新或仿真模型时,Simulink® 将显示错误消息。请参阅 ssSetOutputPortOptimOpts。

多任务根输出

连接到一个根 Outport 模块的 Merge 模块允许合并不同任务中的信号,方法是允许这些信号同时写入该根 Outport 模块。源的联合采样时间会赋给该 Merge 模块。

同一任务中的 Merge 模块的所有源均应在条件执行子系统中,且这些子系统不应在同一时间步中同时输出。

示例

全部展开

此示例说明一个 Merge 模块,该模块具有来自两个原子子系统的输入。

每个 Atomic Subsystem 模块包含一个使能子系统。这满足 Merge 模块的输入来自条件执行子系统的要求。

自 R2026b 起

此示例说明使用 Merge 和 Vector Concatenate 模块将多个信号合并为具有不同宽度的单个输出信号的推荐方法。此方法与经典和简化初始化模式都兼容。

在此示例中,模型 MergeSigUnequaInputlWidth 展示如何将宽度为 1 的多个信号合并为一个宽度为 3 的输出信号。

打开模型。

mdlName = "MergeSigUnequaInputlWidth.slx";
open_system(mdlName)

模型行为

使能子系统根据使用 Pulse Generator 模块生成的脉冲信号执行。来自子系统的信号使用 Merge 和 Vector Concatenate 模块的组合进行合并。子系统 SS1 和 SS2 输出宽度为 1 的信号。信号 v2 和 v3 馈送到 Merge 模块。Merge 模块的输出,连同信号 v1 和 v4,馈送到 Vector Concatenate 模块,以产生宽度为 3 的合并输出信号 vout。

Model using a combination of Merge and Vector Concatenate blocks to partially merge signals.

模型仿真

对模型进行仿真并在 Scope 模块中观察输出。分支 v1 和 v4 保持未合并。信号 v2 和 v3 合并,其值在 2 和 3 之间交替。

out = sim(mdlName);

注意:允许端口宽度不等参数要求模型使用经典初始化模式。从 R2026b 开始,使用经典模式的模型会发出编译时警告。请改用简化模式。要在使用简化模式的模型中合并维度彼此不同或与输出信号不同的输入信号,请使用 Merge 和 Vector Concatenate 模块的组合,如使用 Merge 和 Vector Concatenate 模块合并具有不同输入和输出宽度的信号示例所示。

尽管不推荐使用经典初始化模式,但此示例说明如何使用允许端口宽度不等参数。

当您选择允许端口宽度不等参数时,模块接受具有不同元素数的标量和向量输入。您可以为每个输入信号指定相对于输出信号开始时的偏移量。输出信号的宽度为:$max(w1+o1, w2+o2, ... wn+on)$,其中 $wn$ 是输入信号的宽度,$on$ 是偏移量。Merge 模块的输出宽度为 $max(2+0,2+1)=3$。在此示例中,$v1$ 的偏移量为 0,$v2$ 的偏移量为 1。此示例使用 Classic 选项作为Underspecified initialization detection参数。

Merge 模块将 $v1$ 的元素映射到 $v3$ 的前两个元素,并将 $v2$ 的元素映射到 $v3$ 的最后两个元素。只有 $v3$ 的第二个元素有效合并,如示波器输出中所示。

扩展示例

限制

  • 所有连接到 Merge 模块的信号在功能上都是同一信号。因此,这些信号必须满足一个给定信号最多只能有一个关联信号对象的限制条件。有关详细信息,请参阅 Simulink.Signal。

  • 如果 Merge 模块的输入来自单一发起方,则不会对其执行运行时诊断。例如,单一发起方可以是一个执行连接到 Merge 模块的函数调用子系统的 Stateflow 图。

  • 禁用时,不要将要合并的多个条件执行子系统的输出端口设置为重置。此操作可能导致多个子系统同时更新该模块。尤其是,禁用的子系统通过重置其输出来更新 Merge 模块,而使能子系统通过计算其输出来更新该模块。

    为了防止此行为的发生,对于要合并的每个条件执行子系统,请将 Outport 模块参数禁用时的输出设置为保持。

  • Merge 模块不接受其元素被重新排序或者只有部分元素被选中的输入信号,如下图所示。

    Simulink block diagram including 2 enabled subsystems, each of whose outputs is connected to a Selector block. The outputs of both Selector blocks are connected to a Merge block. One Selector block reorders its input signal before passing it to the Merge block, and the other Selector block selects a subset of its input signal before passing it to the Merge block.

  • 不要将已在条件执行子系统外部进行了合并的输入信号连接到模块。

可使用总线数组作为 Merge 模块的输入信号,但存在以下限制:

  • 允许端口宽度不等 - 清除此参数。

  • 初始条件 - 可为此参数指定:

    • 值 0。在这种情况下,总线数组中的每个信号都使用初始值 0。

    • 结构体数组,为总线数组中的每个信号指定初始条件。

    • 标量结构体,为总线类型定义的每个元素指定初始条件。使用此方法可为数组中的每条总线指定相同的初始条件。

端口

输入

全部展开

第一个输入信号与其他输入信号合并。

数据类型: single | double | half | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus | image

第 n 个输入信号与其他输入信号合并。

数据类型: single | double | half | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus | image

输出

全部展开

由输入信号合并而成的输出信号。

数据类型: single | double | half | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | fixed point | enumerated | bus | image

参数

全部展开

指定要合并的输入信号的数量。该模块为每个输入信号创建一个端口。

编程用法

模块参数:Inputs
类型:字符向量
值:整数
默认值:'2'

指定输出信号的初始值。如果不指定初始输出值,初始输出将取决于初始化模式和驱动模块。

在 Simplified Initialization Mode 中,若未指定初始输出的值(空矩阵 []),模块将使用输出数据类型的默认初始值。有关默认初始值的信息,请参阅初始化信号值。在 Classic Initialization Mode中,若未指定初始输出的值(空矩阵 []),则模块的初始输出等于最近计算的驱动模块的初始输出。由于这些来源的初始化顺序可能不同,因此模型的仿真和代码生成的初始化可能不一致。

编程用法

模块参数:InitialOutput
类型:字符向量
值:标量 | 向量
默认值:'[ ]'

选择此参数可允许模块接受元素数目彼此不同的输入,或接受与输出具有不同元素数目的输入。模块还允许您为每个输入信号指定相对于输出信号开始时的偏移量。输出信号的宽度为

max(w1+o1, w2+o2, ... wn+on)

其中 w1, ... wn 是输入信号的宽度,o1, ... on 是输入信号的偏移量。

如果清除该参数,Merge 模块只接受相同维度的输入,并输出与输入具有相同维度的信号。

注意

除非您的模型对欠定初始化检测配置参数使用经典选项,否则不要选择此参数。

从 R2026b 开始,当您对欠定初始化检测配置参数使用经典选项时,Simulink 会发出编译时警告。请改用简化选项。在这种建模方案中,要合并维度彼此不同或与输出不同的输入,请使用 Merge 和 Vector Concatenate 模块的组合。有关详细信息,请参阅使用 Merge 和 Vector Concatenate 模块合并具有不同输入和输出宽度的信号。

A combination of Merge block and Vector Concatenate blocks is used when the input signal width is different from the output signal width.

编程用法

模块参数:AllowUnequalInputPortWidths
类型:字符向量
值:'off' | 'on'
默认值:'off'

输入向量以指定每个输入信号相对于输出信号开始时的偏移量。

依赖关系

要启用此参数,请选择允许端口宽度不等。

编程用法

模块参数:InputPortOffsets
类型:字符向量
值:标量 | 向量
默认值:'[ ]'

模块特性

数据类型

Boolean | bus | double | enumerated | fixed point | half | image | integer | single | string

直接馈通

是

多维信号

是

可变大小信号

否

过零检测

否

扩展功能

全部展开

定点转换
使用 Fixed-Point Designer™ 设计和仿真定点系统。

版本历史记录

在 R2006a 之前推出

全部展开