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

概述

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

相比于使用S-函数生成器或写一个S-功能,传统代码工具是更容易使用,并生成优化代码(不会产生包装代码)通常由嵌入式系统必需的。然而,考虑用于混合动力系统的替代方法,例如,其包括植物和控制器,或写入比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仿真软件编码器产品许可,请参阅导入调用外部代码到生成的代码修改代码工具(金宝app编码器的Simulink)有关使用传统代码工具用于码生成的信息。

集成C函数成金宝app修改代码工具模型

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

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

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

    DEF = legacy_code( '初始化')

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

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

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

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

    def.SFunctionName =“ex_sfun_doubleit”;def.OutputFcnSpec = 'double y1 = double leit (double u1)';

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

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

    legacy_code (sfcn_cmex_generate, def);

    遗留代码工具使用中指定的信息高清要创建命名的S-function源文件ex_sfun_doubleit.c在当前的MATLAB文件夹中。

  4. 方法编译并将S-function源文件链接到可动态加载的Simulink可执行文件中金宝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位的微软上®窗户®系统,结果的s函数可执行文件被命名ex_sfun_doubleit.mexw32

  5. 插入一个蒙面功能块到Simulink模型中金宝app。

    legacy_code (slblock_generate, def);

    遗留代码工具配置为使用在先前步骤中创建的C MEX S-功能块。此外,工具的掩模的块,使得其显示的值其OutputFcnSpec属性(参见属性的说明legacy_code功能)。

  6. 将振幅为1的正弦波块添加到C-MEX S-function块的输入中,将范围块添加到输出中。

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

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

这个例子说明了如何使用旧代码的工具集成C函数其参数是指向结构的指针。

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

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

探索外部代码

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

的#include “ex_myTypes_LCT.h” 空隙myFcn(sigStructType *在,paramStructType *参数,可以sigStructType *出){OUT-> SIG1 = IN-> SIG1 * params->参数1;OUT-> SIG2 = IN-> SIG2 * params->参数2 + params->参数3;}

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

这个自定义页眉代码复制到指定的文件ex_myTypes_LCT.h在当前文件夹中。

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

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

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

在命令提示符处,使用该函数金宝appSimulink.importExternalCTypes以在基工作区总线对象。

金宝appSimulink.importExternalCTypes ('ex_myTypes_LCT.h');

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

创建块执行外部代码

创建一个结构变量,高清,以存储调用外部代码的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,日元表示输入参数、参数参数和输出参数。使用语法[1]指定每个参数都是一个指针。

def.OutputFcnSpec = ['void myFcn(sigStructType u1[1], ')'paramStructType P1 [1],sigStructType Y1 [1])']。

使用的函数legacy_code要从规范中创建s函数和相应的C MEX可执行文件,高清。指定的选项“generate_for_sim”以制备用于正常和加速仿真的S函数。

legacy_code (“generate_for_sim”,DEF);
###开始编译sfun_ex_mySrc_LCT MEX( ' - 我的/ tmp / Bdoc20a_1326390_37563 / tpf4655909 / ex12763634', '-c', '-outdir', '/ tmp目录/ Bdoc20a_1326390_37563 / tp671d9063_cbd5_4336_bb64_60d2089e45fe',“/ tmp目录/ Bdoc20a_1326390_37563 / tpf4655909 / ex12763634 /ex_mySrc_LCT.c')与建设‘海湾合作委员会’。MEX成功完成。MEX( 'sfun_ex_mySrc_LCT.c', '-I / TMP / Bdoc20a_1326390_37563 / tpf4655909 / ex12763634', '/tmp/Bdoc20a_1326390_37563/tp671d9063_cbd5_4336_bb64_60d2089e45fe/ex_mySrc_LCT.o')建筑与 'GCC'。/tmp/Bdoc20a_1326390_37563/tpf4655909/ex12763634/sfun_ex_mySrc_LCT.c: In function ‘mdlOutputs’: /tmp/Bdoc20a_1326390_37563/tpf4655909/ex12763634/sfun_ex_mySrc_LCT.c:417:9: warning: implicit declaration of function ‘myFcn’ [-Wimplicit-function-declaration] myFcn(__u1BUS, __p1BUS, __y1BUS); ^~~~~ MEX completed successfully. ### Finish Compiling sfun_ex_mySrc_LCT ### Exit

创建一个模拟过程中调用S-功能的屏蔽S-功能块。

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-功能块接受通过掩模对话框的参数。创建一个MATLAB结构structParam用作参数的值。

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

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

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

在蒙版对话框中,设置P1structParam

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

模拟模型。作用域块表明S-Function块调用外部函数myFcn

