文档

使用数据字典为模型引用层次结构划分数据

当您使用模型引用将大型模型系统分解为较小的组件和子组件时,您可以创建数据字典来隔离设计数据。设计数据是模型用来指定块参数和信号特征的工作空间变量集。有关数据字典的基本信息,请参见什么是数据字典?

你可以迁移模型引用层次结构中的所有模型来使用一个或多个数据字典,使用以下技术中的任何一种:

  • 一次性迁移层次结构中的所有模型,以使用单个字典。然后,创建单独的引用字典来组织设计数据。

  • 从层次结构底部的模型开始进行增量迁移。如果您不能一次迁移所有的模型,请使用此技术。

为每个组件创建一个字典

这个例子展示了如何将设计数据划分到字典中。完成后,系统中的每个组件和子组件都有一个字典,字典引用允许组件和子组件共享数据。

探索示例模型层次结构

  1. 导航到文件夹matlabroot/帮助/工具/模型/例子万博1manbetx(打开)

  2. 将这些文件复制到可写文件夹:

    • ProjectData_Contr.mat

    • ProjectData_ContrSub1.mat

    • ProjectData_ContrSub2.mat

    • ProjectData_ContrSubs.mat

    • ProjectData_Plant.mat

    • ProjectData_System.mat

    • ex_SystemModel

    • ex_PlantComp_Lvl1

    • ex_PlantComp_Lvl2

    • ex_ContrComp

    • ex_ContrComp_Sub1_Lvl1

    • ex_ContrComp_Sub1_Lvl2

    • ex_ContrComp_Sub2_Lvl1

    • ex_ContrComp_Sub2_Lvl2

  3. 加载mat文件以在基本工作空间中创建设计数据。

  4. 打开示例模型ex_SystemModel。该模型位于包含其他示例模型的引用层次结构的顶部。

  5. 选择分析>模型的依赖性>模型依赖关系查看器>模型只。模型引用层次结构包含一个系统模型、一个具有两个模型的工厂组件和一个控制器组件。控制器组件包含两个子组件,每个子组件由两个模型组成。

  6. 在模型中,更新图。模型中的每个总线信号都使用万博1manbetx仿真软件。公共汽车对象作为数据类型。的对象,SensorBusCtrlBus,都在基本工作区中。

    参考模型ex_PlantComp_Lvl1ex_ContrComp将总线对象用于根级输入和输出,这意味着工厂和控制器组件共享对象。

  7. 在基本工作区中,双击万博1manbetx仿真软件。NumericType对象命名FloatType。控制器组件中的信号、参数和其他数据项使用这种共享数据类型。

  8. 在模型资源管理器模型层次结构窗格中,展开节点ex_SystemModel。

    出现SimConfigSet的节点引用。SimConfigSet是一个万博1manbetx仿真软件。ConfigSet基本工作区中的对象。为了保持仿真的配置参数一致性,层次结构中的所有模型都引用SimConfigSet

  9. 右键单击节点Controller (ex_ContrComp)并选择开放

  10. 在模型资源管理器模型层次结构窗格中,展开新节点ex_ContrComp。展开节点模型(ex_ContrComp_Sub1_Lvl1)。

    出现对CodeGenConfigSet的节点引用。CodeGenConfigSet是一个万博1manbetx仿真软件。ConfigSet基本工作区中的对象。为了保持代码生成的配置参数的一致性,控制器组件中的模型引用CodeGenConfigSet。植物组件中的模型不使用CodeGenConfigSet

  11. 模型层次结构窗格中,选择基本工作空间。在内容窗格中,右键单击该变量diff并选择找到使用的地方。在选择一个系统对话框,选择ex_SystemModel并点击好吧。如果您看到关于更新关系图的消息,请单击好吧

    内容窗格,变量diff常数模型中的块ex_ContrComp_Sub1_Lvl1ex_ContrComp_Sub1_Lvl2,它们组成了第一个控制器子组件。类似地,层次结构中的其他模型共享基本工作区变量多项式系数初始化μ,ρ

