主要内容

MATLAB Function

R2026b

在 Simulink 模型中包含 MATLAB 代码

  • MATLAB Function block icon.

库:
Simulink / User-Defined Functions
HDL Coder / User-Defined Functions

描述

MATLAB Function 模块使您能够编写在 Simulink® 模型中执行的 MATLAB® 函数。MATLAB 函数在仿真期间的每个时间步执行。有关将 MATLAB 代码集成到 Simulink 模型中的详细信息,请参阅使用 MATLAB Function 模块在 Simulink 中实现 MATLAB 函数。如果您有 Simulink Coder™ 许可证,您还可以从 MATLAB Function 模块为 Simulink Coder 目标生成 C/C++ 代码。

双击 MATLAB Function 模块可打开 MATLAB Function 模块编辑器,您可以在其中编写 MATLAB 函数。您还可以使用模型资源管理器或符号窗格来定义变量、添加输入触发器以及创建函数调用输出。有关详细信息,请参阅Create MATLAB Function Block Variables、Manage the Input Trigger of a MATLAB Function Block和Manage Function Call Outputs of a MATLAB Function Block。

在符号窗格中,您可以将模块输入声明为 Simulink 参数,而不是端口。MATLAB Function 模块还支持继承输入、输出和参数的类型及大小。您可以显式指定这些属性。请参阅指定 MATLAB Function 模块中变量的数据类型、指定 MATLAB Function 模块变量的大小和通过使用参数变量访问 MATLAB Function 模块中的工作区数据。

当您仿真包含 MATLAB Function 模块的模型时,软件会从该模块生成二进制代码或 C/C++ 语言的 MATLAB 可执行文件 (MEX) 代码,并将此代码与模型集成。MATLAB Function 模块使用与 MATLAB Coder 相同的基础架构,您可使用该基础架构从 Simulink 之外的 MATLAB 代码生成 C/C++ 代码。因此,MATLAB Function 模块代码必须使用代码生成支持的 MATLAB 约定。请参阅Code and Integration Limitations for MATLAB Function Blocks。

为支持数据可视化,MATLAB Function 模块仅支持调用 MATLAB 函数进行仿真。请参阅使用 MATLAB 引擎在生成的代码中执行函数调用 (MATLAB Coder)。如果使用 Simulink Coder 生成代码,并且函数调用不直接影响 Simulink 输入或输出,则调用不会出现在生成的代码中。

示例

全部展开

将 MATLAB Function 添加到您的模型中以修改输入信号。

  1. 在仿真选项卡中,点击库浏览器。选择 Simulink > 用户定义的函数。将 MATLAB Function 模块拖到 Simulink 画布上。

  2. 双击模块以打开 MATLAB Function 模块编辑器。用以下代码替换函数体代码:

    y = 2*u;
  3. 通过点击“向上到父级”按钮 返回到模型。添加 Sine Wave 模块作为输入信号,并添加 Scope 模块来采集 MATLAB Function 模块的输入和输出。

    This shows the example model the instructions describe. It attaches a Sine Wave block and a Scope block to a MATLAB Function block you created.

  4. 运行仿真并打开 Scope 模块以查看代码的效果。

扩展示例

限制

  • 虽然此模块的代码会尝试生成与 MATLAB 完全相同的结果,但由于存在舍入误差,因此仍可能产生差异。这些数值差异最初可能是几个 eps,在重复运算之后可能会放大。建议您不要依赖 nan 的行为。对于相同的计算,不同的 C 编译器可能产生不同的结果。

  • MATLAB Function 模块中不允许递归调用。

端口

输入

全部展开

MATLAB 函数中的输入变量,指定为实数值标量、向量或矩阵。每个输入变量都有一个使用该变量名称的关联端口。

您不能在 Simulink 模型和 MATLAB Function 模块中的函数之间传递 MATLAB 支持但 Simulink 不支持的数据类型。您可以在 MATLAB Function 模块中使用这些数据类型。

有关此模块支持的定点数据类型的详细信息,请参阅Fixed-Point Data Types with MATLAB Function Block (Fixed-Point Designer)和Data Type Override with MATLAB Function Block (Fixed-Point Designer)。

依赖关系

要创建输入端口,请打开模块并在符号窗格中创建输入变量。请参阅Create MATLAB Function Block Variables。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | string | fixed point | enumerated | bus

输出

全部展开

MATLAB 函数中的输出变量,指定为实数值标量、向量或矩阵。每个输出变量都有一个使用该变量名称的关联端口。

依赖关系

要创建输出端口,请打开模块并在符号窗格中创建输出变量。请参阅Create MATLAB Function Block Variables。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | string | fixed point | enumerated | bus

