本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

使用模块实现 MATLAB Functions

MATLAB Function 模块是在 Simulink 中实现自定义 MATLAB® 函数的最简单方法。要对 Simulink® 图形语言未涵盖的功能进行建模,或者对可方便使用 MATLAB 文本语言来表示的算法进行建模,您可以使用 MATLAB Function 模块。使用 MATLAB Function 模块可生成易读、高效且紧凑的 C/C++ 代码,以部署到桌面和嵌入式应用程序中。

换句话说,MATLAB Function 模块使您能够使用 MATLAB 语言来定义自定义功能。在以下情形中,可很好地以该模块为起点来创建自定义功能:

  • 您已经拥有可对自定义功能建模的 MATLAB 函数。

  • 您发现使用 MATLAB 函数对自定义功能建模比使用 Simulink 模块图建模更容易。

  • 自定义功能不包含连续或离散动态状态。要对动态状态建模,请使用 S-Function。

决定何时使用 MATLAB Function 模块

MATLAB Function 模块提供以下功能:

  • 允许您将 MATLAB 函数构建到可嵌入的应用程序中 - MATLAB Function 模块支持 MATLAB 工具箱函数中可生成高效 C/C++ 代码的那些函数。有关详细信息,请参阅C/C++ 代码生成支持的函数和对象 - 按字母顺序排列。有了这种支持,您可以使用 Simulink Coder™MATLAB Function 模块生成可嵌入的 C 代码,实现各种复杂的数学应用。这样,您可以构建利用 MATLAB 功能但在 MATLAB 环境之外运行的可执行文件。

  • 从 Simulink 输入和输出信号继承属性 - 默认情况下,MATLAB Function 模块的输入和输出信号的大小和类型均从 Simulink 信号继承。您还可以选择在 Ports and Data Manager(请参阅 Ports and Data Manager)或 Model Explorer(请参阅 使用 Model Explorer 进行搜索和编辑)中显式指定输入和输出的大小和类型。

从 MATLAB Function 模块调用函数

要将 MATLAB 代码集成到 Simulink 模型中,您可以从 MATLAB Function 模块调用下列任一函数。

  • 局部函数 - 您可以调用在 MATLAB Function 模块的主体中定义的局部函数。

  • 支持代码生成的 MATLAB 工具箱函数 - 您可以从 MATLAB Function 模块调用支持代码生成的工具箱函数。当您使用 Simulink Coder 编译模型时,这些函数会生成经过优化的 C 代码,以满足桌面和嵌入式环境的内存和性能要求。要查看支持的函数列表,请参阅 C/C++ 代码生成支持的函数和对象 - 按字母顺序排列

  • 不支持代码生成的 MATLAB 函数 - 您也可以从 MATLAB Function 模块调用外部函数。这些函数位于 MATLAB 路径中,由编译器调度给 MATLAB 软件进行执行,因为目标语言不支持它们。它们不生成代码,但在模型仿真期间仅在 MATLAB 工作区中执行。Simulink Coder 软件会尝试编译所有 MATLAB 函数,除非您使用 coder.extrinsic 明确声明它们是外部函数。请参阅将 MATLAB 函数声明为外部函数

    代码生成软件可以检测对许多常见的可视化函数(如 plotdispfigure)的调用。对于 MEX 代码生成,它会自动请求 MATLAB 来执行这些函数。对于独立代码生成,不会为这些可视化功能生成代码。因此,您不必使用 coder.extrinsic 函数来声明这些外部函数。请参阅 Resolution of Function Calls for Code Generation

  • 来自 Simulink Function 模块和 Stateflow® 模块的函数 - 从 MATLAB Function 模块,您也可以调用在 Simulink Function 模块中定义的函数。如果在 Stateflow 图的 Properties 对话框中选中 Export Chart Level Functions (Make Global)Allow exported functions to be called by Simulink 复选框,您可以调用 Stateflow 函数。有关如何调用在 Simulink Function 和 Stateflow 模块中定义的函数的更多信息,请参阅 Simulink functions: Simulink Function block, exported Stateflow graphical and MATLAB functions

在 MATLAB Function 模块中使用非直接馈通

在 Simulink 模块中,直接馈通意味着模块的输出由输入端口信号的值直接控制。在非直接馈通中,在仿真期间,至少有一个函数的输出信号的值不取决于输入信号值。

默认情况下,MATLAB Function 模块已启用直接馈通。如果禁用直接馈通,Simulink 语义会确保输出仅依赖于当前状态。使用非直接馈通使您能够在反馈回路中使用 MATLAB Function 模块并防止代数环。

要使用非直接馈通,请在 Ports and Data Manager 中的 MATLAB Function Block Editor 中,在 Editor 选项卡上选择 Edit Data,并清除 Allow direct feedthrough 复选框。有关详细信息,请参阅Ports and Data Manager

提示

不要将输出编程为依赖输入或更新后的持久变量。例如,不要在非直接馈通模块中使用以下代码:

counter = counter + 1;  	% update state
output = counter;       	% compute output based on updated state
可改用以下代码:
output = counter;       	% compute output based on current state
counter = counter + 1;  	% update state

注意

要使用非直接馈通,您需要使用 coder.inline 启用函数内联。

另请参阅

相关主题