主要内容

MATLAB Function

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 and Define MATLAB Function Block VariablesManage the Input Trigger of a MATLAB Function BlockManage Function Call Outputs of a MATLAB Function Block

符号窗格中,您可以将模块输入声明为 Simulink 参数,而不是端口。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 Function 模块中执行函数调用。如果使用 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 and Define MATLAB Function Block Variables

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

输出

全部展开

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

依赖关系

要创建输出端口,请打开模块并在符号窗格中创建输出变量。请参阅Create and Define 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 模型就可以对模块进行采样。模块计算局部连续变量的导数。

编程用法

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

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

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

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

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

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

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

依赖关系

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

编程用法

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

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

高级

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

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

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

提示

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

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

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

编程用法

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

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

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

编程用法

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

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

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

依赖关系

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

编程用法

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

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

自 R2021b 起

MATLAB Function 模块是否将维度长度为 1 的输出变量视为固定大小指定为以下值之一:

  • off - 无论您是否将变量指定为具有可变大小,模块都将至少一个维度的长度为 1 的输出变量视为固定大小。

  • on - 如果您将变量指定为具有可变大小,则 MATLAB Function 模块将输出变量视为可变大小。

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

注意

在 R2021b 及更早版本中,MATLAB Function 模块始终将输出列向量转换为一维信号。

编程用法

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

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

自 R2023a 起

将至少一个维度的长度为 1 的变量是否为固定大小指定为以下值之一:

  • on - 一个维度的长度为 1 的可变大小变量是固定大小的变量。

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

此参数仅影响启用可变大小属性的输出变量。请参阅Variable size

编程用法

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

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

定点属性

将是否将继承的定点和整数信号视为 Fixed-Point Designer™ 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)

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfigurationStateflow.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 中的指定属性。

编程用法

要以编程方式设置模块参数值,请使用圆点表示法访问模块的 MATLABFunctionConfigurationStateflow.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 指令,但在检查错误时就如果包含该指令一样。将 %#codegen 指令添加到 MATLAB Function 模块不会影响错误检查。有关详细信息,请参阅编译指令 %#codegen

扩展功能

全部展开

版本历史记录

在 R2011a 中推出

全部展开