Main Content

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

For Each Subsystem

对输入信号或封装参数的每个元素或子数组都执行一遍运算,再将运算结果串联起来的子系统

  • 库:
  • Simulink / Ports & Subsystems

    HDL Coder / Ports & Subsystems

  • For Each Subsystem block

说明

For Each Subsystem 模块是一个预先配置的 Subsystem 模块,可以作为一个起点,用于创建在仿真时间步期间对输入信号或封装参数数组的每个元素或子数组都要重复执行的子系统。

子系统中的模块组表示应用于原始信号或封装参数数组的单个元素(或子数组)的算法。通过子系统内的 For Each 模块,您可以配置将子系统输入或封装参数分解为元素(或子数组),以及配置将各个结果串联为输出信号。模块参数 Partition DimensionPartition Width 分别指定对输入信号或封装参数数组进行切片的维度和每个切片的宽度。要对行向量进行分区,请将 Partition Dimension 指定为 2。要对列向量进行分区,请将 Partition Dimension 指定为 1。使用参数 Partition Offset 指定分区之间的间隙或重叠。指定 Number of iterations 以将处理范围限制为部分数据。要了解有关模块参数的更多信息,请参阅 For Each

在此子系统内,具有状态的每个模块维护它所处理的每个元素或子数组的单独状态集。因此,此子系统的操作在行为上类似于复制原始输入信号或封装参数数组中每个元素的子系统的内容,然后使用其各自的子系统副本处理每个元素。

对于某些模型,For Each Subsystem 模块还可提高 Simulink® Coder™ 生成代码的重用。假设有一个模型包含两个可重用的 Atomic Subsystem 模块,且对信号的每个元素应用相同的标量算法。如果这些子系统的输入信号维度不同,Simulink Coder 生成的代码中将包含两个不同的函数。您可以将这两个子系统替换为两个相同的 For Each Subsystem 模块,后两者配置为使用相同的算法处理其各自输入的每个元素。在这种情况下,Simulink Coder 生成的代码会包含一个根据输入信号的元素数进行参数化的函数。此函数被调用两次,即对模型中 For Each Subsystem 模块的每个唯一实例分别调用一次。对于其中每种情况,输入信号元素均具有不同的值。

多核执行支持

在 Rapid Accelerator 模式下仿真模型时,Simulink 使用多核执行来加快 For Each 子系统的仿真速度。Simulink 自动为每个符合条件的 For Each 子系统探查其在 Rapid Accelerator 模式下运行的前两个时间步,以比较并行和串行执行时间。然后,如果在仿真运行的后续时间步中指定 For Each 子系统进行并行多核执行会加快执行速度,则 Simulink 会指定采用这种方式。对于嵌套的 For Each 子系统,多核执行仅适用于顶层子系统。多核执行不适用于包含连续状态或 Function Caller 模块的 For Each 子系统。

要禁止给定 For Each 子系统的多核执行,请将该子系统内 For Each 模块的 MultithreadedSim 参数(而不是 For Each Subsystem 模块本身)设置为 'off'

set_param(ForEachBlockName,'MultithreadedSim','off')

要禁止模型中所有 For Each 子系统的多核执行,请将模型配置参数 MultithreadedSim 设置为 'off'

set_param(ModelName,'MultithreadedSim','off')

要重新启用多核执行,请将相关的 MultithreadedSim 参数设置回其默认值 'auto'

有关示例,请参阅Multithreaded Simulation using For Each Subsystem

S-Function 支持

For Each Subsystem 模块支持 C-MEX S-Function 和 2 级 MATLAB® S-Function,前提是 S-Function 使用以下方法之一支持多个执行实例:

  • C-MEX S-Function 必须在 mdlSetWorkWidths 方法中声明 ssSupportsMultipleExecInstances(S, true)

  • 2 级 MATLAB S-Function 必须在 setup 方法中声明 block.SupportsMultipleExecInstances = true

如果您使用上述规范:

  • 不要使用全局变量或持久变量或在 S-Function 的用户数据内缓存运行时数据,如 DWork 和模块 I/O。

  • For Each Subsystem 模块中,对于 S-Function 处理的每个元素,各调用一次 S-Function 执行方法(从 mdlStart 直到 mdlTerminate)。因此,需要谨慎,对于重复调用 mdlTerminate 的情形不要释放相同的内存。例如,假设某个 C-MEX S-Function 为 mdlSetWorkWidths 内的运行时参数分配内存。仅当在 mdlTerminate 中时,该内存才需要释放一次。作为一种解决方案,请在首次调用 mdlTerminate 后将指针设置为空。

