MATLAB版本2020b
最近用s-function模块生成代码,总结一下:
1、level-1 MATALB S-Function
。。
2、level-2 MATLAB S-Function
level-1不能生成c,只有level-2可以;
level-2分为level-2 MATLAB S-Function和S-Function,如下图,应该是都可以生成C代码的,但是都需要对应同名TLC文件。我用的是level-2 MATLAB S-Function使用M语言编写的。
那么tlc文件哪来呢?根据我目前查阅到的资料,只能自己编写,matlab官方给了很多tlc的模板可以参考编写。
由于我对tlc一窍不通,所以一直想寻找自动生成tlc的方法,暂时还没有找到,如果大家有方法,可以告知于我,感激不尽!。。。又找了两天,不能自动生成。。。。
3、S-Functions
如果接口名称数量固定(可以是多个接口),可使用下列模块:
1)用MATLAB官方模板C-MEX,这个模板是可以生成c代码的。
2)S-Function Builder模块,与1)类似。不同的是Builder直接双击会出现一个对话框,在里面进行代码编写(C MEX),完成后点击“builder”,会生成 .c 和对应 .tlc 文件,进而在Simulink中添加其他模块后生成c代码,至于具体如何使用该模块,可以通过help文档学习,后期有时间的话我会补充一下。
4、matlab function
可以直接生成c代码,不需要tlc文件。
如果接口数量不固定,需要从别的地方取值过来,那么上述模块大概率是不行的,至少目前在我看来是不可以的。
2023.12.19补充:MATLAB Function 输入维度可以设置为可变的,所以在前面添加 mux 模块;输出维度需固定,可以在输出后接数组中数据选择模块进行输出接口定义。
5、Legacy Code Tool工具
Legacy Code Tool工具不可以!它可以实现的是:通过现有c代码生成s-function,同时生成tlc。可通过命令行输入 help legacy_code 查看官方帮助文档,但是不能将已经编写好的s-Function模块生成 .tlc。
找官方例程,在以下路径:
C:\文档\MATLAB\Examples\R2020b\simulink\IntegrateCFcnArgsAreStructuresExample
使用记录:
1)编写.c和.h文件。
2)编写.m文件如下。
Simulink.importExternalCTypes('ex_myTypes_LCT1.h');
def = legacy_code('initialize'); //初始化代码继承工具数据结构体 specs,它用于注册现有 C 或 C++ 代码的特征以及代码继承工具生成的 S-Function 的属性。
def.SFunctionName = 'sfun_ex_mySrc_LCT'; //s-function模块调用的.c的文件命名
def.SourceFiles = {'ex_mySrc_LCT1.c'}; //外部源文件
def.HeaderFiles = {'ex_myTypes_LCT1.h'}; //外部头文件
def.OutputFcnSpec = ['void myFcn(sigStructType u1[1], ',...
'paramStructType p1[1], sigStructType y1[1])'];
生成.c、.mexw64、.tlc文件的语句:
legacy_code('generate_for_sim',def); //生成.c、.mexw64、.tlc文件供S-Function模块调用以及c代码生成。
生成.c、.mexw64、.tlc文件供S-Function模块调用以及c代码生成,如下图:
生成S-Function模块语句:
legacy_code('slblock_generate', def); //生成S-Function模块供Simulink仿真使用:
生成的含S-Function的.slx文件如下图:
由于我需要接口数量根据mat文件变化,故最终的解决方案是使用MATLAB Function重新开发。