主要内容

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

概述

您可以将现有的C(或C++)函数(如设备驱动程序、查找表以及通用函数和接口)集成到Simulink中金宝app®使用遗留代码工具建模。使用MATLAB提供的规范®代码时,该工具将现有函数转换为可以包含在Simulink模型中的C MEX s -函数。金宝app如果你使用金宝app仿真软件编码器™为了生成代码,Legacy code Tool可以在生成的代码中插入对C函数的适当调用。有关详细信息,请参见使用遗留代码工具将外部代码调用导入生成的代码中(金宝appSimulink编码器)

与使用S函数生成器或编写S函数相比,遗留代码工具更易于使用并生成优化的代码(不生成包装器代码)然而,考虑嵌入式系统的替代方法,例如包括工厂和控制器的系统,或者用C语言或C++语言编写的系统组件,替代方法更灵活,因为它们支持更多的特征和编程语言。金宝app

要与遗留代码工具交互,您需要

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

    • S函数的名称

    • 现有C函数的规范

    • 编译所需的文件和路径

    • 生成的S函数的选项

  • 使用lefacy_code.功能

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

    • 生成一个s函数用于模拟

    • 编译生成的S函数并将其链接到可动态加载的可执行文件中

    • 生成屏蔽的S函数块,用于调用生成的S函数

    • 生成一个TLC块文件,如果需要,生成sFunction_makecfg.m.rtwmakecfg.m用于生成代码的文件(金宝appSimulink编码器(需要产品许可证)

笔记

在使用之前lefacy_code.,请确保为MATLAB安装设置C编译器。

下图说明了使用遗留代码工具的一般过程。使用遗留代码工具将C函数集成到Simulink模型中金宝app提供了一个使用遗留代码工具将现有C函数转换为C MEX s函数的示例。

如果你有金宝appSimulink编码器产品许可,请参阅使用遗留代码工具将外部代码调用导入生成的代码中(金宝appSimulink编码器)获取关于使用遗留代码工具生成代码的信息。

将C函数集成到金宝app具有遗留代码工具的模型

此示例演示如何使用遗留代码工具将现有的C函数集成到Simulink模型中。金宝app

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

  1. 初始化一个MATLAB结构体def使用表示旧代码工具属性的字段lefacy_code.函数。

    def = legacy_code(初始化)

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

    def = SFunctionName: " InitializeConditionsFcnSpec: " OutputFcnSpec: " StartFcnSpec: " TerminateFcnSpec: " HeaderFiles: {} SourceFiles: {} HostLibFiles: {} TargetLibFiles: {} IncPaths: {} SrcPaths: {} LibPaths: {} SampleTime: 'inherited' Options: [1x1 struct]
  2. 为遗留代码工具数据结构中的字段指定适当的值,以标识现有C功能的属性。例如,通过在matlab命令提示符下输入以下命令,指定C函数源和标题文件名:

    def.sourcefiles = {'doubleit.c'};def.headerfiles = {'doubleit.h'};

    您还必须指定有关遗留代码工具从C代码生成的s函数的信息。例如,通过输入指定S函数的名称及其输出函数声明:

    def.SFunctionName='ex_sfun_doubleit';def.outputfcsnspec='double y1=doubleit(double u1)';

    有关各种数据结构字段的信息,请参见lefacy_code.参考页面。

  3. 使用lefacy_code.函数。在MATLAB命令提示符处,输入:

    遗留_代码('sfcn_cmex_generate',def);

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

  4. 使用金宝applefacy_code.函数。在MATLAB命令提示符处,输入:

    Legacy_code('编译',def);

    以下消息显示在MATLAB命令窗口中:

    ###开始编译ex_sfun_doubleit mex('ex_sfun_doubleit.c','d:\work\lct_demos\doubleit.c','-Id:\work\lct\lct_demos')。##完成ex_sfun_doubleit#退出

    在32位微软®窗户®系统,生成的s函数可执行文件被命名ex_sfun_doubleit.mexw32.

  5. 插入一个蒙面S函数块到Simulink模型中金宝app。

    legacy_code (slblock_generate, def);

    遗留代码工具配置块以使用上一步中创建的C MEX S函数。此外,该工具掩盖了块,使其显示其值输出fcnspec属性的描述(请参阅lefacy_code.功能)。

  6. 将幅度1的正弦波块添加到C-MEX S函数块的输入和输出的范围块。

    运行仿真。C-MEX S-Function块返回其浮点输入值乘以2。它的行为类似于C函数doubleIt

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

此示例显示如何使用遗留代码工具集成C函数,其参数指向结构的指针。

在Si金宝appmulink®中,创建金宝app仿真软件。公共汽车对象来表示结构类型。在模型中使用总线信号来表示结构化信号和状态。在工作空间或“块参数”对话框中创建MATLAB结构以表示参数结构。

有关总线信号的基本信息,请参阅虚拟总线。有关参数结构的基本信息,请参阅在结构中组织相关块参数定义。要创建总线对象,请参见创建和指定Simulink。金宝app总线对象

探索外部代码

将此自定义源代码复制到名为的文件中ex_mySrc_LCT.c在当前文件夹中。

#include“ex_mytypes_lct.h”void myfcn(sigtracttype * in,paramstrugtype * params,sigutructrype * out){out-> sig1 = in-> sig1 * params-> param1;out-> sig2 = in-> sig2 * params-> param2 + params-> param3;}

函数的参数myfcn.是指向结构的指针。函数接受输入信号参数、参数参数和输出信号参数。

将此自定义头代码复制到名为的文件中ex_myTypes_LCT.h在当前文件夹中。

#ifndef _MY_TYPES_H_ #define _MY_TYPES_H_ typedef struct {double sig1;双sig2;} sigStructType;Typedef struct {double param1;双param2;双param3;} paramStructType;void myFcn(sigStructType *in, paramStructType *params, sigStructType *out);# endif

该文件定义了所需的信号和参数结构类型myfcn.使用。

在Simulink中创建表示结构类型的总线对象金宝app

在命令提示符下,使用该函数金宝appSimulink.importExternalCTypes在基础工作区中生成总线对象。

金宝appSimulink.importExternalCTypes (“ex_myTypes_LCT.h”);

总线对象对应于结构体类型ex_myTypes_LCT.h定义了。

创建块以执行外部代码

创建一个结构变量,def,以存储调用外部代码的s -函数的规范。使用的函数lefacy_code.创建结构并设置默认值。

def=遗留_代码(“初始化”);

设置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,y1表示输入参数,参数参数和输出参数。使用语法[1]指定每个实参是一个指针。

def.outputfcnspec = ['void myFcn(sigStructType u1[1], ')......'paramStructType p1[1],sigStructType y1[1])'];

