对输入信号或掩码参数的每个元素或子数组重复执行并连接结果的子系统
万博1manbetxSimulink / Ports&Subsystems
HDL编码器/端口和子系统
的对于每个子系统块是一个子系统块,预先配置为创建子系统的起点,该子系统在输入信号或掩码参数阵列的每个元素或子阵列的模拟时间步长期间重复执行。
子系统中的块集合表示应用于原始信号或掩码参数阵列的单个元素或子阵列的算法。的为每一个块允许您将子系统输入或掩码参数配置为元素或子数组,并将单个结果配置为输出信号。块的参数分区维度和分区宽度分别指定分割输入信号或掩码参数阵列的尺寸和每个分割的宽度。要对行向量进行分区,请指定分区维度作为2
.要分区列向量,请指定分区维度作为1
.使用的参数分区抵消指定分区之间的间隙或重叠。指定一个迭代次数将处理限制为数据的子集。要了解块参数的更多信息,请参阅为每一个.
在这个子系统中,每个有状态的块为它处理的每个元素或子数组维护独立的状态集。因此,这个子系统的操作在行为上类似于为原始输入信号或掩码参数数组中的每个元素复制该子系统的内容,然后使用该子系统的各自副本处理每个元素。
对于某些模型,对于每个子系统块也提高了代码的重用万博1manbetx®编码器™生成的代码。考虑一个包含两个可重用的模型原子子系统对信号的每个元素应用相同标量算法的块。如果这些子系统的输入信号维数不同,万博1manbetx仿真软件编码器生成的代码包括两个不同的函数。您可以用两个相同替换这两个子系统对于每个子系统块,配置为使用相同算法处理各自输入的每个元素。在这种情况下,万博1manbetx仿真软件编码器生成的代码由输入信号元素的数量参数化的单个函数组成。此函数被调用两次,一次为每个唯一的实例对于每个子系统块在模型中。对于每一种情况,输入信号元素有不同的值。
当您在Rapid Accelerator模式下模拟模型时,Simulink使用多核执行来更快地模拟for Eac万博1manbetxh子系统。万博1manbetxSimulink自动分析每个符合条件的For each子系统在Rapid Accelerator模式下运行的前两个时间步骤,以比较并行和串行执行时间。万博1manbetx然后,Simulink将For Each子系统指定为在模拟运行的后续时间步骤中并行、多核执行的子系统,如果这样做会加快执行时间的话。对于嵌套的For Each子系统,多核执行仅适用于顶层子系统。多核执行不适用于包含连续状态或函数来电者块。
要抑制给定for Each子系统的多核执行,请设置MultithreadedSim
参数的为每一个块在子系统(不是对于每个子系统块本身)“关闭”
.
set_param (ForEachBlockName,'multithreadsim','关闭')
要抑制模型中所有for Each子系统的多核执行,请设置模型配置参数MultithreadedSim
来“关闭”
.
set_param (ModelName,'multithreadsim','关闭')
若要重新启用多核执行,请设置相关的MultithreadedSim
参数返回其默认值“汽车”
.
例如,看到为每个子系统使用多线程模拟.
的对于每个子系统块同时支持C万博1manbetx-MEX s -函数和Level-2 MATLAB®s -函数,前提是s -函数支持使用以下技术之一的多个执行实例:万博1manbetx
C-MEX S函数必须声明ss万博1manbetxSupportsMultipleExecInstances(年代,真的)
在mdlSetWorkWidths
方法。
一个二级MATLAB s函数必须声明block.万博1manbetxsupportsmultipleexecinstances = true
在设置方法中。
如果使用上述规格:
不要使用全局变量或持久变量或在s函数的用户数据中缓存运行时数据,如DWork和Block I/O。
在一个对于每个子系统块,每个s函数的执行方法从mdlstart.
到mdlTerminate
为s函数处理的每个元素调用一次。因此,您需要小心,不要在重复调用时释放相同的内存mdlTerminate
.例如,考虑一个C-MEX s -函数,它为内部的运行时参数分配内存mdlSetWorkWidths
.内存只需要释放一次mdlTerminate
.作为一个解决方案,在第一次调用之后将指针设置为空mdlTerminate
.
的对于每个子系统块具有下列限制和变通方法。
限制 | 解决方案 |
---|---|
您无法直接记录总线或一系列总线信号,每个子系统。 |
使用以下方法之一:
|
如果存在以下任一条件,则不能在For Each子系统中的引用模型中记录信号:
|
对于第一个条件,请使用加速器模式。 对于第二种情况,使用普通或快速加速模式。 |
不能在For Each子系统中记录块的状态。 |
保存并恢复模拟状态。 |
您不能使用普通模式来为每个子系统模拟A内的模型块。 |
使用加速器或快速加速器模式。 |
如果它们的输入和输出信号是向量(1-D或2-D行或列向量),则具有相同内容的每个子系统生成可重用代码。对于N-D输入和输出信号,仅当信号被分区的维度是最高维度时,才会生成可重用代码。 |
对信号维数进行置换,将信号的划分维数和连接维数转换为n-D信号的最高非单次维数。 |
的对于每个子系统Block不支持以下特性:万博1manbetx
不能在For Each子系统中包含这些块或s -函数:
数据存储内存,数据存储读取, 或者数据存储写块
的从工作空间块,如果输入是结构与时间
它有一个空的时间场
的到工作空间和到文件数据保存块
去和从跨越子系统边界的块
参考模型,模拟模式设置为Normal
影子港口
ERT S-functions
有关支持每个子系统的块的完整列表,请键入万博1manbetxshowblockdatatypetable
在MATLAB命令行。
你不能使用这些类型的信号:
在系统内部使用外部存储类的信号
子系统输入和输出边界的帧信号
适应信号
在子系统内部创建一个线性化点
传播子系统内的块的雅可比矩阵标志。你可以在MATLAB中用J.Mi.BlockAnalyticFlags.jacobian
,在那里J
是雅可比矩阵的对象。验证的雅可比矩阵的正确性对于每个子系统布洛克:
看看For Each子系统雅可比矩阵的标签。如果它是“not_万博1manbetxsupported”
,则雅可比矩阵是错误的。
把每个块从对于每个子系统计算它的雅可比矩阵。如果任何块是" not_supported 万博1manbetx"或带有警告标记,则For Each子系统雅可比矩阵是不正确的。
您无法执行这些类型的代码生成:
代的一个万博1manbetx仿真软件编码器功能目标
万博1manbetx仿真软件编码器在以下条件下的代码生成:
州流®或者MATLAB函数块驻留在子系统中。
这个块尝试访问子系统外部的全局数据,例如数据存储内存块或万博1manbetxsimulink.signal.
的对象ExportedGlobal
存储类。
PLC代码生成