主要内容

C函数使用遗留代码工具集成

概述

你可以整合现有的C或c++函数,如设备驱动程序,查找表,和一般功能和接口,为仿真软件万博1manbetx®模型通过使用遗留代码的工具。使用规范,您供应MATLAB®代码,该工具将现有功能转换成C墨西哥人S-functions可以包括在仿真软件模型。万博1manbetx如果你使用万博1manbetx仿真软件编码器™来生成代码,遗留代码工具可以插入一个适当的调用C函数所生成的代码。有关详细信息,请参见调用外部代码导入生成的代码与遗留代码的工具(万博1manbetx仿真软件编码器)

相比使用s函数构建器或编写一个函数,遗留代码工具更容易使用和生成优化的代码(不生成包装器代码)经常要求的嵌入式系统。然而,考虑混合动力系统的替代方法,如系统,包括植物和控制器或系统组件的语言编写的C或c++。替代方法更灵活,他们支持更多的功能和编程语言。万博1manbetx

与遗留代码交互工具,你

  • 使用遗留代码工具指定数据结构

    • 函数的名称

    • 规范现有的C函数

    • 编译所需文件和路径

    • 选项生成的功能

  • 使用legacy_code函数

    • 初始化遗留代码工具数据结构对于一个给定的C函数

    • 在模拟生成一个函数使用

    • 编译和链接生成的函数变成一个动态可加载的可执行文件

    • 生成一个蒙面的功能块调用生成的功能

    • 生成一个薄块文件,如有必要,一个sFunction_makecfg.mrtwmakecfg.m代码生成的文件(万博1manbetx仿真软件编码器产品许可证要求)

请注意

您可以使用之前legacy_code,确保一个C编译器设置为你的MATLAB安装。

下面的图表说明了使用遗留代码工具的一般程序。C函数集成到仿真软件模型与遗留代码的工具万博1manbetx提供了一个示例,它使用遗留代码工具将现有的C函数转换成C墨西哥人功能。

如果你有一个万博1manbetx仿真软件编码器产品许可,请参阅调用外部代码导入生成的代码与遗留代码的工具(万博1manbetx仿真软件编码器)信息使用遗留代码的代码生成工具。

C函数集成到万博1manbetx模型与遗留代码的工具

这个例子演示了如何将现有的C函数集成到一个仿真软件模型使用遗留代码的工具。万博1manbetx

假设您有一个C函数,输出的值输入浮点乘2。一个源文件中定义的函数命名doubleIt.c,其声明存在于一个头文件命名doubleIt.h

  1. 初始化一个MATLAB结构def与使用的字段代表遗留代码的工具属性legacy_code函数。

    def = legacy_code(初始化)

    遗留代码工具命名数据结构def显示字段的MATLAB命令窗口如下所示:

    def = SFunctionName:“InitializeConditionsFcnSpec:“OutputFcnSpec: TerminateFcnSpec:“StartFcnSpec: HeaderFiles:{}源文件:{}HostLibFiles: {} TargetLibFiles: {} IncPaths: {} SrcPaths: {} LibPaths: {} SampleTime:“继承”选项:[1 x1 struct]
  2. 指定适当的值字段在遗留代码工具数据结构来识别现有的C函数的性质。例如,指定C函数源和头文件名在MATLAB命令提示符输入以下命令:

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

    您还必须指定功能的信息遗留代码工具生成的C代码。例如,指定功能的名称及其输入输出函数声明:

    def.SFunctionName =“ex_sfun_doubleit”;def.OutputFcnSpec = '双日元= doubleIt(双u1)”;

    各种数据结构字段的信息,请参阅legacy_code参考页面。

  3. 源文件生成一个功能从现有的C函数使用legacy_code函数。在MATLAB命令提示符,键入:

    legacy_code (sfcn_cmex_generate, def);

    遗留代码工具使用中指定的信息def创建功能源文件命名ex_sfun_doubleit.c在当前的MATLAB文件夹。

  4. 编译和链接功能源文件到一个动态可加载的可执行模型使用万博1manbetxlegacy_code函数。在MATLAB命令提示符,键入:

    legacy_code(“编译”,def);

    以下消息出现在MATLAB命令窗口:

    # # #开始编译ex_sfun_doubleit墨西哥人(“ex_sfun_doubleit。c, d: \ \ lct_demos \ doubleIt工作。c ', ' id: \ \ lct \ lct_demos”) # # #工作完成编译ex_sfun_doubleit # # #退出

    一个32位的微软®窗户®系统,由此产生的s函数执行命名ex_sfun_doubleit.mexw32

  5. 插入一个蒙面功能块为仿真软件模型。万博1manbetx

    legacy_code (slblock_generate, def);

    遗留代码工具配置块使用C墨西哥人s函数在上一步中创建的。同时,该工具面具块,使其显示它的价值OutputFcnSpec属性(见的描述legacy_code功能)。

  6. 添加一个正弦波的振幅1块的输入C-MEX功能块和一块输出范围。

    运行仿真。的C-MEX功能块返回的值输入浮点乘2。它像C函数doubleIt

