外部実行の状態マシンのモデリング

<< 目次を表示 >>

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

外部実行の状態マシンのモデリング

外部実行の状態マシン機能を利用するためのモデリングは、UMLのクラスおよび状態マシン要素を利用します。適切で実行可能なソースコードを生成するためには、モデリングにおいていくつかの守るべき点があります。UMLではない独自の内容としては、実行する状態マシンや動作条件(シナリオ)を決めるための外部実行の状態マシン要素の作成があります。この外部実行の状態マシン要素は、以下の点を決めるために利用します。

 

 

 

外部実行の状態マシンのための基本的なモデリング要素

次の表は、この機能を利用する際に利用する、基本的な構成要素です。

 

項目

説明

クラスとクラス図

クラス要素は、状態マシン要素を保持する存在として必要になります。例えば、簡単なテニスの試合を対象とする場合、プレーヤー・試合・得点・審判などがクラスの対象となります。それぞれが、実行時の状態遷移を定義する状態マシン要素を保持します。

クラス要素やクラス図の作成方法は、通常の方法と同じです。

状態マシン

それぞれのクラス要素には動的な振る舞いを定義するための状態マシン要素とステートマシン図を保持します。それぞれの状態マシンには、そのクラスの振る舞いをステートマシン図の形式で定義します。

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

外部実行の状態マシン要素は、ステレオタイプが付加された成果物要素です。ソースコード生成の対象となる範囲や、初期値などを指定するために必要となります。シナリオという観点から考えると、どのクラス要素が対象となるのか、どのクラス要素間で関係を持つのか、それぞれの要素の初期値の設定などの定義になります。

設定の観点では、外部実行の状態マシン要素は動作解析の設定と結びつけてソースコードを生成するディレクトリや言語等を定義するための要素となります。

この要素を右クリックして表示されるメニューから、ソースコードの生成・ビルド・実行を行うことができます。

 

 

ステートマシン図で利用可能な要素

以下の表は、この機能で利用可能なステートマシン図の要素です。

 

項目

説明

状態マシン

  • シンプルな状態マシン: 領域を1つのみ持つもの
  • 直交状態マシン: 領域を複数持つもの

 

最上部の領域の動作は以下の通りです。

既定の動作:  何も指定がない状態マシンが動作する場合には、最上部の領域が動作対象となります。

入場点がある場合: 入場点から遷移でつながる領域が動作対象となります。

 

  • 注意点 1: 入場点や開始状態などを持つ領域については、その要素から出力される遷移は1つのみである必要があります。
  • 注意点 2: 状態マシンをサブマシン状態から参照できます。その場合には、入場点・退場点の参照設定を行い、定義を結びつける必要があります。入場点・退場点の参照設定ダイアログを利用します。

 

複数の状態マシンがある場合: モデルブラウザ内の順序で実行対象が決まります。

  • サブマシン状態を含む場合には、1つのクラスに複数の状態マシンがある場合があります。
  • モデルブラウザ内の上下方向の順序を変え、最も上にある状態マシンが実行対象となります。

 

利用できません

  • プロトコル状態マシン
  • 状態マシンの再定義

状態

以下の種類の状態に対応しています。

  • 内部に要素や線を含まない、単純な状態
  • 1つの領域を持つ状態
  • 複数の領域を持つ状態
  • 状態マシンへの参照を持つサブマシン状態

状態への遷移方法

以下の内容に対応しています。

  • 既定の遷移
  • 明示的な遷移
  • 浅い履歴要素を経由した遷移
  • 深い履歴要素を経由した遷移
  • 入場点を経由した遷移

サブ状態

サブ状態およびネストしたサブ状態に対応します。

ネストした状態の場合には、OnEntryやOnExitの処理は順次行われます。

遷移

以下の内容に対応しています。

  • 外部要素への遷移
  • 内部要素への遷移
  • 内部遷移 (自分自身への遷移を作成し、kindをInternalに設定したもの)
  • 完了遷移および完了イベント
  • ガード条件による判定
  • 複合遷移
  • 複数の遷移がある場合の優先順位の決定ルール

 

これらの内容はUMLの仕様に準拠しています。

トリガ

外部実行のステートマシンは、シグナルのトリガにのみ対応しています。

呼び出し・時間・変更の種類のトリガには対応しません。

必要な場合には、独自に処理を実装する必要があります。

シグナル

シグナルには属性を追加可能です。シグナルの属性は、ガード条件や効果で参照できます。

以下のソースコードは、C++での効果の欄の記載例です。

 

