首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Simulink代码生成:通过Legacy Code Tool集成C函数

  • 23-09-22 01:03
  • 3218
  • 6727
blog.csdn.net

本文通过一个例程来简述如何使用Legacy Code Tool将外部C函数集成到Simulink模型中。

文章目录

  • 1 问题引入
  • 2 编译器安装
  • 3 Legacy Code Tool简单示例
    • 3.1 创建C文件和头文件
    • 3.2 通过LCT生成S-function模块
    • 3.3 模型仿真
    • 3.4 代码生成
  • 4 总结

1 问题引入

假设一个公司在旧的项目中,没有通过Simulink建模并生成代码,而是纯手写的C代码。在新的项目中应用了Matlab的这一套工具链进行MBD开发,想要在模型中直接调用以前写的C函数可以吗?

答案是肯定的。很多工程师会首先想到通过S-function去完成。博主想介绍一种更加简便的方法——Legacy Code Tool,把已经写好的C函数集成到Simulink模型中。现有的C代码中的函数将会作为一个Simulink模块进行仿真以及生成代码。

其实Legacy Code Tool背后的机制也是通过S-Function实现,但是LCT可以直接生成.mexw64文件和S-Function代码,而不需要工程师手动创建。

2 编译器安装

由于集成C函数的过程中涉及到了C代码的编译,所以必须在Matlab中安装一个MingW64编译器,方法如下。

1)首先进入安装页面http://iyenn.com/index/link?url=https://www.mathworks.com/matlabcentral/fileexchange/52848-matlab-support-for-mingw-w64-c-c-compiler?s_tid=mwa_osa_a

2)点击右侧的Download下载安装文件mingw.mlpkginstall。
在这里插入图片描述
3)在Matlab中打开这个安装文件,就会自动安装。
在这里插入图片描述
4)安装完成后,在Matlab命令行窗口输入mex -setup,就会显示MinGW64编译器信息如下:
在这里插入图片描述
这样就算是安装完成了。如果安装不成功就会报错。

3 Legacy Code Tool简单示例

本章节通过一个简单的例程来演示通过LCT集成C函数的方法。

3.1 创建C文件和头文件

既然是集成C函数,那么必须得要有个C文件和头文件才行。

1)首先在Matlab当前文件夹中新建一个gougu_lct.c和gougu_lct.h文件。
在这里插入图片描述
2)打开C文件gougu_lct.c,在其中写入如下代码,包含一个计算勾股定理的函数。

#include 
#include "gougu_lct.h"

float gougu_lct(float* a, float* b)
{
    float c;
    c = sqrt((pow(*a,2) + pow(*b,2)));
    return c;    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3)打开头文件gougu_lct.h,写入函数的声明。

float gougu_lct(float* a, float* b);
  • 1

3.2 通过LCT生成S-function模块

1)在Matlab命令行运行legacy_code函数来初始化一个LCT结构体def,该结构体中包含LCT的一些属性信息。

>> def = legacy_code('initialize')

def = 

  包含以下字段的 struct:

                  SFunctionName: ''
    InitializeConditionsFcnSpec: ''
                  OutputFcnSpec: ''
                   StartFcnSpec: ''
               TerminateFcnSpec: ''
                    HeaderFiles: {}
                    SourceFiles: {}
                   HostLibFiles: {}
                 TargetLibFiles: {}
                       IncPaths: {}
                       SrcPaths: {}
                       LibPaths: {}
                     SampleTime: 'inherited'
                        Options: [1×1 struct]
                        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

2)接下来为这个结构体指定一些具体的属性值

>> def.SFunctionName = 'gougu_lct_sfcn';
>> def.HeaderFiles = {'gougu_lct.h'};
>> def.SourceFiles = {'gougu_lct.c'};
>> def.IncPaths = {'E:学习博客Simulink代码生成LCF'};
>> def.SrcPaths = def.IncPaths;
  • 1
  • 2
  • 3
  • 4
  • 5

其中,各个属性的意思如下:

属性名称含义
def.SFunctionNameS-function的名字,也就是对应的模块名
def.HeaderFiles头文件名称,要用单元数组
def.SourceFiles源文件名称,要用单元数组
def.IncPaths头文件路径,这个根据自己放的路径来写,不要照搬博主的
def.SrcPaths源文件路径,这里和头文件路径相同

3)指定OutputFcnSpec,该属性是一个字符串,通过一定的书写规律表现出C函数和对应的S-Function(也就是最后的Simulink模块)之间的输入、输出映射关系。

>> def.OutputFcnSpec = 'single y1 = gougu_lct(single u1[1],single u2[1])';
  • 1

这里做一些简单解释:

字符含义
single y1表示模块的输出y1是single类型,对应C函数返回的变量c
gougu_lctC代码中的函数名
single u1[1]u1表示第1个输入参数,对应C函数的第1个参数,类型为single
single u2[1]u2表示第2个输入参数,对应C函数的第2个参数,类型为single

需要注意一点,参数个数不同、返回个数不同、类型不同都会影响OutputFcnSpec字符串的写法,具体写法可以参照帮助文档Integrate C Functions Using Legacy Code Tool。

4)通过legacy_code函数生成S-function源文件,在Matlab命令行运行如下指令。

>> legacy_code('sfcn_cmex_generate',def);
  • 1

运行完成后会在Matlba当前路径下生成gougu_lct_sfcn.c这个S-function源文件。
在这里插入图片描述
5)通过legacy_code函数编译这个S-function源文件,在Matlab命令行运行如下指令。

>> legacy_code('compile',def);
  • 1

然后,Matlab命令窗口会显示一些编译信息。
在这里插入图片描述
同时,会在当前路径生成gougu_lct_sfcn.mexw64文件。
在这里插入图片描述
6)通过legacy_code函数在一个新的Simulink窗口中生成S-function模块,该模块拥有C函数的功能。在Matlab命令行运行如下指令。

>> legacy_code('slblock_generate',def);
  • 1

弹出的Simulink模型如图所示。
在这里插入图片描述

3.3 模型仿真

1)给模型加上输入常量,和输出display模块,并将常量设置为3和4.
在这里插入图片描述
2)由于C函数中输入输出是浮点型,并且OutputFcnSpec属性中也指定了single类型,所以要把输入的Constant常量的类型都改为single。
在这里插入图片描述
3)Ctrl + D更新模型,就会看到输出显示的数值是5,符合勾股定理的结果。
在这里插入图片描述
同时注意到,输入输出的类型都是single。

3.4 代码生成

1)通过legacy_code函数生成tlc文件,为后面的代码生成做准备。在Matlab命令行运行如下指令。

>> legacy_code('sfcn_tlc_generate',def);
  • 1

运行后,Matlab当前路径会生成gougu_lct_sfcn.tlc文件。

2)回到模型,将输入输出替换成Inport和Outport,并配置好Embedded Coder代码生成。
在这里插入图片描述
3)Ctrl + B生成代码。生成代码成功后,可以在step函数中看到对勾股定理函数的调用。
在这里插入图片描述
在demo.h头文件中也包含了gougu_lct.h头文件。
在这里插入图片描述
在后面编译软件的时候,不要忘记把gougu_lct.c和gougu_lct.h加进去一起编译。

4 总结

本文只是演示了一个使用LCT的基本方法,展示了一个完整的流程。实际项目中可能会遇上更多的问题需要想办法解决。

>>返回个人博客总目录

注:本文转载自blog.csdn.net的chhttty的文章"https://blog.csdn.net/u013288925/article/details/108350382"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top