HMIイベントの処理

イントロダクション

Aurora Vision StudioのHMIモデルは、プログラムのループに基づいています。各イテレーションの最初のフィルタが実行される前に、マクロフィルタはHMIコントロールからデータを読み取ります。その後、すべてのフィルタが実行された後、マクロフィルタは結果をHMIに送信します。これは各イテレーションごとに繰り返されます。

この通信モデルは、典型的なマシンビジョンアプリケーションに非常に使いやすく、それは高速な画像取得ループに基づいており、HMIは主にパラメータの設定と検査結果の観察に使用されます。ただし、多くのアプリケーションでは、エンドユーザーが設定したパラメータを使用するだけでなく、ボタンクリックなどのイベントを処理する必要があります。

Aurora Vision Studioでは、特定のイベントが発生した直後に特定のアクションを実行するために、プログラム実行プロセスとは独立してイベントを処理するHMIサブシステムも提供されています。これにより、ほぼリアルタイムでユーザーの入力(ボタンのクリック、マウスカーソルの移動、値の変更など)に応答するユーザーインターフェースを作成できます。もしもイベントがプログラム実行プロセスだけで処理される場合、これは不可能でした。

イベントハンドラ

イベントハンドラは、関連するイベントが発生したときに実行するアクションが含まれるAurora Vision Studioのサブプログラムです。実際には、それはマクロフィルタであり、受信したイベントごとに一度実行されます。同じ手順をトリガーする必要がある複数のHMIコントロールがある場合、1つのイベントハンドリングマクロフィルタをすべてのコントロールで使用できます。

イベントハンドラの作成

イベントハンドラを作成するには:

  1. イベントのソースとなるHMIコントロールを左クリックし、そのプロパティに移動します。
  2. 「イベント」ウィンドウに切り替えるには、アイコンをクリックします:
  3. これにより、最も一般的に使用されるイベントがハンドリングできる「イベント」ウィンドウが開きます。イベント名の隣にあるドロップダウンリストをクリックし、「<add new...>」を選択します:
    注:利用可能なイベントは他にもたくさんあります。完全なリストを表示するには、HMIコントロールを右クリックし、「ポートとイベントの可視性の編集...」を選択し、[イベント]タブに移動します。
  4. ポップアップウィンドウでイベントハンドラの名前を定義します:
  5. 一部のイベントタイプ(例:マウス移動)は、実行されたアクションに関する追加情報を送信できます。イベントハンドラを作成する際に、入力パラメータ(追加情報を含む)を作成するかどうかを指定する必要があります。このオプションを選択すると、作成されたイベントハンドラにはイベントハンドリングアルゴリズムで使用できるいくつかの入力があります。入力パラメータを使用する実際の例は、View2DBox HMIコントロール上のマウスクリックイベントハンドラです:
    注意:入力パラメータを使用する場合、イベントハンドラは作成されたHMIコントロールにのみ割り当てられ、他のコントロールで使用することはできません。複数の異なるHMIコントロール用に実行されるアルゴリズムを含むユニバーサルなイベントハンドリングマクロフィルタを作成するには、[Add New Event Handler]ポップアップウィンドウで2番目のオプションを選択します。
  6. イベントハンドラが作成されると、プロジェクトエクスプローラーで利用できます:

イベントハンドラのキューイング

効率的にイベントを処理するアプリケーションを作成するには、イベントハンドリングマクロフィルタの実行メカニズムを理解することが重要です。特に、この記事で前述したHMIサブシステムが複数のイベントが短い間隔で発生した場合にそれらをキューイングする方法です。

HMIコントロールがアクションの発生を知らせるためにイベントを送信すると、HMIサブシステムはそのイベントを取得し、FIFOキューに格納します。このキューは、HMIイベントを処理するために専用のスレッドで処理されます。

サンプルのイベントシーケンスと、それらが処理される順序を示したタイムライン

