Simulink调用外部C代码的几种方法
文章目录
一、源代码
1.1 Typedef.h
#ifndef _TYPEDEF_H
#define _TYPEDEF_H
#define EXLIB_API __declspec(dllexport)
typedef unsigned char uint8_t;
typedef short unsigned int uint16_t;
EXLIB_API extern uint16_t MaxValue;
EXLIB_API extern uint16_t Result;
EXLIB_API extern uint16_t GetMaxValue(uint16_t Input1, uint16_t Input2);
EXLIB_API extern uint16_t SquareOperation(uint16_t Input);
#endif
1.2 Max.c
#include "Typedef.h"
uint16_t GetMaxValue(uint16_t Input1, uint16_t Input2)
{
if(Input1 > Input2)
{
return Input1;
}
else
{
return Input2;
}
}
1.3 Square.c
#include "Typedef.h"
uint16_t MaxValue = 4500;
uint16_t Result;
uint16_t SquareOperation(uint16_t Input)
{
uint16_t Result = Input * Input;
if(Result > MaxValue)
{
Result = MaxValue;
}
return Result;
}
二、Matlab function调用
2.1 模型
2.2 配置
2.3 代码
function y = Mfcn(u1,u2)
%#codegen
y = 0;
coder.updateBuildInfo('addIncludePaths','[pwd]');
coder.cinclude('Typedef.h');
y = coder.ceval('GetMaxValue',u1,u2);
y = coder.ceval('SquareOperation',y);
三、dll调用
3.1 生成dll文件
以下指令可以生成对应的dll文件
mex(‘LDEXT=.dll’,‘LINKEXPORT=’,‘LINKEXPORTVER=’,‘LINKLIBS=’,‘Square.c’);
mex(‘LDEXT=.dll’,‘LINKEXPORT=’,‘LINKEXPORTVER=’,‘LINKLIBS=’,‘Max.c’);
3.2 模型
3.3 配置
需要在Model Properties中加载dll文件,否则仿真会报错
3.4 代码
注意:如果没有coder.extrinsic(‘calllib’);这句会报错,一定要加这一句,解释如下图。
function y = dllfcn(u1,u2)
coder.extrinsic('calllib');
y = 0;
% //loadlibrary('Max','Typedef.h');
% //loadlibrary('Square','Typedef.h');
y = calllib('Max', 'GetMaxValue', u1, u2);
y = calllib('Square', 'SquareOperation', y);
end
dll调用可以用S-function的方式,但是有点复杂,暂时还没有搞明白
四、C caller调用
4.1 配置
4.2 模型
五、Sfunction Builder调用
5.1 模型
5.2 配置
采用定步长仿真,离散状态个数为1,这里可以通过这个确定,将x‘看作一个状态量,x’=0。Discrete states IC即状态的初始值,设为0。
x1’ = 0;x = max(input1,input2);
y = x *x;
也可以将两个输入看作状态量,x1’ 和 x2’ ,如果离散状态量为2,Discrete states IC要设置为[0,0]
x1 = u1; x1’ = 0;
x2 = u2; x2’ = 0;
y = max(x1,x2) * max(x1,x2);
同理离散状态量也可以设置为3及以上,相当于都为0,不过Discrete states IC要对应赋值。
如果离散状态量设为0,会报错
六、Stateflow调用
6.1 模型