该表显示了在基本工作区中共享每个变量的模型。

变量名 使用变量的模型 共享范围
CtrlBus 工厂和控制器组件中的顶级模型 整个系统全局共享
SensorBus 工厂和控制器组件中的顶级模型 整个系统全局共享
SimConfigSet 层次结构中的所有模型 整个系统全局共享
ρ ex_PlantComp_Lvl2ex_ContrComp_Sub1_Lvl2,ex_ContrComp_Sub2_Lvl2 整个系统全局共享
μ ex_PlantComp_Lvl1ex_PlantComp_Lvl2 由植物组件中的模型共享
FloatType 控制器组件中的所有模型 由控制器组件和子组件共享
CodeGenConfigSet 控制器组件中的所有模型 由控制器组件和子组件共享
初始化 ex_ContrComp_Sub1_Lvl2ex_ContrComp_Sub2_Lvl1 由控制器子组件共享
diff ex_ContrComp_Sub1_Lvl1ex_ContrComp_Sub1_Lvl2 在第一个控制器子组件中由模型共享
多项式系数 ex_ContrComp_Sub2_Lvl1ex_ContrComp_Sub2_Lvl2 由第二控制器子组件中的模型共享

假设有三个开发人员团队维护工厂组件和两个控制器子组件。您可以使用数据字典来存储共享设计数据并确定其范围。

创建系统字典

  1. 在模型中ex_SystemModel中,选择文件>模型属性>数据字典链接

  2. 在对话框中,在模型为中,选择数据字典。点击

  3. 将新字典名称设置为系统并点击保存

  4. 模型属性对话框,单击好吧

  5. 点击好吧响应关于迁移引用变量的消息。

  6. 点击是的响应关于从基本工作区删除导入项的消息。

  7. 保存模型。

您可以从层次结构中的模型模拟和生成代码。层次结构中的所有模型都链接到字典。基本工作空间中的所有变量现在都位于新字典中System.sldd

创建植物成分字典

  1. 打开模型ex_PlantComp_Lvl1

  2. 选择文件>模型属性>数据字典链接

  3. 在对话框中,在模型为,点击

  4. 将新字典名称设置为植物并点击保存

  5. 模型属性对话框,单击好吧

  6. 作为对消息的响应,单击移动数据

  7. 点击是的响应关于迁移数据的消息。

  8. 保存模型。

植物组件中的模型,ex_PlantComp_Lvl1ex_PlantComp_Lvl2,都链接到新词典Plant.sldd。层次结构中的其他模型仍然被链接到System.sldd。因为这个模型ex_PlantComp_Lvl1使用全局共享变量,例如CtrlBusSensorBus时,迁移过程将这些变量移动到Plant.sldd。然而,System.sldd现在引用Plant.sldd,因此层次结构中的所有模型都可以继续使用全局共享变量。

植物模型共有的变量,μ,也居住在Plant.sldd。控制器模型共享的其他变量,例如初始化diff,留在System.sldd

plant组件可以独立于系统的其他部分,因为它的所有数据都在Plant.sldd。但是,控制器组件依赖于也存储在中的共享数据Plant.sldd

为控制器组件创建字典

打开模型ex_ContrComp,即控制器组件中的顶模型。将此模型链接到名为Contr.sldd。然后,保存模型。

完成后,将链接到控制器组件中的五个模型Contr.sldd。因为全局共享变量,比如CtrlBusSensorBus仍然存在于字典中Plant.sldd字典Contr.sldd参考文献Plant.sldd。由于这一引用,控制器组件中的模型可以继续使用全局共享变量。

控制器模型共享的变量,例如diff初始化,CodeGenConfigSet,现在居住在Contr.sldd

为第一个控制器子组件创建字典

打开模型ex_ContrComp_Sub1_Lvl1。将此模型链接到名为ContrSub1.sldd。然后,保存模型。

