Simulink 中的嵌入式函数问题

Posted

技术标签:

【中文标题】Simulink 中的嵌入式函数问题【英文标题】:Problems with Embedded Functions within Simulink 【发布时间】:2013-11-20 18:10:52 【问题描述】:

我正在尝试使用嵌入式 matlab 函数模拟一个非常简单的模型,该函数接受输入并使用输入到 matlab 函数的常量块将值加 10,然后输出到显示块。

一按下模拟,就会出现大量错误。首先,我得到一个橙色文本的大段,指出求解器 'variableStepDiscrete' 而不是求解器 'ode45' 发出警告

这是从命令提示符回显的剩余行:

Code Directory :
 "/Users/dazgti/Documents/MATLAB/slprj/_sfprj/embeddedFunction/_self/sfun/src"

Machine (#32): "embeddedFunction"  Target : "sfun"


Chart "MATLAB Function" (#49):

.
     "c2_embeddedFunction.h"
 "c2_embeddedFunction.c"

 "embeddedFunction_sfun.h"

 "embeddedFunction_sfun.c"

 "embeddedFunction_sfun_debug_macros.h"


Interface and Support files:

 "embeddedFunction_sfun_registry.c"

Code generation failed Attempt to execute SCRIPT union as a function:
/Users/dazgti/Documents/MATLAB/union.m

我的 matlab 目录中有一个名为 union.m 的脚本文件,但我不知道为什么会提到它。

function y  = fcn(u)
%#codegen

x = u + 10;

y = x;

【问题讨论】:

【参考方案1】:

MATLAB Function 模块通过为您在模块中输入的 MATLAB 代码生成“C”代码来工作。在生成代码的过程中,可能会从 MATLAB Function 块基础结构调用 MATLAB 中的 union 函数。由于您已覆盖联合函数而不是内置函数,MATLAB 可能已尝试调用导致错误的脚本。最好避免将函数命名为与 MATLAB 内置函数相同。

【讨论】:

谢谢。我已将函数名称更改为hello(u),但问题仍然存在。我已经很长时间没有使用我的union.m 脚本了,所以我不知道它为什么要找到它。这是我第一次尝试在 simulink 中嵌入函数。 唯一的解决方案是从 MatLab 路径中取出 union.m,这对我来说似乎很荒谬。在最初删除 union.m 文件时,我还遇到了另一个问题,即 MatLab 找不到 XCode 附带的 C 编译器。除了 union.m 文件的初始问题外,现在此问题已得到解决。 当前目录中的 MATLAB 函数,然后您添加的路径中的函数优先于内置函数。在 MATLAB 中,您可以执行“which -all union”并查看它返回的内容吗?它应该只包含内置或在您的 MATLAB 安装下。 谢谢,我输入了命令which all union,它返回了这个:built-in (/Applications/MATLAB_R2012a_Student.app/toolbox/matlab/ops/@char/all) % char method 你的意思是我可能将我自己的自定义M文件命名为union.m与内置的相同在功能上? 将您的union.m 重命名为my_union.m。关闭并重新启动 MATLAB。您可以忽略有关求解器的警告,它告诉您它已将求解器从 ode45(默认)更改为 VariableStepDiscrete,因为您的模型中没有任何连续状态。

以上是关于Simulink 中的嵌入式函数问题的主要内容,如果未能解决你的问题,请参考以下文章

在simulink的嵌入式matlab函数中使用scatterInterpolant变量

使用嵌入式matlab功能块的simulink模型中信号的频率内容?

Simulink代码生成: 信号线参数配置

Simulink代码生成: 信号线参数配置

Windows下如何使用Matlab嵌入式编码器为LINUX编译?

团队作业_总结_RTCSD2017