本文研究Simulink Function子系统的用法和该模块生成的代码。

文章目录

  • 1 问题引入
  • 2 Simulink Function子系统建模
    • 2.1 Simulink Function子系统
    • 2.2 Function Caller模块
  • 3 代码生成
    • 3.1 默认配置
    • 3.2 Function visibility配置
    • 3.3 多个输出端口
    • 3.4 输入和输出变量相同
    • 3.5 参数为数组
    • 3.6 参数为结构体
  • 4 总结

1 问题引入

博主在其他的博客中研究了许多模块和子系统,以及它们生成的代码。通常来说,博主研究的方法是建立一个Inport,一个outport,以及两者之间的控制逻辑,譬如如下的Gain模块。

配置好该模型,并生成代码如下。

其中的step函数就可以反映出模型的算法,输入和输出都被定义为全局变量,而step函数的参数和返回值都是void。

博主最近遇到的项目需求是,需要生成带有非空参数的函数。也就是要把模型的inport作为函数的参数传入,outport作为函数的返回值。这样一来,以前的代码生成方案就无法使用了。经博主研究后,可以采用Simulink Function子系统,来实现这个需求。

2 Simulink Function子系统建模

本节研究一下Simulink Function子系统的建模。

2.1 Simulink Function子系统

1)首先,从Simulink Library中拖拽出一个Simulink Function子系统到空白模型中。

从外面可以观察到,Simulink Function子系统上方有一个引子,和一个函数表达式。左右两侧没有和子系统外界交互的端口,这一点和其他子系统不一样。

2)双击进入子系统,可以看到顶部的一个Trigger模块,以及输入输出端口。

这里的输入输出端口和Inport/Outport模块是不一样的,因为这是专门用于Simulink Function子系统中的Argument Inport模块和Argument Outport模块。

3)双击Trigger模块,将函数名修改成function1,同时把Trigger模块的名称也改成function1。

这样的话,外面的子系统的函数原型也就变成了 y = function1(u)

4)最后在输入输出之间加一个Gain模块,使得这个Simulink Function子系统实现放大两倍的算法。

2.2 Function Caller模块

上一节建立好Simulink Function子系统后,就可以用Function Caller模块在模型的其他地方调用这个子系统的功能。

1)新建一个Function Caller模块,将其中的Function Prototype改成上文的函数原型 : y = function1(u)

2)为Function Caller模块添加一个常数输入和一个disp输出并仿真,测试一下调用的效果。

由图中可见,Function Caller模块调用了function1的gain功能。

3 代码生成

3.1 默认配置

1)将2.1章中的Function Caller模块删除,在模型中只保留一个Simulink Function子系统,然后Ctrl + B生成代码如下。

与其他博客中生成的代码有所不同,这次没有生成step函数,而是生成了一个demo_function1的函数(模型名称+Simulink Function函数名称),并且带有参数和返回值。

2)然后打开demo_function1.h,既可以看到这个函数的外部声明。其他的代码只要包含这个头文件,就可以调用生成的这个函数了。

3.2 Function visibility配置

在3.1中,生成的函数名中带有模型名的前缀。如果将Simulink Function做一个Global配置,生成的名称就不一样,配置过程如下。

1)双击Simulink Function的Trigger模块,将Function visibility配置成global,并确认。

2)然后在子系统的正中间就会出现一个global的标志,代表它是全局的。

3)重新Ctrl + B生成代码如下。

生成的函数定义和外部声明就和3.1中不同,只是function1而不再有demo的前缀,博主比较喜欢这种方式。

这里还有一点值得注意一下,输入端口变量是rtu_u,前缀是rtu;输出端口变量是rty_y,前缀是rty。前缀的字符是默认的,博主也没找到哪里可以配置,不过也没必要配置。

3.3 多个输出端口

在C语言中,一个函数只有一个return返回值。如果Simulink Function子系统有多个输出端口,生成的代码就会传递指针参数。通过下面的方式可以验证一下。

1)在3.2的基础上再增加一个Outport,并改一下Gain模块参数,如下图所示。

2)重新Ctrl + B生成代码如下。

可以看出,这次生成的函数不再有返回值,而是将输出端口的变量作为指针传入函数,再由函数中更新该地址的内容。

3.4 输入和输出变量相同

在C语言编程的时候,也会遇到传入一个指针给函数,然后函数经过一些计算把地址里的值更新掉的情形。对应Simulink Function中只要把Inport和Outport的名字改成一样的即可。

1)在3.2的基础上,把输入和输出的名称都改为u。

2)重新Ctrl + B生成代码如下。

这里的函数只传入了一个指针参数rtuy_u,函数中将地址中的值乘以2,再赋值回这个地址的空间。

值得注意的是,变量前缀不是3.2中的rtu或者rty,而是rtuy,代表了这个变量在模型中既是输入也是输出。

3.5 参数为数组

对于参数为数组的情况,只需要在Argument Inport或者Argument Outport中配置即可。

1)在3.2的基础上,将Argument Inport的Port dimensions设为3。

2)对输出的Port dimensions也设为3。
3)重新Ctrl + B生成代码如下。

函数中传入的参数就成为了数组。

