IBM Rhapsodyでシミュレーションを実行する

#IBM Rhapsodyとは
[IBM Rhapsody](https://www.ibm.com/jp-ja/products/uml-tools)は、OMG Systems Modeling Language™ (OMG SysML) を使用して、迅速な要件分析とモデルベースの設計を可能にします。モデルは、実行およびシミュレーションによって検証することができ、システムエンジニアチームが複雑な機能を短時間で設計するのに役立ちます。

#目次
[ユーザーインターフェースの追加](#1-ユーザーインターフェースの追加)
[アニメーションの実行](##2-アニメーションの実行)
[アニメーション実行結果](##-アニメーション実行結果)
[アニメーション終了](##-アニメーション終了)
[アニメーション動作の解説](##-アニメーション動作の解説)

#概要
いよいよ、Rhapsodyの最大の強みであるアニメーション（シミュレーション）の実行についてご紹介します。
![Presentation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/7bae92a4-3983-996b-167b-a0c9e05d33ae.gif)

#前回の記事
[ステートチャートを描く](https://qiita.com/daikan_murata/items/a0cd82c36d17508d02a2)
#手順
#1. ユーザーインターフェースの追加
アニメーションの実行を開始し、結果を表示するユーザーインターフェースを作ります。
前回の記事で作成したTimerのステートチャートを選択し、メインメニューから[編集]->[新規追加]->[制御]->[プッシュボタン]を実行し、ステートチャートの図（灰色）をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/c4617074-d9e7-563e-5cdd-3c8e395001ca.png)
ボタンが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/4cf51fdc-d651-d847-a44b-a743013e69b4.png)
ボタンにイベントを割り当てます。ボタンを右クリックしてメニューを表示し、[フィーチャー]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/307e9e64-1450-4b58-01a1-57f36606ea8d.png)
[要素のバインド]タブにおいて、BlockModelingパッケージを展開し、itsButtonの下のevPressを選択します。[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/54723453-42b0-1da5-5bcd-3034f8c17eb8.png)
Pushボタンを選択し右クリックメニューを表示し、表示オプションを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/eeb51c9a-597e-fe61-6da6-812e9420ab05.png)
[バインド要素]を選択し、[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/5591a9e8-dfa8-716e-f5ba-a1777f3ea141.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/38c409e6-12ac-2b73-83a1-84e6b3ad5018.png)
Pushボタンをコピーします。Pushボタンを選択して右クリックメニューを表示し、[コピー]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/7b1f8428-c4fe-107e-78b9-5b508b3a8926.png)
ダイアグラムの背景（灰色）を選択して右クリックメニューを表示し、[貼り付け]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/828c0d5a-44f5-b3a1-2b19-9af8ac98dc8d.png)
貼り付けたボタンを選択し、先ほどと同じ手順でevReleaseを割り当てます。[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/b733b1dd-1cd9-1701-2002-bce304525cf9.png)
evPressとevReleaseに対応するボタンの作成を完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/b2fa4b68-be77-bc99-8bdb-bec4d9738722.png)
続いて処理結果を表示する画面を追加します。ステートチャートの図を選択し、メインメニューから[編集]->[新規追加]->[制御]->[デジタル表示]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/32a11880-7a14-e63e-3bf1-ab7fbf300e56.png)
ステートチャートの図をクリックするとデジタル表示が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/e3172d27-7774-2a7c-3a9a-f81186bc83ac.png)
デジタル表示に値プロパティーを割り当てます。デジタル表示を選択して右クリックメニューを表示し、フィーチャーを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/51ac5831-c506-59c0-17ba-06bb2a08b433.png)
secondsを選択し、[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/d17c5691-9800-bf00-99fc-58224431de68.png)
デジタル表示を選択し、右クリックメニューを開き、表示オプションを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/7bc54bf5-628b-c45e-0390-d9ea57e4e8cf.png)
[バインド要素]を選択し、[OK]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/352da264-cb52-a021-3046-0ff533dcce8f.png)
ユーザーインターフェースの作成を完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/fb42fceb-70c1-bbb0-260d-2681f99c56d6.png)
##2 アニメーションの実行
シーケンス図やステートチャートで定義した内容が期待通りに動作するか実行します。
User Starts the Stopwatchシーケンス図を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/f880e162-cce8-f41d-2f55-aec6830813f0.png)
パースペクティブを[Getting-Started]から[Model-Execution]に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/12e34907-f853-ffd9-8a9b-b6c7467c720f.png)
メインメニューにおいて[シミュレーション]->[フルビルド]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/def8090b-7de9-bf1b-4802-5de47cd63261.png)
[はい]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/6b1675a8-90c3-bc28-7778-11d7f6ced932.png)
ビルド完了までしばらくお待ちください。ビルドに成功すると以下のコンソールウィンドウが起動します。最小化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/d25f0f2e-1f89-f7ae-2e96-690fca348153.png)
シミュレーション対応のシーケンス図が起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/ddb614b6-60b8-3a62-7aaf-9dde07da773d.png)
メインメニューの近く（リボンメニュー）にシミュレーションの実行を制御するボタン群が表示されます。
左から二番目の開始ボタンを実行し、アニメーションを開始しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/1734275d-c814-2cb3-4944-e9aa405cb98b.png)
Create操作の自動実行により、ButtonとTimerのインスタンスが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/c1998ee0-63be-d26e-dabc-adb30c7fe947.png)
Timerインスタンスをクリックし、右クリックメニューを表示し、[シミュレートされたステートチャートを開く]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/867c79c7-6c94-692b-627d-f4a4c1153419.png)
[前回の記事](https://qiita.com/daikan_murata/items/a0cd82c36d17508d02a2)で作成したTimerのステートチャートが表示されます。現在の状態は紫色の枠で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/3afaee53-e3a2-db41-ee24-61ccf3bc67ca.png)
再びシミュレーション対応のシーケンス図を開き、Buttonインスタンスを選択し、右クリックメニューから[シミュレートされたステートチャートを開く]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/2cb6e70b-c439-210b-6be9-976fb9225d6a.png)
現在はButtonUpの状態にいることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/f12d7ca9-5162-f302-eb33-0c160bbb120c.png)
Timerステートチャートに戻り、evPressに対応したボタンを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/8e72b849-4f3a-c0ee-73ff-6a53d779fa33.png)
Buttonステートチャートを確認すると、ButtonDownに状態が遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/ab8abcff-3b08-5bb8-48da-6ea779cbf797.png)
シミュレーション対応のシーケンス図に戻ります。evPressイベントが発行されたことにより、シーケンス図上でButtonDownの状態になったことが示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/c64367cb-d4f7-f34a-20d1-f3e1a0cc64c8.png)
再びTimerステートチャートに戻ります。evReleaseボタンを実行します。1秒毎にデジタル表示が更新されます。
# アニメーション実行結果
以上でアニメーションは終了です。設計通りに動作することを確認できました。
![Presentation1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/7bae92a4-3983-996b-167b-a0c9e05d33ae.gif)
#4. アニメーション終了
シミュレーションを一時停止します。左から6番目（黄色アイコン）を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/a23b264d-6312-b87c-ae6a-0f4a70fcd4f4.png)
左から8番目（赤色アイコン）を実行し、終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/d0a9d9c7-76aa-c8f4-6a66-853d0c531379.png)
[はい]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/37e4fb6a-41de-d7d6-61c2-f343571e0f56.png)
メインメニューから[ファイル]->[保存]を実行します。
シミュレーション対応のシーケンス図は今回は保存しないことにします。[いいえ]を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/d8fee1f9-2ab1-d67a-fb50-37ac026ff5d7.png)
# アニメーション動作の解説
アニメーションの動きを振り返ってみましょう。
###インスタンスの生成
アニメーションを開始すると、シーケンス図の定義に従い、ButtonインスタンスとTimerインスタンスが生成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/181f2f65-2ebc-574b-bbe6-26c67cff130e.png)
各ステートチャートで定義したデフォルト遷移に従い、ButtonUpとNotTimingとなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/9daedf16-1834-48a5-53e0-04e1ff86636b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/ca958407-31ec-8373-16c8-5b983e459e05.png)
###システム境界からevPressイベントの発行
Timerステートチャートに定義された左側のPushボタンをクリックすることにより、evPressイベントが発行されました。Pushボタンがシーケンス図におけるENV（システム境界）に相当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/4dbd3032-6e16-ae99-2c74-33dbaf8861db.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/1775bbd8-119c-a54f-2bb6-f81b0d6cc552.png)
###イベント受信と状態遷移
ButtonインスタンスがevPressイベントを受信します。Buttonステートチャートの定義に従い、evPressイベントをトリガーとしてButtonUpからButtonDownに状態遷移しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/a1137cd2-5582-82a5-4248-9597b0c35346.png)
###システム境界からevReleaseイベントの発行
次にTimerステートチャートに定義された右側のPushボタンをクリックすることにより、evReleaseイベントが発行されました。このPushボタンもシーケンス図におけるENV（システム境界）に相当します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/a0108a54-82a1-be24-ee81-0589f81b0146.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/1775bbd8-119c-a54f-2bb6-f81b0d6cc552.png)
###イベント受信後の送信アクション
ButtonDown状態にあるButtonインスタンスがevReleaseを受信します。それをトリガーとしてイベントを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/8f32dea1-a340-25ef-0823-9ec5495746b2.png)
evStartStop to itsTimer送信アクションは、Timerインスタンスに対してevStartStopイベントを送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/6b099414-66e6-923d-803f-2deb2751a3a6.png)
###incrementTime操作の呼び出し
evStartStopイベントを受信したTimerインスタンスは、ステートチャートの定義に従い、NotTiming状態からTiming状態に遷移し、1000ミリ秒毎に incrementTime()操作を呼び出しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/95fee8ed-84fc-5e59-fb79-4739595e8e92.png)
incrementTime操作では、secondsプロパティをカウントアップします。その結果がTimerステートチャートのデジタル表示に出力されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228422/139296cb-713b-70e1-f011-5874ff174f46.png)
シーケンス図やステートチャートをアニメーションで動作確認することにより、設計の妥当性を早期に検証し、設計開発の効率に寄与することができます。

以上で終了です。お疲れ様でした。

[IBM Rhapsodyのライセンス体系や価格](https://www.ibm.com/jp-ja/products/uml-tools/pricing)

#シリーズの最初の記事
[IBM Rhapsody評価版（無償）をダウンロードする](https://qiita.com/daikan_murata/items/49bdcb7c04eec14fe80d)