对输入信号或掩码参数的单个元素或子数组应用算法
金宝appSimulink / Ports &子系统
HDL编码器/端口和子系统
的为每个子系统块是一个子系统块,预先配置为创建子系统的起点,该子系统在输入信号或掩码参数阵列的每个元素或子阵列的模拟时间步长期间重复执行。
子系统中的块集合表示应用于原始信号或掩码参数阵列的单个元素或子阵列的算法。在子系统中,每个具有状态的块为它处理的每个元素或子数组维护独立的状态集。因此,这个子系统的操作在行为上类似于为原始输入信号或掩码参数数组中的每个元素复制该子系统的内容,然后使用该子系统的各自副本处理每个元素。当子系统中的块集处理元素或子数组时,子系统将结果连接起来形成输出信号。
的为每个子系统块包含一个为每一个块,它作为子系统的控制块。指定的参数为每一个块配置将子系统输入或掩码参数分解为元素或子数组,并配置将单个结果串联为输出信号。块的参数分区维度和分区宽度分别指定分割输入信号或掩码参数阵列的尺寸和每个分割的宽度。要对行向量进行分区,请指定分区维度作为2
.要对列向量进行分区,请指定分区维度作为1
.使用的参数分区抵消指定分区之间的间隙或重叠。指定一个的迭代次数将处理限制在数据的一个子集内。要了解关于块参数的更多信息,请参见为每一个.
要指定在for each子系统中为每个迭代划分哪些输入信号,请使用输入分区选项卡中的为每一个块。当指定要分割的信号时,请指定分区维度,分区宽度,分区抵消参数。
可以对掩码参数进行分区为每个子系统块。对于每个迭代中具有相同结构但参数值不同的系统,分区是有用的。在这种情况下,将模型改为为每个参数划分额外的输入信号是很麻烦的。相反,在For Each子系统中添加一个掩码参数。有关更多信息,请参见创建一个简单的蒙版.要选择分区掩码参数,请使用参数分区选项卡的为每一个块对话框。有关更多信息,请参见选择分区参数,下面。
属性定义连接结果的维度连接尺寸在输出连接选项卡。
块为每个子数组生成的结果沿着连接维度堆叠。默认情况下,维度1 (y-axis),这意味着结果是垂直堆叠的。但是,如果指定连接维数为2,则结果沿水平方向连接(x设在)。因此,如果该过程生成行向量,则连接的结果在第一种情况下是一个矩阵,在第二种情况下是一个行向量。
在为分区选择输入信号或子系统掩码参数时,必须指定如何将其分解为每个迭代的元素或子数组。的设置整数值分区维度,分区宽度,分区抵消参数。
作为说明,考虑输入信号矩阵一个
的形式:
标签d1和d2分别定义维度1和2。如果保持默认设置1
为分区尺寸和分区宽度0
为分区偏移量,然后是Simulink金宝app®垂直于分区尺寸1的切片,宽度等于分区宽度,即一个元素:
矩阵A分解为这三个行向量:
如果您指定2
作为分区尺寸,Simulink将垂直于2维的部分进行切片,形成三个列向量金宝app:
除了设置分区维度来2
,如果你设置分区宽度来2
和分区抵消来-1
, 金宝appSimulink使用两个重叠的3乘2分区进行处理。
举个例子分区抵消参数,打开模型slexForEachOverlapExample
.
默认情况下,处理输入信号或掩码参数的所有分区。若要处理分区的一个子集,请输入要处理的分区数目作为的迭代次数.在上面的矩阵例子中,如果分区抵消被设置为0
(默认)的迭代次数被设置为2
,只输入矩阵的前两行或前两列一个
处理。
请注意
在Simulink中只有信号被认为是一维的。金宝app掩模参数根据其方向是行或列向量。要对行向量进行分区,请沿列指定分区维数为2。要对列向量进行分区,请沿行指定分区维数为1。
对于某些模型,为每个子系统块改进代码的重用金宝app仿真软件编码器™生成的代码。考虑一个包含两个可重用的模型原子子系统对信号的每个元素应用相同标量算法的块。如果这些子系统的输入信号维数不同,金宝app仿真软件编码器生成的代码包括两个不同的函数。可以用两个相同的子系统替换这两个子系统为每个子系统块,配置为使用相同算法处理各自输入的每个元素。在这种情况下,金宝app仿真软件编码器生成的代码由输入信号元素的数量参数化的单个函数组成。方法的每个唯一实例调用该函数两次为每个子系统块在模型中。对于每一种情况,输入信号元素有不同的值。
当您在快速加速模式下模拟模型时,Simulink使用多核执行来更快地模拟for Each子系统。金宝app金宝appSimulink自动分析每个符合条件的子系统在快速加速模式下运行的前两个时间步骤,以比较并行和串行执行时间。金宝app然后,Simulink将For Each子系统指定为在模拟运行的后续时间步骤中并行、多核执行的子系统,如果这样做会加快执行时间的话。对于嵌套的For Each子系统,多核执行仅适用于顶层子系统。多核执行不适用于包含连续状态或函数调用者块。
要抑制给定for Each子系统的多核执行,请设置MultithreadedSim
参数的为每一个在子系统内阻塞“关闭”
.
set_param (ForEachBlockName、“MultithreadedSim”、“了”)
注意,这是为每一个块在子系统中,而不是为每个子系统块本身。要抑制模型中所有for Each子系统的多核执行,请设置MultithreadedSim
模型的参数“关闭”
.
set_param (ModelName、“MultithreadedSim”、“了”)
若要重新启用多核执行,请设置相关的MultithreadedSim
参数设置为其默认值“汽车”
.
例如,请参见为每个子系统使用多线程模拟.
请注意
如果以快速加速模式模拟模型或从模型生成代码,并且在For Each子系统中分区掩码参数,那么在For Each子系统中引用分区参数的任何表达式都必须是可调表达式。看到可调表达的局限性(金宝app仿真软件编码器).
的为每个子系统块同时支持C金宝app-MEX s -函数和Level-2 MATLAB®s -函数,前提是s -函数支持使用以下技术之一的多个执行实例:金宝app
C-MEX的s -函数必须声明ss金宝appSupportsMultipleExecInstances(年代,真的)
在mdlSetWorkWidths
方法。
一个二级MATLAB s函数必须声明块。金宝appSupportsMultipleExecInstances = true
在setup方法中。
如果您使用这些规格:
不要使用全局变量或持久变量或在s函数的用户数据中缓存运行时数据,如DWork和Block I/O。
在一个为每个子系统块,每个s函数的执行方法从mdlStart
到mdlTerminate
为s函数处理的每个元素调用一次。因此,您必须确保在重复调用时不要释放相同的内存mdlTerminate
.例如,考虑一个C-MEX s -函数,它为内部的运行时参数分配内存mdlSetWorkWidths
.内存只需要释放一次mdlTerminate
.作为一个解决方案,在第一次调用之后将指针设置为空mdlTerminate
.
查阅有关限制的资料为每个子系统块,看每个子系统的限制.