首页 最新 热门 推荐

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

Simulink代码生成:Simulink Function子系统及其代码

  • 23-09-22 01:02
  • 2909
  • 10707
blog.csdn.net

本文研究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子系统可以生成带有参数的函数,在某些需求下是非常有用的。同时还可以灵活地配置端口参数,来得到想要的函数形式。

>>返回个人博客总目录

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

/ 登录

评论记录:

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

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (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-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top