主要内容

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

概述

您可以将现有的C(或c++)函数,如设备驱动程序、查找表、通用函数和接口集成到Simulink中万博1manbetx®通过使用遗留代码工具建立模型。使用规范,你提供作为MATLAB®代码中,该工具将现有函数转换为可包含在Simulink模型中的C MEX S函数。如果你使用万博1manbetx万博1manbetxSimulink编码器™要生成代码,遗留代码工具可以将C函数的适当调用插入生成的代码。有关详细信息,请参阅使用遗留代码工具将外部代码导入外部代码的调用(万博1manbetxSimulink编码器)

与使用S-Function Builder或编写S-Function相比,Legacy Code Tool更容易使用和生成嵌入式系统经常需要的优化代码(不生成包装器代码)。但是,考虑混合系统的替代方法,比如包含设备和控制器的系统,或者用C或c++以外的语言编写的系统组件。可选方法更灵活,因为它们支持更多特性和编程语言。万博1manbetx

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

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

    • s函数的名称

    • 现有C函数的规范

    • 编译所需的文件和路径

    • 生成的S函数的选项

  • 使用旧式代码作用于

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

    • 在模拟期间生成用于使用的S函数

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

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

    • 生成TLC块文件,如有必要,可以sFunction_makecfg.mrtwmakecfg.m用于代码生成的文件(万博1manbetx仿真软件编码器产品许可证要求)

笔记

在你使用之前旧式代码,确保为MATLAB安装设置了C编译器。

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

如果你有万博1manbetx仿真软件编码器产品许可,请参阅使用遗留代码工具将外部代码导入外部代码的调用(万博1manbetxSimulink编码器)有关使用旧代码工具生成代码的信息,请参见。

将C函数集成到万博1manbetx使用遗留代码工具的模型

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

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

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

    def = legacy_code('initialize')

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

    def = sfunctionname:'initializeconditionsfcnspec:''startfcnspec:''startfcnspec:''terminefcnspec:''heartfiles:{} sourcefiles:{} hostlibfiles:{} targetlibfiles:{} targetlibfiles:{} targetlibfiles:{} targetlibfiles:{} convpaths:{} libpaths:{} libpaths:{} libpaths:{} libpaths:{} libpaths:{} libpaths:{} libpaths:{} libpaths:{}Sampletime:'继承'选项:[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)';

    有关各种数据结构字段的信息,请参见旧式代码参考页。

  3. 方法从现有的C函数生成s函数源文件旧式代码函数。在MATLAB命令提示符处,输入:

    legacy_code (sfcn_cmex_generate, def);

    遗留代码工具使用def来创建名为ex_sfun_doubleit.c在当前MATLAB文件夹中。

  4. 将S-function源文件编译并链接为可动态加载的Simulink可执行文件万博1manbetx旧式代码函数。在MATLAB命令提示符处,输入:

    遗留_代码(“编译”,定义);

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

    ###开始编译ex_sfun_doubleit mex('ex_sfun_doubleit.c', 'd:\work\lct_demos\doubleIt.c', '-Id:\work\lct\lct_demos') ### #完成编译ex_sfun_doubleit ###退出

    在32位的Microsoft上®窗户®系统,生成的s函数可执行文件被命名ex_sfun_doubleit.mexw32

  5. 插入一个蒙面系统函数块转换为Simulink模万博1manbetx型。

    legacy_code (slblock_generate, def);

    旧代码工具将块配置为使用在上一步中创建的C MEX S函数。此外,该工具还屏蔽块,以便显示其值OutputFcnSpec属性(请参见旧式代码功能)。

  6. 将振幅为1的正弦波块添加到C-MEX S功能块的输入端,将示波器块添加到输出端。

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

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

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

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

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

探索外部代码

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

#包括“ex_myTypes_LCT.h”void myFcn(sigStructType*in,paramStructType*params,sigStructType*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 struct {double sig1;双sig2;sigtracttype;typedef struct {double param1;Double Param2;Double Param3;paramstructype;void myfcn(sigutructrype * in,paramstructype * params,sigurteltype * out);#万一

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

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

在命令提示下,使用函数万博1manbetxSimulink.importExternalCTypes在基本工作区中生成总线对象。

万博1manbetxSimulink.importExternalCTypes ('ex_mytypes_lct.h');

总线对象对应于塑造类型ex_myTypes_LCT.h定义。

创建执行外部代码的块

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

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.将参数的名称设置为u1,p1,日元表示输入参数、参数参数和输出参数。使用语法[1]指定每个实参是一个指针。

def.OutputFcnSpec = ['void myFcn(sigStructType u1[1], '),...' p1[1], sigStructType y1[1])'];

使用的函数旧式代码从规范中创建s函数和相应的C MEX可执行文件,def.指定的选项“为sim卡生成sim卡”为正常和加速模拟准备S函数。

legacy_code (“为sim卡生成sim卡”def);
###开始编译sfun_ex_mySrc_LCT mex('-I/tmp/Bdoc21b_1757077_160094/tpf541d20d/ex12763634'、'-c'、'-outdir'、'/tmp/Bdoc21b_1757077_160094/TP70D41139D_23c2_48bc_97f0_e7e95f91665a'、'/tmp/Bdoc21b_1757077/tpf541d20d/EX127634/ex_。mySrc已成功完成,其中包括gcc mex('sfun_ex_mySrc_LCT.c','-I/tmp/Bdoc21b_1757077_160094/tpf541d20d/ex12763634','/tmp/Bdoc21b_1757077_160094/tp70d4139d_23c2_48bc_97f0 e7e95f91665a/ex_mySrc_LCT.o')与“gcc”建筑。MEX已成功完成。#完成sfun

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

legacy_code (“slblock_generate”,def);

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

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

验证外部代码的执行

创建线束模型,以验证仿真期间外部代码的执行情况。

例如,查看模型ex_lct_结构

open_system (“ex_lct_struct”)

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

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

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

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

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

structParam = 万博1manbetxSimulink.Parameter (structParam);structParam。数据类型=“巴士:paramStructType”;

在“掩码”对话框中设置P1结构参数

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

模拟模型。范围块显示S函数块调用外部函数myFcn

open_system (“ex_lct_struct /范围”) open_system (“ex_lct_struct / Scope1”)模拟(“ex_lct_struct”)%

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

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

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

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

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

要注册旧代码工具数据结构,请执行以下操作:

  1. 使用旧式代码功能,指定“初始化”作为第一个论点。

    lct_spec = legacy_code(初始化)

    遗留代码工具的数据结构命名为lct_规格在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函数至少有一个函数规范(InitializeConditionsFcnSpec,OutputFcnSpec,startfcnspec.,TerminateFcnSpec)

    有关结构中字段的完整列表和描述,请参阅旧式代码函数参考页。

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

  1. 当前的工作文件夹

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

  3. 您指定的目录

    • 印加路径对于头文件

    • SrcPaths对于源文件

    • LibPaths用于目标库和主机库

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

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

这个InitializeConditionsFcnSpec,OutputFcnSpec,startfcnspec.,TerminateFcnSpec在遗留代码工具数据结构中定义的字段(请参阅以下描述旧式代码函数)要求符合特定语法格式的字符向量值。所需的语法格式使Legacy Code工具能够将现有C函数的返回值和参数映射到工具生成的s函数的返回值、输入、输出、参数和工作向量。

一般语法

退货规格=函数名称(参数规范)

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

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

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

退货规格

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

返回类型返回变量
返回类型 中列出的数据类型万博1manbetx支持的数据类型
返回变量 表符日元,y2,...,YN,在那里N是输出参数的总数。

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

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

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

函数名

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

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

浮动doubleIt (inVal浮动);

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

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

论证规范

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

参数类型参数标记
参数类型 中列出的数据类型万博1manbetx支持的数据类型
参数标记 以下形式之一的令牌:
  • 输入-u1,u2,...,UN,在那里N是输入参数的总数吗

  • 输出 -日元,y2,...,YN,在那里N输出参数的总数是多少

  • 参数-p1,p2,...,PN,在那里N参数参数的总数是多少

  • 工作向量(持久记忆)work1,work2,...,工作N,在那里N功矢量参数的总数是多少

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

考虑以下C函数原型:

浮动发电(浮动inlor,int指数);

