Main Content

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

Multiport Switch

基于控制信号选择输出信号

  • 库:
  • Simulink / Signal Routing

    HDL Coder / Signal Routing

  • Multiport Switch block

说明

Multiport Switch 模块用于确定将多个模块输入中的哪一个传递给输出。此模块根据第一个输入的值来确定选择哪个输入。第一个输入是控制输入,其余输入是数据输入。控制输入的值确定将哪个数据输入传递给输出。

下表概述了此模块如何解释控制输入,以及如何确定传递给输出的数据输入。

控制输入截断数据端口顺序的设置仿真过程中的模块行为
选择数据输入的索引方式超出范围的情况

整数值

None

Zero-based contiguous

从零开始进行索引

控制输入小于 0 或大于数据输入数减 1。

One-based contiguous

从一开始进行索引

控制输入小于 1 或大于数据输入数。

Specify indices

按用户指定进行索引

控制输入与任何指定的数据端口索引均不对应。

非整数值

模块通过向零舍入将值截断为整数。

Zero-based contiguous

从零开始进行索引

截断的控制输入小于 0 或大于数据输入数减 1。

One-based contiguous

从一开始进行索引

截断的控制输入小于 1 或大于数据输入数。

Specify indices

按用户指定进行索引

截断的控制输入与任何指定的数据端口索引均不对应。

有关此模块如何处理超出范围的情况的信息,请参阅模块如何处理超出范围的控制输入

配置为 Index Vector 模块的 Multiport Switch

Index Vector 是特殊配置的 Multiport Switch 模块,需要指定一个数据输入,控制输入从 0 开始。模块输出是其索引与控制输入匹配的输入向量的元素。例如,如果输入向量为 [18 15 17 10],控制输入为 3,则与索引 3(从 0 开始)匹配的元素为 10,它将成为输出值。

要将 Multiport Switch 模块配置为 Index Vector 模块,请将 Number of data ports 设置为 “1” 且 Data port order 设置为 “Zero-based contiguous”。

模块如何处理超出范围的控制输入

对于整数值小于 intmax(‘int32’) 的输入,当此值与任何数据端口索引均不匹配时,即说明输入超出了范围。对于非整数值控制输入,当截断的值与任何数据端口索引均不匹配时,即说明输入超出了范围。在这两种情况下,模块行为均取决于 Data port for default caseDiagnostic for default case 的设置。

注意

如果控制输入大于 intmax(‘int32’),模块会将输入值绕回为整数。

仿真行为

以下行为仅适用于模型仿真。

Data Port for Default CaseDiagnostic for Default Case
NoneWarningError

Last data port

使用最后一个数据端口,不报告任何警告或错误。

使用最后一个数据端口并报告警告消息。

报告错误并停止仿真。

Additional data port

使用带有 * 标签的其他数据端口,不报告任何警告或错误。

使用带有 * 标签的其他数据端口并报告警告消息。

报告错误并停止仿真。

代码生成行为

以下行为适用于模型的代码生成。

Data Port for Default CaseDiagnostic for Default Case
NoneWarningError

Last data port

使用最后一个数据端口。

使用最后一个数据端口。

使用最后一个数据端口。

Additional data port

使用带有 * 标签的其他数据端口。

使用带有 * 标签的其他数据端口。

使用带有 * 标签的其他数据端口。

使用具有不同维度的数据输入

如果两个信号具有不同数量的维度或不同的维度长度,您可以将这两个信号用作 Multiport Switch 模块的数据输入。在模块对话框中,选择参数 Allow different data input sizes。在此例中,模块的输出是大小可变信号。如果您不选择此参数,模块将生成错误。

有关该参数的详细信息,请参阅Allow different data input sizes (Results in variable-size output signal), Allow different data input sizes (Results in variable-size output signal)Allow different data input sizes (Results in variable-size output signal)Allow different data input sizes (Results in variable-size output signal)。有关大小可变信号的详细信息,请参阅可变大小信号基础知识

确定模块行为的规则

