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. 将模型另存为 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,然后再次编译,即可在窗口中看到以下消息。Diagnostic 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 模块创建对象,并修改属于该模型的属性。要查询您刚刚创建的 call_stats_block2 模型中的属性,请创建配置对象。

myconfig = get_param('call_stats_block2/MATLAB Function', 'MATLABFunctionConfiguration')
myconfig = 

  MATLABFunctionConfiguration with properties:

                         Path: 'call_stats_block2/MATLAB Function'
               FunctionScript: 'function [mean,stdev] = stats(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;↵'
                 UpdateMethod: Inherited
                   SampleTime: '-1'
                  Description: ''
                 DocumentLink: ''
        SupportVariableSizing: 1
       AllowDirectFeedthrough: 1
    SaturateOnIntegerOverflow: 1
                    TreatAsFi: FixedPoint
                   FimathMode: SameAsMATLAB
                       Fimath: 'fimath('RoundingMethod','Nearest','OverflowAction','Saturate','ProductMode','FullPrecision','SumMode','FillPrecision')'
要更改配置对象中的任何属性,请对对象名称使用圆点表示法。例如,要将说明更改为此模型中的 MATLAB Function 模块:
myconfig.Description = 'This model outputs the mean and standard deviation values of an array'
要了解有关您可以在 MATLAB Function 配置对象中修改的属性的详细信息,请参阅 MATLABFunctionConfiguration

为代码生成定义局部变量

要从 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 窗口将显示一条表示成功的消息。否则,此窗口可帮助您定位错误,如定位并修复错误。中所述。

以编程方式将代码添加到 MATLAB Function 模块

此示例说明如何以编程方式将 MATLAB Function 模块添加到模型中,并用 MATLAB 代码填充该模块。如果您已有 MATLAB 代码,并且不想手动将其添加到 MATLAB Function 模块中,此工作流可能会很方便。

  1. 创建并保存名为 myModel 的模型。

  2. 使用以下代码创建一个 MATLAB function,并将其保存在 myAdd.m 中。

    function c = myAdd(a, b)
    c = a + b;

  3. 编写一个 MATLAB 脚本,它将 MATLAB Function 模块添加到 myModel 中,并在其中填充 myAdd.m 的内容。

    % Add a MATLAB Function block to a model and populate the block with MATLAB
    % code.
    %
    % Copyright 2018 The Mathworks, Inc.
    
    open_system('myModel.slx');
    libraryBlockPath = 'simulink/User-Defined Functions/MATLAB Function';
    newBlockPath = 'myModel/myBlockName';
    % Add a MATLAB Function to the model
    add_block(libraryBlockPath, newBlockPath);
    % In memory, open models and their parts are represented by a hierarchy of
    % objects. The root object is slroot. This line of the script returns the
    % object that represents the new MATLAB Function block:
    blockHandle = find(slroot, '-isa', 'Stateflow.EMChart', 'Path', newBlockPath);
    % The Script property of the object contains the contents of the block,
    % represented as a character vector. This line of the script loads the
    % contents of the file myAdd.m into the Script property:
    blockHandle.Script = fileread('myAdd.m');
    % Alternatively, you can specify the code directly in a character vector.
    % For example: 
    % blockHandle.Script = 'function c = fcn (a, b)';

  4. 运行该脚本,观察 myModel 中的新 MATLAB Function 模块。

  5. 要查看您添加到模块中的代码,请双击 myBlockName 模块。

另请参阅

|

相关主题