集成C函数的参数是指向结构的指针

这个例子展示了如何使用遗留代码工具集成一个C函数的参数是指向结构的指针。

在仿真万博1manbetx软件®,创建一个万博1manbetxSimulink.Bus对象来表示一个结构类型。使用总线信号模型来表示结构化信号和状态。在工作区中创建MATLAB结构或一块参数对话框来表示参数结构。

总线信号的基本信息,请参阅虚拟总线。参数结构的基本信息,请参阅组织相关块参数定义的结构。创建总线对象,明白了创建并指定仿真软件。万博1manbetx总线对象

探索外部代码

这个习俗源代码复制到一个文件命名ex_mySrc_LCT.c在当前文件夹。

# include“ex_myTypes_LCT。h”空白myFcn (sigStructType *, paramStructType * params, sigStructType *){在- > - > sig1 = sig1 *参数- > param1;在- > - > sig2 = sig2 *参数- > param2 +参数- > param3;}

函数的参数myFcn是指向结构的指针。该函数接受一个输入信号参数,一个参数参数,参数和一个输出信号。

这个自定义标题代码复制到一个文件命名ex_myTypes_LCT.h在当前文件夹。

的ifndef _MY_TYPES_H_ # define _MY_TYPES_H_ typedef struct{双sig1;双sig2;}sigStructType;typedef struct{双param1;双param2;双param3;}paramStructType;空白myFcn (sigStructType *, paramStructType * params, sigStructType *);# endif

该文件定义了信号和参数结构类型myFcn用途。

在仿真软件创建总线对象来表示结构类型万博1manbetx

在命令提示符处,使用函数万博1manbetxSimulink.importExternalCTypes生成总线基本工作空间中的对象。

万博1manbetxSimulink.importExternalCTypes (“ex_myTypes_LCT.h”);

公共汽车对象对应结构体类型ex_myTypes_LCT.h定义了。

创建执行外部代码块

创建一个结构变量,def、存储规范的s函数调用外部代码。使用的函数legacy_code创建结构和设置默认值。

def = legacy_code (“初始化”);

集s函数的名称sfun_ex_mySrc_LCT

def.SFunctionName =“sfun_ex_mySrc_LCT”;

识别外部源和头文件的文件名。

def.SourceFiles = {“ex_mySrc_LCT.c”};def.HeaderFiles = {“ex_myTypes_LCT.h”};

指定输出函数的原型,仿真模型调用每一个步骤,通过复制外部函数的原型myFcn。设置参数的名称u1,p1,日元代表输入参数,参数参数,输出参数。使用语法[1]指定每个参数是一个指针。

def.OutputFcnSpec = [“void myFcn (sigStructType u1 [1],”,“paramStructType p1 [1], sigStructType y1 [1])”];

使用的函数legacy_code创建函数和相应的C墨西哥人可执行的规范,def。指定的选项“generate_for_sim”正常的功能和加速模拟做准备。

legacy_code (“generate_for_sim”def);
# # #开始编译sfun_ex_mySrc_LCT墨西哥人(“我/ tmp / Bdoc21b_1757077_160094 / tpf541d20d ex12763634”、“c”,“-outdir”、“/ tmp / Bdoc21b_1757077_160094 / tp70d4139d_23c2_48bc_97f0_e7e95f91665a”、“/ tmp / Bdoc21b_1757077_160094 / tpf541d20d / ex12763634 / ex_mySrc_LCT.c”)建设与gcc。墨西哥人成功完成。墨西哥人(“sfun_ex_mySrc_LCT。c ', ' - i / tmp / Bdoc21b_1757077_160094 / tpf541d20d ex12763634”、“/ tmp / Bdoc21b_1757077_160094 / tp70d4139d_23c2_48bc_97f0_e7e95f91665a ex_mySrc_LCT.o”)建设与“gcc”。墨西哥人成功完成。# # #完成编译sfun_ex_mySrc_LCT # # #退出