您可以使用 Number of data ports 指定数据输入的数目。

  • 如果将 Number of data ports 设置为 1,则模块相当于一个 Index SelectorIndex Vector,而不是一个 Multiport Switch 模块。有关详细信息,请参阅配置为 Index Vector 模块的 Multiport Switch

  • 如果将 Number of data ports 设置为大于 1 的整数,模块则相当于一个 Multiport Switch 模块。模块输出是与控制输入值对应的数据输入。如果数据输入中至少有一个是向量,模块输出即为向量。在这种情况下,模块会将任何标量输入都扩展为向量。

  • 如果所有数据输入都为标量,则输出为标量。

枚举控制端口的参数设置原则

Multiport Switch 模块上的控制端口为枚举类型时,请遵循以下原则:

情况操作原理说明

枚举类型包含的值代表无效、超出范围或未初始化的值。

  • Data port order 设置为 “Specify indices”。

  • Data port indices 设置为针对最后一个数据端口使用此值。

  • Data port for default case 设置为 “Last data port”。

此模块配置用于处理枚举类型显式表示的无效值。

枚举类型仅包含有效的枚举值。但是,数据输入端口可以获得无效的枚举类型值。

  • Data port for default case 设置为 “Additional data port”。

此模块配置用于处理枚举类型未显式表示的无效值。

枚举类型仅包含有效的枚举值。数据输入端口永远不会获得无效的枚举类型值。

  • Data port for default case 设置为 “Last data port”。

  • Diagnostic for default case 设置为 “None”。

此模块配置可避免不必要的诊断操作。

模块没有为枚举类型的每个值提供一个数据输入端口。

  • Data port for default case 设置为 “Additional data port”。

此模块配置用于处理没有数据输入端口的枚举值和无效值。

限制

  • 如果 Multiport Switch 模块的数据输入是总线,两个总线的元素名称必须相同。使用相同的元素名称可以确保输出总线具有相同的元素名称,而不管模块选择了哪些输入总线。要确保您的模型满足此要求,请使用总线对象定义总线并将 Element name mismatch 诊断设置为 “error”。有关详细信息,请参阅连接诊断概述

端口

输入

全部展开

控制信号可以是 Simulink® 支持的任何数据类型,包括定点和枚举类型。当控制输入不是整数值时,模块通过向零舍入将值截断为整数。

有关枚举类型的控制信号的信息,请参阅枚举控制端口的参数设置原则

有关此模块如何处理超出范围的情况的信息,请参阅模块如何处理超出范围的控制输入

限制

  • 如果控制信号为数值,则控制信号不能为复数。

  • 如果控制信号为枚举信号,模块将使用基础整数值来选择数据端口。

  • 如果基础整数没有对应的数据端口,将出现错误。

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

第一个数据输入,指定为标量、向量、矩阵或 N 维数组。所有数据信号可以是 Simulink 支持的任何数据类型。

  • 如果所有数据输入都为标量,则输出为标量

  • 如果数据输入中至少有一个是向量,模块输出即为向量。在这种情况下,模块会将任何标量输入都扩展为向量。

  • 如果任何两个非标量信号具有不同维度数量或不同维度长度,请选中 Allow different data input sizes 复选框。有关详细信息,请参阅使用具有不同维度的数据输入

  • 如果有任何数据信号为枚举类型,则所有其他信号也必须为相同的枚举类型。

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

第二个数据输入,指定为标量、向量、矩阵或 N 维数组。所有数据信号可以是 Simulink 支持的任何数据类型。

  • 如果所有数据输入都为标量,则输出为标量

  • 如果数据输入中至少有一个是向量,模块输出即为向量。在这种情况下,模块会将任何标量输入都扩展为向量。

  • 如果任何两个非标量信号具有不同维度数量或不同维度长度,请选中 Allow different data input sizes 复选框。有关详细信息,请参阅使用具有不同维度的数据输入

  • 如果有任何数据信号为枚举类型,则所有其他信号也必须为相同的枚举类型。

依存关系

要启用此端口,请将 Number of data ports 设置为大于 1 的整数。

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

