RiCIS_IN() または IS_IN()

IS_IN() ステートメントは、オブジェクトが特定の状態かどうかを判別します。

RICIS_IN() には、IS_IN() と同じ効果があります。このステートメントは、引数としてオブジェクトに対するポインターと検査する状態の名前をとります。状態の名前は、<object>_<state> という形式です。

例えば、Furnace オブジェクトが状態変化前に faultS 状態でないようにするには、以下の IS_IN() ステートメントを Furnace のステートチャート内で遷移に対するガードとして使用できます。

[!IS_IN(me,Furnace_faultS)]

IS_IN() の定義は以下のとおりです。

#define IS_IN(me, state) state##_IN((me))

このマクロは、状態に対して生成される IN() 操作を呼び出します。オブジェクトの状態の検査を参照してください。

状態を参照する場合、生成された状態名を使用する必要があります。同じ名前の兄弟状態を参照する場合、この方法は注意して使用する必要があります。例えば、オブジェクト AAnd 状態 B で、並行状態が B1B2 で、しかもこれらのそれぞれがサブ状態 C である場合、これらの状態に対して以下の列挙値が生成されます。

/*states enumeration: */
enum A_Enum{ A_RiCNonState=0, A_B=1, A_B2=2,
   A_B2_C=3, A_B1=4, A_C=5 }

B1 のサブ状態 C の生成された名前は A_C となります。 したがって、AB1C であるかどうかを確認するための正しいマクロ呼び出しは、IS_IN(me, A_B1_C) ではなく、IS_IN(me, A_C) となります。


フィードバック