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

概观

可以集成现有的C(或C ++)的功能,如设备驱动程序,查找表,和一般的功能和接口,到Simulink万博1manbetx®通过使用旧代码的工具模型。使用规范,您所提供的MATLAB®代码,现有的功能集成到C MEX S-功能的工具,可以将您可以包括Simulink模型。万博1manbetx如果您使用万博1manbetxSimulink的编码器™生成的代码,修改代码工具可以插入到你的C函数一个合适的呼叫到生成的代码。有关详细信息,请参阅导入调用外部代码到生成的代码修改代码工具(万博1manbetx仿真软件编码器)。

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

为了与旧代码的工具交互,

  • 使用传统代码的工具数据结构来指定

    • 一种在S-函数名

    • 规格为现有的C函数

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

    • 对于所生成的S-功能选项

  • 使用legacy_code功能

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

    • 生成一个s函数,在模拟过程中使用

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

    • 生成一个屏蔽的S-function块来调用生成的S-function

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

注意

在可以使用legacy_code,请确保为MATLAB安装设置了C编译器。

下图演示了使用遗留代码工具的一般过程。集成C函数与遗留代码工具Simulink模型万博1manbetx提供了一个使用传统代码工具来将现有的C函数为C MEX S函数的例子。

如果你有一个万博1manbetxSimulink的编码器产品许可,请参阅导入调用外部代码到生成的代码修改代码工具(万博1manbetx编码器的Simulink)有关使用传统代码工具用于码生成的信息。

集成C函数成万博1manbetx修改代码工具模型

这个例子演示了如何将现有的C函数集成到使用传统代码的工具Simulink模型。万博1manbetx

假设您有一个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 = '双Y1 = doubleIt(双U1)';

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

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

    legacy_code( 'sfcn_cmex_generate',DEF);

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

  4. 编译和S-函数源文件链接到一个动态可加载的可执行用于使用Simulink中万博1manbetxlegacy_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模型。万博1manbetx

    legacy_code (slblock_generate, def);

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

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

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

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

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

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

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

探索外部代码

此自定义源代码复制到指定的文件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在当前文件夹中。

的#ifndef _MY_TYPES_H_的#define _MY_TYPES_H_ typedef结构{双SIG1;双SIG2;} sigStructType;typedef结构{双参数1;双参数2;双参数3;} paramStructType;#万一

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

在Simulink中创建总线对象来表示结构类型万博1manbetx

在命令提示符下,使用该函数万博1manbetxSimulink.importExternalCTypes以在基工作区总线对象。

万博1manbetxSimulink.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,Y1表示输入参数、参数参数和输出参数。使用语法[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-功能块调用S函数sfun_ex_mySrc_LCT您创建。该块的输出进入一个总线选择块,其提取所述信号元件sig1sig2

在S-功能块接受通过掩模对话框的参数。创建一个MATLAB结构structParam用作参数的值。

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

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

structParam = 万博1manbetxSimulink.Parameter(structParam);structParam.DataType =“巴士: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 =仿万博1manbetx真软件。SimulationOutput: tout: [51x1 double] SimulationMetadata: [1x1 万博1manbetxSimulink]SimulationMetadata] ErrorMessage: [0x0 char]

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

第一步使用传统代码工具是注册一个或多个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函数头文件(源文件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 = '双Y1 = doubleIt(双U1)';

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

返回规格

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

返回式返回变量
返回式 一种数据类型列在万博1manbetx支持的数据类型
返回变量 表格标记Y1Y2ÿñ,其中ñ是输出参数的总数。

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

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

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

功能名称

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

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

浮doubleIt(浮动inVal);

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

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

参数规格

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

参数类型参数令牌
参数类型 一种数据类型列在万博1manbetx支持的数据类型
参数令牌 下列形式之一的令牌:
  • 输入- - -u1u2üñ,其中ñ输入参数的总数是多少

  • 输出 -Y1Y2ÿñ,其中ñ是输出参数的总数

  • 参数- - - - - -p1p2pñ,其中ñ是的参数的参数的总数

  • 工作向量(持久存储) -work1work2工作ñ,其中ñ是的工作参数向量的总数

如果函数没有参数,则可以省略该参数指定或指定为无效

考虑下面的C函数原型:

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

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

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

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

返回值或参数 C类型的 对令牌 的数据类型
返回值 浮动 Y1
inVal 浮动 u1
指数 INT p1 INT16

如果您的功能需要有多个输入和输出端口Simulink的S万博1manbetx-功能块,使用函数的参数映射到输入口的唯一编号ü令牌。对于输出端口,使用唯一编号ÿ令牌。这些令牌在前面的参数规格表中描述。例如,考虑以下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]映射到第二个输出。有关将函数原型映射到多个输入和输出端口的另一个示例,请参见使用公交传统功能具有结构参数

