如果您通过复制和粘贴块和子系统来重复图表中的算法,那么维护模型就会变得很困难。单独的信号线和子系统会使图表拥挤不堪,降低了可读性,并使简单的更改变得困难。同时,许多变量会使工作区拥挤,降低模型的可移植性。随着时间的推移,当您添加到设计中时,模型可能会产生这些效率问题。
要重复一个算法,可以在分组到数组和结构中的信号、子系统和参数上迭代该算法。这个例子展示了如何将一个低效的复杂重复算法转换成更容易管理的紧凑形式。
打开示例模型ex_repeat_algorithm
.该模型在基本工作区中创建了大约30个变量。
检查子系统Burner_1_Analysis。这个子系统通过在块中使用基本工作区变量作为参数来执行算法,例如常数和离散时间积分器.
检查Burner_2_Analysis和Burner_3_Analysis子系统。所有三个子系统执行相同的算法,但使用不同的工作空间变量来参数化块。
检查三个Analysis_Delay子系统。这些子系统重复一个与Analysis子系统不同的算法。
返回到模型的顶层。的内存块在输入信号进入Analysis_Delay子系统之前延迟输入信号。
看一下数据导入/导出对话框中的。该模型使用了变量SensorsInput
和t
作为模拟输入。
在仿真过程中,矩阵变量中的九列中的每一列SensorsInput
对象的输入数据轮廓尺寸块在模型的顶层。
您可以使用总线将相关信号分组为单个结构化信号,减少线密度并提高模型的可读性。
示例模型中的每个子系统都需要三个信号输入。你可以把每一组三种信号组合成一条总线。
您可以修改示例模型中的所有子系统以使用总线。但是,因为有些子系统是相同的,所以您可以删除它们,然后用为每个子系统块。
打开总线编辑器。
buseditor
创建总线类型SensorData
有三个信号元素:sensor1
,sensor2
,sensor3
.
删除图中所示的块,只留下Burner_1_Sensor1和Burner_1_Delay1块作为剩余两个子系统的输入。
在信号的属性“Burner_1_Sensor1”页签轮廓尺寸块对话框,设置数据类型来总线:SensorData
.
块的输出是包含三个信号元素的总线信号sensor1
,sensor2
,sensor3
.
打开子系统Burner_1_Analysis。删除三个信号输出行轮廓尺寸块。删除In2和In3轮廓尺寸块。
添加一个总线选择器阻挡在In1的右边轮廓尺寸块。连接轮廓尺寸块输出到总线选择器块。
在总线选择器块对话框,选择信号sensor1
,sensor2
,sensor3
.
的总线选择器块从输入总线提取三个信号元素。模型中的其他块可以使用提取的信号元素。
在子系统中,如图所示连接块。
在子系统Burner_1_Analysis_Delay中,使用a总线选择器块提取总线中的信号。使用与子系统Burner_1_Analysis相同的技术。
一个为每个子系统块对输入信号进行分区,并在每个分区上依次执行算法。例如,如果子系统的输入是6个信号的数组,则可以配置子系统,使其对每一个信号执行相同的算法。
您可以使用为每个子系统以迭代的方式重复一个算法。该方法提高了模型的可读性,易于修改重复算法。
添加两个为每个子系统块到模型。将其中一个子系统命名为Burner_Analysis。将其他子系统命名为Burner_Analysis_Delay。
将子系统burn_1_analysis的内容复制到子系统burn_analysis中。在粘贴块之前,请删除轮廓尺寸和外港块的为每个子系统.
在为每一个在Burner_Analysis子系统中的块对话框中,选择复选框对输入进行分区三机一体
.
将子系统Burner_1_Analysis_Delay的内容复制到子系统Burner_Analysis_Delay。
在为每一个在Burner_Analysis_Delay子系统中的块对话框中,选择复选框来对输入进行分区三机一体
.
在模型的顶层,删除Burner_1_Analysis和Burner_1_Analysis_Delay子系统。连接的新为每个子系统在他们的地方。
在信号的属性“Burner_1_Sensor1”页签轮廓尺寸块对话框,设置港维来3.
.
块输出是一个由三个元素组成的总线数组。的为每个子系统模型中的每一个总线都重复一个算法。
创建一个万博1manbetxSimulink.SimulationData.Dataset
对象,轮廓尺寸块可用于导入仿真数据。您可以使用此代码创建对象并将其存储在变量中SensorsInput
.
首先,创建一个结构数组,其中的字段值为% timeseries对象。为i = 1:3%燃烧器数量%传感器1eval ([“tempInput(1)”num2str(我)”)。sensor1 = '...timeseries (t, SensorsInput (:,num2str(3 *(张)+ 1)”),“])%传感器2eval ([“tempInput(1)”num2str(我)”)。sensor2 = '...timeseries (t, SensorsInput (:,num2str(3 *(张)+ 2)”),“])%传感器3eval ([“tempInput(1)”num2str(我)”)。sensor3 = '...timeseries (t, SensorsInput (:,num2str(3 *(张)+ 3)”),“])结束%创建数据集对象。SensorsInput = 万博1manbetxSimulink.SimulationData.Dataset;SensorsInput = addElement (SensorsInput tempInput,element1的);清晰的tempInputt我
代码首先创建一个变量tempInput
包含三个结构的数组。每个结构有三个字段,对应总线类型中的信号元素SensorData
,每个字段存储一个MATLAB®timeseries
对象。每一个timeseries
对象存储来自变量的九列数据中的一列SensorsInput
,存储每个传感器的模拟输入数据。
然后代码就会覆盖SensorsInput
用一个新的万博1manbetxSimulink.SimulationData.Dataset
对象,并添加tempInput
作为对象的一个元素。
设置输入配置参数SensorsInput
.
自SensorsInput
的形式提供模拟输入数据timeseries
对象,则不需要指定包含时间数据的变量。
创建一个结构数组,初始化其余的结构内存块,并将数组存储在变量中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
.
的内存块输出是一个需要初始化的总线数组。总线阵列中的每个信号元素从结构阵列中相应的字段获得一个初始值。
基本工作空间包含示例模型用于块参数的许多变量。为了减少工作空间变量的数量,可以将它们打包到结构数组中,并使用单个结构字段指定块参数。
一个为每个子系统块可以对指定为掩码参数的值数组进行分区。子系统的每次迭代使用数组的单个分区来指定块参数。如果将参数指定为结构数组,则子系统的每次迭代都可以使用数组中的一个结构。
创建一个结构数组,将Burner_Analysis参数化为每个子系统,并将数组存储在变量中paramsNormal
.使用现有参数变量的值指定结构字段,例如gainNormal_1
,offsetNormal_1
,initDelayed_1
.
为I = 1:3 eval([“paramsNormal(”num2str(我)”)。获得= gainNormal_ 'num2str(我)“;”eval ()) (“paramsNormal(”num2str(我)”)。抵消= offsetNormal_ 'num2str(我)“;”eval ()) (“paramsNormal(”num2str(我)”)。我nit = initNormal_'num2str(我)“;”])结束
该变量包含三个结构的数组,每个结构有三个字段:获得
,抵消
,初始化
.
在模型中,右键单击Burner_Analysis为每个子系统并选择面具>创建面具.
在参数和对话框窗格中的参数,点击编辑.对于新的掩码参数,设置提示来参数结构
和的名字来paramStruct
.点击好吧.
在Burner_Analysis子系统的掩码中,设置参数结构来paramsNormal
.
打开子系统。在为每一个块对话框中参数分区窗格中,选择复选框对参数进行分区paramStruct
.集分区维度来2
.
对于子系统中的块,设置这些参数。
块 | 参数名称 | 参数值 |
---|---|---|
获得 | 获得 | paramStruct.gain |
离散时间积分器 | 初始条件 | paramStruct.init |
常数 | 恒定值 | paramStruct.offset |
创建一个结构数组,将Burner_Analysis_Delay参数化为每个子系统,并将数组存储在变量中paramsForDelay
.
为I = 1:3 eval([“paramsForDelay(”num2str(我)”)。获得= gainDelayed_ 'num2str(我)“;”eval ()) (“paramsForDelay(”num2str(我)”)。抵消= offsetDelayed_ 'num2str(我)“;”eval ()) (“paramsForDelay(”num2str(我)”)。我nit = initDelayed_'num2str(我)“;”])结束
在模型的顶层,右键单击Burner_Analysis_Delay为每个子系统并选择面具>创建面具.
在参数和对话框窗格中的参数,点击编辑.对于新的掩码参数,设置提示来参数结构
和的名字来paramStruct
.点击好吧.
在面具里为每个子系统块,设置参数结构来paramsForDelay
.
打开子系统。在为每一个块对话框中参数分区窗格中,选择复选框对参数进行分区paramStruct
.集分区维度来2
.
对于子系统中的块,设置这些参数。
块 | 参数名称 | 参数值 |
---|---|---|
获得 | 获得 | paramStruct.gain |
离散时间积分器 | 初始条件 | paramStruct.init |
常数 | 恒定值 | paramStruct.offset |
从基本工作区中清除不必要的变量。
%清除你替换的旧参数变量%带有结构数组清晰的正则表达式_%清除迭代变量清晰的我
模型在基本工作空间中需要很少的变量。
要查看新的信号和子系统组织,请更新图表。
模型输入是一个由三个总线信号组成的数组。该模型使用了两个为每个子系统对输入数组中的三个总线信号中的每一个执行这两个算法。
在基本工作空间中,结构数组替换了模型使用的许多变量。从数学上讲,修改后的模型的行为与开始时一样,因为结构数组包含所有旧变量的值。
要查看已完成的模型,请打开示例模型ex_repeat_algorithm_complete
.
您可以在For Each子系统中记录非总线信号。但是,不能对for Each子系统中的总线或总线信号数组使用信号日志记录。使用一个总线选择器块以选择要记录或添加的总线元素信号外港在子系统外阻塞,然后记录那个信号。有关详细信息,请参见为每个子系统记录信号.