创建一个蒙面的功能块,在模拟调用功能。

legacy_code (“slblock_generate”def);

块出现在一个新的模型。

使用功能块在你的模型中,创建一个总线的信号类型sigStructType作为块的输入。块的输出也是一个总线信号。块面具接受一个参数,P1。设置参数的值,使用MATLAB结构的字段匹配的结构类型paramStructType

验证执行的外部代码

创建一个验证利用模型在模拟外部代码的执行。

例如,视图模型ex_lct_struct

open_system (“ex_lct_struct”)

在恒定的块对话框,恒定值参数设置为一个结构的字段匹配的结构类型sigStructType。在信号的属性选项卡,输出数据类型将总线对象sigStructType

功能块调用功能sfun_ex_mySrc_LCT你创建的。块的输出输入总线选择器,信号中提取元素sig1sig2

功能块接受一个参数通过面具对话框。创建一个MATLAB结构structParam作为参数的值。

structParam =结构;structParam。param1 = 15; structParam.param2 = 20; structParam.param3 = 5;

可选地,使用一个万博1manbetxSimulink.Parameter对象包含结构。如果你使用一个参数对象,您可以设置的数据类型使用总线对象结构paramStructType

structParam = 万博1manbetxSimulink.Parameter (structParam);structParam。数据类型=“巴士:paramStructType”;

在“面具”对话框中,设置P1structParam

set_param (“ex_lct_struct / sfun_ex_mySrc_LCT”,“SParameter1”,“structParam”)

模拟模型。块范围显示功能块调用外部函数myFcn

open_system (“ex_lct_struct /范围”)open_system (“ex_lct_struct / Scope1”)sim卡(“ex_lct_struct”)%

注册遗留代码工具数据结构

使用遗留代码工具的第一步是注册一个或多个MATLAB结构字段代表属性的现有的C代码和生成的功能。注册过程非常灵活。你可以选择建立资源和启动注册以各种方式,包括

  • 把所有需要的头文件和源文件放在当前工作目录或分层文件夹结构

  • 生成和放置一个或多个S-functions在当前工作目录中

  • 有一个或多个注册文件在同一文件夹中

注册一个遗留代码工具数据结构:

  1. 使用legacy_code函数,指定“初始化”作为第一个参数。

    lct_spec = legacy_code(初始化)

    遗留代码工具命名数据结构lct_spec显示其MATLAB命令窗口中的字段,如下所示:

    lct_spec = SFunctionName:“InitializeConditionsFcnSpec:“OutputFcnSpec: TerminateFcnSpec:“StartFcnSpec: HeaderFiles:{}源文件:{}HostLibFiles: {} TargetLibFiles: {} IncPaths: {} SrcPaths: {} LibPaths: {} SampleTime:“继承”选项:[1 x1 struct]
  2. 数据结构定义值字段(属性),适用于现有的C函数和你打算生成的功能。最低限度,你必须指定

    • 源和现有的C函数头文件(源文件HeaderFiles)

    • 函数的名称(SFunctionName)

    • 至少一个函数功能规范(InitializeConditionsFcnSpec,OutputFcnSpec,StartFcnSpec,TerminateFcnSpec)

    的完整列表和描述字段结构,看到legacy_code函数引用页面。

如果你定义的字段指定编译资源指定相对路径,遗留代码工具搜索的资源相对于以下目录,按照以下顺序:

  1. 当前工作目录

  2. C-MEX s函数文件夹,如果不同于当前的工作目录

  3. 您指定的目录

    • IncPaths的头文件

    • SrcPaths的源文件

    • LibPaths为目标和主机库

  4. 在MATLAB目录搜索路径,不包括工具箱目录

宣布遗留代码工具功能规范

