文档

在模拟和代码执行期间参数值集之间的切换

要为相同的块参数存储多个独立的值集,可以使用结构数组。要在参数集之间切换,创建一个作为数组索引的变量,并更改变量的值。您可以在模拟期间更改变量的值,如果变量是可调的,则可以在执行生成的代码期间更改变量的值。

探索模型示例

打开这个示例模型:

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,在模型资源管理器中打开。

在模型浏览器中模型层次结构窗格中,选择设计数据节点。

内容窗格中,查看万博1manbetx仿真软件。NumericType对象,如s16En15.所有这些对象目前都表示单精度浮点数据类型.该模型使用这些对象来设置信号数据类型,包括离散滤波器块的输入和输出信号。

假设在模拟和执行生成的代码期间,您希望每个子系统根据您控制的变量在不同的分子系数之间进行切换。

在结构数组中存储参数值

将现有的分子系数集合存储在a中万博1manbetx仿真软件。参数对象,其值是一个结构。结构的每个字段存储一个离散滤波器块的系数。

lowBlock = [“sldemo_fuelsys_dd_controller / fuel_calc /”...“switchable_compensation / low_mode /离散滤波器”];richBlock = [“sldemo_fuelsys_dd_controller / fuel_calc /”...“switchable_compensation / rich_mode /离散滤波器”];参数个数。lowNumerator = eval (get_param (lowBlock“分子”));参数个数。richNumerator = eval (get_param (richBlock“分子”));params = 万博1manbetxSimulink.Parameter (params);

复制参数个数变成一个临时变量。修改这个临时结构中的字段值,并将修改后的结构指定为的第二个元素参数个数

temp = params.Value;temp.lowNumerator = params.Value.lowNumerator * 2;temp.richNumerator = params.Value.richNumerator * 2;params.Value (2) = temp;清晰的临时

的价值参数个数是两个结构的数组。每个结构存储一组过滤系数。

创建变量以在参数集之间切换

创建一个万博1manbetx仿真软件。参数对象命名Ctrl

Ctrl = 万博1manbetxSimulink.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到结构数组中相应的索引。

使用总线对象作为结构数组的数据类型

可选地,创建一个万博1manbetx仿真软件。公共汽车对象,以用作结构数组的数据类型。您可以:

  • 控制结构的形状。

  • 对于每个字段,控制数据类型和物理单元等特性。

  • 控件的名称结构体输入生成的代码。

使用的函数万博1manbetxSimulink.Bus.createObject创建对象并将对象重命名为paramsType

万博1manbetxSimulink.Bus.createObject(params.Value) paramsType = slBus1;清晰的slBus1

你可以使用万博1manbetx仿真软件。NumericType对象,以控制结构字段的数据类型。在总线对象中,使用数据类型对象的名称来设置数据类型每个元素的属性。

paramsType.Elements(1)。数据类型=“s16En15”;paramsType.Elements(2)。数据类型=“s16En7”

使用总线对象作为结构数组的数据类型。

参数个数。数据类型=“巴士:paramsType”

使用枚举类型切换变量

可以选择使用枚举类型作为切换变量的数据类型。您可以将每个参数集与有意义的名称关联,并限制切换变量的允许值。

创建名为的枚举类型FilterCoeffs.中的每个结构创建枚举成员参数个数.中的对应索引设置每个枚举成员的基础整数值参数个数

万博1manbetxSimulink.defineIntEnumType (“FilterCoeffs”, {“弱”“咄咄逼人”} [1 - 2])

使用枚举类型作为切换变量的数据类型。将变量的值设置为咄咄逼人的,对应于索引2

Ctrl。值= FilterCoeffs.Aggressive;

向数据字典添加新对象

将您创建的对象添加到数据字典中sldemo_fuelsys_dd_controller.sldd

dictObj = 万博1manbetxSimulink.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”

设置模拟停止时间为这样你就可以在模拟过程中与模型进行交互。

开始模拟运行并打开Scope块对话框。该范围显示了燃料流量(燃料(信号)在发动机正常运行时以显著幅度振荡。

在Model Explorer中,查看数据字典的内容sldemo_fuelsys_dd_controller.sldd.设置的值CtrlFilterCoeffs。弱

更新sldemo_fuelsys_dd模型图。范围表明,燃料率振荡的振幅降低,由于较小的侵略性过滤系数。

停止仿真。

生成和检查代码

如果您有Simulink万博1manbetx 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_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 {Weak = 1, /*默认值*/ Aggressive} FilterCoeffs;# endif

代码还定义了结构类型paramsType,对应于万博1manbetx仿真软件。公共汽车对象。这些字段使用模型中的单精度浮点数据类型。

rtwdemodbtype(文件,“ifndef DEFINED_TYPEDEF_FOR_paramsType_”...“ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_”, 1,0)
#ifndef 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(文件,'/*导出块参数*/'...“/ *变量:参数”, 1, 1)
/*导出块参数*/ paramsType params[2] = {{{8.7696F, -8.5104F}, {0.0F, 0.2592F}}, {{17.5392F, -17.0208F}, {0.0F, 0.5184F}};/ *变量:参数

模型中的代码算法一步函数使用切换变量在结构数组中建立索引。

若要在存储在结构数组中的参数集之间进行切换,请更改Ctrl在代码执行。

相关的话题

这个话题有用吗?