if(signal->signalEnum == ENUM_SIGNAL2)

{

     int xVal = ((Signal2*)signal)->myVal;

}

 

Signal2は次のように生成されます。

 class Signal2 : public Signal{

 public:

    Signal2(){};

    Signal2(std::vector<String>& lstArguments);

    int myVal;

};

注意:

この内容の詳細は、生成されるソースコードの 'EventProxy' ファイルの内容が役立ちます。

初期状態

初期状態は、領域における開始位置を決定するために利用されます。初期状態から出力される遷移は1つのみです。

領域

動作のルール:

以下のような動作ルールがあります。

  • 領域内に初期状態要素がある場合、既定で動作する領域となります。
  • 領域内に初期状態要素がない場合、その領域は動作しません。含まれる状態は、それぞれ単純な状態として扱われます。
  • もし、遷移がリージョンに含まれる頂点の一つで終了する場合には、明示的な活性化が行われます。その結果、それらの領域も明示的に入力されない限り、その直交するすべての領域がデフォルトで活性化されます(複数の直交する領域は、同じフォーク擬似状態に由来する遷移を使って、明示的に並列に入力できます)。

 

例えば、もし3つの領域が定義されている場合で、領域Aと領域Bにそれぞれ初期状態があるとします。この場合には、これらの2つの領域のみがアクティブになり動作します。

選択点

遷移が複合する場合、選択点から出る遷移のガード条件は、遷移実行中に動的に評価されます。

連結点

遷移が複合する場合、連結点から出る遷移のガード条件は遷移前に一括して評価され、条件を満たす場合のみ遷移します。

フォーク / ジョイン

分割する場合、スレッドとして並行動作するわけではありません。完了イベントの仕組みを利用して別々に動作します。

入場点 / 退場点

領域が複数ある場合にはスレッドとして並行動作するわけではありません。完了イベントの仕組みを利用して別々に動作します。

履歴

  • 深い履歴要素は、状態を出る前にアクティブであった状態に戻ります。
  • 浅い履歴要素は、状態を出る前にアクティブであったサブ状態に戻ります。そのサブ状態内のアクティブな状態には戻りません。

遅延イベント

内部遷移を作成し、効果の欄に 'defer();' と記述すると遅延イベントを定義できます。

接続点の参照

接続点の参照とは、状態マシン要素に入場点や退場点が定義されている場合に、その状態マシン要素の参照(インスタンス9となる状態が持つ入場点・退場点の定義との関係を示すものです。

状態の振る舞い

状態のentry, do, exitのアクションは状態要素の操作として定義されます。それぞれのアクションの「既定のソースコード」として実際の振る舞いを定義します。テンプレートをカスタマイズすることで、この欄以外の内容をソースコードに出力するようにできます。

doアクションは、entryアクションの処理が完了後、完了イベントが発生するまでの間に呼び出されます。

 

 

シミュレーション位置とは異なる位置にある振る舞いの呼び出し

もし、サブマシン状態から現在のシミュレーション位置(クラス)に存在しない振る舞いを呼び出している場合には、対象の要素間に<<import>>の接続が必要です。一例として、以下のような状況とします。

 

    Class1のサブマシン状態 S1 が、 Class2の状態マシン ST2 を呼び出す

 

この場合には、Class1 から Class2 へ <<import>>の依存の接続を追加する必要があります。これにより、コード生成時に生成対象の探索が広がり、適切にコード生成できます。

 

 

外部実行の状態マシン要素の再利用

外部実行の状態マシン要素を利用して、さまざまな前提でのシミュレーションを実行できます。例えば、アルミ箔の抵抗器と巻き線の抵抗器があるようなモデルのシミュレーションをする場合、これらの抵抗器は同じクラス要素の属性が異なるものとして定義できます。この場合には、'resistorType'のような属性を持ち、その値を変えてシミュレーションを実行することが考えられます。このように、同じ状態マシンの実行時の状態が異なる場合のシミュレーションを行うこともできます。

 

項目

説明

対象の図を開く

定義を配置する図を開きます。

コピー対象の外部実行の状態マシン要素を選択する

モデルブラウザ内で、対象の要素を選択します。

新しい要素として配置する

Ctrl キーを押しながら要素を図にドロップすると、要素の配置ダイアログが表示されます。「配置形式」として、2つの選択肢が選択できます。

このうち、「インスタンス(成果物)」を選択すると、外部実行の状態マシン要素のインスタンスが作成できます。この要素について、名前を変更して設定値を変更して利用できます。