您可以将现有的C(或C++)函数(如设备驱动程序、查找表以及通用函数和接口)集成到Simulink中金宝app®通过使用旧代码的工具模型。使用规范,您所提供的MATLAB®代码时,该工具将现有函数转换为可以包含在Simulink模型中的C MEX s -函数。金宝app如果你使用金宝app仿真软件编码器™为了生成代码,Legacy code Tool可以在生成的代码中插入对C函数的适当调用。有关详细信息,请参见使用遗留代码工具将外部代码调用导入生成的代码中(金宝app仿真软件编码器).
相比于使用S-函数生成器或写一个S-功能,传统代码工具是更容易使用,并生成优化代码(不会产生包装代码)通常由嵌入式系统必需的。然而,考虑用于混合动力系统的替代方法,例如,其包括植物和控制器,或写入比C或C以外的其他语言++系统部件的系统。替代方法是,他们支持更多的功能和编程语言更加灵活。金宝app
要与遗留代码工具交互,您需要
使用遗留代码工具数据结构来指定
S函数的名称
现有C函数的规范
编译所需的文件和路径
生成的S函数的选项
使用legacy_code
功能
初始化给定C函数的遗留代码工具数据结构
生成一个s函数用于模拟
编译并将生成的s函数链接到一个可动态加载的可执行文件中
生成一个掩码s函数块用于调用生成的s函数
生成一个TLC块文件,如果需要,生成sFunction
_makecfg.m.
或rtwmakecfg.m
用于生成代码的文件(金宝appSimulink编码器(需要产品许可证)
笔记
在使用之前legacy_code
,确保为您的MATLAB安装设置了一个C编译器。
下图说明了使用遗留代码工具的一般过程。集成C函数与遗留代码工具Simulink模型金宝app提供了一个使用遗留代码工具将现有C函数转换为C MEX s函数的示例。
如果你有一个金宝appSimulink编码器产品许可,请参阅使用遗留代码工具将外部代码调用导入生成的代码中(金宝app仿真软件编码器)获取关于使用遗留代码工具生成代码的信息。
此示例演示如何使用遗留代码工具将现有的C函数集成到Simulink模型中。金宝app
假设您有一个C函数,输出其浮点输入值乘以2。函数定义在一个名为doubleIt.c
,它的声明存在于名为doubleIt.h
.
初始化一个MATLAB结构体def
使用表示旧代码工具属性的字段legacy_code
函数。
def = legacy_code(初始化)
遗留代码工具的数据结构命名为def
显示其在MATLAB命令窗口字段,如下所示:
def = SFunctionName: " InitializeConditionsFcnSpec: " OutputFcnSpec: " StartFcnSpec: " TerminateFcnSpec: " HeaderFiles: {} SourceFiles: {} HostLibFiles: {} TargetLibFiles: {} IncPaths: {} SrcPaths: {} LibPaths: {} SampleTime: 'inherited' Options: [1x1 struct]
为Legacy Code Tool数据结构中的字段指定适当的值,以标识现有C函数的属性。例如,通过在MATLAB命令提示符中输入以下命令来指定C函数源和头文件名:
def.sourcefiles = {'doubleit.c'};def.headerfiles = {'doubleit.h'};
您还必须指定关于遗留代码工具从C代码生成的s -函数的信息。例如,为s -函数及其输出函数声明指定一个名称,输入:
def.SFunctionName='ex_sfun_doubleit';def.outputfcsnspec='double y1=doubleit(double u1)';
有关各种数据结构的字段的信息,请参阅legacy_code
参考页面。
通过使用从所述现有的C功能的S-函数源文件legacy_code
函数。在MATLAB命令提示符处,输入:
遗留_代码('sfcn_cmex_generate',def);
旧代码工具使用中指定的信息def
来创建名为ex_sfun_doubleit.c
在当前MATLAB文件夹中。
使用金宝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位的Microsoft上®窗户®系统,生成的s函数可执行文件被命名ex_sfun_doubleit.mexw32.
.
插入一个蒙面功能块到Simulink模型中金宝app。
legacy_code (slblock_generate, def);
遗留代码工具配置块以使用上一步中创建的C MEX S函数。此外,该工具掩盖了块,使其显示其值OutputFcnSpec
属性的描述(请参阅legacy_code
功能)。
在C-MEX s -函数块的输入处添加一个振幅为1的正弦波块,在输出处添加一个Scope块。
运行仿真。C-MEX S-Function块返回其浮点输入值乘以2。它的行为类似于C函数doubleIt
.
此示例显示如何使用遗留代码工具集成C函数,其参数指向结构的指针。
在Si金宝appmulink®中,创建金宝app仿真软件。公共汽车
对象来表示的结构类型。使用模型中的总线信号,以表示结构化的信号和状态。在工作空间中或在块参数创建对话框MATLAB结构来表示参数的结构。
有关总线信号的基本信息,请参阅虚拟总线.参数结构的基本信息请参见在结构中组织相关块参数定义.要创建总线对象,见创建和指定Simulink。金宝app总线对象.
探索外部代码
将此自定义源代码复制到名为的文件中ex_mySrc_LCT.c
在当前文件夹中。
#include“ex_mytypes_lct.h”void myfcn(sigtracttype * in,paramstrugtype * params,sigutructrype * 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;} sigStructType;Typedef struct {double param1;双param2;双param3;} paramStructType;void myFcn(sigStructType *in, paramStructType *params, sigStructType *out);# endif
文件定义了信号和参数结构类型的myfcn.
使用。
在Simulink中创建表示结构类型的总线对象金宝app
在命令提示符处,使用该函数金宝appSimulink.importExternalCTypes
在基础工作区中生成总线对象。
金宝appSimulink.importExternalCTypes (“ex_myTypes_LCT.h”);
总线对象对应于结构体
类型ex_myTypes_LCT.h
定义了。
创建块执行外部代码
创建一个结构变量,def
,以存储调用外部代码的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.
.将参数的名称设置为u1
那p1
,y1
表示输入参数、参数参数和输出参数。使用语法[1]
指定每个实参是一个指针。
def.OutputFcnSpec=['void myFcn(sigStructType u1[1], ')那...'paramStructType P1 [1],sigStructType Y1 [1])'];
使用的函数legacy_code
要根据规范创建S函数和相应的C MEX可执行文件,def
.指定的选项“generate_for_sim”
准备正常和加速模拟的S函数。
旧式代码(“generate_for_sim”,DEF);
###开始编译sfun_ex_mySrc_LCT MEX( ' - 我的/ tmp / Bdoc21b_1757077_160094 / tpf541d20d / ex12763634', '-c', '-outdir', '/ tmp目录/ Bdoc21b_1757077_160094 / tp70d4139d_23c2_48bc_97f0_e7e95f91665a',“/ tmp目录/ Bdoc21b_1757077_160094 / tpf541d20d / ex12763634 /ex_mysrc_lct.c')建立'gcc'。MEX成功完成。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_ex_mysrc_lct ###退出
创建一个屏蔽的S-Function块,在模拟过程中调用S-Function。
旧式代码('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
你创建的。块的输出进入总线选择器块,它提取信号元素sig1
和sig2
.
S函数块通过蒙版对话框接受参数。创建MATLAB结构structParam
用作参数的值。
structParam =结构;structParam。P.aram1 = 15; structParam.param2 = 20; structParam.param3 = 5;
可选地,使用一个金宝app仿真软件。参数
对象包含的结构。如果使用一个参数对象,则可以通过使用总线对象设置的结构的数据类型paramStructType
.
structParam=Si金宝appmulink.Parameter(structParam);structParam.DataType=“巴士:paramStructType”;
在“掩码”对话框中设置P1来structParam
.
set_param('ex_lct_struct / sfun_ex_mySrc_LCT'那“SParameter1”那“structParam”)
模拟模型。Scope块表明S-Function块调用外部函数myfcn.
.
open_system(“ex_lct_struct /范围”)开放式系统(“ex_lct_结构/范围1”)sim(“ex_lct_struct”)%
使用遗留代码工具的第一步是使用表示现有C代码和生成的S函数属性的字段注册一个或多个MATLAB结构。注册过程是灵活的。您可以选择设置资源并以多种方式启动注册,包括
将所有需要的头文件和源文件在当前工作文件夹或在分层文件夹结构
在当前工作文件夹中生成并放置一个或多个S函数
在同一个文件夹中有一个或多个注册文件
要注册遗留代码工具的数据结构:
使用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的结构]
为应用于现有C函数和打算生成的s函数的数据结构字段(属性)定义值。至少,您必须指定
现有C函数的源文件和头文件(源文件
和HeaderFiles
)
一种在S-函数名(SFunctionName
)
s -功能的至少一个功能规范(InitializeConditionsFcnSpec
那OutputFcnSpec
那StartFcnSpec
那TerminateFcnSpec
)
有关结构中字段的完整列表和描述,请参见legacy_code
功能参考页面。
如果您定义了指定编译资源的字段并指定了相对路径,那么Legacy Code Tool将按照以下顺序搜索与以下目录相关的资源:
当前工作目录
C-MEX S-function文件夹,如果与当前工作文件夹不同
你指定的目录
进入
的头文件
SrcPaths
的源文件
libpaths.
用于目标库和主机库
在MATLAB搜索路径上的目录,不包括工具箱目录
这InitializeConditionsFcnSpec
那OutputFcnSpec
那StartFcnSpec
,TerminateFcnSpec
字段定义在遗留代码工具数据结构中(请参阅legacy_code
功能)要求人物矢量值即坚持一个特定的语法格式。所需的句法格式使遗留代码工具到一个现有的C函数的返回值和参数映射到的返回值,输入,输出,参数和工作在S-功能,该工具产生的向量。
一般的语法
return-spec=函数名(argument-spec)
例如,下面的字符向量指定了一个名为doubleIt
与回报规范双y₁
和输入参数规范双u1
.
def.OutputFcnSpec = '双Y1 = doubleIt(双U1)';
有关声明函数规范的更多细节,请参见
返回规范定义了现有C函数返回值的数据类型和变量名。
返回类型返回变量
|
一种数据类型列在金宝app支持的数据类型. |
|
形式标记y1 那y2 那... 那y N哪里N是输出参数的总数。 |
如果函数不返回一个值,你可以省略返回规范或将其指定为无效
.
下表显示了整数返回值的有效功能规范语法。使用表格标识您应该为C函数原型使用的语法。
返回类型 | C函数原型 | 遗留代码工具功能规范 |
---|---|---|
没有返回值 | 无效myfunction的(...) |
无效myfunction的(...) |
标值 | int=myfunction(…) |
y1 = myfunction(…) |
指定的函数名必须与现有的C函数名相同。
例如,考虑以下C函数原型:
浮doubleIt(浮动inVal);
在这种情况下,旧代码工具函数规范中的函数名必须为doubleIt
.
不应指定C宏的名称。如果必须指定,请设置字段Options.isMacro
来真正的
在case表达式折叠是启用的。
实参规范定义了一个或多个数据类型和令牌对,它们表示现有C函数的输入、输出、参数和工作向量实参。函数的输入和输出参数映射到阻塞的输入和输出端口,参数映射到工作区参数。
参数类型argument-token
|
一种数据类型列在金宝app支持的数据类型. |
|
下列形式之一的令牌:
|
如果函数没有参数,可以省略参数规范或将其指定为无效
.
考虑下面的C函数原型:
float powerIt(float inVal, int exponent);
以产生S-函数在每个时间步骤调用前述功能,设置传统代码工具的数据结构字段OutputFcnSpec
如下:
'single y1 = powerIt(single u1, int16 p1)'
使用此功能规范,遗留代码工具映射以下信息。
返回值或参数 | C类型的 | 对令牌 | 的数据类型 |
---|---|---|---|
返回值 | 漂浮 |
y1 |
单 |
inVal |
漂浮 |
u1 |
单 |
指数 |
int |
p1 |
INT16 |
如果您的函数需要具有多个输入和输出端口的Simulink金宝app S函数块,请使用唯一编号的映射到输入端口的函数参数你
令牌。对于输出端口,使用唯一编号y
令牌。这些参数在前面的参数规范表中描述。例如,考虑下面的C函数原型:
Void myfunc(double *y2, double u2, double u3, double u1, double *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 y1 [10]) 或函数(int * y1) |
函数(int16 y1 [10]) |
固定矩阵 | 函数(int 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) 功能(Void * 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工作1[3][5]) |
数据类型 | 金宝app是否支持输入和输出? | 金宝app支持的参数? | 金宝app支持工作向量? |
---|---|---|---|
Simulink支持的金宝app数据类型金宝app(除了。一串 ) |
对 | 对 | 对 |
金宝app仿真软件。公共汽车 1 |
对 | 对 | 对 |
的数组金宝app仿真软件。公共汽车 2 |
对 | 没有 | 对 |
金宝app仿真软件。NumericType 3. |
对 | 对 | 对 |
金宝app仿真软件。AliasType 1 |
对 | 对 | 对 |
枚举 1 |
对 | 对 | 对 |
固定点4. | 对 | 对 | 对 |
网络对象 | 不适用 | 对 | 不适用 |
复数5. | 对 | 对 | 对 |
一维数组 | 对 | 对 | 对 |
二维数组6. | 对 | 对 | 对 |
N-D阵列7. | 对 | 对 | 对 |
空虚* | 没有 | 没有 | 对 |
void * * | 没有 | 没有 | 对 |
您必须提供定义总线结构的头文件,定义枚举
型,或具有相同名称的别名定义的数据类型。在头文件中声明的总线的结构必须总线对象的结构相匹配(例如,数量和元素,数据类型和元素的宽度的顺序,等等)。例如,请参见使用公交传统功能具有结构参数.
为了生成数据类型的对象和枚举类,对应于自定义数据类型的C代码定义中,使用金宝appSimulink.importExternalCTypes
函数。
总线元素可以复杂,但仅使用Simulink内置数据类型。金宝app还支持阵列到任何级别。金宝app
如果数值数据类型也是别名,则必须提供仅定义数据类型的头文件。
您必须将数据声明为金宝app仿真软件。NumericType
对象(不支持未指定的缩放)。金宝app对于例子,见传统函数中的定点信号和遗留函数中的定点参数.
仅限于与Simulink内置数据类型一起金宝app使用。要指定复杂的数据类型,请在角括号(<>)中括内置数据类型并将其添加复杂的
(例如,复杂的双> <
).例如,请参见遗留函数中的复杂信号.
matlab,simul金宝appink,和金宝appSimulink编码器下载188bet金宝搏产品以列主格式将多维数组数据存储为向量。如果您的外部函数代码是为行主数据编写的,请使用convertNDArrayToRowMajor
功能选项legacy_code
.
对于多维信号,可以使用尺寸
函数来确定信号中元素的数量。对于例子,见在遗留函数中实现的查找表和遗留函数中的多维信号.
有关更多信息,请参阅Simulink支持的金宝app数据类型金宝app.
规范的legacy_code
必须遵守以下规则:
如果参数不是标量,则必须通过引用传递参数。
输入、输出、参数和工作矢量参数标记的编号必须从1开始,并单调增加。
对于给定的Legacy Code Tool数据结构,其输入、输出、参数和工作矢量参数的数据类型和大小必须在不同的功能规范中相同StartFcnSpec
那InitializeConditionsFcnSpec
那OutputFcnSpec
,TerminateFcnSpec
.
你可以使用以下表达式指定参数维度:
功能:元素个数
那尺寸
参数值
操作员:+
那-
那*
,/
整数和浮点文字
用于分组子表达式的括号
例如:
def.OutputFcnSpec = foo4(INT8 P1 [],INT8 U1 [],双Y1 [numel(U1)2] [numel(U1)3],... INT32(numel(P1)+ numel(U1))* 2 +大小(y1,2))';
要使用遗留代码工具集成C函数,该函数必须遵守以下规则:
函数不能改变输入参数的值。如果输入信号是通过引用传递给函数的参数,则函数不能修改参数所指向的数据。
函数的返回值不能是指针。
的函数规范StartFcnSpec
那InitializeConditionsFcnSpec
,或TerminateFcnSpec
无法访问输入或输出参数。为StartFcnSpec
和InitializeConditionsFcnSpec
,如果选择S功能选项,则可以访问输出端口outputsConditionallyWritten
被设定为真正的
.使用此选项设置,生成的S-Function指定与每个输出端口相关联的内存不能被覆盖,并且是全局的(ss_not_reusable_and_global.
).
为现有C函数注册旧代码工具数据结构后,使用legacy_code
以下功能所解释的,以产生,编译和链接S-功能。
基于结构中定义的信息生成C MEX S函数。称呼legacy_code
与“sfcn_cmex_generate”
作为第一个参数,数据结构的名称作为第二个参数。
遗留代码(“sfcn\U cmex\U生成”,lct\U规范);
编写并链接s函数。这个步骤假设为MATLAB安装设置了一个C编译器。称呼legacy_code
与“编译”
作为第一个参数,数据结构的名称作为第二个参数。
legacy_code(“编译”,lct_spec);
类似于下面的信息消息出现在MATLAB命令窗口和一个动态可加载的可执行结果。在32位Windows系统上,Simulink软件为该文件命名金宝appex_sfun_doubleit.mexw32.
.
###开始编译EX_SFUN_DOUBLITIT MEX EX_SFUN_DOUBYIT.C -ID:\ WORK \ LCT \ LCT_DEMOS ###完成编译EX_SFUN_DOUBLITIT ###退出
作为方便,您可以通过调用在一步中生成,编译和链接S函数legacy_code
与字符矢量“generate_for_sim”
。如果Options.useTlcWithAccel
遗留代码工具数据结构的字段设置为1。
生成动态可加载的可执行文件后,您或其他人可以通过添加指定编译的S函数的S函数块来在模型中使用它。
您可以选择使用Legacy Code Tool生成一个屏蔽的s -函数块(图形表示),该块被配置为调用生成的C MEX s -函数。要生成这样的块,调用legacy_code
与'slblock_generate'
作为第一个参数,遗留代码工具数据结构的名称作为第二个参数。
legacy_code (slblock_generate, lct_spec);
控件的值,该工具将块遮罩起来OutputFcnSpec
场地。然后,您可以手动块添加到模型中。
如果你喜欢的遗留代码工具块自动添加到模型,指定模型作为第三个参数的名称。例如:
lct_spec legacy_code (' slblock_generate ', ' myModel ');
如果指定的型号(例如,mymodel.
)存在,legacy_code
打开模型并添加由旧代码工具数据结构描述的屏蔽S功能块。如果模型不存在,该函数将使用指定名称创建新模型并添加屏蔽S功能块。
如果你正在使用金宝app仿真软件加速器™模式下,可以生成并强制使用TLC内嵌代码通过遗留代码工具生成的S-功能。去做这个:
产生TLC块文件的s函数legacy_code
作用于“sfcn_tlc_generate”
作为第一个参数,遗留代码工具数据结构的名称作为第二个参数。
Legacy_code('sfcn_tlc_generate',lct_spec);
考虑一个例子集成C函数与遗留代码工具Simulink模型金宝app.要为示例末尾所示的模型生成TLC文件,输入以下命令:
legacy_code (sfcn_tlc_generate, def);
强制加速模式使用TLC文件ssSetOptions
SimStruct
函数设置S-function选项SS_OPTION_USE_TLC_WITH_ACCELERATOR
.
要在初始化遗留代码工具数据结构后调用遗留c++函数,将值' c++ '赋给Options.language
场地。例如,
def = legacy_code(“初始化”);def.Options.language =“c++”;
要验证新设置,请输入
def.Options.language
笔记
遗留代码工具可以与c++函数交互,但不能与c++对象交互。为了工作,看遗留代码工具的限制在Simuli金宝appnk文档中。
您可以在同一个文件夹中有多个注册文件,并使用单个调用为每个文件生成一个S-functionlegacy_code
。同样,您也可以使用单个呼叫legacy_code
为了编译和链接S函数,另一个是合适的,可以生成相应的TLC块文件。
看看下面的例子,其中lct_register_1
那lct_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 -函数,以供他人使用。要部署仅供模拟使用的s函数,您只需要共享已编译的可动态加载的可执行文件。
有关遗留代码工具的示例,请参阅使用遗留代码工具实现算法.
遗留代码的工具
生成C++或C++中现有函数的C MEX S函数,该工具不支持MATLAB或FORTRAN函数的变换。金宝app
可以与c++函数接口,但不能与c++对象接口。解决这个限制的一种方法是使用S-Function Builder生成s -函数的外壳,然后从s -函数调用遗留c++代码mdlOutputs
回调函数。
不支持模拟连续或离金宝app散状态。这将阻止您使用mdlUpdate
和mdlDerivatives
回调函数。如果您的应用程序需要这种支持,请参见金宝app使用S-Function Builder中纳入遗留代码.
始终设置S函数标志直接馈通(尺寸.DirfeedThrough.
)真正的
.由于这个设置和前面的限制,生成的s函数不能被打破代数循环.
金宝app只支持连续的,但固定在小时间步长,采样时间和偏移量选择。
金宝app支持复数,但仅限于Simulink金宝app内置的数据类型.
不支持使用函数指针金宝app作为被调用的遗留函数的输出。
不支持下面的S-功金宝app能特点:
功向量,除了一般的功向量
基于帧的输入和输出信号
基于端口的采样时间
多个基于块的样本时间
不支持使用范围(:金宝app:)操作符访问c++类数据和方法。对于静态方法,你可以编写简单的预处理器宏,类似如下:
#定义CCommon_computeVectorDotProduct CCommon:: computeVectorDotProduct
如果函数规范中包含一个具有属性的Simulink数据类型,当您没有指定一个terminate函数时,是否可以生成一个terminate函数金宝appHeaderFile
。对于导出函数模型,此终止函数会使生成的S函数与代码生成不兼容。