InitializeConditionsFcnSpec,OutputFcnSpec,StartFcnSpec,TerminateFcnSpec遗留代码工具中定义的字段的数据结构(见的描述legacy_code函数)需要人物矢量值,坚持一个特定的语法格式。所需的语法格式允许遗留代码工具绘制一个现有的C函数的返回值和参数返回值,输入,输出,向量参数,和工作的工具生成的功能。

一般的语法

return-spec=函数名(argument-spec)

例如,下面的特征向量指定一个函数命名doubleIt与回报规范双y₁和输入参数规范双u1

def.OutputFcnSpec = '双日元= doubleIt(双u1)”;

为更多的细节在声明函数的规范,看到

返回规范

返回规范定义了返回值的数据类型和变量名称的现有的C函数。

返回类型返回变量
返回类型 中列出的数据类型万博1manbetx支持的数据类型
返回变量 令牌的形式日元,y2,,yn,在那里n输出参数的总数。

如果函数不返回一个值,你可以省略返回规范或指定它无效

下面的表显示了有效规范语法整数返回值函数。使用表格来确定的语法应该使用C函数原型。

返回类型 C函数原型 遗留代码工具功能规范
没有返回值 空白myfunction (…) 空白myfunction (…)
标量值 int = myfunction (…) int16日元= myfunction (…)

函数名

您所指定的函数名称必须与您现有的C函数的名字相同。

例如,考虑下面的C函数原型:

浮动doubleIt (inVal浮动);

在这种情况下,函数名必须在遗留代码工具功能规范doubleIt

你不应该指定一个C宏的名称。如果你一定要,设置字段Options.isMacro真正的以防表达式折叠启用。

论证规范

参数规范定义了一个或多个数据类型和令牌对代表输入、输出向量参数,和工作参数现有的C函数。函数的输入和输出参数映射到块输入和输出端口和参数映射到工作空间的参数。

参数类型argument-token
参数类型 中列出的数据类型万博1manbetx支持的数据类型
argument-token 令牌的下列形式之一:
  • 输入- - -u1,u2,,un,在那里n输入参数的总数吗

  • 输出-日元,y2,,yn,在那里n输出参数的总数吗

  • 参数- - - - - -p1,p2,,pn,在那里n参数变量的总数吗

  • 向量(持久记忆)——工作work1,work2,,工作n,在那里n工作参数向量的总数吗

如果函数没有参数,你可以省略的参数规范或指定它无效

考虑下面的C函数原型:

浮动powerIt (inVal浮动,int指数);

生成一个函数,调用前面的函数在每个时间步,设置遗留代码工具数据结构字段OutputFcnSpec如下:

'单日元= powerIt(单u1, int16 p1)”

使用这个函数规范,遗留代码工具地图下面的信息。

返回值或参数 C类型的 对令牌 的数据类型
返回值 浮动 日元
inVal 浮动 u1
指数 int p1 int16

如果你的函数需要一个仿真软件功能块与多个输入和输出端口,万博1manbetx函数参数映射到使用一个唯一编号的输入端口u令牌。对于输出端口,使用一个唯一编号y令牌。描述这些令牌在前面的参数规格表。例如,考虑下面的C函数原型:

空白myfunc(双* y2,双u2,双u3,双u1,双* y1);

一个OutputFcnSpec特征向量映射的参数输入和输出端口类似于以下几点:

“空白myfunc(双y2[1],双u2,双u3,双u1,双y1 [1])”

由此产生的功能块包括三个输入端口和两个输出端口。第一个输入映射到函数参数u1,第二个输入u2,第三个输入u3。输出端口,函数参数y1 [1]映射到第一个输出和论点y2 [1]映射到第二个输出。映射函数原型的另一个例子多个输入和输出端口,看看使用公共汽车与遗留功能结构参数

下面的表显示了有效的函数规范语法参数类型的整数。使用表格来确定,然后适应的语法应该使用C函数原型。

