Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

使用 MATLAB Function 模块创建自定义功能

此示例说明如何创建模型,该模型使用 MATLAB Function 模块来计算值向量的均值和标准差。

创建模型

  1. 创建一个新 Simulink® 模型,并从 User-Defined Functions 库中插入一个 MATLAB Function 模块。

  2. 添加 Constant 模块,并将其值设置为向量 [2 3 4 5]。向模型中添加两个 Display 模块。

  3. 将模型另存为 call_stats_block1

MATLAB Function 模块编程

为模块编程,以计算值向量的均值和标准差:

  1. 双击 MATLAB Function 模块。默认函数签名出现在 MATLAB Function 模块编辑器中。在定义的函数签名内编写任何代码。

  2. 编辑函数头行:

    function [mean,stdev] = stats(vals)
    

    从该代码中,您定义了名为 stats 的函数,该函数计算向量 vals 中值的统计均值和标准差。函数头将 vals 声明为 stats 函数的参数,将 meanstdev 作为返回值。

  3. MATLAB Function 模块编辑器中,在函数头后输入一行空格,然后添加以下代码:

    % 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;
    
  4. 完成与 MATLAB Function 模块的连接,如下图所示。

  5. 将模型另存为 call_stats_block2

编译函数并检查错误

在 Simulink 模型中进行模块编程后,可以编译函数并测试是否有错误。编译 MATLAB Function 模块需要使用支持的编译器。MATLAB® 会自动选择一个编译器作为默认编译器。如果您的系统上安装了多个受 MATLAB 支持的编译器,您可以使用 mex -setup 命令更改默认编译器。请参阅更改默认编译器

支持仿真编译和代码生成编译的编译器

查看用于编译包含 MATLAB Function 模块的模型的编译器列表,其中分为用于仿真和代码生成两种情形。

  1. 导航到 Supported and Compatible Compilers 页并选择您的平台。

  2. 滚动至 Simulink 产品系列下的表。

  3. 如果包含 MATLAB Function 模块的模型是用于仿真,请在标题为 Simulink For Model Referencing, Accelerator mode, Rapid Accelerator mode, and MATLAB Function blocks 的列中查找打勾的编译器。

    如果包含 MATLAB Function 模块的模型要生成代码,请在标题为 Simulink Coder™ 的列中查找打勾的编译器。

代码生成支持的编译器

要为包含 MATLAB Function 模块的模型生成代码,可将 Simulink 软件支持的任何 C 编译器与 Simulink Coder 结合使用以进行代码生成。要查看这些编译器的列表,请执行以下操作:

  1. 导航到 Supported and Compatible Compilers 网页。

  2. 选择您的平台。

  3. 在针对 Simulink 和相关产品的表格中,在标题为 Simulink Coder 的列中查找打勾的编译器。

定位并修复错误。

如果编译过程中出现错误,Diagnostics Viewer 窗口将列出错误,并提供指向违规代码的链接。

以下练习显示在 MATLAB Function 模块中定位和修复错误的方法。

  1. stats 函数中,将局部函数 avg 更改为虚构的局部函数 aug,然后再次编译,即可在窗口中看到以下消息。Diagnostics Viewer 窗口用红线显示每个检测到的错误。

  2. 调查标题为 Undefined function or variable 'aug' 的错误。在所选错误的诊断消息中,点击函数名称后面的蓝色链接,以显示有问题的代码。有问题的代码行在 MATLAB Function Block Editor 中突出显示。

  3. 该消息还链接一个报告,提供有关 MATLAB 函数中的变量和表达式的编译时类型信息。此信息可帮助您诊断错误消息并了解类型传播规则。有关该报告的详细信息,请参阅 MATLAB Function Reports。要查看报告,请点击名为 Launch diagnostic report 的行中突出显示的蓝色链接。

  4. 通过将 aug 改回 avg 并重新编译来纠正错误。

定义输入和输出

