このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
Stateflow データの演算
Simulink® モデルの Stateflow® チャートには、ステートおよび遷移のアクションで使用できる演算を定義するアクション言語プロパティがあります。言語プロパティは次のとおりです。
アクション言語は MATLAB®。
アクション言語は C。
詳細については、アクション言語構文としての MATLAB と C の相違点を参照してください。
二項演算
次の表は、Stateflow チャート内のすべての二項演算の解釈を優先順位 (0 = 最高、10 = 最低) に従ってまとめています。二項演算は左結合であるため、どの式でも、優先度が同じ演算子は左から右の順序で評価されます。その他の演算子の評価順序は指定されていません。たとえば、次の代入
A = f() > g();
f()
と g()
の評価順序は指定されていません。結果を予測しやすくするために、評価順序に依存する式を複数のステートメントに分割してコードを書くことをお勧めします。
演算 | 優先順位 | アクション言語が MATLAB | アクション言語が C の場合 |
---|---|---|---|
| 0 | べき乗 | べき乗。この演算は C ライブラリ関数 この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティをオフにします。詳細については、C 言語のビット演算が可能を参照してください。 |
| 1 | 乗算 | 乗算 |
| 1 | 除算 | 除算。 |
| 1 | 剰余。非整数オペランドは、最初に整数にキャストされます。 | |
| 2 | 加算 | 加算 |
| 2 | 減算 | 減算。 |
| 3 | サポートなし。関数 |
|
| 3 | サポートなし。関数 |
|
| 4 | 比較、より大きい | 比較、より大きい |
| 4 | 比較、未満 | 比較、未満 |
| 4 | 比較、以上 | 比較、以上 |
| 4 | 比較、以下 | 比較、以下 |
| 5 | 比較、等しい | 比較、等しい |
| 5 | 比較、等しくない | 比較、等しくない |
| 5 | サポートなし。演算 | 比較、等しくない |
| 5 | サポートなし。演算 | 比較、等しくない。 |
| 6 | 論理 AND。ビット単位 AND の場合は、関数 |
詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
| 7 | サポートなし。ビット単位 XOR の場合は、関数 | ビット単位 XOR (既定)。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
| 8 | 論理 OR。ビット単位 OR の場合は、関数 |
詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
| 9 | 論理 AND | 論理 AND。 |
| 10 | 論理 OR | 論理 OR |
単項演算と単項アクション
次の表は、Stateflow チャート内のすべての単項演算と単項アクションの解釈をまとめています。単項演算は、
二項演算子より優先順位が高くなります。
右結合であるため、どの式でも、右から左の順序で評価されます。
演算 | アクション言語が MATLAB | アクション言語が C の場合 |
---|---|---|
| 論理 NOT。ビット単位 NOT の場合は、関数 |
詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
| サポートなし。演算 | 論理 NOT |
| 負数 | 負数 |
| サポートなし。式 | インクリメント。 |
| サポートなし。式 | デクリメント。 |
代入演算
次の表は、Stateflow チャート内の代入演算の解釈をまとめています。
演算 | アクション言語が MATLAB | アクション言語が C の場合 |
---|---|---|
| シンプルな代入 | シンプルな代入 |
| サポートなし。型キャスト演算を使用して、固定小数点上位変換規則をオーバーライドします。型キャスト演算を参照してください。 | 固定小数点数の代入。C チャートでの固定小数点上位変換のオーバーライドを参照してください。 |
| サポートなし。式 |
|
| サポートなし。式 |
|
| サポートなし。式 |
|
| サポートなし。式 |
|
| サポートなし。式 a = mod(a,b) または a = rem(a,b) を使用します。 |
|
| サポートなし。式 | a = a&b (ビット単位 AND) と等価です。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
| サポートなし。式 | a = a^b (ビット単位 XOR) と等価です。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
| サポートなし。式 | a = a|b (ビット単位 OR) と等価です。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
型キャスト演算
ある型の値を別の型に変換するには、型キャスト演算を使用します。明示的な型または別の変数の型にデータをキャストできます。
明示的なデータ型へのキャスト
数値式を明示的なデータ型にキャストするには、double
、single
、int8
、int16
、int32
、int64
、uint8
、uint16
、uint32
、uint64
、および 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 ビット分右にシフトします。 |
| a を b ビット分左にシフトします。 |
[C 言語のビット演算が可能] チャート プロパティを選択して、ビット シフト演算 a >> b
と a << b
を除くすべてのビット演算を有効にしなければなりません。C 言語のビット演算が可能を参照してください。
ビット演算はバイナリ レベルで整数を処理します。非整数オペランドは、最初に整数にキャストされます。整数オペランドは C の上位変換規則に従って結果の中間値を決定します。その後、この中間値は演算結果に指定されている型にキャストされます。
メモ
MATLAB をアクション言語として使用するチャートでは、ビット演算はサポートされません。代わりに、関数 bitand
、bitor
、bitxor
、bitnot
、bitshift
を使用してください。
ビット演算と整数のオーバーフロー
ビット演算の中間値の代入に使用される暗黙的なキャストの結果、オーバーフローが発生する場合があります。結果の右端のビットを維持して予期せぬ動作を回避するには、チャート プロパティ [整数オーバーフローで飽和] を無効にします。
たとえば、次のモデルのどちらのチャートもビット演算 y = ~u
を計算します。チャートはターゲット整数のサイズに 32 ビットを使用してこの演算の中間値を計算するので、この値の左端から 24 桁はすべて 1 になります。チャートが中間値を y
に代入すると、uint8
へのキャストによって整数オーバーフローが発生します。各チャートからの出力は、チャートが整数のオーバーフローをどのように処理するかによって決まります。
[整数オーバーフローで飽和] が有効の場合、チャートはビット演算の結果を飽和させて値 0 を出力します。
[整数オーバーフローで飽和] が無効の場合、チャートはビット演算の結果をラップして右端のビット 8 桁を出力します。
詳細については、整数オーバーフローで飽和を参照してください。
ポインター演算とアドレス演算
次の表は、アクション言語として C を使用する Stateflow チャート内のポインター演算とアドレス演算の解釈をまとめたものです。
演算 | 説明 |
---|---|
| アドレス演算。カスタム コード変数および Stateflow 変数で使用します。 |
| ポインター演算。カスタム コード変数でのみ使用します。 |
たとえば、モデル sf_bus_demo
には、ポインターを引数として取るカスタム C 関数が含まれています。チャートでは、カスタム コード関数を呼び出すときに、&
演算を使用して、アドレスによって Stateflow データを受け渡します。詳細については、Stateflow チャートのカスタム構造体の統合を参照してください。
アクション言語として MATLAB を使用するチャートでは、ポインター演算とアドレス演算はサポートされません。構造体へのポインターは、読み取り専用モードでのみ使用すべきであり、ポインターが渡される呼び出しの間でのみ有効です。
アプリケーション実装による演算の置換
Embedded Coder® または Simulink Coder™ をお持ちの場合は、コードの生成時にコード置換ライブラリ (CRL) を適用するようにコード ジェネレーターを構成できます。コード ジェネレーターは、演算がアプリケーションの要件を満たすように、生成するコードを変更します。Embedded Coder を使用すると、カスタム コード置換ライブラリを開発して適用できます。
コード置換ライブラリの演算エントリでは、整数/固定小数点オペランドと結果パターンを指定できます。演算エントリは、次の演算に使用できます。
加算
+
減算
-
乗算
*
除算
/
たとえば、次の式では、u1
、u2
および y
の型がコード置換ライブラリの加算エントリとの一致を許可する場合に、加算演算子 +
をターゲット固有の実装に置き換えることができます。
y = u1 + u2
C チャートのセマンティクスでは、演算式でターゲット整数のサイズが中間型として使用されるため、演算子エントリの整合性が制限されます。たとえば、次の演算式は、ターゲット整数への中間加算を計算します。
y = (u1 + u2) % 3
MathWorks® が提供するコード置換ライブラリの使用の詳細については、コード置換とは (Simulink Coder)およびコード置換ライブラリ (Simulink Coder)を参照してください。カスタム コード置換ライブラリの開発の詳細については、What Is Code Replacement Customization? (Embedded Coder)およびCode You Can Replace From Simulink Models (Embedded Coder)を参照してください。