主要内容

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

概述

您可以集成现有的C(或C ++)函数,例如设备驱动程序,查找表和常规功能以及接口,进入Simulink金宝app®通过使用旧代码的工具模型。使用规范,您所提供的MATLAB®代码,该工具将现有功能转换为C MEX S函数,以便在Simulink模型中包含。金宝app如果你使用金宝appSimulink Coder™生成的代码,修改代码工具可以插入到你的C函数一个合适的呼叫到生成的代码。有关详细信息,请参阅导入调用外部代码到生成的代码修改代码工具(金宝app仿真软件编码器)

相比于使用S-函数生成器或写一个S-功能,传统代码工具是更容易使用,并生成优化代码(不会产生包装代码)通常由嵌入式系统必需的。然而,考虑用于混合动力系统的替代方法,例如,其包括植物和控制器,或写入比C或C以外的其他语言++系统部件的系统。替代方法是,他们支持更多的功能和编程语言更加灵活。金宝app

与遗留代码工具互动,您

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

    • S函数的名称

    • 现有C函数的规范

    • 文件名和路径所需的编译

    • 生成的S函数的选项

  • 使用legacy_code功能

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

    • 生成仿真过程中使用的S-功能

    • 编译并链接生成S-功能为可动态加载的可执行

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

    • 生成一个TLC块的文件,如果有必要,一个答案_makecfg.m.或者RTWMAKECFG.M.代码生成文件(金宝appSimulink编码器需要产品许可证)

笔记

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

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

如果你有一个金宝appSimulink编码器产品许可证,见导入调用外部代码到生成的代码修改代码工具(金宝app仿真软件编码器)有关使用用于代码生成的传统代码工具的信息。

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

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

假设您有一个C函数,输出其浮点输入值乘以2。函数定义在一个名为DoubleIt.c.,其声明存在于名为的标题文件中普通的

  1. 初始化MATLAB结构def使用使用遗留代码工具属性的字段使用legacy_code功能。

    DEF = legacy_code( '初始化')

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

    DEF = SFunctionName: '' InitializeConditionsFcnSpec: '' OutputFcnSpec: '' StartFcnSpec: '' TerminateFcnSpec: '' HeaderFiles:{} SourceFiles:{} HostLibFiles:{} TargetLibFiles:{} IncPaths:{} SrcPaths:{} LibPaths:{}SampleTime: '继承' 选项:[1x1的结构]
  2. 为Legacy Code Tool数据结构中的字段指定适当的值,以标识现有C函数的属性。例如,通过在MATLAB命令提示符中输入以下命令来指定C函数源和头文件名:

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

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

    def.sfunctionname ='ex_sfun_double';def.outputfcnspec ='double y1 = dubpit(double u1)';

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

  3. 通过使用从所述现有的C功能的S-函数源文件legacy_code功能。在matlab命令提示符下,键入:

    Legacy_code('sfcn_cmex_generate',def);

    遗留代码工具使用def创建名为的S函数源文件ex_sfun_doubleit.c.在当前的Matlab文件夹中。

  4. 编译并将S函数源文件链接到使用的动态可加载的可执行文件中使用金宝applegacy_code功能。在matlab命令提示符下,键入:

    Legacy_code('编译',def);

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

    ###开始编译ex_sfun_doubleit MEX( 'ex_sfun_doubleit.c', 'd:\工作\ lct_demos \ doubleIt.c', '-Id:\工作\ LCT \ lct_demos')###完成编译ex_sfun_doubleit ###退出

    在32位的Microsoft上®视窗®系统,由此产生的S函数可执行文件命名ex_sfun_doubleit.mexw32.

  5. 插入掩盖功能块进入Simulink模型金宝app。

    Legacy_code('slblock_generate',def);

    遗留代码工具配置块以使用上一步中创建的C MEX S函数。此外,该工具掩盖了块,使其显示其值OutputFcnSpec财产(见图的描述legacy_code功能)。

  6. 在C-MEX s -函数块的输入处添加一个振幅为1的正弦波块,在输出处添加一个Scope块。

    运行模拟。C-MEX S函数块返回其浮点输入的值乘以两个。它表现得像c函数

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

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

