文档

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

概观

可以集成现有的C(或C ++)的功能,如设备驱动程序,查找表,和一般的功能和接口,到Simulink万博1manbetx®通过使用遗留代码工具进行建模。使用您作为MATLAB提供的规范®该工具将现有函数转换为可以包含在Simulink模型中的cmex - s函数。万博1manbetx如果你使用万博1manbetx仿真软件编码器™为了生成代码,遗留代码工具可以将对C函数的适当调用插入到生成的代码中。有关详细信息,请参见使用遗留代码工具将对外部代码的调用导入到生成的代码中(万博1manbetx仿真软件编码器)。

与使用S-Function构建器或编写S-Function相比,遗留代码工具更容易使用并生成嵌入式系统通常需要的优化代码(不生成包装器代码)。然而,考虑混合系统的替代方法,例如一个包括一个装置和控制器的系统,或者一个用C或c++以外的语言编写的系统组件。替代方法更加灵活,因为它们支持更多的特性和编程语言。万博1manbetx

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

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

    • 一种在S-函数名

    • 现有C函数的规范

    • 编译所需的文件和路径

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

  • 使用legacy_code功能

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

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

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

    • 生成一个屏蔽s函数块,用于调用生成的s函数

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

注意

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

下图演示了使用遗留代码工具的一般过程。使用遗留代码工具将C函数集成到Simulink模型中万博1manbetx提供一个使用遗留代码工具将现有的C函数转换为C MEX s -函数的示例。

如果你有万博1manbetxSimulink的编码器产品许可,请参阅使用遗留代码工具将对外部代码的调用导入到生成的代码中获万博1manbetx取有关使用遗留代码工具进行代码生成的信息。

将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: 'inherited' Options: [1x1 struct]
  2. 为遗留代码工具数据结构中的字段指定适当的值,以标识现有C函数的属性。例如,通过在MATLAB命令提示符处输入以下命令来指定C函数的源文件和头文件:

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

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

    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:\work\lct\lct_demo ')完成编译ex_sfun_doubleit退出

    在32位的微软上®窗户®系统,生成的S-function可执行文件被命名ex_sfun_doubleit.mexw32

  5. 插入一个蒙面功能块进入Simulink模型万博1manbetx。

    legacy_code (slblock_generate, def);

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

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

    运行仿真。C-MEX s函数块返回其浮点输入乘以2的值。它的行为和C函数一样doubleIt

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

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

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

有关总线信号的基本信息,请参阅公共汽车。有关参数结构的基本信息,请参见组织相关块参数定义的结构。若要创建总线对象,请参见创建总线编辑器总线对象

探索外部代码

此自定义源代码复制到指定的文件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中表示结构类型的总线对象万博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], '' parstructtype 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('-I/tmp/Bdoc18a_827493_152835/ ex12763634'、'-c'、'-outdir'、'/tmp/Bdoc18a_827493_152835/tpc172c2f5_ccdd_4953_ba0c_05df25276b22'、'/tmp/Bdoc18a_827493_152835/tpb14e758c/ex12763634/ ex_mysrc_lcmt .c')构建。墨西哥人成功完成。墨西哥人(“sfun_ex_mySrc_LCT。c', '-I/tmp/Bdoc18a_827493_152835/tpb14e758c/ex12763634', '/tmp/Bdoc18a_827493_152835/tpc172c2f5_ccdd_4953_ba0c_05df25276b22/ ex_mysrc_lclc. o')用'gcc'构建。/ tmp / Bdoc18a_827493_152835 tpb14e758c / ex12763634 / sfun_ex_mySrc_LCT。c:在函数mdlOutputs中:/tmp/Bdoc18a_827493_152835/tpb14e758c/ex12763634/sfun_ex_mySrc_LCT。c:419:9:警告:函数' myFcn '的隐式声明[- wimplicit -function-声明]MEX成功完成。完成编译sfun_ex_mySrc_LCT ##退出

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

legacy_code (“slblock_generate”def);

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

要在模型中使用s函数块,请创建一个类型的总线信号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”;

在mask对话框中,设置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”

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

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

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

返回规格

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

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

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

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

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

函数名

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

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

浮动doubleIt (inVal浮动);

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

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

论证规范

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

参数类型argument-token
参数类型 中列出的数据类型万博1manbetx支持的数据类型
argument-token 请出示下列其中一份表格:
  • 输入- - -u1u2üñ,其中ñ输入参数的总数是多少

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

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

  • 工作向量(持久内存)-work1work2工作ñ,其中ñ功矢量参数的总数是多少

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

考虑下面的C函数原型:

浮点数的幂;

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

'单个y1 = powerIt(单个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]映射到第二个输出。有关将函数原型映射到多个输入和输出端口的另一个示例,请参见使用具有结构参数的遗留函数的总线

下表显示了integer类型参数的有效函数规范语法。使用该表来识别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])
固定向量 函数(中间体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])
固定向量 函数(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)
功能(无效* 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])

