文档

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

概述

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

与使用S-Function Builder或编写S-Function相比,遗留代码工具更容易使用,并生成嵌入式系统通常需要的优化代码(不生成包装代码)。但是,考虑混合系统的替代方法,例如包含工厂和控制器的系统,或者用C或c++以外的语言编写的系统组件。替代方法更加灵活,因为它们支持更多的特性和编程语言。金宝app

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

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

    • s函数的名称

    • 现有C函数的规格

    • 编译所需的文件和路径

    • 生成的s函数的选项

  • 使用legacy_code函数

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

    • 生成一个s函数用于仿真

    • 编译并链接生成的s函数到一个可动态加载的可执行文件中

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

    • 生成一个TLC块文件,如果有必要,还可以生成一个sFunction_makecfg.mrtwmakecfg.m生成代码的文件(金宝app仿真软件编码器需要产品许可证)

请注意

才能使用legacy_code,确保为MATLAB安装设置了C编译器。

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

如果你有金宝app仿真软件编码器产品许可证见使用遗留代码工具将对外部代码的调用导入生成的代码(金宝appSimulink Coder)获取有关使用遗留代码工具生成代码的信息。

将C函数集成到金宝app使用遗留代码工具建模

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

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

  1. 初始化MATLAB结构体def属性表示遗留代码工具属性的字段legacy_code函数。

    Def = legacy_code('initialize')

    遗留代码工具数据结构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.OutputFcnSpec = 'double y1 = doubleIt(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-function源文件并将其链接到可动态加载的可执行文件中金宝applegacy_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. 插入蒙版功能块转换成Simulink模金宝app型。

    legacy_code (slblock_generate, def);

    遗留代码工具配置该块以使用在前一步中创建的C MEX s函数。此外,该工具掩码块,以便它显示其OutputFcnSpec属性的描述(参见legacy_code功能)。

  6. 在C-MEX s功能模块的输入端添加一个振幅为1的正弦波模块,在输出端添加一个Scope模块。

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

集成参数为结构指针的C函数

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

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

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

探索外部代码

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

#include "ex_myTypes_LCT.h" void myFcn(sigStructType *in, paramStructType *params, sigStructType *out) {out->sig1 = in->sig1 *params ->param1;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

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

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

#ifndef _MY_TYPES_H_ #define _MY_TYPES_H_ typedef struct {double sig1;双sig2;} sigStructType;struct {double param1;双param2;双param3;} paramStructType;# endif

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

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

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

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

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

创建执行外部代码的块

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

Def = legacy_code(“初始化”);

设置S-function的名称为sfun_ex_mySrc_LCT

def.SFunctionName =“sfun_ex_mySrc_LCT”

通过文件名识别外部源文件和头文件。

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

通过复制外部函数的原型来指定输出函数的原型,模型将在每个仿真步骤中调用输出函数myFcn。设置参数的名称为u1p1,日元表示输入参数、参数参数和输出参数。使用语法[1]指定每个实参都是指针。