第 N 个数据输入,指定为标量、向量、矩阵或 N 维数组。所有数据信号可以是 Simulink 支持的任何数据类型。

  • 如果所有数据输入都为标量,则输出为标量

  • 如果数据输入中至少有一个是向量,模块输出即为向量。在这种情况下,模块会将任何标量输入都扩展为向量。

  • 如果任何两个非标量信号具有不同维度数量或不同维度长度,请选中 Allow different data input sizes 复选框。有关详细信息,请参阅使用具有不同维度的数据输入

  • 如果有任何数据信号为枚举类型,则所有其他信号也必须为相同的枚举类型。

依存关系

要启用第 N 个输入端口,请将 Number of data ports 设置为大于或等于 N 的整数值。

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

用于超出范围的控制信号输入的输入数据端口,指定为标量、向量、矩阵或 N 维数组。所有数据信号可以是 Simulink 支持的任何数据类型。如果有任何数据信号为枚举类型,则所有其他信号也必须为相同的枚举类型。如果任何两个信号具有不同维度数量或不同维度长度,请选中 Allow different data input sizes 复选框。有关详细信息,请参阅使用具有不同维度的数据输入

依存关系

要为超出范围的控制信号输入创建一个附加数据端口,请将 Data port for default case 设置为 “Additional data port”。如果将 Data port for default case 设置为 “Last data port”,则当控制信号值与任何数据端口索引都不匹配时,模块将使用最后一个数据端口进行输出。

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

输出

全部展开

模块输出根据控制信号值选择的数据输入之一。输出的维度与对应的数据输入相同。当您选中 Allow different data input sizes 复选框时,模块的输出是可变大小信号。

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

参数

全部展开

Main

指定数据输入端口的排序类型。

  • Zero-based contiguous” - 模块使用从 0 开始的索引方式为连续数据端口排序。这是 Index Vector 模块的默认值。

  • One-based contiguous” - 模块使用从 1 开始的索引方式为连续数据端口排序。这是 Multiport Switch 模块的默认值

  • Specify indices” - 模块使用不连续的索引方式为数据端口排序。

提示

  • 当控制端口为枚举类型时,请选择 “Specify indices”。

  • 如果选择 “Zero-based contiguous” 或 “One-based contiguous”,请确认控制端口不是枚举类型。此配置已弃用,如果使用将会生成错误。您可以在模型上运行升级顾问,将此配置中的每个 Multiport Switch 模块替换为显式指定数据端口索引的模块。请参阅模型升级

  • 在仿真或代码生成中,应避免出现模块包含未使用的数据端口的情况。当控制端口为定点或内置数据类型时,请确认所有数据端口索引都可用该类型表示。否则,将发生以下模块行为:

    如果模块具有未使用的数据端口且数据端口顺序为:该模块产生:
    Zero-based contiguous” 或 “One-based contiguous警告
    Specify indices错误

依存关系

选择 “Zero-based contiguous” 或 “One-based contiguous” 将启用 Number of data ports 参数。

选择 “Specify indices” 将启用 Data port indices 参数。

编程用法

模块参数:DataPortOrder
类型:字符向量
值:'Zero-based contiguous' | 'One-based contiguous' | 'Specify indices'
默认值:'One-based contiguous' (Multiport Switch) 'Zero-based contiguous' (Index Vector)

指定模块的数据输入端口数。输入端口的总数是您指定的数量加 1(用于控制信号输入端口);如果您将 Data port for default case 设置为 “Additional data port”,则还要再加 1(用于额外的输入端口)。

依存关系

要启用此参数,请将 Data port order 设置为 “Zero-based contiguous” 或 “One-based contiguous”。

编程用法

模块参数:Inputs
类型:字符向量
值:1 和 65536 之间的整数
默认值:'3' (Multiport Switch) '1' (Index Vector)

为数据端口指定索引数组。模块图标将发生变化以匹配您指定的数据端口索引。