万博1manbetx支持的数据类型

数据类型 万博1manbetx支持的输入和输出? 万博1manbetx支持参数? 万博1manbetx支持工作矢量?
Simulink支持的万博1manbetx数据类型万博1manbetx 是的 是的 是的
万博1manbetxSimulink.Bus1 是的 是的 是的
的数组万博1manbetxSimulink.Bus2 是的 没有 是的
万博1manbetxSimulink.NumericType3 是的 是的 是的
万博1manbetxSimulink.AliasType1 是的 是的 是的
枚举1 是的 是的 是的
固定点4 是的 是的 是的
Fi对象 N/A 是的 N/A
复数 是的 是的 是的
一维数组 是的 是的 是的
二维数组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产品将二维矩阵数据以列为主的格式存储为向量。如果您的外部函数代码是为行主数据编写的,那么在MATLAB环境中转置矩阵数据。

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

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

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

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

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

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

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

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

    • 功能:元素个数尺寸

    • 参数值

    • 运营商:+-*,/

    • 整数和浮点文字

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

    例如:

    2 . outputfcnspec = foo4(int8 p1[], int8 u1[], double y1[numel(u1)+2][numel(u1)+3],…int32(元素个数(p1) +元素个数(u1)) * 2 +大小(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函数。这个步骤假设为您的MATLAB安装设置了C编译器。呼叫legacy_code“编译”作为第一个参数和数据结构作为第二个参数的名称。

    legacy_code(“编译”,lct_spec);

    类似于下面的信息消息出现在MATLAB命令窗口和一个动态加载的可执行结果。在32位Windows系统上,Simulink软件会将该文件命名万博1manbetxex_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函数块

您可以选择使用遗留代码工具来生成一个被配置为调用生成的C MEX s -函数的屏蔽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-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万博1manbetxnk文档中。

处理多个注册文件

您可以在同一个文件夹中有多个注册文件,并通过一个调用为每个文件生成一个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;def = [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 MEX S-功能为现有用C或C ++函数。该工具不支持的MATLAB或Fort万博1manbetxran语言功能的转变。

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

  • 不支持模拟连续或离万博1manbetx散状态。这将阻止您使用mdlUpdatemdlDerivatives回调函数。如果您的应用程序需要这种支持,请参阅万博1manbetx使用S-Function构建器合并遗留代码

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

  • 万博1manbetx只支持连续的,但在小时间步长中固定的,采样时间和偏移选择。

  • 万博1manbetx支持复数,但仅使用Simulink万博1manbetx内置的数据类型

  • 不支持使用函数指针万博1manbetx作为被调用的遗留函数的输出。

  • 不支持以下s -函万博1manbetx数特性:

    • 工作向量,而不是一般的DWork向量

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

    • 出口样品时间

    • 基于多个块的采样时间

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

    #定义CCommon_computeVectorDotProduct CCommon:: computeVectorDotProduct

这个话题有用吗?