Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

迁移模型以使用 Simulink 数据字典

Simulink® 数据字典持久性地存储模型数据,包括 MATLAB® 变量、数据对象和数据类型。有关数据字典的基本信息,请参阅什么是数据字典?

迁移单个模型以使用字典

以下示例说明如何将单个独立模型链接到单个数据字典。

注意

Simulink 不会将 Timeseries 对象等仿真数据导入数据字典中。

  1. 打开 f14 模型,这会将设计数据加载到基础工作区中。

  2. 将模型的一个副本保存到您的当前文件夹。打开副本。

  3. 在 Simulink 编辑器中,在建模选项卡上,在设计下,点击链接到数据字典

  4. 模型属性对话框中,点击新建以创建数据字典。

  5. 命名该数据字典,保存它,然后点击应用

  6. 点击迁移数据

  7. 在出现关于复制引用变量的消息时,点击迁移

  8. (可选)清除允许模型访问基础工作区

  9. 点击确定

  10. 要打开字典,请在 Simulink 编辑器中,点击左下角的模型数据标记 ,然后点击外部数据链接。要检查字典的内容,请在模型资源管理器的模型层次结构窗格中的外部数据节点下,展开字典节点。

迁移模型引用层次结构以使用字典

以下示例说明如何将父模型及其所有引用模型链接到单个数据字典。

  1. 打开 Introduction to Managing Data with Model Reference 示例中的 sldemo_mdlref_datamngt 模型。

    openExample('sldemo_mdlref_datamngt')
    sldemo_mdlref_datamngt 模型引用 sldemo_mdlref_counter_datamngt

  2. 将模型的副本保存到您的当前文件夹。

  3. 打开顶层模型 sldemo_mdlref_datamngt

  4. 在 Simulink 编辑器中,在建模选项卡上,在设计下,点击链接到数据字典

  5. 模型属性对话框中,点击新建以创建数据字典。

  6. 命名该数据字典,保存它,然后点击应用

  7. 在出现消息提示您链接尚未使用字典的引用模型时,点击更改所有模型

  8. 点击迁移数据

  9. 在出现关于复制引用变量的消息时,点击迁移

  10. (可选)清除允许模型访问基础工作区

  11. 点击确定

迁移到数据字典之前的注意事项

将模型链接到数据字典后,可以选择将数据从基础工作区迁移到字典中。如果您选择迁移数据,请考虑这些注意事项。

检查数据加载回调

您可以使用模型回调(例如 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 会在模型引用层次结构的数据源中多次定义符号时报告错误。但是,在以下情况下,重复的数据定义可以存在于层次结构中:

  • 层次结构中的每个模型只能看到一个定义。

  • 层次结构中各模型的定义是相同的。

通过将模型参数 EnforceDataConsistency 设置为 off,可以放宽第二个条件。

set_param(bdroot,'EnforceDataConsistency','off');

使用此参数设置时,只要满足第一个条件,当前模型及其在模型层次结构中的下级模型就可以使用名称相同但值不同的符号。此设置允许您更轻松地集成 Simulink 模型以进行大规模仿真。

默认情况下,EnforceDataConsistency 参数设置为 on。对于模型,您不能将 EnforceDataConsistency 设置为 on,除非其每个引用模型及其变体也将 EnforceDataConsistency 设置为 on

仅当在普通模式下仿真模型时才禁用一致性检查。将 EnforceDataConsistency 设置为 off 会导致以下错误:

  • 代码生成

  • SIL 和 PIL 仿真

  • 包含一个或多个在加速或快速加速模式下运行的模型的模型层次结构的仿真

  • 受保护模型的仿真

有关详细信息,请参阅确定在何处存储 Simulink 模型的变量和对象

有效的设计数据类

在 Simulink 数据字典的设计数据部分中,您可以导入、存储或创建使用 Simulink 支持的数据类型(如 booleanint32)的 MATLAB 变量以及结构体。您还可以使用以下类的对象和对这些类创建子类的大多数类的对象:

  • Simulink.AliasType

  • Simulink.Bus

  • Simulink.NumericType

  • Simulink.Parameter

  • Simulink.LookupTable

  • Simulink.Breakpoint

  • Simulink.Signal

  • Simulink.ValueType

  • Simulink.Variant

  • 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 不能自动将仅由非活动变体模型使用的变量迁移到数据字典中。

  • 您不能将某些类型的设计数据(如 meta 类对象和 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

另请参阅

相关主题