为可重用引用模型指定特定于实例的参数值
当您使用模型引用将大型系统分解为组件时,每个组件都是一个单独的模型。可以通过多个引用来重用组件模型块。每一个模型Block是组件的一个实例。然后可以配置块参数(例如获得a的参数获得块)对组件的每个实例使用相同的值或不同的值。要使用不同的值,请创建并使用一个模型参数来设置块参数的值。
当您从使用模型参数的模型层次结构生成代码时,这些参数将作为引用模型入口点函数的正式参数出现在代码中,例如输出(一步
)函数。生成的代码然后传递特定于实例的参数值,您可以在每个实例中指定这些参数值模型块,给相应的函数调用。
无论使用或不使用模型参数,都可以使用存储类来配置块参数,使其作为可调全局变量出现在生成的代码中。您还可以使用存储类来生成可调的模型参数值,生成的代码将其存储在内存中并传递给函数调用。然后,您可以在执行期间更改这些值。
将参数数据作为参数传递给引用模型入口点函数
配置一个引用模型,以通过生成的模型入口点函数的正式参数接受参数数据。该技术允许您为每个实例指定不同的参数值(模型块)的引用模型。
配置引用模型以使用模型参数
创建模型ex_arg_code_ref
.该模型代表了一个可重用的算法。
open_system (“ex_arg_code_ref”)
在建模选项卡上,单击模型数据编辑器.
在“模型数据编辑器”中的数据表中,使用数据类型属性的数据类型轮廓尺寸块单
.由于数据类型继承,模型中的其他信号使用相同的数据类型。
选择参数选项卡。
在模型中,选择获得块。
在“模型数据编辑器”中,使用价值属性的值获得参数gainArg
.
旁边gainArg
,点击操作按钮并选择创建.
2 .在“创建新数据”对话框中设置价值来金宝app仿真软件。参数
而且位置来模型的工作空间
.点击创建.
在属性对话框中,设置价值例如,对一个数字,3.17
.点击好吧.
使用“模型数据编辑器”设置分子参数,使用金宝app仿真软件。参数
对象命名coeffArg
的值为1.05
.与gainArg
,将参数对象存储在模型工作区中。
在模型数据编辑器中,单击显示/刷新其他信息按钮。
使用内容过滤框来查找每个参数对象(gainArg
而且coeffArg
).属性中的复选框论点列。
保存ex_arg_code_ref
模型。
或者,在命令提示符中,您可以使用这些命令来配置块和参数对象:
set_param (“ex_arg_code_ref /三机一体”,“OutDataTypeStr”,“单一”) set_param (“ex_arg_code_ref /增益”,“获得”,“gainArg”modelWorkspace = get_param(“ex_arg_code_ref”,“ModelWorkspace”);assignin (modelWorkspace“gainArg”,金宝app Simulink.Parameter (3.17));set_param (“ex_arg_code_ref /离散滤波器”,“分子”,“coeffArg”) assignin (modelWorkspace“coeffArg”,金宝app Simulink.Parameter (1.05));set_param (“ex_arg_code_ref”,“ParameterArgumentNames”,“coeffArg, gainArg”) save_system (“ex_arg_code_ref”)
在模型块中指定实例特定的参数值
创建模型ex_arg_code_ref
.此模型使用多个实例(模型块)的可重用算法。
open_system (“ex_arg_code”)
在模型中,打开model Data Editor参数选项卡(视图>模型数据编辑器).模型数据编辑器显示了与模型参数对应的四行,coeffArg
而且gainArg
,您可以为这两个指定模型块。
使用模型数据编辑器为模型参数设置值。例如,使用图中的值。
或者,在命令提示符中,您可以使用这些命令来设置值:
set_param (“ex_arg_code /模式”,“ParameterArgumentValues”,...结构(“coeffArg”,“0.98”,“gainArg”,“2.98”) set_param (“ex_arg_code / Model1”,“ParameterArgumentValues”,...结构(“coeffArg”,“1.11”,“gainArg”,“3.34”))
从顶层模型生成代码。
rtwbuild (“ex_arg_code”)
该文件ex_arg_code_ref.c
定义引用的模型入口点函数,ex_arg_code_ref
.函数有两个形式参数,rtp_coeffArg
而且rtp_gainArg
,对应于模型参数,coeffArg
而且gainArg
.形式参数使用数据类型real32_T
,对应于数据类型单
在仿真金宝app软件®.
/*输出和更新参考模型:'ex_arg_code_ref' */ void ex_arg_code_ref(const real32_T *rtu_In1, real32_T *rty_Out1, DW_ex_arg_code_ref_f_T *localDW, real32_T rtp_coeffArg, real32_T rtp_gainArg)
该文件ex_arg_code.c
包含顶层模型入口点函数的定义ex_arg_code
.该函数调用引用的模型入口点函数ex_arg_code_ref
并使用您指定的模型参数值(例如1.11
而且3.34
的值rtp_coeffArg
而且rtp_gainArg
.
/* ModelReference:“<根>/Model”包含:*输入:“<根>/In1”*输出:“<根>/Out1”*/ ex_arg_code_ref(&ex_arg_code_U。三机一体,&ex_arg_code_Y。Out1, &(ex_arg_code_DW.Model_InstanceData.rtdw), 0.98F, 2.98F);/* ModelReference:“<根>/Model1”包含:* Inport:“<根>/In1”* Outport:“<根>/Out2”*/ ex_arg_code_ref(&ex_arg_code_U。三机一体,&ex_arg_code_Y。Out2, &(ex_arg_code_DW.Model1_InstanceData.rtdw), 1.11F, 3.34F);
形式参数使用数据类型real32_T
(单
).
块参数
ex_arg_code_ref
通过内部规则确定它们的数据类型。例如,在获得块对话框,在参数属性选项卡,参数数据类型设置为继承:通过内部规则继承
(默认)。在这种情况下,内部规则选择与输入和输出信号相同的数据类型,单
.模型工作区中的模型参数使用上下文敏感的数据类型,因为
数据类型
属性设置为汽车
(默认)。通过此设置,模型参数使用与块参数相同的数据类型,单
.生成的代码中的形式参数使用与模型参数相同的数据类型,
单
.
生成可调参数值
中配置特定于实例的值模型块作为可调全局变量出现在生成的代码中。这种技术使您能够在内存中存储每个实例的参数值,并在代码执行期间优化这些值。
在顶层模型中ex_arg_code
,选择模型数据编辑器参数选项卡。
使用模型数据编辑器根据该图设置模型参数的值。
set_param (“ex_arg_code /模式”,“ParameterArgumentValues”,...结构(“coeffArg”,“coeffForInst1”,“gainArg”,“gainForInst1”) set_param (“ex_arg_code / Model1”,“ParameterArgumentValues”,...结构(“coeffArg”,“coeffForInst2”,“gainArg”,“gainForInst2”))
的内容ex_arg_code_ref
模型资源管理器中的模型工作区。在建模选项卡上,单击模型浏览器.
复制gainArg
而且coeffArg
从ex_arg_code_ref
将工作空间建模为基本工作空间。
重命名gainArg
作为gainForInst1
.重命名coeffArg
作为coeffForInst1
.
gainForInst1 = getVariable(modelWorkspace,“gainArg”);gainForInst1 = copy(gainForInst1);coeffForInst1 = getVariable(modelWorkspace,“coeffArg”);coeffForInst1 = copy(coeffForInst1);
复制gainForInst1
而且coeffForInst1
作为gainForInst2
而且coeffForInst2
.
gainForInst2 = copy(gainForInst1);coeffForInst2 = copy(coeffForInst1);
属性设置特定于实例的参数值价值
基本工作空间中的参数对象。
gainForInst1。价值= 2.98; coeffForInst1.Value = 0.98; gainForInst2.Value = 3.34; coeffForInst2.Value = 1.11;
在模型数据编辑器中为顶层模型ex_arg_code
,按显示/刷新其他信息按钮。
设置改变观点下拉列表代码
.
对于新的参数对象,请在存储类列ExportedGlobal
.此设置导致参数对象作为可调全局变量出现在生成的代码中。
gainForInst1。StorageClass =“ExportedGlobal”;coeffForInst1。StorageClass =“ExportedGlobal”;gainForInst2。StorageClass =“ExportedGlobal”;coeffForInst2。StorageClass =“ExportedGlobal”;
从顶层模型生成代码。
rtwbuild (“ex_arg_code”)
该文件ex_arg_code.c
定义与基本工作空间中的参数对象对应的全局变量。
/*导出块参数*/ real32_T coeffForInst1 = 0.98F;/*变量:coeffForInst1 *引用变量:'/Model' */ real32_T coeffForInst2 = 1.11F;/*变量:coeffForInst2 *引用by: ' /Model1' */ real32_T gainForInst1 = 2.98F;/*变量:gainForInst1 *参考变量:' /Model' */ real32_T gainForInst2 = 3.34F;/*变量:gainForInst2 *引用对象:' /Model1' */
在每次调用ex_arg_code_ref
时,顶模算法使用全局变量来设置形式参数的值。
/* ModelReference:“<根>/Model”包含:*输入:“<根>/In1”*输出:“<根>/Out1”*/ ex_arg_code_ref(&ex_arg_code_U。三机一体,&ex_arg_code_Y。Out1, &(ex_arg_code_DW.Model_InstanceData.rtdw), coeffForInst1, gainForInst1);/* ModelReference:“<根>/Model1”包含:* Inport:“<根>/In1”* Outport:“<根>/Out2”*/ ex_arg_code_ref(&ex_arg_code_U。三机一体,&ex_arg_code_Y。Out2, &(ex_arg_code_DW.Model1_InstanceData.rtdw), coeffForInst2, gainForInst2);
生成的代码中的全局变量使用数据类型real32_T
(单
).
基本工作区中的参数对象使用上下文敏感的数据类型,因为
数据类型
属性设置为汽车
(默认)。通过此设置,基本工作区中的参数对象使用与模型参数相同的数据类型,单
.生成的代码中的全局变量与基本工作区中的参数对象使用相同的数据类型。
将多个模型参数组合成一个结构
使用模型资源管理器进行复制gainArg
而且coeffArg
从ex_arg_code_ref
将工作空间建模到基本工作空间。
temp = getVariable(modelWorkspace,“gainArg”);gainArg = copy(temp);temp = getVariable(modelWorkspace,“coeffArg”);coeffArg = copy(temp);
在命令提示符中,将这两个参数对象组合成一个结构,structArg
.
structArg = 金宝appSimulink。参数(结构体(“获得”, gainArg。值,...多项式系数的coeffArg.Value));
使用模型资源管理器来移动structArg
进入模型工作区。
assignin (modelWorkspace“structArg”,复制(structArg));清晰的structArggainArgcoeffArg
在内容窗格中,配置structArg
作为唯一的模型参数。
set_param (“ex_arg_code_ref”,“ParameterArgumentNames”,“structArg”)
在ex_arg_code_ref
模型,选择模型数据编辑器参数选项卡。
的值,使用“模型数据编辑器”设置获得参数structArg.gain
的值分子参数structArg.coeff
.保存模型。
set_param (“ex_arg_code_ref /增益”,“获得”,“structArg.gain”) set_param (“ex_arg_code_ref /离散滤波器”,...“分子”,“structArg.coeff”) save_system (“ex_arg_code_ref”)
在命令提示符下,将基本工作空间中的四个参数对象组合成两个结构。的一个实例的参数值ex_arg_code_ref
.
structForInst1 = 金宝appSimulink。参数(结构体(“获得”, gainForInst1。值,...多项式系数的coeffForInst1.Value));structForInst2 = 金宝appSimulink。参数(结构体(“获得”, gainForInst2。值,...多项式系数的coeffForInst2.Value));
在顶层模型中ex_arg_code
,设置改变观点下拉列表设计
.使用Model Data Editor根据该图设置参数值。
set_param (“ex_arg_code /模式”,“ParameterArgumentValues”,...结构(“structArg”,“structForInst1”) set_param (“ex_arg_code / Model1”,“ParameterArgumentValues”,...结构(“structArg”,“structForInst2”))
单击显示/刷新其他信息按钮。
对于新的参数对象structForInst1
而且structForInst2
,使用模型数据编辑器来应用存储类ExportedGlobal
.
structForInst1。StorageClass =“ExportedGlobal”;structForInst2。StorageClass =“ExportedGlobal”;
在命令提示符下,使用该函数金宝appSimulink.Bus.createObject
要创建金宝app仿真软件。公共汽车
对象。对象中元素的层次结构与结构字段的层次结构相匹配。对象的默认名称为slBus1
.
金宝appSimulink.Bus.createObject (structForInst1.Value);
将总线对象重命名为myParamStructType
通过复制。
myParamStructType = copy(slBus1);
在模型数据编辑器中ex_arg_code
,设置改变观点来设计
.使用数据类型列设置的数据类型structForInst1
而且structForInst2
来总线:myParamStructType
.
structForInst1。数据类型=“巴士:myParamStructType”;structForInst2。数据类型=“巴士:myParamStructType”;
在模型数据编辑器中ex_arg_code_ref
,使用“模型数据编辑器”设置的数据类型structArg
来总线:myParamStructType
.
temp = getVariable(modelWorkspace,“structArg”);Temp = copy(Temp);temp.DataType =“巴士:myParamStructType”;assignin (modelWorkspace“structArg”,复制(临时));
保存ex_arg_code_ref
模型。
save_system (“ex_arg_code_ref”)
使用结构对参数值进行分组时,不能利用上下文敏感的数据类型来控制结构字段的数据类型(例如,的字段structForInst1
).但是,您可以使用总线对象的属性来控制字段数据类型。
在命令提示符中,将总线对象中元素的数据类型设置为单
.结构中的对应字段(例如structForInst1
而且structArg
)使用相同的数据类型。
myParamStructType.Elements(1)。数据类型=“单一”;myParamStructType.Elements(2)。数据类型=“单一”;
从顶层模型生成代码ex_arg_code
.
rtwbuild (“ex_arg_code”)
该文件ex_arg_code_types.h
定义结构类型myParamStructType
,对应于金宝app仿真软件。公共汽车
对象。
typedef struct {real32_T增益;real32_T多项式系数;} myParamStructType;
在文件中ex_arg_code_ref.c
时,引用模型入口点函数有一个形式参数,rtp_structArg
,对应于模型参数structArg
.
/*输出和更新引用模型:'ex_arg_code_ref' */ void ex_arg_code_ref(const real32_T *rtu_In1, real32_T *rty_Out1, DW_ex_arg_code_ref_f_T *localDW, const myParamStructType *rtp_structArg)
该文件ex_arg_code.c
定义与基本工作空间中的参数对象对应的全局结构变量。
/*导出块参数*/ myParamStructType structForInst1 = {2.98F, 0.98F};/*变量:structForInst1 *引用对象:'/Model' */ myParamStructType structForInst2 = {3.34F, 1.11F};/*变量:structForInst2 *引用对象:' /Model1' */
文件中的顶层模型算法ex_arg_code.c
将结构变量的地址传递给引用的模型入口点函数。
/* ModelReference:“<根>/Model”包含:*输入:“<根>/In1”*输出:“<根>/Out1”*/ ex_arg_code_ref(&ex_arg_code_U。三机一体,&ex_arg_code_Y。Out1, &(ex_arg_code_DW.Model_InstanceData.rtdw), & structforinst1);/* ModelReference:“<根>/Model1”包含:* Inport:“<根>/In1”* Outport:“<根>/Out2”*/ ex_arg_code_ref(&ex_arg_code_U。三机一体,&ex_arg_code_Y。Out2, &(ex_arg_code_DW.Model1_InstanceData.rtdw), & structforinst2);
模型参数和参数值的控制数据类型
当你使用模型参数时,你可以将数据类型应用到:
使用参数的块参数(对于某些块,例如Discrete库中的块)。
引用的模型工作区中的参数。
中指定的参数值模型块。
为了通过消除不必要的类型转换和C移位来生成高效的代码,可以考虑使用继承的和上下文敏感的数据类型来匹配数据类型。
在模型工作区中,使用MATLAB®数据类型为的变量
双
或者参数对象数据类型
属性设置为汽车
.在这种情况下,变量或对象使用与块参数相同的数据类型。当你设置参数值时模型块,利用上下文敏感的数据类型。若要设置参数值,请使用无类型值。
一种文字数字,如
15.23
.不要使用类型化表达式,例如单(15.23)
.数据类型为的MATLAB变量
双
.一个
金宝app仿真软件。参数
的对象数据类型
属性设置为汽车
.
在这些情况下,数字、变量或对象使用与引用的模型工作区中的模型参数相同的数据类型。如果还将模型参数配置为使用上下文敏感的数据类型,则可以通过仅为块参数指定类型来控制块参数、实参和实参值的数据类型。
有关控制参数数据类型的基本信息,请参见生成代码中的参数数据类型.
在不同的数据类型上下文中使用模型参数
如果使用模型参数设置多个块参数值,而块参数的数据类型不同,则不能使用上下文敏感的数据类型(双
或汽车
)作为模型工作区中的参数。必须显式地为参数指定数据类型。例如,如果模型工作区中的参数是一个参数对象(例如金宝app仿真软件。参数
),设置数据类型
属性的值汽车
.有关此情况的详细信息,请参见在不同数据类型上下文中重用参数数据.
在这种情况下,您可以继续利用上下文敏感的数据类型来控制中指定的参数值的数据类型模型块。每个参数值使用您在模型工作区中为相应参数指定的数据类型。