参数类型 C函数原型 遗留代码工具功能规范
输入参数
没有参数 函数(空白) 函数(空白)
标量按值传递 函数(int三机一体) 函数(int16 u1)
标量经过指针 函数(int *三机一体) 函数(int16 u1 [1])
固定向量 函数(int in1 [10])
函数(int *三机一体)
函数(int16 u1 [10])
变量向量 函数(int in1 [])
函数(int *三机一体)
函数(int16 u1 [])
固定的矩阵 函数(int in1 [15])
函数(int in1 [])
函数(int *三机一体)
函数(int16 u1 [3] [5])
变量矩阵 函数(int in1 [])
函数(int *三机一体)
函数(int16 u1 [] [])
输出参数
标量指针 函数(int * y1) 函数(int16 y1 [1])
固定向量 函数(int y₁[10])
函数(int * y1)
函数(int16 y1 [10])
固定的矩阵 函数(int y₁[15])
函数(int y₁[])
函数(int * y1)
函数(int16 y1 [3] [5])
参数的参数
标量按值传递 函数(int p1) 函数(int16 p1)
标量经过指针 函数(int * p1) 函数(int16 p1 [1])
固定向量 函数(int p1 [10])
函数(int * p1)
函数(int16 p1 [10])
变量向量 函数(int p1 [])
函数(int * p1)
函数(int16 p1 [])
固定的矩阵 函数(int p1 [15])
函数(int p1 [])
函数(int * p1)
函数(int16 p1 [3] [5])
变量矩阵 函数(int p1 [])
函数(int * p1)
函数(int16 p1 [] [])
工作参数向量
通过标量值 函数(int work1) 函数(int16 work1)
标量指针 函数(int * work1)
函数(void * work1)
函数(void * * work1)
函数(int16 work1 [1])
无效的函数(void * work1)
void函数(void * * work1)
固定向量 函数(int work1 [10])
函数(int * work1)
函数(int16 work1 [10])
固定的矩阵 函数(int work1 [15])
函数(int work1 [])
函数(int * work1)
函数(int16 work1 [3] [5])

万博1manbetx支持的数据类型

数据类型 万博1manbetx支持输入和输出? 万博1manbetx支持参数? 万博1manbetx支持向量工作吗?
数据类型支持的仿真软件万博1manbetx万博1manbetx(除了字符串) 是的 是的 是的
万博1manbetxSimulink.Bus1 是的 是的 是的
的数组万博1manbetxSimulink.Bus2 是的 没有 是的
万博1manbetxSimulink.NumericType3 是的 是的 是的
万博1manbetxSimulink.AliasType1 是的 是的 是的
枚举1 是的 是的 是的
定点4 是的 是的 是的
Fi对象 N /一个 是的 N /一个
复数5 是的 是的 是的
一维数组 是的 是的 是的
二维数组6 是的 是的 是的
一天的数组7 是的 是的 是的
void * 没有 没有 是的
void * * 没有 没有 是的
  1. 你必须提供的头文件定义了总线的结构,定义了枚举类型,或定义了数据类型具有相同名称的别名。总线的结构中声明头文件必须匹配总线结构的对象(例如,元素的数量和顺序,数据类型和元素的宽度,等等)。例如,看到的使用公共汽车与遗留功能结构参数

    生成对应的数据对象类型和枚举类C代码自定义数据类型定义,使用万博1manbetxSimulink.importExternalCTypes函数。

  2. 一辆公共汽车元素可以很复杂,但只有仿真软件内置的数据类型。万博1manbetx还支持嵌套数组的任何级别。万博1manbetx

  3. 你必须提供的头文件定义了数据类型只有在数值数据类型也是一个别名。

  4. 你必须申报数据万博1manbetxSimulink.NumericType对象(未指明的不支持缩放)。万博1manbetx有关示例,请参见定点信号在遗留功能定点参数在遗留功能

  5. 仅限于使用仿真软件内置的数据类型。万博1manbetx指定一个复杂的数据类型,包括内置的数据类型在尖括号(< >)和预谋复杂的(例如,复杂的双> <)。例如,看到的在遗留功能复杂的信号

  6. MATLAB仿真软件,万博1manbetx万博1manbetx仿真软件编码器s manbetx 845产品在列为主存储多维数组数据格式作为一个向量。如果你的外部函数编写代码行数据,使用convertNDArrayToRowMajor功能选项legacy_code

  7. 一个多维信号,可以使用大小函数来确定信号的元素数量。有关示例,请参见查找表实现遗留功能多维信号在遗留功能

有关更多信息,请参见数据类型支持的仿真软件万博1manbetx万博1manbetx

遗留代码工具功能规范的规则

