画面のフリーズを防ぎ、プログラム側からイベント駆動トリガを自由自在に発生させる方法
LabVIEWのイベントストラクチャは通常、「フロントパネルのボタンクリック」などユーザーのUI操作をきっかけに動作します。
しかし、大規模な計測システムを構築していくと、「ユーザー操作ではなく、裏側のハードウェアデータ収集ループで異常値を検知した瞬間に、UIループのイベントを強制発生させたい」というケースが必ず出てきます。これをスレッドセーフ(安全)かつ低負荷に実現する仕組みが、**「ユーザーイベント(動的イベント)」**です。
プログラム(VIコード)側から、イベントストラクチャに対して**「任意のタイミングで、好きなデータを載せてイベントを発生させることができる」**機能です。キューやノーティファイアに近いループ間通信の役割を果たしますが、最大の特徴は「UI側のイベントストラクチャの中に直接ケースを作って受信できる」点にあります。
関数パレットの「プログラミング > 同期 > ユーザーイベント」にある以下の4つをセットで使用します。
1. ユーザーイベントを作成(型定義・イベントの作成)
2. イベントを登録(ストラクチャへの紐付け)
3. ユーザーイベントを生成(トリガの送信)
4. ユーザーイベントを破棄(後片付け)
ユーザーイベントは、以下の正しい順序でワイヤを接続していく必要があります。ブロックダイアグラム上での実装の流れを追ってみましょう。
並列ループが始まる前の初期化処理エリアに「ユーザーイベントを作成」関数を配置します。 この関数の「ユーザーイベントデータ型」端子に、イベントと一緒に送信したいデータ(例:数値、文字列、エラークラスタ、あるいは自作のクラスタなど)の定数を接続します。これにより、「そのデータ専用のイベントリファレンス」が作られます。
次に、「イベントを登録」関数(縦に長い、ダイナミックイベント用のアイコン)を配置し、先ほど作成したイベントリファレンスを接続します。 この関数から出力される「レジストリリファレンス」を、UI側にある**イベントストラクチャの左枠(ダイナミックイベント端子)**に接続します。
※イベントストラクチャの枠を右クリックし「動的イベント端子を表示」を選択しておく必要があります。紐付け後、イベントストラクチャのケース編集画面を開くと、ソース選択に「動的 > ユーザーイベント」が出現し、ケースを追加できるようになります。
データを送信(トリガを発生)したい別ループ(バックグラウンドのハードウェア制御ループなど)の中で、「ユーザーイベントを生成」関数を呼び出します。 ステップ1で分岐させて持ってきたイベントリファレンスを接続し、「データ」端子に送りたい値を入力します。この関数が実行された瞬間、UI側のイベントストラクチャにデータが超高速で一瞬にして飛び、対応するケース処理が実行されます。
アプリケーションの終了処理エリア(すべてのループが停止した後)で、「ユーザーイベントを破棄」関数を実行し、メモリリソースを確実に解放します。
測定代行株式会社が実際の開発現場で設計している、最も洗練されたアーキテクチャの一例です。
「メインUIループ(イベント駆動型)」と「温度データ収集ループ」の2つが並列で動いているシステムを想定します。
"チャンバーAが過熱しています!"」という警告文字列を送信します。
「ユーザーイベントや動的イベント登録を試してみたが、ワイヤリングが複雑でバグが取れない」「スレッド間でデッドロックやエラーが発生してシステムが止まってしまう」「アクターフレームワークレベルの本格的なメッセージ駆動型アプリを外注したい」といった高度な技術課題は、すべて測定代行株式会社にお任せください。
弊社は、元・横河電機のR&D部門で光学測定器などの最先端ハードウェア制御・ロジック設計を経験したエンジニアが代表を務める、LabVIEW受託開発のプロフェッショナル集団です。大学の最先端研究室や大手企業の実験室向けに、何日連続で動かしても一切のメモリリークや動作遅延を起こさない、堅牢で美しいプログラム(VI作成)を構築いたします。
明確な仕様書やドキュメントがない開発初期フェーズからの具現化、前任者が作ったスパゲッティコードの解析・リファクタリング、最新Windowsへの移行など、どんなお悩みでもお気軽にご相談ください。実務経験豊富なエンジニアが直接解決策をご提案します。
お電話での受付:平日 9:00~18:00
048-291-8807
LabVIEW開発・自動化について無料相談する