通过使用s函数,您可以内联更复杂的s函数mdlRTW
常规。的mdlRTW
例程通过创建用于TLC文件的非可调参数的参数记录,向代码生成过程提供关于如何内联s -函数的更多信息。的mdlRTW
在常规的地方信息
文件。的模型
.rtwmdlRTW
函数在文本文件中描述
.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-函数,要么全内联的查找表的代码或要求查找表算法包装函数。
RTWdata
是块的一个属性,目标语言编译器在内联s函数时可以使用它。RTWdata
是,你可以连接到一个块特征向量的结构。RTWdata
保存与模型,并放置在
文件在生成代码时。例如,这一套MATLAB®命令:模型
.rtw
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
真正的。如果是扩展数据
矢量被均匀地间隔开,XDataEvenlySpaced
是1.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
从用户数据
而不是叫mxGetPr
MATLAB API函数。
代码生成器调用mdlRTW
例程,同时生成
文件。要为您的Simulink模型生成最佳代码,您可以将信息添加到金宝app模型
.rtw
关于S-Function块运行的模式的文件。模型
.rtw
的参数设置
文件。参数设置在执行过程中不会改变。在这种情况下模型
.rtwXDataEvenlySpaced
s函数参数在执行过程中不能改变(ssSetSFcnParamTunable
被指定为假(0
在…内mdlInitializeSizes
).参数设置(XSpacing
)使用函数ssWriteRTWParamSettings
.
因为XDATA
和YDATA
中是否注册为运行时参数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 -功能块和值UnEvenlySpaced
为XSpacing
参数用于底部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; } ...