汽车嵌入式开发中,基于MBD的上层算法开发非常普及。在实际工程中会有这样的需求:做算法的工程师想调用底层接口或者将自定义功能的算法封装成模块,方便模型搭建时使用。
这里有两点需要实现:自定义一个库、在自定义库中创建自定义模块(C MEX S-Function)。
(资料图片)
1自定义库步骤1、切换matlab自定义工作路径
打开matlab,切换到指定工作目录,本例工作路径:D:\WorkSpace\Matlab,如下所示:将当前工作路径加载到matab搜索路径中:Set Path->Add with Subfolders...->Save->Close。2、创建Library模型
(1)在Simulinksl_customization.m文件内容如下所示:;
;
ComM.c文件内容如下所示,定义函数ComM_GetCurrentComMode。{
return 0;
}
2、创建lct对应的M脚本(lct_CMEXSFunction.m)
lct_CMEXSFunction.m文件内容如下所示。注意:def1.OutputFcnSpec语句中有两个输入,分别使用了u1和u2来表示输入的参数,使用y1来标识输出的参数。即用y来表示输出,用u来表示输入,P表示参数,这三个参数的书写形式固定不变,即不能使用其他参数表示。
clc;
def1=legacy_code("initialize");
def1.SFunctionName = "ComM_GetCurrentComMode";
def1.OutputFcnSpec = "uint8 y1 = ComM_GetCurrentComMode(uint8 u1,uint8 u2[1])";
def1.HeaderFiles = {"ComM.h"};
def1.SourceFiles = {"ComM.c"};
legacy_code("sfcn_cmex_generate",def1);
legacy_code("compile",def1);
legacy_code("generate_for_sim", def1);
legacy_code("slblock_generate", def1);
在M脚本中,传递指针类型的参数需要使用数组的形式去替代。如下,第二个参数本应传递uint8* u2,由于LCT的局限性,这里使用uint8 u2[1]的形式去替代。准备文件在matlab中的创建如下所示:3、运行lct_CMEXSFunction.m文件
(1)如下所示,lct_CMEXSFunction.m成功运行,生成自定义的ComM_GetCurrentComMode接口模块。成功生成自定义C MEX S-function以后,在当前路径下会生成ComM_GetCurrentComMode.c、ComM_GetCurrentComMode.mexw64、ComM_GetCurrentComMode.tlc 3个文件,如下所示:(2)将自定义模块拖曳到Lotus_SupportPacket模型库,并保存,如下所示:
提示:自定义库需要提前打开,且处于解锁状态。3自定义模块库的使用1、创建模型:LotusModel.slx
在自定义库中将自定义的C MEX S-Function拖曳到模型中,如下所示:
2、配置模型生成代码
(1)在“Model Settings”中完成模型必要配置并保存,如下所示:
(2)代码生成,C CODE->Build->Generate Code(3)生成的代码如下所示,ComM_GetCurrentComMode接口在模型中得以使用。“Embedded Coder”启动如下所示:也可以在当前路径下查看生成的代码,如下所示:
关键词: