シミュレーションコマンド

<< 目次を表示 >>

ページ位置:  シミュレーション > 外部実行の状態マシン >

シミュレーションコマンド

シミュレーションにおいては、状態マシンを制御するコマンドや状況を確認するコマンドを実行することもできます。

 

このページでは扱う内容には次のようなものがあります。

 

ここで扱う内容は、サンプルプロジェクトに含まれています。モデルブラウザ内の以下のパッケージをご覧ください。

 

 

利用手順:

リボン

  • シミュレーション > 共通 > ウィンドウ
  • シミュレーション > 共通 > トリガ

 

 

これらの2つのサブウィンドウは、外部実行の状態マシンの機能を利用する場合によく利用されます。

 

 

クラスと状態マシンの作成

今回は、TransactionServerクラスを作成し、このクラスに属性と状態マシンを持たせます。そして、シミュレーションのための「外部実行の状態マシン」成果物要素を作成します。

 

クラスの作成

 

#

操作方法

1

TransactionServerという名前のクラスを作成します。

2

属性authorizeCntを定義し、初期値を0とします。

3

クラスを右クリックし、「子ダイアグラムの追加 | 状態マシン」を実行して空の状態マシンを追加します。

 

 

状態マシンの定義

#

操作方法

1

初期状態を作成します。

2

Idle状態と、遷移を追加します。

3

busy状態と、遷移を追加します。トリガNEW_REQUESTを割り当てます。

4

遷移を追加します。

  • トリガQUITで終了状態に遷移します。
  • トリガAUTHORIZEDで、効果"this.authorizeCnt++;"を定義してIdle状態に遷移します。

 

 

busy状態に遅延イベントを定義します。

#

操作方法

1

busy状態への自己遷移を追加します。

2

遷移の 'kind'を'internal'に設定します。

3

遅延させるトリガを割り当てます。

4

効果の欄には'defer();'を記載します。

 

 

シグナルと属性を定義します。

#

操作方法

1

シグナルRequestSignalを定義します。

2

シグナルに、属性requestTypeを追加します。型はintとします。

3

トリガNEW_REQUESTとシグナルRequestSignalを結びつけます。

 

 

外部実行の状態マシン要素の作成

 

#

操作方法

1

ツールボックスの「シミュレーション」グループ内の「外部実行の状態マシン」成果物要素をダイアグラム内に配置し、名前をSimulation with Deferred Eventとします。

2

TransactionServerクラスをモデルブラウザからこの要素にドロップし、プロパティとして配置します。名前はname serverとします。

3

成果物要素の言語を C, C++, C#, Java, JavaScript のいずれかに設定し、外部実行の状態マシンのシミュレーション機能が利用できるようにします。

4

今回はJavaScriptを利用します。これにより、追加の環境が不要となります。

  • 成果物要素を右クリックし、「ソースコードの生成と読み込み | 外部実行の状態マシン | 生成・ビルドと実行」 を選択します。

 

 

シミュレーションウィンドウとコマンド

シミュレーションを実行すると、以下のようにIdle状態で停止します。

 

 

シミュレーションサブウィンドウに表示されるログを見ると、トリガを待機していることがわかります。

 

 

 

シグナルの属性を指定して発行する

NEW_REQUESTトリガをダブルクリックして発行します。定義した属性をパラメータとして指定する画面が表示されます。

 

 

ここでは、値として 2 を指定してOKボタンを押します。このパラメータの値は状態の振る舞いや遷移の効果で参照できます。

 

シミュレーションサブウィンドウには、次のようなログが出力されます。

 

[03612562]      Waiting for Trigger

 

[03611358]      Command: broadcast NEW_REQUEST.RequestSignal(2)

 

[03611362]      [server:TransactionServer] Event Queued: NEW_REQUEST.RequestSignal(requestType:2)

 

[03611367]      [server:TransactionServer] Event Dispatched: NEW_REQUEST.RequestSignal(requestType:2)

 

[03611371]      [server:TransactionServer] Exit Behavior: ServerStateMachine_idle

 

[03611381]      [server:TransactionServer] Transition Effect: idle__TO__busy_61772

 

[03611390]      [server:TransactionServer] Entry Behavior: ServerStateMachine_busy

 

[03611398]      [server:TransactionServer] Do Behavior: ServerStateMachine_busy

 

[03612544]      [server:TransactionServer] Completion: TransactionServer_ServerStateMachine_busy

 

[03612562]      Waiting for Trigger

 

 

このようにして、他のトリガもダブルクリックして発行できます。また、シミュレーションサブウィンドウ内でコマンドを実行してトリガを発行することもできます。

 

 

[03612562]      Waiting for Trigger

 

[04460226]      Command: broadcast NEW_REQUEST.RequestSignal(3)

 

[04460233]      [server:TransactionServer] Event Queued: NEW_REQUEST.RequestSignal(requestType:3)

 

[04461081]      Waiting for Trigger

 

 

上記の内容(Event Queued)は、発行されたトリガを必要とする状態がなく、発行が遅延されたことを示しています。

他のトリガも以下のようにして発行します。

 

[04655441]      Waiting for Trigger

 

[04664057]      Command: broadcast NEW_REQUEST.RequestSignal(6)

 

[04664066]      [server:TransactionServer] Event Queued: NEW_REQUEST.RequestSignal(requestType:6)

 

[04664803]      Waiting for Trigger

 

[04669659]      Command: broadcast NEW_REQUEST.RequestSignal(5)

 

