測定代行株式会社

お問い合わせ

測定代行株式会社

LabVIEWユーザーイベント(動的イベント)の使い方・作成・生成手順

LabVIEW高度アーキテクチャ解説

LabVIEW「ユーザーイベント(動的イベント)」の完全ガイド
作成・登録・生成・破棄の4ステップで極める並列ループ制御

画面のフリーズを防ぎ、プログラム側からイベント駆動トリガを自由自在に発生させる方法

LabVIEWのイベントストラクチャは通常、「フロントパネルのボタンクリック」などユーザーのUI操作をきっかけに動作します。
しかし、大規模な計測システムを構築していくと、「ユーザー操作ではなく、裏側のハードウェアデータ収集ループで異常値を検知した瞬間に、UIループのイベントを強制発生させたい」というケースが必ず出てきます。これをスレッドセーフ(安全)かつ低負荷に実現する仕組みが、**「ユーザーイベント(動的イベント)」**です。

ユーザーイベント

◆ ユーザーイベント(動的イベント)とは?

プログラム(VIコード)側から、イベントストラクチャに対して**「任意のタイミングで、好きなデータを載せてイベントを発生させることができる」**機能です。キューやノーティファイアに近いループ間通信の役割を果たしますが、最大の特徴は「UI側のイベントストラクチャの中に直接ケースを作って受信できる」点にあります。

◆ 制御に必要な4つの基本関数

関数パレットの「プログラミング > 同期 > ユーザーイベント」にある以下の4つをセットで使用します。
1. ユーザーイベントを作成(型定義・イベントの作成)
2. イベントを登録(ストラクチャへの紐付け)
3. ユーザーイベントを生成(トリガの送信)
4. ユーザーイベントを破棄(後片付け)

ユーザーイベント実装の4ステップとワイヤリング手順

ユーザーイベントは、以下の正しい順序でワイヤを接続していく必要があります。ブロックダイアグラム上での実装の流れを追ってみましょう。

ステップ 1:ユーザーイベントを作成(イベント作成)

並列ループが始まる前の初期化処理エリアに「ユーザーイベントを作成」関数を配置します。 この関数の「ユーザーイベントデータ型」端子に、イベントと一緒に送信したいデータ(例:数値、文字列、エラークラスタ、あるいは自作のクラスタなど)の定数を接続します。これにより、「そのデータ専用のイベントリファレンス」が作られます。

ステップ 2:イベントを登録(ユーザーイベント登録)

次に、「イベントを登録」関数(縦に長い、ダイナミックイベント用のアイコン)を配置し、先ほど作成したイベントリファレンスを接続します。 この関数から出力される「レジストリリファレンス」を、UI側にある**イベントストラクチャの左枠(ダイナミックイベント端子)**に接続します。

※イベントストラクチャの枠を右クリックし「動的イベント端子を表示」を選択しておく必要があります。紐付け後、イベントストラクチャのケース編集画面を開くと、ソース選択に「動的 > ユーザーイベント」が出現し、ケースを追加できるようになります。

ステップ 3:ユーザーイベントを生成(イベント生成)

データを送信(トリガを発生)したい別ループ(バックグラウンドのハードウェア制御ループなど)の中で、「ユーザーイベントを生成」関数を呼び出します。 ステップ1で分岐させて持ってきたイベントリファレンスを接続し、「データ」端子に送りたい値を入力します。この関数が実行された瞬間、UI側のイベントストラクチャにデータが超高速で一瞬にして飛び、対応するケース処理が実行されます。

ステップ 4:ユーザーイベントを破棄(クリーンアップ)

アプリケーションの終了処理エリア(すべてのループが停止した後)で、「ユーザーイベントを破棄」関数を実行し、メモリリソースを確実に解放します。

実務での王道応用例:マルチスレッド計測アプリの構築

測定代行株式会社が実際の開発現場で設計している、最も洗練されたアーキテクチャの一例です。

【応用例】ハードウェア異常検知時のUI緊急割り込みシステム

「メインUIループ(イベント駆動型)」と「温度データ収集ループ」の2つが並列で動いているシステムを想定します。

◆ プロの設計テクニック:アクターフレームワークの基礎へ
この「ユーザーイベント」を用いた双方向のイベント駆動通信は、NIが提供する高度なオブジェクト指向アーキテクチャである「アクターフレームワーク(Actor Framework)」や「キュー駆動型ステートマシン(QDSM)」のベースとなる重要な技術です。これらをマスターすることで、どれだけ規模が大きくなっても絶対にフリーズしない、保守性の高い完璧なマルチスレッドプログラムが書けるようになります。

ユーザーイベントで初心者が嵌る2大落とし穴

◆ 落とし穴1:イベントの送信側と受信側の「データ型」の不一致
「ユーザーイベントを作成」で定義したクラスターの形状やデータ型と、「ユーザーイベントを生成」に流し込むデータの型が1ビットでも異なると、ワイヤにバツ印(壊れたワイヤ)が付き、実行できません。構造を変更した際は、すべての定数やサブVIの端子を一貫して更新する必要があります。

◆ 落とし穴2:ループ停止後の残存イベントによるエラー
UIループが先に終了した後に、バックグラウンドループがまだ動いていて「ユーザーイベントを生成」を実行してしまうと、有効な受信先(イベントストラクチャ)が存在しないため、LabVIEWは「エラー1056(無効なイベントリファレンス)」を吐き出します。並列ループを終わらせる際は、必ず「データ収集ループを止めてから、UIループを止める」という**正しい終了シーケンス(順番)**をキューやセマフォ等で制御してください。

高度なマルチループ・非同期システム開発は「測定代行株式会社」へ

「ユーザーイベントや動的イベント登録を試してみたが、ワイヤリングが複雑でバグが取れない」「スレッド間でデッドロックやエラーが発生してシステムが止まってしまう」「アクターフレームワークレベルの本格的なメッセージ駆動型アプリを外注したい」といった高度な技術課題は、すべて測定代行株式会社にお任せください。

弊社は、元・横河電機のR&D部門で光学測定器などの最先端ハードウェア制御・ロジック設計を経験したエンジニアが代表を務める、LabVIEW受託開発のプロフェッショナル集団です。大学の最先端研究室や大手企業の実験室向けに、何日連続で動かしても一切のメモリリークや動作遅延を起こさない、堅牢で美しいプログラム(VI作成)を構築いたします。

◆ ソースコード(VI)はブラックボックス化せず完全譲渡
測定代行株式会社が納品するLabVIEWプログラムは、すべてソースコード(VIファイル)を開示し、完全譲渡いたします。開発会社による囲い込みリスクが一切ないため、納品後は大学の研究者様や企業のエンジニア様ご自身の手で、自由に仕様変更や内製化・カスタマイズを行っていただけます。

LabVIEW高度システム設計・自動化のご相談(相談・見積無料)

明確な仕様書やドキュメントがない開発初期フェーズからの具現化、前任者が作ったスパゲッティコードの解析・リファクタリング、最新Windowsへの移行など、どんなお悩みでもお気軽にご相談ください。実務経験豊富なエンジニアが直接解決策をご提案します。

お電話での受付:平日 9:00~18:00

048-291-8807

LabVIEW開発・自動化について無料相談する