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 函数了解概述信息。

双击 MATLAB Function 模块将打开 MATLAB Function 模块编辑器,您可以在其中编写 MATLAB 函数。使用 MATLAB Function 模块创建自定义功能中讨论的示例模型 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.

您还可以使用模型资源管理器或端口和数据管理器定义数据、添加输入触发器和创建函数调用输出。您可以通过点击编辑数据来访问 MATLAB Function 模块编辑器中的端口和数据管理器。有关详细信息,请参阅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 Function 模块内函数的第一个输入参数的输入。如果在编辑器中重命名函数参数,则模块将相应地重命名该端口。

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)

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

MATLAB Function 模块中函数的第 n 个输入参数。在编辑器中添加参数时,模块会相应地添加端口。

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)

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

输出

全部展开

MATLAB Function 模块内函数的第一个输出参数。如果在编辑器中重命名函数参数,则模块将相应地重命名该端口。

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

MATLAB Function 模块内函数的第 N 个输出参数。在编辑器中添加参数时,模块会相应地添加端口。

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

参数

全部展开

代码生成选项卡中的参数需要 Simulink Coder 或 Embedded Coder®

常设

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

不显示端口标签。

FromPortIcon

显示函数输入和输出参数的名称。

FromPortBlockName

显示函数输入和输出参数的名称。

SignalName

如果连接到端口的信号已命名,则显示信号名称。否则,显示函数参数的名称。

编程用法

参数ShowPortLabels
类型:字符向量
'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'

在确定模块方法的执行顺序时,让 Simulink 将 MATLAB Function 模块视为一个单元。

on

在确定模块方法的执行顺序时,将 MATLAB Function 模块视为一个单元。例如,当 Simulink 需要计算模块的输出时,Simulink 调用 MATLAB Function 模块中所有代码的输出方法,然后调用与 MATLAB Function 模块处于同一级别的其他模块的输出方法。

off

在确定模块方法执行顺序时,将 MATLAB Function 模块中的所有代码视为与 MATLAB 函数在模型层次结构中处于同一级别。这种层次结构处理会导致模块中代码方法与图外的模块方法交错执行。

编程用法

参数TreatAsAtomicUnit
类型:字符向量
'on' | 'off'
默认值'on'

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

off

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

on

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

依存关系

要启用此参数,请选择视为原子单元参数。

编程用法

参数MinAlgLoopOccurrences
类型:字符向量
'off' | 'on'
默认值'off'

指定如何调度 MATLAB Function 模块。

采样时间

指定 MATLAB Function 模块中的所有代码必须以相同的速率运行,还是能以不同的速率运行。

周期性分区

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

非周期性分区

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

依存关系

要启用此参数,请选择视为原子单元参数。

编程用法

参数ScheduleAs
类型:字符向量
'SampleTime' | 'DiscretePartition' | 'UnconstrainedPartition'
默认值'SampleTime'

指定此模块中的所有代码必须以相同的速率运行,还是能以不同的速率运行。

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

  • 如果所有代码必须以相同的速率运行,则将与此速率对应的采样时间指定为采样时间参数的值。

-1

指定继承的采样时间。如果 MATLAB Function 中的代码能以不同速率运行,请使用此采样时间。

[Ts 0]

指定周期性采样时间。

依存关系

要启用此参数,请选择视为原子单元参数。

编程用法

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

代码生成

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

自动

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

内联

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

不可重用函数

如果文件名选项设置为“自动”,Simulink Coder 和 Embedded Coder 将单独函数打包到模型文件中。如果将文件名选项设置为“使用子系统名称”、“使用函数名称”或“用户指定”并使用其他文件名,Simulink Coder 和 Embedded Coder 将单独函数分别打包到独立的文件中。

采用此设置的 MATLAB Function 模块生成的函数可能有参数,具体取决于 函数接口, Function interface函数接口Function interface 参数设置。您可以使用参数 函数名称, Function name函数名称Function name文件名(无扩展名), File name (no extension)文件名(无扩展名)File name (no extension) 为生成的函数和文件命名。这些函数不可重入。

可重用函数

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

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

有关详细信息,请参阅:

提示

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

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

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

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

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

依存关系

  • 此参数需要 Simulink Coder 才能生成代码。

  • 要启用此参数,请选择视为原子单元

编程用法

参数RTWSystemCode
类型:字符向量
'Auto' | 'Inline' | 'Nonreusable function' | 'Reusable function'
默认值'Auto'

模块特性

数据类型

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

直接馈通

多维信号

有限a

可变大小信号

有限a

过零检测

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

扩展功能

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

版本历史记录

在 R2011a 中推出