ドキュメンテーション センター

  • 評価版
  • 製品アップデート

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

If

if-else 制御フローのモデル作成

ライブラリ

Ports & Subsystems

説明

If ブロックは、Action Port ブロックを含む If Action Subsystem ブロックと共に、標準 C に似た if-else ロジックを実装します。

下図は、完成した if-else 制御フロー ステートメントを示しています。

この例では、If ブロックへの入力によって、出力端子として表されている条件の値が決まります。各出力端子は、If Action Subsystem ブロックに割り当てられ、body_1body_2body_3 という名前が付けられます。条件は、if 条件から順に評価されます。条件が true の場合、その If Action Subsystem が実行されて、If ブロックは残りの条件を評価しません。

上の図の if-else 制御フロー ステートメントは、次のような疑似コードで表すことができます。

if (u1 > 0) {
	body_1;
}
else if (u2 > 0){
	body_2;
}
else {
	body_3;
}

上の例のような Simulink®if-else 制御フロー ステートメントを作成するには、以下のようにします。

  1. 現在のシステムに If ブロックを置きます。

  2. If ブロックのダイアログを開いて、次のように入力します。

    • [入力数] フィールドに、if-else 制御フロー ステートメントの条件を定義するために必要な入力数を入力します。

      (行, 列) 引数を使用して、条件としてのベクトル入力の要素にアクセスできます。たとえば、[If 式] または [Elseif 式] フィールドで、条件 u2(5) > 0 のベクトル u2 の 5 番目の要素を指定することができます。

    • [If 式] フィールドに、if-else制御フロー ステートメントの if 条件の式を入力します。

      これにより、If ブロックに、if(condition) という形式のラベルが付いた if 出力端子が作成されます。これは、If ブロックにとって唯一必須の If Action 信号出力です。

    • [Elseif 式] フィールドに、if-else制御フローステートメントの elseif 条件の式を入力します。

      条件と条件を区切るには、コンマを使用します。これらの条件を入力すると、それぞれの条件について、elseif(condition) 形式のラベルが付いた出力端子が If ブロックに作成されます。elseif 端子はオプションであり、If ブロックの動作にとって必須ではありません。

    • else 出力端子を作成するには、[else 条件の表示] チェック ボックスをオンにします。

      else 端子はオプションであり、If ブロックの動作にとって必須ではありません。

  3. if、else、および elseif 端子のそれぞれに接続する If Action Subsystem を作成します。

    これらは、Action Port ブロックを含んだサブシステムで構成されます。各サブシステム内に Action Port ブロックを置くと、Action という名前の入力端子がサブシステムに追加されます。

  4. If ブロックの if、else、および elseif 端子のそれぞれを If Action Subsystem の Action 端子に接続します。

    接続すると、If Action ブロックのアイコンの名前が、それが接続している条件のタイプに変わります。

      メモ:   if-else 制御フロー ステートメントのシミュレーション時、If ブロックから If Action Subsystem への Action 信号ラインは、実線から破線に変わります。

  5. If Action Subsystem に、それが扱う条件を実行する本体に適した Simulink ブロックを入れます。

      メモ:   If Action Subsystem のすべてのブロックは、If ブロックの駆動と同じレートで実行されなければなりません。各ブロックのサンプル時間パラメーターを継承 (-1) または、If ブロックのサンプル時間と同じ値を設定して行うことができます。

制限

If ブロックには次の制限があります。

  • if または elseif 式の調整をノーマル モードおよびアクセラレータ モードでのシミュレーション時 (「アクセラレータ モードの動作方法」を参照) および生成コードで行うことはできません。If ブロックは、[インライン パラメーター] がオンのとき、調整可能なパラメーターをサポートしません。調整可能な式を実装するには、その式を If ブロックの外で調整するようにしてください。たとえば、Relational Operator ブロックを使用して外部で式を評価します。または、If ブロックへの入力として、調整可能なパラメーターを追加します。

  • If ブロックは、カスタム ストレージ クラスをサポートしません。Embedded Coder® ドキュメンテーションの 「カスタム ストレージ クラス」 を参照してください。

  • [If 式] および [Elseif 式] では、+, -, *,/ などの特定の演算子は受け入れられません。「パラメーターとダイアログ ボックス」の「If 式」と「Elseif 式」を参照してください。

サポートするデータ型

入力 u1,u2,...,un は、任意の組み込み Simulink データ型のスカラーまたはベクトルにできますが、すべて同じデータ型でなければなりません。入力は、列挙型のような、ユーザー定義のタイプにはできません。ifelse、および elseif 端子からの出力は、Action Port ブロックおよびサブシステムを使用して作成した If Action Subsystem への Action 信号です。

詳細は、Simulink ドキュメンテーションの「 Simulink でサポートされているデータ型」を参照してください。