参数

全部展开

要以交互方式编辑模块参数,请使用属性检查器。在 Simulink 工具条中,在仿真选项卡的准备库中,选择属性检查器。

注意

MATLAB Function 模块也有 Subsystem 模块参数,您可以通过右键点击模块并点击“模块参数”按钮 来访问这些参数。使用这些参数来指定模块代码生成参数。不推荐更新其他模块参数。

将激活 MATLAB Function 模块的方法指定为以下值之一:

  • 继承 - 来自 Simulink 模型的输入激活 MATLAB Function 模块。

    如果您定义输入触发器,则 MATLAB Function 模块会执行,以响应触发端口上的 Simulink 信号或函数调用事件。如果您没有定义输入触发器,则 MATLAB Function 模块将从模型中隐式继承触发器。这些隐式事件是向模块提供输入的信号的离散或连续采样时间。

    如果您定义了数据输入,则 MATLAB Function 模块以最快的数据输入速率进行采样。如果未定义数据输入,则 MATLAB Function 模块以父级子系统的执行行为定义的速率进行采样。

  • 离散 - MATLAB Function 模块使用您在模块的采样时间参数中指定的速率激活。该模块以对应于指定速率的固定时间间隔生成隐式事件。模型中的其他模块可以有不同采样时间。

  • 连续 - MATLAB Function 模块仅在主时间步期间激活,在主时间步和子时间步内都会计算输出和局部连续变量。模块可以记录过零,这样,只要状态发生变化,Simulink 模型就可以对模块进行采样。模块计算局部连续变量的导数。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

如果使用 MATLABFunctionConfiguration 对象,请使用以下选项指定属性:

参数: UpdateMethod
值: "Inherited" (默认) | "Continuous" | "Discrete"

如果使用 Stateflow.EMChart 对象,请使用以下选项指定属性:

参数: ChartUpdate
值: "INHERITED" (默认) | "CONTINUOUS" | "DISCRETE"

指定在仿真期间 MATLAB Function 模块激活的时间间隔。默认值表示模块从 Simulink 继承采样时间。有关指定采样时间的详细信息,请参阅指定采样时间。

不要在 Subsystem 模块参数中使用采样时间参数。请改用属性检查器。

依赖关系

要启用此参数,请将更新方法设置为离散。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

参数: SampleTime
值: "-1" (默认) | scalar | vector
数据类型: string | char

高级

将 MATLAB Function 模块中的数据在发生整数溢出时是否进行饱和指定为以下值之一:

  • on - 模块通过将整数设置为字长允许的最大正值或负值对整数进行饱和处理。此设置匹配 MATLAB 行为。

  • off - 当发生溢出情况时,模块在仿真模式下生成运行时错误。当您使用 Simulink Coder 生成代码时,行为取决于您的 C 语言编译器。

提示

  • 当此参数为 on 时,MATLAB 会在仿真期间添加额外的检查以检测整数上溢或下溢。如果 MATLAB Function 模块代码中没有发生整数溢出,则禁用此选项会更高效。

  • 由 Simulink Coder 生成的代码不检查整数上溢或下溢,因此,当此参数为 off 时,可能会产生不可预测的结果。在这种情况下,请在生成代码之前仿真您的模型以测试上溢和下溢。

  • 此参数设置仅与整数算术相关。它对定点或双精度算术不起作用。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

参数: SaturateOnIntegerOverflow
值: true or 1 (默认) | false or 0
数据类型: logical

指定 MATLAB Function 模块是否支持在仿真期间维度可变的输入和输出数据。当此参数为 on 时,您可以通过启用输出变量的可变大小属性来定义可变大小输出。有关详细信息,请参阅声明可变大小的 MATLAB Function 模块变量和Variable size。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

参数: SupportVariableSizing
值: true or 1 (默认) | false or 0
数据类型: logical

指定 MATLAB Function 模块是否支持直接馈通语义,以便输入的值直接控制模块的输出。当此参数为 off 时,模块输出仅依赖模块的当前状态。使用非直接馈通使您能够在反馈环中使用 MATLAB Function 模块并防止代数环。有关详细信息,请参阅 Use Nondirect Feedthrough in a MATLAB Function Block。

依赖关系

要禁用此参数,您必须将更新方法设置为继承或离散。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

参数: AllowDirectFeedthrough
值: true or 1 (默认) | false or 0
数据类型: logical

指定 MATLAB Function 模块是否将输出的 N×1 矩阵转换为一维向量信号,指定为以下值之一:

  • off - 模块将输出的大小为 N×1 的矩阵解释为 N×1 矩阵信号。

  • on - 模块将输出的大小为 N×1 的矩阵解释为 N 元素向量信号。