在Si金宝appmulink®中,创建一个金宝appSimulink.Bus对象来表示的结构类型。使用模型中的总线信号,以表示结构化的信号和状态。在工作空间中或在块参数创建对话框MATLAB结构来表示参数的结构。

有关总线信号的基本信息,请参阅虚拟总线.有关参数结构的基本信息,请参阅组织结构中的相关块参数定义.要创建总线对象,见创建和指定Simulink.Bus对象金宝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结构{双SIG1;双SIG2;} sigStructType;typedef结构{双参数1;双参数2;双参数3;} paramStructType;空隙myFcn(sigStructType *在,paramStructType *参数,可以sigStructType *出);#万一

文件定义了信号和参数结构类型的myfcn.用途。

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

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

金宝appsimulink.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..设置参数的名称u1P1., 和y1.表示输入参数、参数参数和输出参数。使用语法[1]指定每个参数是指针。

def.OutputFcnSpec = ['void myfcn(sigutrytype u1 [1],'...'paramStructType P1 [1],sigStructType Y1 [1])'];

使用功能legacy_code从规范中创建S函数和相应的C MEX可执行文件,def.指定选项“generate_for_sim”准备正常和加速模拟的S函数。

legacy_code (“generate_for_sim”,DEF);
###开始编译sfun_ex_mySrc_LCT MEX( ' - 我的/ tmp / Bdoc21a_1606923_4327 / tp74b21f37 / ex12763634', '-c', '-outdir', '/ tmp目录/ Bdoc21a_1606923_4327 / tpe42d0b74_ef8c_4935_abf7_acb59a328c05',“/ tmp目录/ Bdoc21a_1606923_4327 / tp74b21f37 / ex12763634 /ex_mysrc_lct.c')建立'gcc'。MEX成功完成。Mex('sfun_ex_mysrc_lct.c','-i / tmp / bdoc21a_1606923_4327 / tp74b21f37 / ex12763634','/ tmp/bdoc21a_1606923_4327/tpe42d0b74_ef8c_4935_abf7_acb59a328c05/ex_mysrc_lct.o')建立'gcc'。MEX成功完成。###完成编译sfun_ex_mysrc_lct ###退出

创建一个屏蔽的S函数块,可在仿真期间调用S函数。

legacy_code ('slblock_generate',DEF);

该块出现在一个新的模式。

要在模型中使用S函数块,请创建类型的总线信号sigtracttype.用作块输入。块输出也是总线信号。块掩码接受参数,P1.要设置参数的值,使用MATLAB结构,其字段与结构类型的字段相匹配Paramstructype.

验证外部代码的执行

创建一个线束模型,用于在仿真期间验证外部代码的执行。

举一个例子,查看模型ex_lct_struct

