Main Content

通过定义图形函数重用逻辑模式

Stateflow® 图中的图形函数是图形元素,可帮助您重用控制流逻辑和迭代循环。您可以使用具有连接结点和转移的流程图创建图形函数。您可以在状态和转移的动作中调用图形函数。借助图形函数,您可以:

  • 创建模块化的可重用逻辑,您可以在图中的任何位置调用它。

  • 在图动画过程中直观地跟踪仿真行为。

图形函数可以驻留在 Stateflow 图、状态或子图的任意位置。函数的位置确定可以调用函数的状态和转移的集合。

  • 如果想在一个状态(或子图)及其子状态内调用函数,只需将图形函数置于该状态或子图中。该函数将覆盖该状态或子图的父级和前代中同名的任何其他函数。

  • 如果想要在图的任意位置调用函数,需将图形函数置于与图同一层次的位置。

  • 如果要从模型中的任何图调用该函数,请将图形函数放在图级别,并启用图级别函数的导出。有关详细信息,请参阅Export Stateflow Functions for Reuse

注意

图形函数可以访问在 Stateflow 层次结构中位于其上方的图和状态数据。

例如,此图形函数的名称为 f1。它接受三个参量(abc)并返回三个输出值(xyz)。该函数包含一个流程图,用于计算三个不同的参量乘积。

A graphical function that computes three different products.

定义图形函数

  1. 在对象选项板中,点击图形函数图标

  2. 在图画布上,点击新图形函数的位置。

  3. 输入函数的签名标签。

    函数的签名标签指定函数的名称及其参量和返回值的形式名称。签名标签采用以下语法:

    [return_val1,return_val2,...] = function_name(arg1,arg2,...)
    您可以指定多个返回值和多个输入参量。每个返回值和输入参量可以是一个标量、向量或值的矩阵。对于只有一个返回值的函数,忽略签名标签中的方括号。

    您可以对参量和返回值使用相同的变量名称。当您对输入和输出使用相同的变量时,您会创建原位数据。例如,使用以下签名标签的函数将变量 y1y2 同时用作输入和输出:

    [y1,y2,y3] = f(y1,u,y2)
    如果将此函数导出为 C 代码,生成的代码会将 y1y2 视为传引用的原位参量。使用原位数据可减少生成代码复制中间数据的次数,从而提高代码的效率。

    符号窗格和模型资源管理器中,函数签名中的参量和返回值显示为属于您的函数的数据项。参量的作用域是输入。返回值的作用域是输出

  4. 为每个参量和返回值指定数据属性,如 设置数据属性 中所述。当参量和返回值同名时,只能编辑参量的属性。返回值的属性为只读。

  5. 要对函数进行编程,请在函数框内构造一个流程图,如在 Stateflow 中创建流程图中所述。

    由于图形函数在调用时必须完全执行,因此您无法使用状态。在图形函数中,可以使用的图形元素只有连接结点和转移。

    注意

    在图形函数中,不要广播可能导致激活状态更改的事件。在图形函数中,导致退出激活状态的事件广播具有不可预测的行为。

  6. 创建您的函数所需的其他数据项。有关详细信息,请参阅通过模型资源管理器添加数据

    您的函数可以访问它自己的数据或属于父状态或图的数据。函数中的数据项可以有以下作用域之一:

    • Constant - 常量数据在所有函数调用中都保持其初始值。

    • Parameter - 参数数据在所有函数调用中都保持其初始值。

    • Local - 在整个仿真期间,局部数据在各次函数调用之间保持不变。仅在使用 C 语言作为动作语言的图中有效。

    • Temporary - 临时数据在每个函数调用开始时初始化。仅在使用 C 语言作为动作语言的图中有效。

    在使用 C 语言作为动作语言的 Stateflow 图中,如果希望数据值在整个仿真期间的各次函数调用之间保持不变,请定义局部数据。如果您要在每次函数调用开始时初始化数据值,请定义临时数据。例如,如果要跟踪调用函数的次数,可以定义一个具有局部作用域的计数器。相反,如果不需要在函数完成后计数器值保持不变,则可以将循环计数器指定为具有临时作用域。

    在使用 MATLAB® 作为动作语言的图中,您不需要定义图形函数中的局部或临时数据。您可以使用未定义的变量来存储仅在函数调用的其余时间段可访问的值。要存储在各次函数调用之间保持不变的值,请在图级别使用局部数据。

    提示

    您可以从 MATLAB 工作区初始化函数中的局部和临时数据。有关详细信息,请参阅从 MATLAB 基础工作区初始化数据

在状态和转移中调用图形函数

您可以基于任何状态或任何转移的动作或从其他函数来调用图形函数。如果导出图形函数,将可以从模型的任何 Stateflow 图中调用它。有关导出函数的详细信息,请参阅Export Stateflow Functions for Reuse

要调用图形函数,请使用函数签名,并在函数签名中为每个形参包含一个对应的实参值。

[return_val1,return_val2,...] = function_name(arg1,arg2,...)

如果实参和形参的数据类型不同,函数会将实参转换为形参的类型。

管理大型图形函数

您可以创建任意大的图形函数。如果您的函数变得太大,您可以隐藏其内容,方法如下:右键点击函数框并从上下文菜单中选择组和子图 > 子图

A subcharted graphical function with its content preview enabled.

要使图形函数框不透明,请右键点击该函数,并从上下文菜单中取消内容预览属性。

A subcharted graphical function with its content preview disabled.

要全屏编写函数,请双击函数框以访问子图化图形函数中的流程图。有关详细信息,请参阅Encapsulate Modal Logic by Using Subcharts

指定图形函数的属性

您可以通过下面列出的属性指定图形函数如何与 Stateflow 图中的其他组件交互。您可以在属性检查器、模型资源管理器或“函数”属性对话框中修改这些属性。

要使用属性检查器,请执行以下操作:

  1. 建模选项卡的设计数据下,选择属性检查器

  2. 在 Stateflow 编辑器中,选择图形函数。

  3. 属性检查器中,编辑转移属性。

要使用模型资源管理器,请执行以下操作:

  1. 建模选项卡的设计数据下,选择模型资源管理器

  2. 模型层次结构窗格中,选择图形函数。

  3. 对话框窗格中,编辑图形函数属性。

要使用“函数”属性对话框,请执行以下操作:

  1. 在 Stateflow 编辑器中,右键点击图形函数。

  2. 选择属性

  3. 在属性对话框中,编辑图形函数属性。

您还可以通过使用 Stateflow.Function 对象以编程方式修改这些属性。有关 Stateflow 编程接口的详细信息,请参阅 Overview of the Stateflow API

名称

函数名称。点击函数名称链接可使函数显示在其所属图的前端。

函数内联选项

控制函数在生成的代码中的内联:

  • 自动 - 确定是否根据内部计算内联函数。

  • 内联 - 如果不将函数导出到其他图并且它不是递归的一部分,则内联函数。(如果函数直接调用自身或通过另一个函数调用间接调用自身,则存在递归。)

  • 函数 - 不内联函数。

此属性在属性检查器中不可用。

标签

函数的签名标签。函数签名标签指定函数的名称及其参量和返回值的形式名称。此属性在属性检查器中不可用。

描述

图形函数的描述。

文档链接

图形函数的在线文档的链接。您可以输入 Web URL 地址或者将文档显示为 HTML 文件或 MATLAB 命令行窗口中的文本的 MATLAB 命令。点击文档链接超链接时,Stateflow 会计算该链接并显示该文档。

另请参阅

对象

工具

相关主题