在组件系统中建立数据所有权
这个例子展示了如何在从组件系统(引用模型)生成的代码中建立全局数据的所有权。
通过将存储类应用于引用模型中的数据元素,在生成的代码中创建全局变量时(请参阅将存储类应用于单个信号、状态和参数数据元素),在某些条件下,代码生成器将变量定义与层次结构中顶层模型生成的代码放在一起。这种默认位置使得在基于团队的开发环境中确定哪个组件负责数据和管理代码更改变得更加困难。
要通过将定义与从相关组件生成的代码放在一起来建立全局变量的所有权,请应用一个存储类,例如ExportToFile
并指定老板自定义属性。或者,对于参数对象,如金宝app仿真软件。参数
如果您只在一个组件中使用,您可以通过将对象存储在模型工作区而不是基本工作区或数据字典中来建立所有权。
探索示例模型
复制脚本文件prepare_sldemo_fuelsys_dd_ctrl.m
到当前文件夹。
[~, ~] = copyfile(fullfile(matlabroot,“例子”,“是”,“主要”,“prepare_sldemo_fuelsys_dd_ctrl.m”),…“prepare_sldemo_fuelsys_dd_ctrl.m”,“f”);
运行当前文件夹中的脚本副本。脚本打开模型sldemo_fuelsys_dd_controller
为这个例子做准备。
prepare_sldemo_fuelsys_dd_ctrl open_system (“sldemo_fuelsys_dd_controller”)
该控制器模型包含两个组件模型,airflow_calc
和fuel_calc
。的两个输出airflow_calc
,est_airflow
和fb_correction
,是fuel_calc
。
打开airflow_calc
模型。
open_system (“airflow_calc”)
在建模选项卡上,单击模型数据编辑器。
在模型数据编辑器中,设置改变观点下拉列表到代码
。
在模型中,选择上部Outport块。
在模型数据编辑器中检查存储类列。这个块代表的信号,est_airflow
,使用存储类ExportToFile
。通过此设置,信号将作为全局变量出现在生成的代码中。输出块标记fb_correction
也使用此设置。
在模型数据编辑器中,选择参数选项卡,然后单击显示/刷新附加信息按钮。模型数据编辑器现在显示有关工作空间变量和对象的信息,例如金宝app仿真软件。参数
对象,模型使用该对象来设置块参数值。
在内容过滤框中,输入分子
。的金宝app仿真软件。参数
对象numerator_param
的值,该值位于基本工作区中分子参数中标记的离散滤波器块节气门瞬态
。对象使用存储类ExportToFile
。
选择信号选项卡。
在内容过滤框中,输入e0
。信号e0
的内部airflow_calc
组件,也使用ExportToFile
。信号是内部的,因为它不是模型的根级输入或输出。
打开fuel_calc
模型。
open_system (“fuel_calc”)
在此模型的模型数据编辑器中,单击港口/外港选项卡,设置改变观点来代码
。导入模块est_airflow
和fb_correction
使用相同的存储类,ExportToFile
,对应的Outport阻塞airflow_calc
。输出块标记fuel_rate
也使用ExportToFile
。
生成和检查代码
从控制器模型生成代码;sldemo_fuelsys_dd_controller
。
rtwbuild (“sldemo_fuelsys_dd_controller”)
###开始构建模型过程:airflow_calc ###成功完成模型的构建过程:airflow_calc ###开始构建模型过程:fuel_calc ###成功完成模型的构建过程:fuel_calc ###开始构建模型过程:sldemo_fuelsys_dd_controller ###成功完成模型的构建过程:sldemo_fuelsys_dd_controller
在代码生成报告中,在引用模型,单击超链接以查看为。生成的代码airflow_calc
。
该文件airflow_calc.c
定义表示信号的全局变量e0
。因为写入和读取的块e0
只存在于airflow_calc
,代码生成器假定该组件拥有该信号。
File = fullfile(“slprj”,“导”,“airflow_calc”,“airflow_calc.c”);rtwdemodbtype(文件,'/*自定义存储类:ExportToFile */',…“real32_T e0;”, 1, 1)
/*定义自定义存储类:ExportToFile */ real32_T e0;/* '/Sum1' */
在代码生成报告中,返回为。生成的代码sldemo_fuelsys_dd_controller
。
该文件sldemo_fuelsys_dd_controller.c
定义其他全局变量。
File = fullfile(“sldemo_fuelsys_dd_controller_ert_rtw”,…“sldemo_fuelsys_dd_controller.c”);rtwdemodbtype(文件,…'/*自定义存储类:ExportToFile */',…'real32_T numerator_param[2] = {0.01F, -0.01F};', 1, 1);
/*定义自定义存储类:ExportToFile */ real32_T est_airflow;/* '/airflow_calc' */ real32_T fb_correction;/* ' /airflow_calc' */ real32_T fuel_rate;/* '<根>/fuel_calc' */ real32_T numerator_param[2] = {0.01F, -0.01F};
因为信号est_airflow
和fb_correction
在两个组件之间传递并通过顶级控制器模型,代码生成器假定sldemo_fuelsys_dd_controller
拥有信号。代码生成器也做了类似的假设fuel_rate
。因为参数对象numerator_param
存在于基本工作区中,层次结构中的任何模型都可以使用该对象。因此,代码生成器假定sldemo_fuelsys_dd_controller
拥有参数。
您可以配置每个共享信号和参数对象,以便相应的变量定义出现在为相关组件生成的代码中。
配置数据所有权
在本例中,您可以配置代码生成设置,以便:
生成的代码
airflow_calc
模型定义了在两个组件之间传递的信号,est_airflow
和fb_correction
。生成的代码
airflow_calc
定义参数数据,numerator_param
。生成的代码
fuel_calc
定义它计算的输出信号,fuel_rate
。
在airflow_calc
模型,在建模选项卡,在设计,点击属性检查器。
在模型数据编辑器中,选择港口/外港选项卡。
查找与Outport块对应的行est_airflow
。
在一行中,单击左侧列中的图标。属性检查器显示了输出块的属性。
在属性检查器中,在代码,设置CoderInfo.CustomAttributes.Owner来airflow_calc
。代码生成器将全局变量的定义与为之生成的代码放在一起airflow_calc
。
为fb_correction
,使用模型数据编辑器和属性检查器进行设置老板来airflow_calc
。
选择参数选项卡。
找到与参数对象对应的行,numerator_param
。
在一行中,双击左列中的图标。模型资源管理器打开并显示的属性numerator_param
。
在模型层次结构窗格,展开airflow_calc节点,以便您可以看到从属模型的工作空间节点。
使用模型资源管理器移动numerator_param
从基本工作区到airflow_calc
模型的工作空间。例如,在模型层次结构窗格中,选择基本工作空间。然后,拖numerator_param
从内容窗格模型的工作空间中的节点模型层次结构窗格。对于此更改,代码生成器假定airflow_calc
拥有numerator_param
,并将变量定义放在为之生成的代码中airflow_calc
。
在fuel_calc
模型中,选择查看>属性检查器。
用于导入块est_airflow
和fb_correction
,使用模型数据编辑器和属性检查器进行设置老板来airflow_calc
。在这个配置中,fuel_calc
代码不定义变量。
对于输出块,使用模型数据编辑器和属性检查器进行设置老板来fuel_calc
。
或者,要配置模型中的数据,请在命令提示符下使用以下命令:
temp = 金宝appSimulink.Signal;temp.CoderInfo.StorageClass =“自定义”;temp.CoderInfo.CustomStorageClass =“ExportToFile”;temp.CoderInfo.CustomAttributes.Owner =“airflow_calc”;set_param (“airflow_calc / est_airflow”,“SignalName”,“est_airflow”) set_param (“airflow_calc / est_airflow”,“SignalObject”,复制(临时))set_param (“airflow_calc / fb_correction”,“SignalName”,“fb_correction”) set_param (“airflow_calc / fb_correction”,“SignalObject”MDLWKS = get_param(“airflow_calc”,“ModelWorkspace”);assignin (mdlwks“numerator_param”,复制(numerator_param));portHandles = get_param(“fuel_calc / est_airflow”,“portHandles”);outportHandle = portHandles.Outport;set_param (outportHandle“名字”,“est_airflow”) set_param (outportHandle“SignalObject”,copy(temp)) portHandles = get_param(“fuel_calc / fb_correction”,“portHandles”);outportHandle = portHandles.Outport;set_param (outportHandle“名字”,“fb_correction”) set_param (outportHandle“SignalObject”,copy(temp)) temp. coderinfo . customattributes . owner =“fuel_calc”;set_param (“fuel_calc / fuel_rate”,“SignalName”,“fuel_rate”) set_param (“fuel_calc / fuel_rate”,“SignalObject”,复制(临时))清晰临时portHandlesoutportHandlenumerator_param
在这三个模型中,选择配置参数>使用数据对象的所有者来放置数据定义。清除此设置(默认设置)后,代码生成器将忽略您为其指定的值老板。
set_param (“fuel_calc”,“EnableDataOwnership”,“上”) set_param (“airflow_calc”,“EnableDataOwnership”,“上”) set_param (“sldemo_fuelsys_dd_controller”,“EnableDataOwnership”,“上”)
保存组件模型。
save_system (“fuel_calc”) save_system (“airflow_calc”)
生成改进的代码
从控制器模型生成代码;sldemo_fuelsys_dd_controller
。
rtwbuild (“sldemo_fuelsys_dd_controller”)
###开始构建模型过程:airflow_calc ###成功完成模型的构建过程:airflow_calc ###开始构建模型过程:fuel_calc ###成功完成模型的构建过程:fuel_calc ###开始构建模型过程:sldemo_fuelsys_dd_controller ###成功完成模型的构建过程:sldemo_fuelsys_dd_controller
现在,这个文件sldemo_fuelsys_dd_controller.c
不定义任何全局变量。
在代码生成报告中,检查为airflow_calc
。
该文件airflow_calc.c
的全局变量airflow_calc
。
File = fullfile(“slprj”,“导”,“airflow_calc”,“airflow_calc.c”);rtwdemodbtype(文件,'/*自定义存储类:ExportToFile */',…'real32_T numerator_param[2] = {0.01F, -0.01F};', 1, 1)
/*定义自定义存储类:ExportToFile */ real32_T e0;/* '/Sum1' */ real32_T est_风流;/* '<根>/Sum' */ real32_T fb_correction;/* ' /Discrete Integrator' */ real32_T numerator_param[2] = {0.01F, -0.01F};
检查为之生成的代码fuel_calc
。该文件fuel_calc.c
定义全局变量fuel_rate
。
File = fullfile(“slprj”,“导”,“fuel_calc”,“fuel_calc.c”);rtwdemodbtype(文件,'/*自定义存储类:ExportToFile */',…“real32_T fuel_rate;”, 1, 1)
/*定义自定义存储类:ExportToFile */ real32_T fuel_rate;/* '/合并' */
为组件之间传递的信号创建单点规范
信号数据元素est_airflow
和fb_correction
的Outport block表示airflow_calc
然后按import插入fuel_calc
。如果要更改其中一个信号的配置,则必须在两个模型中都进行更改。的存储类est_airflow
从ExportToFile
来挥发性
时,必须更改两次存储类:一次用于Outport块airflow_calc
再一次用于导入块fuel_calc
。
为了使每个信号的维护更容易,将代码生成设置存储在金宝app仿真软件。信号
对象,该对象可以存在于基本工作区或数据字典中。
的模型数据编辑器中airflow_calc
,在…港口/外港Tab,找到对应的行est_airflow
。
对于这一行,在信号的名字列,单击单元格。
在牢房里,旁边est_airflow
文本,点击动作按钮(有三个垂直点)。选择创建和解决。
在创建新数据对话框,设置价值来金宝app仿真软件。信号
并点击创建。一个金宝app仿真软件。信号
对象命名est_airflow
显示在基本工作区中。在模型数据编辑器中,为est_airflow
的复选框解决复选框,这意味着Outport块从基本工作区中的信号对象获取代码生成设置。
在est_airflow
属性对话框,设置存储类来ExportToFile
。
集老板来airflow_calc
。
使用模型数据编辑器创建类似的信号对象fb_correction
。
的模型数据编辑器中fuel_calc
,在…港口/外港选项卡,在解决列时,选择的复选框est_airflow
和fb_correction
。现在,每个import块从相应的信号对象获取代码生成设置。
或者,要创建信号对象并配置模型中的块和行,在命令提示符下,使用这些命令:
est_风流= Simuli金宝appnk.Signal;est_airflow.CoderInfo。StorageClass =“自定义”;est_airflow.CoderInfo。CustomStorageClass =“ExportToFile”;est_airflow.CoderInfo.CustomAttributes。老板=“airflow_calc”;fb_correction = 金宝appSimulink.Signal;fb_correction.CoderInfo。StorageClass =“自定义”;fb_correction.CoderInfo。CustomStorageClass =“ExportToFile”;fb_correction.CoderInfo.CustomAttributes。老板=“airflow_calc”;set_param (“airflow_calc / est_airflow”,“MustResolveToSignalObject”,“上”) set_param (“airflow_calc / fb_correction”,“MustResolveToSignalObject”,“上”) porthandle = get_param(“fuel_calc / est_airflow”,“portHandles”);outportHandle = portHandles.Outport;set_param (outportHandle“MustResolveToSignalObject”,“上”) porthandle = get_param(“fuel_calc / fb_correction”,“portHandles”);outportHandle = portHandles.Outport;set_param (outportHandle“MustResolveToSignalObject”,“上”)明确portHandlesoutportHandle
保存组件模型并从中生成代码sldemo_fuelsys_dd_controller
。的代码与之前的代码相同金宝app仿真软件。信号
对象。现在,您可以对信号对象进行更改,而不是对模型中的相应块和行进行更改。
save_system (“airflow_calc”) save_system (“fuel_calc”) rtwbuild (“sldemo_fuelsys_dd_controller”)
###开始构建模型过程:airflow_calc ###成功完成模型的构建过程:airflow_calc ###开始构建模型过程:fuel_calc ###成功完成模型的构建过程:fuel_calc ###开始构建模型过程:sldemo_fuelsys_dd_controller ###成功完成模型的构建过程:sldemo_fuelsys_dd_controller