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模型中信号的频率内容?