open_system(“ex_lct_struct /范围”)open_system (“ex_lct_struct / Scope1”)SIM(“ex_lct_struct”
ans =仿金宝app真软件。SimulationOutput: tout: [51x1 double] SimulationMetadata: [1x1 金宝appSimulink]SimulationMetadata] ErrorMessage: [0x0 char]

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

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

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

  • 在当前工作文件夹中生成并放置一个或多个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函数的源文件和头文件(源文件HeaderFiles

    • 一种在S-函数名(SFunctionName

    • S-function至少有一个功能规格(InitializeConditionsFcnSpecOutputFcnSpecStartFcnSpecTerminateFcnSpec

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

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

  1. 当前工作目录

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

  3. 你指定的目录

    • IncPaths的头文件

    • SrcPaths的源文件

    • LibPaths用于目标库和主机库

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

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

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

一般的语法

return-spec=函数名argument-spec

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

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

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

返回规格

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

返回式返回变量
返回式 一种数据类型列在金宝app支持的数据类型
返回变量 表格的标记日元y2ÿñ,在那里ñ是输出参数的总数。

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

下表显示了一个整数返回值有效的功能规范的语法。使用下表以确定你应该为你的C函数原型使用的语法。

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

功能名称

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

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

浮doubleIt(浮动inVal);

在这种情况下,在遗留代码的工具功能规格功能名称必须是doubleIt

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

参数规格

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

参数类型argument-token
参数类型 一种数据类型列在金宝app支持的数据类型
argument-token 下列形式之一的令牌:
  • 输入- - -u1u2üñ,在那里ñ是输入参数的总数

  • 输出 -日元y2ÿñ,在那里ñ是输出参数的总数

  • 参数- - - - - -p1p2pñ,在那里ñ是参数参数的总数

  • 工作向量(持久存储) -work1work2工作ñ,在那里ñ是工作矢量参数的总数

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

考虑以下C函数原型:

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

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

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

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

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

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

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

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

'无效MYFUNC(双Y2 [1],双U2,U3双,双U1,双Y1 [1])'

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

下表显示了integer类型参数的有效函数规范语法。使用该表来识别并调整应该用于C函数原型的语法。

参数类型 C函数原型 遗留代码工具功能规范
输入参数
没有参数 函数(空白) 函数(空白)
按值纯量传递 函数(int三机一体) 函数(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])
固定向量 函数(中间体Y1 [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])
固定向量 函数(中间体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)
功能(无效* 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支持工作向量?
数据类型支持的Simu金宝applink金宝app(有例外字符串 是的 是的 是的
金宝appSimulink.Bus1 是的 是的 是的
的数组金宝appSimulink.Bus2 是的 没有 是的
金宝appSimulink.NumericType3 是的 是的 是的
金宝appSimulink.AliasType1 是的 是的 是的
枚举1 是的 是的 是的
固定点4 是的 是的 是的
网络对象 N/A 是的 N/A
复数 是的 是的 是的
1-d阵列 是的 是的 是的
二维数组6 是的 是的 是的
正d阵列7 是的 是的 是的
void * 没有 没有 是的
void * * 没有 没有 是的
  1. 您必须提供定义总线结构的头文件,定义枚举型,或具有相同名称的别名定义的数据类型。在头文件中声明的总线的结构必须总线对象的结构相匹配(例如,数量和元素,数据类型和元素的宽度的顺序,等等)。例如,参见sldemo_lct_bus

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

  2. 总线元件可以是复杂的,但只使用Simulink内置的数据类型。金宝app还支持阵列的任何级别的嵌套。金宝app

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

  4. 您必须将数据声明为金宝appSimulink.NumericType对象(未指定的缩放不支持)。金宝app举例来说,看到sldemo_lct_fixpt_signalssldemo_lct_fixpt_params

  5. 限于使用Simulink使用内置的数据类金宝app型。要指定复合数据类型,包围内置尖括号中的数据类型(<>)和预先设置字复杂(例如,复杂的双> <)。例如,参见sldemo_lct_cplxgain

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

  7. 对于多维信号,可以使用尺寸函数的作用是确定信号中的元素数量。举例来说,看到sldemo_lct_lutsldemo_lct_ndarray

欲了解更多信息,请参阅数据类型支持的Simu金宝applink金宝app

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

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

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

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

  • 对于给定的遗留代码工具数据结构,输入、输出、参数和工作向量参数的数据类型和大小必须在不同的函数规范中相同StartFcnSpecInitializeConditionsFcnSpecOutputFcnSpec,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函数,该函数必须遵守以下规则:

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

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

  • 功能规格,可以定义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-功能。此步骤假设一个C编译器为您的MATLAB安装。呼叫legacy_code“编译”作为第一个参数,数据结构的名称作为第二个参数。

    legacy_code(“编译”,lct_spec);

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

    ###开始编译ex_sfun_doubleit MEX ex_sfun_doubleit.c -Id:\工作\ LCT \ lct_demos ###完成编译ex_sfun_doubleit ###退出

为方便起见,您可以生成,编译,并通过调用一个单一的步骤,让S-功能legacy_code与特征向量“generate_for_sim”。该函数还生成用于加速模拟的TLC文件,如果Options.useTlcWithAccel遗留代码工具的数据结构的字段被设置为1。

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

为调用生成的s函数生成一个屏蔽的s函数块

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

legacy_code (slblock_generate, lct_spec);

工具对块进行掩码,以便显示属性的值OutputFcnSpec领域。然后,您可以手动块添加到模型中。

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

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

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

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

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

  1. 产生TLC块文件通过调用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-功能选项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-function,调用一个tolegacy_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, 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 -函数,只需共享已编译的可动态加载的可执行文件。

遗留代码工具示例

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

遗留代码工具的例子中列出建模功能>与定制模块S-功能,系统对象和遗留代码工具

遗留代码工具的限制

遗留代码的工具

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

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

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

  • 始终将针对S-功能标志直接馈通sizes.DirFeedthrough)真正的。由于这个设置和前面的限制,生成的s函数不能中断代数循环

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

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

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

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

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

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

    • 基于端口的采样时间

    • 多个基于块的样本时间

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

    #定义CCommon_computeVectorDotProduct CCommon :: computeVectorDotProduct

  • 可以生成终止功能,当你没有指定一个如果函数规范包括具有属性的Simulink数据类型金宝appHeaderFile。对于导出函数模型,这个terminate函数会使生成的s函数与代码生成不兼容。