当你完成时,第一个控制器子组件中的模型,ex_ContrComp_Sub1_Lvl1ex_ContrComp_Sub1_Lvl2,都与ContrSub1.sldd。第二个子组件中的模型仍然链接到字典Contr.sldd

为第二个控制器子组件创建字典

打开模型ex_ContrComp_Sub2_Lvl1。将此模型链接到名为ContrSub2.sldd。然后,保存模型。

控制器字典Contr.sldd引用子组件字典,ContrSub1.slddContrSub2.sldd。因此,控制器字典和控制器组件中的顶层模型(ex_ContrComp)可以使用这些子组件字典中定义的所有数据。

第一个子组件字典,ContrSub1.sldd,定义子组件共享的数据,例如CodeGenConfigSet。第二个子组件字典,ContrSub2.sldd、引用ContrSub1.sldd这样第二个子组件中的模型就可以使用这个共享数据。

子组件字典ContrSub1.slddContrSub2.sldd参考Plant.sldd。因此,层次结构中的所有模型都可以继续使用全局共享的变量,例如SensorBusSimConfigSet,存储在Plant.sldd

检查数据存储

在模型资源管理器模型层次结构窗格中,选择字典节点“System”。在内容窗格中查看的内容System.sldd,按显示当前系统和以下按钮。将显示“设计数据”和“配置”部分的内容。

数据源列显示每个字典存储的变量和对象。

所有全局共享的变量,例如CtrlBusSensorBus居住在Plant.sldd。的变量初始化,这两个控制器子组件共享ContrSub1.sldd。由于迁移过程创建了字典引用,组件和子组件仍然可以共享这些变量。

如果分配给控制器组件的开发团队必须对全局共享变量进行更改,那么他们必须访问工厂字典文件。类似地,如果分配给第二个控制器子组件的团队必须对变量进行更改初始化,它们必须访问第一个子组件字典文件。

使用参考字典优化数据共享

共享全局变量,例如CtrlBus,SensorBus通过明确定义变量范围,可以创建引用字典。添加新字典作为对所有需要共享数据的组件和子组件字典的引用。

  1. 关闭所有已打开的模型。

    bdclose所有

  2. 在模型资源管理器中,选择文件>>数据字典

  3. 将新字典名称设置为GlobalShare并点击保存

  4. 模型层次结构窗格中,选择节点ContrSub2。在“对话框”窗格中引用Dictionares,点击添加

  5. 双击GlobalShare.sldd

  6. 模型层次结构窗格中,右键单击节点ContrSub2并选择保存更改

  7. 添加GlobalShare.sldd作为字典的参考ContrSub1.slddPlant.sldd。添加引用后保存每个字典。

  8. 模型层次结构窗格中,选择节点“系统”。

  9. 内容窗格中,选择全局共享变量:

    • CtrlBus

    • SensorBus

    • SimConfigSet

    • ρ

  10. 数据源列,选择GlobalShare.sldd对于任意一个选定的变量。

    所有的变量从Plant.slddGlobalShare.sldd

  11. 保存对字典的更改System.sldd

现在,如果三个开发团队中的任何一个需要对全局共享变量进行更改,例如SimConfigSetCtrlBus,他们可以访问字典GlobalShare.sldd。这个字典只包含系统中所有模型共享的变量。因为组件和子组件字典Plant.slddContrSub1.sldd,ContrSub2.sldd所有都引用全局共享字典GlobalShare.sldd,层次结构中的所有模型都可以使用该数据。

要进一步划分共享数据并确定其范围,请创建另一个引用字典来包含控制器子组件共享的变量。

  1. 在模型资源管理器中,选择文件>>数据字典

  2. 将新字典名称设置为ContrShare并点击保存

  3. 模型层次结构窗格中,选择字典节点ContrSub2。在“对话框”窗格中引用字典中,选择添加

  4. 在对话框中,双击ContrShare.sldd

  5. 模型层次结构窗格中,右键单击节点ContrSub2并选择保存更改

  6. 添加ContrShare.sldd作为参考ContrSub1.sldd然后保存字典ContrSub1.sldd

  7. 添加GlobalShare.sldd作为参考ContrShare.sldd然后保存字典ContrShare.sldd

  8. 模型层次结构窗格中,选择节点“系统”。

  9. 内容窗格中,选择以下变量:

    • CodeGenConfigSet

    • 初始化

    • FloatType

  10. 数据源列,选择ContrShare.sldd对于任意一个选定的变量。

    所有选定的变量从ContrSub1.slddContrShare.sldd

  11. 保存对字典的更改System.sldd

