Consistency of StateMachineby SparxSystems JapanEnterprise Architect 日本語版
ステートマシン図の整合性確保 マニュアル(2023/11/10 最終更新)

ステートマシン図の整合性確保 マニュアル

目次
1. はじめに .................................................................................................................................................. 3
2. ステートマシン図の長所と問題点 .......................................................................................................... 3
3. 状態遷移表の長所と問題点 ..................................................................................................................... 5
4. ステートマシン図と状態遷移表の連携 ................................................................................................... 7
5. 遷移パスの抽出 ....................................................................................................................................... 9
6. ステートマシン図のシミュレーション ................................................................................................. 11
7. ステートマシン図のコード生成 ............................................................................................................ 13
8. まとめ .................................................................................................................................................... 142

ステートマシン図の整合性確保 マニュアル

1. はじめに
UML を利用したモデリングにおいて、ステートマシン図は振る舞いを表現する図として利用される機会が少なくありません。特に、組込み機器の設計においては、状態が強く意識されることが多く、ステートマシン図が利用される頻度が高いです。
一方で、UML のステートマシン図単独では、第 2 章にて説明する問題点があります。この問題点に対処するためには、UML には含まれない、状態遷移表を組み合わせる必要があります。
このドキュメントでは、UML のステートマシン図と状態遷移表を組み合わせることで、ステートマシン図内の考慮漏れや抜けを排除し、整合性の確保を実現する方法を紹介します。さらに、ステートマシン図を「動かす」ことで、内容に問題がないかどうかをモデル上で検証する方法やソースコードの生成についても概要を説明します。
このドキュメントでは、Enterprise Architect16.1 ビルド 1628 での操作方法を説明しています。
状態遷移の設計では、状態の変化などの状況変化を起こすものとして「イベント」という言葉がよく利用されますが、UML では「トリガ」要素が対応します。Enterprise Architect およびこのドキュメン
トでは「トリガ」という言葉を使いますので、「イベント」という言葉に慣れている方は読み替えながらご覧ください。

2. ステートマシン図の長所と問題点
この章では、ステートマシン図と状態遷移表を比較することで、ステートマシン図の長所と問題点を確認します。
以下の図は、ステートマシン図の 1 つの例です。自動ドアを想定した例になります。

3ステートマシン図の整合性確保 マニュアル

このステートマシン図を見ることで、以下の内容が簡単にわかります。
✓

大きく分けると、ON と OFF の状態があること✓

ON の状態の中には 4 つの状態があり、基本的には、この 4 状態が循環すること
このように、ステートマシン図を利用することで、全体の構成や大まかな流れを効率的に把握できます。上の例のように状態が入れ子になっている場合など、複雑な状態遷移を把握する場面では特に効果的です。
一方で、ステートマシン図の問題点は、網羅的な内容の検証が容易ではありません。要素の配置や図の大きさなどによっては、全ての状態間について図上で漏れなく確認することは困難です。
また、例えば上の例の場合、閉鎖から開放には遷移の矢印がありません。このように、状態間に遷移の矢印が存在しない場合の背景がステートマシン図からは正確に判別できません。遷移がある場合には、状態間の遷移を確認した結果存在するという結論になったことがわかりますが、遷移がない場合に、4ステートマシン図の整合性確保 マニュアル✓

まだ確認していない✓

確認した結果、遷移がないという結論になったという 2 つの違いが分かりません。これは、UML の表現として、「遷移しない」ことを示す線が存在しないことが原因です。遷移の色などで区別する(例:遷移しない場合には灰色にする)ことも考えられます
が、余計な遷移が図内に表現されることで、ステートマシン図の長所である、簡単に全体構成を把握できる点が失われてしまいます。

3. 状態遷移表の長所と問題点
一方、同じ内容を状態遷移表(状態と状態との関係)で表現した例が、次の表になります。

状態遷移表の長所は、すべてのセルについて確認することで検証の網羅性を確保できる点です。つまり、上記の表の空いているセル全てに対して遷移があるかどうか確認することにより、漏れがないかどうかを確認できます。
また、状態遷移表には、上記の状態間の関係を示すものの他に、それぞれの状態においてトリガが発5ステートマシン図の整合性確保 マニュアル生した時の振る舞いを示す形式もあります。

この形式にすることで、それぞれの状態において、それぞれのトリガが発生した場合の振る舞いを確認できます。全てのセルに対して確認することで、トリガという観点からも漏れがないかどうかを確認できます。
状態遷移表の場合には、それぞれのセルに対して確認したかどうかをセル内に記入することで、確認済みなのか未確認なのかが判別できます。例えば、以下の例では、それぞれのセルに「N」(NeverHappen/Never Allowed – 決して発生しない、発生した場合にはバグ(=assert などで対処))と「I」(Ignore– 発生しうるが何もしない)を記入しています。これにより、確認したかどうかが分かります。
さらに、未記入のセルが 1 つありますが、ここは遷移の漏れを見つけたものです。状態遷移表にして網羅的に確認することで、ステートマシン図では気づかなかった漏れや抜けを発見することもできます。

