Simulink代码生成: 调用Matlab函数

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

1 Matlab Function模块

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

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

Simulink代码生成: 调用Matlab函数

2 建模与代码生成

本章节通过勾股定理的例子,演示Matlab Function模块的建模。
1)打开Simulink,拖出一个Matlab Function模块。双击模块进入,可以看到里面已经有一个名为fcn的函数定义。
Simulink代码生成: 调用Matlab函数
2)将函数修改为下图的勾股定理计算。
Simulink代码生成: 调用Matlab函数
在c = gougu(a,b)这个Matlab函数中,a,b相当于子系统的输入,c相当于子系统的输出。

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

3 Matlab Function中的数据管理

3.1 关联Signal对象

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

3.2 建立函数内的参数

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

4 Matlab Function生成代码的限制

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

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

Simulink代码生成: 调用Matlab函数

5 总结

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

>>返回个人博客总目录