主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

mdlRTWルーチンでの完全インライン化功能の記述

功能mdlRTWルーチンを使用することで,より複雑なs函数をインライン化できます。mdlRTWルーチンにより,TLCファイルで使用する調整できないパラメーターのパラメーターレコードを作成することによって,s函数のインライン方法に関する詳細情報をコード生成プロセスに対して提供します。mdlRTWルーチンは情報を模型.rtwファイルに配置します。関数mdlRTWは,テキストファイル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函数用に薄层色谱ファイルを作成する。

s函数RTWdata

RTWdataはブロックのプロパティで,s函数のインライン化時に目标语言编译器で使用できます。RTWdataはブロックに接続できる文字ベクトルの構造体です。RTWdataはモデルと共に保存され,コードの生成時に模型.rtwファイルに配置されます。たとえば,この一連のMATLAB®コマンドは次のとおりです。

mydata。field1 =“field1信息”;mydata。field2 =“field2信息”;set_param (gcb),“RTWdata”, mydata) get_param (gcb,“RTWdata”

次の結果が生成されます。

ans = field1:“field1信息”field2:“field2信息”

模型.rtwファイル内で関連付けられているs函数ブロックの情報は次のとおりです。

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データの値は単調増加することとします。x0xデータベクトルの範囲外にあると,最初または最後の点が返されます。

s函数のパラメーターは次のようになります。

XData、YData XEvenlySpaced

XDataYDataは未知の関数の値を表す同じ長さの倍精度ベクトルです。XDataEvenlySpacedはスカラーであり、虚假の場合は0.0,真正的の場合は1.0です。XDataベクトルが等間隔である場合,XDataEvenlySpaced1.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ルーチンは次の内容を検証します。

  • 新しいパラメーター設定は有効である。

  • XDataYDataは有限実数を含んでいる同じ長さのベクトルである。

  • XDataEvenlySpacedはスカラー値である。

  • XDataベクトルは単調増加のベクトルであり,等間隔に分布している。

関数mdlInitializeSizesは,s函数に渡されるパラメーターの数を確認すると,明示的にmdlCheckParametersを呼び出します。金宝app仿真软件エンジンはmdlInitializeSizesを呼び出した後,パラメーターの変更やその再評価のたびにmdlCheckParametersを呼び出します。

ユーザーデータのキャッシュ

sfun_directlook.tlcでは,mdlStartルーチンは,シミュレーション中(または生成コードの実行中)にも変わらない情報をキャッシュする方法を示します。例では,SimStructのフィールドである用户数据XDataEvenlySpacedパラメーターの値をキャッシュします。以下のmdlInitializeSizesの行によって,XDataEvenlySpacedへの変更は認められないということが仿金宝app真软件エンジンに指示されます。

ssSetSFcnParamTunable (S iParam SS_PRM_NOT_TUNABLE);

実行中、mdlOutputsmxGetPrMATLAB API関数を呼び出さずに用户数据からXDataEvenlySpacedの値にアクセスします。

mdlRTWの使用

コードジェネレーターは,模型.rtwファイルの生成中にルーチンmdlRTWを呼び出します。金宝app仿真软件に最適なコードを生成するために,s函数ブロックが動作するモードに関する情報を模型.rtwファイルに追加することができます。

この例では,パラメーターの設定を模型.rtwファイルに追加します。パラメーターの設定内容が実行中に変化することはありません。今回、XDataEvenlySpaceds函数パラメーターは実行中に変化しません(ssSetSFcnParamTunableは,mdlInitializeSizesのパラメーターでfalse (0)として指定されました)。パラメーター設定(XSpacing)は関数ssWriteRTWParamSettingsを使用します。

xDatayDatamdlSetWorkWidthsでランタイムパラメーターとして登録されているため,コードジェネレーターは自動的に模型.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メソッドを使用して模型.rtwファイルを生成します。このとき,上部功能ブロックのXSpacingパラメーターには値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; } ...

関連するトピック