主要内容

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

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

探索模型示例

打开示例模型。

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.所有这些对象目前都表示单精度浮点数据类型.该模型使用这些对象来设置信号数据类型,包括离散滤波器块的输入和输出信号。

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

在结构数组中存储参数值

将现有的分子系数集合存储在a中金宝appSimulink.Parameter.Parameter.其值是结构的对象。结构的每个字段存储一个离散滤波器块之一的系数。

lowBlock = ['sldemo_fuelsys_dd_controller / fuel_calc /'...“switchable_compensation / low_mode /离散滤波器”];richBlock = ['sldemo_fuelsys_dd_controller / fuel_calc /'...“switchable_compensation / rich_mode /离散滤波器”];params.Lownumerator = eval(Get_Param(LowBlock,“分子”));参数个数。richNumerator = eval (get_param (richBlock“分子”));params = 金宝appSimulink.Parameter (params);

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

temp = params.Value;temp.lownumerator = params.value.lownumerator * 2;temp.richnumerator = params.value.richnumerator * 2;Params.Value(2)= Temp;清晰的临时

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

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

创建一个金宝appSimulink.Parameter.Parameter.对象命名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到结构数组中相应的索引。

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

可选地,创建一个金宝appsimulink.bus.对象,以用作结构数组的数据类型。您可以:

  • 控制结构的形状。

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

  • 控件的名称塑造输入生成的代码。

使用的函数金宝appSimulink.Bus.createObject要创建对象并将对象重命名为paramsType

金宝appSimulink.Bus.createObject(params.Value) paramsType = slBus1;清晰的slBus1

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

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

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

Params.Datatype =.“巴士: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 = getaintion(dictobj,设计数据的);添加剂(Sectobj,'ctrl',ctrl)插入术(sectobj,“参数”params) addEntry (sectObj“paramsType”,paramstype)

还可以在数据字典中存储枚举类型。但是,在这种情况下,不能导入枚举类型,因为不能将更改保存到sldemo_fuelsys_dd_controller.sldd..有关在数据字典中存储枚举类型的详细信息,请参见数据字典中的枚举

在模拟期间在参数集之间切换

打开示例模型sldemo_fuelsys_dd,它引用控制器模型sldemo_fuelsys_dd_controller

open_system (“sldemo_fuelsys_dd”

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

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

在模型资源管理器中,查看数据字典的内容sldemo_fuelsys_dd_controller.sldd..设置的值CtrlFilterCoeffs。弱

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

停止模拟。

生成和检查代码

如果您有Simulink金宝app Coder软件,您可以生成代码,使您能够在代码执行期间在参数集之间进行切换。

在模型资源管理器中,查看数据字典的内容sldemo_fuelsys_dd_controller.sldd..在内容窗格中,设置列视图存储类

使用StorageClass用于应用存储类的列ExportedGlobal.参数因此,结构阵列在生成的代码中显示为可调谐全局变量。将相同的存储类应用于Ctrl因此,您可以在代码执行期间更改交换变量的值。

或者,要配置对象,请使用以下命令:

tempEntryObj = getEntry (sectObj,“参数”);params = getValue (tempEntryObj);参数个数。StorageClass =“ExportedGlobal”;setValue (tempEntryObj params);tempEntryObj = getEntry (sectObj,'ctrl');ctrl = getValue(tempentryobj);ctrl.storageclass =“ExportedGlobal”;setValue(Tempentryobj,Ctrl);

从控制器模型生成代码。

slbuild (“sldemo_fuelsys_dd_controller”
###启动构建过程:sldemo_fuelsys_dd_controller ###成功完成代码生成:sldemo_fuelsys_dd_controller构建摘要顶部模型目标构建:模型动作重建原因================================================================================================================= sldemo_fuelsys_dd_controller代码生成的代码生成信息文件不存在。1个型号中的1个(0型号已达到迄今为止)构建持续时间:0H 0M 46.617S

在代码生成报告中,查看头文件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 siment_typedef_for_filtercoeffs_ #define siment_typedef_for_filtercoeffs_ typedef枚举{faif = 1,/ *默认值* / acclessive} filtercoeffs;# endif

代码还定义了结构类型paramsType,对应于金宝appsimulink.bus.对象。这些字段使用模型中的单精度浮点数据类型。

rtwdemodbtype(文件,'#ifndef smote_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参数[2] = {{{8.7696f,-8.5104f},{0.0f,0.2592f}},{{17.5392f,-17.0208f},{0.0f,0.5184f}}};/ *变量:参数

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

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

关闭数据字典的连接。此示例丢弃未保存的更改。要保存更改,请使用“保存”选择。

金宝appSimulink.data.dictionary.closeAll (“sldemo_fuelsys_dd_controller.sldd”“丢弃”

相关的话题