メインコンテンツ

Stateflow データの演算

Simulink® モデルの Stateflow® チャートには、ステートおよび遷移のアクションで使用できる演算を定義するアクション言語プロパティがあります。言語プロパティは次のとおりです。

  • アクション言語は MATLAB®

  • アクション言語は C。

Stateflow チャートでは、加算、比較、代入などの標準的なプログラミング演算がサポートされます。使用できる具体的な演算は、チャートのアクション言語によって異なります。

  • いずれのアクション言語でも、基本的な算術 (+-*) と比較 (><==) がサポートされます。

  • C アクション言語では、ビット演算子 (&|) などの追加の演算もサポートされます。

  • MATLAB アクション言語では、C では演算子で行われる一部の演算に関数が使用されます。

すべての演算が、整数、浮動小数点数、ブール値を含む Stateflow データ型を処理します。詳細については、アクション言語構文としての MATLAB と C の相違点を参照してください。

算術演算

算術演算を使用してセンサー値、制御信号、システム パラメーターの計算を実行します。

演算優先順位説明

^

0

べき乗

voltage_squared = voltage ^ 2

*

1

乗算

power = voltage * current

/

1

除算efficiency = output_power / input_power

+

2

加算total_force = applied_force + friction_force

-

2

減算error = setpoint - measured_value

比較演算

比較演算を使用して制御ロジックの条件やしきい値を評価します。

演算優先順位説明

>

4

より大きい

if (temperature > max_temp)

<

4

より小さい

if (pressure < min_pressure)

>=

4

以上

if (speed >= target_speed)

<=

4

以下

if (voltage <= safety_limit)

==

5

等しいif (mode == CALIBRATION)

~=

5

等しくない (MATLAB)if (status ~= READY)

!=

5

等しくない (C)if (status != READY)

論理演算

論理演算を使用して複数の条件を結合します。

演算優先順位MATLAB アクション言語C アクション言語
&&

9

論理 AND。

論理 AND。

||

10

論理 OR。

論理 OR。

~a

5

論理 NOT論理 NOT

!a

5

サポートなし論理 NOT

代入演算

= 演算子を使用して変数に値を代入します。

sensor_reading = adc_value;
control_output = pid_result;

アクション言語として C を使用するチャートでは、次の複合代入演算子を使用できます。

演算等価

a += b

a = a + b

accumulator += sample

a -= b

a = a - b

error -= correction

a *= b

a = a * b

gain *= adjustment

a /= b

a = a / b

average /= sample_count

インクリメントとデクリメント

アクション言語として C を使用するチャートでは、++ または –- を使用してデータ値をインクリメントまたはデクリメントできます。以下に例を示します。

counter++; // Equivalent to counter = counter + 1
sample_index--; // Equivalent to sample_index = sample_index - 1

型変換演算

任意の Stateflow チャートで、MATLAB 型関数を使用できます。

pressure_int = int16(pressure_reading);
voltage_single = single(voltage_measurement);

cast関数の使用法は、アクション言語に応じて異なります。

MATLAB をアクション言語として使用するチャートの場合、次を使用します。

result = cast(sensor_value, "int32");
scaled_value = cast(raw_data, "like", reference_signal);

C をアクション言語として使用するチャートの場合、次を使用します。

result = cast(sensor_value, int32);
scaled_value = cast(raw_data, type(reference_signal));

型キャスト演算

ある型の値を別の型に変換するには、型キャスト演算を使用します。明示的な型または別の変数の型にデータをキャストできます。

明示的なデータ型へのキャスト

数値式を明示的なデータ型にキャストするには、doublesingleint8int16int32int64uint8uint16uint32uint64、および boolean のいずれかの型変換関数を使用します。たとえば、次のステートメントは、式 x+3 を 16 ビット符号なし整数にキャストして、値をデータ y に代入します。

y = uint16(x+3);

あるいは、MATLAB をアクション言語として使用するチャートでは、関数 cast を使用して、"double""single""int8""int16""int32""int64""uint8""uint16""uint32""uint64"、または "logical" を入力引数として指定できます。たとえば、次のステートメントは、式 x+3 を 16 ビット符号なし整数にキャストして、値を y に代入します。

y = cast(x+3,"uint16");

式を固定小数点型にキャストする場合、MATLAB をアクション言語として使用するチャートでは関数 fi (Fixed-Point Designer) の呼び出しがサポートされます。たとえば、次のステートメントは、式 x+3 を、語長が 8 ビットで小数部の長さが 3 ビットの符号付き固定小数点値としてキャストします。

y = fi(x+3,1,8,3);

C をアクション言語として使用するチャートでは、式 fixdt (Simulink) を引数に使用して関数 cast を呼び出します。たとえば、次のステートメントは、式 x+3 を、語長が 8 ビットで小数部の長さが 3 ビットの符号付き固定小数点値としてキャストします。

y = cast(x+3,fixdt(1,8,3));

