Simulink调用外部C代码的几种方法

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 模型

在这里插入图片描述
在这里插入图片描述

6.2 配置

在这里插入图片描述

  • 15
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值