基于模型开发之代码集成(二)——Le…

来源:互联网 发布:js 调用java代码 编辑:程序博客网 时间:2024/05/22 00:24

Legacy CodeTool是Matlab中的一个命令行工具,它可以很方便的将已有的C代码或者C++代码(注:不支持C++对象)与模型结合起来。

 

可以将C或C++代码编译生成用于仿真的S-fuction;也可以生成一个封装了外部C代码参数化的S-fuction模块。使用过程非常的简便,但是也有一些限制,所以当你已有的代码不是C或者系统比较复杂,比如包含了控制器和运行环境的混合系统,关于代码的集成可能还是要求助于S-Fuctionbuilder活着手写S-fuction来解决。

 

好了别的不多讲,下面先简单介绍一下Legacy Code Tool的工作步骤:

1 、首先生成一个特定的Legacy CodeTool的参数集(其实也就是一个结构体变量),这个参数集指定了你要包含的C代码,头文件,以及生成s-fuction的名称等等诸多信息。

2、通过Legacy Code Tool的命令行语句调用第一步配置好的参数集变量,生成相应的S-fuction源文件;

3、通过Legacy CodeTool的命令行语句编译生成的S-fuction源文件,使其变为可动态加载的执行文件,在32位windows系统中也就是mexw32文件;

4、如果需要还可以使用Legacy CodeTool的命令行语句将上面生成s-fuction执行文件封装成simulink模块。

 

基本上用Legacy CodeTool来集成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 CodeTool的功能函数,'initialize'是该函数其中的一个功能参数,即初始化一个参数集变量,如果上述语句在输入回车时没有打分号,可以看到matlab命令行中反馈的如下内容:

 def =

             SFunctionName: ''
InitializeConditionsFcnSpec: ''
             OutputFcnSpec: ''
              StartFcnSpec: ''
          TerminateFcnSpec: ''
               HeaderFiles: {}
               SourceFiles: {}
              HostLibFiles: {}
            TargetLibFiles: {}
                  IncPaths: {}
                  SrcPaths: {}
                  LibPaths: {}
                SampleTime: 'inherited'
                   Options: [1x1 struct]

 

3、针对我们这个小例子,只需要指定其中的四项:源文件、头文件、S-fuction的名字、S-fuction的输出函数,同样使用命令行的方式进行参数的配置,如果源文件和头文件在当前目录下,可以在matlab命令行中输入下面语句:

def.SourceFiles = {'doubleIt.c'};
def.HeaderFiles = {'doubleIt.h'};

def.SFunctionName = 'ex_sfun_doubleit';
def.OutputFcnSpec = 'double y1 = doubleIt(double u1)';

 

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);

生成的模块如下图所示:

基于模型开发之代码集成(二)——LegacyCodeTool简要说明

大家可以分别给模块加上输入信号和示波器,看一下模块运行的结果应该和C语言的意图一致。

 

这一部分的内容基本上来自于Matlab的Help,第二部分讲会详细介绍下legacy_code命令的使用方法和参数集中参数的含义。

1 0