S-Functions把遗留的C代码
概述
C墨西哥人S-functions允许您调用现有的C代码在您的模型金宝app®模型。例如,考虑一个简单的C函数doubleIt.c
输出值的两倍的价值函数的输入。
双doubleIt(双u){返回(u * 2.0);}
您可以创建一个函数调用doubleIt.c
通过:
你也可以调用外部C代码使用MATLAB仿真软件模型的功能块。金宝app更多信息见通过使用MATLAB功能块集成C代码。
以下部分描述如何创建S-functions中使用的仿真软件模拟金宝app和金宝app仿真软件编码器™代码生成,使用前面的三种方法。这个例子使用这些S-functions模型包含块。如果你计划来创建模型,复制文件doubleIt.c
和doubleIt.h
从文件夹中docroot /工具/模型/例金宝app子
到你的工作目录。
使用手写功能将遗留代码
的功能wrapsfcn.c
调用遗留函数doubleIt.c
在其mdlOutputs
方法。保存wrapsfcn.c
文件到你的工作目录,如果你正计划创建的示例模型。
将遗留代码的功能,wrapsfcn.c
首先声明doubleIt.c
用下面的句子:
走读生real_T doubleIt (real_T u);
一旦宣布,功能可以使用doubleIt.c
在其mdlOutputs
方法。例如:
/ *功能:mdlOutputs = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = *文摘:* doubleIt。c函数多个输入2。* /静态孔隙mdlOutputs (SimStruct *年代,int tid) {InputRealPtrsType uPtrs = ssGetInputPortRealSignalPtrs (S, 0);real_T * y = ssGetOutputPortRealSignal (S, 0);* y = doubleIt (* uPtrs [0]);}
来编译wrapsfcn.c
功能,运行以下墨西哥人
命令。确保doubleIt.c
文件在您的工作目录。
墨西哥人wrapsfcn。c doubleIt.c
生成代码的功能使用金宝app仿真软件编码器代码生成器,您需要编写一个目标语言的编译器(TLC)文件。下面的TLC文件wrapsfcn.tlc
使用BlockTypeSetup
函数声明一个函数原型doubleIt.c
。薄层色谱文件的输出
函数然后告诉金宝app仿真软件编码器代码生成器如何内联调用doubleIt.c
。例如:
%实现“wrapsfcn”“C”% %文件:wrapsfcn。tlc % %文摘:% % s函数例子tlc文件wrapsfcn。c % % % %功能:BlockTypeSetup = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % %文摘:% %在模型创建函数原型。h: % %”走读生双doubleIt(双u);“%% %function BlockTypeSetup(block, system) void %openfile buffer %% PROVIDE ONE LINE OF CODE AS A FUNCTION PROTOTYPE extern double doubleIt(double u); %closefile buffer %%%endfunction %% BlockTypeSetup %% Function: Outputs ======================================= %% Abstract: %% CALL LEGACY FUNCTION: y = doubleIt( u ); %% %function Outputs(block, system) Output /* % Block: % */ %assign u = LibBlockInputSignal(0, "", "", 0) %assign y = LibBlockOutputSignal(0, "", "", 0) %% PROVIDE THE CALLING STATEMENT FOR "doubleIt" % = doubleIt( % ); %endfunction %% Outputs
薄层色谱的更多信息,请参阅目标语言编译器基础(金宝app仿真软件编码器)。
利用s函数构建器将遗留代码
s函数构建器自动创建S-functions和TLC将遗留代码的文件。对于这个示例,除了doubleIt.c
,你需要的头文件doubleIt.h
这声明doubleIt.c
函数的格式,如下:
走读生real_T doubleIt (real_T in1);
利用s函数构建器块配置块对话框调用遗留功能doubleIt.c
。在s函数构建块对话框:
的功能名称字段参数面板中定义的名字
builder_wrapsfcn
对生成的功能。的数据属性窗格名称输入和输出端口
三机一体
和着干活
,分别。的库面板提供遗留代码的接口。
的图书馆/对象/源文件字段包含源文件的名字
doubleIt.c
。的包括字段包含以下行包含头文件声明遗留功能:
# include < doubleIt.h >
的输出面板与行调用遗留函数:
/ *调用函数,增加输入2 * / *着干活= doubleIt (* in1);
的建立信息窗格中选择生成包装器薄层色谱选择。
当你点击构建,s函数生成器生成三个文件。
文件名称 | 描述 |
---|---|
builder_wrapsfcn.c |
主要的功能。 |
builder_wrapsfcn_wrapper.c |
包含单独一个包装器文件中输入的函数代码输出,连续的衍生品,离散更新窗格的s函数生成器。 |
builder_wrapsfcn.tlc |
功能的TLC文件。 |
的builder_wrapsfcn.c
文件遵循一个标准格式:
文件从一组开始
#定义
语句包含信息从s函数生成器。例如,下面的行定义第一个输入端口:#定义NUM_INPUTS 1 / *输入端口0 * / # define IN_PORT_0_NAME in1 # define INPUT_0_WIDTH 1 # define INPUT_DIMS_0_COL 1 #定义INPUT_0_DTYPE real_T # define INPUT_0_COMPLEX COMPLEX_NO # define IN_0_FRAME_BASED FRAME_NO # define IN_0_DIMS一维# define INPUT_0_FEEDTHROUGH 1
接下来,文件声明所有的包装器函数
builder_wrapsfcn_wrapper.c
文件。这个例子只需要一个包装器函数输出代码。外面的空白builder_wrapsfcn_Outputs_wrapper (const real_T * in1, real_T *着干活);
这些定义和声明之后,文件包含s函数方法,如
mdlInitializeSizes
,初始化函数的输入端口、输出端口,和参数。看到流程视图的方法,被称为在s函数初始化阶段。的
mdlOutputs
文件的调用方法builder_wrapsfcn_wrapper.c
函数。该方法使用输入和输出的名称三机一体
和着干活
中定义的数据属性窗格中,当调用包装器函数。例如:/ *功能:mdlOutputs = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = * * /静态孔隙mdlOutputs (SimStruct *年代,int_T tid) {const real_T *三机= (const real_T *) ssGetInputPortSignal (S, 0);real_T *着干活= (real_T *) ssGetOutputPortRealSignal (S, 0);builder_wrapsfcn_Outputs_wrapper (in1,着干活);}
该文件
builder_wrapsfcn.c
总结所需的mdlTerminate
方法。
包装器函数builder_wrapsfcn_wrapper.c
有三个部分:
的
包含文件
部分包括doubleIt.h
文件,连同标准的s函数头文件:/ * *包含文件* * #如果定义(MATLAB_MEX_FILE) # Include“tmwtypes。h simstruc_types # include。h rtwtypes其他# # include。h”# endif / * % % % -SFUNWIZ_wrapper_includes_Changes_BEGIN——编辑这里_END * / # include <数学。h > # include < doubleIt。h > / * % % % -SFUNWIZ_wrapper_includes_Changes_END——编辑_BEGIN * /
的
外部引用
部分包含的信息外部引用声明场的库窗格。这个示例不使用本节。的
输出函数
部分声明的函数builder_wrapfcn_Outputs_wrapper
,其中包含s函数构建器块中的代码输入对话框输出面板:/ * * / * *输出功能无效builder_wrapfcn_Outputs_wrapper (const real_T * in1, real_T *着干活){/ * % % % -SFUNWIZ_wrapper_Outputs_Changes_BEGIN——编辑这里_END * / / *调用函数,增加输入2 * / *着干活= doubleIt (* in1);/ * % % % -SFUNWIZ_wrapper_Outputs_Changes_END——编辑这里_BEGIN * /}
请注意
相比,手写功能,功能构建器调用遗留C函数通过包装文件下来一个额外的水平builder_wrapsfcn_wrapper.c
。
薄层色谱文件builder_wrapsfcn.tlc
s函数生成器生成的类似于前面的手写版本。文件声明遗留功能BlockTypeSetup
并调用它输出
方法。
% % %实现builder_wrapsfcn“C”功能:BlockTypeSetup = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % % % %目的:% %设置外部引用% %的包装器函数生成的代码。% % %函数BlockTypeSetup(块,系统)输出% openfile走读生走读生空白builder_wrapsfcn_Outputs_wrapper (const real_T * in1, real_T *着干活);% closefile走读生% < LibCacheExtern(外来的)> % % % endfunction % %功能:输出= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % % % %目的:% % mdlOutputs函数代码生成规则。% % %函数输出(块,系统)输出/ * s函数“builder_wrapsfcn_wrapper”块:% <名称> * / %分配pu0 = LibBlockInputSignalAddr(0,”“、”“0) %分配py0 = LibBlockOutputSignalAddr(0,”“、”“0) %分配py_width = LibBlockOutputSignalWidth(0) %分配pu_width = LibBlockInputSignalWidth (0) builder_wrapsfcn_Outputs_wrapper (% < pu0 >, % < py0 >);% % % endfunction
使用遗留代码工具将遗留代码
一节C函数集成到仿真软件模型与遗留代码的工具金宝app在C”“写作S-Functions遗留代码显示了如何使用工具来创建一个包含的功能doubleIt.c
。对于一个脚本,该脚本执行的步骤在这个示例中,复制文件lct_wrapsfcn.m
你的工作目录。确保doubleIt.c
和doubleIt.h
文件在您的工作目录然后运行脚本通过输入lct_wrapsfcn
在MATLAB命令提示符。脚本创建并编译功能legacy_wrapsfcn.c
并创建了TLC文件legacy_wrapsfcn.tlc
通过以下命令。
% def = legacy_code创建数据结构(“初始化”);%填充数据结构def.SourceFiles = {' doubleIt.c '};def.HeaderFiles = {' doubleIt.h '};def.SFunctionName =“legacy_wrapsfcn”;def.OutputFcnSpec = '双日元= doubleIt(双u1)”;def.SampleTime = (1,0);%生成功能legacy_code (sfcn_cmex_generate, def);%编译MEX-file legacy_code(“编译”,def);%生成TLC-file legacy_code (sfcn_tlc_generate, def);
的功能legacy_wrapsfcn.c
由遗留代码生成工具首先包括doubleIt.h
头文件。的mdlOutputs
然后直接调用方法doubleIt.c
函数,如下:
静态孔隙mdlOutputs (SimStruct *年代,int_T tid){/ * *获得参数/输入/输出/ DWork /尺寸信息* / real_T * u1 = (real_T *) ssGetInputPortSignal (S, 0);real_T *日元= (real_T *) ssGetOutputPortSignal (S, 0);/ * *调用遗留代码函数* / *日元= doubleIt (* u1);}
遗留代码工具生成的功能不同于s函数生成器生成的功能如下:
生成的s函数s函数构建器调用遗留函数
doubleIt.c
通过包装器函数builder_wrapsfcn_wrapper.c
。遗留代码工具生成的s函数直接调用doubleIt.c
从它的mdlOutputs
方法。s函数构建器使用输入到输入和输出的名字数据属性面板,允许您定制这些名称的功能。遗留代码工具使用默认的名称
y
和u
分别为输出和输入。你不能指定要使用自定义名称的功能使用时遗留代码生成工具。s函数构建器和遗留代码工具都指定一个继承的样品时间,默认情况下。然而,s函数构建器使用一个偏移量的时间
0.0
而遗留代码工具指定偏移量是固定在小时间的步骤。
薄层色谱文件legacy_wrapsfcn.tlc
金宝app支持折叠通过定义表达式BlockInstanceSetup
和BlockOutputSignal
功能。薄层色谱文件还包含一个BlockTypeSetup
函数声明一个函数原型doubleIt.c
和一个输出
函数来告诉金宝app仿真软件编码器代码生成器如何内联调用doubleIt.c
。:
% %功能:BlockTypeSetup = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % % %函数BlockTypeSetup(块,系统)无效% % % %目标语言必须C %如果::GenCPP = = 1% < LibReportFatalError(“这功能由遗留代码生成工具必须只使用C目标语言”)> % endif % < LibAddToCommonIncludes (doubleIt.h) > % < LibAddToModelSources (doubleIt) > % % % endfunction % %功能:BlockInstanceSetup = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % % %函数BlockInstanceSetup(块,系统)无效% % % < LibBlockSetIsExpressionCompliant(块)> % % % endfunction % %功能:输出= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % % %(块,系统)输出函数输出% % %如果! LibBlockOutputSignalIsExpr(0) %分配u1_val = LibBlockInputSignal(0,”“、”“0) %分配y1_val = LibBlockOutputSignal (0,”“、”“0) % % % < y1_val = doubleIt (% < u1_val >);% % % % % % endif endfunction功能:BlockOutputSignal = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = % % %函数BlockOutputSignal(块,系统、portIdx ucv,液位控制阀,idx, retType)无效% % %分配u1_val = LibBlockInputSignal(0,”“、”“0) %分配y1_val = LibBlockOutputSignal(0,”“、”“0) % % %开关retType %例“信号”%如果portIdx = = 0%的回报”doubleIt (% < u1_val >)”%else %assign errTxt = "Block output port index not supported: %" %endif %default %assign errTxt = "Unsupported return type: % " % %endswitch %% %endfunction