Main Content

レートベース モデルの作成

レートベース モデルは、サブシステムを明示的にスケジュールしたモデルです。Subsystem ブロックに接続している Inport ブロック、Subsystem ブロック、または [サンプル時間] を指定できる Subsystem ブロック (たとえば Delay ブロック) の [サンプル時間] パラメーターを指定することで、周期的実行レートをもつサブシステムをスケジュールできます。

完成したレートベース モデルを開くには、ex_rate_based_model を参照してください。

メモ

Integrator ブロックのような連続時間ブロックの使用は許可されません。代わりに同等の離散時間ブロックを使用します。

以下のモデルには 2 つの Atomic Subsystem ブロックが含まれます。Subsystem1 はその入力を 2 で乗算しますが、Subsystem2 はその入力を 4 で乗算します。

  1. Inport 1 のダイアログ ボックスを開きます。[信号属性] タブで、[サンプル時間]0.2 に設定します。

  2. Inport 2 のダイアログ ボックスを開きます。[信号属性] タブで、[サンプル時間]0.4 に設定します。

  3. レートベース モデルに複数のレートがある場合、シングル タスクは許可されません。コンフィギュレーション パラメーター [各離散レートを個別のタスクとして扱う] のチェック ボックスをオンにします。

コード生成のためのマルチタスクとマルチレート モデル

マルチタスクに対してシングルタスク、マルチレートに対してシングルレートを選択すると、生成されたコードでエントリ ポイントが制御されます。

コンフィギュレーション パラメーター明示的にスケジュールされたレート生成されたコードのエントリ ポイント

シングルタスク

シングルレート

Subsystem1

Subsystem2

0.2 秒ごとに周期的に呼び出される 1 つのエントリポイント関数

void model_component_step(void)
{
   model_component_Y.Out1 = 2.0 * model_component_U.In1;
   model_component_Y.Out2 = 4.0 * model_component_U.In2;
}

シングルタスク

マルチレート

Subsystem1

Subsystem2

0.2 秒ごとに周期的に呼び出される 1 つのエントリポイント関数。関数内のスケジュール カウンターによって、実行されるレートとサンプル時間が決定される。

void model_component_step(void)
{
   model_component_Y.Out1 = 2.0 * model_component_U.In1;
   if (model_component_M->Timing.TaskCounters.TID[1] == 0) {
       model_component_Y.Out2 = 4.0 * model_component_U.In2;
   }
   rate_scheduler();
}

マルチタスク

シングルレート

Subsystem1

Subsystem2

1 つのエントリポイント関数。シングルレートをもつシングルタスクと同じコード。ユース ケースではないが、コードはエラーなしで生成する

マルチタスク

マルチレート

Subsystem1

Subsystem2

2 つのエントリポイント関数。1 つは 0.2 秒ごとに周期的に呼び出され、もう 1 つは 0.4 秒ごとに周期的に呼び出される。レートは優先順位が設定されたプリエンプティブ マルチタスク スキームを使用して実行される。速いレートに割り当てられる優先順位は高くなるため、先に実行される。

void model_component_step0(void)
{
   model_component_Y.Out1 = 2.0 * model_component_U.In1;
}

void model_component_step1(void)
{
   model_component_Y.Out2 = 4.0 * model_component_U.In2;
}