提示

  • 要指定与枚举类型的所有值对应的索引数组,请为此参数输入 enumeration('type_name')。请不要包括花括号。

    例如,enumeration('MyColors') 就是有效的输入。

  • 要输入枚举类型的特定值,请使用 type_name.enumerated_name 格式。请不要输入基础整数值。

    例如,{MyColors.Red, MyColors.Green, MyColors.Blue} 就是有效的输入。

  • 要指示多个值映射到一个数据端口,请使用方括号。

    例如,以下两个输入均有效:

    • {MyColors.Red, MyColors.Green, [MyColors.Blue, MyColors.Yellow]}

    • {[3,5],0,18}

  • 如果控制端口为定点或内置数据类型,Data port indices 的值必须能用该类型表示。否则,编译时将出现错误,提醒您存在未使用的数据端口。

  • 如果控制端口为枚举数据类型,Data port indices 的值必须为该类型的枚举值。

  • 如果 Data port indices 包含枚举类型的值,控制端口必须为该数据类型。

依存关系

要启用此参数,请将 Data port order 设置为 “Specify indices”。

编程用法

模块参数:DataPortIndices
类型:字符向量
值:索引数组
默认值:'{1,2,3}'

指定对于超出范围的输入,是使用最后一个数据端口还是使用其他端口。端口名称旁的星号 (*) 表示控制端口值不匹配任何数据端口索引时模块将使用的端口。

  • Last data port” - 当控制端口值与任何数据端口索引均不匹配时,模块将使用最后一个数据端口进行输出。

  • Additional data port” - 当控制端口值与任何数据端口索引均不匹配时,模块将使用其他数据端口进行输出。

提示

如果将此参数设置为 “Additional data port” 且 Number of data ports 为 “3”,则模块上的输入端口数为 5。第一个输入是控制端口,后面三个输入为数据端口,第五个输入是用于超出范围的输入的默认端口。

编程用法

模块参数:DataPortForDefault
类型:字符向量
值:'Last data port' | 'Additional data port'
默认值:'Last data port'

指定当控制端口值与任何端口索引均不匹配时要采取的诊断操作。

  • None” - 不产生任何响应。

  • Warning” - 显示警告并继续进行仿真。

  • Error” - 终止仿真并显示错误。在这种情况下,Data port for default case 只用于代码生成,而不用于仿真。

有关详细信息,请参阅模块如何处理超出范围的控制输入

编程用法

模块参数:DiagnosticForDefault
类型:字符向量
值:'None' | 'Warning' | 'Error'
默认值:'Error'

将采样时间指定为 -1 以外的值。有关详细信息,请参阅指定采样时间

依存关系

此参数不可见,除非将其显式设置为 -1 以外的值。要了解详细信息,请参阅不建议设置采样时间的模块

编程用法

模块参数:SampleTime
类型:字符向量
值:标量或向量
默认值:'-1'

Signal Attributes

选中此复选框将要求所有数据输入端口具有相同的数据类型。清除此复选框时,模块允许数据端口输入具有不同数据类型。

编程用法

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

Simulink 检查的输出范围的下限值。

Simulink 使用最小值执行下列操作:

注意

Output minimum 不会饱和或剪切实际输出信号。请改用 Saturation 模块。

编程用法

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

Simulink 检查的输出范围的上限值。

Simulink 使用最大值执行下列操作:

注意

Output maximum 不会饱和或剪切实际输出信号。请改用 Saturation 模块。

编程用法

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

为输出选择数据类型。该类型可以继承、直接指定或表示为数据类型对象,如 Simulink.NumericType

当您选择继承的选项时,模块的行为如下所示:

  • Inherit:Inherit via internal rule” - Simulink 在考虑嵌入式目标硬件的属性的同时,会选择相应的数据类型来平衡数值准确性、性能和生成的代码大小。如果更改了嵌入式目标的设置,则依内部规则选择的数据类型可能会发生变化。有时软件不能同时满足优化代码效率和保证数值准确性这两个需求。如果内部规则不能满足您对数值准确性或性能的特定需求,请使用下列选项之一:

    • 显式指定输出数据类型。

    • 显式指定默认数据类型(例如 fixdt(1,32,16)),然后使用定点工具为您的模型提供数据类型建议。有关详细信息,请参阅 fxptdlg (Fixed-Point Designer)

    • 要指定您自己的继承规则,请使用 “Inherit:Inherit via back propagation”,然后使用 Data Type Propagation 模块。有关如何使用此模块的示例说明,请参阅 Signal Attributes 模块库中的 Data Type Propagation Examples 模块。

  • Inherit:Inherit via back propagation” - 使用驱动模块的数据类型。

