2010年09月15日
ステートマシン図を動かそう
今日はアドイン「AMUSE」の紹介。ドイツのとある会社が作成したもので、有料です。
何ができるかというと、ステートマシン図を動作させます(シミュレーション機能)。
一例として、以下のようなステートマシン図を考えてみました。自動ドアのつもりです。

これに対して、もう少し条件を追加していきます。まず、「ドア閉」の状態で人が来たらドアを開ける、ということで、「人検知」のトリガで遷移するようにします。そして、「ドア開」の状態で3秒経過したら「ドア閉じ中」に移動する、とします。
この「3秒」という値は、クラスの属性waitTimeとして保持することにしましょう。

これらの設定を行ったステートマシン図は、こんな感じです。

あとは、時間をカウントする部分ですが、これはクラスの操作として定義します。クラスに操作「addWait」 を追加し、プロパティ画面の「振る舞い」タブの「既定のソースコード」の部分に処理の内容を記述します。
(ちなみに、このサンプルはC#です。現状、このアドインはC#しか対応していないかも。)

そして、次に状態「ドア開」に、doアクションを追加します。 この追加したdoアクションと、クラスの操作を関連づけることができますので、先ほど作成した操作「addWait」を結びつけます。

(「振る舞い」の欄の右端にある「...」 ボタンを押すと、クラスの操作を選択・指定して、状態要素のアクションに関連づけすることができます。)
これで準備完了。AMUSEのウインドウから「実行」します。実行した直後の全体の画面は以下のような感じ。AMUSEの機能は、サブウインドウ(以下の画面のレイアウトでは、下半分)から呼び出すことができます。

このように、現在の実行時の位置が赤枠で表示されます。この状態では次に進むためにトリガが必要なので、停止しています。以下のように、トリガを指定してトリガを発行することができます。

(トリガの発行は、ショートカットキーの割り当ても可能みたいです。)
トリガ「人検知」を実行すると、そのまま「ドア開中」に流れ、「ドア開」に行き、doアクションを3回実行したら「ドア閉中」 に移動し、また「ドア閉」に戻ってきます。
(もちろん、この流れをアニメーションとして確認できます。動画として録画できると良いのですが... 文字だけで雰囲気を味わってください。この動作のスピードは調整できます。既定値の100ミリ秒では早すぎる感じです。)
このようなシミュレーション機能は何に役に立つのか、という例を紹介します。例えばこの状態でもう一度「人検知」を実行します。動作する結果は同じなのですが、先ほどのように「3秒停止」せずに、すぐに「ドア閉中」に移動してしまいます。
なぜなんだろう?と思って確認すると、以下のようにwaitTimeの値が、実行するたびにどんどん増えていくことがわかりました。

(この例では、waitTimeの値が5になっていることがわかります)
つまり、 waitTimeの初期化処理が漏れていたことが分かりました。これをどこかに追加することで、解決します。このように、モデルの中で動作の確認を行い、問題点の早期発見ができました。
あとは、このクラス要素からコード生成することで、この動作を行うソースコードが得られます。
(ちなみに、このアドインはEnterprise Architect Suiteシステムエンジニアリング版かアルティメット版でしか動作しない、とのことです。シミュレーション機能の部分についてはこの制限がある意味がわからなかったのですが、おそらくはこのコード生成まで含めて、ということなのではないかと思います。ステートマシン図からのコード生成は、Enterprise Architect Suiteが必要です。)
詳細・動画デモなどは以下のページから。
http://www.lieberlieber.com/unser-angebot/amuse.html
(ドイツの会社ですが、英語のコンテンツが一通り揃ってます。)
先に聞かれそうなので書いておきますと、C言語・C++言語への対応も予定しています、とのこと。
気になるお値段は900ユーロ。なお、現時点では日本から購入する方法はありません...。そのうち、海外から購入できるようなWebサイトを立ち上げるとのこと。需要がありそうであれば、うちからも販売し、サポートすることも検討します。
何ができるかというと、ステートマシン図を動作させます(シミュレーション機能)。
一例として、以下のようなステートマシン図を考えてみました。自動ドアのつもりです。

これに対して、もう少し条件を追加していきます。まず、「ドア閉」の状態で人が来たらドアを開ける、ということで、「人検知」のトリガで遷移するようにします。そして、「ドア開」の状態で3秒経過したら「ドア閉じ中」に移動する、とします。
この「3秒」という値は、クラスの属性waitTimeとして保持することにしましょう。

これらの設定を行ったステートマシン図は、こんな感じです。

あとは、時間をカウントする部分ですが、これはクラスの操作として定義します。クラスに操作「addWait」 を追加し、プロパティ画面の「振る舞い」タブの「既定のソースコード」の部分に処理の内容を記述します。
(ちなみに、このサンプルはC#です。現状、このアドインはC#しか対応していないかも。)

そして、次に状態「ドア開」に、doアクションを追加します。 この追加したdoアクションと、クラスの操作を関連づけることができますので、先ほど作成した操作「addWait」を結びつけます。

(「振る舞い」の欄の右端にある「...」 ボタンを押すと、クラスの操作を選択・指定して、状態要素のアクションに関連づけすることができます。)
これで準備完了。AMUSEのウインドウから「実行」します。実行した直後の全体の画面は以下のような感じ。AMUSEの機能は、サブウインドウ(以下の画面のレイアウトでは、下半分)から呼び出すことができます。

このように、現在の実行時の位置が赤枠で表示されます。この状態では次に進むためにトリガが必要なので、停止しています。以下のように、トリガを指定してトリガを発行することができます。

(トリガの発行は、ショートカットキーの割り当ても可能みたいです。)
トリガ「人検知」を実行すると、そのまま「ドア開中」に流れ、「ドア開」に行き、doアクションを3回実行したら「ドア閉中」 に移動し、また「ドア閉」に戻ってきます。
(もちろん、この流れをアニメーションとして確認できます。動画として録画できると良いのですが... 文字だけで雰囲気を味わってください。この動作のスピードは調整できます。既定値の100ミリ秒では早すぎる感じです。)
このようなシミュレーション機能は何に役に立つのか、という例を紹介します。例えばこの状態でもう一度「人検知」を実行します。動作する結果は同じなのですが、先ほどのように「3秒停止」せずに、すぐに「ドア閉中」に移動してしまいます。
なぜなんだろう?と思って確認すると、以下のようにwaitTimeの値が、実行するたびにどんどん増えていくことがわかりました。

(この例では、waitTimeの値が5になっていることがわかります)
つまり、 waitTimeの初期化処理が漏れていたことが分かりました。これをどこかに追加することで、解決します。このように、モデルの中で動作の確認を行い、問題点の早期発見ができました。
あとは、このクラス要素からコード生成することで、この動作を行うソースコードが得られます。
(ちなみに、このアドインはEnterprise Architect Suiteシステムエンジニアリング版かアルティメット版でしか動作しない、とのことです。シミュレーション機能の部分についてはこの制限がある意味がわからなかったのですが、おそらくはこのコード生成まで含めて、ということなのではないかと思います。ステートマシン図からのコード生成は、Enterprise Architect Suiteが必要です。)
詳細・動画デモなどは以下のページから。
http://www.lieberlieber.com/unser-angebot/amuse.html
(ドイツの会社ですが、英語のコンテンツが一通り揃ってます。)
先に聞かれそうなので書いておきますと、C言語・C++言語への対応も予定しています、とのこと。
気になるお値段は900ユーロ。なお、現時点では日本から購入する方法はありません...。そのうち、海外から購入できるようなWebサイトを立ち上げるとのこと。需要がありそうであれば、うちからも販売し、サポートすることも検討します。

