Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

MATLAB Function

MATLAB 代码包含在生成可嵌入式 C 代码的模型中

  • 库:
  • Simulink / User-Defined Functions

    HDL Coder / User-Defined Functions

  • MATLAB Function block

描述

使用 MATLAB Function 模块可以编写用于 Simulink® 模型的 MATLAB® 函数。MATLAB 函数针对仿真执行,并生成以 Simulink Coder™ 为目标的代码。如果您刚开始使用 Simulink 和 MATLAB 产品,请参阅用 MATLAB Function 模块在 Simulink 中实现 MATLAB 函数了解概述信息。

双击 MATLAB Function 模块将打开 MATLAB Function 模块编辑器,您可以在其中编写 MATLAB 函数。用 MATLAB Function 模块在 Simulink 中实现 MATLAB 函数中讨论的示例模型 call_stats_block2MATLAB Function 模块编辑器中使用以下函数:

function [mean,stdev] = stats(vals)

% Calculates a statistical mean and a standard
% deviation for the values in vals.

len = length(vals);
mean = avg(vals,len);
stdev = sqrt(sum(((vals-avg(vals,len)).^2))/len);
plot(vals,"-+");

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

该函数将函数声明语句中的输入和输出数据指定为参数和返回值。前面的示例函数的参数和返回值对应于以下 call_stats_block2 模型中的模块的输入和输出。

This shows connected signals between the blocks established in the previous image.

您还可以使用模型资源管理器或符号窗格来定义变量、添加输入触发器以及创建函数调用输出。有关详细信息,请参阅Create and Define MATLAB Function Block VariablesManage the Input Trigger of a MATLAB Function BlockManage Function Call Outputs of a MATLAB Function Block

MATLAB Function 模块基于分析来生成有效的可嵌入式代码,该分析可确定每个变量的大小、类和复/实性。该分析施加了以下限制:

除了语言限制,MATLAB Function 模块还支持 MATLAB 中提供的函数子集。这些函数包括常见类别的函数,例如:

有关详细信息,请参阅 C/C++ 代码生成支持的函数和对象

注意

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

注意

新的 MATLAB Function 模块不包括 %#codegen 指令,但在检查错误时就如果包含该指令一样。将 %#codegen 指令添加到 MATLAB Function 模块不会影响错误检查。有关详细信息,请参阅编译指令 %#codegen

为支持数据可视化,MATLAB Function 模块仅支持调用 MATLAB 函数进行仿真。请参阅使用 MATLAB 引擎在生成的代码中执行函数调用了解该功能的一些限制,以及该功能如何与此模块的代码分析集成在一起。如果这些函数调用不直接影响任何 Simulink 输入或输出,则这些调用不会出现在 Simulink Coder 生成的代码中。

MATLAB Function 模块中,还可以调用在 Simulink Function 模块中定义的函数。如果在图表的“属性”对话框中选中导出图级别函数(全局)允许 Simulink 调用导出的函数,则可以调用 Stateflow® 函数。

符号窗格中,您可以将模块输入声明为 Simulink 参数,而不是端口。MATLAB Function 模块还支持继承输入、输出和参数的类型及大小。您也可以显式指定这些属性。有关在 MATLAB Function 模块中使用的变量的描述,请参阅定义和修改变量数据类型指定 MATLAB Function 模块变量的大小配置 MATLAB Function 模块参数变量

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

默认情况下,MATLAB Function 模块已启用直接馈通。要禁用它,请清除允许直接馈通属性。非直接馈通语义确保输出仅依赖于当前状态。使用非直接馈通使您能够在反馈回路中使用 MATLAB Function 模块并防止代数环。有关详细信息,请参阅 Use Nondirect Feedthrough in a MATLAB Function Block

端口

输入

全部展开

输入端口,指定为标量、向量或矩阵。您创建的每个输入变量都有一个对应的输入端口。

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