编程用法

模块参数OutDataTypeStr
类型:字符向量
'Inherit: Inherit via internal rule | 'Inherit: Inherit via back propagation' | 'double' | 'single' | 'half' | 'int8' | 'uint8' | 'int16' | 'uint16' | 'int32' | 'uint32' | 'int64' | 'uint64' | 'fixdt(1,16)' | 'fixdt(1,16,0)' | 'fixdt(1,16,2^0,0)' | 'string' | '<data type expression>'
默认值'Inherit: Inherit via internal rule'

选中此选项将锁定此模块的输出数据类型设置,从而防止通过定点工具和定点顾问进行更改。有关详细信息,请参阅Use Lock Output Data Type Setting (Fixed-Point Designer)

编程用法

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

选择下列舍入模式之一。

Ceiling

将正值和负值朝正无穷大方向舍入。等同于 MATLAB® ceil 函数。

Convergent

将数值舍入到最接近的可表示值。如果出现对等情况,则舍入到最接近的偶数整数。等同于 Fixed-Point Designer™ convergent 函数。

Floor

将正值和负值朝负无穷大方向舍入。等同于 MATLAB floor 函数。

Nearest

将数值舍入到最接近的可表示值。如果出现对等情况,则朝正无穷大的方向舍入。等同于 Fixed-Point Designer nearest 函数。

Round

将数值舍入到最接近的可表示值。如果出现对等情况,则将正数朝正无穷大方向舍入,将负数朝负无穷大方向舍入。等同于 Fixed-Point Designer round 函数。

Simplest

自动选择是向负无穷大方向舍入还是向零舍入,以生成尽可能有效的舍入代码。

Zero

将数值向零舍入。等同于 MATLAB fix 函数。

编程用法

模块参数RndMeth
类型:字符向量
'Ceiling' | 'Convergent' | 'Floor' | 'Nearest' | 'Round' | 'Simplest' | 'Zero'
默认值'Floor'

另请参阅

有关详细信息,请参阅Rounding (Fixed-Point Designer)

指定对溢出是进行饱和处理还是绕回处理。

  • off - 溢出将绕回到数据类型可以表示的合适值。

    例如,数字 130 不适合一个有符号的 8 位整数,因此绕回 -126。

  • on - 将溢出饱和处理为数据类型能够表示的最小值或最大值。

    例如,一个有符号的 8 位整数的溢出可以饱和处理为 -128 或 127。

提示

  • 如果您的模型存在可能的溢出,而您希望在生成的代码中进行显式饱和保护,请考虑选中此复选框。

  • 如果您希望优化生成的代码的效率,请考虑清除此复选框。

    清除此复选框还可以帮助您避免过度地指定信号超出范围时的处理方式。有关详细信息,请参阅信号范围错误故障排除

  • 如果选中此复选框,饱和将应用于模块中的每个内部操作,而不仅仅应用于输出或结果。

  • 一般情况下,代码生成进程可以检测到何时不可能发生溢出。在这种情况下,代码生成器不会生成饱和代码。

编程用法

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

选中此复选框将允许输入信号具有不同大小。

  • On - 允许输入信号具有不同大小,并将输入信号的大小传播给输出信号。在此模式下,模块产生可变大小的输出信号。

  • Off - 要求所有非标量数据输入信号的大小相同。

编程用法

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

模块特性

数据类型

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

直接馈通

多维信号

可变大小信号

过零检测

扩展功能

C/C++ 代码生成
使用 Simulink® Coder™ 生成 C 代码和 C++ 代码。

PLC 代码生成
使用 Simulink® PLC Coder™ 生成结构化文本代码。

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

在 R2006a 之前推出