私は医療機器の有限状態マシンを構築しました。FSM は、私が定義した XML フォーマットを介して構成可能でした。
ステート マシンを定義するには、ステート マップを使用したデジタル回路設計の経験に頼る必要があります。
私がターンパイク遷移マップと呼んでいるものを使用する必要があります。米国東海岸では、ほとんどの高速道路はターンパイクと呼ばれています。ターンパイク当局は、ターンパイク通行料の価格設定マップを発行します。料金所に 50 の出口がある場合、料金マップには 50 行 x 50 列のテーブルがあり、行と列の両方で出口を網羅的に一覧表示します。20 番出口と 30 番出口の通行料金を調べるには、20 行目と 30 列目の交点を探すだけです。
30 ステートのステート マシンの場合、ターンパイク トランジション マップは 30 x 30 のマトリックスになり、可能な 30 ステートすべてが行と列ごとにリストされます。行を CURRENT 状態に、列を NEXT 状態に決定しましょう。
交差する各セルには、現在の状態 (行) から次の状態 (列) への遷移の「価格」がリストされます。ただし、単一の $ 値の代わりに、セルは Inputs テーブルの行を参照します。これは遷移 ID と呼ぶことができます。
私が開発した医療機器 FSM には、String、enum、int などの入力がありました。入力テーブルには、これらの入力刺激が列ごとにリストされていました。
入力テーブルを作成するには、考えられるすべての入力の組み合わせをリストする簡単なルーチンを作成します。しかし、テーブルは巨大になります。あなたの場合、テーブルには4320行があり、したがって4320の遷移IDがあります。ただし、プログラムでテーブルを生成したため、面倒なテーブルではありません。私の場合、単純な JSP を作成して、トランジション入力テーブル (およびターンパイク テーブル) をブラウザーに一覧表示するか、csv としてダウンロードして MS Excel に表示しました。
これら 2 つのテーブルの作成には 2 つの方向性があります。
ターンパイク テーブルを構築する設計方向。すべての可能なトランジションを作成し、到達不可能なトランジションをグレー表示します。次に、遷移 ID として行番号を使用して、到達可能な遷移ごとにのみ予想されるすべての入力の入力テーブルを作成します。各遷移 ID は、ターンパイク遷移マップのそれぞれのセルに転写されます。ただし、FSM はスパース マトリックスであるため、ターンパイク トランジション マップのセルですべてのトランジション ID が使用されるわけではありません。また、同じ遷移条件が複数の状態変化のペアに適用される可能性があるため、遷移 ID を何度も使用できます。
テストの方向は逆で、入力テーブルを作成します。徹底的な遷移テストの一般的なルーチンを作成する必要があります。
このルーチンは、最初に遷移シーケンス テーブルを読み取り、ステート マシンをエントリポイント状態にして、テスト サイクルを開始します。各 CURRENT 状態で、4320 のすべての遷移 ID を実行する準備ができています。ターンパイク遷移マップの CURRENT 状態の各行には、有効な NEXT 状態の限られた数の列があります。
未使用の遷移 ID が CURRENT 状態に影響を与えないように、ルーチンが Inputs テーブルから読み取る 4320 行すべての入力を循環させたい場合があります。すべての効果的なトランジション ID が有効なトランジションであることをテストします。
しかし、それはできません。有効な遷移がポンピングされると、マシンの状態が NEXT 状態に変更され、以前の CURRENT 状態の残りの遷移 ID のテストを完了できなくなるためです。マシンの状態が変化したら、もう一度遷移 ID 0 からテストを開始する必要があります。
遷移パスは、周期的または不可逆的であるか、パスに沿って周期的セクションと不可逆セクションの組み合わせを持つことができます。
テスト ルーチン内では、その状態に送り込まれた最後の遷移 ID を記憶するために、各状態のレジスタが必要です。テストが有効な遷移 ID に到達するたびに、その遷移 ID がそのレジスターに残されます。そのため、サイクルを完了して既に通過した状態に戻ると、レジスタに格納されているものよりも大きい次の遷移 ID で反復を開始します。
あなたのルーチンは、移行パスの不可逆的なセクションを処理する必要があります。マシンが最終状態になった場合、エントリ ポイントの状態からテストを再開し、次の移行 ID から 4320 の入力を繰り返します。州のために。このようにして、マシンのすべての可能な遷移パスを徹底的に発見することができます.
幸いなことに、FSM は有効な遷移のスパース マトリックスです。これは、徹底的なテストでは、遷移 ID の数 x 可能な状態の 2 乗の数の完全な組み合わせを消費しないためです。ただし、従来の FSM を扱っている場合、視覚的または温度状態をテスト システムにフィードバックすることができず、各状態を視覚的に監視する必要がある場合、問題が発生します。それは醜いでしょうが、効果的なトランジションのみを視覚的に行う機器の追加テストに 2 週間を費やしました.
FSM で単純なリセットと遷移 ID の適用でエントリポイントに到達できる場合は、(テスト ルーチンがマシンを目的のエントリポイントに移動するために読み取るエントリ ポイントの状態ごとに) 遷移シーケンス テーブルは必要ない場合があります。エントリーポイント状態に。しかし、頻繁に状態ネットワークの中に入ってそこからテストを開始する必要があるため、ルーチンで遷移シーケンス テーブルを読み取ることができると便利です。
遷移マップと状態マップの使用法について理解しておく必要があります。これは、マシンのすべての可能性のある文書化されていない状態を検出し、ユーザーが実際にそれらをグレー表示したい場合 (遷移が無効になり、状態が到達不能になった場合) にインタビューするのに非常に役立つためです。
私が持っていた利点は、それが新しい機器であり、xml ファイルを読み取るようにステート マシン コントローラーを設計する選択肢があったことです。未使用のトランジション ID は本当に効果がないことを確認できました。
有限状態マシン コントローラーの Java リストについては、http://code.google.com/p/synthfuljava/source/browse/#svn/trunk/xml/org/synthfulを参照してください。テストルーチンは含まれていません。