システムモデリングは、箱と矢印の迷路を進むような感覚になることが多い。構造図はシステムが何から構成されているかを定義するが、行動図はシステムが何を行うかを定義する。その中でも、状態機械図はシステムの動的動作を捉えるための主要なツールとして際立っている。これは単なるフローチャートではなく、時間の経過とともにシステムがイベントにどう反応するかを規定する論理エンジンである。これらの図の内部に隠された論理を理解することは、堅牢なシステム設計を確保するために不可欠である。
このガイドでは、SysML状態機械のメカニズムを探求する。基本的な構文を越えて、システムの信頼性を決定するアーキテクチャ上の意思決定を検討する。ネストされた階層から並行領域まで、細部が重要である。モデリングの正確さは、実装の正確さに直結する。

なぜ状態機械がシステムの整合性を定義するのか 🔒
現代のシステムはほとんど線形ではない。モードで動作し、例外を処理し、過去の出来事の記憶を保持する。単純な手順の連続では、現在の状態に応じて一時停止したり再開したり、異なる反応を示さなければならないシステムの複雑さを捉えることはできない。状態機械は、こうした状態を記述するための形式的枠組みを提供する。
複雑なシステムをモデリングする際、アクティビティ図にのみ頼ると曖昧さが生じる。アクティビティ図は流れを示すが、状態を内在的に追跡するわけではない。状態機械は、任意の時点でのシステムの状態を明示的に定義することで、このギャップを埋める。この違いは、安全が重要なシステム、組み込み制御装置、分散アーキテクチャにおいて極めて重要である。
状態機械を使用する主な利点には以下が含まれる:
- 明示的な状態定義: システムが存在しうるすべての状態が視覚的にマッピングされる。
- イベント駆動型論理: 変化のトリガーが、遷移と明確に関連付けられる。
- 履歴の保持: 入力時に以前の構成を記憶できる能力。
- 並行性: 同時に発生する複数の独立した動作をモデリングすること。
SysML状態機械の核心構造 🏗️
論理を解読するには、基本的な構成要素を理解する必要がある。状態機械は状態と遷移から構成される。これらの要素はイベントとガードを通じて相互作用する。各コンポーネントを明確に理解することで、設計フェーズにまで影響を及ぼすモデリングエラーを防ぐことができる。
状態と初期点
状態は、システムが不変条件を満たす、イベントを待つ、またはアクティビティを実行するという条件を表す。旅は初期点から始まる。これは、システムの開始状態を示す実心の黒丸である。ここから、エントリ動作を定義する最初の遷移が発生しなければならない。
遷移とイベント
遷移は一つの状態を別の状態に接続する。これはステータスの変化を表す。遷移が発生するためには、通常、以下の3つの条件が満たされる必要がある:
- イベント: 何らかの出来事が発生しなければならない(例:信号の到着、タイマーの期限切れ)。
- ガード条件: 真に評価されなければならないブール式。
- 効果: 遷移中に実行されるアクション(例:データのログ記録、メッセージの送信)。
エントリおよびエグジットアクション
状態は、入るときや出るときに特定の動作を要求することが多い。これらはエントリアクションおよびエグジットアクションとして定義される。
- エントリアクション (/entry): 状態がアクティブになるとすぐに実行される。
- 状態を離れる直前に実行されるアクション(/exit): 状態を離れる直前にすぐに実行される。
- 実行中のアクティビティ: システムが状態に留まる間、継続的に実行されるアクション。
システムが「キャリブレーション」状態に入るとするシナリオを考える。エントリーアクションはセンサーの初期化を行う可能性がある。ドーアクティビティは継続的なチェックを実行するかもしれない。エグジットアクションはキャリブレーションデータを保存するかもしれない。これらの区別がなければ、操作のタイミングが不明瞭になる。
正確な状態履歴の管理 🕰️
SysMLの最も強力な機能の一つは、履歴を追跡できる点である。システムが複雑な状態を離れて後で戻ってきた場合、最初から再開するのか、それとも途中から再開するのか。この選択が、断続的な動作下でのシステムの振る舞いを定義する。
浅い履歴と深い履歴
履歴状態は、システムが過去の構成を記憶できるようにする。2つの異なる種類がある:
- 浅い履歴:複合状態内の最上位レベルの状態を記憶する。システムが戻ってきた場合、最後にいた最上位のサブ状態に移行し、より深いレベルは無視する。
- 深い履歴:すべてのネストされたパスを記憶する。システムが戻ってきた場合、すべてのネストされたレベルを含めて、正確にそのサブ状態に戻る。
この区別は、複雑なモード切り替えを経るシステムにとって非常に重要である。深い履歴状態は、操作のコンテキストが保持されることを保証し、再初期化ルーチンの必要性を減らす。
履歴状態の実装
図では、履歴状態は内部に’H’がある円で表される。通常、イベントによってトリガーされる遷移を通じて状態に接続される。浅い履歴と深い履歴の選択は、明確に文書化されなければならない。なぜなら、システムの復旧ロジックに影響を与えるからである。
直交領域を用いた並行処理 ⚡
システムが単一の次元で動作することは稀である。たとえば車両システムは、推進、ブレーキ、ナビゲーションを同時に管理する。これらの振る舞いはしばしば独立しているが、同じシステムインスタンス内で発生する。SysMLは直交領域を通じてこれを処理する。
分割状態と結合状態
並行処理をモデル化するため、状態は太いバーで区切られた複数の領域に分割される。このバーが分割を表す。システムが複合状態に入ると、すべての領域が同時に活性化される。結合バーは、これらの領域が同期する場所を示す。
直交モデル化の利点
- 分離:異なる関心事項が別々にモデル化される。
- 明確さ:単一の巨大な状態機械の複雑さを軽減する。
- スケーラビリティ:既存のロジックを乱すことなく、新たな並行動作を追加できる。
しかし、並行処理は同期のリスクをもたらす。設計者は、共有リソースが領域間で正しく管理されることを確認し、レースコンディションを防ぐ必要がある。
状態機械とアクティビティ図の使い分け ⚖️
状態機械図とアクティビティ図の間に混乱が生じることがよくあります。両者とも動作を記述しますが、その範囲は異なります。適切なツールを選択するには、モデル化しようとしている論理の性質に応じます。
| 機能 | 状態機械図 | アクティビティ図 |
|---|---|---|
| 主な焦点 | システムのモードと状態 | プロセスの流れとアルゴリズム |
| 状態の保持 | 明示的(現在の状態の記憶) | 暗黙的(変数がデータを保持) |
| イベント処理 | 反応型(外部のトリガーによって駆動) | 能動型(データの流れによって駆動) |
| 並行処理 | リージョンを介したネイティブなサポート | フォーク/ジョインを介したサポート |
| 最適な用途 | 制御論理、モード、状態 | ワークフロー、データ処理 |
システムがイベントを待つ必要がある、または特定のモードを維持する必要がある場合は、状態機械を使用してください。操作の順序やデータ変換に焦点を当てる場合は、アクティビティ図を使用してください。多くの場合、アクティビティが状態機械の遷移をトリガーするようなハイブリッドアプローチが必要です。
避けるべき一般的なモデル化の落とし穴 ⚠️
経験豊富なモデル化者でも曖昧さを導入してしまうことがあります。一般的なミスを避けることで、モデルが信頼できる仕様のまま保たれます。
1. 過度に細かい状態
小さな変数の変化ごとに状態を作成すると、読みにくい密集した図になります。状態は、システムの重要な状態を表すべきであり、すべての中間データポイントを表すものではありません。
2. デフォルト遷移の欠落
すべての状態は予期しないイベントに対応する必要があります。特定のイベントが状態に対して定義されていない場合、システムの動作は定義されません。例外を管理するために、デフォルト遷移または一般的な状態処理メカニズムを実装するべきです。
3. 円環依存
ガード条件のない即時ループを生成する遷移は、無限実行を引き起こす可能性があります。ループに明確な終了条件またはガード節があることを確認してください。
4. エントリ/エグジット効果の無視
エントリまたはエグジット効果を定義せずに、状態内に論理を配置すると、副作用が隠れてしまいます。状態が有効化または無効化されたときに何が起こるかを常に明確にしてください。
5. コントロールとデータフローの混合
状態機械はデータフロー図ではありません。データ操作をトリガーできる場合もありますが、主な論理はコントロール指向であるべきです。データ操作はアクティビティ図またはシーケンス図に留めてください。
構造モデルとの状態論理の統合 🔗
状態機械は孤立して存在しません。システムの構造モデルと相互作用します。状態機械は、他の図で定義された部品、ポート、信号を参照しなければなりません。
部品へのリンク
遷移はしばしばシステムの特定の部品に対する操作を呼び出します。たとえば、「エンジン起動」の遷移は「エンジンコントローラ」部品に対する操作を呼び出す可能性があります。このリンクは、動作が物理的または論理的なアーキテクチャに基づいていることを保証します。
信号の伝播
状態機械内のイベントはしばしば信号です。これらの信号はメッセージフローまたはインターフェース仕様として定義されなければなりません。信号の定義が受信者の期待と一致していることを確認することは、相互運用性にとって重要です。
明確なシステム動作のためのベストプラクティス 📝
モデルの明確さと権威性を維持するため、以下のガイドラインに従ってください。
- 一貫した命名:遷移には動詞を使用してください(例:「リクエストスタート」、「プロセス中止」)、状態には名詞を使用してください(例:「アイドル」、「処理中」)。
- 視覚的階層:関連する論理をグループ化するために複合状態を使用してください。トップレベルに多すぎる遷移を配置しないようにしてください。
- ガードの明確さ:ガード条件は単純に保ってください。条件が複雑な場合は、別途プロパティまたは関数として定義してください。
- ドキュメント:複雑な状態に注釈を追加してください。特定の設定の背後にある理由を説明してください。
- レビューのループ:ステークホルダーと定期的に状態機械をレビューし、論理が運用要件と一致していることを確認してください。
複雑な論理のための高度なパターン 🚀
基本を越えて、SysMLは高度なシナリオを扱うためのパターンを許可しています。
仮想状態
仮想状態は、階層を新たに追加せずに状態をグループ化するために使用されます。論理的な遷移に影響を与えることなく、図を視覚的に整理します。これにより、図は整理されつつも論理的なグループ化が維持されます。
マクロ状態
マクロ状態は、親機械内で単一の状態として機能する複合状態です。抽象化に役立ちます。複雑な状態機械をマクロ状態として定義し、上位レベルの図から参照することができます。
サブマシン状態
サブマシン状態により、外部の完全な状態機械を参照できます。これにより再利用が促進されます。複数のシステムが同じ認証論理を共有する場合、一度だけサブマシンとしてモデル化し、必要に応じて参照してください。
実装原則に関する結論 📊
システムの論理はその動作に埋め込まれています。状態機械の細部を習得することで、モデル作成者は堅牢で、保守可能で、明確な仕様を作成できます。抽象的な要件から具体的な実装への移行は、これらの図によって橋渡しされます。
複雑さよりも明確さに注目する。深さを管理するために階層構造を使う。記憶を管理するために履歴を使う。並列性を管理するために並行処理を使う。これらの原則を一貫して適用すれば、システムの挙動は予測可能で信頼性が高くなる。図は開発とテストを導く、生き生きとした文書となる。
システムの進化に伴い、モデルの精 refinement を続けること。静的なモデルはすぐに陳腐化する。動的なモデリングプロセスにより、システムの論理が運用上の現実と一致したまま保たれる。











