您可以将现有的C(或c++)函数集成到Simulink中,例如设备驱动程序、查找表以及通用函数和接口金宝app®通过使用遗留代码工具建立模型。使用MATLAB提供的规范®代码中,该工具将现有函数转换为可以包含在Simulink模型中的C MEX s函数。金宝app如果你使用金宝app仿真软件编码器™为了生成代码,遗留代码工具可以在生成的代码中插入对C函数的适当调用。详细信息请参见使用遗留代码工具将对外部代码的调用导入生成的代码中(金宝app仿真软件编码器).
与使用S-Function Builder或编写S-Function相比,遗留代码工具更容易使用,并生成嵌入式系统通常需要的优化代码(不生成包装器代码)。但是,请考虑混合系统的替代方法,例如包含设备和控制器的系统,或者用C或c++以外的语言编写的系统组件。替代方法更加灵活,因为它们支持更多的特性和编程语言。金宝app
要与遗留代码工具交互,您需要
使用遗留代码工具数据结构指定
s函数的名字
现有C函数的规范
编译所需的文件和路径
生成的s函数的选项
使用legacy_code
函数
初始化给定C函数的遗留代码工具数据结构
生成s函数供模拟时使用
编译生成的s函数并将其链接到可动态加载的可执行文件中
生成一个屏蔽s函数块,用于调用生成的s函数
生成一个TLC块文件,如果需要,生成一个sFunction
_makecfg.m
或rtwmakecfg.m
用于生成代码的文件(金宝app仿真软件编码器需要产品许可证)
请注意
在使用之前legacy_code
,确保为MATLAB安装设置了C编译器。
下图说明了使用遗留代码工具的一般过程。用遗留代码工具集成C函数到Simulink模型金宝app提供了一个使用遗留代码工具将现有C函数转换为C MEX s函数的示例。
如果你有金宝app仿真软件编码器产品许可,请参见使用遗留代码工具将对外部代码的调用导入生成的代码中(金宝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]
为遗留代码工具数据结构中的字段指定适当的值,以标识现有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)';
有关各种数据结构字段的信息,请参见legacy_code
参考页面。
方法从现有C函数生成s函数源文件legacy_code
函数。在MATLAB命令提示符下,输入:
legacy_code (sfcn_cmex_generate, def);
遗留代码工具使用中指定的信息def
创建s函数的源文件ex_sfun_doubleit.c
在当前MATLAB文件夹中。
控件将s函数源文件编译并链接到可动态加载的Simulink可执行文件中金宝applegacy_code
函数。在MATLAB命令提示符下,输入:
legacy_code(“编译”,def);
MATLAB命令窗口中出现如下消息:
开始编译ex_sfun_doubleit mex('ex_sfun_doubleit.c', 'd:\work\lct_demos\doubleIt.c', '-Id:\work\lct\lct_demos') ###完成编译ex_sfun_doubleit ###退出
在32位的微软上®窗户®系统,生成的s函数可执行文件被命名ex_sfun_doubleit.mexw32
.
插入一个蒙版功能块转换为Simulink模金宝app型。
legacy_code (slblock_generate, def);
遗留代码工具将块配置为使用在前一步中创建的C MEX s函数。此外,该工具还屏蔽了块,以便显示其值OutputFcnSpec
属性的描述legacy_code
功能)。
在C-MEX S-function模块的输入端添加一个振幅为1的正弦波模块,在输出端添加一个Scope模块。
运行模拟。C-MEX S-Function块返回其浮点输入的值乘以2。它的行为类似于C函数doubleIt
.
这个例子展示了如何使用遗留代码工具集成一个C函数,其参数是指向结构的指针。
在Si金宝appmulink®中创建一个金宝app仿真软件。公共汽车
对象来表示结构类型。在模型中使用总线信号来表示结构化信号和状态。在工作区或块参数对话框中创建MATLAB结构以表示参数结构。
有关总线信号的基本信息,请参见虚拟总线.有关参数结构的基本信息,请参见在结构中组织相关块参数定义.要创建总线对象,请参见创建并指定Simulink。金宝app总线对象.
探索外部代码
将此自定义源代码复制到一个名为ex_mySrc_LCT.c
在当前文件夹中。
#include " ex_mytypes_llt .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;} sigStructType;类型定义struct {double param1;双param2;双param3;} paramStructType;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
,日元
来表示输入参数、形参参数和输出参数。使用语法[1]
指定每个参数都是指针。
def.OutputFcnSpec = ['void myFcn(sigStructType u1[1], ',...'paramStructType p1[1], sigStructType y1[1])'];
使用函数legacy_code
根据规范创建s函数和相应的C MEX可执行文件,def
.指定选项“generate_for_sim”
为正常模拟和加速模拟准备s函数。
legacy_code (“generate_for_sim”def);
###开始编译sfun_ex_mySrc_LCT mex('-I/tmp/Bdoc21a_1606923_4327/tp74b21f37/ex12763634', '-c', '-outdir', '/tmp/Bdoc21a_1606923_4327/tpe42d0b74_ef8c_4935_abf7_acb59a328c05', '/tmp/Bdoc21a_1606923_4327/tp74b21f37/ex12763634/ex_mySrc_LCT.c')使用'gcc'构建。MEX完成成功。mex('sfun_ex_mySrc_LCT.c', '-I/tmp/Bdoc21a_1606923_4327/tp74b21f37/ex12763634', '/tmp/Bdoc21a_1606923_4327/tpe42d0b74_ef8c_4935_abf7_acb59a328c05/ex_mySrc_LCT.o')使用'gcc'构建MEX完成成功。###完成编译sfun_ex_mySrc_LCT
创建一个屏蔽的S-Function块,在模拟过程中调用S-Function。
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
是你创造的。该块的输出进入一个总线选择器块,该块提取信号元素sig1
而且sig2
.
S-Function块通过掩码对话框接受参数。创建MATLAB结构structParam
作为参数的值使用。
structParam = struct;structParam。param1 = 15; structParam.param2 = 20; structParam.param3 = 5;
可选地,使用金宝app仿真软件。参数
对象来包含结构。如果使用参数对象,则可以使用总线对象设置结构的数据类型paramStructType
.
structParam = 金宝appSimulink.Parameter(结构参数);structParam。数据类型=“巴士:paramStructType”;
在“掩码”对话框中,设置P1来structParam
.
set_param (“ex_lct_struct / sfun_ex_mySrc_LCT”,“SParameter1”,“structParam”)
模拟模型。Scope块显示S-Function块调用外部函数myFcn
.
open_system (“ex_lct_struct /范围”) open_system (“ex_lct_struct / Scope1”) 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: 'inherited' Options: [1x1 struct]
定义应用于现有C函数和打算生成的s函数的数据结构字段(属性)的值。最起码,您必须指定
现有C函数的源文件和头文件(源文件
而且HeaderFiles
)
s函数的名称(SFunctionName
)
s函数的至少一个函数规范(InitializeConditionsFcnSpec
,OutputFcnSpec
,StartFcnSpec
,TerminateFcnSpec
)
有关结构中字段的完整列表和描述,请参见legacy_code
函数参考页面。
如果您定义了指定编译资源的字段并指定了相对路径,则遗留代码工具将按照以下顺序搜索相对于以下目录的资源:
当前工作文件夹
C-MEX S-function文件夹,如果与当前工作文件夹不同
指定的目录
IncPaths
对于头文件
SrcPaths
对于源文件
LibPaths
用于目标库和主机库
MATLAB搜索路径上的目录,不包括工具箱目录
的InitializeConditionsFcnSpec
,OutputFcnSpec
,StartFcnSpec
,TerminateFcnSpec
在遗留代码工具数据结构中定义的字段(请参阅legacy_code
函数)要求字符向量值遵循特定的语法格式。所需的语法格式使遗留代码工具能够将现有C函数的返回值和参数映射到该工具生成的s函数的返回值、输入、输出、参数和工作向量。
一般的语法
return-spec=函数名(argument-spec)
例如,下面的字符向量指定名为doubleIt
带返回规格双y₁
和输入参数说明双u1
.
def.OutputFcnSpec = 'double y1 = doubleIt(double u1)';
有关声明函数规范的详细信息,请参见
返回规范定义了现有C函数返回值的数据类型和变量名。
返回类型返回变量
|
中列出的数据类型金宝app支持的数据类型. |
|
形式的标记日元 ,y2 ,... ,y n,在那里n输出参数的总数。 |
如果函数不返回值,则可以省略返回规范或将其指定为无效
.
下表显示了整数返回值的有效函数规范语法。使用这个表来确定C函数原型应该使用的语法。
返回类型 | C函数原型 | 遗留代码工具功能说明 |
---|---|---|
没有返回值 | 空白myfunction(…) |
空白myfunction(…) |
标量值 | Int = myfunction(…) |
Int16 y1 = myfunction(…) |
指定的函数名必须与现有的C函数名相同。
例如,考虑下面的C函数原型:
float doubleIt(float inVal);
在这种情况下,遗留代码工具函数规范中的函数名必须为doubleIt
.
您不应该指定C宏的名称。如果必须,请设置字段Options.isMacro
来真正的
如果表达式折叠被启用。
参数规范定义了一个或多个数据类型和令牌对,它们表示现有C函数的输入、输出、参数和工作向量参数。函数输入和输出参数映射为块输入和输出端口,参数映射为工作区参数。
参数类型argument-token
|
中列出的数据类型金宝app支持的数据类型. |
|
下列任何一种形式的证明:
|
如果函数没有参数,则可以省略参数说明或将其指定为无效
.
考虑下面的C函数原型:
浮点powerIt(浮点inVal,整数指数);
要生成在每个时间步骤调用上述函数的s函数,请设置遗留代码工具数据结构字段OutputFcnSpec
致以下:
'单个y1 = powerIt(单个u1, int16 p1)'
使用此功能规范,遗留代码工具映射以下信息。
返回值或参数 | C型 | 对令牌 | 数据类型 |
---|---|---|---|
返回值 | 浮动 |
日元 |
单 |
inVal |
浮动 |
u1 |
单 |
指数 |
int |
p1 |
int16 |
如果函数需要具有多个输入和输出端口的Simulink s金宝app函数块,请使用唯一编号将函数参数映射到输入端口u
令牌。对于输出端口,使用唯一编号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 y₁[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]) |
固定向量 | 函数(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函数(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支持功向量? |
---|---|---|---|
Simulink支持的金宝app数据类型金宝app的例外字符串 ) |
是的 | 是的 | 是的 |
金宝app仿真软件。公共汽车 1 |
是的 | 是的 | 是的 |
的数组金宝app仿真软件。公共汽车 2 |
是的 | 没有 | 是的 |
金宝app仿真软件。NumericType 3. |
是的 | 是的 | 是的 |
金宝app仿真软件。AliasType 1 |
是的 | 是的 | 是的 |
枚举 1 |
是的 | 是的 | 是的 |
定点4 | 是的 | 是的 | 是的 |
Fi对象 | N/A | 是的 | N/A |
复数5 | 是的 | 是的 | 是的 |
一维数组 | 是的 | 是的 | 是的 |
二维数组6 | 是的 | 是的 | 是的 |
一天的数组7 | 是的 | 是的 | 是的 |
void * | 没有 | 没有 | 是的 |
void * * | 没有 | 没有 | 是的 |
您必须提供头文件,该文件定义总线的结构,定义枚举
类型,或使用与别名相同的名称定义数据类型。头文件中声明的总线结构必须与总线对象的结构匹配(例如,元素的数量和顺序、元素的数据类型和宽度,等等)。有关示例,请参见使用带有结构参数的遗留函数的总线.
要生成与C代码定义的自定义数据类型对应的数据类型对象和枚举类,请使用金宝appSimulink.importExternalCTypes
函数。
总线元素可以很复杂,但只能使用Simulink内置数据类型。金宝app还支持将数组嵌套到任何级别。金宝app
只有当数值型数据类型也是别名时,才必须提供定义数据类型的头文件。
必须将数据声明为金宝app仿真软件。NumericType
对象(不支持未指定的缩放)。金宝app有关示例,请参见遗留函数中的定点信号而且遗留函数中的定点参数.
仅限于与Simulink内置数据类型一起金宝app使用。若要指定复杂数据类型,请将内置数据类型括在尖括号(<>)中并在单词前面复杂的
(例如,复杂的双> <
).有关示例,请参见遗留函数中的复杂信号.
MATLAB, Simu金宝applink,和金宝app仿真软件编码器下载188bet金宝搏产品以列主格式将多维数组数据存储为向量。如果外部函数代码是为行主数据编写的,请使用convertNDArrayToRowMajor
s函数选项legacy_code
.
对于多维信号,可以使用大小
函数来确定信号中元素的数量。有关示例,请参见在遗留函数中实现的查找表而且遗留函数中的多维信号.
有关更多信息,请参见Simulink支持的金宝app数据类型金宝app.
规范legacy_code
必须遵守以下规则:
如果参数不是标量,则必须通过引用传递参数。
输入、输出、参数和工作矢量参数令牌的编号必须从1开始,并单调递增。
对于给定的遗留代码工具数据结构,输入、输出、参数和工作矢量参数的数据类型和大小必须在不同的功能规范中相同StartFcnSpec
,InitializeConditionsFcnSpec
,OutputFcnSpec
,TerminateFcnSpec
.
你可以用下面的表达式指定参数的维数:
功能:元素个数
,大小
参数值
运营商:+
,-
,*
,/
整数和浮点字面值
用于分组子表达式的括号
例如:
f. outputfcnspec = foo4(int8 p1[], int8 u1[], double y1[nummel (u1)+2][nummel (u1)+3],…int32(元素个数(p1) +元素个数(u1)) * 2 +大小(2)日元)”;
要使用遗留代码工具集成一个C函数,该函数必须遵守以下规则:
函数不能改变输入参数的值。如果输入信号是传递给函数的引用参数,则函数不能修改参数所指向的数据。
函数的返回值不能是指针。
属性定义的功能规范StartFcnSpec
,InitializeConditionsFcnSpec
,或TerminateFcnSpec
不能访问输入或输出参数。为StartFcnSpec
而且InitializeConditionsFcnSpec
,可以通过S-Function选项访问输出端口outputsConditionallyWritten
设置为真正的
.使用此选项设置,生成的S-Function指定与每个输出端口关联的内存不能被覆盖,并且是全局的(SS_NOT_REUSABLE_AND_GLOBAL
).
为现有C函数注册遗留代码工具数据结构后,请使用legacy_code
函数,生成、编译并链接s函数。
根据结构中定义的信息生成一个C MEX s函数。调用legacy_code
与“sfcn_cmex_generate”
作为第一个参数,数据结构的名称作为第二个参数。
legacy_code (sfcn_cmex_generate, lct_spec);
编译并链接s函数。这一步假设已经为MATLAB安装设置了C编译器。调用legacy_code
与“编译”
作为第一个参数,数据结构的名称作为第二个参数。
legacy_code(“编译”,lct_spec);
类似于下面的信息消息出现在MATLAB命令窗口和动态加载可执行结果。在32位Windows系统上,由Simulink软件为文件命名金宝appex_sfun_doubleit.mexw32
.
开始编译ex_sfun_doubleit mex ex_sfun_doubleit.c -Id:\work\lct\lct_demos结束编译ex_sfun_doubleit
为了方便起见,您可以在一个步骤中生成、编译和链接s函数legacy_code
用字符向量“generate_for_sim”
.该函数还生成一个TLC文件,用于加速模拟Options.useTlcWithAccel
“遗留代码工具”数据结构的字段设置为1。
一旦生成了可动态加载的可执行文件,您或其他人就可以通过添加指定已编译S-Function的S-Function块在模型中使用它。
您可以选择使用遗留代码工具来生成屏蔽s函数块(图形表示),该块被配置为调用生成的C MEX s函数。要生成这样的块,调用legacy_code
与“slblock_generate”
作为第一个参数,遗留代码工具数据结构的名称作为第二个参数。
legacy_code (slblock_generate, lct_spec);
的值时,该工具将屏蔽该块OutputFcnSpec
字段。然后您可以手动将块添加到模型中。
如果您希望遗留代码工具自动将块添加到模型中,请将模型的名称指定为第三个参数。例如:
legacy_code('slblock_generate', lct_spec, 'myModel');
如果指定的模型(例如,myModel
)存在,legacy_code
打开模型并添加由遗留代码工具数据结构描述的屏蔽s函数块。如果模型不存在,该函数将创建一个具有指定名称的新模型,并添加屏蔽的s函数块。
如果你正在使用金宝app仿真软件加速器™模式,您可以为遗留代码工具生成的s函数生成并强制使用TLC内联代码。这样做:
生成一个TLC块文件通过调用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函数选项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函数,只需调用一次legacy_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;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函数,以供其他人使用。若要部署仅供模拟使用的s函数,则只需共享已编译的可动态加载可执行文件。
有关遗留代码工具的示例,请参见使用遗留代码工具实现算法.
遗留代码工具
为用C或c++编写的现有函数生成C MEX s函数。该工具不支持MATLAB或Fortr金宝appan函数的转换。
可以与c++函数接口,但不能与c++对象接口。解决这个限制的一种方法是使用S-Function Builder来生成S-Function的shell,然后从S-Function调用遗留的c++代码mdlOutputs
回调函数。
不支持模拟连续或离金宝app散状态。这将阻止您使用mdlUpdate
而且mdlDerivatives
回调函数。如果应用程序需要此支持,请参见金宝app使用S-Function生成器合并遗留代码.
总是设置s函数标志直接引线(大小。DirFeedthrough
)真正的
.由于这个设置和前面的限制,生成的s函数不会断裂代数循环.
金宝app只支持连续,但固定在小时间步长,采样时间和偏移量选择。
金宝app支持复数,但仅支持Simulink金宝app内置数据类型.
不支持将函数指针用金宝app作正在调用的遗留函数的输出。
不支持以下s函数特金宝app性:
功向量,而不是一般的DWork向量
基于帧的输入输出信号
基于端口的采样时间
多个基于块的采样次数
不支持使用作用域(金宝app::)操作符访问c++类数据和方法。对于静态方法,你可以编写简单的预处理器宏,类似如下所示,来解决这个问题:
#定义CCommon_computeVectorDotProduct
如果函数规范中包含具有该属性的Simulink数据类型,则在未指定终止函数时是否可以生成终止函数金宝appHeaderFile
.对于导出函数模型,这个终止函数会使生成的s函数与代码生成不兼容。