Simulink代码生成:通过Legacy Code Tool集成C函数
本文通过一个例程来简述如何使用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)首先进入安装页面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 <math.h>
#include "gougu_lct.h"float gougu_lct(float* a, float* b)
{float c;c = sqrt((pow(*a,2) + pow(*b,2)));return c;
}
3)打开头文件gougu_lct.h,写入函数的声明。
float gougu_lct(float* a, float* b);
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]
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;
其中,各个属性的意思如下:
属性名称 | 含义 |
---|---|
def.SFunctionName | S-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])';
这里做一些简单解释:
字符 | 含义 |
---|---|
single y1 | 表示模块的输出y1是single类型,对应C函数返回的变量c |
gougu_lct | C代码中的函数名 |
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);
运行完成后会在Matlba当前路径下生成gougu_lct_sfcn.c这个S-function源文件。
5)通过legacy_code函数编译这个S-function源文件,在Matlab命令行运行如下指令。
>> legacy_code('compile',def);
然后,Matlab命令窗口会显示一些编译信息。
同时,会在当前路径生成gougu_lct_sfcn.mexw64文件。
6)通过legacy_code函数在一个新的Simulink窗口中生成S-function模块,该模块拥有C函数的功能。在Matlab命令行运行如下指令。
>> legacy_code('slblock_generate',def);
弹出的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);
运行后,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的基本方法,展示了一个完整的流程。实际项目中可能会遇上更多的问题需要想办法解决。
>>返回个人博客总目录
Simulink代码生成:通过Legacy Code Tool集成C函数相关推荐
- Legacy Code Tool
Legacy Code Tool是Matlab中的一个命令行工具,它可以很方便的将已有的C代码或者C++代码(注:不支持C++对象)与模型结合起来. 可以将C或C++代码编译生成用于仿真的S-fuct ...
- simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成
前段时间有读者朋友问代码生成的例子,说他正在做EPB的仿真模型,但总是和应用串不到一块去,我这里就从一个简单EPB控制模型来谈谈simulink代码生成,总结代码生成方法的同时也顺便回答他的问题. 1 ...
- simulink快捷键_从EPB模型谈谈Simulink代码生成
前段时间有读者朋友问代码生成的例子,说他正在做EPB的仿真模型,但总是和应用串不到一块去,我这里就从一个简单EPB控制模型来谈谈simulink代码生成,总结代码生成方法的同时也顺便回答他的问题. 1 ...
- Simulink代码生成:生成C++类
博主最近在工作中用Simulink生成C++类的代码,因此将一些感悟记录下来.本文通过一个简单的例子研究Simulink生成C++类的代码以及一些相关配置. 文章目录 1 创建模型 2 C++类生成配 ...
- Simulink代码生成:Step函数接口配置
本文研究Simulink生成代码时的step函数的名称和参数. 文章目录 1 问题引入 2 配置过程 3 代码生成 4 总结 1 问题引入 在之前的一篇博客<Simulink代码生成:Simul ...
- Simulink代码生成(二十二)——TSP开发之创建外部设备模块
Simulink代码生成(二十二)--TSP开发之创建外部设备模块 文章目录 Simulink代码生成(二十二)--TSP开发之创建外部设备模块 一.C Mex Sfunction文件解读 一.C M ...
- Simulink代码生成(二)——代码生成时模型的配置方法及操作流程
Simulink代码生成(二)--代码生成时模型的配置方法及操作流程 文章目录 Simulink代码生成(二)--代码生成时模型的配置方法及操作流程 一.模型 二.代码生成设置 1.步长选择 2.系统 ...
- Simulink代码生成: 调用Matlab函数
本文研究Simulink模型中调用Matlab函数的方法. 文章目录 1 Matlab Function模块 2 建模与代码生成 3 Matlab Function中的数据管理 3.1 关联Signa ...
- Simulink代码生成(三)——rtw文件(代码生成的中间产物)
Simulink代码生成(三)--rtw文件(代码生成的中间产物) 文章目录 Simulink代码生成(三)--rtw文件(代码生成的中间产物) 一.代码生成过程 二.model.rtw文件解读 一. ...
- Simulink代码生成: 延时模块及其代码
Simulink代码生成: 延时模块及其代码_u013288925的博客-CSDN博客_simulink延时模块
最新文章
- FreeType简介及在vs2010的编译使用
- c语言杨辉三角的实现
- HDFS 的Trash回收站功能的配置、使用
- Topcoder Srm 671 Div2 1000 BearDestroysDiv2
- oracle+手工创建pfile,oracle 手工创建数据库
- 电子计算机空调,电子计算机机房空调的设计规范
- 计算机辅助设计b实验目的,上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析...
- linux ucontext族函数的原理及使用
- Codeforces Round #552 (Div. 3) Editorial 1154C - Gourmet Cat
- Spring源码之bean的属性填充populateBean方法解读
- WinRunner在项目中的作用
- 最短哈密顿路matlab,最短路径系列【最短路径、哈密顿路等】
- ActiveMQ消息持久化_队列_7
- matlab中subplot函数用法
- Python爬虫:抓取多级页面数据
- 【木叶精品系统】木叶 GhostXP SP3 纯净版/装机版_2013.06
- from batchgenerators.transforms import ComposeImportError: cannot import name ‘Compose‘ from ‘batch
- java book打印机_java如何调用本地打印机进行图片打印
- 1034:计算三角形面积
- linux查看历史的所有命令,linux查询历史记录命令history的用法介绍
热门文章
- 用SAS如何读取数据
- 计算机网络工程师 考试题,计算机四级网络工程师考试题及答案.docx
- huobi API使用经验整理
- 嵌入式硬件从接杜邦线起-杜邦头接线实操①
- dell云存储服务器,dell云存储服务器(戴尔存储服务器)
- 淘宝客?CPS技术是怎么实现的?
- 11.什么是Heuristic
- VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti
- atom 64 linux,英特尔:Android的64位Atom处理器已完工
- 安装 emoji 字体