6ステートマシン図の整合性確保 マニュアル

4. ステートマシン図と状態遷移表の連携
Enterprise Architect では、ステートマシン図と状態遷移表を連携させる方法として、次の 2 つがあります。
・Enterprise Architect の組み込み機能を利用する
・「状態遷移表 Ex アドイン」を利用する
Enterprise Architect の組み込み機能を利用する場合には、ステートマシン図の背景で右クリックし、「状態遷移表」から希望する形式を選択してください。
「状態遷移表 Ex アドイン」は、動作期間限定アドイン(Enterprise Architect のサポートが有効な期間は無料でダウンロード・利用できるアドイン)です。ダウンロード・インストールが必要ですが、EnterpriseArchitect の組み込み機能で制限となっている内容・表現などへの対応のほか、ステートマシン図と状態7

ステートマシン図の整合性確保 マニュアル

遷移表を同時に並べて表示できます。図や表の内容をクリックすると、他方の関係する箇所が明示されますので、両方の形式で内容を確認しながら作業を進めることができます。このドキュメントでは、この「状態遷移表 Ex アドイン」の画面を利用しています。

アドインは以下の URL からダウンロードできます。
https://www.sparxsystems.jp/products/EA/tech/Addins.htm#StateTableEx

どちらの方法を利用する場合でも、以下のような特徴があります。これにより、ステートマシン図と状態遷移表の同一性が保証され、どちらの形式で変更しても問題ないということになります。
✓

ステートマシン図で変更した内容は、自動的に状態遷移表に反映される✓

状態遷移表で変更した内容は、自動的にステートマシン図に反映される

今回の例では、状態「閉鎖中」からトリガ(イベント)「人検知」が発生した場合に、状態「開放中」に遷移するという遷移を追加しますが、ステートマシン図でも状態遷移表でも、どちらでも編集可能です。
変更後の例は次のステートマシン図です。

8

ステートマシン図の整合性確保 マニュアル

さらに、状態遷移表では、以下のような操作が可能です。これにより、効率的に編集することができます。
✓

カーソルキーで選択されているセルを移動・I および N キーで、それぞれの記号を入力可能(Delete キーで削除)✓

右クリックメニューで遷移の追加や削除が可能

5. 遷移パスの抽出
ステートマシン図と状態遷移表を組み合わせて、漏れや抜けの確認を行うことができました。さらに内容を確認するための別の方法として、実際に可能性のある遷移パスを全て抽出し、個別に確認するという方法があります。
遷移パスの抽出のためには、動作期間限定アドインの「状態遷移パス抽出アドイン」を利用します。
動作期間限定アドインは、以下のページからダウンロードできます。
https://www.sparxsystems.jp/products/EA/tech/StatePath.htm
対象のステートマシン図を表示した状態で、アドインサブウィンドウに表示されるアドインのツールバーにある、実行ボタン(緑色の矢印ボタン)を押します。遷移数などの条件を指定後、抽出した結果が一覧で表示されます。一覧内の項目をクリックすると、その項目に関係するステートマシン図内の要素や接続のみが強調表示され、選択したパスを目で確認することができます。
(アドインサブウィンドウは、「アドイン・拡張」リボン内の「アドイン」パネルにある「ウィンドウ」ボ9ステートマシン図の整合性確保 マニュアル

タンを押すと開くことができます。)
パスの起点となる状態は濃い赤色で、それ以外の状態は薄いピンク色で表示されます。パスに関係する遷移は赤色で表示されます。
下の図は、遷移数 2 で抽出した場合の例です。
「開放中」→「開放」→「OFF」という遷移を示しています。今回の例のように、入れ子になっているようなステートマシン図の場合には特に効果的です。

なお、抽出した内容は Excel や CSV ファイルとして保存できますので、テスト項目として利用したり他のツールの入力情報として活用したりすることができます。
(ある状態から別の状態への遷移についてはテストされることも多く、また十分考慮されていることが多いです。一方で、状態間の遷移の結果何らかの処理が行われる場合など、例えば状態 A→状態 B→状態 Cのような場合で、状態 A→状態 B および状態 B→状態 C のそれぞれの単遷移では発生しない問題がある
10

ステートマシン図の整合性確保 マニュアル

場合があります。このアドインの出力データを利用することで、このような複数遷移の場合を挙げることができます。)「状態遷移パス抽出アドイン」についての詳細は、下記ページをご覧下さい。
https://www.sparxsystems.jp/products/EA/tech/StatePath.htm