规范的legacy_code必须遵守以下规则:

  • 如果一个论点不是标量,必须以引用的方式传递参数。

  • 的编号输入、输出向量参数和工作参数标记必须从1开始,增加单调。

  • 对于一个给定的遗留代码工具数据结构、数据类型和大小的输入、输出向量参数,和工作跨功能规格参数必须相同StartFcnSpec,InitializeConditionsFcnSpec,OutputFcnSpec,TerminateFcnSpec

  • 您可以指定参数和表达式,使用以下尺寸:

    • 功能:元素个数,大小

    • 参数值

    • 运营商:+,- - - - - -,*,/

    • 整数和浮点文字量

    • 括号的子表达式分组

    例如:

    def.OutputFcnSpec = foo4 (int8 p1 [], int8 u1[],双y₁[元素个数(u1) + 2][元素个数(u1) + 3],…int32(元素个数(p1) +元素个数(u1)) * 2 +大小(2)日元)”;

传统的C函数规则

使用遗留代码工具集成一个C函数,该函数必须遵守以下规则:

  • 函数不能改变输入参数的值。如果一个输入信号是一个以引用的方式传递参数函数,函数不能修改指向的数据参数。

  • 不能一个指针函数的返回值。

  • 规范定义的函数StartFcnSpec,InitializeConditionsFcnSpec,或TerminateFcnSpec不能访问输入或输出参数。为StartFcnSpecInitializeConditionsFcnSpec,您可以访问输出端口,如果s函数的选择outputsConditionallyWritten被设置为真正的。这个选项设置,生成的s函数指定相关的内存不能覆盖,是全球每个输出端口(SS_NOT_REUSABLE_AND_GLOBAL)。

生成和编译S-Functions

当你注册一个遗留代码工具为现有的C函数数据结构,使用legacy_code函数如下解释生成、编译和链接功能。

  1. 生成一个C墨西哥人s函数基于在该结构中定义的信息。调用legacy_code“sfcn_cmex_generate”第一个参数和数据结构的名称作为第二个参数。

    legacy_code (sfcn_cmex_generate, lct_spec);
  2. 编译和链接功能。这个步骤假设一个C编译器设置为你的MATLAB安装。调用legacy_code“编译”第一个参数和数据结构的名称作为第二个参数。

    legacy_code(“编译”,lct_spec);

    信息消息类似于以下出现在MATLAB命令窗口和动态可加载可执行的结果。一个32位Windows系统上,仿真软件软件名称的文件万博1manbetxex_sfun_doubleit.mexw32

    # # #开始编译ex_sfun_doubleit墨西哥人ex_sfun_doubleit。c id: \ \ lct \ lct_demos # # #工作完成编译ex_sfun_doubleit # # #退出

方便,您可以生成、编译和链接的s函数通过调用在一个单一的步骤legacy_code的特征向量“generate_for_sim”。功能也为加速模拟生成一个薄层色谱文件,如果Options.useTlcWithAccel现场遗留代码工具的数据结构设置为1。

一旦生成一个动态可加载的可执行文件,您或其他人可以使用它在一个模型通过添加一个功能块,指定了编译功能。

生成一个蒙面的s函数调用生成的功能块

您可以选择使用遗留代码工具来生成一个蒙面功能块(图示),配置调用生成的C墨西哥人功能。产生这样的一个街区,电话legacy_code“slblock_generate”第一个参数和遗留代码的工具的名称作为第二个参数的数据结构。

legacy_code (slblock_generate, lct_spec);

工具面具块,使其显示的值OutputFcnSpec字段。然后您可以手动添加的块模型。

如果你喜欢,遗留代码工具自动添加的块模型,指定模型的名称作为第三个参数。例如:

lct_spec legacy_code (' slblock_generate ', ' myModel ');

如果指定的模型(例如,myModel)存在,legacy_code打开模型并添加蒙面遗留代码工具所描述的功能块的数据结构。如果模型不存在,指定名称的函数创建一个新的模型并添加蒙面的功能块。

迫使万博1manbetx加速器模式利用s函数TLC内联代码