尽管您在 MATLAB Function 模块中编写的 MATLAB 代码像普通 MATLAB 代码一样计算数组维度,但 Simulink 会区分 N 元素向量与 1×N 和 N×1 矩阵。有关 Simulink 信号维度的详细信息,请参阅确定信号维度。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

参数: VectorOutputs1D
值: false or 0 (默认) | true or 1
数据类型: logical

自 R2023a 起

指定模块是否将输出可变维度视为固定大小,指定为以下值之一:

  • on - 模块将长度为 1 的每个模块可变维度视为固定大小。对于超出 1 的其他维度,如果启用了模块变量的可变大小属性,则模块将这些维度视为可变大小。

  • off - 启用了可变大小属性的模块输出变量始终为可变大小。

有关详细信息,请参阅Variable size。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

参数: TreatDimensionOfLengthOneAsFixedSize
值: true or 1 (默认) | false or 0
数据类型: logical

定点属性

选择是否将定点输入和整数输入视为 fi (Fixed-Point Designer) 对象。

  • Fixed-point - MATLAB Function 模块将定点输入视为 Fixed-Point Designer™ fi 对象。

  • Fixed-point & Integer - MATLAB Function 模块将定点和整数输入视为 Fixed-Point Designer fi 对象。

有关详细信息,请参阅Ways to Construct fi Objects (Fixed-Point Designer)。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改对象属性。

参数: TreatAsFi
值: "Fixed-point" (默认) | "Fixed-point & Integer"

将 MATLAB Function 模块的默认 fimath (Fixed-Point Designer) 对象属性指定为以下值之一:

  • Same as MATLAB - 模块使用与当前默认 fimath 对象相同的 fimath 对象属性。文本框灰显,并以只读形式显示当前全局 fimath 对象。

  • Specify other - 以两种方式之一在文本框中指定您自己的 fimath 对象:

    • 在文本框内构造 fimath 对象。

    • 在 MATLAB 或模型工作区中构造 fimath 对象,然后在文本框中输入其变量名称。如果您使用此选项并计划与其他人共享您的模型,请在模型工作区中定义此变量。

有关详细信息,请参阅 fimath Object Construction (Fixed-Point Designer)和Fixed-Point Data Types with MATLAB Function Block (Fixed-Point Designer)。

提示

  • MATLAB Function 模块的 fimath 对象对于该模块的内容表现为 globalfimath (Fixed-Point Designer) 对象。该模块将此参数中的 fimath 对象属性与您选择视为 fi 对象的 MATLAB Function 模块的所有定点和整数输入信号相关联。在 MATLAB Function 模块中构造 fi 对象需要考虑其他注意事项。

    • 如果在构造 fi 对象时没有与之相关联的 fimath 对象,则 fi 构造函数使用默认 fimath 对象设置,而不考虑 MATLAB 函数 fimath 中的属性。如果在构造 fi 对象后对其执行操作,该对象将采用 MATLAB 函数 fimath 中的属性。

    • 如果您在 fi 构造函数中指定 fimath 对象,则 fi 构造函数在量化值时遵循该 fimath 对象。fi 构造函数中未指定的任何 fimath 对象设置都使用 MATLAB 函数 fimath 中的指定属性。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfiguration 或 Stateflow.EMChart 对象和更改关联的对象属性。

如果使用 MATLABFunctionConfiguration 对象,请使用以下选项指定属性:

参数: FimathMode
值: "SameAsMATLAB" (默认) | "UserSpecified"

如果使用 Stateflow.EMChart 对象,请使用以下选项指定属性:

参数: EmlDefaultFimath
值: "Same as MATLAB Default" (默认) | "Other:UserSpecified"

模块特性

数据类型

Booleana | busa | doublea | enumerateda | fixed pointa | halfa | integera | singlea | stringa

直接馈通

是a

多维信号

是a

可变大小信号

是a

过零检测

否

a 实际支持的数据类型或功能取决于模块实施。

提示

  • 您可以调用在以下各项中定义的函数:

    • Simulink Function 模块。

    • 图中的 Stateflow® 函数。要调用图中的函数,请启用导出图级别函数和将导出的函数视为全局可见属性。

  • 默认情况下,MATLAB Function 模块不包括 %#codegen (MATLAB Coder) 指令,但在检查错误时就如果包含该指令一样。将 %#codegen 指令添加到 MATLAB Function 模块不会影响错误检查。

扩展功能

全部展开

版本历史记录

在 R2011a 中推出

全部展开