6. ステートマシン図のシミュレーション
ここまで説明した方法により、ステートマシン図を網羅的に検証することを実現しました。さらに、ステートマシン図を動作させて、想定したとおりになっているかどうか確認することもできます。なお、
このシミュレーション機能は、コーポレート版以上のエディションで利用できます。
シミュレーション機能を利用する場合には、ステートマシン図内において、JavaScript の文法でガード条件やアクション(処理)を記述することになります。遷移のガード条件とアクションのほか、状態のentry/exit アクションの振る舞いとして処理を記述することができます。
対象のステートマシン図を右クリックし、「シミュレーションの実行」→「自動実行」を選択することで、シミュレーションを実行できます。
なお、最終的にソースコード生成する場合には、プロジェクトブラウザの構成を決められた形にする必要があります。パッケージの下にそのままステートマシン図を配置した場合には、ソースコード生成は利用できません。プロジェクトブラウザの構成が、下の図左側のような構成になっている場合でもシミュレーションの実施は可能ですが、最終的にソースコード生成を行う場合には、下の図右のように、クラス要素の下に状態マシン要素が配置される形にすることが必須です。

(モデルの記述のみの構成)(コード生成可能な構成)

11

ステートマシン図の整合性確保 マニュアル

シミュレーションサブウィンドウとシミュレーショントリガサブウィンドウを利用することで、シミュレーションの制御や情報取得が可能です。シミュレーションサブウィンドウは、「シミュレーション」リボン内の「シミュレーション」パネルにある「ウィンドウ」ボタンを押すと表示できます。シミュレ
ーショントリガサブウィンドウは、同じパネル内の「トリガ」ボタンで表示できます。
シミュレーションでは、状態にブレークポイントを設定し、ブレークポイントで停止した状態での変数の値を確認したり変更したりすることもできます。また、トリガが利用されている場合には、任意のタイミングでトリガを発行させて動作を変化させることができます。さらに、トリガの発行順序を保存して利用することもできます。
(これらの内容・操作の詳細は、ヘルプをご覧ください。)
シミュレーション機能は、実際に動作させることで問題を発見する手助けになります。例えば、今回の例では、内部で利用している、開放状態での待機タイマーのための変数の初期化処理が抜けているた
め、2 回目以降の「開放」ではすぐに「閉鎖中」に遷移してしまうという問題を、シミュレーション機能で発見することができます。

OFFスイッチON

スイッチOFF

ON
閉鎖

人検知

閉動作完了

人検知

閉鎖中

[sim.t >= 5]

開放中

開放entry / カウントアップ[sim.t < 5]

(実行中の一例)
なお、シミュレーション機能で利用する変数をローカル変数サブウィンドウに表示するためには、変数名が sim.あるいは this.で始まる必要があります。ステートマシン図のソースコード出力をする場合に12

ステートマシン図の整合性確保 マニュアル

は、この接頭辞 sim.を削除するようにコード生成テンプレートをカスタマイズすると良いでしょう。
C 言語/C++言語用にスパークスシステムズ ジャパンが提供するカスタマイズテンプレートでは、この削除の処理も含まれています。このテンプレートについての詳細は、次の章をご覧ください。
その他、シミュレーション機能の詳細については、Enterprise Architect のヘルプをご覧ください。

7. ステートマシン図のコード生成
ユニファイド版あるいはアルティメット版では、ステートマシン図などの振る舞い図からのコード生成も可能です。この機能を利用すると、状態遷移表やシミュレーション機能で検証した内容を、ソースコードとして出力することができます。
ソースコードを生成するためには、下図の構成のように、クラス要素の下に状態マシン要素を配置する必要があります。この状態で、クラス要素に対してソースコードの生成を実行することで、ステートマシン図の内容を含めた処理を出力することができます。

C 言語および C++言語の場合には、Enterprise Architect の標準の出力形式の他、スパークスシステム
ズ ジャパンでカスタマイズしたテンプレートを利用することもできます。いずれの場合にも、テンプレートの内容をそれぞれの部署・環境などに応じてさらにカスタマイズすることを想定しています。
参考: ステートマシン図から C 言語のソースコードを出力するサンプル
https://www.sparxsystems.jp/products/EA/tech/GenerateStateMachine.htm
参考: ステートマシン図から C++言語のソースコードを出力するサンプル
https://www.sparxsystems.jp/products/EA/tech/GenerateStateMachineCPP.htm

13

ステートマシン図の整合性確保 マニュアル

なお、上記のページで利用しているサンプルテンプレートでは、変数名やガード条件などで「sim.」を削除する処理を追加済みです。上記のプロジェクトブラウザの構成では、属性名 sim.t となっているものは、出力されるソースコードでは t となります。
また、下の例のように、モデル内で日本語を利用していると、その内容がそのままソースコードにも出力されます。ソースコード生成を行うことが前提であれば、モデルに記述する内容についてはそのプログラム言語で利用可能な形式・文字を利用する必要があります。

8. まとめこのドキュメントでは、状態遷移の設計をする際に、ステートマシン図だけでなく状態遷移表やシミュレーション機能などを利用して設計内容を検証する方法を紹介しました。さらに、ステートマシン図の内容をそのままソースコード生成することで、ステートマシン図の内容を実装する際の間違いを防ぎ、効率的に作業を行うことができます。
ステートマシン図からのコード生成の場合には、モデルの内容から自動的にソースコードを生成できる部分が大きいため、特に効果が大きいです。

14