Main Content

使用パターン

Ifelseifelse 構造の Simulink パターン

これらのパターンは、ifelseifelse 構造に使用します。

関数Simulink パターン

Switch ブロックが使用されている場合の ifelseifelse 構造。

if (If_Condition)
{
	output_signal = If_Value;
}
else if (Else_If_Condition)
{
	output_signal = Else_If_Value;
}
else
{
	output_signal = Else_Value;
}

Action Subsystem を使用する場合の ifelseifelse 構造。

if (Fault_1_Active & Fault_2_Active)
{
	ErrMsg = SaftyCrit;
}
else if (Fault_1_Active | Fault_2_Active)
{
	ErrMsg = DriverWarn;
}
else
{
	ErrMsg = NoFaults;

case 構造の Simulink パターン

これらのパターンは case 構造に使用します。

関数Simulink パターン

Action Subsystem を使用する case 構造

switch (PRNDL_Enum)
{
	case 1
		TqEstimate = ParkV;
		break;
	case 2
		TqEstimate = RevV;	
		break;
	default 
		TqEstimate = NeutralV;
		break;
}

Multiport Switch ブロックを使用する case 構造。

switch (Selection)
{
	case 1:
		output_signal =
			look1_binlxpw(In2,y1,x1,3U);
		break;
	case 2:
		output_signal =
			look1_binlxpw(In3,y2,x2,3U);
		break;
	case 3:
		output_signal =
			look1_binlxpw(In4,y3,x3,3U);
		break;
	default:
		output_signal =
			look1_binlxpw(In5,y4,x4,3U);
		break;
}

論理構造の Simulink パターン

これらのパターンは論理構造に使用します。

乗法標準形

加法標準形

ベクトル信号の Simulink パターン

これらのパターンは、ベクトル信号に使用します。

関数Simulink パターン

ベクトル信号およびパラメーター (スカラー) の乗算

for (i=0; i>input_vector_size; i++) {
	output_vector[i] = input_vector[i] *
		tunable_parameter_value;
}

(参照: R2013b の生成コード)

for (i = 0; i < input_vectorDim; i++) {
	output_vector[i] =
		tunable_parameter_value *
		input_vector[i];
} 

(コードは可変次元数を使用して生成されているため、標準のループの上限は直値です)

ベクトル信号およびパラメーター (ベクトル) の乗算

for (i=0; i>input_vector_size; i++) {
	output_vector[i] = input_vector[i] *
		tunable_parameter_vector[i];
}

ベクトル信号要素の乗算

output_signal = 1;
for (i=0; i>input_vector_size; i++) {
	output_signal = output_signal *
		input_vector[i];
}

ベクトル信号要素の除算

output_signal = 1;
for (i=0; i>input_vector_size; i++) {
	output_signal = output_signal /
		input_vector[i];
}

ベクトル信号とパラメーター (スカラー) の加算

for (i=0; i>input_vector_size; i++) {
	output_vector[i] = input_vector[i] +
		tunable_parameter_value;
}

ベクトル信号とパラメーター (ベクトル) の加算

Vector signal and parameter (vector) addition

for (i=0; i>input_vector_size; i++) {
	output_vector[i] = input_vector[i] +
		tunable_parameter_vector[i];
}

ベクトル信号要素の減算

output_signal = 0;
for (i=0; i>input_vector_size; i++) {
	output_signal = output_signal -
		input_vector[i]; 
}

最小値/最大値の保持

Switch と IfElseifElse Action Subsystem の使用

Switch ブロックは、関連付けられた elseif および else アクションに定数値の代入のみ含まれる場合に、単純な ifelseifelse 構造をモデル化するために使用します。

例 — 推奨

単純な ifelseifelse 構造の場合は、Switch ブロックを使用します。

例 — 非推奨

単純な ifelseifelse 構造に If ブロックと If Action Subsystem ブロックを使用しています。

例 — 推奨

複雑な ifelseifelse 構造の場合は、If ブロックと If Action Subsystem ブロックを使用します。

例 — 非推奨

複雑な ifelseifelse 構造に Switch ブロックを使用しています。

IfElseifElse Action Subsystem を使用した複数の Switch の置き換え

条件分岐に Switch ブロックを頻繁に使用するのは避けます。代わりに、[upper limit target] を使用します (最大 3 レベルなど)。目標値を超えた場合、ifelseifelse Action Subsystem を使用する条件付き制御フローが使用されます。

例 — 非推奨

入れ子が 4 レベルになっています。

例 — 推奨

if Action Subsystem として 4 番目のレベルを設定することで、入れ子は単一レベルに制限されています。

例 — 非推奨

if Action Subsystem を使用した分割がされていません。

C コード制限が適用される場合、Atomic Subsystem と関数設定を使用します。この場合は、ifelseifelse Action Subsystem を使用する必要はなく、Switch ブロックを分割し、サブシステムでカプセル化できます。

5 レベルの入れ子を使用するモデル例 — 非推奨

5 レベルの入れ子を使用するモデルの例 — 推奨

Switch ブロック内で入れ子の階層化を回避する記述方法を使用します。

例として使用されていますが、if Action Subsystem は通常、固定値の切り替えに使用されません。これらの推奨例と非推奨の例では、ユーザーが関数変換設定を追加しない場合、生成される C コードは同じです。(R2010b ~ R2013a で確認済み) C コードは制約されていません。

条件付き制御フローを使用した Action Subsystem の使用ルール

例 — 推奨

関連付けられたアクションに状態変数がない場合、if Action Subsystem は使用しません。

例 — 推奨

5 レベルの入れ子を使用するモデルの例内部ステートがないため、サブシステムを使用した階層化は行われません。

例 — 推奨

Atomic サブシステムを使用して、Action Subsystem を使用せずに Switch ブロックのいずれかの側を分割しています。

例 — 非推奨

不要な Action Subsystem を使用して階層化しています。

Action Subsystem を使用して機能を実現する場合、Action Subsystem を使用した階層化は実行されません。

非推奨の例では、3 番目のレベルで最小レベルの Unit Delay ブロックが初期化される場合、まず条件付きサブシステムの初期化が第 1 レベルで一度実行され、次に第 2 レベルでもう一度実行されて、合計 2 回の初期値設定が行われます。不要なコードの生成を回避するために、状態変数が存在していないレベルにある条件付きサブシステムでリストに記載しないことが推奨されます。

これは、あるレベルに落とすことでモデルの複雑度が低減される、という概念に基づいています。このルールの目的は、不要な初期化の実行を回避することです。

分岐条件の入れ子が深い構造になっているシステムの分岐に対して、関数変換を使用してコードの分岐の入れ子を下げて分割します。Switch ブロックの前後にある機能がそれぞれのサブシステムに分割され、機能設定が Atomic Subsystem+function に適用されます。これにより、意図しない実装と不要な RAM 要件になる可能性がある点に注意してください。

エラーの情報に対するテスト

Stateflow® で使用される関数 (グラフィカル関数、MATLAB® 関数など) によりエラーになる場合、エラー情報は、テストを促進するモデル構造に変換されます。

関数で返されるエラー情報を確認しないと、意図しない動作になる可能性があります。

例 — 推奨

エラー情報はモデル構造に組み込まれ、ユーザーはエラーを確認し、対応することができます。

例 — 非推奨

エラー情報はモデル構造に組み込まれていません。

フロー チャートの条件パターン

これらのパターンは、Stateflow フロー チャート内の条件に使用されます。

関数フロー チャート パターン

1 つの条件。

[condition]

条件 3 つまで、省略表記。

(この形式では異なる論理演算子は使用できません。代わりにサブ条件を使用してください)

[condition1 && condition2 && condition3] 
 [condition1 || condition2 || condition3]

2 つ以上の条件、複数行表記。

(この形式では異なる論理演算子は使用できません。代わりにサブ条件を使用してください)

[condition1 ...
&& condition2 ... 
&& condition3] 
[condition1 ...
|| condition2 ...
|| condition3]

サブ条件付きの条件。

(サブ条件の接続には異なる論理演算子は使用できません。かっこの使用が必須です)

[(condition1a || condition1b) ... 
&& (condition2a || condition2b) ... 
&& (condition3)] 
[(condition1a && condition1b) ... 
|| (condition2a && condition2b) ... 
|| (condition3)]

視覚的に分離している条件。

(この形式は、前のパターンと組み合わせることができます)

[condition1 && condition2] 
[condition1 || condition2]

フロー チャートの条件アクション パターン

これらのパターンは、Stateflow フロー チャート内の条件アクションに使用されます。

関数フロー チャート パターン

1 つの条件アクション。

action;

2 つ以上の条件アクション、複数行表記。

(1 行に 2 つ以上の条件アクションを含めることはできません)

action1; ... 
action2; ... 
action3; ... 

視覚的に分離している条件アクション。

(この形式は、前のパターンと組み合わせることができます)

action1a; 
action1b; 
action2; 
action3;

IfElseifElse 構造のフロー チャート パターン

これらのパターンは、Stateflow フロー チャート内の If 構造に使用されます。

関数フロー チャート パターン

If 構造

if (condition){
	action;
}

Ifelse 構造

if (condition) {
	action1; 
}
else {
	action2; 
}

Ifelseifelse 構造

if (condition1) {
	action1;
}
else if (condition2) {
	action2; 
}
else if (condition3) {
	action3;
}
else {
	action4;
}

if 構造のカスケード

if (condition1) {
	action1;
	if (condition2) {
		action2;
		if (condition3) {
			action3;
		}
	} 
}

case 構造のフロー チャート パターン

これらのパターンは、Stateflow フロー チャートの case 構造に使用されます。

関数フロー チャート パターン

排他的選択をもつ case 構造。

selection = u1;
switch (selection) {
	case 1: 
		y1 = 1; 
		break;
	case 2:
		y1 = 2;
		break;
	case 3:
		y1 = 4;
		break;
	default: 
		y1 = 8;
}

排他的条件をもつ case 構造。

c1 = u1;
c2 = u2;
c3 = u3;
if (c1 && ! c2 && ! c3) {
	y1 = 1;
}
elseif (! c1 && c2 && ! c3) {
	y1 = 2;
}
elseif (! c1 && ! c2 && c3) {
	y1 = 4;
}
else {
	y1 = 8;
}

ループ構造のフロー チャート パターン

これらのパターンは、Stateflow フロー チャート内のループ構造の作成に使用します。

関数フロー チャート パターン

for ループ構造

for ( index = 0;
			index < number_of_loops;
			index++ )
{
	action;
}

while ループ構造

while ( condition )
{
	action;
}

do while ループ構造

do
{
	action;
}
while ( condition )

条件のステート マシン パターン

これらのパターンは、Stateflow ステート マシン内の条件に使用されます。

関数ステート マシン パターン

1 つの条件

(condition)

条件 3 つまで、省略表記

(この形式では異なる論理演算子は使用できません。代わりにサブ条件を使用します)

(condition1 && condition2) 
(condition1 || condition2)

2 つ以上の条件、複数行表記

サブ条件は、小かっこで囲まれた、すべて同じ型の一連の論理演算です。

(この形式では異なる演算子は使用できません。代わりにサブ条件を使用します)

(condition1 ... 
&& condition2 ... 
&& condition3) 

(condition1 ...
|| condition2 ...
|| condition3)

ステート マシンの遷移アクション パターン

これらのパターンは Stateflow ステート マシン内の遷移アクションに使用されます。

関数ステート マシン パターン

1 つの遷移アクション。

action;

2 つ以上の遷移アクション、複数行表記

(1 行に 2 つ以上の遷移アクションを含めることはできません)

action1; 
action2; 
action3;

jc_0321 ステートの階層化の制限

単一のビューアー (サブビューアー) 内では、単一ビュー (サブビュー) の制約を定義して、複数の階層化を制限します。定義された制約目標を超えた場合、サブチャートを使用して画面を切り替えます。

例 — 推奨

4 番目のレベルがサブチャートでカプセル化されています。

例 — 非推奨

制約目標が 3 つのレベルに設定されていますが、Level_4_a と Level_4_b には 3 つを超えるレベルがあり、入れ子になっています。

Stateflow コンテナーあたりの状態数。

Stateflow コンテナーあたりの状態数は、ブロック線図に表示できるステートの数で決まります。すべてのステートを表示および読み取り可能にしなければなりません。

Stateflow からの関数呼び出し

呼び出し先の Function-Call Subsystem にステートが存在し、呼び出し元のステートが非アクティブになったときにステートの "リセット" が必要な場合、呼び出し元は bind アクションを使用します。

Stateflow で使用可能な関数タイプ

Stateflow で使用される関数タイプは、必要な処理に依存しています。

グラフィカル関数の場合は、以下を使用します。

  • Ifelseifelse ロジック

Simulink® 関数の場合は、以下を使用します。

  • 伝達関数

  • 積分器

  • テーブル ルックアップ

MATLAB 関数の場合は、以下を使用します。

  • 複素方程式

  • Ifelseifelse ロジック