【发布时间】:2018-08-29 01:53:35
【问题描述】:
我在 Simulink 上有类似于下面的框图,它看起来相当混乱,尤其是随着块数的增加。
我想用一个功能块替换一个 3 点求和块,同时保持相同的输出。
首先我将代码放在功能块中:
function y = fcn(u)
sys1 = tf(0.5,[1 0 0 4]);
sys2 = tf([3 0.5],[1 0 15]);
sys3 = tf(1,[1 1]);
y = sys1 + sys2 + sys3;
但是,我收到一条错误消息,说 Simulink 不支持代码生成。
“'tf' 类不支持代码生成。”
然后我在这里遇到了类似的问题:https://nl.mathworks.com/matlabcentral/answers/74770-is-there-any-way-to-disable-code-generation-in-simulink
我正在尝试实现一个外部函数或“包装函数”,但有些困难。我创建了一个名为 myWrapper.m 的新脚本,其中包含相同的代码:
function y = myWrapper(u)
sys1 = tf(0.5,[1 0 0 0 4]);
sys2 = tf([3 5],[1 0 15]);
sys3 = tf(1,[1 1]);
y = sys1 + sys2 + sys3;
和 MATLAB 函数编辑为:
function y1 = fcn(u1)
y1 = myWrapper(u1);
错误仍然存在。
我想从 MATLAB Function 块中访问 myWrapper.m 文件。关于如何做到这一点的任何指示?按照给出的上一个链接和official docs,我在我的 MATLAB 函数块中得到了类似的东西:
function y1 = fcn(u1)coder.extrinsic('myWrapper')
y1 = myWrapper(u1);
上面的最后一个代码在语法上是不正确的,我不知道应该怎么做。 MATLAB 自动将上述代码更正为:
function y1 = fcn(u1,coder,extrinsic, myWrapper )
y1 = myWrapper(u1);
这不是我想要的。
任何关于如何做到这一点的提示和/或建议将不胜感激。
两年前在 MathWorks 论坛here 上提出了一个类似的问题,但没有得到回应。
【问题讨论】:
-
你可能无法做到这一点,我认为明确的想法是因为编译器不想要惊喜
-
@AnderBiguri,非常感谢您的贡献。我也收到了您的第一条评论,我认为您指出这一点是正确的。关于上面的评论,我几乎可以肯定这是可以做到的,或者在以前版本的 Simulink/MATLAB 中是允许的。
-
2017a。我将编辑这个问题,以更广泛地了解我想要完成的工作。
-
好的,我会纠正自己的。它不会导致任何结果,因为您的传递函数对象不使用块输入
u作为输入。这些对象根本无法与 Simulink Solver 交互......您仍然没有回答我的问题,为什么您不使用显示的模型。模型看起来一点也不凌乱……在工作中,我总是看到乱七八糟的模型。你不会相信的。 -
正如@Sven 所评论的,您的代码不会复制您的模型至少有两个原因 - 您没有通过传递函数传递输入,甚至您是 @987654335 中的状态@ 对象不与 Simulink 求解器交互(而原始 Simulink 模块中的对象是)。但是,为了解决您的具体问题,您的代码的
coder.extrinsic('myWrapper')部分需要与function y1 = fcn(u1)部分位于单独的一行。