Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ブロック パラメーターの数値のインライン化

この例では、ブロック パラメーターの数値をインライン化して生成コードを最適化する方法を説明します。"ブロック パラメーター" には、Gain ブロックのゲイン パラメーター、n-D Lookup Table ブロックのテーブル データおよびブレークポイント セットが含まれます。

この最適化では、生成コードでブロックの数値パラメーターがグローバル メモリを占有するかどうかを指定します。最適化により、以下が実現されます。

  • 実行速度を向上させる。

  • RAM と ROM の消費を低減する。

モデル例の確認

モデル例 InlineBlockParameters を開き、生成されたブロック名を表示するよう設定します。

load_system('InlineBlockParameters')
set_param('InlineBlockParameters','HideAutomaticNames','off')
open_system('InlineBlockParameters')

このモデルには、次の数値パラメーターをもつブロックが含まれています。

  • Gain ブロックのゲイン パラメーター

  • Constant ブロックの定数値パラメーター

  • n-D Lookup Table ブロックのテーブル データおよびブレークポイント セット

ブロック G2 の出力と G2 よりも上流のブロックの出力は、シミュレーションまたはコードの実行時にブロック パラメーターの値を調整した場合にのみ変わります。モデル ブロック線図を更新すると、それらのブロックと信号線の色がマゼンタになります。

いくつかのブロックでは、ベース ワークスペースの Simulink.Parameter オブジェクトを使用してパラメーターの値を設定しています。それらのパラメーター オブジェクトではいずれもストレージ クラス Auto を使用しているため、パラメーターの値をインライン化するように生成コードを設定できます。

最適化を使用しないコードの生成

[コンフィギュレーション パラメーター]、[既定のパラメーター動作] を [Tunable] に設定して最適化を無効にします。

set_param('InlineBlockParameters','DefaultParameterBehavior','Tunable')

モデルからコードを生成します。

slbuild('InlineBlockParameters')
### Starting build procedure for: InlineBlockParameters
### Successful completion of build procedure for: InlineBlockParameters

Build Summary

Top model targets built:

Model                  Action                        Rebuild Reason                                    
=======================================================================================================
InlineBlockParameters  Code generated and compiled.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 15.122s

コード生成レポートで、ソース ファイル InlineBlockParameters_data.c を表示します。このコードは、ブロック パラメーターの値を格納するグローバル構造体を定義しています。ルックアップ テーブル配列、ブレークポイント セット、ゲインなど、モデル内の各ブロック パラメーターが構造体のフィールドとして表されています。

cfile = fullfile(...
    'InlineBlockParameters_grt_rtw','InlineBlockParameters_data.c');
coder.example.extractLines(cfile,'/* Block parameters (default storage) */', '};', 1, 1);
/* Block parameters (default storage) */
P_InlineBlockParameters_T InlineBlockParameters_P = {
  /* Variable: MAX_LIFT
   * Referenced by: '<Root>/Constant'
   */
  10.0,

  /* Variable: SLIDER_POS
   * Referenced by: '<Root>/Constant1'
   */
  0.0,

  /* Variable: T1Break
   * Referenced by: '<Root>/1D Lookup'
   */
  { -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 },

  /* Variable: T1Data
   * Referenced by: '<Root>/1D Lookup'
   */
  { -1.0, -0.99, -0.98, -0.96, -0.76, 0.0, 0.76, 0.96, 0.98, 0.99, 1.0 },

  /* Variable: T2Break
   * Referenced by: '<Root>/2D Lookup'
   */
  { 1.0, 2.0, 3.0 },

  /* Variable: T2Data
   * Referenced by: '<Root>/2D Lookup'
   */
  { 4.0, 16.0, 10.0, 5.0, 19.0, 18.0, 6.0, 20.0, 23.0 },

  /* Expression: 2
   * Referenced by: '<Root>/G1'
   */
  2.0,

  /* Expression: -2
   * Referenced by: '<Root>/G2'
   */
  -2.0,

  /* Computed Parameter: uDLookup_maxIndex
   * Referenced by: '<Root>/2D Lookup'
   */
  { 2U, 2U }
};

これらの構造体フィールドはグローバル メモリを占有するため、コード実行時に調整することができます。ただし、ブロック G2 や上流のブロックの出力など、各ブロックの出力については、生成されたコード アルゴリズムの各ステップで計算しなければなりません。ファイル InlineBlockParameters.c にあるモデルの関数 step のアルゴリズムを表示します。