默认情况下,函数输入和输出从其端口连接的信号继承数据类型和大小。检查 MATLAB Function 模块的输入和输出数据,以验证它们是否继承了正确的类型和大小。

  1. 双击 MATLAB Function 模块 stats

  2. 在 MATLAB Function 模块编辑器中,选择 Edit DataPorts and Data Manager 将打开,帮助您定义 MATLAB Function 模块的参数。

    左窗格显示您已经为 MATLAB Function 模块创建的参数 vals 以及返回值 meanstdev。注意为 vals 指定的 ScopeInput,即 Input from Simulink 的简写。为 meanstdev 指定的 ScopeOutput,即 Output to Simulink 的简写。

  3. 在 Ports and Data Manager 的左窗格中,在 vals 行中的任意位置点击以突出显示。

    右窗格显示 valsData 属性对话框。默认情况下,输入和输出参数的类、大小、单位以及复/实性从每个输入或输出端口连接的信号继承而来。通过将 Size 设置为 -1,将 Complexity 设置为 Inherited 并将 Type 设置为 “Inherit:Same as Simulink”,即可指定继承。

    大小和类型的实际继承值是在模型编译时设置的,并显示在左窗格中的 Compiled TypeCompiled Size 列。

    您可以在 Data 属性对话框的 Type 字段中指定输入或输出参数的类型,例如 double。还可以通过在 Size 字段中输入表达式来指定输入或输出参数的大小。例如,您可以在 Size 字段中输入 [2 3],将 vals 指定为 2×3 矩阵。有关可输入的类型和大小表达式的详细信息,请参阅指定函数参数类型指定函数参数大小

    注意

    在您为 MATLAB Function 模块函数添加的任何数组中,第一个索引都默认为 1,就像在 MATLAB 中一样。

以编程方式配置 MATLAB Function 模块

配置 MATLAB Function 模块有两种编程方法:

  • 使用 MATLABFunctionConfiguration 对象来查询和修改模块的属性。您可以通过使用模块路径或调用 gcb 函数来识别模型中的模块。

  • 使用 Stateflow.EMChart 对象访问模块的输入、输出和属性。通过导航 Stateflow® API 对象的层次结构来识别模型中的模块。

配置模块属性

以前面示例中所述的模型 call_stats_block1 为例。您可以通过调用 get_param 函数来访问此模型中 MATLAB Function 模块的 MATLABFunctionConfiguration 对象:

config = get_param('call_stats_block1/MATLAB Function', ...
    'MATLABFunctionConfiguration');

要查询或修改配置对象中的属性,请对对象名称使用圆点表示法:

myConfig.UpdateMethod
ans =

  'Inherited'
config.Description = 'Calculate the mean and standard deviation for a vector of values.';

要了解有关您可以在 MATLAB Function 配置对象中修改的属性的详细信息,请参阅 MATLABFunctionConfiguration

访问模块输入、输出和属性

要对 MATLAB Function 模块进行更好的编程控制,请通过对 Stateflow 对象层次结构顶层的 Simulink.Root 对象调用 find (Stateflow) 函数来访问其 Stateflow.EMChart 对象。

rt = sfroot;
block = find(rt,'-isa','Stateflow.EMChart', ...
    'Path','call_stats_block1/MATLAB Function');

要查询或修改配置对象中的属性,请对对象名称使用圆点表示法:

block.ChartUpdate
ans =

  'INHERITED'
block.Description = 'Calculate the mean and standard deviation for a vector of values.';

Stateflow.EMChart 对象使您能够访问在 MATLABFunctionConfiguration 对象中不可用的其他属性。例如,要创建模块的输入和输出的 table,请输入:

info = get([block.Inputs;block.Outputs],{'Name','Scope','Port'});
T = table(info(:,2),cell2mat(info(:,3)), ...
    'VariableNames',{'Scope','Port'}, ...
    'RowNames',info(:,1));
T.Scope = categorical(T.Scope)
T =

  3×2 table

             Scope     Port
             ______    ____

    vals     Input      1  
    mean     Output     1  
    stdev    Output     2  

有关详细信息,请参阅 Overview of the Stateflow API (Stateflow)

为代码生成定义局部变量

要从 MATLAB Function 模块中的 MATLAB 算法生成代码,则必须首先显式指定局部变量的类、大小和复/实性,然后才能在运算中使用这些局部变量或将它们作为输出返回(请参阅Data Definition for Code Generation)。在示例函数 stats 中,局部变量 len 是在用于计算均值和标准差之前定义的:

len = length(vals);

一旦将属性赋给变量,就不能在函数体中的其他地方重新定义变量的类、大小或复/实性,但有例外情况(请参阅Reassignment of Variable Properties)。

为 MATLAB Function 模块生成代码

  1. 打开您在MATLAB Function 模块编程的最后保存的 call_stats_block2 模型。

  2. 双击 stats 模块。

  3. 选择 Build Model > Build 以编译和构建示例模型。

    如果出现与 “Variable-step” 求解器相关的错误,请在 Configuration Parameters > Solver 中将求解器类型更改为 “Fixed-step” 求解器,然后重新运行编译。要了解固定步长和可变步长求解器之间区别的更多信息,请参阅 固定步长和可变步长求解器

    如果没有发生错误,Diagnostics Viewer 窗口将显示一条表示成功的消息。否则,此窗口可帮助您定位错误,如定位并修复错误。中所述。

另请参阅

| | | | | |

相关主题