これには重要な影響があります:

  • イベントハンドラには、後続のイベントの実行を遅らせる可能性がある時間のかかるアルゴリズムを含めてはいけません。
  • イベントは常に1つずつ処理されます。したがって、イベントハンドリング手順をできるだけ短くすることが重要です。
  • すべてのイベントハンドラは、メインプログラムループと並行して実行されますが、同時に2つのイベントハンドラは実行されません。
  • イベントハンドラで非フリーのデータ分析関数を使用する場合、ThreadLimitライセンス制限の対象となります。

イテレーションベースのイベント

イベントハンドラの他にも、イテレーションベースのモデルでアプリケーションを作成することができます。ここでは、イベントは標準のHMIコントロールの出力として利用可能です。これらのイベントはプログラム実行プロセスとは独立してHMIサブシステムによって検出されますが、このプロセスによって処理される必要があります。そのため、イベントが即座に検出されたとしても、プログラムがそのイベントに関連する着信HMI接続を持つ任意のマクロフィルタに入るまで待機する必要があります。この接続の値は正確に1イテレーションの間変化し、この特定のHMI出力が複数のマクロフィルタで接続されている場合、最初の読み取り時にHMIコントロールの値もリセットされます。

イベントシグナル(outValueChanged)を出力とするHMIコントロールの例

バージョン5.0まで、このアプローチはHMIイベントを処理する唯一の方法でした。イベントハンドラはイベントをアクションの発生直後に処理することを保証しますが、「古い」アプローチは引き続き使用されています。特に、以下のようなアプリケーションでは:

  • HMIは主にアルゴリズムの結果を表示し、パラメータを設定するために使用されています。
  • HMIコントロールが互いの状態と値を変更しない。例えば、1つのHMIコントロールのinEnabled状態が他のHMIコントロールの出力に依存しない場合。

イテレーションベースのイベントは、通常、次のタイプの要件を満たすために使用されます:

  1. アクション – たとえば、ユーザーがボタンをクリックした後に現在の入力画像をファイルに保存したい場合。
  2. 状態遷移 – ユーザーがボタンをクリックした後にアプリケーションが別の動作モードに切り替わることを期待する場合。

アクション

ImpulseButton(インパルスボタン)がクリックされると、そのoutValue出力は1つのイテレーションの間にFalseからTrueに変更されます。この出力は通常、次のいずれかの方法で使用されます:

  1. バリアントマクロフィルタのフォーキング入力として、Trueバリアントにはイベントが発生したときに実行されるフィルタが含まれています。
  2. 条件演算子if-then-elseまたは?:)を使用した、イベントに応じていくつかの値を計算するためのフォーミュラブロックの入力として。

状態遷移

アプリケーションを別の動作モードに切り替えるイベントの処理については、有限状態マシンのプログラミングの記事で説明されています。

低フレームレートアプリケーションでのイベントの処理

Aurora Vision StudioのHMIモデルは、プログラムが高速で連続的なループで実行され、サイクルが100 ms(秒間10フレーム)未満であると想定しています。アプリケーションのメインループが遅い場合、例えばカメラがトリガーされ、一定の時間トリガーシグナルを受信していない場合、HMIも遅くなるか停止します。

この問題を解決するには、画像処理とHMIイベントを異なる頻度で処理する必要があります。 推奨されるアプローチは、タイムアウト設定(100 ms)を持つ画像取得フィルタを使用し、条件付きで画像を処理し、少なくとも1秒間に10回、HMIイベントを処理することです。これは、GigEVision_GrabImage_WithTimeoutGenICam_GrabImage_WithTimeout、またはこの種の他の画像取得フィルタで行うことができます。

以下は、「InspectImage」マクロフィルタの実行モードの条件付きで、画像処理部分とHMIイベント処理部分を異なる頻度で処理するサンプルプログラム構造です。

HMI処理の高速サイクルと画像解析の低速サイクルを持つサンプルプログラム構造の例