要进一步优化字典层次结构,请删除迁移过程创建的不必要引用。另外,删除您从中创建的不必要的引用ContrSub1.slddContrSub2.slddGlobalShare.sldd。因为ContrShare.sldd参考文献GlobalShare.sldd,控制器子组件字典中可以使用的数据GlobalShare.sldd没有直接引用GlobalShare.sldd

  1. 在模型资源管理器模型层次结构窗格中,选择字典节点控制器。在“对话框”窗格中,在引用字典列表中,选择“种植”,单击删除。将更改保存为Contr.sldd

  2. 删除对GlobalShare.slddPlant.slddContrSub1.sldd。将更改保存到ContrSub1.sldd

  3. 删除对GlobalShare.slddPlant.sldd,ContrSub1.slddContrSub2.sldd。将更改保存到ContrSub2.sldd

检查字典层次结构

要查看整个字典和模型层次结构,您可以在Simulink中执行依赖项分析万博1manbetx®项目。

  1. 打开已保存的模型ex_SystemModel。选择文件>万博1manbetx仿真软件项目>从模型创建项目

  2. 中为项目指定名称项目名称盒子。点击创建

  3. 2 .在“Si万博1manbetxmulink项目”中,单击依赖关系分析。点击分析

系统模型,ex_SystemModel,链接到字典System.sldd。植物组件、控制器组件和控制器子组件都链接到一个单独的字典。这些字典形成了一个参考层次结构。要访问共享数据,组件字典和子组件字典会引用这些字典ContrShare.slddGlobalShare.sldd

要检查字典中的数据,请使用Model Explorer。

  1. 在保存的模型中ex_SystemModel,单击数据字典徽章

  2. 在模型资源管理器模型层次结构窗格中的字典节点下,选择设计数据节点。

  3. 内容窗格中,单击列名数据源对设计数据进行排序。层次结构中的字典根据每个变量的共享作用域对变量进行分区。

    还可以右键单击列名并选择按此专栏分组根据定义条目的字典对条目进行分组。

  4. 模型层次结构窗格中,在节点“系统”下,单击节点的“配置信息”。在内容窗格中,万博1manbetx仿真软件。ConfigSet对象CodeGenConfigSet存储在控制器组件的共享字典中。SimConfigSet存储在全局共享字典中。

增量地将模型层次结构迁移到字典

在基于团队的开发环境中,如果您不能一次迁移模型引用层次结构中的所有模型,那么您可以在层次结构的底部迁移单个模型或组件。随着时间的推移,您可以一次提升一个模型或组件的整个层次结构。在每个中间阶段,您可以继续从模型开发、模拟和生成代码。

如果使用这种技术,必须从层次结构底部的模型和组件开始。在引用模型的层次结构中,如果任何模型链接到数据字典,那么它下面的所有模型也必须链接到数据字典。

在这个例子中为每个组件创建一个字典,将组件和子组件的层次结构从基本工作空间迁移到从顶层模型开始的数据字典中。这个示例展示了如何实现相同的结束状态,从层次结构底部的子组件开始迁移过程。要与仍然使用基本工作空间的其他模型共享数据,您可以配置新的字典来提供对基本工作空间的访问(参见继续在基本工作区中使用共享数据).