类型整数的参数如下表所示有效功能规范的语法。使用表格识别并适应你应该为你的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])
固定矩阵 函数(中间体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])
可变矢量 函数(中间体P1 [])
函数(int * p1)
函数(INT16 P1 [])
固定矩阵 函数(int p1 [15])
函数(中间体P1 [])
函数(int * p1)
函数(int16 p1 [3] [5])
可变矩阵 函数(中间体P1 [])
函数(int * p1)
函数(int16 p1 [] [])
工作向量参数
标路过值 函数(int work1) 函数(INT16 WORK1)
标量指针 函数(INT * WORK1)
功能(无效* WORK1)
函数(void * * work1)
函数(int16 work1 [1])
无效的函数(void * work1)
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支持的工作向量?
数据类型支持的Simu万博1manbetxlink万博1manbetx(有例外
万博1manbetxSimulink.Bus1
数组万博1manbetxSimulink.Bus2 没有
万博1manbetxSimulink.NumericType3
万博1manbetxSimulink.AliasType1
枚举1
固定点4
网络对象 N / A N / A
复数
1-d阵列
二维数组6
正d阵列7
无效* 没有 没有
void * * 没有 没有
  1. 您必须提供定义总线结构的头文件,定义了枚举型,或具有相同名称的别名定义的数据类型。在头文件中声明的总线的结构必须总线对象的结构相匹配(例如,数量和元素,数据类型和元素的宽度的顺序,等等)。例如,参见sldemo_lct_bus

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

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

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

  4. 您必须声明的数据作为万博1manbetxSimulink.NumericType对象(未指定的缩放不支持)。万博1manbetx举例来说,看到sldemo_lct_fixpt_signalssldemo_lct_fixpt_params

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

  6. 在MATLAB,Simu万博1manbetxlink和万博1manbetxSimulink的编码器s manbetx 845产品以列主格式存储多维数组数据作为向量。如果您的外部函数代码是为行主数据编写的,请使用convertNDArrayToRowMajor功能选项legacy_code

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

欲了解更多信息,请参阅数据类型支持的Simu万博1manbetxlink万博1manbetx

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

规范的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-功能选项访问输出端口outputsConditionallyWritten设定为真正的。带有此选项设置,所产生的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(“编译”,lct_spec);

    类似于下面的信息消息将出现在MATLAB命令窗口和可动态加载的可执行结果中。在32位Windows系统上,Simulink软件会对文件进行命万博1manbetx名ex_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-功能块。如果模型不存在,该函数创建一个具有指定名称的新模式,并增加了屏蔽S-功能块。

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

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

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

    legacy_code( 'sfcn_tlc_generate',lct_spec);

    考虑的例子集成C函数与遗留代码工具Simulink模型万博1manbetx。要为示例末尾所示的模型生成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万博1manbetxnk文档。

处理多个注册文件

您可以在同一个文件夹中有多个注册文件,并为每个文件生成一个S-function,只需调用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函数,只需共享已编译的可动态加载的可执行文件。

遗留代码工具示例

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

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

遗留代码工具的限制

遗留代码的工具

  • 生成C MEX S-功能为现有用C或C ++函数。该工具不支持的MATLAB或Fort万博1manbetxran语言功能的转变。

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

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

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

  • 万博1manbetx只支持连续的,而是固定在较小的时间步长,采样时间和偏移选项。

  • 万博1manbetx支持复数,但仅限于Simulink万博1manbetx内置数据类型

  • 不支持使用函数指针万博1manbetx作为传统功能的输出被调用。

  • 不支持下面的S-功万博1manbetx能特点:

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

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

    • 基于端口的采样时间

    • 多个基于块的样本时间

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

    #定义CCommon_computeVectorDotProduct CCommon :: computeVectorDotProduct

  • 可以生成终止功能,当你没有指定一个如果函数规范包括具有属性的Simulink数据类型万博1manbetxHeaderFile。对于导出函数模型,该终止功能可以使代码生成生成的S-功能不兼容。