Main Content

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

Stateflow データの演算

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

  • アクション言語は MATLAB®

  • アクション言語は C。

詳細については、アクション言語構文としての MATLAB と C の相違点を参照してください。

二項演算

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

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

演算

優先順位

アクション言語が MATLAB

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

a ^ b

0

べき乗。

べき乗。この演算は C ライブラリ関数 pow と等価です。オペランドはまず浮動小数点数にキャストされます。詳細については、C Library 関数の呼び出しを参照してください。

この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティをオフにします。詳細については、C 言語のビット演算が可能を参照してください。

a * b

1

乗算。

乗算。

a / b

1

除算。

除算。

a %% b

1

サポートなし。関数 rem または mod を使用します。

剰余。非整数オペランドは、最初に整数にキャストされます。

a + b

2

加算。

加算。

a - b

2

減算。

減算。

a >> b

3

サポートなし。関数 bitshift を使用します。

ab ビット分右にシフトします。詳細については、ビット演算を参照してください。

a << b

3

サポートなし。関数 bitshift を使用します。

ab ビット分左にシフトします。詳細については、ビット演算を参照してください。

a > b

4

比較、より大きい。

比較、より大きい。

a < b

4

比較、未満。

比較、未満。

a >= b

4

比較、以上。

比較、以上。

a <= b

4

比較、以下。

比較、以下。

a == b

5

比較、等しい。

比較、等しい。

a ~= b

5

比較、等しくない。

比較、等しくない。

a != b

5

サポートなし。演算 a ~= b を使用します。

比較、等しくない。

a <> b

5

サポートなし。演算 a ~= b を使用します。

比較、等しくない。

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 言語のビット演算が可能を参照してください。

a && b

9

論理 AND。

論理 AND。

a || b

10

論理 OR。

論理 OR。

単項演算と単項アクション

次の表は、Stateflow チャート内のすべての単項演算と単項アクションの解釈をまとめています。単項演算は、

  • 二項演算子より優先順位が高くなります。

  • 右結合であるため、どの式でも、右から左の順序で評価されます。

演算

アクション言語が MATLAB

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

~a

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

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

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

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

!a

サポートなし。演算 ~a を使用します。

論理 NOT。

-a

負数。

負数。

a++

サポートなし。式 a = a+1 を使用します。

インクリメント。a = a+1 と等価です。

a--

サポートなし。式 a = a-1 を使用します。

デクリメント。a = a-1 と等価です。

代入演算

次の表は、Stateflow チャート内の代入演算の解釈をまとめています。

演算

アクション言語が MATLAB

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

a = b

シンプルな代入

シンプルな代入

a := b

サポートなし。型キャスト演算を使用して、固定小数点上位変換規則をオーバーライドします。型キャスト演算を参照してください。

固定小数点数の代入。C チャートでの固定小数点上位変換のオーバーライドを参照してください。

a += b

サポートなし。式 a = a+b を使用します。

a = a+b と等価です。

a -= b

サポートなし。式 a = a-b を使用します。

a = a-b と等価です。

a *= b

サポートなし。式 a = a*b を使用します。

a = a*b と等価です。

a /= b

サポートなし。式 a = a/b を使用します。

a = a/b と等価です。

a %%= b

サポートなし。式 a = mod(a,b) または a = rem(a,b) を使用します。

a = a%%b と等価です。

a &= b

サポートなし。式 a = bitand(a,b) を使用します。

a = a&b (ビット単位 AND) と等価です。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算C 言語のビット演算が可能を参照してください。

a ^= b

サポートなし。式 a = bitxor(a,b) を使用します。

a = a^b (ビット単位 XOR) と等価です。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算C 言語のビット演算が可能を参照してください。

a |= b

サポートなし。式 a = bitor(a,b) を使用します。

a = a|b (ビット単位 OR) と等価です。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算C 言語のビット演算が可能を参照してください。

型キャスト演算

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

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

数値式を明示的なデータ型にキャストするには、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));

ビット演算

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

アプリケーション実装による演算の置換

Embedded Coder® または Simulink Coder™ をお持ちの場合は、コードの生成時にコード置換ライブラリ (CRL) を適用するようにコード ジェネレーターを構成できます。コード ジェネレーターは、演算がアプリケーションの要件を満たすように、生成するコードを変更します。Embedded Coder を使用すると、カスタム コード置換ライブラリを開発して適用できます。

コード置換ライブラリの演算エントリでは、整数/固定小数点オペランドと結果パターンを指定できます。演算エントリは、次の演算に使用できます。

  • 加算 +

  • 減算 -

  • 乗算 *

  • 除算 /

たとえば、次の式では、u1u2 および y の型がコード置換ライブラリの加算エントリとの一致を許可する場合に、加算演算子 + をターゲット固有の実装に置き換えることができます。

y = u1 + u2

C チャートのセマンティクスでは、演算式でターゲット整数のサイズが中間型として使用されるため、演算子エントリの整合性が制限されます。たとえば、次の演算式は、ターゲット整数への中間加算を計算します。

y = (u1 + u2) % 3
ターゲット整数のサイズが 32 ビットである場合は、この式をコード置換ライブラリからの加算演算子で置き換えて桁落ちすることなく符号付き 16 ビット値を得ることはできません。

MathWorks® が提供するコード置換ライブラリの使用の詳細については、コード置換とは (Simulink Coder)およびコード置換ライブラリ (Simulink Coder)を参照してください。カスタム コード置換ライブラリの開発の詳細については、What Is Code Replacement Customization? (Embedded Coder)およびCode You Can Replace From Simulink Models (Embedded Coder)を参照してください。

関連するトピック