在模拟和代码执行期间在参数值集之间切换
要存储相同块参数的多个独立值集,可以使用结构数组。要在参数集之间切换,请创建一个充当数组索引的变量,并更改变量的值。您可以在模拟期间更改变量的值,如果变量是可调的,则可以在执行生成的代码期间更改。
探索范例模型
打开示例模型。
open_system (“sldemo_fuelsys_dd_controller”)
这个模型代表汽油发动机的加油系统。该模型的输出是燃料流向发动机的速率。
导航到switchable_compensation
嵌套的子系统。
open_system ([“sldemo_fuelsys_dd_controller / fuel_calc /”,…“switchable_compensation”])
该子系统对燃油率信号中的噪声进行校正和滤波。子系统根据加油模式使用不同的滤波系数,控制逻辑根据发动机中的传感器故障而改变。例如,控制算法激活low_mode
子系统正常运行。它激活了rich_mode
子系统对传感器故障的响应。
打开low_mode
子系统。
open_system ([“sldemo_fuelsys_dd_controller / fuel_calc /”,…“switchable_compensation / low_mode”])
离散滤波器块过滤燃油率信号。在块对话框中,分子参数设置过滤器的分子系数。
兄弟子系统rich_mode
还包含一个离散过滤器块,它使用不同的系数。
更新模型图以显示信号数据类型。块的输入和输出信号使用单精度浮点数据类型单
。
在模型的左下角,单击模型数据标记,然后单击数据字典链接。这个模型的数据字典,sldemo_fuelsys_dd_controller.sldd
,在模型资源管理器中打开。
在模型资源管理器模型层次结构窗格中,选择设计数据节点。
在内容属性的属性金宝app仿真软件。NumericType
对象,例如s16En15
。所有这些对象目前都表示单精度浮点数据类型单
。该模型使用这些对象来设置信号数据类型,包括Discrete Filter块的输入和输出信号。
假设在模拟和执行生成的代码期间,您希望每个子系统根据您控制的变量的值在不同的分子系数之间切换。
将参数值存储在结构数组中
将现有的分子系数集存储在a中金宝app仿真软件。参数
对象,其值为结构。结构的每个字段存储了一个离散过滤器块的系数。
lowBlock = [“sldemo_fuelsys_dd_controller / fuel_calc /”…“switchable_compensation / low_mode /离散滤波器”];richBlock = [“sldemo_fuelsys_dd_controller / fuel_calc /”…“switchable_compensation / rich_mode /离散滤波器”];参数个数。lowmolecator = eval(get_param(lowBlock,“分子”));参数个数。richhnumerator = eval(get_param(richBlock,“分子”));参数= Simul金宝appink.Parameter(params);
复制的值参数个数
变成一个临时变量。修改此临时结构中的字段值,并将修改后的结构赋值为的第二个元素参数个数
。
temp = params.Value;temp. lowmolecator = params. value . lowmolecator * 2;temp.richNumerator = params.Value.richNumerator * 2;params.Value(2) = temp;清晰的临时
的价值参数个数
是两个结构的数组。每个结构存储一组滤波器系数。
创建变量在参数集之间切换
创建一个金宝app仿真软件。参数
对象命名Ctrl
。
Ctrl = 金宝appSimulink.Parameter(2);Ctrl。数据类型=“uint8”;
在low_mode
子系统,在“离散筛选器”块对话框中,设置分子表达式的参数。参数(Ctrl) .lowNumerator
。
set_param (lowBlock“分子”,“params (Ctrl) .lowNumerator”);
中的“离散筛选器”块中rich_mode
的值分子参数参数(Ctrl) .richNumerator
。
set_param (richBlock“分子”,“params (Ctrl) .richNumerator”);
中的结构之一参数个数
通过使用变量Ctrl
。表达式然后对结构中的一个字段进行解引用。字段值设置分子系数的值。
要在系数集之间切换,您可以更改的值Ctrl
到结构体数组中对应的索引。
使用总线对象作为结构数组的数据类型
可选地,创建金宝app仿真软件。公共汽车
对象,以用作结构数组的数据类型。您可以:
控制结构的形状。
对于每个字段,控制特征,如数据类型和物理单元。
控件的名称
结构体
输入生成的代码。
使用函数金宝appSimulink.Bus.createObject
创建对象并将对象重命名为paramsType
。
金宝appSimulink.Bus.createObject(params.Value) paramsType = slBus1;清晰的slBus1
您可以使用金宝app仿真软件。NumericType
对象来控制结构字段的数据类型。在总线对象中,使用数据类型对象的名称设置数据类型
每个元素的属性。
paramsType.Elements(1)。数据类型=“s16En15”;paramsType.Elements(2)。数据类型=“s16En7”;
使用总线对象作为结构数组的数据类型。
参数个数。数据类型=“巴士:paramsType”;
使用枚举类型切换变量
可选地,使用枚举类型作为切换变量的数据类型。您可以将每个参数集与有意义的名称相关联,并限制切换变量的允许值。
创建名为FilterCoeffs
。中的每个结构都创建枚举成员参数个数
。中将每个枚举成员的基础整数值设置为中的相应索引参数个数
。
金宝appSimulink.defineIntEnumType (“FilterCoeffs”, {“弱”,“咄咄逼人”} [1 - 2])
使用枚举类型作为切换变量的数据类型。将变量的值设置为咄咄逼人的
,对应索引2
。
Ctrl。值= FilterCoeffs.Aggressive;
向数据字典中添加新对象
将创建的对象添加到数据字典中sldemo_fuelsys_dd_controller.sldd
。
dictObj = 金宝appSimulink.data.dictionary.open(“sldemo_fuelsys_dd_controller.sldd”);sectObj = getSection(dictObj,设计数据的);addEntry (sectObj“热”Ctrl) addEntry (sectObj“参数”params) addEntry (sectObj“paramsType”paramsType)
还可以在数据字典中存储枚举类型。但是,在这种情况下不能导入枚举类型,因为不能将更改保存为sldemo_fuelsys_dd_controller.sldd
。有关在数据字典中存储枚举类型的详细信息,请参见数据字典中的枚举。
在模拟过程中切换参数设置
打开示例模型sldemo_fuelsys_dd
,它引用控制器模型sldemo_fuelsys_dd_controller
。
open_system (“sldemo_fuelsys_dd”)
设置模拟停止时间为正
这样您就可以在模拟过程中与模型交互。
开始模拟运行并打开作用域块对话框。范围显示燃料流量(的燃料
信号)在发动机正常工作期间以显著的幅度振荡。
在Model Explorer中,查看数据字典的内容sldemo_fuelsys_dd_controller.sldd
。设置的值Ctrl
来FilterCoeffs。弱
。
更新sldemo_fuelsys_dd
模型图。范围表明,燃油率振荡的幅度减小,由于较少的激进滤波器系数。
停止模拟。
生成和检查代码
如果您有Simulink金宝app Coder软件,则可以生成使您能够在代码执行期间在参数集之间切换的代码。
在Model Explorer中,查看数据字典的内容sldemo_fuelsys_dd_controller.sldd
。在内容窗格中,设置列视图来存储类
。
使用StorageClass列应用存储类ExportedGlobal
来参数个数
因此,结构数组在生成的代码中显示为可调的全局变量。应用相同的存储类Ctrl
这样您就可以在代码执行期间更改切换变量的值。
或者,要配置对象,使用这些命令:
tempEntryObj = getEntry(sectObj,“参数”);params = getValue(tempEntryObj);参数个数。StorageClass =“ExportedGlobal”;setValue (tempEntryObj params);tempEntryObj = getEntry(sectObj,“热”);Ctrl = getValue(tempEntryObj);Ctrl。StorageClass =“ExportedGlobal”;setValue (tempEntryObj Ctrl);
从控制器模型生成代码。
rtwbuild (“sldemo_fuelsys_dd_controller”)
模型的开始构建过程:sldemo_fuelsys_dd_controller成功完成模型代码生成:sldemo_fuelsys_dd_controller
在代码生成报告中,查看头文件sldemo_fuelsys_dd_controller_types.h
。代码定义枚举数据类型FilterCoeffs
。
文件= fullfile(“sldemo_fuelsys_dd_controller_ert_rtw”,…“sldemo_fuelsys_dd_controller_types.h”);rtwdemodbtype(文件,“ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_”,…'/* rtModel */', 1,0)
#ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_ #define DEFINED_TYPEDEF_FOR_FilterCoeffs_ typedef enum{弱= 1,/*默认值*/ Aggressive}过滤coeffs;# endif
代码还定义了结构类型paramsType
,对应于金宝app仿真软件。公共汽车
对象。字段使用来自模型的单精度浮点数据类型。
rtwdemodbtype(文件,“ifndef DEFINED_TYPEDEF_FOR_paramsType_”,…“ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_”, 1,0)
#define DEFINED_TYPEDEF_FOR_paramsType_ typedef struct {real32_T lowNumerator[2];real32_T richNumerator [2];} paramsType;# endif
查看源文件sldemo_fuelsys_dd_controller.c
。代码使用枚举类型定义切换变量Ctrl
。
文件= fullfile(“sldemo_fuelsys_dd_controller_ert_rtw”,…“sldemo_fuelsys_dd_controller.c”);rtwdemodbtype(文件,'FilterCoeffs Ctrl = Aggressive;',…'/*块信号(默认存储)*/', 1,0)
FilterCoeffs Ctrl = Aggressive;/*变量:Ctrl *引用:* '/Discrete Filter' * ' /Discrete Filter' */
代码还定义了结构的数组参数个数
。
rtwdemodbtype(文件,'/*导出块参数*/',…/*变量:params, 1, 1)
/*导出块参数*/ paramsType params[2] = {{8.7696F, - 8.51044 f}, {0.0F, 0.2592F}}, {{17.5392F, -17.0208F}, {0.0F, 0.5184F}}};/*变量:参数
模型中的编码算法一步
函数使用切换变量对结构数组进行索引。
的值可在结构数组中存储的参数集之间进行切换Ctrl
在代码执行期间。
关闭到数据字典的连接。这个示例将丢弃未保存的更改。若要保存更改,请使用“保存”
选择。
金宝appSimulink.data.dictionary.closeAll (“sldemo_fuelsys_dd_controller.sldd”,“丢弃”)
相关的话题
- 调优和实验块参数值
- 在生成的代码中创建可调校准参数(金宝app仿真软件编码器)
- 在结构中组织相关块参数定义
- 通过外部代码定义的指针访问结构化数据(嵌入式编码)