主要内容

S-Functions把遗留的C代码

概述

C墨西哥人S-functions允许您调用现有的C代码在您的模型金宝app®模型。例如,考虑一个简单的C函数doubleIt.c输出值的两倍的价值函数的输入。

双doubleIt(双u){返回(u * 2.0);}

您可以创建一个函数调用doubleIt.c通过:

  • 编写一个包装器函数。使用这种方法,您的手编写一个新的C s函数和关联的TLC文件。这种方法最需要了解C s函数的结构。

  • 使用一个功能建筑块。使用此方法,您s函数的特征输入到一块对话框。这种方法不需要任何知识S-functions写作。然而,一个基本的了解功能的结构可以使s函数生成器对话框更容易使用。

  • 使用遗留代码的工具。你使用这个命令行方法,定义你的s函数的特点在MATLAB数据结构®工作区。此方法需要最少的S-functions知识。

你也可以调用外部C代码使用MATLAB仿真软件模型的功能块。金宝app更多信息见通过使用MATLAB功能块集成C代码

以下部分描述如何创建S-functions中使用的仿真软件模拟金宝app金宝app仿真软件编码器™代码生成,使用前面的三种方法。这个例子使用这些S-functions模型包含块。如果你计划来创建模型,复制文件doubleIt.cdoubleIt.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.tlcs函数生成器生成的类似于前面的手写版本。文件声明遗留功能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.cdoubleIt.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函数构建器使用输入到输入和输出的名字数据属性面板,允许您定制这些名称的功能。遗留代码工具使用默认的名称yu分别为输出和输入。你不能指定要使用自定义名称的功能使用时遗留代码生成工具。

  • s函数构建器和遗留代码工具都指定一个继承的样品时间,默认情况下。然而,s函数构建器使用一个偏移量的时间0.0而遗留代码工具指定偏移量是固定在小时间的步骤。

薄层色谱文件legacy_wrapsfcn.tlc金宝app支持折叠通过定义表达式BlockInstanceSetupBlockOutputSignal功能。薄层色谱文件还包含一个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