LabVIEW +
ソフト開発 +
実験・研究装置開発 +
システム開発 +
納入事例 +
会社概要 +
LabVIEWの最大の強みは、複数のループを同時に走らせる「並列処理」が簡単に記述できる点にあります。しかし、複数のタスク間でデータを受け渡したり、実行タイミングを細かく制御しようとしたりすると、途端にプログラムの挙動が不安定になることがあります。
「ローカル変数やグローバル変数を使ったらデータの取りこぼしが発生した」「ループの待機関数(ミリ秒待機)の調整を誤ってCPU負荷が100%になってしまった」といった課題を解決するのが、パレットに用意されている「同期」関数(Synchronization)です。これらを上手く使いこなすことで、システムの安定性と処理効率は劇的に向上します。
LabVIEWにはいくつかの同期関数がありますが、まずは基本となる「キュー」と「通知器」の2つをマスターすることが「良い動き」を作る最短ルートです。
データを「1つずつ順番に並べて保持する」バッファ機構です。「生産者/消費者(Producer/Consumer)パターン」の核心となる関数です。
現在の最新のステータスを、他のループへ「ブロードキャスト(一斉通知)」するための機構です。
ローカル変数などを使って「データが変化するまでループを高速で回し続ける(ポーリング)」回路を組むと、PCのCPUコアを100%占有してしまい、システム全体のフリーズや遅延を引き起こします。
同期関数の「要素をデキュー(Queue)」や「通知を待機(Notifier)」には、データが届くまでループの実行を完全にサスペンド(一時停止)させる機能があります。データが届いた瞬間に1msの無駄もなく次の処理へ移行し、待っている間はCPU負荷をほぼ0%に抑えられるため、非常に滑らかで軽いシステムが実現します。
同期関数で待機させる際、デフォルトの「タイムアウト = -1(無期限に待機)」のままにしておくと、何らかの理由でデータが送られてこなかった場合にプログラムが完全にハングアップ(フリーズ)してしまいます。
待機VIのタイムアウト端子には、必ず 1000(1秒)などの適切な猶予時間 を入力してください。タイムアウトが発生した場合は、エラー処理を行ったり、定期的なバックグラウンド処理(生存確認やWatchdogのクリアなど)へとルートを逃がす設計にするのが、プロの組む「良い動き」の共通点です。
複数の並列ループから、同時に1つのシリアルポートやファイルに対して「書き込み」を行おうとすると、データが混ざってクラッシュします。このような場合は「セマフォ」関数を使用します。 資源へのアクセス権(トークン)を1つのループが取得している間、他のループのアクセスを待機させることで、複雑なマルチスレッド環境でも安全な機器制御が可能になります。
「複数のループ間でデータをやり取りさせたいが、データの同期がズレてしまう」「プログラムを動かすとパソコンのファンが激しく回り、CPU負荷が高くなって困っている」といったお悩みはありませんか?
測定代行株式会社は、LabVIEWを用いた高度なマルチスレッド処理・大規模システム開発のスペシャリストです。キューや通知器、セマフォ、レンデブーといった同期関数を適材適所で組み合わせ、ハードウェアの性能を最大限に引き出す、低負荷で高速な美しいプログラムアーキテクチャを構築いたします。
新規のシステム設計はもちろん、既存の不安定なプログラムの診断・改修(リファクタリング)まで、LabVIEWのことなら何でもお気軽にご相談ください。