我原来写了一些很漂亮的C函数,写得非常不错,想把它集成到Simulink环境中来,怎么办?
点击末尾的“阅读原文”下载本文的案例模型
集成外部C代码到Simulink模型
要得到:
把自己编写的C函数集成到Simulink模型中
怎么做:
Simulink提供了多种方法来集成外部的C代码。从简单到复杂来看,可以:
使用Stateflow;
使用MATLABFunction模块;
使用LegacyCodeTool构造S-fcn模块;
自己写S-fcn
只介绍简单的方法
1.假设已有代码table1D.c以及table1D.h
table1D是个简单的1维查表函数。这是它的函数原型。第1、2个输入是表格数据,第3个输入是表格长度数据,第4个输入就是要查找的x,查到的结果作为返回值。
2.函数调用
我现在希望在Simulink环境下使用这个查表函数。当前的应用场景是:在给定表格的情况下,通过输入u查出相应的y出来。
在Stateflow中,参照.h文件里定义的函数原型直接调用这个函数:
然后如下图说明一下各个变量:u是这个Chart模块的输入,y是Chart的输出,uMap,yMap,n是固定的表格参数。
在MATLABFunction模块中,需要使用到coder.ceval调用这段代码,引用传递使用coder.rref:
跟Stateflow类似,在MATLABFunction中也需要对m脚本里用到的各个变量名做一个说明。
3.在Workspace里定义数据对象
再来看Simulink模型,它现在有4个信号:
我希望控制这4个信号的名字以及定义方式,所以新建这4个信号对应的数据对象。另外,也给之前的3个参数定义对应的数据对象。
4.并把该模型生成代码
Ctrl+B,得到如下所示,两句函数调用的语句:
另外,为了保证模型的正确编译链接,生成代码之前还需要在源文件中include手写的.h文件。如图,要在模型.h文件中增加这一行include的代码。
那这一行include是怎么加进去的呢?如下页面得到:
总结
使用Stateflow以及MATLABFunction模块可以很方便的集成外部的C代码。