主要内容

使用原子子图创建可重用子组件

一个原子子图表是一个图形对象,它帮助您在状态流中创建独立的子组件®图表。在MATLAB中的独立状态流图中不支持原子子图®

原子子图允许:

  • 跨多个图表和模型重用相同的状态或子图

  • 在对具有许多状态或层次结构的图表进行小的更改后,可以更快地进行模拟

  • 当多人在同一图表的不同部分工作时,团队开发的便利性

  • 手动检查为图表中的特定状态或子图生成的代码

原子子图看起来不透明,并且包含标签原子在左上角。如果使用库中的链接原子子图,则标签链接出现在左上角。

原子子图的例子

这个例子说明了普通子图和原子子图之间的区别。

在空气控制器图中,定时关机是一个普通子图。集成软件包是原子子图。两个子图看起来都不透明,但是集成软件包包括标签原子在左上角。

使用原子子图的好处

的功能结合在一起正常子图表,原子子系统(模型).原子子图表:

  • 表现为独立的图表。

  • 支持作为库链接使用。

  • 支持可重用代码的生成。

  • 允许映射输入、输出、参数、数据存储内存和输入事件。

原子子图不支持访问:

  • 图表层次结构的每一级的数据。

  • 事件在原子子图的范围外广播。

原子子图不支持样本时间的显式规范。

创建一个原子子图

您可以通过转换现有的状态或子图,或者通过从库模型链接图表来创建原子子图。在创建原子子图之后,通过右键单击原子子图并选择来更新变量的映射子图表映射.有关更多信息,请参见原子子图和框的映射变量

将状态或正常子图转换为原子子图

要创建允许更快调试和代码生成工作流的独立组件,请将现有状态或子图转换为原子子图。在图表中,右键单击状态或普通子图表并选择组及子图>原子子图表.标签原子出现在子图表的左上角。

新的原子子图拥有子图在图表中访问的每个数据对象的副本。将本地数据复制为数据存储内存。其他数据(包括输入和输出数据)的范围不会改变。

将状态或子图转换为原子子图会自动用连接到进入或退出端口的转换替换进入或退出状态或子图的任何超转换。进入和退出端口使您的图表能够在Stateflow层次结构中的边界之间转换,同时隔离用于进入和退出原子子图表的逻辑。有关更多信息,请参见创建跨州出入境连接而且隔离进入和退出原子子图的转换逻辑

有关可能阻止将状态或子图转换为原子子图的问题列表,请参见转换到原子子图的限制

链接库中的原子子图

要创建跨多个图表和模型重用的子组件,请从库模型创建一个链接。复制一个库模型中的图表,并将其粘贴到另一个模型中的图表。如果库图包含任何状态,则显示为带有标签的链接原子子图链接在左上角。

这种建模方法最大限度地减少了类似状态的维护。当您修改库中的原子子图时,您的更改将传播到所有图表和模型中的链接。

如果库图只包含函数而不包含状态,那么它将在图中显示一个链接原子框。有关更多信息,请参见通过使用原子盒重用函数

将原子子图转换为普通子图

将原子子图转换回状态或正常子图将删除其所有变量映射。转换将子图表的父数据对象与它们映射到的图表的父数据合并。

  1. 如果原子子图是库链接,右键单击原子子图并选择库链接>禁用链接

  2. 若要将原子子图转换回普通子图,请右键单击原子子图并清除组及子图>原子子图表复选框。

  3. 要将子图转换回状态,请右键单击子图并清除组及子图>子图表复选框。

  4. 如有必要,请重新排列图表中的图形对象。

如果存在以下情况,则不能将原子子图转换为普通子图:

  • 原子子图将参数映射到表达式,而不是单个变量名。例如,映射参数data1到这些表达式之一阻止原子子图转换为普通子图:

    • 3.

    • data2 (3)

    • Data2 + 3

  • 这两个条件都成立:

    • 原子子图包含使用MATLAB作为动作语言的MATLAB函数或真值表函数。

    • 原子子图不将每个变量映射到主图中的同名变量。

何时使用原子子图

重用状态逻辑

假设您希望多次重用相同的状态或子图,以促进大规模建模。

如果不使用原子子图,则必须手动维护子组件的每个副本。例如,这个图表包含两个具有相似结构的状态。这两种状态之间的唯一区别是变量的名称。如果您更改状态中的逻辑一个,那么您必须在状态中进行相同的更改B

包含两个顶级状态A和b的状态流图。每个状态有两个子状态Pos和Neg。

要通过使用链接原子子图来重用子组件,请创建状态的单个副本一个并将其作为图表存储在库模型中。从该库将原子子图复制并粘贴两次到图表中。然后根据需要更新子图变量的映射。

当更改库中的原子子图时,更改将传播到所有库链接。有关更多信息,请参见在图表中多次重用某个状态

增量地调试图表

假设您想要测试包含多个状态或多个层次结构的图表中的一系列更改。

如果不使用原子子图,那么当您对图表的一部分做一个小小的更改并开始模拟时,整个图表都会重新编译。因为重新编译整个图表需要很长时间,所以您决定在测试之前做一些更改。但是,如果您发现了一个错误,您必须逐步检查所有的更改,以确定错误的原因。

相反,当修改原子子图时,只会对子图而不是整个图进行重新编译。用于模拟的增量构建需要更少的重新编译时间。编译时间的减少使您能够测试每个单独的更改,而不是等待一次测试多个更改。通过单独测试每个更改,您可以快速识别导致错误的更改。有关更多信息,请参见减少图表的编译时间

开发多人使用的图表

假设您想要将图表分解成子组件,因为有很多人在处理图表的不同部分。

如果没有原子子图,一次只能有一个人编辑模型。如果有人编辑图表的一部分,而另一个人编辑同一图表的另一部分,您必须在提交时合并这些更改。

相反,您可以将图表的不同部分存储为链接原子子图。因为原子子图的行为是独立的对象,所以不同的人可以处理图表的不同部分,而不会影响图表的其他部分。在提交时,不需要合并,因为更改存在于单独的模型中。有关更多信息,请参见把图表分成独立的单元

检查生成的代码

假设您想要检查由动态仿真模块®编码器™或嵌入式编码器®手动获取图表的特定部分。

如果不使用原子子图,则可以在一个文件中为整个模型生成代码。要找到图表特定部分的代码,您必须查看整个文件。

相反,您可以指定原子子图的代码出现在单独的文件中。这种代码生成方法支持对图表的特定部分进行单元测试。您可以避免在不相关的代码中搜索,而只关注您感兴趣的代码。有关更多信息,请参见为原子子图生成单独的代码

另请参阅

(模型)

相关的话题

Baidu
map