如果您使用的是万博1manbetx仿真软件加速器™模式中,您可以生成并强制使用TLC内联函数的代码生成的遗留代码的工具。要做到这一点:

  1. 生成一个薄块文件的s函数通过调用legacy_code函数与“sfcn_tlc_generate”第一个参数和遗留代码的工具的名称作为第二个参数的数据结构。

    legacy_code (sfcn_tlc_generate, lct_spec);

    考虑中的例子C函数集成到仿真软件模型与遗留代码的工具万博1manbetx。为模型生成一个薄层色谱文件的末尾显示这个示例中,输入以下命令:

    legacy_code (sfcn_tlc_generate, def);
  2. 力加速器模式使用薄层色谱文件使用ssSetOptionsSimStruct函数设置功能选项SS_OPTION_USE_TLC_WITH_ACCELERATOR

遗留c++函数调用

调用遗留c++函数初始化后遗留代码工具数据结构,分配“c++”价值Options.language字段。例如,

def = legacy_code(“初始化”);def.Options.language='C++';

验证新设置,输入

def.Options.language

请注意

遗留代码工具可以用c++函数接口,而不是c++对象。工作,明白了遗留代码工具的局限性在仿真软件文档万博1manbetx。

处理多个注册文件

可以有多个注册文件在同一文件夹,并为每个文件生成一个函数调用legacy_code。同样地,您可以使用一个调用legacy_code为了编译和链接S-functions生成相应的TLC和另一块文件,如果合适。

考虑下面的示例,其中lct_register_1,lct_register_2,lct_register_3每个遗留代码的创建和初始化字段工具结构。

defs1 = lct_register_1;defs2 = lct_register_2;defs3 = lct_register_3;def = [defs1 (:); defs2 (:); defs3 (:));

然后,您可以使用以下的调用序列legacy_code为了生成文件基于三个注册文件:

legacy_code (sfcn_cmex_generate, def);legacy_code(“编译”,def);legacy_code (sfcn_tlc_generate, def);

或者,您可以分别处理每个注册文件。例如:

defs1 = lct_register1;legacy_code (sfcn_cmex_generate, defs1);legacy_code(“编译”,defs1);legacy_code (sfcn_tlc_generate, defs1);。defs2 = lct_register2;legacy_code (sfcn_cmex_generate, defs2);legacy_code(“编译”,defs2);legacy_code (sfcn_tlc_generate, defs2);。 defs3 = lct_register3; legacy_code('sfcn_cmex_generate', defs3); legacy_code('compile', defs3); legacy_code('sfcn_tlc_generate', defs3);

部署生成S-Functions

您可以部署在遗留代码生成工具的S-functions供他人使用。部署仿真只使用的功能,你只需要共享编译后的动态可加载的可执行文件。

遗留代码工具示例

对于遗留代码工具的示例,请参阅使用遗留代码实现的算法工具

遗留代码工具的局限性

遗留代码的工具

  • 生成C墨西哥人S-functions现有功能用C或c++编写的。MATLAB的工具不支持转换或For万博1manbetxtran功能。

  • 可以用c++函数接口,而不是c++对象。工作这个限制的一种方法是使用s函数生成器生成的一个函数,然后调用遗留c++代码的功能mdlOutputs回调函数。

  • 不支持模拟连续或离万博1manbetx散状态。这可以防止你使用mdlUpdatemdlDerivatives回调函数。如果应用程序需要支持,请参阅万博1manbetx利用s函数构建器将遗留代码

  • 总是设置S-functions国旗直接引线(sizes.DirFeedthrough)真正的。由于此设置和前面的限制,生成的功能不能休息代数循环

  • 万博1manbetx只支持连续,但固定在较小的时间步长,样品时间和抵消选择。

  • 万博1manbetx支持复数,但只有仿真软件万博1manbetx内置的数据类型

  • 不支持使用函数指针万博1manbetx作为遗产的输出函数被调用。

  • 不支持以下功能特点万博1manbetx:

    • 工作载体,除了一般DWork向量

    • 框架的输入和输出信号

    • 出口样品时间

    • 基于块的样品倍

  • 不支持使用范围(:万博1manbetx:)操作符访问c++类的数据和方法。对于静态方法,您可以编写简单的预处理器宏,类似于下面,为了解决:

    #定义CCommon_computeVectorDotProduct CCommon:: computeVectorDotProduct

  • 可以生成一个终止函数时没有指定如果函数规范包含一个模型数据类型属性吗万博1manbetxHeaderFile。导出函数模型,这个终止函数可以使生成的代码生成功能不兼容。