MEX S-Function 封装程序

使用 S-Function 封装程序创建 S-Function 的优点在于,只需对您的原始 C/C++ 函数进行很少改动或根本不需要改动,即可将 C/C++ 代码算法插入到 Simulink 模型和生成的代码中。MEX S-Function 封装程序是一个 S-Function,它调用位于另一个模块中的代码。

注意

MEX S-Function 封装程序只能在创建该封装程序的 MATLAB® 版本中使用。

假设您有一个名为 my_alg 的算法(即一个 C 函数),该算法位于 my_alg.c 文件中。您可以通过创建 MEX S-Function 封装程序(例如 wrapsfcn.c),将 my_alg 集成到 Simulink 模型中。然后 Simulink 模型即可从 S-Function 模块中调用 my_alg。Simulink S-Function 包含一组空函数,供 Simulink 引擎用来实现各种与 API 有关的目的。例如,虽然只有 mdlOutputs 调用 my_alg,但引擎还会调用 mdlTerminate,即使此 S-Function 例程并不执行任何操作。

您可以通过创建 TLC S-Function 封装程序(例如 wrapsfcn.tlc),在生成的代码中嵌入对 my_alg 的调用。您可以消除空函数调用。您可以避免执行 mdlOutputs 函数的开销,然后可以消除 my_alg 函数。

当您创建程序性的算法或将原有代码集成到 Simulink 模型中时,S-function 封装程序很有用。如果要创建以下代码:

本质上是解释性代码(即按操作模式高度参数化)

高度优化的代码(即不需要通过额外的测试来决定代码的运行模式)

则必须为您的 S-Function 创建一个完全内联的 TLC 文件。

下图显示了 S-Function 封装程序的概念。

使用 S-Function 封装程序将算法导入 Simulink 模型是指:将 S-Function 用作一个接口来从 mdlOutputs 中调用您的 C/C++ 算法。您可以将大型、独立 C/C++ 程序快速集成到模型中,而无需更改代码。

此示例模型包含一个 S-Function 封装程序。

wrapsfcn 模块有两个关联文件:S-Function 封装程序和包含算法的 C/C++ 代码。前三个语句:

定义 S-Function 的名称(您在 Simulink S-Function 模块对话框中输入的内容)。

指定 S-Function 使用 2 级格式。

提供对 SimStruct 数据结构体的访问。SimStruct 结构体包含仿真和代码生成期间所用数据的指针,并定义在 SimStruct 中存储和检索数据的宏。

#define S_FUNCTION_NAME wrapsfcn

#define S_FUNCTION_LEVEL 2

#include "simstruc.h"

extern real_T my_alg(real_T u); /* Declare my_alg as extern */

/*

* mdlInitializeSizes - initialize the sizes array

*/

static void mdlInitializeSizes(SimStruct *S)

{

ssSetNumSFcnParams( S, 0); /*number of input arguments*/

if (!ssSetNumInputPorts(S, 1)) return;

ssSetInputPortWidth(S, 0, 1);

ssSetInputPortDirectFeedThrough(S, 0, 1);

if (!ssSetNumOutputPorts(S,1)) return;

ssSetOutputPortWidth(S, 0, 1);

ssSetNumSampleTimes( S, 1);

}

/*

* mdlInitializeSampleTimes - indicate that this S-function runs

* at the rate of the source (driving block)

*/

static void mdlInitializeSampleTimes(SimStruct *S)

{

ssSetSampleTime(S, 0, INHERITED_SAMPLE_TIME);

ssSetOffsetTime(S, 0, 0.0);

}

/*

* mdlOutputs - compute the outputs by calling my_alg, which

* resides in another module, my_alg.c

*/

static void mdlOutputs(SimStruct *S, int_T tid)

{

InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs(S,0);

real_T *y = ssGetOutputPortRealSignal(S,0);

*y = my_alg(*uPtrs[0]); /* Call my_alg in mdlOutputs */

}

/*

* mdlTerminate - called when the simulation is terminated.

*/

static void mdlTerminate(SimStruct *S)

{

}

#ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */

#include "simulink.c" /* MEX-file interface mechanism */

#else

#include "cg_sfun.h" /* Code generation registration function */

#endif

S-Function 例程 mdlOutputs 包含对 my_alg 的函数调用,后者是包含 S-Function 执行的算法的 C 函数。对于 my_alg.c,代码为:

#ifdef MATLAB_MEX_FILE

#include "tmwtypes.h"

#else

#include "rtwtypes.h"

#endif

real_T my_alg(real_T u)

{

return(u * 2.0);

}

封装程序 S-Function wrapsfcn 调用 my_alg 来计算 u * 2.0。要编译 wrapsfcn.mex,请使用以下命令:

mex wrapsfcn.c my_alg.c