要生成在每个时间步调用前面函数的S函数,请设置Legacy Code Tool数据结构字段OutputFcnSpec对下列事项:

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

使用此函数规范,旧代码工具映射以下信息。

返回值或参数 C类型的 令牌 数据类型
返回值 浮动 日元 仅有一个的
无效 浮动 u1 仅有一个的
指数 int p1 int16

如果函数需要具有多个输入和输出端口的Simulink S万博1manbetx函数块,请使用唯一编号的U令牌。对于输出端口,使用唯一编号Y令牌。这些标记在前面的参数说明表中进行了描述。例如,考虑以下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])
固定向量 函数(int y1[10])
函数(int*y1)
函数(int16 y1 [10])
固定矩阵 函数(int y₁[15])
函数(int y1[])
函数(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)
功能(无效*工作1)
函数(void * * work1)
函数(int16 work1 [1])
void函数(void*work1)
作废功能(作废**工作1)
固定向量 函数(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.bus.1. 是的 是的 是的
一系列万博1manbetxsimulink.bus.2. 是的 没有 是的
万博1manbetxSimulink.NumericType3. 是的 是的 是的
万博1manbetxSimulink.AliasType1. 是的 是的 是的
枚举1. 是的 是的 是的
定点4. 是的 是的 是的
Fi对象 N/A 是的 N/A
复数5. 是的 是的 是的
1-D阵列 是的 是的 是的
二维数组6. 是的 是的 是的
n-D阵列7. 是的 是的 是的
void * 没有 没有 是的
空虚** 没有 没有 是的
  1. 您必须提供定义总线结构的头文件,定义枚举类型,或使用与别名相同的名称定义数据类型。头文件中声明的总线结构必须与总线对象的结构相匹配(例如,元素的数量和顺序、元素的数据类型和宽度,等等)。例如,看到使用带有结构参数的遗留函数的总线

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

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

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

  4. 您必须将数据声明为万博1manbetxSimulink.NumericType对象(不支持未指定的缩放)。有关示例,请参阅万博1manbetx遗留函数中的定点信号传统功能中的固定点参数

  5. 仅限于与Simulink内置数据类型一起万博1manbetx使用。要指定复杂数据类型,请将内置数据类型括在尖括号(<>)内,并在单词前面加上前缀复杂的(例如,复杂的双> <)。例如,看到传统功能中的复杂信号

  6. MATLAB、Simul万博1manbetxink和万博1manbetx仿真软件编码器s manbetx 845产品以列主格式将多维数组数据存储为向量。如果您的外部函数代码是为行主数据编写的,请使用ConvertndarayTorowMajor中的S函数选项旧式代码

  7. 对于多维信号,可以使用大小函数用于确定信号中元素的数量。有关示例,请参见在遗留函数中实现的查找表遗留函数中的多维信号

有关更多信息,请参见Simulink支持的万博1manbetx数据类型万博1manbetx

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

产品规格旧式代码必须遵守以下规则:

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

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

  • 对于给定的遗留代码工具数据结构,输入、输出、参数和工作向量参数的数据类型和大小在函数规范中必须相同startfcnspec.,InitializeConditionsFcnSpec,OutputFcnSpec,TerminateFcnSpec

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

    • 功能:numel.,大小

    • 参数值

    • 运营商:+,-,*,/

    • 整数和浮点文本

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

    例如:

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

遗留C函数规则

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

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

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

  • 您定义的功能规范startfcnspec.,InitializeConditionsFcnSpecTerminateFcnSpec无法访问输入或输出参数。为了startfcnspec.InitializeConditionsFcnSpec,如果使用S-Function选项,则可以访问输出端口outputsConditionallyWritten被设置为真正的。通过此选项设置,生成的S函数指定与每个输出端口关联的内存不能被覆盖,并且是全局的(SS_非_可重用_和_全局)。

生成和编译S函数

为现有C函数注册遗留代码工具数据结构后,使用旧式代码函数来生成、编译和链接s函数。

  1. 根据结构中定义的信息生成C MEX S函数。调用旧式代码“sfcn\u cmex\u生成”作为第一个参数,数据结构的名称作为第二个参数。

    legacy_code (sfcn_cmex_generate, lct_spec);
  2. 编译并链接S函数。此步骤假定为MATLAB安装设置了C编译器。称呼旧式代码“编译”作为第一个参数,数据结构的名称作为第二个参数。

    legacy_code(“编译”,lct_spec);

    类似于以下内容的信息性消息出现在MATLAB命令窗口和可动态加载的可执行结果中。在32位Windows系统上,Simulink软件为文件命名万博1manbetxex_sfun_doubleit.mexw32

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

为了方便起见,您可以通过调用旧式代码使用字符向量“为sim卡生成sim卡”.该函数还生成一个TLC文件用于加速模拟,如果Options.useTlcWithAccel旧代码工具数据结构的字段设置为1。

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

生成屏蔽S函数块以调用生成的S函数

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

Legacy_code('slblock_generate',lct_spec);

该工具遮罩该块,以便显示该块的值OutputFcnSpec字段。然后您可以手动将块添加到模型中。

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

遗留_代码('slblock_generate',lct_spec',myModel');

如果指定的模型(例如,我的模型)存在,旧式代码打开模型并添加由遗留代码工具数据结构描述的隐藏的s功能块。如果模型不存在,该函数将使用指定的名称创建一个新模型,并添加掩码的S-function块。

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

如果您正在使用万博1manbetxSimulink加速器™模式下,您可以为遗留代码工具生成的s函数生成并强制使用TLC内联代码。要做到这一点:

  1. 生成TLC块文件的s函数旧式代码函数与'sfcn_tlc_generate'作为第一个参数,遗留代码工具数据结构的名称作为第二个参数。

    遗留代码(“sfcn\U tlc\U生成”,lct\U规范);

    考虑例子使用遗留代码工具将C函数集成到Simulink模型中万博1manbetx.要为示例末尾所示的模型生成TLC文件,输入以下命令:

    legacy_code (sfcn_tlc_generate, def);
  2. 强制加速模式使用TLC文件ssSetOptions西姆斯特雷特功能设置S函数选项SS_OPTION_USE_TLC_WITH_ACCELERATOR

调用遗留c++函数

要在初始化遗留代码工具数据结构后调用传统的C ++函数,请将值“C ++”分配给Options.language字段。例如,

def = letacacy_code('初始化');def.options.language ='C ++';

要验证新设置,请输入

def.Options.language

笔记

遗留代码工具可以与c++函数交互,但不能与c++对象交互。为了工作,看遗留代码工具的限制在Simuli万博1manbetxnk文档中。

处理多个注册文件

您可以在同一个文件夹中有多个注册文件,并使用单个调用为每个文件生成一个S-function旧式代码.同样,您可以使用单个调用旧式代码为了编译并链接S函数和其他函数,以生成相应的TLC块文件(如适用)。

考虑下面的示例lct_register_1.,lct_register_2.,lct_register_3.每个都创建和初始化遗留代码工具结构的字段。

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

然后,您可以使用以下呼叫顺序旧式代码为了基于三个注册文件生成文件:

遗留代码(“sfcn\U cmex\U生成”,defs);遗留_代码(“编译”,定义);遗留代码(“sfcn\U tlc\U生成”,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万博1manbetxan函数的转换。

  • 可以与C++函数接口,但不可以C++对象。解决这个限制的一种方法是使用S-函数生成器生成S函数的shell,然后从S函数调用传统的C++代码。计算输出回调函数。

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

  • 始终为设置S函数标志直接引线(直流通电)真正的.由于这个设置和前面的限制,生成的s函数不能被打破代数循环

  • 万博1manbetx仅支持连续,但在次要时间内修复,采样时间和偏移量选项

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

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

  • 不支持以下S-fu万博1manbetxnction特性:

    • 功向量,除了一般的功向量

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

    • 出口样品时间

    • 基于多块的采样时间

  • 不支持使用范围(:万博1manbetx:)运算符来访问C++类数据和方法。对于静态方法,可以编写简单的预处理器宏(类似于以下内容)来解决此问题:

    #define ccommon_computevectordotproduct ccommon :: computvectordotproduct

  • 如果函数规范包含具有属性的Simulink数据类型,则可以生成终止功能万博1manbetxHeaderFile.对于导出函数模型,terminate函数会使生成的s函数与代码生成不兼容。