<< 目次を表示 >> ページ位置: シミュレーション > 外部実行の状態マシン > イベントマクロ: EVENT_PARAMETER |
EVENT_PARAMETERは、状態のアクション・遷移のガード・効果などのシグナルの属性を参照するための関数マクロです。このマクロは、シミュレーション言語に応じて実行コードに展開されます。
既定のマクロ定義の位置
「コード」リボン | 「ソースコード」パネル | 設定 | コード生成テンプレート | 対象の言語のSTMテンプレートを選択 | Stm Event Parameter
使用形式
%EVENT_PARAMETER(SignalType, SignalAttributeName)%
例えば、以下のようになります。シグナル "MySignal "が "foo:int "と "bar:int "の2つの属性を持つ場合、以下の用に利用できます。
マクロの展開例
シグナル "MySignal "の属性 "value "に対して、シグナルトリガによる遷移のためのマクロ%EVENT_PARAMETER(MySignal, value)%の展開例は以下の通りです。
C |
((MySignal*)signal)->value |
C++ |
static_cast<MySignal*>(signal)->value |
C# |
((MySignal)signal).value |
Java |
((EventProxy.MySignal)signal).value |
JavaScript |
signal.value |
サンプル
次の例では、遷移の効果・カードと、状態の振る舞いにEVENT_MACROを使用します。
シミュレーションを実行します。
(1) REQUESTを起動し、属性の値として1を指定します。
ガードの条件はfalseなので、アクティブな状態はState1のままです。
(2) REQUESTをトリガーし、属性の値として11を指定します。
ガードの条件が真なので、アクティブな状態はState1からState2に変わります。
遷移の効果が実行されます。ここでは、シグナルの属性の実行中の値をシミュレーションサブウィンドウにトレースしています。
State2の動作が実行されます。ここでは、シグナルの属性のランタイム値をインクリメントし、それをシミュレーション・サブウィンドウにトレースしました。
[32608107] [Part1:TransactionServer] Transition Effect: Initial_4019__TO__State1_4420
[32608118] [Part1:TransactionServer] Entry Behavior: StateMachine_State1
[32608124] [Part1:TransactionServer] Do Behavior: StateMachine_State1
[32608877] [Part1:TransactionServer] Completion: TransactionServer_StateMachine_State1
[32608907] Waiting for Trigger
[32613165] Command: broadcast REQUEST.RequestSignal(1)
[32613214] [Part1:TransactionServer] Event Queued: REQUEST.RequestSignal(value:1)
[32613242] [Part1:TransactionServer] Event Dispatched: REQUEST.RequestSignal(value:1)
[32613279] Waiting for Trigger
[32619541] Command: broadcast REQUEST.RequestSignal(11)
[32619546] [Part1:TransactionServer] Event Queued: REQUEST.RequestSignal(value:11)
[32619551] [Part1:TransactionServer] Event Dispatched: REQUEST.RequestSignal(value:11)
[32619557] [Part1:TransactionServer] Exit Behavior: StateMachine_State1
[32619562] [Part1:TransactionServer] Transition Effect: State1__TO__State2_4421
[32619567] instance of RequestSignal . value
[32619571] 11
[32619576] [Part1:TransactionServer] Entry Behavior: StateMachine_State2
[32619584] State's entry behavior: Increment instance of RequestSignal . value by 1:
[32619590] 12
[32619594] [Part1:TransactionServer] Do Behavior: StateMachine_State2
[32620168] [Part1:TransactionServer] Completion: TransactionServer_StateMachine_State2
[32620211] Waiting for Trigger
[32622266] Command: broadcast END
[32622272] [Part1:TransactionServer] Event Queued: END
[32622310] [Part1:TransactionServer] Event Dispatched: END
[32622349] [Part1:TransactionServer] Exit Behavior: StateMachine_State2
[32622359] [Part1:TransactionServer] Transition Effect: State2__TO__Final_4023_4423
[32622896] [Part1:TransactionServer] Completion: TransactionServer_VIRTUAL_SUBMACHINESTATE
制限と回避策
マクロ展開には型のキャストが含まれるため、型のキャストが有効であることを確認するのはユーザーの責任となります。
ここでは、モデル内で型のキャストが問題となる一般的なケースに対する回避策を紹介します。
例えば、ある遷移がtriggerA(SignalAと結びつく)とtriggerB(SignalBと結びつく)を持つ場合、マクロの%EVENT_PARAMETER(SignalA, attributeOfA)%は、この遷移がtriggerBでトリガされた場合には動作しません。
triggerA(SignalAと結びつく)とtriggerB(SignalBと結びつく)の2つの遷移を作成することをお勧めします。
例えば、TransitionAとTransitionBの両方がMyStateを対象とし、TransitionAはSignalAでトリガされ、TransitionBはSignalBでトリガされるとします。
状態の振る舞いでEVENT_PARAMETERを使用している場合、1つのマクロでは両方のケースに対応できません。
シグナルの属性を扱う処理を状態の振る舞いから遷移の効果に移すことをお勧めします。
既定のコード生成テンプレートを変更して、型キャストの前にRTTI(Run Time Type Identification)を追加できます。また、生成されたコードは、コンパイル後にシミュレーションの目的に合わせて変更できます。