本文通过一个例程来简述如何使用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.cgougu_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函数相关推荐

  1. Legacy Code Tool

    Legacy Code Tool是Matlab中的一个命令行工具,它可以很方便的将已有的C代码或者C++代码(注:不支持C++对象)与模型结合起来. 可以将C或C++代码编译生成用于仿真的S-fuct ...

  2. simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成

    前段时间有读者朋友问代码生成的例子,说他正在做EPB的仿真模型,但总是和应用串不到一块去,我这里就从一个简单EPB控制模型来谈谈simulink代码生成,总结代码生成方法的同时也顺便回答他的问题. 1 ...

  3. simulink快捷键_从EPB模型谈谈Simulink代码生成

    前段时间有读者朋友问代码生成的例子,说他正在做EPB的仿真模型,但总是和应用串不到一块去,我这里就从一个简单EPB控制模型来谈谈simulink代码生成,总结代码生成方法的同时也顺便回答他的问题. 1 ...

  4. Simulink代码生成:生成C++类

    博主最近在工作中用Simulink生成C++类的代码,因此将一些感悟记录下来.本文通过一个简单的例子研究Simulink生成C++类的代码以及一些相关配置. 文章目录 1 创建模型 2 C++类生成配 ...

  5. Simulink代码生成:Step函数接口配置

    本文研究Simulink生成代码时的step函数的名称和参数. 文章目录 1 问题引入 2 配置过程 3 代码生成 4 总结 1 问题引入 在之前的一篇博客<Simulink代码生成:Simul ...

  6. Simulink代码生成(二十二)——TSP开发之创建外部设备模块

    Simulink代码生成(二十二)--TSP开发之创建外部设备模块 文章目录 Simulink代码生成(二十二)--TSP开发之创建外部设备模块 一.C Mex Sfunction文件解读 一.C M ...

  7. Simulink代码生成(二)——代码生成时模型的配置方法及操作流程

    Simulink代码生成(二)--代码生成时模型的配置方法及操作流程 文章目录 Simulink代码生成(二)--代码生成时模型的配置方法及操作流程 一.模型 二.代码生成设置 1.步长选择 2.系统 ...

  8. Simulink代码生成: 调用Matlab函数

    本文研究Simulink模型中调用Matlab函数的方法. 文章目录 1 Matlab Function模块 2 建模与代码生成 3 Matlab Function中的数据管理 3.1 关联Signa ...

  9. Simulink代码生成(三)——rtw文件(代码生成的中间产物)

    Simulink代码生成(三)--rtw文件(代码生成的中间产物) 文章目录 Simulink代码生成(三)--rtw文件(代码生成的中间产物) 一.代码生成过程 二.model.rtw文件解读 一. ...

  10. Simulink代码生成: 延时模块及其代码

    Simulink代码生成: 延时模块及其代码_u013288925的博客-CSDN博客_simulink延时模块

最新文章

  1. FreeType简介及在vs2010的编译使用
  2. c语言杨辉三角的实现
  3. HDFS 的Trash回收站功能的配置、使用
  4. Topcoder Srm 671 Div2 1000 BearDestroysDiv2
  5. oracle+手工创建pfile,oracle 手工创建数据库
  6. 电子计算机空调,电子计算机机房空调的设计规范
  7. 计算机辅助设计b实验目的,上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析...
  8. linux ucontext族函数的原理及使用
  9. Codeforces Round #552 (Div. 3) Editorial 1154C - Gourmet Cat
  10. Spring源码之bean的属性填充populateBean方法解读
  11. WinRunner在项目中的作用
  12. 最短哈密顿路matlab,最短路径系列【最短路径、哈密顿路等】
  13. ActiveMQ消息持久化_队列_7
  14. matlab中subplot函数用法
  15. Python爬虫:抓取多级页面数据
  16. 【木叶精品系统】木叶 GhostXP SP3 纯净版/装机版_2013.06
  17. from batchgenerators.transforms import ComposeImportError: cannot import name ‘Compose‘ from ‘batch
  18. java book打印机_java如何调用本地打印机进行图片打印
  19. 1034:计算三角形面积
  20. linux查看历史的所有命令,linux查询历史记录命令history的用法介绍

热门文章

  1. 用SAS如何读取数据
  2. 计算机网络工程师 考试题,计算机四级网络工程师考试题及答案.docx
  3. huobi API使用经验整理
  4. 嵌入式硬件从接杜邦线起-杜邦头接线实操①
  5. dell云存储服务器,dell云存储服务器(戴尔存储服务器)
  6. 淘宝客?CPS技术是怎么实现的?
  7. 11.什么是Heuristic
  8. VMware Workstation 与 Device/Credential Guard 不兼容.在禁用 Device/Credenti
  9. atom 64 linux,英特尔:Android的64位Atom处理器已完工
  10. 安装 emoji 字体