def.OutputFcnSpec = ['void myFcn(sigStructType 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('-I/tmp/Bdoc19b_1305395_18389/tpd6f4c88d/ex12763634', '-c', '-outdir', '/tmp/Bdoc19b_1305395_18389/tp01c111d7_8caa_45b2_a106_bababe6524a7', '/tmp/Bdoc19b_1305395_18389/tpd6f4c88d/ex12763634/ex_mySrc_LCT.c')构建'gcc'。MEX成功完成。mex('sfun_ex_mySrc_LCT.c', '-I/tmp/Bdoc19b_1305395_18389/tpd6f4c88d/ex12763634', '/tmp/Bdoc19b_1305395_18389/tp01c111d7_8caa_45b2_a106_bababe6524a7/ex_mySrc_LCT.o')构建'gcc'。/tmp/Bdoc19b_1305395_18389/tpd6f4c88d/ex12763634/sfun_ex_mySrc_LCT.c:在函数' mdlOutputs '中:/tmp/Bdoc19b_1305395_18389/tpd6f4c88d/ex12763634/sfun_ex_mySrc_LCT.c:417:9:警告:函数' myFcn '的隐式声明[-Wimplicit-function-declaration] myFcn(__u1BUS, __p1BUS, __y1BUS);^~~~~ MEX成功完成。完成编译sfun_ex_mySrc_LCT ###退出

创建一个掩码S-Function块,在模拟过程中调用S-Function。

legacy_code (“slblock_generate”def);

该块出现在新模型中。

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

验证外部代码的执行

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

例如,查看模型ex_lct_struct

open_system (“ex_lct_struct”

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

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

S-Function模块通过掩码对话框接受参数。创建MATLAB结构structParam用作参数的值。

structParam = struct;structParam。param1 = 15; structParam.param2 = 20; structParam.param3 = 5;

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

structParam = 金宝appSimulink.Parameter(structParam);structParam。数据类型=“巴士:paramStructType”

在掩码对话框中设置P1structParam

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

模拟模型。Scope块显示S-Function块调用外部函数myFcn

open_system (“ex_lct_struct /范围”) open_system (“ex_lct_struct / Scope1”) sim卡(“ex_lct_struct”
ans = 金宝appSimulink。SimulationOutput: tout: [51x1 double] SimulationMetadata: [1x1 金宝appSimulink。ErrorMessage: [0x0 char]

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

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

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

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

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

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

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

    Lct_spec = legacy_code('initialize')

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

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

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

    • s函数的名称(SFunctionName

    • s -函数(InitializeConditionsFcnSpecOutputFcnSpecStartFcnSpecTerminateFcnSpec

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

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

  1. 当前工作文件夹

  2. C-MEX s功能文件夹,如果与当前工作文件夹不同

  3. 指定的目录

    • IncPaths对于头文件

    • SrcPaths对于源文件

    • LibPaths用于目标库和主机库

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

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

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

一般的语法

return-spec函数名argument-spec

例如,下面的字符向量指定了一个名为doubleIt带返回规格双y₁输入参数说明双u1

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

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

返回规范

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

返回类型返回变量
返回类型 中列出的数据类型金宝app支持的数据类型
返回变量 形式的令牌日元y2...yn,在那里n是输出参数的总数。

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

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

返回类型 C函数原型 遗留代码工具功能规范
无返回值 空白myfunction(…) 空白myfunction(…)
标量值 Int = myfunction(…) Int16 y1 = myfunction(…)

函数名

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

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

float doubleIt(float inVal);

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

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

论证规范

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

参数类型argument-token
参数类型 中列出的数据类型金宝app支持的数据类型
argument-token 下列表格之一的令牌:
  • 输入- - -u1u2...un,在那里n输入参数的总数是多少

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

  • 参数- - - - - -p1p2...pn,在那里n参数参数的总数是多少

  • 工作向量(持久内存)-work1work2...工作n,在那里n功向量参数的总数是多少

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

考虑下面的C函数原型:

float powerIt(float inVal, int exponent);

要生成在每个时间步调用上述函数的s函数,请设置遗留代码工具数据结构字段OutputFcnSpec致:

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

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

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

如果您的函数需要具有多个输入和输出端口的Simulink金宝app S-function块,请使用唯一编号将函数参数映射到输入端口u令牌。对于输出端口,使用唯一编号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]映射到第二个输出。有关将函数原型映射到多个输入和输出端口的另一个示例,请参见使用带有结构参数的遗留函数的总线

下表显示了整数类型参数的有效函数规范语法。使用这个表来确定并调整应该用于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函数(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(除了…字符串 是的 是的 是的
金宝app仿真软件。公共汽车1 是的 是的 是的
的数组金宝app仿真软件。公共汽车2 是的 没有 是的
金宝app仿真软件。NumericType3. 是的 是的 是的
金宝app仿真软件。AliasType1 是的 是的 是的
枚举1 是的 是的 是的
定点4 是的 是的 是的
Fi对象 N/A 是的 N/A
复数5 是的 是的 是的
一维数组 是的 是的 是的
二维数组6 是的 是的 是的
一天的数组7 是的 是的 是的
void * 没有 没有 是的
void * * 没有 没有 是的
  1. 您必须提供定义总线结构的头文件,定义枚举类型,或定义与别名相同名称的数据类型。头文件中声明的总线结构必须与总线对象的结构匹配(例如,元素的数量和顺序、元素的数据类型和宽度,等等)。使用示例请参见sldemo_lct_bus

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

  2. 总线元素可以很复杂,但只能使用Simulink内置的数据类型。金宝app还支持任意级别的数组嵌套。金宝app

  3. 只有当数字数据类型也是别名时,才必须提供定义数据类型的头文件。

  4. 必须将数据声明为金宝app仿真软件。NumericType对象(不支持未指定的缩放)。金宝app例如,请参见sldemo_lct_fixpt_signalssldemo_lct_fixpt_params

  5. 仅限于与Simulink内置数据类型一起金宝app使用。要指定复杂的数据类型,请将内置数据类型括在尖括号内(<>)并在单词前加上复杂的(例如,复杂的双> <).使用示例请参见sldemo_lct_cplxgain

  6. MATLAB, Simu金宝applink,和金宝app仿真软件编码器下载188bet金宝搏产品以列主格式将多维数组数据存储为向量。如果您的外部函数代码是为行为主数据编写的,则使用convertNDArrayToRowMajors -功能选项legacy_code

  7. 对于多维信号,可以使用大小函数来确定信号中元素的数量。例如,请参见sldemo_lct_lutsldemo_lct_ndarray

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

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

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

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

  • 输入、输出、参数和工作向量参数令牌的编号必须从1开始并单调递增。

  • 对于给定的遗留代码工具数据结构,输入、输出、参数和功向量参数的数据类型和大小必须在不同的功能规范中相同StartFcnSpecInitializeConditionsFcnSpecOutputFcnSpec,TerminateFcnSpec

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

    • 功能:元素个数大小

    • 参数值

    • 运营商:+-*,/

    • 整数和浮点字面值

    • 括号用于分组子表达式

    例如:

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

遗留C函数规则

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

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

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

  • 的函数规范StartFcnSpecInitializeConditionsFcnSpec,或TerminateFcnSpec无法访问输入或输出参数。为StartFcnSpecInitializeConditionsFcnSpec,如果使用S-Function选项,则可以访问输出端口outputsConditionallyWritten设为真正的。使用此选项设置,生成的S-Function指定与每个输出端口关联的内存不能被覆盖,并且是全局的(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函数。此步骤假设为您的MATLAB安装设置了C编译器。调用legacy_code“编译”作为第一个参数,数据结构的名称作为第二个参数。

    legacy_code(“编译”,lct_spec);

    类似于下面的信息消息出现在MATLAB命令窗口和动态加载的可执行结果中。在32位Windows系统上,Simulink软件将该文件命名为金宝appex_sfun_doubleit.mexw32

    ###开始编译ex_sfun_doubleit mex ex_sfun_doubleit.c -Id:\work\lct\lct_demos ###完成编译ex_sfun_doubleit ###退出

为方便起见,您可以通过调用s函数在一个步骤中生成、编译和链接s函数legacy_code用字符向量“generate_for_sim”。该函数还生成一个TLC文件用于加速模拟,如果Options.useTlcWithAccel字段设置为1。

一旦生成了可动态加载的可执行文件,您或其他人就可以在模型中使用它,方法是添加一个S-Function块,指定编译后的s -函数。

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

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

legacy_code (slblock_generate, lct_spec);

该工具掩码块,以便它显示OutputFcnSpec字段。然后,您可以手动将块添加到模型中。

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

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

如果指定的模型(例如,myModel)存在,legacy_code打开模型并添加由遗留代码工具数据结构描述的掩码s函数块。如果模型不存在,则该函数用指定的名称创建一个新模型,并添加掩码s函数块。

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

如果你正在使用金宝app仿真软件加速器™模式下,您可以为遗留代码工具生成的s函数生成并强制使用TLC内联代码。要做到这一点:

  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文件ssSetOptionsSimStruct函数设置S-function选项SS_OPTION_USE_TLC_WITH_ACCELERATOR

调用遗留c++函数

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

Def = legacy_code('initialize');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;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函数

您可以部署使用遗留代码工具生成的s函数,以供其他人使用。要部署仅供模拟使用的s函数,您只需要共享编译后的可动态加载的可执行文件。

遗留代码工具示例

要查看遗留代码工具的示例,请在MATLAB命令窗口中键入:

遗留代码工具示例列在建模功能>自定义块与s功能,系统对象和遗留代码工具

遗留代码工具的限制

遗留代码工具

  • 为用C或c++编写的现有函数生成C MEX s函数。该工具不支持MATLAB或Fortr金宝appan函数的转换。

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

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

  • 总是设置S-functions标志直接引线大小。DirFeedthrough)真正的。由于这个设置和前面的限制,生成的s函数不能中断代数循环

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

  • 金宝app支持复数,但只与Simulink金宝app内置数据类型

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

  • 不支持以下S-fu金宝appnction特性:

    • 功向量,而不是一般的d功向量

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

    • 基于端口的采样时间

    • 多个基于块的采样次数

  • 不支持使用scop金宝appe(::)操作符访问c++类数据和方法。对于静态方法,你可以编写简单的预处理器宏,类似于下面的,来解决这个问题:

    CCommon::computeVectorDotProduct