パラメーターとダイアログ ボックス

入力数

If ブロックへの入力の数を指定します。これらは、文字 'u' の後に番号 1,2,...,n が続くラベルの付いたデータ入力端子として表示されます。n は、指定した入力数です。

If 式

if 出力端子の条件を指定します。この条件は、If ブロックの if 出力端子の隣に表示されます。[If 式] には演算子 <, <=, ==, ~=, >, >=, &, |, ~, (), unary-minus のみを含めることができ、+, -, *, /,^ などの演算子を含めることはできません。if 端子に接続された If Action Subsystem は、条件が true である場合に実行されます。この式は、たとえば、int8(6) などのデータ型の式を含むことはできません。また、データ型が double または single 以外のワークスペース変数を参照することはできません。

    メモ:   [If 式] の調整に関しては、いくつか制限があります。詳細は、「制限」を参照してください。

Elseif 式

コンマで区切られた elseif 条件の文字列リストを指定します。これらの条件は、[else 条件の表示] チェック ボックスをオンにしたときに if 端子の下、else 端子の上に表示されます。[Elseif 式] には演算子 <, <=, ==, ~=, >, >=, &, |, ~, (), unary-minus のみを含めることができ、+, -, *, /,^ などの演算子を含めることはできません。elseif 端子に接続された If Action Subsystem は、条件が true であり、if および elseif 条件のすべてが false の場合に実行されます。この式は、たとえば、int8(6) などのデータ型の式を含むことはできません。また、データ型が double または single 以外のワークスペース変数を参照することはできません。

    メモ:   [Elseif 式] の調整に関しては、いくつか制限があります。詳細は、「制限」を参照してください。

else 条件の表示

このチェック ボックスをオンにした場合、else 端子が作成されます。else 端子に接続された If Action Subsystem は、if 端子とすべての elseif 端子が false の場合に実行されます。

ゼロクロッシング検出を有効にする

ゼロクロッシング検出を有効にする場合は選択します。詳細は、「ゼロクロッシング検出」を参照してください。

サンプル時間

入力信号のサンプル時間を指定します。詳細は、オンライン ドキュメンテーションの「 サンプル時間の指定」を参照してください。

If ブロックは、固定小数点データ型を直接的にはサポートしません。ただし、この制限を解決するために、Compare To Constant ブロックを使用することができます。

たとえば、次の浮動小数点浮動小数点モデルを考えます。

このモデルでは、If Action Subsystem は既定の構成を使用します。モデルに対するブロックとシミュレーション パラメーターは、次の場合を除き、既定値に設定されます。

ブロックまたはダイアログ ボックス

パラメーター

設定

[コンフィギュレーションパラメーター] - [ソルバー] ペイン

開始時間

0.0

終了時間

1.0

タイプ

Fixed-step

ソルバー

discrete (no continuous states)

固定ステップサイズ

0.1

Repeating Sequence Stair

出力値のベクトル

[-2 -1 1 2].'

Repeating Sequence Stair1

出力値のベクトル

[0 0 0 0 1 1 1 1].'

If

入力数

2

If 式

(u1 > 0) | (u2 > 0.5)

else 条件の表示

選択

Constant

定数値

-4

Constant1

定数値

4

Scope

座標軸数

3

時間範囲

1

このモデルの場合、入力 u1 が 0 より大きいか、入力 u2 が 0.5 より大きい場合、出力は 4 です。それ以外の場合は、出力は -4 です。Scope ブロックは、出力 u1u2 を表します。

このブロック線図を固定小数点データ型のモデル固定小数点データ型のモデルとして実装できます。

Repeating Sequence Stair ブロックは、固定小数点データ型を出力します。

Compare To Constant ブロックは、"If 式" の 2 つの部分を実現します。これらは、モデルの浮動小数点バージョンの If ブロックで使用される (u1 > 0)(u2 > 0.5) です。OR 演算、(u1|u2) は、If ブロック内で実現されています。固定小数点モデルに対して、式はここに示すように If ブロックの外側で部分的に実現される必要があります。

固定小数点モデルに対するブロックとシミュレーション パラメーターは、浮動小数点モデルに対するものと同様ですが、次の追加点があります。

ブロック

パラメーター

設定

Compare To Constant

演算子

>

 

定数値

0

 

出力データ型モード

Boolean

 

ゼロクロッシング検出を有効にする

off

Compare To Constant1

演算子

>

 

定数値

0.5

 

出力データ型モード

Boolean

 

ゼロクロッシング検出を有効にする

off

If

入力数

2

 

If 式

u1|u2

特性

直接フィードスルー

あり

サンプル時間

駆動ブロックから継承

スカラー拡張

なし

離散化

あり

ゼロクロッシング検出

有効な場合、あり

この情報は役に立ちましたか?