使用的函数lefacy_code.要根据规范创建S函数和相应的C MEX可执行文件,def.指定的选项'generate_for_sim'准备正常和加速模拟的S函数。

Legacy_code('generate_for_sim',def);
###开始编译sfun_ex_mySrc_LCT MEX( ' - 我的/ 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'。MEX成功完成。MEX('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'。MEX成功完成。###完成编译sfun_ex_mysrc_lct ###退出

创建一个屏蔽的S-Function块,在模拟过程中调用S-Function。

Legacy_code(“slblock_生成”def);

块出现在一个新的模型中。

要在模型中使用S-Function块,请创建一个类型为的总线信号sigStructType用作块输入。块输出也是一个总线信号。块掩码接受一个参数,P1.要设置参数的值,请使用MATLAB结构,其字段与结构类型的字段paramStructType

验证外部代码的执行

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

例如,查看模型ex_lct_struct.

开放式系统(“ex_lct_struct”

在“常量块”对话框中,将恒定价值参数设置为其字段与结构类型的字段相匹配的结构sigStructType.在信号属性标签,输出数据类型设置为总线对象sigStructType

S-Function块调用S-Functionsfun_ex_mySrc_LCT你创建的。块的输出进入总线选择器块,它提取信号元素sig1sig2

S函数块通过蒙版对话框接受参数。创建MATLAB结构structparam.用作参数的值。

structparam = struct;structparam.param1 = 15;structparam.param2 = 20;structparam.param3 = 5;

可选地,使用一个金宝app仿真软件。参数对象以包含该结构。如果使用参数对象,则可以使用总线对象设置结构的数据类型paramStructType

structParam=Si金宝appmulink.Parameter(structParam);structParam.DataType=“巴士:paramStructType”;

在“掩码”对话框中设置P1structparam.

设置参数(“ex_lct_struct/sfun_ex_mySrc_lct”“SParameter1”“structParam”

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

开放式系统(“ex_lct_struct /范围”)开放式系统(“ex_lct_结构/范围1”)sim(“ex_lct_struct”

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

使用遗留代码工具的第一步是使用表示现有C代码和生成的S函数属性的字段注册一个或多个MATLAB结构。注册过程是灵活的。您可以选择设置资源并以多种方式启动注册,包括

  • 将所有必需的头文件和源文件放置在当前工作文件夹或分层文件夹结构中

  • 在当前工作文件夹中生成并放置一个或多个S函数

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

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

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

    lct_spec=遗留_代码(“初始化”)

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

    lct_spec=SFunctionName:''InitializeConditionsCnspec:''OutputFcnSpec:''StartFcnSpec:''TerminateFcnSpec:''头文件:{}源文件:{}主机库文件:{}目标库文件:{}incpath:{}srcpath:{}libpath:{}SampleTime:'继承的'选项:[1x1结构]
  2. 定义适用于现有C函数的数据结构字段(属性)的值以及您打算生成的S函数。最小,您必须指定

    • 现有C函数的源文件和头文件(sourcefiles.头饰

    • S函数的名称(SFunctionName

    • s -功能的至少一个功能规范(InitializeConditionsFcnSpec输出fcnspecStartFcnSpecTerminateFcnSpec

    有关结构中字段的完整列表和描述,请参见lefacy_code.功能参考页面。

如果您定义了指定编译资源的字段并指定了相对路径,那么Legacy Code Tool将按照以下顺序搜索与以下目录相关的资源:

  1. 当前工作目录

  2. C-MEX S函数文件夹,如果与当前工作文件夹不同

  3. 您指定的目录

    • 进入对于标题文件

    • SrcPaths用于源文件

    • libpaths.用于目标库和主机库

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

声明遗留代码工具功能规范

InitializeConditionsFcnSpec输出fcnspecStartFcnSpec,TerminateFcnSpec字段定义在遗留代码工具数据结构中(请参阅lefacy_code.函数)需要符合特定语法格式的字符向量值。所需的语法格式使旧代码工具能够将现有C函数的返回值和参数映射到工具生成的S函数的返回值、输入、输出、参数和工作向量。

一般语法

返回规范=函数名论证规范

例如,下面的字符向量指定了一个名为doubleIt与回报规范双Y1和输入参数规范双u1

def.OutputFcnSpec='双y1=双u1';

有关声明函数规范的更多细节,请参见

返回规格

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

返回类型返回变量
返回类型 中列出的数据类型金宝app支持的数据类型
返回变量 形式标记y1y2......yN哪里N是输出参数的总数。

如果函数不返回值,则可以省略返回规范或将其指定为无效

下表显示了整数返回值的有效功能规范语法。使用表格标识您应该为C函数原型使用的语法。

返回类型 C函数原型 遗留代码工具功能规范
没有返回值 void myfunction(…) void myfunction(…)
标量值 int=myfunction(…) INT16 Y1 = myFunction(...)

函数名

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

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

浮动双倍(浮动无效);

在这种情况下,旧代码工具函数规范中的函数名必须为doubleIt

不应指定C宏的名称。如果必须指定,请设置字段Options.isMacro真正的在case表达式折叠是启用的。

参数规范

参数规范定义了一个或多个数据类型和令牌对,它表示现有C函数的输入,输出,参数和工作向量参数。函数输入和输出参数映射以阻止输入和输出端口和参数映射到工作区参数。

参数类型argument-token
参数类型 中列出的数据类型金宝app支持的数据类型
argument-token 下列形式之一的令牌:
  • 输入 -U1.U2.......N哪里N是输入参数的总数吗

  • 输出-y1y2......yN哪里N输出参数的总数是多少

  • 范围 -p1p2......P.N哪里N是参数参数的总数

  • 工作向量(持久内存)-work1work2......工作N哪里N是工作矢量论点的总数

如果函数没有参数,可以省略参数规范或将其指定为无效

考虑下面的C函数原型:

float powerIt(float inVal, int exponent);

要生成在每个时间步调用前面函数的S函数,请设置Legacy Code Tool数据结构字段输出fcnspec如下:

'single y1 = powerIt(single u1, int16 p1)'

使用此功能规范,遗留代码工具映射以下信息。

返回值或参数 C类型的 对令牌 数据类型
返回值 浮动 y1 单身的
inv 浮动 U1. 单身的
拥护者 int p1 int16

如果您的函数需要具有多个输入和输出端口的Simulink金宝app S函数块,请使用唯一编号的映射到输入端口的函数参数令牌。对于输出端口,使用唯一编号的y令牌。这些参数在前面的参数规范表中描述。例如,考虑下面的C函数原型:

Void myfunc(double *y2, double u2, double u3, double u1, double *y1);

一个输出fcnspec将参数映射到输入和输出端口的字符向量如下所示:

'void myfunc(双Y2 [1],双U2,双U3,双U1,双Y1 [1])'

得到的S函数块包括三个输入端口和两个输出端口。第一个输入映射到函数参数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 y1 [10])
函数(int * y1)
函数(int16 y1 [10])
固定矩阵 函数(int y1[15])
功能(int y1 [])
函数(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函数(void * work1)
void函数(Void ** Work1)
固定载体 函数(int work1 [10])
函数(int * work1)
函数(int16 work1 [10])
固定矩阵 功能(int work1 [15])
函数(int work1[]
函数(int * work1)
函数(int16工作1[3][5])

金宝app支持的数据类型

数据类型 金宝app是否支持输入和输出? 金宝app参数是否支持? 金宝app支持工作向量?
Simulink支持的金宝app数据类型金宝app(除了。一串
金宝app仿真软件。公共汽车1
的数组金宝app仿真软件。公共汽车2 没有
金宝appsimulink.numerictype.3.
金宝appsimulink.aliaStype.1
枚举1
固定点4.
金融机构对象 N / A. N / A.
复数5.
一维数组
二维数组6.
N-D阵列7.
空虚* 没有 没有
空白 ** 没有 没有
  1. 您必须提供定义总线结构的头文件,定义枚举类型,或定义与别名同名的数据类型。头文件中声明的总线结构必须与总线对象的结构相匹配(例如,元素的数量和顺序、数据类型和元素的宽度等)。有关示例,请参见使用具有结构参数的遗留函数的总线

    要生成与C代码定义的自定义数据类型相对应的数据类型对象和枚举类,请使用金宝appSimulink.importExternalCTypes函数。

  2. 总线元素可以复杂,但仅使用Simulink内置数据类型。金宝app还支持阵列到任何级别。金宝app

  3. 如果数值数据类型也是别名,则必须提供仅定义数据类型的头文件。

  4. 您必须将数据声明为金宝appsimulink.numerictype.对象(不支持未指定的缩放)。金宝app对于例子,见传统函数中的定点信号遗留函数中的定点参数

  5. 仅限于与Simulink内置数据类型一起金宝app使用。要指定复杂的数据类型,请在角括号(<>)中括内置数据类型并将其添加复杂的(例如,复杂的双> <).例如,请参见遗留函数中的复杂信号

  6. matlab,simul金宝appink,和金宝appSimulink编码器下载188bet金宝搏产品以列主格式将多维数组数据存储为向量。如果您的外部函数代码是为行主数据编写的,请使用convertndarraytorowmajor.S函数选项lefacy_code.

  7. 对于多维信号,可以使用尺寸函数来确定信号中的元素数。对于例子,见在遗留函数中实现的查找表遗留函数中的多维信号

有关详细信息,请参阅Simulink支持的金宝app数据类型金宝app

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

规范的lefacy_code.必须遵守以下规则:

  • 如果参数不是标量,则必须通过引用传递参数。

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

  • 对于给定的遗留代码工具数据结构,输入,输出,参数和工作矢量参数的数据类型和大小必须跨功能规范相同StartFcnSpecInitializeConditionsFcnSpec输出fcnspec,TerminateFcnSpec

  • 你可以使用以下表达式指定参数维度:

    • 功能:元素个数尺寸

    • 参数值

    • 操作员:+-*,/

    • 整数和浮点文字

    • 用于分组子表达式的括号

    例如:

    定义输出fcnspec=foo4(int8 p1[],int8 u1[],双y1[numel(u1)+2][numel(u1)+3],…int32(numel(p1)+numel(u1))*2+大小(y1,2));

遗留C函数规则

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

  • 函数不能改变输入参数的值。如果输入信号是通过引用传递给函数的参数,则函数不能修改参数所指向的数据。

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

  • 的函数规范StartFcnSpecInitializeConditionsFcnSpec, 或者TerminateFcnSpec无法访问输入或输出参数。为StartFcnSpecInitializeConditionsFcnSpec,如果选择S功能选项,则可以访问输出端口outputsConditionallyWritten设置为真正的.使用此选项设置,生成的S-Function指定与每个输出端口相关联的内存不能被覆盖,并且是全局的(ss_not_reusable_and_global.).

生成和编译s函数

为现有C函数注册旧代码工具数据结构后,使用lefacy_code.函数,以生成、编译和链接S函数。

  1. 基于结构中定义的信息生成C MEX S函数。称呼lefacy_code.'sfcn_cmex_generate'作为第一个参数,数据结构的名称作为第二个参数。

    遗留代码(“sfcn\U cmex\U生成”,lct\U规范);
  2. 编写并链接s函数。这个步骤假设为MATLAB安装设置了一个C编译器。称呼lefacy_code.“编译”作为第一个参数,数据结构的名称作为第二个参数。

    legacy_code(“编译”,lct_spec);

    类似于以下内容的信息邮件将显示在MATLAB命令窗口中和动态可加载的可执行结果。在32位Windows系统上,Simulink软件名称文件金宝appex_sfun_doubleit.mexw32.

    ###开始编译EX_SFUN_DOUBLITIT MEX EX_SFUN_DOUBYIT.C -ID:\ WORK \ LCT \ LCT_DEMOS ###完成编译EX_SFUN_DOUBLITIT ###退出

作为方便,您可以通过调用在一步中生成,编译和链接S函数lefacy_code.与字符矢量'generate_for_sim'。如果Options.useTlcWithAccel遗留代码工具数据结构的字段设置为1。

生成动态可加载的可执行文件后,您或其他人可以通过添加指定编译的S函数的S函数块来在模型中使用它。

生成用于调用生成的s函数的掩码s函数块

您可以选择使用遗留代码工具生成被配置为调用生成的C MEX S函数的屏蔽的S函数块(图形表示)。生成这样的块,呼叫lefacy_code.“slblock_生成”作为第一个参数,遗留代码工具数据结构的名称作为第二个参数。

legacy_code (slblock_generate, lct_spec);

控件的值,该工具将块遮罩起来输出fcnspec领域然后可以手动将块添加到模型中。

如果希望旧代码工具自动将块添加到模型中,请将模型名称指定为第三个参数。例如:

Legacy_code('slblock_generate',lct_spec,'mymodel');

如果指定的型号(例如,mymodel.)存在,lefacy_code.打开模型并添加由遗留代码工具数据结构描述的屏蔽S功能块。如果模型不存在,该函数将使用指定的名称创建一个新模型,并添加屏蔽的S函数块。

强迫金宝app加速器模式使用S函数TLC内联代码

如果你正在使用金宝appSimulink Accelerator™模式下,您可以为遗留代码工具生成的S函数生成并强制使用TLC内联代码。为此:

  1. 生成TLC块文件的s函数lefacy_code.作用于“sfcn_tlc_generate”作为第一个参数,遗留代码工具数据结构的名称作为第二个参数。

    Legacy_code('sfcn_tlc_generate',lct_spec);

    考虑一个例子使用遗留代码工具将C函数集成到Simulink模型中金宝app.要为示例末尾所示的模型生成TLC文件,输入以下命令:

    legacy_code (sfcn_tlc_generate, def);
  2. 强制加速模式使用TLC文件ssSetOptionsSimStruct函数设置S-function选项SS_OPTION_USE_TLC_WITH_ACCELERATOR

调用遗留C++函数

要在初始化遗留代码工具数据结构后调用遗留c++函数,将值' c++ '赋给Options.language字段。例如,

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

要验证新设置,请输入

def.options.language.

笔记

遗留代码工具可以与c++函数交互,但不能与c++对象交互。为了工作,看遗留代码工具的限制在Simuli金宝appnk文档中。

处理多个注册文件

您可以在同一个文件夹中有多个注册文件,并使用单个调用为每个文件生成一个S-functionlefacy_code.。同样,您也可以使用单个呼叫lefacy_code.为了编译和链接S函数,另一个是合适的,可以生成相应的TLC块文件。

考虑下面的例子,在哪里lct_register_1lct_register_2,lct_register_3每个都创建和初始化遗留代码工具结构的字段。

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

然后,您可以使用以下调用序列lefacy_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 -函数,以供他人使用。要部署仅供模拟使用的s函数,您只需要共享已编译的可动态加载的可执行文件。

遗留代码工具示例

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

遗留代码工具的限制

遗留代码工具

  • 生成C++或C++中现有函数的C MEX S函数,该工具不支持MATLAB或FORTRAN函数的变换。金宝app

  • 可以与C ++函数界面,但不是C ++对象。解决此限制的一种方法是使用S函数构建器生成S函数的shell,然后从S函数中调用旧版C ++代码mdloutputs.回调函数。

  • 不支持模拟连续或离金宝app散状态。这将阻止您使用mdlUpdatemdlDerivatives回调函数。如果您的应用程序需要这种支持,请参见金宝app使用S函数生成器合并旧代码

  • 始终设置S函数标志直接馈通尺寸.DirfeedThrough.)真正的.由于这个设置和前面的限制,生成的s函数不能被打破代数循环

  • 金宝app只支持连续的,但固定在小时间步长,采样时间和偏移量选择。

  • 金宝app支持复数,但仅限于Simulink金宝app内置的数据类型

  • 不支持使用函数指针金宝app作为被调用的遗留函数的输出。

  • 不支持以下S功能功金宝app能:

    • 功向量,除了一般的功向量

    • 基于帧的输入和输出信号

    • 基于端口的采样时间

    • 基于块的样本时间

  • 不支持使用范围(:金宝app:::::)操作员访问C ++类数据和方法。对于静态方法,您可以编写简单的预处理器宏,类似于以下内容,可以解决以下问题:

    #定义CCommon_computeVectorDotProduct CCommon:: computeVectorDotProduct

  • 如果函数规范中包含一个具有属性的Simulink数据类型,当您没有指定一个terminate函数时,是否可以生成一个terminate函数金宝appHeaderFile。对于导出函数模型,此终止函数会使生成的S函数与代码生成不兼容。