文件

用mdlRTW例程编写完全内联的s -函数

通过使用s函数,您可以内联更复杂的s函数mdlRTW常规。的mdlRTW例程通过创建用于TLC文件的非可调参数的参数记录,向代码生成过程提供关于如何内联s -函数的更多信息。的mdlRTW在常规的地方信息模型.rtw文件。的mdlRTW函数在文本文件中描述matlabroot/金宝app Simulink的/ SRC /sfuntmpl_doc.c

用来mdlRTW函数,请执行步骤创建直接索引查找s函数。查找表是函数的有序数据点的集合。通常,这些表使用一些插值方案来近似已知数据点之间的相关函数值。将查找表算法示例合并到Simulink中金宝app®模型中,第一步骤是写一个S函数,在执行该算法mdlOutputs.为了产生最有效的代码,下一个步骤是创建一个相应TLC文件以消除计算开销和提高查找计算的速度。

在Sim金宝appulink产品提供了用于两个通用查找1-d金宝app和2-d算法的支持。因为他们可以使用这些算法或创建一个自定义查找表S-功能,以满足您的要求。您可以创建一个1-d查找S-功能,sfun_directlook.c.,及其相应的内联sfun_directlook.tlc文件(见目标语言编译器更多细节)。你可以:

  • 的S-功能参数错误校验。

  • 缓存信息,该模型在执行过程中不改变S-功能。

  • 使用mdlRTW函数自定义代码生成器,以便为给定的一组块参数生成最优代码。

  • 创建一个TLC.文件的S-函数,要么全内联的查找表的代码或要求查找表算法包装函数。

s函数RTWdata

RTWdata是块的一个属性,目标语言编译器在内联s函数时可以使用它。RTWdata是,你可以连接到一个块特征向量的结构。RTWdata保存与模型,并放置在模型.rtw文件在生成代码时。例如,这一套MATLAB®命令:

mydata。field1 =“信息字段1为”;mydata。field2 =“信息字段2”;set_param (gcb),“RTWdata”, mydata) get_param (gcb,“RTWdata”

产生这一结果:

ANS = FIELD1:“信息字段1为”field2:“信息字段2”

对于内的相关联的S-功能块中的信息模型.rtw文件是:

块{类型 “S函数” RTWdata {field1的 “信息字段1” FIELD2 “为FIELD2信息”}

请注意

RTWdata保存在模型文件中,用于未链接到库的s -函数。然而,RTWdata不持久用于链接到库的S-Function块。

直接索引查找表算法

Simulink库中提供的一维查找表块在计算输出时使用插值或外推法。金宝app在本例中,您创建了一个查找表,它直接对输出向量(y-data向量)基于当前输入(x-数据点。

这种直接1-d查找例计算的近似解p (x)到一个部分已知的函数F(X)x = x0,给定的数据点对(x,y)以…的形式x-数据向量和ay拼向量。对于给定的数据对(例如i两人),y_i = f (x_i).假设x- 数据值是单调递增。如果X0.是在?的范围之外x- 数据向量,则返回第一个或最后一个点。

s函数的参数为:

XData、YData XEvenlySpaced

扩展数据YDATA是表示未知函数值的等长双向量。XDataEvenlySpaced是一个标量,0.0假,1.0真正的。如果是扩展数据矢量被均匀地间隔开,XDataEvenlySpaced1.0并产生更有效的代码。

该图显示了如何参数扩展数据= [1:6]YData =[1、2、7、4、5、9)被处理。例如,如果输入(x- 值)的S-功能块3,输出(y值)7。

直接索引查询表示例

通过内嵌一个直接指标S-功能与TLC文件提高了查找表。这直接索引查找表S-功能不需要TLC文件。该示例使用了直接索引查找表S-功能,以减少产生的代码的代码大小和增加效率的TLC文件。

使用内联TLC文件实现直接索引算法需要S-function主模块,sfun_directlook.c.和一个相应的lookup_index.c模块。的lookup_index.c模块包含GetDirectLookupIndex函数,该函数用于定位扩展数据当前x输入值时扩展数据间隔是不均匀的。的GetDirectLookupIndex例程从s函数和生成的代码中调用。该示例使用包装器概念在Simulink mex文件和生成的代码之间共享C/ c++代码。金宝app

如果是扩展数据被均匀地间隔开,那么无论是S-功能主模块和所述生成的代码包含查找算法来计算y- 值给定的x-VALUE因为算法是短暂的。

内联TLC文件sfun_directlook.tlc,其用于执行任一个包装呼叫或嵌入的最佳C / C ++用于S-功能代码。(参见示例中mdlRTW用法).

误差处理

sfun_directlook.tlc,mdlCheckParameters常规验证是:

  • 新参数设置有效。

  • 扩展数据YDATA是含有真实的,有限的数字相同长度的向量。

  • XDataEvenlySpaced是一个标量。

  • 扩展数据向量是单调递增的等间距向量。

mdlInitializeSizes功能明确要求mdlCheckParameters在它验证传递给s函数的参数数量之后。在Simulink引金宝app擎调用之后mdlInitializeSizes,然后调用mdlCheckParameters当您更改参数或重新计算它们时。

用户数据缓存

sfun_directlook.tlc,mdlStart例程显示如何缓存而生成的代码正在执行不在模拟期间改变或信息。该示例缓存的值XDataEvenlySpaced参数in.用户数据,一个领域的酝酿.下面一行mdlInitializeSizes指示Simulink引擎禁止金宝app更改XDataEvenlySpaced

ssSetSFcnParamTunable (S iParam SS_PRM_NOT_TUNABLE);

在执行期间,mdlOutputs访问的值XDataEvenlySpaced用户数据而不是叫mxGetPrMATLAB API函数。

mdlRTW用法

代码生成器调用mdlRTW例程,同时生成模型.rtw文件。要为您的Simulink模型生成最佳代码,您可以将信息添加到金宝app模型.rtw关于S-Function块运行的模式的文件。

的参数设置模型.rtw文件。参数设置在执行过程中不会改变。在这种情况下XDataEvenlySpaceds函数参数在执行过程中不能改变(ssSetSFcnParamTunable被指定为假(0在…内mdlInitializeSizes).参数设置(XSpacing)使用函数ssWriteRTWParamSettings

因为XDATAYDATA中是否注册为运行时参数mdlSetWorkWidths,代码生成器写入模型.rtw自动文件。

在检查s函数和内联TLC文件之前,考虑为这个模型生成的代码。

模型使用均匀间隔扩展数据在顶部的s -函数块和不均匀间隔扩展数据在s功能块的底部。在创建此模型时,为每个S-Function块指定以下命令。

set_param ('sfun_directlook_ex / S-函数'“SFunctionModules”“lookup_index”) set_param ('sfun_directlook_ex / S-功能1'“SFunctionModules”“lookup_index”

构建流程使用该模块lookup_index.c当创建可执行文件时。

当该模型生成代码,代码生成器使用S-功能mdlRTW方法来生成一个模型.rtw与值文件均匀分布的XSpacing参数为顶部s -功能块和值UnEvenlySpacedXSpacing参数用于底部s -函数块。tlc文件使用的值XSpacing以确定在生成的代码中包含什么算法。生成的代码包含查找算法扩展数据是等间距的,但叫GetDirectLookupIndex常规的时扩展数据间隔是不均匀的。生成的模型.c模型.cpp.查找表示例模型的代码类似于下面的代码:

/* * sfun_directlook_ex.c * * Simulink模型的代码生成* "sf金宝appun_directlook_ex.slx"。*……*/ #include "sfun_directlook_ex.h" #include "sfun_directlook_ex_private.h" /*外部输出(由自动存储信号提供的根输出)*/ ExtY_sfun_directlook_ex_T sfun_directlook_ex_Y;/*实时模型*/ RT_MODEL_sfun_directlook_ex_T sfun_directlook_ex_M_;RT_MODEL_sfun_directlook_ex_T *const sfun_directlook_ex_M = &sfun_directlook_ex_M_;/*模型输出函数*/ void sfun_directlook_ex_output(void){/*局部块i/o变量*/ real_T rtb_SFunction;real_T rtb_SFunction1;/* Sin: '/Sine Wave' */ rtb_SFunction1 = Sin (sfun_directlook_ex_M->Timing.t[0]);/ *代码被内联在* sfun_directlook_ex模型顶端S-功能块* // * S-功能(sfun_directlook): '<根> / S-函数' * / {常量real_T * XDATA = sfun_directlook_ex_ConstP.SFunction_XData;常量real_T * YDATA = sfun_directlook_ex_ConstP.SFunction_YData;real_T间距= XDATA [1]  -  XDATA [0];如果(rtb_SFunction1 <= XDATA [0]){rtb_SFunction = YDATA [0];}否则如果(rtb_SFunction1> = YDATA [20]){rtb_SFunction = YDATA [20];}否则{int_T IDX =(int_T)((rtb_SFunction1  -  XDATA [0])/间距);rtb_SFunction = YDATA [IDX];}} / * OUTPORT: '<根> /输出1' * / sfun_directlook_ex_Y.Out1 = rtb_SFunction;/* sfun_directlook_ex模型中底部S-function块的内联代码*//* S-Function (sfun_directlook): '/S-Function1' */ {const real_T *xData = sfun_directlook_ex_const_sfunction1_xdata;const real_T *yData = sfun_directlook_ex_const_sfunction1_ydata;int_T idx;idx = GetDirectLookupIndex(xData, 5, rtb_SFunction1);rtb_SFunction1 = yData [idx];} /* Outport: '/Out2' */ sfun_directlook_ex_Y. txt . txtOut2 = rtb_SFunction1;} / *模型更新函数* /空白sfun_directlook_ex_update (void){/ *信号主要停止模拟* /{/ *样品时间:[0.0,0.0 s] * /如果((rtmGetTFinal (sfun_directlook_ex_M) ! = 1) & & ! ((rtmGetTFinal (sfun_directlook_ex_M) -sfun_directlook_ex_M - > Timing.t [0]) > sfun_directlook_ex_M - >时机。t[0] * (DBL_EPSILON)) {rtmSetErrorStatus(sfun_directlook_ex_M, "仿真完成");}} /*更新基本速率的绝对时间*/ /*“clockTick0”计算这个任务的代码被执行的次数。绝对时间是“clockTick0”*和“Timing.stepSize0”的乘积。“clockTick0”的大小确保计时器在选定的应用程序生命周期内不会*溢出。 * Timer of this task consists of two 32 bit unsigned integers. * The two integers represent the low bits Timing.clockTick0 and the high bits * Timing.clockTickH0. When the low bit overflows to 0, the high bits increment. */ if (!(++sfun_directlook_ex_M->Timing.clockTick0)) { ++sfun_directlook_ex_M->Timing.clockTickH0; } sfun_directlook_ex_M->Timing.t[0] = sfun_directlook_ex_M->Timing.clockTick0 * sfun_directlook_ex_M->Timing.stepSize0 + sfun_directlook_ex_M->Timing.clockTickH0 * sfun_directlook_ex_M->Timing.stepSize0 * 4294967296.0; } ...

相关的话题