Main Content

通过定义 MATLAB 函数重用 MATLAB 代码

Stateflow® 图中的 MATLAB® 函数是一个图形元素,您可以用它来编写易于通过调用内置 MATLAB 函数来实现的算法。典型应用包括:

  • 面向矩阵的计算

  • 数据分析和可视化

在编写使用 MATLAB(而不是图形化 Stateflow 构造)更容易表达的算法代码时,此类型的函数很有用。MATLAB 函数还能够提供了一些优化选项,可为嵌入式应用程序生成高效、生产级的 C 代码。

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

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

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

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

注意

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

例如,以下 MATLAB 函数的名称为 stdevstats。它接受参量 vals,并返回输出值 stdevout

Stateflow chart with a MATLAB function called stdevstats.

为了计算 vals 中各值的标准差,该函数使用以下代码。

function stdevout = stdevstats(vals)
%#codegen

% Calculates the standard deviation for vals

len = length(vals);
stdevout = sqrt(sum(((vals-avg(vals,len)).^2))/len);

function mean = avg(array,size)
mean = sum(array)/size;

在图中定义 MATLAB 函数

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

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

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

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

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

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

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

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

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

  5. 要对该函数进行编程,请双击函数框打开 MATLAB Function 模块编辑器。

  6. 在 MATLAB Function 模块编辑器中,输入实现您的函数的 MATLAB 代码。有关详细信息,请参阅Program a MATLAB Function in a Chart

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

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

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

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

    在 MATLAB 函数中,不需要显式创建局部或临时函数数据。您可以使用未定义的变量来存储仅在函数调用的其余时间段可访问的值。要存储在各次函数调用之间保持不变的值,请在图级别使用局部数据或使用关键字 persistent

在状态和转移中调用 MATLAB 函数

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

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

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

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

指定 MATLAB 函数的属性

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

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

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

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

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

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

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

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

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

要使用 MATLAB Function 模块的属性对话框,请执行以下操作:

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

  2. 选择属性

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

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

名称

函数名称。点击函数名称链接以在 MATLAB Function 模块编辑器中打开您的函数。

函数内联选项

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

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

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

  • 函数 - 不内联函数。

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

标签

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

对整数溢出进行饱和处理

指定是否在生成代码中对整数溢出做饱和处理。有关详细信息,请参阅Handle Integer and Enumeration Overflow for Chart Data

此属性仅适用于使用 C 语言作为动作语言的图中的 MATLAB 函数。在使用 MATLAB 作为动作语言的图中,数据的行为取决于图的 对整数溢出进行饱和处理 属性的值。

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

MATLAB Function fimath

定义 MATLAB 函数的 fimath 属性。指定的 fimath 属性与在 MATLAB 函数中构造的所有 fifimath 对象相关联。选择以下选项之一:

  • 与 MATLAB 相同 - 该函数使用与当前全局 fimath 相同的 fimath 属性。编辑框变暗,并以只读形式显示当前全局 fimath。有关全局 fimathfimath 对象的详细信息,请参阅 Fixed-Point Designer™ 文档。

  • 指定其他 - 通过以下方法之一指定您自己的 fimath 对象:

    • 在编辑框内构造 fimath 对象。

    • 在 MATLAB 或模型工作区中构造 fimath 对象,并在编辑框中输入其变量名称。

此属性仅适用于使用 C 语言作为动作语言的图中的 MATLAB 函数。在使用 MATLAB 作为动作语言的图中,数据的行为取决于图的 MATLAB Chart fimath 属性的值。

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

描述

MATLAB 函数的描述。

文档链接

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

另请参阅

对象

工具

相关主题