Main Content

MATLAB Function ブロックを含むマスク ライブラリ サブシステムを使用したシミュレーションの実行とコードの生成

この例では、MATLAB Function ブロックを含むマスク ライブラリ サブシステムを使用したシミュレーションの実行方法と C コードの生成方法を示します。関数のコード、サブシステム、またはマスク プロパティに対する編集はモデル内のブロックのすべてのインスタンスに影響しますが、マスク パラメーターに対する変更は選択したブロックにのみ影響します。マスク ライブラリ ブロックは、コードを生成できるカスタム ブロックの複製が必要な場合に使用します。詳細については、カスタム ライブラリの作成およびカスタム ブロックの設計と作成を参照してください。

モデルのナビゲート

マスク サブシステムには、関数 conv を使用して 2 つの入力ベクトルの畳み込みを計算する MATLAB Function ブロックが含まれています。マスク パラメーター "shape" を使用して、正規化の重みを fullsame、または valid に変更できます。ブロックで畳み込みの計算に使用される MATLAB® コードは次のとおりです。

function c = my_conv(a, b, shape)
if shape == 1
    c = conv(a, b, "full");
elseif shape == 2
    c = conv(a, b, "same");
else
    c = conv(a, b, "valid");
end

このモデルでは、"shape" パラメーターが上のブロックのインスタンスは full、中央のインスタンスは same、下のインスタンスは valid に設定されています。シミュレーションを実行して、ベクトルの畳み込みを計算し、その値を Display ブロックで表示します。

上の 2 つのブロック インスタンスでは、畳み込みの計算に使用する重みがブロックごとに異なるため、異なるベクトル サイズが出力されます。いずれかのブロックの "shape" パラメーターを変更し、再度シミュレーションを実行して出力の変化を確認します。

モデルからの C コードの生成

Embedded Coder® または Simulink® Coder™ のライセンスがある場合は、この例からパラメーターやブロックを変更せずにコードを生成できます。ただし、MATLAB Function ブロックでは、MATLAB 関数の限られたサブセットについてしかコード生成がサポートされません。詳細については、C/C++ コードの生成でサポートされている関数およびオブジェクト (MATLAB Coder)を参照してください。

ライブラリ ブロックの複数のインスタンスでパラメーターおよび入力が同じである場合、同一の各 MATLAB Function ブロックを表す再利用可能な関数を使用してコードを生成できます。この動作を有効にするには、MATLAB Function ブロックを右クリックして [ブロック パラメーター (Subsystem)] をクリックし、[コード生成] タブを開きます。[関数のパッケージ化]Reusable function に設定します。詳細については、モデル間で共有されるライブラリ サブシステムからの再利用可能なコードの生成 (Simulink Coder)を参照してください。

Embedded Coder アプリまたは Simulink Coder アプリを開き、[コード生成] をクリックしてコードを生成します。このモデルでは、ブロック インスタンスごとに固有の C 関数が生成されます。再利用可能な関数を生成するには、各ライブラリ サブシステム インスタンスの "shape" パラメーターを full に設定してコードを生成します。my_conv_filter インスタンスと my_conv_filter1 インスタンスはブロック入力およびマスク パラメーター値が同じであるため、生成されたコードでそれらのロジックが再利用されます。

   /*
    * Output and update for atomic system:
    *    '<S1>/MATLAB Function'
    *    '<S2>/MATLAB Function'
    */
   void MLFB_model_MATLABFunction(const real_T rtu_a[2], const
     real_T rtu_b[5], real_T rty_c[6])
   {
     int32_T b_k;
     int32_T i;
     for (i = 0; i < 6; i++) {
       rty_c[i] = 0.0;
     }
     for (i = 0; i < 2; i++) {
       for (b_k = 0; b_k < 5; b_k++) {
         int32_T tmp;
         tmp = i + b_k;
         rty_c[tmp] += rtu_a[i] * rtu_b[b_k];
       }
     }
   }

my_conv_filter2 インスタンスは異なる入力を使用するため、別の関数が使用されます。

   /* Output and update for atomic system: '<S3>/MATLAB Function' */
   void MLFB_model_MATLABFunction_p(const real_T rtu_a[3], const
     real_T rtu_b[3], real_T rty_c[5])
   {
     int32_T i;
     for (i = 0; i < 5; i++) {
       rty_c[i] = 0.0;
     }
     for (i = 0; i < 3; i++) {
       rty_c[i] += rtu_b[i] * rtu_a[0];
       rty_c[i + 1] += rtu_b[i] * rtu_a[1];
       rty_c[i + 2] += rtu_b[i] * rtu_a[2];
     }
   }

参考

|

関連するトピック