simlink里面MATLAB Function ‘xxx‘ not supported for code generation.

matlab function :

function [xdot, U] = fcn(x,n,mp,rp,V_c,beta_c)
[xdot,U] = otter(x,n,mp,rp,V_c,beta_c);
end

1、现象-----运行程序出现下面错误:

2、原因:
simulink代码生成的过程中,有些函数是不支持内部代码生成的,需要将其定义为外部函数,使用coder.extrinsic声明一下即可,详细的你可以参考一下matlab的帮助文档doc coder.extrinsic外部函数

添加下面代码:

coder.extrinsic('otter');

3、继续运行,前面错误已经没有了,又报下面错误:

Function output 'Xdot' cannot be an mxArray in this context. Consider preinitializing the output variable 	with a known type

4、错误提示的很明显了,参数的类型问题,从3中的外部函数文档里面可以找到:

使用 mxArray
外部函数的输出是一个 mxArray - 也称为 MATLAB 数组。对 mxArrays 有效的操作只有下列几个:

  • 将 mxArrays 存储在变量中
  • 将 mxArrays 传递给函数,并从函数中返回它们
  • 在运行时将 mxArrays 转换为已知类型

要在其他操作中使用外部函数返回的 mxArrays,必须先将它们转换为已知类型,如将 mxArray 转换为已知类型中所述。

将 mxArray 转换为已知类型
要将 mxArray 转换为已知类型,请将 mxArray 指定给已定义类型的变量。在运行时,mxArray 将被转换为其指定给的变量的类型。但是,如果 mxArray 中的数据与该变量的类型不一致,将会发生运行时错误。

以如下代码为例:

function y = foo %#codegen
coder.extrinsic('rat');
[N D] = rat(pi);
y = min(N, D);

这里,顶层函数 foo 调用外部函数 rat,后者返回两个 mxArrays,分别代表 pi 的有理分式逼近式的分子 N 和分母 D。虽然可以将这两个 mxArrays 传递给另一个 MATLAB 函数(本例中为 min),但不能将 min 返回的 mxArray 指定给输出 y。

如果在 Simulink® 模型中的 MATLAB Function 模块中运行此函数 foo,仿真过程中代码将生成以下错误:

Function output ‘y’ cannot be of MATLAB type.
要解决此问题,请按如下方式将 y 定义为您希望 min 返回的值的类型和大小,本例中为双精度标量值:

function y = foo %#codegen
coder.extrinsic('rat');
[N D] = rat(pi);
y = 0; % Define y as a scalar of type double
y = min(N,D);

5、最后修改的函数如下:

function [xdot1, U1] = fcn(x,n,mp,rp,V_c,beta_c)
coder.extrinsic('otter');
[xdot,U] = otter(x,n,mp,rp,V_c,beta_c);
xdot1=zeros(12,1);
U1=0;
xdot1=xdot;
U1=U;
end
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值