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