[04669667]      [server:TransactionServer] Event Queued: NEW_REQUEST.RequestSignal(requestType:5)

 

[04670312]      Waiting for Trigger

 

[04674196]      Command: broadcast NEW_REQUEST.RequestSignal(8)

 

[04674204]      [server:TransactionServer] Event Queued: NEW_REQUEST.RequestSignal(requestType:8)

 

[04674838]      Waiting for Trigger

 

 

dumpコマンドで状況を確認する

 

コマンド欄にdumpと入力すると、以下のように状況を確認できます。

 

 

active countの内容より、busy状態がアクティブになっていることも確認できます。 (active count が 1)

 

ヒント:

コンポジット状態の場合には、カウント数は1(自分自身)+領域の数 になります。

 

Event Poolの内容では、4つのトリガが遅延されていることを確認できます。表示される順番は、トリガが発行された順序になります。

 

 

実行時の値の評価

 

AUTHORIZEDトリガを発行します。

 

[04817341]      Waiting for Trigger

 

[05494672]      Command: broadcast AUTHORIZED

 

[05494678]      [server:TransactionServer] Event Queued: AUTHORIZED

 

[05494680]      [server:TransactionServer] Event Dispatched: AUTHORIZED

 

[05494686]      [server:TransactionServer] Exit Behavior: ServerStateMachine_busy

 

[05494686]      [server:TransactionServer] Transition Effect: busy__TO__idle_61769

 

[05494687]      [server:TransactionServer] Entry Behavior: ServerStateMachine_idle

 

[05494688]      [server:TransactionServer] Do Behavior: ServerStateMachine_idle

 

[05495835]      [server:TransactionServer] Completion: TransactionServer_ServerStateMachine_idle

 

[05495842]      [server:TransactionServer] Event Dispatched: NEW_REQUEST.RequestSignal(requestType:3)

 

[05495844]      [server:TransactionServer] Exit Behavior: ServerStateMachine_idle

 

[05495846]      [server:TransactionServer] Transition Effect: idle__TO__busy_61772

 

[05495847]      [server:TransactionServer] Entry Behavior: ServerStateMachine_busy

 

[05495850]      [server:TransactionServer] Do Behavior: ServerStateMachine_busy

 

[05496349]      [server:TransactionServer] Completion: TransactionServer_ServerStateMachine_busy

 

[05496367]      Waiting for Trigger

 

 

[05693348]      Event Pool: [

 

[05693349]          NEW_REQUEST.RequestSignal(requestType:6),

 

[05693351]          NEW_REQUEST.RequestSignal(requestType:5),

 

[05693352]          NEW_REQUEST.RequestSignal(requestType:8),

 

[05693354]      ]

 

コマンドの実行欄にeval server.authorizeCntと入力します。下の画像のように、authorizeCnt の値が 1.であることがわかります。

 

 

再度、トリガAUTHORIZEDを発行します。状態Idleに移動した後、再度busyに移行します。遅延したイベントは2に減ります。suthorizeCntの値は2に増えます。

 

 

状態の振る舞いや遷移の効果から属性を参照する

 

外部実行の状態マシンでは、 C/C++/C#/Java/JavaScript. の言語が利用できます。

CとC++は、メンバ変数への参照の記法がC#/Java/JavaScriptとは異なります。

具体的には、CとC++の場合は"->"を利用しますが、それ以外の言語では"."を利用します。なお、CとC++の場合は、例えばvariableNameと記述した場合は、this->variableNameと解釈し実行されます。

 

ただし、このシミュレーション機能では、全ての言語において、以下の記法で属性を参照できます。

this.variableName

 

例:

遷移の効果の内容:

this.authorizeCnt++;

 

状態のentyrなどの振る舞い:

this.foo += this.bar;

 

注意:

EAでは、C言語とC++言語の場合に、"this->"を"this."に置換しています。

例えば、

  • this.foo = this.bar + myObject.iCount + myPointer->iCount;

は次のように置換しています。

  • this->foo = this->bar + myObject.iCount + myPointer->iCount;

 

 

利用可能なコマンドの一覧

この外部実行の状態マシンのシミュレーションでは複数のインスタンスを同時実行できます。そのため、一部のコマンドについては対象のインスタンスを指定することができます。

 

項目

説明

状態マシンの実行

  • run instance.statemachine
  • run all.all
  • run instance
  • run all
  • run

 

例:

run

run all

run server

run server.myMainStatemachine

トリガ(イベント)の発行

  • broadcast EventString
  • send EventString to instance
  • send EventString  (equivalent to broadcast EventString)

 

例:

broadcast Event1

send Event1 to client

dumpコマンド

  • dump
  • dump instance

 

例:

dump

dump server

dump client

evalコマンド

  • eval instance.variableName

 

例:

eval client.requestCnt

eval server.responseCnt

exitコマンド

  • exit

 

イベント文字の書式

EventName.SignalName(argument list)

 

注意:

上記のargument listは、シグナルで定義されている順序と一致しなければなりません。

例えば、あるシグナルに次の2つのパラメータが設定されているとします。

  • foo
  • bar

 

以下の内容は有効です。

  • Event1.Signal1(10, 5)    --------- foo = 10; bar = 5
  • Event1.Signal1(10,)    --------- foo = 10; barの値はundefined
  • Event1.Signal1(,5)    --------- bar = 10; fooの値はundefined
  • Event1.Signal1(,)    --------- fooとbarの値はundefined

 

シグナルに属性が定義されていない場合には、単純に以下のようにトリガ名のみとなります。

  • EventName