3.6 参数为结构体

对于参数为结构体的情况,需要在Argument Inport或者Argument Outport中将类型配置为bus。后面演示输入端口配置成bus的情况。

1)在Matlab工作空间新建一个bus1,并配置2个element成员。

2)在3.2的基础上,将Argument Inport的类型配置为bus1。

3)用Bus Selector模块,把element1挑选出来输出给后面的Gain模块。

4)重新Ctrl + B生成代码如下。

这里生成的函数的参数是一个结构体指针。结构体的定义在另一个文件中。

4 总结

Simulink Function子系统可以生成带有参数的函数,在某些需求下是非常有用的。同时还可以灵活地配置端口参数,来得到想要的函数形式。

>>返回个人博客总目录

Simulink代码生成:Simulink Function子系统及其代码相关推荐

  1. Simulink代码生成: 使能子系统及其代码

    本文描述使能子系统的建模并研究生成的代码. 文章目录 1 Simulink中的使能子系统 2 使能子系统建模示例 2.1 基本用法 2.2 保持输出结果 3 使能子系统代码生成 3.1 输出口配置为h ...

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

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

  3. Simulink代码生成: Model Reference及其代码

    本文研究Simulink中的Model Reference配置过程,以及生成的代码. 文章目录 1 问题引入 2 Model Reference建模示例 2.1 模型搭建过程 2.2 转换封装模型 3 ...

  4. Simulink代码生成: Assignment模块及其代码

    本文研究Assignment模块的用法和该模块生成的代码. 文章目录 1 Simulink中的Assignment模块 2 Assignment模块的模型和参数 3 Assignment模块的代码 4 ...

  5. Simulink代码生成: MinMax模块及其代码

    本文研究MinMax模块的用法和该模块生成的代码,同时指出该模块使用时的一个注意点. 文章目录 1 Simulink中的MinMax模块 2 MinMax模块建模 3 MinMax模块的代码 4 Mi ...

  6. Simulink代码生成: Relay模块及其代码

    本文研究Relay模块的用法和该模块生成的代码. 文章目录 1 Simulink中的Relay模块 2 Relay模块建模 3 Relay模块的代码 4 总结 1 Simulink中的Relay模块 ...

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

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

  8. Simulink代码生成:生成ASAP2文件

    本文研究通过Simulink生成A2L文件的方法,以及其中的一些注意点. 文章目录 1 ASAP2文件 2 生成标定量.观测量的A2L文件 2.1 建模过程 2.2 配置界面 2.3 生成A2L文件 ...

  9. Simulink自动代码生成3——优化生成的代码(optimizing generated code)

    代码优化综述 使用simulink代码生成之后,如果需要进一步对执行效率或者内存优化,可以看下面提到的方法.具体可从以下几个方面考虑: remove initialization code remov ...

  10. simulink代码生成

    基于模型的设计概念 基于模型的设计(Design Based on Model),可简称为MBD,以MATLAB等软件为平台,让工程师在可视化开发环境中,一边进行需求分析.算法研究.模型与需求分析的双 ...

最新文章

  1. LeetCode简单题之删除字符使字符串变好
  2. python 从url中提取域名和path
  3. 【跨平台网络抓包神器のtcpdump】ubuntu下编译tcpdump开源抓包工具
  4. UVa 10082 - WERTYU 解题报告 - C语言
  5. python复制多个文件_python 之 复制多个模板文件
  6. SpringIOC配置文件「bean」标签的属性id class name scope init-method destroy-method factory-bean factory-method
  7. Private Data Manipulation in Optimal Sponsored Search Auction
  8. Linux为什么受欢迎?
  9. latex 插图解释_仅使用一些插图和视频即可解释Big O符号
  10. 澳大利亚超市巨头考虑设专门网站 方便代购买奶粉
  11. 二分--1043 - Triangle Partitioning
  12. 矩阵分析_二阶矩阵A为酉矩阵的充分必要条件是A为下列三种形式之一
  13. GLPI 无法登录、账号没有权限的解决方法
  14. 组台式计算机配置清单整套,组装台式电脑配置清单有哪些 台式电脑什么配置好...
  15. 欢迎关注异贝!今天与您一起分享服装行业异贝引客方案设计!
  16. matlab数值积分中函数积分的4种方法
  17. FreeSwitch连接语音网关配置及使用场景
  18. php00截断原理,burpsuite上传截断及截断原理介绍
  19. Python/虚数or复数的表示
  20. 梯度下降法(详细讲解)

热门文章

  1. 中兴2016笔试题答案Java_中兴Java笔试题
  2. webstorm 使用技巧
  3. 坯子库无法一键安装插件没用_坯子插件库官方版下载_坯子插件库v2020.2官方版 - Win7旗舰版...
  4. 八爪鱼导出到mysql数据库_八爪鱼采集器怎么将数据导出数据库?
  5. Intel CPU性能linpack测试
  6. OSPF Vlink peer的配置
  7. spring-security 实现单点登录
  8. VMware虚拟机共享主机无线网络联网的设置方法
  9. JavaSE银行账户管理系统
  10. 洛谷 1938 [USACO09NOV]找工就业Job Hunt