这个例子展示了许多工具和技术构成与模型参考工作流管理数据。
基本介绍这个主题,请参阅:介绍管理数据与模型参考。
在这个例子中,仿真软件®和Simulink万博1manbetx®编码器™生成代码在当前目录中创建的代码生成的文件夹。如果你不想(或如果你不能)在这个目录生成文件,你应该改变你的工作目录。万博1manbetx仿真软件编码器需要生成模型参考二进制文件部署在独立的应用程序。
如果你计划来改变模型的例子:
1。保留其原始状态中的示例通过复制以下文件从你的MATLAB®安装目录,不改变他们的名字,一个不同的目录:
工具箱/模型/ 万博1manbetxsimdemos / simfeatures / modelreference / sldemo_mdlref_datamngt。基金工具箱/模型/ si万博1manbetxmdemos / simfeatures / modelreference / sldemo_mdlref_datamngt_wsdata。m工具箱/模型/ s万博1manbetximdemos / simfeatures / modelreference / sldemo_mdlref_counter_datamngt。基金工具箱/模型/ si万博1manbetxmdemos / simfeatures / modelreference / sldemo_mdlref_counter_datamngt_types。m工具箱/模型/ s万博1manbetximdemos / simfeatures / modelreference / sldemo_mdlref_counter_datamngt_wsdata.m
2。改变当前目录的目录复制这些文件。
3所示。继续示例。
open_system (“sldemo_mdlref_datamngt”)
这个例子使用一个顶级模型(sldemo_mdlref_datamngt
)包含三个模型块:Counter1, Counter2, Counter3。这些块引用相同的模型(sldemo_mdlref_counter_datamngt
)。
引用的模型实现了一个有限的计数器算法:
重置计数器如果第一个触发输入的变化
增加计数器由指定如果第二个输入变化量
饱和烃指定的上限和下限之间的对抗
参考模型输出总线信号,其中包含:
数:计数器的值作为一个8位整数
OverflowState:枚举值,用于显示计数器是上限,下限,或者范围
这个模型配置为显示大量的仿真软件特点一起工作:万博1manbetx
可调参数结构:收集变量变成一个MATLAB结构参数化模型。在这个例子中,引用模型的模型参数被定义为参数结构。
模型参数:不同的参数值传递给每个模型参考实例。
总线对象:定义结构的“形状”中使用信号和参数模型参考界面。定义类型名称的结构参数和信号生成的代码。
万博1manbetxSimulink.Bus.createMATLABStruct:静态方法创建一个MATLAB结构相匹配的形状总线对象。
总线初始化:使用一个参数结构初始化总线信号和状态。
戴面具的模型块:创建一个定制的界面模型参考块。
触发模型参考:显式控制调度的组件。
这个示例还使用其他功能用于管理数据模型:万博1manbetx
万博1manbetxSimulink.saveVars:序列化工作空间变量一个MATLAB脚本。万博1manbetx支持增量修改,数据差分和版本控制。
万博1manbetxSimulink.findVars:发现如何使用工作空间变量的模型。
示例中的一系列步骤如下:
1。准备引用的模型(sldemo_mdlref_counter_datamngt
)使用结构的外部接口信号和参数。
2。准备模型(顶部sldemo_mdlref_datamngt
)调用引用的模型。
3所示。模拟模型和检查结果。
4所示。生成代码创建一个独立的可执行模型。
引用的模型有两个模型参数(CounterParams CounterICs)块的参数化模型。模型参数提供不同的参数值的每个实例一个参考模型。在这个模型中,参数被定义为参数结构来减少参数被传递给引用的数量模型。
定义模型参数的过程如下:
1。打开引用模型(sldemo_mdlref_counter_datamngt
)。
2。定义MATLAB结构参数化被引用的模型。
CounterParams。增量= int8 (1);CounterParams。LowerLimit = int8 (-10);CounterParams。UpperLimit = int8 (10);
CounterICs。数= int8 (0);CounterICs。OverflowState = SlDemoRangeCheck.InRange;
注意:这个例子使用一个8位整数计数器,所以数值字段也使用8位整数。
3所示。使用MATLAB的结构模型参数。
模型参数被定义为变量的模型空间参考模型。您可以初始化模型工作区从不同的数据源。这个示例使用MATLAB脚本(sldemo_mdlref_counter_datamngt_wsdata
)来创建模型的参数结构参数。使用MATLAB脚本很容易创建和修改参数结构外的模型。它还有助于增量更改,版本控制和数据差分。
在对话框中设置数据源模型的工作区。
此外,您可以设置数据源从MATLAB命令行:
探测= get_param (“sldemo_mdlref_counter_datamngt”,“ModelWorkspace”);探测。数据源=“MATLAB文件”;探测。文件名=“sldemo_mdlref_counter_datamngt_wsdata.m”;hWS.reload;
您可以使用模型浏览器查看和编辑的内容模型的工作区。
选择复选框的论点来配置变量作为模型参数。
此外,您可以设置模型参数的列表从MATLAB命令行:
set_param (“sldemo_mdlref_counter_datamngt”,…“ParameterArgumentNames”,“CounterParams, CounterICs”);
4所示。探索如何引用模型使用模型参数。
许多块在参考模型中使用的模型参数:
一个常数块指定增量(CounterParams.Increment)。
各块在“范围检查”子系统使用上下极限的值(CounterParams。LowerLimit和CounterParams.UpperLimit)。
各种块使用计数器的初始条件(CounterICs.Count)。
根外港块使用初始条件结构(CounterICs)来初始化系统输出之前执行。
您可以使用万博1manbetxSimulink.findVars发现使用该模型参数的块。
paramInfo = 万博1manbetxSimulink.findVars (“sldemo_mdlref_counter_datamngt”,…“名字”,“CounterParams”);icInfo = 万博1manbetxSimulink.findVars (“sldemo_mdlref_counter_datamngt”,…“SearchMethod”,“缓存”,…“名字”,“CounterICs”);paramBlks = paramInfo。使用dByBlocks icBlks = icInfo.UsedByBlocks
paramBlks = 3 x1单元阵列{sldemo_mdlref_counter_datamngt /增量的}{sldemo_mdlref_counter_datamngt /范围检查/检测溢出的}{sldemo_mdlref_counter_datamngt /范围检查/饱和计数的}icBlks = 3 x1单元阵列{sldemo_mdlref_counter_datamngt /初始计数的}{sldemo_mdlref_counter_datamngt /前计数的}{' sldemo_mdlref_counter_datamngt /输出'}
注意:一旦你已经编译模型,您可以使用仿真软件。万博1manbetxfindVars检索“缓存”变量使用信息。
被引用的模型会产生两个结果并将它们打包到一个总线信号:
数:计数器的值作为一个8位整数
OverflowState:枚举值,用于显示计数器是上限,下限,或者范围
定义的总线类型的根输出参考模型:
1。使用公共汽车编辑器定义总线对象(OutputType)。
或者,您可以创建总线对象在MATLAB命令行:
OutputType = 万博1manbetxSimulink.Bus;OutputType。元素= Simulin万博1manbetxk.BusElement;OutputType.Elements (1)。Name =“数”;OutputType.Elements (1)。数据类型=“int8”;OutputType.Elements (2) =万博1manbetx Simulink.BusElement;OutputType.Elements (2)。Name =“OverflowState”;OutputType.Elements (2)。数据类型=“枚举:SlDemoRangeCheck”;
2。配置的根外港参考模型输出nonvirtual总线信号基于该总线对象(OutputType)。
此外,您可以设置块从MATLAB命令行参数:
set_param (“sldemo_mdlref_counter_datamngt /输出”,…“UseBusObject”,“上”,…“BusObject”,“OutputType”,…“BusOutputAsStruct”,“上”);
3所示。创建一个MATLAB脚本重新创建这个总线对象。
这个示例使用MATLAB脚本(sldemo_mdlref_counter_datamngt_types
)重新创建总线对象使用的参考模型。
您可以手动创建这个MATLAB脚本,或者使用万博1manbetxSimulink.saveVars:
万博1manbetxSimulink.saveVars (“sldemo_mdlref_counter_datamngt_types.m”,“OutputType”);
4所示。配置引用模型创建全局数据,它使用。
通常的做法是,重新创建所有的全局数据模型和类型,它使用。在这个例子中,模型的引用PreLoadFcn是用来执行的MATLAB脚本创建总线对象被引用的模型。引用的模型不使用任何全局变量。
设置模型的PreLoadFcn,打开模型属性从模型的对话框文件从MATLAB命令行菜单或设置它。
set_param (“sldemo_mdlref_counter_datamngt”,…“PreLoadFcn”,“sldemo_mdlref_counter_datamngt_types”);
5。模型中探索如何使用总线类型层次结构。
这种总线接口的一部分参考模型和被称为块的顶部和引用的模型。使用find_mdlrefs和万博1manbetxSimulink.findVars找出所有的地方这车对象层次结构模型中使用的参考。
模型= find_mdlrefs (“sldemo_mdlref_datamngt”);open_system(模型);varInfo = 万博1manbetxSimulink.findVars(模型,“名字”,“OutputType”);黑色= vars.UsedByBlocks
模型= 2 x1单元阵列{‘sldemo_mdlref_counter_datamngt} {‘sldemo_mdlref_datamngt}黑色= 7 x1单元阵列{sldemo_mdlref_counter_datamngt /初始计数的}{sldemo_mdlref_counter_datamngt /前计数的}{sldemo_mdlref_counter_datamngt /范围检查/总线创造者的}{' sldemo_mdlref_counter_datamngt /输出'}{' sldemo_mdlref_datamngt / Counter1 '} {' sldemo_mdlref_datamngt / Counter2 '} {' sldemo_mdlref_datamngt / Counter3 '}
一般来说,总线信号和状态的初始值可以指定为“0”,在这种情况下,所有的元素的汽车将被初始化为零(或相关的地面值)。然而,在某些情况下,它是可取的指定非零初始值对总线信号和状态。在这个例子中,计数器的初始条件是可调的,所以输出信号的初始值必须设置一致。
指定初始值的参考模型的输出:
1。创建一个参数结构与总线兼容的信号,你想要初始化。一个模型的参数(CounterICs)是一个参数结构的形状相匹配的输出信号。这个结构定义如下:
CounterICs。数= int8 (0);CounterICs。OverflowState = SlDemoRangeCheck.InRange;
或者,您可以使用静态方法,万博1manbetxSimulink.Bus.createMATLABStruct创建使用地面OutputType价值结构。
CounterICs = 万博1manbetxSimulink.Bus.createMATLABStruct (“OutputType”);
2。根外港打开对话框,输入名称的结构(CounterICs)初始输出字段。
此外,您可以设置块从MATLAB命令行参数:
set_param (“sldemo_mdlref_counter_datamngt /输出”,…“InitialOutput”,“CounterICs”);
注意:一般来说,初始化一个总线信号或状态时,参数结构不需要确切地匹配总线类型,但它的字段必须总线对象中的元素的一个子集,这些字段的属性必须匹配总线中的元素对象。
通常很有用面具引用模型定制用户界面。您可以创建一个面具在模型,然后从一个模型块引用它。面具模型,点击创建模型面具在模型浏览器的模型空间部分的模型。
当你引用一个戴面具的模型从一个模型块,块面具上自动生成模型。有关更多信息,请参见这个话题创建和引用一个戴面具的模型。
引用的模型配置为接受结构的模型参数。这个例子中调用的每个实例引用模型与不同的参数值。
1。打开顶部模型(sldemo_mdlref_datamngt
)。
2。创建参数结构和相同的“形状”模型中定义的参数引用的模型。
Param1。增量= int8 (1);Param1。LowerLimit = int8 (-20);Param1。UpperLimit = int8 (20);
Param2 = Param1;Param2。增量= int8 (2);
IC1。数= int8 (0);IC1。OverflowState = SlDemoRangeCheck.InRange;
IC2 = IC1;IC2。数= int8 (-10);
3所示。设置掩码参数对蒙面模型块使用这些参数。
例如,第一个模型的参数块(“sldemo_mdlref_datamngt / Counter1”
)设置为:
Param1为计数器参数
IC1为初始条件
此外,您可以设置块从MATLAB命令行参数:
set_param (“sldemo_mdlref_datamngt / Counter1”,…“CounterParams”,“Param1”,…“CounterICs”,“IC1”);
3所示。创建一个MATLAB脚本重新创建这些工作空间变量。
这个示例使用MATLAB脚本(sldemo_mdlref_datamngt_wsdata
)重新创建这些工作空间变量。
您可以手动创建这个MATLAB脚本,或者使用万博1manbetxSimulink.saveVars:
万博1manbetxSimulink.saveVars (“sldemo_mdlref_datamngt_wsdata.m”,“参数*”);
4所示。配置高级模型创建所有全局变量。
是一种很好的做法的顶级模特重新创建所有的全局数据和类型层次结构模型中使用参考。这个配置可以避免加载时引用的模型模拟模型。
在这个例子中,模型的顶部PreLoadFcn用于执行MATLAB脚本创建工作空间数据模型和类型引用的模型。不使用任何全局数据的参考模型。
set_param (“sldemo_mdlref_datamngt”,…“PreLoadFcn”,(“sldemo_mdlref_datamngt_wsdata;”,…“sldemo_mdlref_counter_datamngt_types”]);
正如前面提到的,引用的模型实现了一个有限的计数器算法有两个触发输入。算法检测到“上升的边缘”触发输入和反应如下:
重置计数器如果第一个触发输入的变化。
增加计数器由指定如果第二个输入变化量。
在这个例子中,你开的所有三个实例计数器算法相同的触发输入,刺激产生的子系统。的时间和样本输入定义的触发器输入值的面具刺激子系统的参数:
复位计数器每4秒。
增加计数器每秒5次(时间= 0.2秒)。
样品时间是0.1秒。
注意:重置和增量时间必须至少2次样品的时间。
1。保存或关闭参考模型。
你需要保存引用的模型之前,可以使用模型。或者,您可以关闭引用模型的模型和使用原始的版本提供了这个例子。
2。模拟模型通过选择顶部模拟>运行。
sim (“sldemo_mdlref_datamngt”)
注意:模拟模型自动生成一个顶部模拟目标引用的模型。
3所示。查看仿真结果显示的范围。
生成代码并构建一个独立的可执行模型选择代码>C / c++代码>构建模型。
rtwbuild (“sldemo_mdlref_datamngt”)
注意:高级模型生成代码时,仿真软件编码器自动生成代码引用的模型。万博1manbetx使用嵌入式编码器™为生产部署生成嵌入代码。
默认情况下,仿真软件编码万博1manbetx器生成一个自动命名为参数的类型结构。这个名字是独一无二的,确定的,但不是很容易辨认。通过使用仿真软件可以控制这种类型的名字。万博1manbetx参数对象定义的参数结构和仿真软件。万博1manbetx总线对象定义类型。
1。定义的总线类型模型参数使用公共汽车编辑器或通过输入以下命令在MATLAB命令行:
CounterParamType = 万博1manbetxSimulink.Bus;CounterParamType。元素= Simulin万博1manbetxk.BusElement;CounterParamType.Elements (1)。Name =“增量”;CounterParamType.Elements (1)。数据类型=“int8”;CounterParamType.Elements (2) =万博1manbetx Simulink.BusElement;CounterParamType.Elements (2)。Name =“LowerLimit”;CounterParamType.Elements (2)。数据类型=“int8”;CounterParamType.Elements (3) =万博1manbetx Simulink.BusElement;CounterParamType.Elements (3)。Name =“UpperLimit”;CounterParamType.Elements (3)。数据类型=“int8”;
2。修改现有的MATLAB脚本重新创建这个总线对象。
这辆公共汽车类型必须定义在基工作区,随着总线类型参考模型的输出。您可以手动修改的MATLAB脚本定义了类型或使用的参考模型万博1manbetxSimulink.saveVars将这个变量附加到现有的MATLAB脚本。
万博1manbetxSimulink.saveVars (“sldemo_mdlref_counter_datamngt_types.m”,“CounterParamType”,“添加”);
3所示。创建模型。万博1manbetx参数定义模型参数。
将总线类型与模型参数,您必须使用仿真软件。万博1manbetx参数对象的引用模型的MATLAB结构模型中的工作空间。
CounterParams = 万博1manbetxSimulink.Parameter;CounterParams.Value。增量= 1;CounterParams.Value。LowerLimit = -10;CounterParams.Value。UpperLimit = 10;CounterParams。数据类型=“巴士:CounterParamType”;
CounterICs = 万博1manbetxSimulink.Parameter;CounterICs.Value。数= 0;CounterICs.Value。OverflowState = SlDemoRangeCheck.InRange;CounterICs。数据类型=“巴士:OutputType”;
注意:当你设定一个参数对象的数据类型是一个公共汽车,你可以使用双精度值参数的数值字段结构。万博1manbetx仿真软件将这些双精度值转换为适当的数值数据类型在编译模型。
您可以手动修改的MATLAB脚本定义了模型参数或使用万博1manbetxSimulink.saveVars更新现有的MATLAB脚本。
万博1manbetxSimulink.saveVars (“sldemo_mdlref_counter_datamngt_wsdata.m”,“- update”);
注意:当你使用- update选项,您不需要指定变量,因为写的万博1manbetxSimulink.saveVars只写变量的值已经在MATLAB脚本中定义的。
5。重新加载的内容模型的工作区。
你有修改数据源引用模型所使用的工作区。如果这个模型是开放的,你必须重新加载的内容模型的工作区。
您可以通过使用模型空间的重新加载对话框或MATLAB命令行。
探测= get_param (“sldemo_mdlref_counter_datamngt”,“ModelWorkspace”);hWS.reload;
您可以使用类似的方法将参数结构顶部模型使用模型。万博1manbetx参数对象。这个配置给你控制类型名称和使您能够控制这些参数出现在生成的代码中。
1。创建模型。万博1manbetx参数ExportedGlobal存储类的对象来定义参数结构顶部模型导出,可调变量在生成的代码中。
Param1 = 万博1manbetxSimulink.Parameter;Param1.Value。增量= 1;Param1.Value。LowerLimit = -10;Param1.Value。UpperLimit = 10;Param1。数据类型=“巴士:CounterParamType”;Param1.CoderInfo。StorageClass =“ExportedGlobal”;
Param2 = Param1.copy;Param2.Value。增量= 2;
IC1 = 万博1manbetxSimulink.Parameter;IC1.Value。数= 0;IC1.Value。OverflowState = SlDemoRangeCheck.InRange;IC1。数据类型=“巴士:OutputType”;IC1.CoderInfo。StorageClass =“ExportedGlobal”;
IC2 = IC1.copy;IC2.Value。数= -10;
2。修改现有的MATLAB脚本重新创建这些工作空间变量。
您可以手动修改的MATLAB脚本定义了参数模型或使用万博1manbetxSimulink.saveVars更新现有的MATLAB脚本。
万博1manbetxSimulink.saveVars (“sldemo_mdlref_datamngt_wsdata.m”,“- update”);
注意:当你使用- update选项,您不需要指定变量,因为写的万博1manbetxSimulink.saveVars只写变量的值已经在MATLAB脚本中定义的。
生成代码并构建一个独立的可执行模型选择代码>C / c++代码>构建模型。