matlab tlc,编写封装程序 S-Function 和 TLC 文件相关推荐

  1. 10-8 猫和狗 : 创建两个文件cats.txt和dogs.txt, 在第一个文件中至少存储三只猫的名字, 在第二个文件中至少存储三条狗的名字。 编写一个程序, 尝试读取这些文件, 并将其内容打印到

    10-8 猫和狗 : 创建两个文件cats.txt和dogs.txt, 在第一个文件中至少存储三只猫的名字, 在第二个文件中至少存储三条狗的名字. 编写一个程序, 尝试读取这些文件, 并将其内容打印到 ...

  2. java将多个文件写入到一个文件流中再有规律的取出_编写java程序,往一个txt文件里写入学生的基本信息,然后再读出这些信息并打印出来,最后把该文件拷贝到指...

    满意答案 azonyb 2014.02.18 采纳率:59%    等级:12 已帮助:13223人 import java.io.BufferedInputStream; import java.i ...

  3. vs python生成exe文件_使用VScode编写python程序并打包成.exe文件-文件夹变成exe

    1. 下载vscode并安装 2. 配置Python环境 点击左下角的吃了图标,在弹出的菜单中选择extensions,在左上方搜索框内输入"Python",可以看到好多Pytho ...

  4. python 程序打包 vscode_使用VScode编写python程序并打包成.exe文件

    听说Visual Studio Code(VS Code)的诸多好处,了解了一下果真很喜欢,我喜欢它的缘由主要有3个,一是VS Code开源且跨平台,二是由于其界面很是酷,三是能够知足个人大所属代码需 ...

  5. python源文件改写编写一个程序读取一个python源程序文件_学PYTHON第三节:编译和解释...

    计算机执行源程序的两种方式:编译和解释 首先,了解一下静态语言,动态语言,目标代码,源代码. 动态类型语言(又称为脚本语言或扩建语言):在运行期进行类型检查的语言,也就是在编写代码的时候可以不指定变量 ...

  6. c语言编写excel程序,C语言写excel文件(csv格式)

    csv:简化版excel,在PC机上等同于excel,可进行各种excel计算.画图. #defineEACH_FILE_MAX_BYTE52428800 //-------------------- ...

  7. 精馏塔matlab,MATLAB图解精馏塔理论塔板数程序代码

    <MATLAB图解精馏塔理论塔板数程序代码>由会员分享,可在线阅读,更多相关<MATLAB图解精馏塔理论塔板数程序代码(6页珍藏版)>请在人人文库网上搜索. 1.MATLAB图 ...

  8. 微机保护算法matlab编程,微机继电保护matlab算法仿真(有源程序).doc

    微机继电保护matlab算法仿真(有源程序) 微 机 继 电 保 护 算 法 仿 真 电控学院 两点乘算法 matlab中编写的程序 N=12; t=(0:0.02/N:0.02)'; m=size( ...

  9. 抖音短视频数据抓取实战系列(六)——Mitmproxy+python编写监测程序

    抖音短视频数据抓取实战系列(六)--Mitmproxy+python编写监测程序 项目目录 1.抖音短视频数据抓取实战系列(〇)--前言 2.抖音短视频数据抓取实战系列(一)--模拟器的选择与设置 3 ...

最新文章

  1. php7安装执行configure报错error: off_t undefined; check your library configuration
  2. CentOS LAMP一键安装网站环境及添加域名
  3. NEFU 560 半数集
  4. 使用RNN解决句子对匹配问题的常见网络结构
  5. C ++ 指针 | 指针的操作_2
  6. 海风科技快速开发平台和构件的由来(一)
  7. DMA与cache一致性的问题
  8. APP运营推广超级攻略(2015新版)
  9. raw的服务器镜像是什么系统,如何将Ceph Raw格式镜像转换成Qcow2格式并上传云平台创建云主机...
  10. 阿朱说:咨询的历史(万字深度长文)
  11. 计算机找不到海信电视,海信电视突然看不了电视直播了,怎么解决?当贝市场良心分享...
  12. 如何开发Chrome扩展程序
  13. 大数据挖掘-使用频率top20中药材(收藏)
  14. 2.4g和5g要不要合并_路由器WiFi的2.4g和5g要不要合并?
  15. 查看linux操作系统版本--实用
  16. ibatis入门教程
  17. 新必应(new bing)申请
  18. TS 编译工具!从 ts-loader 到 Babel
  19. Nginx四层代理和7层反向代理
  20. 过去的一年iOS面试总结

热门文章

  1. 稳态血浆药物浓度css名词解释,药理名词解释-20210629151609.docx-原创力文档
  2. UUV Simulator: Based on Gazebo
  3. python 线性回归回归 缺失值 忽略_机器学习 第3篇:数据预处理(使用插补法处理缺失值)...
  4. 热播 何赛飞受肯定梅婷被批无韵味
  5. DEVONthink Pro 3 for Mac文档信息管理软件
  6. Word控件Spire.Doc 【页眉页脚】教程(4): 从C#中的word文档中删除标题
  7. Steam编程区解谜游戏A=B全解(一)
  8. 我不要靠猪!要靠鱼和虾!
  9. vue异步请求数据重新渲染
  10. Low Power概念介绍SRPG Cell