matlab如何创建callback函数_创建使用 MATLAB Function 模块的模型

2c3307e01a8040aeb01e6b42eff5b1cc.png

创建使用 MATLAB Function 模块的模型

向模型中添加一个 MATLAB Function 模块

1. 创建一个新的 Simulink® 模型,并从 User-Defined Functions 库中为模型添加一个 MATLAB Function 模块:

9b10b12249ced40b6ebe9f1e2471ce86.png

2. 将以下 Source 和 Sink 模块添加到模型中:

o 从 Sources 库中,在 MATLAB Function 模块的左侧添加一个 Constant 模块,并将其值设置为向量 [2 3 4 5]

o 从 Sinks 库中,在 MATLAB Function 模块的右侧添加两个 Display 模块。

ceed393d0f554e91743f479d2a5fd780.png

3. 在 Simulink Editor 中,选择 File > Save As,将模型另存为 call_stats_block1

编写 MATLAB Function 模块

以下练习演示如何为模块编程,以计算值向量的均值和标准差:

1. 打开您在向模型中添加一个 MATLAB Function 模块的最后保存的 call_stats_block1 模型。双击 MATLAB Function 模块 fcn 将其打开以进行编辑。

将显示默认的函数签名。

2. 编辑函数头行:

3.      function [mean,stdev] = stats(vals)

函数 stats 计算向量 vals 中的值的统计均值和标准差。函数头将 vals 声明为 stats 函数的参数,将 meanstdev 作为返回值。

4. 将模型另存为 call_stats_block2

5. 按如下所示完成与 MATLAB Function 模块的连接。

e3be23d3d179016de56652d7701bc7d2.png

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

7.      % calculates a statistical mean and a standard
8.      % deviation for the values in vals.
9.       
10.  len = length(vals);
11.  mean = avg(vals,len);
12.  stdev = sqrt(sum(((vals-avg(vals,len)).^2))/len);
13.  plot(vals,'-+');
14.   
15.  function mean = avg(array,size)
16.  mean = sum(array)/size;

17. 将模型另存为 call_stats_block2

编译函数并检查错误

在 Simulink 模型中为 MATLAB Function 模块编程后,可以编译函数并测试是否有错误。本节介绍以下步骤:

1. 设置编译器。

2. 编译函数。

3. 定位并修复错误。

设置编译器

编译 MATLAB Function 模块需要使用支持的编译器。MATLAB 会自动选择一个编译器作为默认编译器。如果您的系统上安装了多个受 MATLAB 支持的编译器,您可以使用 mex -setup 命令更改默认编译器。请参阅更改默认编译器 (MATLAB)。

仿真编译支持的编译器. 要查看用于编译包含 MATLAB Function 模块的模型以进行仿真的编译器列表,请执行以下操作:

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

2. 选择您的平台。

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

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

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

2. 选择您的平台。

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

如何为 MATLAB Function 模块生成代码

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

2. 双击其中的 MATLAB Function 模块 stats,打开该模块进行编辑。

3. 在 MATLAB Function 模块编辑器中,选择 Build Model > Build 以编译和构建示例模型。

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

如何定位和修复错误

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

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

1. 在 stats 函数中,将局部函数 avg 更改为虚构的局部函数 aug,然后再次编译,即可在窗口中看到以下消息:

Simulation Diagnostics 窗口为检测到的每个错误显示一个红色按钮。

2. 点击第一个错误行,在底部错误窗口显示其诊断消息。

该消息还链接一个报告,提供有关 MATLAB 函数中的变量和表达式的编译时类型信息。此信息可帮助您诊断错误消息并了解类型传播规则。有关该报告的详细信息,请参阅 MATLAB Function Reports。

3. 在所选错误的诊断消息中,点击函数名称后面的蓝色链接,以显示有问题的代码。

有问题的代码行在 MATLAB Function 模块编辑器中突出显示:

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

定义输入和输出

在您在编写 MATLAB Function 模块中定义的 MATLAB Function 模块的 stats 函数头中,函数参数 vals 是输入,meanstdev 是输出。默认情况下,函数输入和输出从其端口连接的信号继承数据类型和大小。在本主题中,您将检查 MATLAB Function 模块的输入和输出数据,以验证它们是否继承了正确的类型和大小。

1. 打开您在编写 MATLAB Function 模块的最后保存的 call_stats_block2 模型。双击 MATLAB Function 模块 stats 将其打开以进行编辑。

2. 在 MATLAB Function 模块编辑器中,选择 Edit Data

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

len = length(vals);

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值