探索示例模型层次结构

  1. 导航到文件夹matlabroot/帮助/工具/模型/例子万博1manbetx(打开)

  2. 将这些文件复制到可写文件夹:

    • ProjectData_Contr.mat

    • ProjectData_ContrSub1.mat

    • ProjectData_ContrSub2.mat

    • ProjectData_ContrSubs.mat

    • ProjectData_Plant.mat

    • ProjectData_System.mat

    • ex_SystemModel

    • ex_PlantComp_Lvl1

    • ex_PlantComp_Lvl2

    • ex_ContrComp

    • ex_ContrComp_Sub1_Lvl1

    • ex_ContrComp_Sub1_Lvl2

    • ex_ContrComp_Sub2_Lvl1

    • ex_ContrComp_Sub2_Lvl2

  3. 加载mat文件以在基本工作空间中创建设计数据。

  4. 打开示例模型ex_SystemModel。该模型位于包含其他示例模型的引用层次结构的顶部。

    有关模型和基本工作区数据的其他说明,请参见探索示例模型层次结构

为第二个控制器子组件创建数据字典

假设只有负责第二个控制器子组件的团队准备将他们的模型迁移到数据字典中。您可以独立地迁移这两个模型,而将其他模型单独留在层次结构中。

  1. 打开ex_ContrComp_Sub2_Lvl1模型。该模型位于第二个子组件的顶部。

  1. 选择文件>模型属性>数据字典链接

  2. 在对话框中,在模型为中,选择数据字典并点击

  3. 将新字典名称设置为ContrSub2并点击保存

  4. 模型属性对话框,单击好吧

  5. 将模型链接到数据字典对话框中,取消选中复选框,单击好吧。清除复选框后,Simulink不会将数据从基本工作区迁移万博1manbetx到字典。

  6. 点击好吧模型属性对话框,然后保存模型。

使用此配置,所有现有数据仍然驻留在基本工作区中。当你和其他团队成员为第二个控制器子组件创建新数据时:

  • 如果一段数据只被子组件使用,你可以在新字典中创建它,ContrSub2.sldd

  • 如果其他组件或子组件需要使用一段数据,您可以在基本工作区中创建它。

为第二控制器子组件迁移数据

可选地,在将模型链接到字典之后,您可以手动将数据从基本工作区迁移到字典。仅迁移模型不通过基本工作区与其他模型共享的数据。

在这种情况下,您可以迁移变量多项式系数。您不能迁移子组件使用的其他数据,因为层次结构中的其他模型需要它存在于基本工作区中。

  1. 的左下角ex_ContrComp_Sub2_Lvl1模型,单击字典徽章。字典ContrSub2.sldd打开模型资源管理器。

  2. 在模型资源管理器模型层次结构窗格中,单击基本工作空间

  3. 内容窗格,切割多项式系数变量。

  4. 模型层次结构窗格,在ContrSub2节点,选择设计数据节点。

  5. 内容窗格中,粘贴多项式系数变量。

  6. 模型层次结构窗格中,右键单击ContrSub2节点并选择保存更改

现在,变量多项式系数定义在字典中,而不是基本工作区中。

为了防止在子组件中使用模型时出现错误,必须从模型中删除一些数据加载回调。类的副本,如果不删除回调,则每当打开其中一个模型时,回调都会创建多项式系数基本工作区中的变量。当您尝试模拟或更新框图时,字典和基本工作空间中变量的冲突定义将导致错误。

  1. 在模型资源管理器模型层次结构窗格中,选择ex_ContrCompSub2_Lvl1节点。

  2. 在Dialog窗格(右窗格)中,选择回调选项卡。

  3. PreLoadFcn回调函数,删除从中加载数据的行ProjectData_ContrSub2.mat。这个mat文件定义多项式系数

    回调中的其他行从其他mat文件加载数据。两个控制器子组件都需要这些文件中的数据,因此数据必须保留在基本工作空间中,这意味着回调必须保留。

  4. 中删除同一行PreLoadFcn第二个控制器子组件中另一个模型的回调。

  5. 如有必要,清除任何剩余的副本多项式系数从基本工作区。

为第一个控制器子组件创建字典

