データの受け渡しを伴わない、純粋なタイミング制御とCPU負荷低減の最適解
LabVIEWでの並列処理同期において、キューやノーティファイアは非常に便利ですが、内部的に「データのバッファ確保」や「データのコピー」を行うため、ごくわずかながらオーバーヘッド(処理遅延)が存在します。
「データそのものは別ルートで渡す(または渡す必要がない)ので、とにかく最速で『今だ!』というトリガタイミングだけを別ループに通知したい」という極限のリアルタイム性・応答性を求めるときに最適なのが、パレットの奥深くに用意されている**「オーカレンス(Occurrence)」**関数です。
オーカレンスは、LabVIEWにおける最もシンプルかつ軽量な**「合図(スターターピストル)」**の仕組みです。「発生」と「待機」という2つの主要操作のみで構成され、データ型の定義やメモリバッファの確保を一切行いません。通知を待つ側のループは完全にスリープし、合図が鳴った瞬間に極めて鋭いレスポンスで再始動します。
最大の違いは「データを載せられるか否か」です。ノーティファイアは通知と一緒に「文字列」や「数値」などのデータを送れますが、オーカレンスは「合図が起きた」というタイミングの事実しか送れません。その代わり、内部処理が極限まで削ぎ落とされているため、動作が圧倒的に軽量・高速です。
オーカレンスは、関数パレット「プログラミング > 同期 > オーカレンス」にあるわずかな関数を使い、以下のミニマムな流れで実装します。
ブロックダイアグラム上で「オーカレンス」関数(丸いアイコン)を配置します。これは他の同期関数の「作成」とは異なり、アイコン単体からオーカレンスリファレンスが直接出力される特殊な構造をしています。通常は並列ループの開始前に配置し、ワイヤを各ループへと分岐させます。
通知を受け取りたい While ループ内に「オーカレンスを待機」関数を配置します。 この関数にワイヤが到達すると、スレッドは一時停止し、CPU負荷を一切かけずに「合図」を待ち受けます。タイムアウト(ミリ秒)を設定して、一定時間合図が来なかった場合の例外処理を組むことも一般的です。
ハードウェアからトリガを検出した瞬間や、計算が完了したタイミングで、「オーカレンスを発生」関数を呼び出します。これにより、待ち受けていたすべての「オーカレンスを待機」関数が一斉に解放され、後続の処理が超高速に実行されます。
「ナノ秒・ミリ秒単位でタイミングを同期したデータサンプリングを行いたい」「プログラムの動作が重く、並列ループのオーバーヘッドを極限まで削りたい」「古いLabVIEWプログラムにあるオーカレンス構造のバグが直らない」といった高度な技術課題は、すべて測定代行株式会社にお任せください。
弊社は、元・横河電機のR&D出身エンジニアが代表を務めるLabVIEWソフト開発・実験装置システム構築の専門会社です。オーカレンスのようなプリミティブで強力な関数から、最新のデザインパターン(アクターフレームワークなど)までを網羅し、大学や公的研究所の過酷な実験環境でも24時間365日絶対にフリーズしない、超高速・超安定なソフトウェア(VI作成)を提供します。
明確な仕様書がない実験自動化の案件や、他社・前任者が作成したレガシーなプログラムの解析・ Windows11対応など、どんなお悩みでも大歓迎です。実務経験豊富なエンジニアが直接解決策をご提案します。
お電話での受付:平日 9:00~18:00
048-291-8807
LabVIEW開発・自動化について無料相談する