天天看点

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

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

文章目录

  • 1 Matlab Function模块
  • 2 建模与代码生成
  • 3 Matlab Function中的数据管理
    • 3.1 关联Signal对象
    • 3.2 建立函数内的参数
  • 4 Matlab Function生成代码的限制
  • 5 总结

1 Matlab Function模块

在Simulink中建模的时候,有时会发现自己想要的功能无法通过Simulink中常规的模块和子系统实现,但是通过Matlab函数却可以很容易地实现。又或者说,通过Matlab可以调用一些工具包,但是Simulink里却没有这种功能,但又想在模型中实现这个功能。

针对以上问题,可以在Simulink中使用Matlab Function模块,然后再模块内写Matlab代码。从而实现了通过Simulink模型调用Matlab函数。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

2 建模与代码生成

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

1)打开Simulink,拖出一个Matlab Function模块。双击模块进入,可以看到里面已经有一个名为fcn的函数定义。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

2)将函数修改为下图的勾股定理计算。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

在c = gougu(a,b)这个Matlab函数中,a,b相当于子系统的输入,c相当于子系统的输出。

3)点击右上角的Edit Data,可以编辑输入输出的属性。这里把输入输出的数据类型都改为single。相当于Simulink子系统中的Inport和Outport的类型一样。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

4)保存关闭函数编辑窗口,在模型中添加输入的常数和disp模块,然后运行模型,观察输出结果。注意,由于在函数里定义了输入输出的数据类型,外面的信号接口要输入single型常数。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

5)为验证代码生成,将输入端替换成Inport,输出端替换成Outport并配置好代码生成(可参照https://blog.csdn.net/u013288925/article/details/104851546)。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

6)Ctrl + B生成代码。在生成的step函数中就实现了勾股定理的C代码。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

3 Matlab Function中的数据管理

3.1 关联Signal对象

在Edit Data中,可以配置输入输出关联数据字典中的Signal对象。

1)在Ports and Data Manager中勾选Data must resolve to signal object。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

2)在Matlab工作空间中新建一个Signal对象,并将类型和StorageClass配置如下。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

3)Ctrl + B生成代码。可以看到c变量定义到了data.c中。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

3.2 建立函数内的参数

1)在Ports and Data Manager中中点击Add–>Data新建一个参数。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

2)将参数的Name改为d,Scope改为Parameter,Type改为single。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

3)在Matlab工作空间中新建一个常量d=single(0.1)。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

4)把Matlab Function中的代码中改为开根号后乘以d。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

5)Ctrl + B生成代码。从代码中可以看出,step函数把参数d内联进去了。

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

4 Matlab Function生成代码的限制

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

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

Simulink代码生成: 调用Matlab函数1 Matlab Function模块2 建模与代码生成3 Matlab Function中的数据管理4 Matlab Function生成代码的限制5 总结

5 总结

Matlab Function模块的使用可以让Simulink集成Matlab函数,不过还是尽量使用Simulink的其他模块搭建控制策略,少用Matlab Function模块。因为Matlab Function的可读性不友好,而且生成代码的限制也很多。

>>返回个人博客总目录