cfile = fullfile('InlineBlockParameters_grt_rtw','InlineBlockParameters.c');
coder.example.extractLines(...
    cfile,'/* Model step function */','/* Model initialize function */',1,0);
/* Model step function */
void InlineBlockParameters_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Constant: '<Root>/Constant'
   *  Constant: '<Root>/Constant1'
   *  Gain: '<Root>/G1'
   *  Gain: '<Root>/G2'
   *  Inport: '<Root>/In1'
   *  Lookup_n-D: '<Root>/1D Lookup'
   *  Lookup_n-D: '<Root>/2D Lookup'
   *  Sum: '<Root>/Sum'
   */
  InlineBlockParameters_Y.Out1 = InlineBlockParameters_P.G1_Gain *
    InlineBlockParameters_U.In1 + InlineBlockParameters_P.G2_Gain * look2_binlx
    (InlineBlockParameters_P.MAX_LIFT, look1_binlx
     (InlineBlockParameters_P.SLIDER_POS, InlineBlockParameters_P.T1Break,
      InlineBlockParameters_P.T1Data, 10U), InlineBlockParameters_P.T2Break,
     InlineBlockParameters_P.T2Break, InlineBlockParameters_P.T2Data,
     InlineBlockParameters_P.uDLookup_maxIndex, 3U);
}

最適化を使用したコードの生成

[既定のパラメーター動作] を [Inlined] に設定します。

set_param('InlineBlockParameters','DefaultParameterBehavior','Inlined')

モデルからコードを生成します。

slbuild('InlineBlockParameters')
### Starting build procedure for: InlineBlockParameters
### Successful completion of build procedure for: InlineBlockParameters

Build Summary

Top model targets built:

Model                  Action                        Rebuild Reason                     
========================================================================================
InlineBlockParameters  Code generated and compiled.  Global variable MAX_LIFT changed.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 13.386s

コード生成レポートで、ファイル InlineBlockParameters.c のアルゴリズムを表示します。

coder.example.extractLines(...
    cfile,'/* Model step function */','/* Model initialize function */',1,0);
/* Model step function */
void InlineBlockParameters_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/G1'
   *  Inport: '<Root>/In1'
   *  Sum: '<Root>/Sum'
   */
  InlineBlockParameters_Y.Out1 = 2.0 * InlineBlockParameters_U.In1 + 150.0;
}

このコードは、ブロック パラメーターや、ストレージ クラス Auto を使用するパラメーター オブジェクトに対してメモリを割り当てていません。代わりに、このコード ジェネレーターでは、モデルおよびパラメーター オブジェクトのパラメーター値を使用してブロック G2 の出力を計算し、その定数 150.0 をインライン化しています。また、このジェネレーターでは、Gain ブロック G1 の [ゲイン] パラメーターの値 2.0 もインライン化しています。

この最適化により、ルックアップ テーブルなどのブロックに対する計算量が多いアルゴリズム コードが生成コードから排除されます。最適化されたコードでは、実行時に出力が変わる可能性がある場合にのみブロックの出力が計算されます。このモデルの場合、出力が変わる可能性があるのは Inport ブロック In1、Gain ブロック G1、Sum ブロックだけです。

モデルおよびコード生成レポートを閉じます。

bdclose('InlineBlockParameters')

ブロック パラメーターの調整可能性の保持

[既定のパラメーター動作] を [Inlined] に設定すると、個々のパラメーターに Simulink.Parameter オブジェクトを作成してブロック パラメーターの調整可能性を保持できます。グローバル パラメーター構造体の調整可能なフィールドまたは個々のグローバル変数としてコードに表示されるように各オブジェクトを構成できます。これにより、コード実行中にパラメーター値を変更し、生成されたコードと独自の手書きコードのインターフェイスを取ることができます。詳細については、生成されたコードにおける調整可能なキャリブレーション パラメーターの作成を参照してください。

インライン不変信号

[インライン不変信号] コード生成オプション (これは生成されたコードに定数値も埋め込みます) を選択できるのは、[既定のパラメーター動作] が [Inlined] に設定されているときだけです。インライン不変信号を参照してください。

参考

関連するトピック