有限状態マシンのプログラミング

イントロダクション

産業用アプリケーションでは、アルゴリズムがさまざまなモードで動作することがよくあります。2つの典型的な例は次のとおりです:

  • 検査モードやモデル定義モードなど、複数のユーザーインターフェースモードを持つアプリケーション。
  • "オブジェクトを検索する"、"オブジェクトを取る"などのモードを持つ、ロボットアームを案内するアプリケーション。

このようなアプリケーションは、有限状態マシン(FSM)として最もよく説明およびプログラムされます。以下は、グラフィカルな方法で描かれた例の図表です:

操作方法

Aurora Vision Studioでは、有限状態マシンはバリアントマクロフィルタおよびレジスタを使用して作成できます。 一般的なプログラムスキーマは、メインループマクロフィルタ(通常は「メイン」マクロフィルタ)と、その中にある有限状態マシンの各状態に対応するバリアントマクロフィルタから構成されます。個々のプログラムは詳細に異なる場合がありますが、ほとんどの場合、次の手順が良い出発点となります:

  1. バリアントステップマクロフィルタ(例:「App」)を作成して、個々の状態に対応するバリアントを持たせます。
  2. String型の分岐レジスタ(例:「regState」)を使用して、各状態に明確な名前を割り当てることができます。
  3. 最初はデフォルトのバリアントが1つだけ存在します。これを削除し、各状態に対応する意味のあるラベルを持つバリアントを1つ追加します。
  4. 分岐するレジスタの適切な初期値(初期状態)を設定することを忘れないでください。
  5. 通常は入力画像と主要なパラメータのために、マクロフィルタの入力を追加します。
  6. 各状態では、異なる方法で結果情報を計算できるように、マクロフィルタの出力を追加します。
  7. このバリアントマクロフィルタのインスタンスを、ループ内のいくつかのタスクに作成します。たとえば、「メイン」マクロフィルタ内で行います。
  8. 各状態で次の状態の値を計算し、計算結果を分岐するレジスタ次へポートに接続します。通常、ここではHMIボタンの出力がブロックの入力として使用されます。
  9. オプション:メインループタスク内で、現在の状態に応じて個々のコントロールを有効または無効にするための式を作成します(現在の状態値をバリアントステップの出力として公開することも必要です)。

完全な例については、「HMI Start-Stop」サンプルプログラムを参照してください。このプログラムは「Inspecting」と「Stopped」の2つの状態に基づいています。最初の状態では入力画像が処理され、2番目の状態では処理されません。ユーザーはStartおよびStopの2つのボタンを使用して現在の状態を制御できます。

シンプルな有限状態マシンを使用した例のアプリケーション

注意: "ProgramControlBox"という標準のコントロールもあり、「Start」、「Iterate」、「Pause」のボタンを提供します。これは非常に簡単に使用できますが、カスタマイズはできません。有限状態マシンを使用すると、任意のカスタムな状態と遷移セットを作成できます。

ブロッキングフィルタ

より複雑なプログラムロジックを作成する際に有限状態マシンのアプローチを使用する場合、トリガーモードに設定された画像取得フィルタ(例:GigEVision_GrabImage)の使用を避けるべきです。これらのフィルタはブロッキングされており、プログラムの実行がトリガーを待機するときに停止し、この時間中に他の計算は実行されません。ボタンクリックなどのイベントは、次の画像が取得されるまで処理されません。

アプリケーションがトリガーモードでカメラまたは複数のカメラを使用している場合は、タイムアウトを持つフィルタ(GigEVision_GrabImage_WithTimeoutまたはGenICam_GrabImage_WithTimeout)を使用することをお勧めします。 これらのフィルタはタイムアウト後にNilを返し、画像が取得されなかった場合です。したがって、これらをループ内で使用してイベントを処理し、新しい入力画像がある場合にのみ検査部分が条件付きで実行されるようにすることができます。

詳細については低フレームレートアプリケーションでのイベント処理も参照してください。