有关此模块的定点支持的详细信息,请参阅Fixed-Point Data Types with MATLAB Function Block (Fixed-Point Designer)MATLAB Function Block with Data Type Override (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

输出

全部展开

输出端口,指定为标量、向量或矩阵。您创建的每个输出变量都有一个对应的输出端口。

依存关系

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

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

参数

全部展开

常设

选择如何在 MATLAB Function 模块图标上显示端口标签。

  • ” - 不显示端口标签。

  • FromPortIcon” - 显示输入和输出变量的名称。

  • FromPortBlockName” - 显示输入和输出变量的名称。

  • SignalName” - 如果连接到端口的信号已命名,则显示信号名称。否则,显示变量的名称。

编程用法

参数ShowPortLabels
类型:字符串标量或字符向量
"none" | "FromPortIcon" | "FromPortBlockName" | "SignalName"
默认值"FromPortIcon"

控制用户对 MATLAB Function 模块内容的访问。

  • ReadWrite” - 允许打开和修改 MATLAB Function 模块内容。

  • ReadOnly” - 允许打开 MATLAB Function 模块。

  • NoReadOrWrite” - 禁止打开或修改 MATLAB Function 模块。

注意

如果您尝试查看其读/写权限参数设置为 “NoReadOrWrite” 的 MATLAB Function 模块的内容,该模块不会响应。例如,当您双击 MATLAB Function 模块时,Simulink 不会打开表内容,也不会显示消息。

编程用法

参数Permissions
类型:字符串标量或字符向量
"ReadWrite" | "ReadOnly" | "NoReadOrWrite"
默认值"ReadWrite"

模块是否尝试在仿真期间消除包含原子单元的人为代数环。

  • off - 不尝试消除任何包含原子单元的人为代数环。

  • on - 尝试消除任何包含原子单元的人为代数环。

编程用法

参数MinAlgLoopOccurrences
类型:字符串标量或字符向量
"off" | "on"
默认值"off"

指定如何调度 MATLAB Function 模块。

  • 采样时间” - 指定 MATLAB Function 模块中的所有代码必须以相同的速率运行,还是能以不同的速率运行。

  • 周期性分区” - 使用周期性分区调度 MATLAB Function 模块代码。指定分区名称和与分区运行的速率对应的采样时间。

  • 非周期性分区” - 使用非周期性分区调度 MATLAB Function 模块代码。指定分区名称。

编程用法

参数ScheduleAs
类型:字符串标量或字符向量
"SampleTime" | "DiscretePartition" | "UnconstrainedPartition"
默认值"SampleTime"

指定此模块中的变量必须以相同的速率运行,还是能以不同的速率运行。

  • 如果 MATLAB Function 模块中的变量能以不同速率运行,请将采样时间指定为继承 (-1)。

  • 如果变量必须以相同的速率运行,请指定与此速率对应的采样时间 Ts

编程用法

参数SystemSampleTime
类型:字符串标量或字符向量
"-1" | "[Ts 0]"
默认值"-1"

代码生成

要启用这些参数,您必须拥有 Simulink Coder 或 Embedded Coder® 许可证。

选择模块用于为原子(非虚拟)单元生成代码的代码格式。

  • 自动” - Simulink Coder 和 Embedded Coder 将基于模型中存在的 MATLAB Function 模块的类型和实例数为您选择最佳格式。

  • 内联” - Simulink Coder 和 Embedded Coder 无条件地内联 MATLAB Function 模块。

  • 不可重用函数” - Simulink Coder 在单独的文件中显式生成单独的函数。

  • 可重用函数” - Simulink Coder 和 Embedded Coder 可以生成带参数的函数,当模型中包含模块的多个实例时,将允许重用模块的代码。

    此选项还生成具有参数的函数,该函数允许在模型引用层次结构的生成代码中重用 MATLAB Function 模块代码,该层次结构包括跨引用模型的 MATLAB Function 模块的多个实例。在这种情况下,模块必须在库中。

有关详细信息,请参阅:

提示

  • 如果您希望 MATLAB Function 模块的多个实例表示为一个可重用函数,可以为每个子系统指定“自动”或“可重用函数”。最好是使用其中一个,因为使用两个将生成两个可重用函数,每个指定一个函数。仅当可以重用时,这些选项的结果才会有区别。选择“自动”则不允许控制 MATLAB Function 模块代码的函数或文件名。

  • 可重用函数”和“自动”选项都尝试确定是否存在 MATLAB Function 模块的多个实例,以及是否可以重用代码。这两个选项的行为区别体现在不能重用时:

    • 自动”生成内联代码,或者在禁止内联的情况下为每个子系统 MATLAB Function 模块实例生成一个单独的函数。

    • 可重用函数”为模型中的每个子系统 MATLAB Function 模块实例生成一个单独的参数函数。

  • 如果您在生成的代码处于源代码管理状态下时选择了“可重用函数”,请将文件名选项设置为“使用子系统名称”、“使用函数名称”或“用户指定”。否则,只要您修改模型,代码文件的名称就会改变,从而无法对文件进行源代码管理。

编程用法

参数RTWSystemCode
类型:字符串标量或字符向量
"Auto" | "Inline" | "Nonreusable function" | "Reusable function"
默认值"Auto"

选择 Simulink Coder 如何命名它为模块生成的函数。

如果您拥有 Embedded Coder 许可证,则可以使用“配置参数”对话框的代码生成 > 标识符窗格上的选项来控制函数名称。

  • 自动” - 使用默认的命名约定 model_block() 指定唯一的函数名称,其中 model 是模型的名称,block 是模块的名称(或者,在重用代码时,也可以是相同子系统的名称)。

  • 使用子系统名称” - 使用 MATLAB Function 模块名称作为函数名称。默认情况下,函数名称使用命名约定 model_block

    注意

    MATLAB Function 模块位于库模块中而函数打包参数设置为“可重用函数”时,如果您设置“使用子系统名称”选项,代码生成器将使用模块库模块的名称作为函数名和文件名。

  • 用户指定” - 启用函数名称字段。输入任何合法的 C 或 C++ 函数名,此名称必须唯一。

有关详细信息,请参阅Generate Subsystem Code as Separate Function and Files (Simulink Coder)

依存关系

要启用此参数,请将函数打包设置为“不可重用函数”或“可重用函数”。

编程用法

参数RTWFcnNameOpts
类型:字符串标量或字符向量
"Auto" | "Use subsystem name" | "User specified"
默认值"Auto"

模块代码的函数名称。

如果要为函数指定特定的名称,而不是使用自动生成的名称或模块名称,请使用此参数。有关详细信息,请参阅Generate Subsystem Code as Separate Function and Files (Simulink Coder)

依存关系

要启用此参数,请将函数名称选项参数设置为“用户指定”。

编程用法

参数RTWFcnName
类型:字符串标量或字符向量
"" | "<function name>"
默认值""

Simulink Coder 如何命名它为模块生成的函数的单独文件。

  • 自动” - 根据模块的配置以及子系统在模型中的实例数,“自动”将生成不同的结果:

    • 如果代码生成器为模块生成单独的文件,模块代码将在从模块父级系统生成的代码模块中生成。如果模块的父级就是模型本身,将在 model.cmodel.cpp 内生成模块代码。

    • 如果您为函数打包参数选择了“可重用函数”,而您生成的代码处于源代码管理状态下,请不要将文件名选项值指定为“自动”。这样可以防止由于不相关的模型修改而更改生成的文件名,而在使用源代码管理来管理配置时,文件名的改变会产生问题。

    • 如果您为函数打包参数选择了“可重用函数”,而模块引用层次结构中存在模块的多个实例,则要为模块生成可重用代码,必须将文件名选项设置为“自动”。

  • 使用子系统名称” - 代码生成器生成单独的文件,使用模块名称作为文件名。

    注意

    文件名选项设置为“使用子系统名称”时,如果模型中包含 Model 模块,或者正在为模型生成模型引用目标,则模块文件将更改。在这些情况下,MATLAB Function 模块的文件名由模块名称加上模型名称前缀构成。

  • 使用函数名称” - 代码生成器使用函数名称选项指定的函数名称作为文件名。

  • 用户指定” - 此选项将启用文件名(无扩展名) 文本输入字段。代码生成器将使用您输入的名称作为文件名。可以输入任何文件名,但不要带 .c.cpp(或任何其他)扩展名。此文件名不必唯一。

    注意

    虽然 MATLAB Function 模块的源文件名不必唯一,但您必须避免指定可能会导致循环依存关系的不唯一名称(例如 sys_a.h 包含 sys_b.hsys_b.h 包含 sys_c.h,而 sys_c.h 包含 sys_a.h)。

依存关系

要启用此参数,请将函数打包设置为“不可重用函数”或“可重用函数”。

编程用法

参数RTWFileNameOpts
类型:字符串标量或字符向量
"Auto" | "Use subsystem name" | "Use function name" | "User specified"
默认值"Auto"

所生成文件的名称。您指定的文件名不必是唯一的。但是,应避免指定可能会导致循环依存关系的不唯一名称(例如,sys_a.h 包含 sys_b.hsys_b.h 包含 sys_c.h,而 sys_c.h 包含 sys_a.h)。

有关详细信息,请参阅Generate Subsystem Code as Separate Function and Files (Simulink Coder)

依存关系

要启用此参数,请将文件名选项设置为“用户指定”。

编程用法

参数RTWFileName
类型:字符串标量或字符向量
"" | "<file name>"
默认值""

模块特性

数据类型

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

直接馈通

多维信号

有限a

可变大小信号

有限a

过零检测

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

扩展功能

PLC 代码生成
使用 Simulink® PLC Coder™ 生成结构化文本代码。

版本历史记录

在 R2011a 中推出