open_system('ex_lct_struct'

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

S函数块调用S函数sfun_ex_mySrc_LCT你创造的。块的输出进入总线选择块,其提取信号元素SIG1.SIG2.

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

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

或者,使用金宝appSimulink.Parameter对象包含的结构。如果使用一个参数对象,则可以通过使用总线对象设置的结构的数据类型Paramstructype.

structparam = 金宝appsimulink.parameter(structparam);structparam.datatype ='总线:Paramstructtype';

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

set_param('ex_lct_struct / sfun_ex_mySrc_LCT''sparameter1''structparam'

模拟模型。Scope块表明S-Function块调用外部函数myfcn.

open_system('ex_lct_struct / scope')Open_System('ex_lct_struct / scope1')sim('ex_lct_struct'

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

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

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

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

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

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

  1. 使用legacy_code功能,指定'初始化'作为第一个论点。

    lct_spec = legacy_code( '初始化')

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

    lct_spec = SFunctionName: '' InitializeConditionsFcnSpec: '' OutputFcnSpec: '' StartFcnSpec: '' TerminateFcnSpec: '' HeaderFiles:{} SourceFiles:{} HostLibFiles:{} TargetLibFiles:{} IncPaths:{} SrcPaths:{} LibPaths:{}SampleTime: '继承' 选项:[1x1的结构]
  2. 为应用于现有C函数和打算生成的s函数的数据结构字段(属性)定义值。至少,您必须指定

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

    • 一种在S-函数名(sfunctionname.

    • S函数的至少一个功能规范(initializeconditionsfcnspec.OutputFcnSpecstartfcnspec.terminatefcnspec.

    有关完整列表,并在结构中的字段的说明,请参见legacy_code功能参考页面。

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

  1. 当前工作文件夹

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

  3. 你指定的目录

    • 进入的头文件

    • SrcPaths的源文件

    • libpaths.对于目标和主机库

  4. Matlab搜索路径上的目录,排除工具箱目录

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

initializeconditionsfcnspec.OutputFcnSpecstartfcnspec., 和terminatefcnspec.在传统代码工具数据结构字段定义(参见的描述legacy_code功能)要求人物矢量值即坚持一个特定的语法格式。所需的句法格式使遗留代码工具到一个现有的C函数的返回值和参数映射到的返回值,输入,输出,参数和工作在S-功能,该工具产生的向量。

一般的语法

return-spec=函数名argument-spec

例如,以下字符向量指定命名的函数与回报规范双y₁和输入参数规范双重U1

def.outputfcnspec ='double y1 = dubpit(double u1)';

有关声明功能规范的更多详细信息,请参阅

返回规格

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

返回式返回变量
返回式 一种数据类型列在金宝app支持的数据类型
返回变量 表格的象征y1.Y2....yN., 在哪里N.是输出参数的总数。

如果函数不返回一个值,你可以省略返回规范或将其指定为空白

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

返回类型 C函数原型 遗留代码工具功能规范
没有返回值 无效myfunction的(...) 无效myfunction的(...)
标值 int = myfunction(...) y1 = myfunction(…)

功能名称

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

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

浮doubleIt(浮动inVal);

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

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

参数规格

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

参数类型参数令牌
参数类型 一种数据类型列在金宝app支持的数据类型
参数令牌 下列形式之一的令牌:
  • 输入- - -u1u2...N., 在哪里N.是输入参数的总数

  • 输出 -y1.Y2....yN., 在哪里N.是输出参数的总数

  • 参数- - - - - -P1.P2....P.N., 在哪里N.是参数参数的总数

  • 工作向量(持久存储) -工作1工作2...工作N., 在哪里N.功矢量参数的总数是多少

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

考虑以下C函数原型:

浮POWERIT(浮点inVal,INT指数);

以产生S-函数在每个时间步骤调用前述功能,设置传统代码工具的数据结构字段OutputFcnSpec如下:

'单个Y1 = PowerIt(单个U1,INT16 P1)'

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

返回值或参数 c型 令牌 的数据类型
返回值 漂浮 y1.
inVal 漂浮 u1
指数 P1. INT16

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

void myfunc(双* y2,双U2,双U3,双U1,双* Y1);

一个OutputFcnSpec字符矢量映射输入和输出端口的参数看起来类似于以下内容:

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

得到的S函数块包括三个输入端口和两个输出端口。第一个输入映射到函数参数u1,第二个输入u2,以及第三个输入u3.对于输出端口,函数参数Y1 [1]地图到第一个输出和参数Y2 [1]映射到第二个输出。有关将函数原型映射到多个输入和输出端口的另一个示例,请参见使用公交传统功能具有结构参数

下表显示了Integer类型参数的有效功能规范语法。使用表识别,然后调整您应该为您的C函数原型使用的语法。

参数类型 C函数原型 遗留代码工具功能规范
输入参数
没有论据 功能(无效) 功能(无效)
按价值的标量通过 功能(int In1) 函数(int16 u1)
标量通过指针 函数(INT * IN1) 功能(Int16 U1 [1])
固定向量 功能(int In1 [10])或者
函数(INT * IN1)
功能(Int16 U1 [10])
可变矢量 函数(int in1 [])或者
函数(INT * IN1)
函数(INT16 U1 [])
固定矩阵 功能(int In1 [15])或者
函数(int in1 [])或者
函数(INT * IN1)
函数(INT16 U1 [3] [5])
可变矩阵 函数(int in1 [])或者
函数(INT * IN1)
函数(int16 u1 [] [])
输出参数
标量指针 功能(int * y1) 功能(Int16 Y1 [1])
固定向量 功能(int y1 [10])或者
功能(int * y1)
功能(Int16 Y1 [10])
固定矩阵 功能(int y1 [15])或者
函数(int y₁[])或者
功能(int * y1)
功能(Int16 Y1 [3] [5])
参数参数
按价值的标量通过 功能(int p1) 函数(INT16 P1)
标量通过指针 功能(int * p1) 函数(INT16 P1 [1])
固定向量 函数(中间体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])

金宝app支持的数据类型

数据类型 金宝app支持输入和输出? 金宝app支持的参数? 金宝app支持工作导向?
Simulink支持的金宝app数据类型金宝app(有例外字符串 是的 是的 是的
金宝appSimulink.Bus1 是的 是的 是的
数组金宝appSimulink.Bus2 是的 是的
金宝app仿真软件。NumericType3. 是的 是的 是的
金宝app仿真软件。AliasType1 是的 是的 是的
枚举1 是的 是的 是的
固定点4. 是的 是的 是的
网络对象 N/A 是的 N/A
复数5. 是的 是的 是的
1-d阵列 是的 是的 是的
2-D阵列6. 是的 是的 是的
N-D阵列7. 是的 是的 是的
空白 * 是的
void * * 是的
  1. 您必须提供定义总线结构的头文件,定义了枚举类型,或定义具有与别名相同的数据类型。在标题文件中声明的总线的结构必须与总线对象的结构匹配(例如,元素的数量和订单,元素的数据类型和宽度等)。例如,看到使用公交传统功能具有结构参数

    为了生成数据类型的对象和枚举类,对应于自定义数据类型的C代码定义中,使用金宝appsimulink.importexternalctypes.功能。

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

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

  4. 您必须将数据声明为金宝app仿真软件。NumericType对象(不支持未指定的缩放)。金宝app对于例子,见传统功能中的固定点信号定点参数在传统功能

  5. 仅限于与Simulink内置数据类型一起金宝app使用。要指定复杂的数据类型,请在角括号(<>)中括内置数据类型并将其添加复杂的(例如,复杂)。例如,看到在传统功能复杂的信号

  6. matlab,simul金宝appink,和金宝appSimulink编码器下载188bet金宝搏产品以列主要格式存储多维数组数据作为向量。如果您的外部功能代码被编写用于行主要数据,请使用convertNDArrayToRowMajor功能选项legacy_code

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

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

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

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

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

  • 输入,输出,参数,以及工作参数矢量令牌的编号必须从1开始,单调增加。

  • 对于给定的Legacy Code Tool数据结构,其输入、输出、参数和工作矢量参数的数据类型和大小必须在不同的功能规范中相同startfcnspec.initializeconditionsfcnspec.OutputFcnSpec, 和terminatefcnspec.

  • 您可以使用以下内容指定参数维度:

    • 职能:numel.尺寸

    • 参数值

    • 运营商:+-*, 和/

    • 整数和浮点文字

    • 括号分组子表达式

    例如:

    def.OutputFcnSpec = foo4(INT8 P1 [],INT8 U1 [],双Y1 [numel(U1)2] [numel(U1)3],... INT32(numel(P1)+ numel(U1))* 2 +大小(y1,2))';

遗留C函数规则

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

  • 该函数不得更改输入参数的值。如果输入信号是函数的传递逐参考参数,则该函数不得修改参数指向的数据。

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

  • 功能规格,可以定义startfcnspec.initializeconditionsfcnspec.,或terminatefcnspec.不能访问的输入或输出参数。为了startfcnspec.initializeconditionsfcnspec.如果S函数选项,您可以访问输出端口outcalSconditionallywritting.被设定为真的.使用此选项设置,生成的S函数指定无法覆盖与每个输出端口关联的内存并是全局的(ss_not_reusable_and_global.)。

生成和编译的S-功能

注册现有C函数的遗留代码工具数据结构后,使用legacy_code以下功能所解释的,以产生,编译和链接S-功能。

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

    Legacy_code('sfcn_cmex_generate',lct_spec);
  2. 编译和链接S-功能。此步骤假设一个C编译器为您的MATLAB安装。称呼legacy_code'编译'作为第一个参数和数据结构的名称作为第二个参数。

    Legacy_code('compile',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函数legacy_code与字符矢量“generate_for_sim”.该函数还为加速模拟生成TLC文件,如果是options.usetlcwithaccel.遗留代码工具数据结构的字段设置为1。

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

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

您可以选择使用Legacy Code Tool生成一个屏蔽的s -函数块(图形表示),该块被配置为调用生成的C MEX s -函数。要生成这样的块,调用legacy_code'slblock_generate'作为第一个参数和遗留代码工具数据结构的名称作为第二个参数。

legacy_code( 'slblock_generate',lct_spec);

该工具掩盖了块,使其显示它的值OutputFcnSpec场地。然后,您可以手动块添加到模型中。

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

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

如果指定的模型(例如,mymodel.)存在,legacy_code打开模型并添加遗留代码工具数据结构描述的屏蔽的S函数块。如果模型不存在,则该函数将创建具有指定名称的新模型,并添加屏蔽的S函数块。

迫使金宝app加速器使用s -函数TLC内联代码的模式

如果您正在使用金宝app仿真软件加速器™模式下,可以生成并强制使用TLC内嵌代码通过遗留代码工具生成的S-功能。去做这个:

  1. 产生TLC块文件通过致电的S函数legacy_code功能'sfcn_tlc_generate'作为第一个参数和遗留代码工具数据结构的名称作为第二个参数。

    Legacy_code('sfcn_tlc_generate',lct_spec);

    考虑一个例子集成C函数与遗留代码工具Simulink模型金宝app.为了产生用于在该实施例的端部所示的模型中的TLC文件,输入以下命令:

    Legacy_code('sfcn_tlc_generate',def);
  2. 强制加速器模式使用TLC文件使用ssSetOptions酝酿功能设置S-功能选项ss_option_use_tlc_with_accelerator.

调用遗留c++函数

到初始化传统代码工具数据结构后调用一个旧的C ++函数,值“C ++”分配给选项.Language.场地。例如,

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

要验证新设置,请输入

def.Options.language

笔记

遗留代码工具可以与C ++函数界面,但不是C ++对象。在周围的工作,看遗留代码工具限制在Simuli金宝appnk文档。

处理多个注册文件

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

看看下面的例子,其中lct_register_1lct_register_2, 和lct_register_3每个都创建和初始化遗留代码工具结构的字段。

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

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

Legacy_code('sfcn_cmex_generate',defs);Legacy_code('编译',defs);Legacy_code('sfcn_tlc_generate',defs);

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

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函数

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

遗留代码工具示例

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

遗留代码工具限制

遗留代码工具

  • 生成用于在C或C ++中写入的现有功能的C MEX S函数。该工具不支持MATLAB或FORTR金宝appAN功能的转换。

  • 可以与c++函数接口,但不能与c++对象接口。解决这个限制的一种方法是使用S-Function Builder生成s -函数的外壳,然后从s -函数调用遗留c++代码mdlOutputs回调函数。

  • 不支持模拟连续或不金宝app连续的状态。这可以防止使用mdlupdate.mdlderivatives.回调函数。如果您的应用程序需要此支持,请参阅金宝app使用S-Function Builder中纳入遗留代码

  • 始终设置S函数标志直接馈通尺寸.DirfeedThrough.) 到真的.由于此设置和前面的限制,所生成的S函数不会破坏代数循环

  • 金宝app只支持连续的,而是固定在较小的时间步长,采样时间和偏移选项。

  • 金宝app支持复杂的数字,但仅使用simulink金宝app内置数据类型

  • 不支持使用函数指针金宝app作为传统功能的输出被调用。

  • 不支持下面的S-功金宝app能特点:

    • 除了普通Dwork矢量外的工作向量

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

    • 基于端口的采样时间

    • 多个基于块的样本时间

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

    #定义CCommon_computeVectorDotProduct CCommon :: computeVectorDotProduct

  • 可以生成终止功能,当你没有指定一个如果函数规范包括具有属性的Simulink数据类型金宝app标题文件.对于出口函数模型,此终止功能可以使生成的S函数与代码生成不兼容。