イベントリスニング
オブジェクトイベントのリスニング
オブジェクトには、他のオブジェクトのイベントをリッスンする機能があります。このようなイベントの例として、モデルのリセット、状態の変化(例:idleからbusyへ)、フローアイテムの受領などがあります。エンジンのイベントの完全なリストについては、FlexsimContentに含まれているbasicmacros.hを参照してください。イベント用のマクロはすべて、SM_EVENTNAMEの形式です。
ブロードキャスターオブジェクト
すべてのFlexSimObjectsは、listenersという属性ノードを持つことができます。listeners属性のサブノードは結合データの必要があり、リスナーオブジェクトのサブノードをポイントする必要があります。リスナーノードの例を次に示します。
このプロセッサは、自分のイベントをListenerObjとSink3にブロードキャストします。プロセッサのすべてのイベントは、Sink3に信号を送信します。特定のリスナーに信号を送信するイベントをフィルタリングするには、リスナーノードに数値データ付きのサブノードを追加します。指定する数値データは、どのイベントをリスナーに通知するかを示すビットマスクです。上記のフィルタの値は128で、SM_ACCEPTイベントのみを送信します。C++では、ビットシフト演算子を使用して、このビットマスクフラグを作成できます。たとえば、resetイベントとgiveイベント(例:フローアイテムがプロセッサから退出する)の両方を通知可能にするフラグを作成するには、次のフィルタを割り当てます(C++で)。
set(filterNode, (1 << SM_RESET) | (1 << SM_GIVE));
リスナーオブジェクト
イベント処理コードは、リスニングオブジェクト内に存在します。どのノードでも、次の要件を満たせばリスナーオブジェクトにできます。
- ノードにオブジェクトデータが存在する。
- ノードにOnListen、OnPreListen、または両方の属性が存在し、FlexScriptとして構築されている。
- ノードに属性、ブロードキャスターへのリンクとして結合ノードが存在する。
次の図に簡単な例を示します。
フィルタリングされないすべてのイベントは、そのイベントが実際に発生する直前にOnPreListen関数を、直後にOnListen関数を実行します。OnPreListenおよびOnListen内で利用可能なパラメータは次のとおりです。
- c - リスニングオブジェクト
- i - ブロードキャスティングオブジェクト
- listenerinfo(1) - イベントコード(SM_ENTERなど)
- listenerinfo(2) - ブロードキャスティングオブジェクト(iと同じ)
- listenerinfo(3) - ブロードキャスティングオブジェクトの結合ノード
関数のリスニング
リスニングオブジェクトを使用して、function_s()またはnodefunction()で呼び出される関数ノードをリッスンすることもできます。このためには、ノードが次の要件を満たす必要があります。
- ノードに結合サブノードがあり、リスナーオブジェクトにリンクされている。
- ノードと結合サブノードが、switch_activelisteners(theNode, 1)を使用してアクティブリスナーに切り替えられている。
この場合、関数の実行直前にリスナーオブジェクトのOnPreListen関数が、直後にOnListen関数が実行されます。ただし、OnPreListenとOnListenで利用可能な変数は、次に示すようにまったく異なります。
- c - リスナーオブジェクト
- parval/parnode/parstr(n) - 元の関数に渡される任意の変数
戻り値のオーバーライド
関数リスナー(オブジェクトイベントリスナーではなく)のもう1つの興味深い機能は、ブロードキャスティング関数の戻り値をオーバーライドできることです。このタスクを行うためのアプリケーションコマンドがあります。このコマンドは、リスニングオブジェクトのOnListen関数からのみ呼び出します。
applicationcommand("overridereturnvalue", myVal);
これにより、ブロードキャスティング関数の戻り値として強制的にmyValが返されます。
FlexSimEventオブジェクトによるイベントの処理
FlexSimEventオブジェクトを使用して、イベント処理コードをアタッチすることもできます。これには、CouplingDataTypeを拡張したFlexSimEventを拡張するカスタムクラスが必要です。この種類のカスタムデータを持つノードは、オブジェクトイベントと関数の両方をリッスンするために使用できます。
オブジェクトイベントのリスニング
オブジェクトイベントをリッスンするには、任意のオブジェクトのlisteners属性内に、カスタムデータをポイントするサブノード(これもFlexSimEventを拡張したもの)を配置します。このカスタムデータは、継承するFlexSimEventメンバーを次のように構成します。
- code - この値は、カスタムオブジェクトコードをトリガーするイベントを示すビットマスクのフィルタです。(1 << SM_SOMEEVENT) | (1 << SM_SOMEOTHEREVENT)の方法で決定できます(詳細については、「ブロードキャスターオブジェクト」を参照してください)。
- time - この値は実際にはフラグで、オブジェクトがイベントの前、後、両方のどの時点でトリガーされるかを決定します。可能な値は次のとおりです。
- 0 - イベントの後
- 1 - イベントの前
- 2 - イベントの後
- 3 - イベントの前と後
- execute() - この関数は必ずオーバーライドする必要があります。オブジェクトがトリガーされたときに実行されます。この関数の中で、オブジェクト変数は次の値です。
- code - イベントコードの現在の値(例:SM_ACCEPT)
- time - 現在のイベントのタイミング(イベント前は1、イベント後は2)
- involved - オブジェクトのlisteners属性
- data - 現在のcallpoint構造
関数のリスニング
FlexSimEventオブジェクトで関数をリッスンするのは、オブジェクトイベントをリッスンするのとほぼ同じですが、次の例外があります。
- code - イベントコードは存在しないため、この値は0です。
- execute() - この関数内では、involved変数は関数のノード自体です。