您可以集成现有的C(或C ++)函数,例如设备驱动程序,查找表和常规功能以及接口,进入Simulink金宝app®通过使用旧代码的工具模型。使用规范,您所提供的MATLAB®代码,该工具将现有功能转换为C MEX S函数,以便在Simulink模型中包含。金宝app如果你使用金宝appSimulink Coder™生成的代码,修改代码工具可以插入到你的C函数一个合适的呼叫到生成的代码。有关详细信息,请参阅导入调用外部代码到生成的代码修改代码工具(金宝app仿真软件编码器).
相比于使用S-函数生成器或写一个S-功能,传统代码工具是更容易使用,并生成优化代码(不会产生包装代码)通常由嵌入式系统必需的。然而,考虑用于混合动力系统的替代方法,例如,其包括植物和控制器,或写入比C或C以外的其他语言++系统部件的系统。替代方法是,他们支持更多的功能和编程语言更加灵活。金宝app
与遗留代码工具互动,您
使用遗留代码工具数据结构来指定
S函数的名称
现有C函数的规范
文件名和路径所需的编译
生成的S函数的选项
使用legacy_code
功能
为给定C函数初始化遗留代码工具数据结构
生成仿真过程中使用的S-功能
编译并链接生成S-功能为可动态加载的可执行
生成一个掩码s函数块用于调用生成的s函数
生成一个TLC块的文件,如果有必要,一个答案
_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.
,其声明存在于名为的标题文件中普通的
.
初始化MATLAB结构def
使用使用遗留代码工具属性的字段使用legacy_code
功能。
DEF = legacy_code( '初始化')
遗留代码工具数据结构命名def
显示其在MATLAB命令窗口字段,如下所示:
DEF = SFunctionName: '' InitializeConditionsFcnSpec: '' OutputFcnSpec: '' StartFcnSpec: '' TerminateFcnSpec: '' HeaderFiles:{} SourceFiles:{} HostLibFiles:{} TargetLibFiles:{} IncPaths:{} SrcPaths:{} LibPaths:{}SampleTime: '继承' 选项:[1x1的结构]
为Legacy Code Tool数据结构中的字段指定适当的值,以标识现有C函数的属性。例如,通过在MATLAB命令提示符中输入以下命令来指定C函数源和头文件名:
def.sourcefiles = {'doubleit.c'};def.headerfiles = {'doubleit.h'};
您还必须指定关于遗留代码工具从C代码生成的s -函数的信息。例如,为s -函数及其输出函数声明指定一个名称,输入:
def.sfunctionname ='ex_sfun_double';def.outputfcnspec ='double y1 = dubpit(double u1)';
有关各种数据结构的字段的信息,请参阅legacy_code
参考页面。
通过使用从所述现有的C功能的S-函数源文件legacy_code
功能。在matlab命令提示符下,键入:
Legacy_code('sfcn_cmex_generate',def);
遗留代码工具使用def
创建名为的S函数源文件ex_sfun_doubleit.c.
在当前的Matlab文件夹中。
编译并将S函数源文件链接到使用的动态可加载的可执行文件中使用金宝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函数块返回其浮点输入的值乘以两个。它表现得像c函数挖
.
此示例显示如何使用遗留代码工具集成C函数,其参数指向结构的指针。
在Si金宝appmulink®中,创建一个金宝appSimulink.Bus
对象来表示的结构类型。使用模型中的总线信号,以表示结构化的信号和状态。在工作空间中或在块参数创建对话框MATLAB结构来表示参数的结构。
有关总线信号的基本信息,请参阅虚拟总线.有关参数结构的基本信息,请参阅组织结构中的相关块参数定义.要创建总线对象,见创建和指定Simulink.Bus对象金宝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结构{双SIG1;双SIG2;} sigStructType;typedef结构{双参数1;双参数2;双参数3;} paramStructType;空隙myFcn(sigStructType *在,paramStructType *参数,可以sigStructType *出);#万一
文件定义了信号和参数结构类型的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(sigutrytype 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( ' - 我的/ 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函数块,可在仿真期间调用S函数。
legacy_code ('slblock_generate',DEF);
该块出现在一个新的模式。
要在模型中使用S函数块,请创建类型的总线信号sigtracttype.
用作块输入。块输出也是总线信号。块掩码接受参数,P1.要设置参数的值,使用MATLAB结构,其字段与结构类型的字段相匹配Paramstructype.
.
验证外部代码的执行
创建一个线束模型,用于在仿真期间验证外部代码的执行。
举一个例子,查看模型ex_lct_struct
.
open_system('ex_lct_struct')
在“常量块”对话框中,恒定值参数设置为其字段与结构类型匹配的结构sigtracttype.
.在这一点信号属性标签,输出数据类型被设置为总线对象sigtracttype.
.
S函数块调用S函数sfun_ex_mySrc_LCT
你创造的。块的输出进入总线选择块,其提取信号元素SIG1.
和SIG2.
.
S函数块通过蒙版对话框接受参数。创建MATLAB结构structParam
用作参数的值。
structParam =结构;structParam。P.aram1 = 15; structParam.param2 = 20; structParam.param3 = 5;
或者,使用金宝appSimulink.Parameter
对象包含的结构。如果使用一个参数对象,则可以通过使用总线对象设置的结构的数据类型Paramstructype.
.
structparam = 金宝appsimulink.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 / scope')Open_System('ex_lct_struct / scope1')sim('ex_lct_struct')%
使用遗留代码工具的第一步是注册一个或多个MATLAB结构,其中字段表示现有C代码的属性和正在生成的S函数。注册过程是灵活的。您可以选择设置资源并以各种方式启动注册,包括
将所有需要的头文件和源文件在当前工作文件夹或在分层文件夹结构
在当前工作文件夹中生成并放置一个或多个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函数的源文件和头文件(sourcefiles.
和HeaderFiles
)
一种在S-函数名(sfunctionname.
)
S函数的至少一个功能规范(initializeconditionsfcnspec.
那OutputFcnSpec
那startfcnspec.
那terminatefcnspec.
)
有关完整列表,并在结构中的字段的说明,请参见legacy_code
功能参考页面。
如果定义字段指定编译资源并指定相对路径,遗留代码工具搜索相对于以下目录中的资源,按以下顺序:
当前工作文件夹
C-MEX S-function文件夹,如果与当前工作文件夹不同
你指定的目录
进入
的头文件
SrcPaths
的源文件
libpaths.
对于目标和主机库
Matlab搜索路径上的目录,排除工具箱目录
这initializeconditionsfcnspec.
那OutputFcnSpec
那startfcnspec.
, 和terminatefcnspec.
在传统代码工具数据结构字段定义(参见的描述legacy_code
功能)要求人物矢量值即坚持一个特定的语法格式。所需的句法格式使遗留代码工具到一个现有的C函数的返回值和参数映射到的返回值,输入,输出,参数和工作在S-功能,该工具产生的向量。
一般的语法
return-spec=函数名(argument-spec)
例如,以下字符向量指定命名的函数挖
与回报规范双y₁
和输入参数规范双重U1
.
def.outputfcnspec ='double y1 = dubpit(double u1)';
有关声明功能规范的更多详细信息,请参阅
返回规范定义了现有C函数的返回值的数据类型和变量名称。
返回式返回变量
|
一种数据类型列在金宝app支持的数据类型. |
|
表格的象征y1. 那Y2. 那... 那y N., 在哪里N.是输出参数的总数。 |
如果函数不返回一个值,你可以省略返回规范或将其指定为空白
.
下表显示了整数返回值的有效功能规范语法。使用表格标识您应该为C函数原型使用的语法。
返回类型 | C函数原型 | 遗留代码工具功能规范 |
---|---|---|
没有返回值 | 无效myfunction的(...) |
无效myfunction的(...) |
标值 | int = myfunction(...) |
y1 = myfunction(…) |
指定的函数名必须与现有的C函数名相同。
例如,考虑以下C函数原型:
浮doubleIt(浮动inVal);
在这种情况下,遗留代码工具功能规范中的函数名称必须是挖
.
您不应该指定C宏的名称。如果必须,请设置该字段Options.isMacro
来真的
如果启用了表达式折叠。
实参规范定义了一个或多个数据类型和令牌对,它们表示现有C函数的输入、输出、参数和工作向量实参。函数的输入和输出参数映射到阻塞的输入和输出端口,参数映射到工作区参数。
参数类型参数令牌
|
一种数据类型列在金宝app支持的数据类型. |
|
下列形式之一的令牌:
|
如果函数没有参数,则可以省略参数规范或将其指定为空白
.
考虑以下C函数原型:
浮POWERIT(浮点inVal,INT指数);
以产生S-函数在每个时间步骤调用前述功能,设置传统代码工具的数据结构字段OutputFcnSpec
如下:
'单个Y1 = PowerIt(单个U1,INT16 P1)'
使用此功能规范,遗留代码工具映射以下信息。
返回值或参数 | c型 | 令牌 | 的数据类型 |
---|---|---|---|
返回值 | 漂浮 |
y1. |
单 |
inVal |
漂浮 |
u1 |
单 |
指数 |
㈡ |
P1. |
INT16 |
如果您的函数需要具有多个输入和输出端口的Simulink金宝app S函数块,请使用唯一编号的映射到输入端口的函数参数你
令牌。对于输出端口,使用唯一编号y
令牌。这些令牌在前面的参数规范表中描述。例如,考虑以下C函数原型:
void myfunc(双* y2,双U2,双U3,双U1,双* Y1);
一个OutputFcnSpec
字符矢量映射输入和输出端口的参数看起来类似于以下内容:
'void myfunc(双Y2 [1],双U2,双U3,双U1,双Y1 [1])'
得到的S函数块包括三个输入端口和两个输出端口。第一个输入映射到函数参数u1
,第二个输入u2
,以及第三个输入u3
.对于输出端口,函数参数Y1 [1]
地图到第一个输出和参数Y2 [1]
映射到第二个输出。有关将函数原型映射到多个输入和输出端口的另一个示例,请参见使用公交传统功能具有结构参数.
下表显示了Integer类型参数的有效功能规范语法。使用表识别,然后调整您应该为您的C函数原型使用的语法。
参数类型 | C函数原型 | 遗留代码工具功能规范 |
---|---|---|
输入参数 | ||
没有论据 | 功能(无效) |
功能(无效) |
按价值的标量通过 | 功能(int In1) |
函数(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 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]) |
可变矢量 | 函数(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 Work1 [3] [5]) |
数据类型 | 金宝app支持输入和输出? | 金宝app支持的参数? | 金宝app支持工作导向? |
---|---|---|---|
Simulink支持的金宝app数据类型金宝app(有例外字符串 ) |
是的 | 是的 | 是的 |
金宝appSimulink.Bus 1 |
是的 | 是的 | 是的 |
数组金宝appSimulink.Bus 2 |
是的 | 不 | 是的 |
金宝app仿真软件。NumericType 3. |
是的 | 是的 | 是的 |
金宝app仿真软件。AliasType 1 |
是的 | 是的 | 是的 |
枚举 1 |
是的 | 是的 | 是的 |
固定点4. | 是的 | 是的 | 是的 |
网络对象 | N/A | 是的 | N/A |
复数5. | 是的 | 是的 | 是的 |
1-d阵列 | 是的 | 是的 | 是的 |
2-D阵列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.
.
您可以使用以下内容指定参数维度:
职能:numel.
那尺寸
参数值
运营商:+
那-
那*
, 和/
整数和浮点文字
括号分组子表达式
例如:
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函数选项,您可以访问输出端口outcalSconditionallywritting.
被设定为真的
.使用此选项设置,生成的S函数指定无法覆盖与每个输出端口关联的内存并是全局的(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-功能。此步骤假设一个C编译器为您的MATLAB安装。称呼legacy_code
和'编译'
作为第一个参数和数据结构的名称作为第二个参数。
Legacy_code('compile',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”
.该函数还为加速模拟生成TLC文件,如果是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
酝酿
功能设置S-功能选项ss_option_use_tlc_with_accelerator.
.
到初始化传统代码工具数据结构后调用一个旧的C ++函数,值“C ++”分配给选项.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',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-功能而已,你需要共享只编译动态加载的可执行文件。
有关遗留代码工具的示例,请参阅使用遗留代码工具实现算法.
遗留代码工具
生成用于在C或C ++中写入的现有功能的C MEX S函数。该工具不支持MATLAB或FORTR金宝appAN功能的转换。
可以与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能特点:
除了普通Dwork矢量外的工作向量
基于帧的输入和输出信号
基于端口的采样时间
多个基于块的样本时间
不支持使用范围(:金宝app:::::)操作员访问C ++类数据和方法。对于静态方法,您可以编写简单的预处理器宏,类似于以下内容,可以解决以下问题:
#定义CCommon_computeVectorDotProduct CCommon :: computeVectorDotProduct
可以生成终止功能,当你没有指定一个如果函数规范包括具有属性的Simulink数据类型金宝app标题文件
.对于出口函数模型,此终止功能可以使生成的S函数与代码生成不兼容。