Main Content

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

Waveform Generator ブロックでのコードの実行中の出力波形間の切り替え

この例では、コードの実行中にスティミュラス波形間を切り替えられるようにするコードの生成方法を示します。

Waveform Generator ブロックでは、生成されたコードで、振幅や位相シフトなどの波形のパラメーターを調整可能にすることはできません。代わりに、ブロック内で指定する波形バリアントのセットからアクティブな波形を選択できるようにするコードを生成できます。コードの実行中に、グローバル構造体のフィールドの値を調整して、バリアントをアクティブにします。

モデル コンフィギュレーション パラメーター [既定のパラメーター動作] を [Tunable] に設定しなければなりません。そうすると、既定では、モデルのブロック パラメーターが、生成されたコード内で調整可能として表示されます。これらのパラメーターは、大きいモデルでは大量のメモリを消費する可能性があります。

ex_switch_waveform モデルを作成します。

open_system('ex_switch_waveform')

Waveform Generator ブロックで、この波形を次のように構成します。

square(amp,10,0,dutyCycle)

ベース ワークスペースで、変数 amp および変数 dutyCycle を作成します。

amp = 2.71;
dutyCycle = 50;

この波形は、実行の開始時にアプリケーションが使用するベースライン スティミュラスを表しています。

実行中に、波形の周波数を 10 から 15 に、位相シフトを 0 から 0.5 に変更した場合の効果を観察する必要があるとします。Waveform Generator ブロックで、以下の波形バリアントを追加します。

square(amp,10,0.5,dutyCycle)
square(amp,15,0,dutyCycle)
square(amp,15,0.5,dutyCycle)

モデル コンフィギュレーション パラメーター [既定のパラメーター動作] を [Tunable] に設定します。

set_param('ex_switch_waveform','DefaultParameterBehavior','Tunable')

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

slbuild('ex_switch_waveform')
### Starting build procedure for: ex_switch_waveform
### Successful completion of code generation for: ex_switch_waveform

Build Summary

Top model targets built:

Model               Action           Rebuild Reason                                    
=======================================================================================
ex_switch_waveform  Code generated.  Code generation information file does not exist.  

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

生成されたファイル ex_switch_waveform.h で、モデルの調整可能なパラメーター データを保存する標準の構造体型が定義されます。この構造体には、値がアクティブな波形を示すフィールドが含まれています。

file = fullfile('ex_switch_waveform_grt_rtw','ex_switch_waveform.h');
coder.example.extractLines(file,'/* Parameters (default storage) */',...
    '/* Real-time Model Data Structure */',1,0)
/* Parameters (default storage) */
struct P_ex_switch_waveform_T_ {
  real_T WaveformGeneratorStimulus_Selec;
                              /* Mask Parameter: WaveformGeneratorStimulus_Selec
                               * Referenced by: '<S1>/Switch'
                               */
  real_T GainControlSystem_Gain;       /* Expression: 3.5
                                        * Referenced by: '<Root>/Gain (Control System)'
                                        */
};

ファイル ex_switch_waveform_data.c で、グローバル構造体変数が定義され、フィールド値が 1 に初期化されます。この値はベースライン波形を表しています。

file = fullfile('ex_switch_waveform_grt_rtw','ex_switch_waveform_data.c');
coder.example.extractLines(file,'/* Block parameters (default storage) */','};',1,1)
/* Block parameters (default storage) */
P_ex_switch_waveform_T ex_switch_waveform_P = {
  /* Mask Parameter: WaveformGeneratorStimulus_Selec
   * Referenced by: '<S1>/Switch'
   */
  1.0,

  /* Expression: 3.5
   * Referenced by: '<Root>/Gain (Control System)'
   */
  3.5
};

ファイル ex_switch_waveform.c で、モデル実行関数が定義されます。この関数は switch ステートメントを使用してアクティブな波形の値を決定し、ルートレベルの Outport ブロック Out1 の値を計算します。

file = fullfile('ex_switch_waveform_grt_rtw','ex_switch_waveform.c');
coder.example.extractLines(file,'switch ((int32_T)',...
    'ex_switch_waveform_Y.Out1 =',1,1)
  switch ((int32_T)ex_switch_waveform_P.WaveformGeneratorStimulus_Selec) {
   case 1:
    temp = temp_tmp - floor(temp_tmp) <= 0.5 ? 2.71 : -2.71;
    break;

   case 2:
    temp = (temp_tmp - 0.79577471545947676) - floor(temp_tmp -
      0.79577471545947676) <= 0.5 ? 2.71 : -2.71;
    break;

   case 3:
    temp = temp - floor(temp) <= 0.5 ? 2.71 : -2.71;
    break;

   default:
    temp = (temp - 1.1936620731892151) - floor(temp - 1.1936620731892151) <= 0.5
      ? 2.71 : -2.71;
    break;
  }

  /* End of MultiPortSwitch: '<S1>/MultiportSwitch' */

  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain (Control System)'
   */
  ex_switch_waveform_Y.Out1 = ex_switch_waveform_P.GainControlSystem_Gain * temp;

コードの実行中に、アクティブな波形を変更するために、グローバル パラメーター構造体の構造体フィールドの値を調整します。

関連するトピック