有两种比较简单的方法可以将代码集成到模型中。
1、使用Legacy Code Tool来集成C代码到Simulink模型
2、在StateFlow建模过程中使用CustomCode 集成或调用已有C代码
下面主要介绍第一种方法。
LegacyCodeTool简要说明
Legacy Code Tool是Matlab中的一个命令行工具,它可以很方便的将已有的C代码或者C++代码(注:不支持C++对象)与模型结合起来。
可以将C或C++代码编译生成用于仿真的S-fuction;也可以生成一个封装了外部C代码参数化的S-fuction模块。使用过程非常的简便,但是也有一些限制,所以当你已有的代码不是C或者系统比较复杂,比如包含了控制器和运行环境的混合系统,关于代码的集成可能还是要求助于S-Fuction builder或者手写S-fuction来解决。
好了别的不多讲,下面先简单介绍一下Legacy Code Tool的工作步骤:
1 、首先生成一个特定的Legacy Code Tool的参数集(其实也就是一个结构体变量),这个参数集指定了你要包含的C代码,头文件,以及生成s-fuction的名称等等诸多信息。
2、通过Legacy Code Tool的命令行语句调用第一步配置好的参数集变量,生成相应的S-fuction源文件;
3、通过Legacy Code Tool的命令行语句编译生成的S-fuction源文件,使其变为可动态加载的执行文件,在32位windows系统中也就是mexw32文件;
4、如果需要还可以使用Legacy Code Tool的命令行语句将上面生成s-fuction执行文件封装成simulink模块。
基本上用Legacy Code Tool来集成C代码的应用也就是上面这么四步,大致有个概念后我们实际先来看一个简单的例子,之后我们在对每一个步骤进行详细的介绍,然后再做一些复杂点的应用。
这里说的例子是matlab的help中的一个简单例子,用C语言写的将输入放大两倍的函数:
1、准备好你的C文件和相应的头文件,如下:
doubleIt.c | doubleIt.h |
#include "doubleIt.h" double doubleIt(double inVal) { return(2*inVal); } | #ifndef _DOUBLEIT_H_ #define _DOUBLEIT_H_
double doubleIt(double inVal);
#endif |
2、定义一个Legacy Code Tool参数集变量,变量名为def,在matlab命令行中输入如下命令
def = legacy_code('initialize') |
legacy_code()就是matlab中Legacy Code Tool的功能函数,'initialize'是该函数其中的一个功能参数,即初始化一个参数集变量,如果上述语句在输入回车时没有打分号,可以看到matlab命令行中反馈的如下内容:
def = SFunctionName: '' |
3、针对我们这个小例子,只需要指定其中的四项:源文件、头文件、S-fuction的名字、S-fuction的输出函数,同样使用命令行的方式进行参数的配置,如果源文件和头文件在当前目录下,可以在matlab命令行中输入下面语句:
def.SourceFiles = {'doubleIt.c'}; def.SFunctionName = 'ex_sfun_doubleit'; |
4、完成上述配置后,在matlab命令行输入下面的命令,生成相应的S-fuction源文件
legacy_code('sfcn_cmex_generate', def); |
可以看到在matlab当前工作目录下生成了相应的S-fuction源文件:ex_sfun_doubleit.c
5、然后,继续在matlab命令行输入下面的命令,对生成相的S-fuction源文件进行编译
legacy_code('compile', def); |
这里要注意,必须事先配置matlab所要使用的C语言编译器,否则这一步会无法执行,一般32位matlab安装的时候会附带有一个LCC的编译器,也可以安装任何matlab可识别的编译器,然后使用 mex -setup命令,按照matlab中的提示设定好默认的编译器。
在编译的过程中,Matlab的命令行中会输出相应的文字提示,例如:
###Start Compiling……
……
### Finish Compiling ex_sfun_doubleit
### Exit
6、最后,在matlab命令行输入下面的命令,可以利用前面编译的可执行文件生成一个S-fuction的simulink模块。
legacy_code('slblock_generate', def); |
生成的模块如下图所示:
大家可以分别给模块加上输入信号和示波器,看一下模块运行的结果应该和C语言的意图一致。
这一部分的内容基本上来自于Matlab的Help,第二部分讲会详细介绍下legacy_code命令的使用方法和参数集中参数的含义。
请登录后评论~