Simulink代码生成: 调用Matlab函数

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

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并配置好代码生成(可参照https://blog.csdn.net/u013288925/article/details/104851546)。
在这里插入图片描述
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模块编写控制算法。

>>返回个人博客总目录

  • 30
    点赞
  • 267
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值