<< 目次を表示 >> ページ位置: シミュレーション > 外部実行の状態マシン > 外部実行の状態マシンのモデリング |
外部実行の状態マシン機能を利用するためのモデリングは、UMLのクラスおよび状態マシン要素を利用します。適切で実行可能なソースコードを生成するためには、モデリングにおいていくつかの守るべき点があります。UMLではない独自の内容としては、実行する状態マシンや動作条件(シナリオ)を決めるための外部実行の状態マシン要素の作成があります。この外部実行の状態マシン要素は、以下の点を決めるために利用します。
外部実行の状態マシンのための基本的なモデリング要素
次の表は、この機能を利用する際に利用する、基本的な構成要素です。
項目 |
説明 |
クラスとクラス図 |
クラス要素は、状態マシン要素を保持する存在として必要になります。例えば、簡単なテニスの試合を対象とする場合、プレーヤー・試合・得点・審判などがクラスの対象となります。それぞれが、実行時の状態遷移を定義する状態マシン要素を保持します。 クラス要素やクラス図の作成方法は、通常の方法と同じです。 |
状態マシン |
それぞれのクラス要素には動的な振る舞いを定義するための状態マシン要素とステートマシン図を保持します。それぞれの状態マシンには、そのクラスの振る舞いをステートマシン図の形式で定義します。 |
外部実行の状態マシン要素 |
外部実行の状態マシン要素は、ステレオタイプが付加された成果物要素です。ソースコード生成の対象となる範囲や、初期値などを指定するために必要となります。シナリオという観点から考えると、どのクラス要素が対象となるのか、どのクラス要素間で関係を持つのか、それぞれの要素の初期値の設定などの定義になります。 設定の観点では、外部実行の状態マシン要素は動作解析の設定と結びつけてソースコードを生成するディレクトリや言語等を定義するための要素となります。 この要素を右クリックして表示されるメニューから、ソースコードの生成・ビルド・実行を行うことができます。 |
ステートマシン図で利用可能な要素
以下の表は、この機能で利用可能なステートマシン図の要素です。
項目 |
説明 |
||
状態マシン |
最上部の領域の動作は以下の通りです。 既定の動作: 何も指定がない状態マシンが動作する場合には、最上部の領域が動作対象となります。 入場点がある場合: 入場点から遷移でつながる領域が動作対象となります。
複数の状態マシンがある場合: モデルブラウザ内の順序で実行対象が決まります。
利用できません
|
||
状態 |
以下の種類の状態に対応しています。
|
||
状態への遷移方法 |
以下の内容に対応しています。
|
||
サブ状態 |
サブ状態およびネストしたサブ状態に対応します。 ネストした状態の場合には、OnEntryやOnExitの処理は順次行われます。 |
||
遷移 |
以下の内容に対応しています。
これらの内容は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; };
|
||
初期状態 |
初期状態は、領域における開始位置を決定するために利用されます。初期状態から出力される遷移は1つのみです。 |
||
領域 |
動作のルール: 以下のような動作ルールがあります。
例えば、もし3つの領域が定義されている場合で、領域Aと領域Bにそれぞれ初期状態があるとします。この場合には、これらの2つの領域のみがアクティブになり動作します。 |
||
選択点 |
遷移が複合する場合、選択点から出る遷移のガード条件は、遷移実行中に動的に評価されます。 |
||
連結点 |
遷移が複合する場合、連結点から出る遷移のガード条件は遷移前に一括して評価され、条件を満たす場合のみ遷移します。 |
||
フォーク / ジョイン |
分割する場合、スレッドとして並行動作するわけではありません。完了イベントの仕組みを利用して別々に動作します。 |
||
入場点 / 退場点 |
領域が複数ある場合にはスレッドとして並行動作するわけではありません。完了イベントの仕組みを利用して別々に動作します。 |
||
履歴 |
|
||
遅延イベント |
内部遷移を作成し、効果の欄に 'defer();' と記述すると遅延イベントを定義できます。 |
||
接続点の参照 |
接続点の参照とは、状態マシン要素に入場点や退場点が定義されている場合に、その状態マシン要素の参照(インスタンス9となる状態が持つ入場点・退場点の定義との関係を示すものです。 |
||
状態の振る舞い |
状態のentry, do, exitのアクションは状態要素の操作として定義されます。それぞれのアクションの「既定のソースコード」として実際の振る舞いを定義します。テンプレートをカスタマイズすることで、この欄以外の内容をソースコードに出力するようにできます。 doアクションは、entryアクションの処理が完了後、完了イベントが発生するまでの間に呼び出されます。 |
シミュレーション位置とは異なる位置にある振る舞いの呼び出し
もし、サブマシン状態から現在のシミュレーション位置(クラス)に存在しない振る舞いを呼び出している場合には、対象の要素間に<<import>>の接続が必要です。一例として、以下のような状況とします。
Class1のサブマシン状態 S1 が、 Class2の状態マシン ST2 を呼び出す
この場合には、Class1 から Class2 へ <<import>>の依存の接続を追加する必要があります。これにより、コード生成時に生成対象の探索が広がり、適切にコード生成できます。
外部実行の状態マシン要素の再利用
外部実行の状態マシン要素を利用して、さまざまな前提でのシミュレーションを実行できます。例えば、アルミ箔の抵抗器と巻き線の抵抗器があるようなモデルのシミュレーションをする場合、これらの抵抗器は同じクラス要素の属性が異なるものとして定義できます。この場合には、'resistorType'のような属性を持ち、その値を変えてシミュレーションを実行することが考えられます。このように、同じ状態マシンの実行時の状態が異なる場合のシミュレーションを行うこともできます。
項目 |
説明 |
対象の図を開く |
定義を配置する図を開きます。 |
コピー対象の外部実行の状態マシン要素を選択する |
モデルブラウザ内で、対象の要素を選択します。 |
新しい要素として配置する |
Ctrl キーを押しながら要素を図にドロップすると、要素の配置ダイアログが表示されます。「配置形式」として、2つの選択肢が選択できます。 このうち、「インスタンス(成果物)」を選択すると、外部実行の状態マシン要素のインスタンスが作成できます。この要素について、名前を変更して設定値を変更して利用できます。 |