首页 最新 热门 推荐

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

Simulink代码生成: 调用Matlab函数

  • 23-09-22 01:02
  • 2252
  • 9204
blog.csdn.net

本文研究Simulink模型中调用Matlab函数的方法。

文章目录

  • 1 Matlab Function模块
  • 2 建模与代码生成
  • 3 Matlab Function中的数据管理
    • 3.1 关联Signal对象
    • 3.2 建立函数内的参数
  • 4 Matlab Function生成代码的限制
  • 5 Matlab Function的使用心得
    • 5.1 Matlab Function中打断点
    • 5.2 通过脚本输出数据
  • 6 总结

1 Matlab Function模块

在Simulink中建模的时候,有时会发现自己想要的功能很难通过Simulink中常规的模块和子系统实现,但是通过Matlab函数却可以很容易地实现。

根据博主工作经验,认为在以下情况比较适合用Matlab而不是Simulink实现:

  • for循环或while循环较多
  • 结构体定义较复杂,例如结构体嵌套结构体
  • 想要调用Matlab的某个工具箱函数
  • 习惯写代码而不是搭模型

针对以上问题,可以在Simulink中使用Matlab Function模块,然后在模块内写Matlab代码。从而实现了通过Simulink模型调用Matlab函数。
在这里插入图片描述

2 建模与代码生成

本章节通过勾股定理的例子,演示Matlab Function模块的建模。

1)打开Simulink,拖出一个Matlab Function模块。双击模块进入,可以看到里面已经有一个名为fcn的函数定义。
在这里插入图片描述
2)将函数修改为下图的勾股定理计算。
在这里插入图片描述
在c = gougu(a,b)这个Matlab函数中,a,b相当于子系统的输入,c相当于子系统的输出。

3)点击右上角的Edit Data,可以编辑输入输出的属性。这里把输入输出的数据类型都改为single。相当于Simulink子系统中的Inport和Outport的类型一样。
在这里插入图片描述
4)保存关闭函数编辑窗口,在模型中添加输入的常数和disp模块,然后运行模型,观察输出结果。注意,由于在函数里定义了输入输出的数据类型,外面的信号接口要输入single型常数。
在这里插入图片描述
5)为验证代码生成,将输入端替换成Inport,输出端替换成Outport并配置好代码生成(可参照http://iyenn.com/rec/319372.html)。
在这里插入图片描述
6)Ctrl + B生成代码。在生成的step函数中就实现了勾股定理的C代码。
在这里插入图片描述

3 Matlab Function中的数据管理

3.1 关联Signal对象

在Edit Data中,可以配置输入输出关联数据字典中的Signal对象。
1)在Ports and Data Manager中勾选Data must resolve to signal object。
在这里插入图片描述
2)在Matlab工作空间中新建一个Signal对象,并将类型和StorageClass配置如下。
在这里插入图片描述
3)Ctrl + B生成代码。可以看到c变量定义到了data.c中。
在这里插入图片描述

3.2 建立函数内的参数

1)在Ports and Data Manager中中点击Add–>Data新建一个参数。
在这里插入图片描述
2)将参数的Name改为d,Scope改为Parameter,Type改为single。
在这里插入图片描述
3)在Matlab工作空间中新建一个常量d=single(0.1)。
在这里插入图片描述
4)把Matlab Function中的代码中改为开根号后乘以d。
在这里插入图片描述
5)Ctrl + B生成代码。从代码中可以看出,step函数把参数d内联进去了。
在这里插入图片描述

4 Matlab Function生成代码的限制

Matlab Function生成代码的限制很多,譬如不支持动态内存分配、不支持元胞数组等。

另外,也有很多matlab函数和工具包也不能生成代码,具体可以参照Matlab Function中右上角的帮助文件。

在这里插入图片描述

5 Matlab Function的使用心得

博主比较擅长写Matlab脚本,所以对Matlab Function的使用还是很顺手的。下面是博主工作中的一些心得体会,可以帮助自己方便地使用这个模块。

5.1 Matlab Function中打断点

仿真用的模型中如果用到了Matlab Function模块,就可以在里面打断点调试。譬如下面的模块,博主在for循环内打了个断点。
在这里插入图片描述
然后运行整个Simulink模型,模型就会在第一个仿真步长停下来,并停在断点处。
在这里插入图片描述
这时就能看到断点前的每一个变量的数值了。

另外,也可以先仿真到某一个时间点,再打断点进入Matlab Function。这样就可以看到该时刻Matlab Function内部的情况了。

5.2 通过脚本输出数据

在Matlab Function中也可以写一些和生成代码无关的脚本,用于输出数据或是画图。例如下图中,在计算完y的数值后,通过fopen函数把数值写道文件里面。
在这里插入图片描述
这样的方式可以非常灵活地实时打印数据,而不用弄一大堆Scope模块去观察仿真数据。

6 总结

Matlab Function模块的使用可以让Simulink集成Matlab函数,需要根据自身项目特点灵活使用是用Matlab还是Simulink模块编写控制算法。

>>返回个人博客总目录

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

/ 登录

评论记录:

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

分类栏目

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