JavaScriptを利用した自動実行

<< 目次を表示 >>

ページ位置:  シミュレーション > 振る舞いモデルのシミュレーション >

JavaScriptを利用した自動実行

コーポレート版では、Javascriptの文法で記述したガードやアクションの内容を解釈し、自動的にシミュレーションを実行できます。これにより、ステートマシン図・アクティビティ図の内容を自動的に実行し、内容の正当性をモデル上で確認できます。また、ブレークポイントの設定や変数の値の参照などの機能も利用できます。

 

注意:

シミュレーション機能で利用する変数についてEnterprise Architectのシミュレーション機能で認識させるためには、接頭辞としてsim.あるいはthis.を追加する必要があります。以下は定義の例です。

  • sim.logger
  • sim.Customer.name
  • this.count
  • this.Account.amount

 

上に示した変数は、すべてシミュレーションの変数として認識されます。

 

これらの認識された変数は、ローカル変数サブウィンドウにその値が表示されます。利用法の一例として、グローバル(全体)で利用している変数についてはsim.を、クラスの属性として定義されている変数については「this.」を追加するというような方法があります。

 

JavaScriptの解釈を利用しシミュレーションについて、以下の表で設定方法を説明しています。また、サンプルプロジェクト内にもこのシミュレーション機能のサンプルモデルが含まれています。

 

 

Javascriptを利用する例

項目

説明

動作解析の設定

動作解析の設定サブウィンドウのシミュレーションタブにある入力欄にJavaScriptのコードを入力した場合には、その内容がシミュレーションの実行開始直後に実行されます。変数の値の初期化などに便利です。

 

遷移とコントロールフローのガード

現在のEnterprise Architectのシミュレーション機能において、次のノード(状態要素あるいはアクション要素)の決めるための条件は、遷移やコントロールフローに定義されたガード条件によって決定されます。

移動先になりうるノードが複数ある場合に、1つのガード条件のみが真(true)になる場合に、そのノードに移動します。移動先が複数ある場合や存在しない場合には「ブロックされた」状態になり、シミュレーションは一時停止状態になります。なお、ガードに条件を書く場合に、値が等しいという判定は"=="であることに気をつけて下さい。

 

内部遷移には対応していません。外部遷移と同じ扱いになります。

要素の振る舞い

ステートマシン図の場合に、状態にentry/exitアクションを定義できます。これらのアクションでシミュレーション内で利用する変数の値の更新を行うとよいでしょう。これらのアクションは、「操作」として情報を保持していますので、クラスに操作を追加する際と同じ手順で追加できます。処理の内容は、それぞれのアクションの「振る舞い」欄に記入します。

 

 

doアクションはentryアクションと同じ扱いとなります。

その他、アクティビティやクラスのオブジェクトインスタンスなどを利用してアクティビティ図で振る舞いのシミュレーションを実施できます。(アクション要素に対して、振る舞いをJavaScriptで定義できます。)

COMの利用

Enterprise Architectのシミュレーションで利用しているJavaScriptでは、ActiveX COMオブジェクトの作成や呼び出しが可能です。

これにより、他のアプリケーションとの連携や、実際に動作しているアプリケーションの内部動作をモデル内に表示する(動作のアニメーション)などの機能拡張を行うことができます。このCOMオブジェクトの作成と利用の方法の例は次の通りです。

 

this.name="Odd Even";

var logger = new COMObject("MySim.Logger");

logger.Show();

logger.Log("Simulation started");

シグナル送信

実行時に、動的にシグナルを送信できます。BroadcastSignalコマンドを利用することで、指定した名前のシグナルを発行します。対象のシグナルに関連づけられたトリガが発行されます。以下の例では"CancelPressed"という名前のシグナルが発行されます。

 

BroadcastSignal("CancelPressed");

 

指定した名前のシグナルはモデル内のパッケージ直下に存在する必要があり、また一意である必要があります。

 

なお、名前の代わりにシグナル要素のGUIDで指定できます。

 

BroadcastSignal("{996EAF52-6843-41f7-8966-BCAA0ABEC41F}");

 

なお、対象のシグナルにパラメータがある場合で、そのパラメータの値を指定したい場合には、UIBroadcastSignalを利用して下さい。UIBroadcastSignalは、以下のように第2引数に、パラメータ名とその値を指定します。

UIBroadcastSignal("シグナル名",{'パラメータ名1': 値1, "パラメータ名2": 値2, ... });

IS_IN()

IS_IN(状態名)のコマンドは、指定した状態内でシミュレーションが実行されている場合にtrueを戻します。マルチスレッドの場合には、いずれかのスレッドが実行されていればtrueになります。以下の内容は利用例です。

 

if (IS_IN("WaitingForInput"))

  BroadcastSignal("CancelPressed")

 

指定する状態名はモデル内で一意でなければなりません。

Trace()

Trace(文字列)コマンドは、指定した内容をログに出力できます。

シミュレーション実行時のログを他の方法で活用する場合など、ログに独自の情報を追加するような場合に役に立ちます。

待機時間

アクティビティ要素およびアクション要素に、タグ付き値durationを追加し、その値として数値を指定すると、その数値の分だけ該当の要素でシミュレーション動作が停止します。例えば、「5」を指定した場合には、シミュレーション動作の5ステップ分、該当要素から次の要素に遷移しません。

なお、タグ付き値の値には数値の他、変数や式などを指定できます。

モデルの編集

シミュレーション実行開始時に対象のモデルの内容を解釈しているため、シミュレーション実行中にモデルの内容を変更した場合でも、シミュレーションの動作結果は変わりません。

対象のパッケージ

シミュレーション機能では、原則として、シミュレーションを実行するパッケージ内に、シミュレーションに関係するすべての要素が含まれていなければなりません。

 

複数のパッケージに含まれる要素を対象とする場合には、パッケージ図を作成し、シミュレーションを実行するダイアグラムが含まれるパッケージから、そのシミュレーション中に呼び出される要素が含まれるパッケージへ、「インポート」の接続を作成する必要があります。

 

 

参照: