主要内容

重复一个算法使用for - each子系统

重复一个算法,可以迭代算法在信号分为子系统和参数数组和结构。这个页面给的例子如何复杂低效重复算法转换成一个紧凑的形式更容易管理。

如果你重复算法图复制粘贴块和子系统,维护模型会变得困难。单个信号线路和子系统可以群图,减少可读性和困难做些简单的改变。变量也可以群工作区,减少模型的可移植性。一个模型可以开发这些效率问题添加到设计。

探索模型示例

该模型ex_repeat_algorithm流程和分析包含三个传感器,传感器数据从三个燃烧器使用相同的算法对于每个燃烧器在单独的,相同的子系统。该模型可以简化使用for - each子系统。

  1. 打开示例模型ex_repeat_algorithm。模型底部的工作区中创建大约30个变量。

  2. 检查子系统命名Burner_1_Analysis。这个子系统执行一个算法通过使用基工作区等模块的变量作为参数常数离散时间积分器块。

  3. 检查子系统命名Burner_2_AnalysisBurner_3_Analysis。所有三个子系统执行相同的算法,但使用不同的工作空间变量参数化模块。

  4. 检查三个Analysis_Delay子系统。这些子系统重复一个不同的算法分析子系统。

  5. 回归模型的顶层。的内存块延迟输入信号,然后才能进入Analysis_Delay子系统。

  6. 看一下数据导入/导出面板的配置参数对话框。该模型使用的变量SensorsInputt作为模拟输入。

    在仿真中,每个九列的矩阵变量SensorsInput提供了一个输入数据轮廓尺寸块在顶层的模型。

减少信号与巴士线密度

您可以使用公共汽车集团相关信号到一个结构化的信号,减少线密度和提高模型的可读性。

每个子系统的示例模型需要三个信号输入。你能把每组的三个信号到一个公共汽车。

您可以修改所有示例中的子系统模型使用公交车。然而,由于一些子系统是相同的,你可以删除它们,后来取而代之为每个子系统块。

  1. 打开汽车编辑器。

    buseditor

  2. 创建一个金宝appSimulink.Bus对象的基本工作空间命名SensorData有三个要素:sensor1,sensor2,sensor3

    总线对象命名SensorData总线中的编辑器

  3. 删除块如图。只留下块命名Burner_1_Sensor1Burner_1_Delay1剩下的两个子系统作为输入。

    减少模型包含六个街区:Burner_1_Sensor1 Burner_1_Analysis,着干活,Burner_1_Delay1 Burner_1_Analysis_Delay, Out4。

  4. 信号的属性选项卡的Burner_1_Sensor1轮廓尺寸块对话框中,设置数据类型总线:SensorData

    块的输出是一个总线信号包含三个元素sensor1,sensor2,sensor3

  5. 打开子系统命名Burner_1_Analysis。删除的三个信号输出线轮廓尺寸块。删除轮廓尺寸块命名In2In3

  6. 添加一个总线选择器块的右边轮廓尺寸块命名三机一体。连接轮廓尺寸块输出到总线选择器块。

  7. 总线选择器块对话框,选择信号sensor1,sensor2,sensor3

    总线选择块的参数对话框

    总线选择器块提取三个信号元素从输入总线。其他块模型元素可以使用提取的信号。

  8. 在子系统、连接块如图所示。

    sensor1连接到产品块,sensor2连接块,并sensor3连接到离散时间积分器。

  9. 在子系统命名Burner_1_Analysis_Delay,用一个总线选择器在公共汽车上块提取信号。使用相同的技术中的子系统Burner_1_Analysis

重复一个算法

一个为每个子系统块分区一个输入信号,按顺序执行一个算法在每个分区上。例如,如果输入六个信号的子系统是一个数组,您可以配置子系统执行相同的算法在每六个信号。