限制

For Each Subsystem 模块具有以下限制和解决办法。

限制解决方法

不能直接在 For Each 子系统中记录总线或总线信号数组。

使用以下方法之一:

  • 使用 Bus Selector 模块选择您要记录的信号,并将这些信号标记为进行信号记录。

  • 将信号连接到 Outport 模块,并在 For Each 子系统外部记录该信号。

如果存在以下任一条件,则不能在位于 For Each 子系统内部的引用模型中记录信号:

  • For Each 子系统位于在 Rapid Accelerator 模式下仿真的模型中。

  • For Each 子系统本身位于处于 Accelerator 模式的 Model 模块所引用的模型中。

对于第一个条件,请使用 Accelerator 模式。

对于第二个条件,请使用 Normal 或 Rapid Accelerator 模式。

不能在 For Each 子系统中记录模块的状态。

保存并还原仿真状态。

不能使用 Normal 模式在 For Each 子系统内仿真 Model 模块。

使用 Accelerator 或 Rapid Accelerator 模式。

如果两个 For Each 子系统具有相同的内容并且其输入和输出信号是向量(一维或二维行或列向量),则会生成可重用代码。对于 n 维输入和输出信号,仅当用于对信号分区的维度是最高维度时,才生成可重用代码。

置换信号维度以将分区维度和串联维度变换为 n 维信号的最高非单一维度。

For Each Subsystem 模块不支持下列功能:

  • 您不能在 For Each 子系统内包含以下模块或 S-Function:

    • Data Store MemoryData Store ReadData Store Write 模块

    • From Workspace 模块(如果输入是包含空时间字段的 Structure with Time

    • To WorkspaceTo File 数据保存模块

    • 跨越子系统边界的 GotoFrom 模块。

    • 仿真模式设置为 Normal 的引用模型

    • 重影输入端口

    • ERT S-Function

    有关支持 For Each 子系统的模块的完整列表,请在 MATLAB 命令行中键入 showblockdatatypetable

  • 您不能使用以下类型的信号:

    • 在系统内具有外部存储类的信号

    • 在子系统的输入和输出边界上的帧信号

    • 可变大小信号

  • 在子系统内创建线性化点

  • 传播子系统内模块的 Jacobian 标志。您可以使用 J.Mi.BlockAnalyticFlags.jacobian 在 MATLAB 中检查此条件,其中 J 是 Jacobian 对象。要验证 For Each Subsystem 模块的 Jacobian 的正确性,请执行以下操作:

    • 查看 For Each 子系统的 Jacobian 的标记。如果它是 “not_supported”,则 Jacobian 不正确。

    • 将每个模块移出 For Each Subsystem 并计算其 Jacobian。如果有任何模块是“not_supported”或具有警告标记,则 For Each 子系统 Jacobian 不正确。

  • 您不能执行以下类型的代码生成:

    • 生成 Simulink Coder S-Function 目标

    • 在同时满足以下两个条件下进行的 Simulink Coder 代码生成:

      • 子系统内的 Stateflow®MATLAB Function 模块。

      • 此模块会尝试访问子系统之外的全局数据,例如 Data Store Memory 模块或 “ExportedGlobal” 存储类的 Simulink.Signal 对象。

    • PLC 代码生成

端口

输入

全部展开

子系统模块的信号输入,指定为标量、向量或矩阵。在 Subsystem 模块中放置一个 Inport 模块会为该模块添加一个外部输入端口。端口标签与 Inport 模块的名称相匹配。

使用 Inport 模块可以从局部环境中接收信号。

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

输出

全部展开

子系统模块的信号输出,以标量、向量或矩阵形式返回。在 Subsystem 模块中放置一个 Outport 模块会为该模块添加一个外部输出端口。端口标签与 Outport 模块的名称相匹配。

使用 Outport 模块可以向局部环境发送信号。

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

模型示例

模块特性

数据类型

Boolean[a] | bus[a] | double[a] | enumerated[a] | fixed point[a] | half[a] | integer[a] | single[a]

直接馈通

多维信号

有限[a]

可变大小信号

过零检测

[a] 实际支持的数据类型或功能取决于模块实施。

扩展功能

在 R2010a 中推出