文档

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

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

探索示例模型

打开示例模型。

开放式系统(“sldemo\u fuelsys\u dd\u控制器”

该模型代表汽油发动机的燃油系统。该模型的输出是流向发动机的燃油流量。

导航到可切换补偿嵌套的子系统。

open_system ([“sldemo燃料系统控制器/燃料计算/”...“switchable_compensation”])

该子系统校正并过滤燃油率信号中的噪声。该子系统根据加油模式使用不同的过滤系数,控制逻辑根据发动机中的传感器故障而改变。例如,控制算法激活低噪声模式子系统正常运行时。它激活了富U模式子系统响应传感器故障。

打开低噪声模式子系统。

open_system ([“sldemo燃料系统控制器/燃料计算/”...“可切换的_补偿/低_模式”])

离散滤清器块过滤燃油率信号。在“块”对话框中分子参数设置过滤器的分子系数。

兄弟子系统富U模式还包含使用不同系数的离散滤波器块。

更新模型图以显示信号数据类型。块的输入和输出信号使用单精度浮点数据类型

在模型的左下角,单击模型数据标记,然后单击数据字典链接此模型的数据字典,sldemo_fuelsys_dd_controller.sldd,在模型资源管理器中打开。

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

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

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

在结构数组中存储参数值

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

低块=[“sldemo燃料系统控制器/燃料计算/”...“switchable_compensation / low_mode /离散滤波器”];richBlock=[“sldemo燃料系统控制器/燃料计算/”...“switchable_compensation / rich_mode /离散滤波器”];参数个数。lowNumerator = eval (get_param (lowBlock“分子”));params.richnomerator=eval(get_param(richBlock,“分子”));params = 金宝appSimulink.Parameter (params);

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

温度=参数值;温度低分子=参数值低分子*2;temp.richNumerator=params.Value.richNumerator*2;参数值(2)=温度;清楚的临时雇员

价值params是由两个结构组成的数组。每个结构存储一组滤波器系数。

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

创建一个金宝appSimulink.参数名为Ctrl

Ctrl = 金宝appSimulink.Parameter (2);Ctrl。数据类型=“uint8”

低噪声模式子系统,在“离散过滤器块”对话框中,设置分子表达式的参数参数(Ctrl).低分子

设置参数(低块,“分子”“params (Ctrl) .lowNumerator”);

在离散滤波器块中富U模式子系统,设置分子参数参数(Ctrl).richNumerator

set_param (richBlock“分子”'参数(Ctrl).richNumerator');

表达式选择其中的一个结构params通过使用变量Ctrl.然后表达式解除对结构中的一个字段的引用。字段值设置了分子系数的值。

要在系数集之间切换,请更改Ctrl到结构数组中相应的索引。

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

可选地,创建一个金宝app模拟总线对象用作结构数组的数据类型。您可以:

  • 控制结构的形状。

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

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

使用函数金宝appSimulink.Bus.createObject创建对象并将对象重命名为帕拉斯泰普

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

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

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

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

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

使用枚举类型切换变量

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

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

金宝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,“设计数据”); 附录(第节),“Ctrl”,Ctrl)补遗(sectObj,“params”params) addEntry (sectObj“paramsType”,paramsType)

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

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

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

开放式系统(“sldemo_fuelsys_dd”

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

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

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

更新sldemo_fuelsys_dd模型图。该范围显示,由于过滤系数较低,燃油率振荡的幅度减小。

停止模拟。

生成和检查代码

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

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

使用StorageClass列来应用存储类出口全球params因此,结构数组在生成的代码中显示为可调全局变量Ctrl因此,您可以在代码执行期间更改切换变量的值。

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

tempEntryObj = getEntry (sectObj,“params”);params=getValue(tempEntryObj);params.StorageClass=“ExportedGlobal”;setValue (tempEntryObj params);tempEntryObj = getEntry (sectObj,“Ctrl”); Ctrl=getValue(tempEntryObj);Ctrl.StorageClass=“ExportedGlobal”; 设置值(tempEntryObj,Ctrl);

从控制器模型生成代码。

rtwbuild(“sldemo\u fuelsys\u dd\u控制器”
###开始模型的构建过程:sldemo_fuelsys_dd_控制器###成功完成模型的代码生成:sldemo_fuelsys_dd_控制器

在“代码生成”报告中,查看头文件sldemo\u fuelsys\u dd\u控制器\u类型.h。该代码定义枚举数据类型FilterCoeffs

文件= fullfile (“sldemo\u fuelsys\u dd\u控制器\u ert\u rtw”...'sldemo_fuelsys_dd_controller_types.h'); rtwdemodbtype(文件,“#如果为_filterCoefs_定义了_TYPEDEF_”...'/* rtModel的前向声明*/',1,0)
#如果ndef DEFINED_TYPEDEF_为_filtercoefs_35; define def_TYPEDEF_filtercoefs TYPEDEF enum{Weak=1,/*默认值*/Aggressive}filtercoefs#恩迪夫

代码还定义了结构类型帕拉斯泰普,对应于金宝app模拟总线对象。这些字段使用模型中的单精度浮点数据类型。

rtwdemodbtype(文件,“#如果为_paramsType_定义了_TYPEDEF_”...“#如果为_filterCoefs_定义了_TYPEDEF_”,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\u fuelsys\u dd\u控制器\u ert\u rtw”...“sldemo_fuelsys_dd_controller.c”); rtwdemodbtype(文件,'FilterCoefs Ctrl=Aggressive;'...'/*块信号(默认存储)*/',1,0)
FilterCoeffs Ctrl = Aggressive;/*变量:Ctrl *引用:* '/Discrete Filter' * '/Discrete Filter' */

代码还定义了结构数组params

rtwdemodbtype(文件,'/*导出的块参数*/'...“/ *变量:参数”,1,1)
/*导出的块参数*/paramsType params[2]={{{8.7696F,-8.5104F},{0.0F,0.2592F},{{17.5392F,-17.0208F},{0.0F,0.5184F};/*变量:params

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

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

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

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

相关话题