您可以使用for - each子系统重复一种算法以迭代方式。这种方法提高了模型的可读性,使它容易改变重复算法。

  1. 添加两个为每个子系统块到模型中。名字的一个子系统Burner_Analysis。名称的其他子系统Burner_Analysis_Delay

  2. 复制的内容子系统命名Burner_1_Analysis到子系统命名Burner_Analysis。你粘贴块之前,删除轮廓尺寸外港for - each子系统模块。

  3. 为每一个块对话框中Burner_Analysis分区子系统,选中该复选框输入三机一体

  4. 复制的内容子系统命名Burner_1_Analysis_Delay到子系统命名Burner_Analysis_Delay

  5. 为每一个块对话框中Burner_Analysis_Delay分区子系统,选中该复选框输入三机一体

  6. 在顶层模型的,删除子系统命名Burner_1_AnalysisBurner_1_Analysis_Delay。连接的新为每个子系统在自己的地方。

  7. 信号的属性选项卡的Burner_1_Sensor1轮廓尺寸块对话框中,设置港维3

    块输出一系列三元素的公交车。for - each子系统模型中重复一个算法为每个数组中的三个巴士。

  8. 创建一个金宝appSimulink.SimulationData.Dataset对象,轮廓尺寸块可以使用进口仿真数据。您可以使用该代码来创建对象并将其存储在变量SensorsInput

    %第一,创建一个数组的结构的字段值% timeseries对象。i = 1:3%燃烧器数量%传感器1eval ([“tempInput (1)”num2str(我)”)。sensor1 = 'timeseries (SensorsInput (:,num2str(3 *(张)+ 1)”),t),“])%传感器2eval ([“tempInput (1)”num2str(我)”)。sensor2 = 'timeseries (SensorsInput (:,num2str(3 *(张)+ 2)”),t),“])%传感器3eval ([“tempInput (1)”num2str(我)”)。sensor3 = 'timeseries (SensorsInput (:,num2str(3 *(张)+ 3)”),t),“])结束%创建数据集对象。SensorsInput = 金宝appSimulink.SimulationData.Dataset;SensorsInput = addElement (SensorsInput tempInput,element1的);清晰的tempInputt

    该代码首先创建一个变量tempInput包含三个数组结构。每个结构都有三个字段,对应于信号总线中的元素类型SensorData,每个字段存储MATLAB®timeseries对象。每一个timeseries对象存储的一个九列的数据变量SensorsInput,存储为每个传感器的仿真输入数据。

    然后代码覆盖SensorsInput用一个新的金宝appSimulink.SimulationData.Dataset对象,并补充说tempInput作为一个元素的对象。

  9. 设置输入配置参数SensorsInput

    SensorsInput提供仿真输入数据的形式timeseries对象,您不需要指定一个变量,其中包含时间数据。

  10. 创建一个数组初始化剩余的结构内存块,并将数组存储在变量中initForDelay。指定字段的结构与现有的值初始化变量,如initDelay_1_sensor1

    i = 1:3%燃烧器数量%传感器1eval ([“initForDelay (”num2str(我)”)。sensor1 = '“initDelay_”num2str(我)“_sensor1;”])%传感器2eval ([“initForDelay (”num2str(我)”)。sensor2 = '“initDelay_”num2str(我)“_sensor2;”])%传感器3eval ([“initForDelay (”num2str(我)”)。sensor3 = '“initDelay_”num2str(我)“_sensor3;”])结束

    查看新变量的内容initForDelay基本的工作区中,双击变量名。三种结构的变量包含一个数组,每个有三个字段:sensor1,sensor2,sensor3

    initForDelay 1 x3结构三个字段

  11. 内存块对话框中,设置初始条件initForDelay

    内存块是一个公共汽车,需要初始化数组输出。每个信号元素数组的公交车获得一个初始值数组中对应字段的结构。

组织参数的数组结构

基本工作空间包含了许多块参数的示例模型使用的变量。减少工作空间变量,包成阵列结构,并使用单个字段指定块参数结构。

一个为每个子系统块分区一个数组的值,你可以指定作为一个面具参数。子系统使用单个分区的每个迭代数组指定块的参数。如果指定的参数作为数组结构,每个迭代的子系统可以使用一个结构数组中。

  1. 创建一个数组的结构参数化为每个子系统块命名Burner_Analysis,并将数组存储在变量中paramsNormal。使用现有的值指定字段的结构参数变量,如gainNormal_1,offsetNormal_1,initDelayed_1

    我= 1:3 eval ((“paramsNormal (”num2str(我)”)。获得= gainNormal_ 'num2str(我)“;”eval ()) (“paramsNormal (”num2str(我)”)。抵消= offsetNormal_ 'num2str(我)“;”eval ()) (“paramsNormal (”num2str(我)”)。我nit = initNormal_'num2str(我)“;”])结束

    三种结构的变量包含一个数组,每个有三个字段:获得,抵消,初始化

  2. 在模型中,右键单击Burner_Analysisfor - each子系统和选择面具>创建面具

  3. 参数和对话框在对话框的窗格中参数,点击编辑。新的面具参数的设置提示参数结构的名字paramStruct。点击好吧

  4. 的面具Burner_Analysis子系统,参数结构paramsNormal

  5. 打开子系统。在为每一个块对话框,参数分区窗格中,选择复选框以分区的参数paramStruct。集分区维度2

  6. 块的子系统,设置这些参数。

    参数名称 参数值
    获得 获得 paramStruct.gain
    离散时间积分器 初始条件 paramStruct.init
    常数 恒定值 paramStruct.offset

  7. 创建一个数组的结构参数化Burner_Analysis_Delayfor - each子系统,并存储的数组变量paramsForDelay

    我= 1:3 eval ((“paramsForDelay (”num2str(我)”)。获得= gainDelayed_ 'num2str(我)“;”eval ()) (“paramsForDelay (”num2str(我)”)。抵消= offsetDelayed_ 'num2str(我)“;”eval ()) (“paramsForDelay (”num2str(我)”)。我nit = initDelayed_'num2str(我)“;”])结束

  8. 在顶层的模型中,右键单击Burner_Analysis_Delayfor - each子系统和选择面具>创建面具

  9. 参数和对话框在对话框的窗格中参数,点击编辑。新的面具参数的设置提示参数结构的名字paramStruct。点击好吧

  10. 的面具为每个子系统块,设置参数结构paramsForDelay

  11. 打开子系统。在为每一个块对话框,参数分区窗格中,选择复选框以分区的参数paramStruct。集分区维度2

  12. 块的子系统,设置这些参数。

    参数名称 参数值
    获得 获得 paramStruct.gain
    离散时间积分器 初始条件 paramStruct.init
    常数 恒定值 paramStruct.offset

  13. 清除不必要的变量从基地工作区。

    %清楚旧的参数变量替换%的数组结构清晰的正则表达式_%明显迭代变量清晰的

    模型需要几个变量的基本工作空间。

检查转换模型

查看新的信号和子系统组织,更新图。

更新ex_repeat_algorithm模型

模型的输入是一组三个巴士。模型使用两个for - each子系统执行的两个算法在每三个巴士在输入数组。

基本工作空间,取代许多变量的数组结构所使用的模型。在数学上,修改后的模型表现相同的那样,当你开始因为结构的阵列包含所有旧变量的值。

提示

你可以登录nonbus信号for - each子系统。然而,您不能使用信号记录公交车或数组的公交车在一个for - each子系统。使用一个总线选择器块选择你想要的总线元素信号日志或添加一个外港块之外的子系统,然后记录信号。有关详细信息,请参见为每个子系统日志信号

附加的例子使用for - each子系统

Vectorize算法使用for - each子系统

这个例子展示了如何简化建模的矢量化算法。使用为每个子系统块简化模型,三个输入信号由三个相同的过滤转移Fcn块。这个示例还展示了如何添加更多的控制过滤器通过改变他们的系数为每个迭代的子系统。

这个模式使用相同的转移Fcn块独立处理每个信号。一个向量连接块连接产生的输出信号。这个重复的过程是图形复杂,难以维护。添加模型的另一个信号也需要大量的返工。

与独立的模型,但相同,处理三个信号。

可以简化该模型代替用单一重复的操作为每个子系统块。

模型迭代处理三个信号。

为每个子系统块包含一个为每一个块的算法和模型代表三个街区它取代的方式转移Fcn块。的为每一个块指定如何输入信号向量分割成单个元素以及如何将处理过的信号形式输出信号向量。每一个块都有状态维护一套单独的状态为每个输入元素在给定的执行步骤处理。

for - each子系统内容

对于这个示例,输入信号选择分区。的分区维度分区宽度参数对每个块都设置为1的输入。

输入分区选项卡的每个块的参数对话框

你可以扩展这种方法添加更多的信号,而不必更改模型显著。这种方法很容易扩展和图形简单。

模型参数变化不改变模型结构。这个例子展示了如何在一个算法模型参数变化。它使用for - each子系统划分模型从前面的示例和为每个输入信号,同时保留创建不同的过滤器模型简单。滤波器系数是美联储的数组为每个子系统作为一个面具参数块标记为分区。在每个迭代中为每个子系统块,一个分区的滤波器系数数组是美联储转移Fcn块。

  1. 打开模型ex_ForEachSubsystem_Partitioning

  2. 创建一个面具为每个子系统块,并添加一个可编辑的面具参数。将名称设置为FilterCoeffs和提示滤波器系数矩阵。如何添加一个面具参数的信息,明白了创建一个简单的面膜

    掩码编辑器对话框

  3. 打开为每个子系统块。子系统内部,打开为每一个块对话框。

  4. 参数分区选项卡上,选择旁边的复选框FilterCoeffs参数来启用分区的参数。保持分区宽度分区维度参数的默认值1。

    参数分区选项卡的每个块的参数对话框

  5. 双击为每个子系统块和输入滤波器系数矩阵,有一行对每个输入信号滤波器系数。例如,输入[0.0284 0.2370 0.4692 0.2370 0.0284;-0.0651 0 0 0.8698 -0.0651;0.0284 -0.2370 0.4692 -0.2370 - 0.0284)为每个输入信号来实现不同的四阶滤波器。

  6. 为每个子系统块,双击转移Fcn块并输入FilterCoeffs分母系数参数。这个设置使块系数参数从面罩。

为每个子系统块片宽度1的输入参数为水平分区,相当于一行的系数。系数的参数开始作为一个单独的数组。

参数的系数作为单一的数组

它将从一个数组转换成三排的参数。

参数的系数作为参数的三行

提高代码重用使用for - each子系统。这个例子展示了如何提高代码重用当你有两个或两个以上相同的为每个子系统块。考虑这个模型,rtwdemo_foreachreuse

rtwdemo_foreachreuse模型

三个子系统的目的是-向量魔法石,第1章,SS2向量,向量SS3——应用相同的处理每个标量元素各自的矢量信号的输入。因为这三个子系统执行相同的处理,他们是可取的产生一个共享输出(和更新)函数为所有三个子系统为该模型生成的代码。例如,向量SS3子系统包含这些块。

向量SS3子系统内容

生成一个共享函数的三个子系统,分区的配置他们执行输入信号必须相同。为向量魔法石,第1章向量SS3,这个配置是非常简单的,因为你可以设置分区尺寸和宽度为1。然而,为了SS2向量沿着维度也分区其输入信号1,你必须插入一个数学函数块1-by-8行向量转置到一个8-by-1列向量。然后您可以转换子系统的输出回1-by-8使用第二个行向量数学函数块设置为转置操作符。

如果您按Ctrl + B来生成代码,生成的代码使用一个单一的输出函数。这个函数是由三个共享为每个子系统块实例。

/ * *输出迭代器系统和更新:* < Root > /向量魔法石,第1章”*“SS2 < Root > /矢量”*“< Root > /向量SS3”* /空白VectorProcessing (int32_T NumIters, const real_T rtu_In1 [], real_T rty_Out1 [], rtDW_VectorProcessing * localDW)

有一个输入参数的函数NumIters表明每个独立的标量的数量为每个子系统块的过程。三次调用这个函数的参数NumIters分别设置为10,8日和7。

剩下的两个子系统在这个模型展示了可重用的代码也可以生成的矩阵信号加工使用为每个子系统块。再一次,按Ctrl + B生成的代码提供了一个函数的代码重用。

for - each子系统的局限性

为每个子系统块有这些限制和工作区。

限制 解决方案

你不能登录公共汽车或巴士直接for - each子系统的数组。

使用这些方法之一:

  • 使用一个总线选择器块来选择你想要的信号为信号记录日志和马克这些信号。

  • 附加的信号外港块和日志for - each外的信号子系统。

你不能登录一个信号在一个参考模型,该模型是在一个for - each子系统如果这些条件存在:

  • for - each子系统是在快速加速器模型模拟模式。

  • for - each子系统本身是在一个引用的模型模型在加速器模式。

对于第一个条件,使用加速器模式。

对于第二个条件,使用正常或快速加速模式。

你不能登录的状态块for - each子系统。

保存和恢复仿真状态。

你不能用正常模式来模拟模型块内for - each子系统。

使用加速器或快速加速模式。

可重用代码生成与相同的内容,如果他们两个for - each子系统的输入和输出信号向量(一维或二维的行或列向量)。一天输入和输出信号,生成可重用的代码只有在信号的维度以及分区是最高的维度。

交换信号维度转换分区维度和串联维度一天的最高nonsingleton维度信号。

为每个子系统块不支持这些特性:金宝app

  • 你不能包括这些块或S-functions for - each内部子系统:

    • 数据存储内存,数据存储读取,或数据存储写

    • 从工作空间如果输入数据块使用结构随着时间的推移格式和一个空的时间字段

    • 到文件

    • 转到跨子系统的块边界

    • 参考模型与模拟模式设置为正常

    • 影子港口

    • ERT S-functions

    块的完整列表,支持For - each子系统,回车金宝appshowblockdatatypetable在MATLAB命令窗口。

  • 你不能使用这些类型的信号:

    • 信号系统内部与外部存储类

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

    • 适应信号的多个维度

  • 创建一个线性化点内的子系统

  • 传播的雅可比矩阵标记块内的子系统。你可以检查这个条件在MATLAB中使用J.Mi.BlockAnalyticFlags.jacobian,在那里J是雅可比矩阵对象。验证正确性的雅可比矩阵为每个子系统布洛克:

    • 看看标签for - each子系统的雅可比矩阵。如果它是“not_金宝appsupported”雅可比矩阵,那么是不正确的。

    • 将每一块for - each子系统及其雅可比矩阵计算。如果有块“not_金宝appsupported”或者有一个警告标签,for - each子系统雅可比矩阵是不正确的。

  • 你不能执行这些类型的代码生成:

    • 代的一个金宝app®编码器™功能目标

    • 金宝app仿真软件编码器代码生成这两个条件下:

      • 一个Stateflow®MATLAB函数块驻留在子系统。

      • 这个街区试图访问全局数据以外的子系统,如数据存储内存块或金宝appSimulink.Signal的对象ExportedGlobal存储类。

    • PLC的代码生成

  • 在某些情况下,一个模型使用for - each子系统可能需要更长的时间来模拟将以正常模式比如果模型实现了使用独立的子系统。

另请参阅

对象

相关的话题