このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
功能mdlRTW
ルーチンを使用することで,より複雑なs函数をインライン化できます。mdlRTW
ルーチンにより,TLCファイルで使用する調整できないパラメーターのパラメーターレコードを作成することによって,s函数のインライン方法に関する詳細情報をコード生成プロセスに対して提供します。mdlRTW
ルーチンは情報を
ファイルに配置します。関数模型
.rtwmdlRTW
は,テキストファイル
に記述されます。matlabroot
/金宝app模型/ src /sfuntmpl_doc.c
関数mdlRTW
を使用するには,直接インデックスルックアップs函数を作成する手順に従います。ルックアップテーブルとは,順序付けられた関数データ点の集まりです。通常,これらのテーブルでは,いくつかの内挿法を用いて既知のデータ点間にある関連した関数の近似値が求められます。ルックアップテーブルアルゴリズムの例を仿真软金宝app件®モデルに組み込むために,まず,関数mdlOutputs
でアルゴリズムを実行するs函数を記述します。最も効率的なコードを生成するために,次に,対応するTLCファイルを作成して計算オーバーヘッドを取り除き,ルックアップの計算速度を高めます。
金宝app仿真软件製品は1次元,二次元,およびn次元の汎用のルックアップアルゴリズムに対するサポートを提供します。これらのアルゴリズムをそのまま使用することも,必要に応じてカスタムのルックアップテーブルs函数を作成することもできます。1次元のルックアップs函数sfun_directlook.c
と,これに対応するインライン化sfun_directlook.tlc
ファイルを作成できます(詳細については,目标语言编译器を参照)。次のことが可能です。
s函数パラメーターのエラーをチェックする。
モデルの実行中に変更されないs函数の情報をキャッシュする。
関数mdlRTW
を使用してコードジェネレーターをカスタマイズし,指定された一連のブロックパラメーターに最適なコードを生成する。
ルックアップテーブルのコードの完全インライン化,または,ルックアップテーブルアルゴリズムのラッパー関数の呼び出しのいずれかのs函数用に薄层色谱
ファイルを作成する。
RTWdata
はブロックのプロパティで,s函数のインライン化時に目标语言编译器で使用できます。RTWdata
はブロックに接続できる文字ベクトルの構造体です。RTWdata
はモデルと共に保存され,コードの生成時に
ファイルに配置されます。たとえば,この一連のMATLAB®コマンドは次のとおりです。模型
.rtw
mydata。field1 =“field1信息”;mydata。field2 =“field2信息”;set_param (gcb),“RTWdata”, mydata) get_param (gcb,“RTWdata”)
次の結果が生成されます。
ans = field1:“field1信息”field2:“field2信息”
ファイル内で関連付けられているs函数ブロックの情報は次のとおりです。模型
.rtw
Block {Type "S-Function" RTWdata {field1" info for field1" field2" information for field2"}
メモ
RTWdata
は,ライブラリにリンクされていないs函数のモデルファイルに保存されます。ただし,RTWdata
は,ライブラリにリンクされているs函数ブロックでは保持されません。
金宝app仿真软件ライブラリで提供される1次元のルックアップテーブルブロックでは,出力の計算時に内挿や外挿が使用されます。次の例では,現在の入力(xデータ)点に基づいて出力ベクトル(yデータベクトル)に直接インデックスを付けるルックアップテーブルを作成します。
この直接1次元ルックアップの例では,xデータベクトルとyデータベクトルの形式でデータ点のペア(x, y)が指定され,x = x0における部分的に既知の関数f (x)の近似解p (x)を計算します。指定されるデータペア(iのペアなど)では,y_i = f (x_i)です。xデータの値は単調増加することとします。x0がxデータベクトルの範囲外にあると,最初または最後の点が返されます。
s函数のパラメーターは次のようになります。
XData、YData XEvenlySpaced
XData
とYData
は未知の関数の値を表す同じ長さの倍精度ベクトルです。XDataEvenlySpaced
はスカラーであり、虚假の場合は0.0
,真正的の場合は1.0
です。XData
ベクトルが等間隔である場合,XDataEvenlySpaced
は1.0
となり,より効率的なコードが生成されます。
このグラフでは,パラメーターXData = [1:6]
とYData =[1、2、7、4、5、9)
の処理方法を説明します。たとえば,s函数ブロックの入力(x値)が3の場合,出力(y値)は7になります。
TLCファイルで直接インデックスs函数をインライン化することによって,ルックアップテーブルを向上させます。この直接インデックスルックアップテーブルs函数でTLCファイルは必要ありません。次の例では,直接インデックスルックアップテーブルs函数にTLCファイルを使用して,コードサイズを縮小して生成コードの効率を上げます。
インライン化されたTLCファイルで直接インデックスアルゴリズムを実装するには,s函数メインモジュール,sfun_directlook.c
と対応するlookup_index.c
モジュールが必要です。lookup_index.c
モジュールには関数GetDirectLookupIndex
が含まれています。この関数は,XData
が等間隔ではないときに現在のx
入力値に対するXData
のインデックスを求めるために使用されます。GetDirectLookupIndex
ルーチンは,s函数と生成コードから呼び出されます。この例では,金宝app仿真软件墨西哥人ファイルと生成コードでC / c++コードを共有するためにラッパーの概念を使用します。
XData
が等間隔である場合,s函数メインモジュールと生成コードの両方には,指定されたx値のy値を計算するためのルックアップアルゴリズムが含まれます。これは,アルゴリズムが短いからです。
インライン化されたTLCファイルはsfun_directlook.tlc
で,ラッパーの呼び出しを実行するか,s函数の最適なC / c++コードを組み込むために使用されます(mdlRTWの使用の例を参照してください)。
sfun_directlook.tlc
では,mdlCheckParameters
ルーチンは次の内容を検証します。
新しいパラメーター設定は有効である。
XData
とYData
は有限実数を含んでいる同じ長さのベクトルである。
XDataEvenlySpaced
はスカラー値である。
XData
ベクトルは単調増加のベクトルであり,等間隔に分布している。
関数mdlInitializeSizes
は,s函数に渡されるパラメーターの数を確認すると,明示的にmdlCheckParameters
を呼び出します。金宝app仿真软件エンジンはmdlInitializeSizes
を呼び出した後,パラメーターの変更やその再評価のたびにmdlCheckParameters
を呼び出します。
sfun_directlook.tlc
では,mdlStart
ルーチンは,シミュレーション中(または生成コードの実行中)にも変わらない情報をキャッシュする方法を示します。例では,SimStruct
のフィールドである用户数据
のXDataEvenlySpaced
パラメーターの値をキャッシュします。以下のmdlInitializeSizes
の行によって,XDataEvenlySpaced
への変更は認められないということが仿金宝app真软件エンジンに指示されます。
ssSetSFcnParamTunable (S iParam SS_PRM_NOT_TUNABLE);
実行中、mdlOutputs
はmxGetPr
MATLAB API関数を呼び出さずに用户数据
からXDataEvenlySpaced
の値にアクセスします。
コードジェネレーターは,
ファイルの生成中にルーチン模型
.rtwmdlRTW
を呼び出します。金宝app仿真软件に最適なコードを生成するために,s函数ブロックが動作するモードに関する情報を
ファイルに追加することができます。模型
.rtw
この例では,パラメーターの設定を
ファイルに追加します。パラメーターの設定内容が実行中に変化することはありません。今回、模型
.rtwXDataEvenlySpaced
s函数パラメーターは実行中に変化しません(ssSetSFcnParamTunable
は,mdlInitializeSizes
のパラメーターでfalse (0
)として指定されました)。パラメーター設定(XSpacing
)は関数ssWriteRTWParamSettings
を使用します。
xData
とyData
はmdlSetWorkWidths
でランタイムパラメーターとして登録されているため,コードジェネレーターは自動的に
ファイルに書き込みます。模型
.rtw
s函数およびインライン化TLCファイルを調査する前に,このモデルの生成コードを検討してください。
モデルは,上部のs函数ブロックでは等間隔のXData
を使用し,下部のs函数ブロックでは等間隔ではないXData
を使用します。このモデルを作成するときは,各功能ブロックに次のコマンドを指定します。
set_param (“sfun_directlook_ex / s函数”,“SFunctionModules”,“lookup_index”) set_param (“sfun_directlook_ex / S-Function1”,“SFunctionModules”,“lookup_index”)
このビルドプロセスでは実行可能ファイルの作成時にモジュールlookup_index.c
を使用します。
このモデルのコードを生成する際,コードジェネレーターはs函数mdlRTW
メソッドを使用して
ファイルを生成します。このとき,上部功能ブロックの模型
.rtwXSpacing
パラメーターには値EvenlySpaced
が,下部功能ブロックのXSpacing
パラメーターには値UnEvenlySpaced
が使用されます。薄层色谱ファイルは、XSpacing
の値を使用して生成コードに含めるアルゴリズムを決定します。生成コードはXData
が等間隔であればルックアップアルゴリズムを含みますが,XData
が等間隔でないときには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-function块的内联代码*//* S-Function (sfun_directlook): ' /S-Function' */ {const real_T *xData = sfun_directlook_ex_const_sfunction_xdata;const real_T *yData = sfun_directlook_ex_const_sfunction_ydata;real_T spacing = xData[1] - xData[0];if (rtb_SFunction1 <= xData[0]) {rtb_SFunction1 = yData[0];} else if (rtb_SFunction1 >= yData[20]) {rtb_SFunction = yData[20];} else {int_T idx = (int_T)((rtb_SFunction1 - xData[0]) / spacing);rtb_SFunction = yData [idx];}} /* Outport: ' /Out1' */ sfun_directlook_ex_Y. txt . txt着干活= 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; } ...