链接第一个控制器子组件,其顶层模型为ex_ContrComp_Sub1_Lvl1,到一本名为ContrSub1.sldd。完成后,迁移变量diff到新字典和,在PreLoadFcn子组件中模型的回调函数,删除从中加载数据的行ProjectData_ContrSub1.mat。完成后,清除所有剩余的副本diff保留在基本工作区中。

为控制器子组件创建共享字典

控制器子组件共享名为初始化,它仍然在基本工作区中。现在两个子组件都使用字典,您可以移动了初始化到共享的引用字典。

  1. 在模型资源管理器中,选择文件>>数据字典

  2. 创建一个新的数据字典对话框,设置文件名称ContrShare并点击保存

  3. 在模型资源管理器模型层次结构窗格中,选择ContrSub1节点。

  4. 在Dialog窗格(右侧窗格)中,在引用字典,点击添加

  5. 开放数据词典对话框,双击ContrShare.sldd

    ContrSub1.sldd字典指的是ContrShare.sldd

  6. 配置ContrSub2.sldd参考字典ContrShare.sldd

  7. 使用模型资源管理器来移动初始化从基本工作区到ContrShare.sldd

  8. 保存对字典所做的更改。

  9. PreLoadFcn回调控制器子组件中的模型时,删除从该模型加载数据的行ProjectData_ContrSubs.mat

为控制器组件创建字典

  1. 链接控制器组件模型,ex_ContrComp,到一本名为Contr.sldd。完成后,Simulink配置字典引用万博1manbetx:Contr.sldd参考文献ContrSub1.slddContrSub2.sldd

    Contr.sldd不包含任何数据,但它将控制器字典与稍后创建的系统字典隔离开来。

  2. 现在整个控制器组件都使用了数据字典,您可以从基本工作区迁移其他数据。

    • 使用Model Explorer来移动变量FloatType设计数据的部分ContrShare.sldd(不Contr.sldd).

    • 移动变量CodeGenConfigSet配置的部分ContrShare.sldd

      来暴露配置部分,在模型资源管理器中模型层次结构窗格中,右键单击字典节点并选择显示空部分

    控制器组件中的所有模型都使用这些变量。

  3. PreLoadFcn控制器组件中所有模型的回调,删除从中加载数据的行ProjectData_Contr.mat

完成字典迁移

  1. 在植物组件中链接顶部模型,ex_PlantComp_Lvl1,到一个名为Plant.sldd

  2. 连接系统模型,ex_SystemModel,到一个名为System.sldd

现在所有的模型都使用字典,你可以从基本工作区迁移所有的数据:

  1. 移动变量μPlant.sldd

  2. PreLoadFcn的模型回调,删除从中加载数据的行ProjectData_Plant.mat

  3. 使用模型资源管理器创建一个名为GlobalShare.sldd

  4. 配置Plant.slddContrShare.sldd参考GlobalShare.sldd

  5. 将这些变量迁移到GlobalShare.sldd

    • ρ

    • SimConfigSet

    • SensorBus

    • CtrlBus

    GlobalShare.sldd包含层次结构中所有模型所需的变量。

  6. PreLoadFcn所有模型的回调,删除从中加载数据的行ProjectData_System.mat

  7. ContrSub1ContrSub2,植物字典,在模型资源管理器模型层次结构窗格中,选择字典节点,并在“对话框”窗格中清除允许访问基本工作区

  8. 对于其他字典,请确认这一点允许访问基本工作区清除。层次结构中的模型不再需要基本工作区。

发现共享数据的策略

要了解模型引用层次结构中的模型如何共享数据,请使用以下技术:

  • 在开放模型中,选择编辑>查找引用变量。模型资源管理器显示模型使用的变量,以及引用模型使用的变量。然后,您可以右键单击一个变量并选择找到使用的地方以显示使用该变量的所有模型。有关更多信息,请参见使用模型资源管理器编辑和管理工作区变量

  • 在命令提示符下,使用该函数万博1manbetxSimulink.findVars确定模型使用的变量。然后就可以使用这个函数了相交确定两个模型、组件或子组件共享的变量。

相关的话题

这个话题有用吗?