迁移模型以使用 Simulink 数据字典
Simulink® 数据字典持久性地存储模型数据,包括 MATLAB® 变量、数据对象和数据类型。有关数据字典的基本信息,请参阅什么是数据字典?。
迁移单个模型以使用字典
将单个独立模型链接到单个数据字典。
打开一个将设计数据加载到基础工作区中的模型。
将模型的一个副本保存到您的当前文件夹。打开副本。
在 Simulink 编辑器中,在建模选项卡上,在设计下,点击链接到数据字典。
在模型属性对话框中,点击新建以创建数据字典。
命名该数据字典,保存它,然后点击应用。
点击迁移数据。
在出现关于复制引用变量的消息时,点击迁移。
(可选)清除允许模型访问基础工作区。
点击确定。
要打开字典,请在 Simulink 编辑器中,点击左下角的模型数据标记 ,然后点击外部数据链接。要检查字典的内容,请在模型资源管理器的模型层次结构窗格中的外部数据节点下,展开字典节点。
注意
Simulink 不会将 Timeseries 对象等仿真数据导入数据字典中。
迁移模型引用层次结构以使用字典
以下示例说明如何将父模型及其所有引用模型链接到单个数据字典。
打开
sldemo_mdlref_datamngt
模型。openExample('sldemo_mdlref_datamngt')
sldemo_mdlref_datamngt
模型引用sldemo_mdlref_counter_datamngt
。将模型的副本保存到您的当前文件夹。
打开顶层模型
sldemo_mdlref_datamngt
。在 Simulink 编辑器中,在建模选项卡上,在设计下,点击链接到数据字典。
在模型属性对话框中,点击新建以创建数据字典。
命名该数据字典,保存它,然后点击应用。
在出现消息提示您链接尚未使用字典的引用模型时,点击更改所有模型。
点击迁移数据。
在出现关于复制引用变量的消息时,点击迁移。
(可选)清除允许模型访问基础工作区。
点击确定。
迁移到数据字典之前的注意事项
将模型链接到数据字典后,可以选择将数据从基础工作区迁移到字典中。如果您选择迁移数据,请考虑这些注意事项。
检查数据加载回调
您可以使用模型回调(例如 PreLoadFcn
回调)在加载模型时将设计数据从文件加载到基础工作区中。例如,以下回调从 MAT 文件 myData.mat
中加载设计数据。
load myData
迁移到数据字典后,这些回调会继续将设计数据加载到基础工作区中。由于模型稍后会从字典中导出设计数据,请手动删除或注释掉这些数据加载回调。
您可以使用依存关系分析器来查找数据加载回调。请参阅Analyze Model Dependencies。
检查脚本
默认情况下,新模型可以访问基础工作区,链接到数据字典时也不会失去访问权限。在编写脚本时,必须假设模型可以访问基础工作区、数据字典或两者。
如果使用脚本中的句柄 base
对基础工作区进行显式引用,请考虑更改这些引用。
请参考如下示例。此处,脚本在基础工作区中搜索变量 sensor
,并根据 sensor.noiseEnable
的值设置参数 enable
。
if evalin('base','sensor.noiseEnable') enable = 'Enabled'; else enable = 'Disabled'; end
迁移到数据字典时,请替换这些对 base
的显式引用,如下所示:
if Simulink.data.evalinGlobal(myExampleModel,... 'sensor.noiseEnable') enable = 'Enabled'; else enable = 'Disabled'; end
Simulink.data.evalinGlobal
函数计算指定模型的全局作用域内的一个表达式。此处,如果模型未链接到字典,则全局作用域可以是数据字典或基础工作区。检查代码生成的可调参数
如果模型链接到数据字典,但模型没有对基础工作区的访问权限(请参阅继续使用基础工作区的共享数据),则 Simulink 将忽略在“模型参数配置”对话框中指定的存储类信息。
如果使用 Simulink 接口迁移模型以使用数据字典,并选择迁移基础工作区数据,则 Simulink 会同时迁移模型的存储类信息。如果模型包含基础工作区中变量的存储类信息,则 Simulink 会在迁移期间将这些变量转换为
Simulink.Parameter
对象。然后,Simulink 使用来自模型的存储类信息设置这些Simulink.Parameter
对象的存储类。如果将此模型迁移回基础工作区,则 Simulink 不会还原模型中的存储类信息。要保留这些变量的存储类,请使用来自数据字典的参数对象。您还可以手动重置模型中的存储类信息。
如果从命令行设置模型的
DataDictionary
属性,则可以使用tunablevars2parameterobjects
函数将可调参数转换为Simulink.Parameter
对象。
有效的设计数据类
在 Simulink 数据字典的设计数据部分中,您可以导入、存储或创建使用 Simulink 支持的数据类型(如 boolean
和 int32
)的 MATLAB 变量以及结构体。您还可以使用以下类的对象和对这些类创建子类的大多数类的对象:
Simulink.AliasType
Simulink.Bus
Simulink.NumericType
Simulink.Parameter
Simulink.LookupTable
Simulink.Breakpoint
Simulink.Signal
Simulink.ValueType
Simulink.VariantExpression
Simulink.data.dictionary.EnumTypeDefinition
embedded.fi
embedded.fimath
numlti
此外,您还可以在 Simulink 数据字典的配置部分中导入、存储或创建以下类的配置对象:
无效的其他数据类
您可以在 Simulink 数据字典的其他数据部分中导入、存储或创建许多内置和自定义类或数据类型的数据对象,但以下各项除外:
基于内置或自定义类创建的对象数组
具有使用以下任一名称的属性的自定义类:
LastModified
LastModifiedBy
DataSource
Status
Variant
使用 From Workspace 模块进行迁移
如果模型包含引用基础工作区中变量的 From Workspace 模块,则可以将该模型迁移到数据字典。但是,根据模块引用的变量的性质,迁移过程采取不同操作:
如果变量的值不是
timeseries
对象,则迁移过程会将变量导入数据字典的“设计数据”部分。该模块仍可以引用该变量。如果变量的值是
timeseries
对象(数据字典无法存储该对象),或是具有与 timeseries 对象相同字段的结构体,则迁移过程不会导入该变量。当您之后尝试更新图或仿真模型时,From Workspace 模块将找不到该变量并引发错误。在这种情况下,您可以使用evalin
函数将模块配置为引用基础工作区变量。有关详细信息,请参阅 From Workspace。
数据字典限制
Simulink 不能自动将仅由非活动变体模型使用的变量迁移到数据字典中。
您不能将某些类型的设计数据(如
matlab.metadata.Class
对象和timeseries
对象)导入数据字典的“设计数据”部分中。Simulink 不允许对链接到数据字典的模型进行隐式信号解析。要使用数据字典,请将模型配置参数信号解析设置为仅显式或无。
如果模型引用层次结构已链接到数据字典,您可以对作为层次结构一部分的引用模型进行保护。但是,如果迁移包含受保护模型的模型引用层次结构,则仿真将失败。
换句话说,需要先迁移该模型以使用数据字典,然后再进行模型保护。
可能不支持计算包含存储在数据字典中的 Simulink 变量或数据类型的表达式。
继续使用基础工作区的共享数据
您可以通过以下方式继续将共享数据存储在基础工作区中,并将特定于模型的数据存储在数据字典中:
为模型启用对基础工作区的访问。
允许从数据字典访问基础工作区。
要为模型启用对基础工作区的访问,请在“模型属性”对话框的外部数据选项卡上,选择允许模型访问基础工作区。对于新模型,默认情况下此复选框处于选中状态。如果模型未链接到数据字典,则必须选中此选项。
您还可以允许从数据字典访问基础工作区。对于现有字典,在模型资源管理器中,选择允许字典访问基础工作区。
当您允许从数据字典访问基础工作区时,存在下列限制和影响:
通常,您不能通过字典与基础工作区数据进行交互。
在模型资源管理器中检查字典的内容时,您不能看到基础工作区数据。要与基础工作区数据交互,请在模型层次结构窗格中,选择基础工作区节点。
使用数据字典的编程接口时(请参阅以编程方式将数据存储到字典中),要与基础工作区数据进行交互,您只能将以下函数与
Simulink.data.dictionary.Section
对象结合使用:assignin
exist
evalin
请考虑改为使用
Simulink.data.assigninGlobal
等函数。请参阅转移为使用数据字典。
更改跟踪功能(例如查看和还原对字典条目的更改的功能,请参阅View and Revert Changes to Dictionary Entries)不适用于基础工作区数据。
从字典导出数据时(请参阅Import and Export Dictionary Data),Simulink 会忽略基础工作区数据。
Simulink 将基础工作区和字典视为单个命名空间。不过,您可以使用相同的名称定义两个变量,即在基础工作区中定义一个,在字典中定义另一个。在这种情况下,变量必须相同,并且使用字典中的那个变量。
迁移具有共享数据的复杂模型层次结构
有关示例,请参阅 Partition Data for Model Reference Hierarchy Using Data Dictionaries。