Simulink环境基础知识(⼆⼗⼋)--通过创建变量来共享和重
⽤模块参数值
⽬录
通过创建变量来共享和重⽤模块参数值
要设置模块参数值,例如 Gain 模块的 Gain 参数,可以使⽤创建的且存储在⼯作区(例如基础⼯作区、模型⼯作区)或
Simulink® 数据字典中的数值变量。可以使⽤该变量设置多个模块中的多个参数值,包括不同模型中的模块。要更改这些模块参数的值,只需更改⼯作区中该变量的值。
使⽤变量设置模块参数值还使您能够:
更改参数值⽽⽆需修改模型⽂件(如果将变量存储在模型⼯作区外)。
在扫描或调优参数值时通过有意义的具体名称来识别参数。
在多个模块和模型中重⽤参数值
可以在⼯作区(例如基础⼯作区)或数据字典中创建⼀个 MATLAB® 数值变量,并使⽤它来指定⼀个或多个模块参数值。
如果模块参数值设置为简单的数值表达式,您可以在 Model Data Editor(在 Modeling 选项卡上,点击 Model Data Editor)中为该表达式创建⼀个变量。点击对应于该值的单元格右侧的 ,然后选择Create variable。在 Create New Data 对话框中,设置新变量的名称和位置,然后点击Create。单元格现在显⽰新变量。
也可以创建⼀个变量来表⽰在多个表达式中使⽤的⼀个常量。⽰例模型sldemo_fuelsys代表⼀台汽油发动机的供油系统。该模型中的⼦系统feedforward_fuel_rate使⽤常量数字14.6来计算发动机的燃油需求,此数字代表发动机消耗的理想的(化学当量)空燃⽐。该⼦系统中有两个模块使⽤此数字来设置参数的值。在此⽰例中,要在这两个模块之间共享该数字,请创建名为 myParam 的变量。
1. 打开模型。
sldemo_fuelsys
2. 在模型中,在Modeling选项卡上,点击Model Data Editor。在 Model Data Editor 中,检查Parameters选项卡。
3. 在模型中,导航到 ⼦系统中。
open_system(...
'sldemo_fuelsys/fuel_rate_control/fuel_calc/feedforward_fuel_rate')
4. 在Model Data Editor的Filter contents框中,输⼊ 14.6。
数据表包含两⾏,对应于⼦系统中两个Constant模块的Constant value参数。
5. 使⽤Value列将字⾯数字 14.6 替换为myParam。对两个参数都执⾏替换。
6. 在 Filter contents框中,输⼊myParam。
7. 在编辑其中⼀个参数的值时,点击操作按钮 并选择 Create。
8. 在 Create New Data 对话框中,将 Value 设置为 14.6,然后点击 Create。
变量 myParam 随即出现在基础⼯作区中。
由于该变量存在于基础⼯作区中,因此可以在多个模型中使⽤它。但是,当结束MATLAB会话时,基础⼯作区的内容将丢失。请考虑将变量永久性地存储在模型⼯作区或数据字典中。
定义系统常量
要定义系统常量(例如表⽰地球半径的变量),请考虑创建 Simulink.Parameter 对象⽽不是 MATLAB 数值变量。参数对象允许指定物理单位和⾃定义⽂档及其他特性。
要在模型中创建并使⽤参数对象,参考数据对象。
通常,系统常量的值通过数学关系影响其他参数和信号的值。要显式对这些关系建模,请使⽤表达式设置相关数据的值。参考使⽤数学表达式设置变量值。
使⽤数学表达式设置变量值
可以将变量的值设置为包含字⾯数字和其他变量的表达式。使⽤表达式,您可以:
将值表⽰为已知物理常数之间的关系,⽽不是表⽰为不可识别的字⾯数字。
对参数数据之间的代数关系进⾏显式建模。更改⾃变数据的值时,⽆需记得调整因变数据的值。
⼀般⽅法
将变量转换为Simulink.Parameter对象。然后,使⽤表达式设置对象的 Value 属性:
交互⽅式 - 例如,使⽤ Model Data Editor 或 Model Explorer 在表达式前⾯加上等号 =。下图显⽰如何指定表达式 myVar + myOtherVar。
编程⽅式 - 使⽤ slexpr 函数,以字符向量或字符串形式指定表达式。例如,要将名为myParam的参数对象的值设置为表达式 myVar + myOtherVar,则按如下⽅式设置:
myParam.Value = slexpr('myVar + myOtherVar')
显式对变量之间的代数关系建模
⽰例 sldemo_metro对⼀个系统进⾏建模,该系统由移动平台上悬挂的三个相同的钟摆式节拍器构成。模型中的模块使⽤基础⼯作区中的以下 MATLAB 变量:
m - 每个节拍器的质量,初始值为 0.1 kg
r - 每个节拍器的长度,初始值为 1.0 m
J - 每个节拍器的惯性矩,初始值为 0.1 kg/m2
这些变量具有代数关系:每个节拍器的惯性矩等于质量乘以长度的平⽅。在此⽰例中,以 J 的值记录此关系。
1. 打开模型。
sldemo_metro
2. 更新模块图。模型回调在基础⼯作区中创建变量。
3. 在此⽰例中,要防⽌回调覆盖您对变量所做的更改,请删除回调代码。
set_param('sldemo_metro','InitFcn','')
4. 在模型中,在Modeling选项卡上,点击Model Data Editor。
5. 在Model Data Editor的Parameters选项卡上,激活Change scope 按钮。
使⽤变量的模块位于⼦系统中,因此必须配置 Model Data Editor 以在⼦系统中显⽰数据。
6. 点击 Show/refresh additional information 按钮。
数据表包含与基础⼯作区中的变量对应的⾏。
7. 在Filter contents框中,输⼊ J。
8. 在数据表中,到与J对应的⾏。在Value列中,将变量的值设置为Simulink.Parameter(J)。
Simulink 将J转换为Simulink.Parameter对象。
9. 在Value列中,将参数对象的值设置为=m*r^2。
10. (可选)使⽤不同节拍器质量和长度对模型进⾏仿真。当更改m和r的值时,不必记得更正J的值。
其他建模⽬标限制和注意事项
如果表达式包含定点数据或枚举类型的数据,则表达式只能对⼀个变量或对象进⾏运算。
不能在将使⽤表达式的参数对象的数据类型(DataType 属性)设置为auto(默认值)时,将表达式中出现的参数对象的数据类型设置为⾮auto值。例如,在表达式 J = m*r^2 中,不能在将J的数据类型设置为auto时,将m和r的数据类型设置为single。
要保留将使⽤表达式的对象设置为auto所带来的好处,请将表达式中对象的数据类型设置为auto。换
句话说,对所有涉及的对象使⽤ auto。表达式中的对象会获取与使⽤该表达式的对象相同的数据类型。
要对表达式中出现的对象使⽤auto以外的值,请将所有相关参数对象的数据类型设置为auto以外的值。换句话说,不要对任何涉及的对象使⽤ auto。
必须对表达式中使⽤的所有对象使⽤相同的数据类型。
如果有Simulink Coder™ 和Embedded Coder® 许可证,则可以⽣成使⽤表达式初始化全局变量的代码。但是,代码⽣成器仅在表达式符合某些要求时才能保留表达式。
控制参数值的作⽤域
变量的作⽤域是可以使⽤该变量的模型和模块的集合。例如,在基础⼯作区中创建的变量具有全局作⽤域,因为所有打开模型中的所有模块都可以使⽤该变量。存储在模型⼯作区中的变量的作⽤域受限,因为只有宿主模型中的模块才能使⽤该变量。不能在同⼀个作⽤域中创建两个同名的变量。控制变量的作⽤域有助于避免名称冲突并建⽴明确的变量所有关系。
下表说明⽤于控制可重⽤参数值的作⽤域的不同⽅法。
作⽤域⽅法
所有打开模型在基础⼯作区创建⼀个变量。
⼀个或多个⽬标模型在数据字典中创建⼀个变量。要在多个模型中重⽤该变量,请创建⼀个引⽤字典。参考什么是数据字典?。
⼀个模型,包括该模型中的所有⼦系统在模型⼯作区中创建⼀个变量。参考模型⼯作区。
⼀个⼦系统内的多个模块,包括嵌套⼦系统中的模块封装⼦系统并创建⼀个封装参数⽽不是⼯作区变量。
要防⽌⼀个⼦系统内的模块使⽤⼯作区变量,请在⼦系统模块对话框中将 Permit Hierarchical Resolution 设置为 “None”。此⽅法允许您使⽤相同的名称在⼯作区中创建⼀个变量和在⼦系统封装中创建⼀个封装参数。⼦系统中的模块只能使⽤该封装参数。
parameter数据类型有关⼦系统的信息,参考Subsystem。有关封装的信息,参考封装基础知识。
对于在同⼀作⽤域内具有许多变量的⼤型模型,为了避免出现名称冲突,请考虑将这些变量打包到单个结构体中。参考在结构体中组织相关的模块参数定义。有关模块如何使⽤您指定的变量名称的基本信息,参考符号解析。
永久性存储⼯作区变量
在基础⼯作区中创建的变量不会在各 MATLAB 会话之间保留。但是,可以将变量存储在 MAT ⽂件或脚本⽂件中,每次打开模型时,使⽤模型回调加载该⽂件。模型回调是⼀组命令,当以特定⽅式与模型交互(例如打开模型)时Simulink会执⾏这些命令。可以使⽤回调以在打开模型时加载变量。在学习使⽤ Simulink 和尝试模型时,可以使⽤此⽅法来存储变量。
1. 在包含 Gain 模块的模型中,将 Gain 参数的值设置为 K。
2. 在命令提⽰符下,在基础⼯作区中创建变量 K。
K = 27;
3. 在⼯作区浏览器中,右键点击该变量并选择 Save As。
要将多个变量保存在⼀个⽂件中,请在⼯作区浏览器中选择所有⽬标变量,然后右键点击任⼀所选变量。
4. 在对话框中,将 Save as type 设置为 “MATLAB Script”。将File name设置为 loadvar,然后点击Save。
脚本⽂件 loadvar.m 随即出现在当前⽂件夹中。可以打开该⽂件以查看创建变量 K 的命令。
5. 在模型中,在 Modeling 选项卡上,选择 Model Settings > Model Properties。
6. 在 Model Properties 对话框的 Callbacks 选项卡中,选择 PreLoadFcn作为要定义的回调。在Model pre-load function窗格中,
输⼊loadvar,然后点击 OK。
7. 保存模型。
下次打开该模型时,PreloadFcn 回调会将变量K加载到基础⼯作区中。也可以将该变量保存到MAT⽂件,例如loadvar.mat,并将模型回调设置为load loadvar。参考针对⾃定义模型⾏为的回调。要以编程⽅式定义⽤于加载变量的回调,参考以编程⽅式存储模型的⼯作区变量。
将变量保存到⽂件时,必须保存在 MATLAB 会话期间对变量所做的更改。要永久性存储模型的变量,请考虑使⽤模型⼯作区或数据字典⽽不是 MAT ⽂件或脚本⽂件。有关永久性存储变量的详细信息,参考确定在何处存储Simulink模型的变量和对象。
以编程⽅式存储模型的⼯作区变量
在上⾯的⽰例中,定义了⼀个模型回调,它会在您打开模型时创建变量。可以通过编程⽅式保存该变量并设置模型回调。
1. 在命令提⽰符下,在基础⼯作区中创建变量 K。
K = 27;
2. 将变量保存到名为 loadvar.m 的新脚本⽂件中。
matlab.io.saveVariablesToScript('loadvar.m','K')
3. 设置模型回调以加载该脚本⽂件。
set_param('mymodel','PreloadFcn','loadvar')
4. 保存模型。
save_system('myModel')
函数matlab.io.saveVariablesToScript将变量保存到⼀个脚本⽂件中。要将变量保存到 MAT ⽂件,请使⽤函数save。要以编程⽅式设置模型属性(如回调),请使⽤函数set_param。
管理和编辑⼯作区变量
使⽤变量设置模块参数值时,需要将变量存储在⼯作区或数据字典中。可以使⽤命令提⽰符、Model Explorer 和 Model Data
Editor 来创建、移动、复制和编辑变量。还可以确定模型中变量的使⽤位置,列出模型使⽤的所有变量,以及列出模型不使⽤的所有变量。为查表打包共享断点和表数据
要在多个 n-D Lookup Table、Prelookup 和 Interpolation Using Prelookup 模块之间共享断点向量或表数据,请考虑将数据存储在 Simulink.LookupTable 和 Simulink.Breakpoint 对象中,⽽不是存储在 MATLAB 变量或 Simulink.Parameter 对象中。这种⽅法通过清楚地将数据标识为查表的⼀部分,并将断点数据与表数据显式关联,从⽽提⾼了模型的可读性。
在 Simulink.LookupTable 对象中存储独⽴查表
独⽴查表包含⼀组表数据和⼀个或多个断点向量。您不能与其他查表共享表数据或任何断点向量。当共享独⽴查表时,即是在多个 n-D Lookup Table 模块中⼀起使⽤所有表数据和断点数据。要将此数据存储在 Simulink.LookupTable 对象中,请执⾏下列操作:
1. 在⼯作区或数据字典中创建该对象。例如,在命令提⽰符下,输⼊:
myLUTObj = Simulink.LookupTable;
2. 使⽤该对象的属性来存储表数据和断点数据的值。
3. 使⽤该对象的属性为⽣成的代码中的结构体类型配置唯⼀名称。在属性对话框中的 Struct Type definition 下,指定 Name。
4. 在 n-D Lookup Table 模块中,将 Data specification 设置为 “Lookup table object”。
5. 在 Data specification 的右侧,将 Name 设置为Simulink.LookupTable 对象的名称。
有关创建和配置 Simulink.LookupTable 对象的⽅法,参考Simulink.LookupTable将共享数据存储在Simulink.LookupTable 和Simulink.Breakpoint对象中在使⽤Prelookup 和 Interpolation Using Prelookup模块来更精细地控制查算法时,可以共享断点向量和表数据集。例如,可以在两个不同表数据集之间共享⼀个断点向量。通过将断点数据与表数据分离,可以共享查表的各个部分,⽽不是共享整个查表。
要存储断点数据和表数据,请执⾏下列操作:
1. 为每个唯⼀的表数据集创建⼀个Simulink.LookupTable 对象。为每个唯⼀的断点向量创建⼀个Simulink.Breakpoint对象,包括不
打算共享的断点向量。
2. 使⽤对象的属性来存储表数据和断点数据的值。
3. 配置Simulink.LookupTable对象以引⽤Simulink.Breakpoint对象来获取断点数据。在Simulink.LookupTable对象中,将
Specification设置为“Reference”。指定Simulink.Breakpoint对象的名称。
4. 在Interpolation Using Prelookup 模块中,将Specification设置为 “Lookup table object”。将Name设置为
Simulink.LookupTable对象的名称。
在 Prelookup 模块中,将Specification设置为 “Breakpoint object”。将Name 设置为Simulink.Breakpoint 对象的名称。
⽰例模型fxpdemo_lookup_shared_param包含两个Prelookup模块和两个Interpolation Using Prelookup模块。配置这些模块,使得每个由⼀个Prelookup模块和⼀个Interpolation Using Prelookup模块构成的组合表⽰唯⼀的查表。在两个查表之间共享断点向量。在这种情况下,每个查表都具有唯⼀的表数据,但共享断点数据。
1. 打开⽰例模型。
2. 在Prelookup模块对话框中,将 Specification 设置为 “Breakpoint object”。将 Name 设置为sharedBkpts。
3. 点击Name参数的值旁边的按钮 。选择Create Variable。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论