他のデータに基づいた型のキャスト

型キャストをより簡単にするために、数値式の型を、他の Stateflow データと同じ型に変換することができます。

MATLAB をアクション言語として使用するチャートでは、関数 cast を、キーワード "like" で呼び出します。たとえば、次のステートメントは、x+3 の値を、データ z と同じ型に変換して、値を y に代入します。

y = cast(x+3,"like",z);

C をアクション言語として使用するチャートでは、type 演算子は既存の Stateflow データの型を返します。この戻り値を、cast 演算で明示的な型の代わりに使用します。たとえば、次のステートメントは、x+3 の値を、データ z と同じ型に変換して、値を y に代入します。

y = cast(x+3,type(z));

二項演算

次の表は、Stateflow チャート内のすべての二項演算の解釈を優先順位 (0 = 最高、10 = 最低) に従ってまとめています。二項演算は左結合であるため、どの式でも、優先度が同じ演算子は左から右の順序で評価されます。その他の演算子の評価順序は指定されていません。たとえば、次の代入

A = f() > g();
では、f()g() の評価順序は指定されていません。結果を予測しやすくするために、評価順序に依存する式を複数のステートメントに分割してコードを書くことをお勧めします。

演算

優先順位

アクション言語が MATLAB

アクション言語が C の場合

a & b

6

論理 AND。ビット単位 AND の場合は、関数 bitand を使用します。

  • ビット単位 AND (既定)。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。

  • 論理 AND。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティをオフにします。

詳細については、ビット演算およびC 言語のビット演算が可能を参照してください。

a ^ b

7

サポートなし。ビット単位 XOR の場合は、関数 bitxor を使用します。

ビット単位 XOR (既定)。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算およびC 言語のビット演算が可能を参照してください。

a | b

8

論理 OR。ビット単位 OR の場合は、関数 bitor を使用します。

  • ビット単位 OR (既定)。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。

  • 論理 OR。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティをオフにします。

詳細については、ビット演算およびC 言語のビット演算が可能を参照してください。

ビット演算

次の表は、アクション言語として C を使用する Stateflow チャート内のすべてのビット演算の解釈をまとめたものです。

演算

説明
a & bビット単位 AND。
a | bビット単位 OR。
a ^ bビット単位 XOR。
~aビット単位 NOT。

a >> b

ab ビット分右にシフトします。

a << b

ab ビット分左にシフトします。

[C 言語のビット演算が可能] チャート プロパティを選択して、ビット シフト演算 a >> ba << b を除くすべてのビット演算を有効にしなければなりません。詳細については、C 言語のビット演算が可能を参照してください。

ビット演算はバイナリ レベルで整数を処理します。非整数オペランドは、最初に整数にキャストされます。整数オペランドは C の上位変換規則に従って結果の中間値を決定します。その後、この中間値は演算結果に指定されている型にキャストされます。

メモ

MATLAB をアクション言語として使用するチャートでは、ビット演算はサポートされません。代わりに、関数 bitandbitorbitxorbitnotbitshift を使用してください。

ビット演算と整数のオーバーフロー

ビット演算の中間値の代入に使用される暗黙的なキャストの結果、オーバーフローが発生する場合があります。結果の右端のビットを維持して予期せぬ動作を回避するには、チャート プロパティ [整数オーバーフローで飽和] を無効にします。

たとえば、次のモデルのどちらのチャートもビット演算 y = ~u を計算します。チャートはターゲット整数のサイズに 32 ビットを使用してこの演算の中間値を計算するので、この値の左端から 24 桁はすべて 1 になります。チャートが中間値を y に代入すると、uint8 へのキャストによって整数オーバーフローが発生します。各チャートからの出力は、チャートが整数のオーバーフローをどのように処理するかによって決まります。

  • [整数オーバーフローで飽和] が有効の場合、チャートはビット演算の結果を飽和させて値 0 を出力します。

  • [整数オーバーフローで飽和] が無効の場合、チャートはビット演算の結果をラップして右端のビット 8 桁を出力します。

ポインター演算とアドレス演算

次の表は、アクション言語として C を使用する Stateflow チャート内のポインター演算とアドレス演算の解釈をまとめたものです。

演算

説明

&a

アドレス演算。カスタム コード変数および Stateflow 変数で使用します。

*a

ポインター演算。カスタム コード変数でのみ使用します。

たとえば、モデル sf_bus_demo には、ポインターを引数として取るカスタム C 関数が含まれています。チャートでは、カスタム コード関数を呼び出すときに、& 演算を使用して、アドレスによって Stateflow データを受け渡します。詳細については、Stateflow チャートのカスタム構造体の統合を参照してください。

アクション言語として MATLAB を使用するチャートでは、ポインター演算とアドレス演算はサポートされません。構造体へのポインターは、読み取り専用モードでのみ使用すべきであり、ポインターが渡される呼び出しの間でのみ有効です。

参考

トピック