LabVIEW開発でループが増えすぎる前に知っておきたいこと

株式会社ペリテックでは、半導体・自動車・航空宇宙といった分野で、LabVIEW を使った試験装置や計測システムの開発を手がけています。

LabVIEW で規模の大きいシステムを安定して作り続けるには、担当者ごとに異なる個人の流儀ではなく、チーム全体で共有できる設計ルールが必要です。ここでは、ペリテックが社内で実際に運用しているLabVIEW設計3つのルールを紹介します。

3つのルール

  1. メインVIに配置するループは「イベントループ」と「シーケンスループ」の2つのみ
  2. それ以外の並列処理はすべてサブループVIとして実装する
  3. ループ間通信はFlow制御VIに集約し、コマンドの送信元はイベントループ・シーケンスループの2か所に限定する

1. なぜLabVIEWに設計ルールが必要か

LabVIEWはデータフローという直感的な記法を持ち、Whileループを1つ配置するだけで並列処理をを実現できます。この手軽さはLabVIEWの強みであると同時に、規模が大きくなるにつれて設計上の問題を引き起こしやすい側面でもあります。

■規模拡大にともなう典型的な問題

機能追加のたびにループが増加する

画面操作用・計測用・ログ表示用・アラーム監視用など、機能ごとにメインVI上へループを追加していくと、ブロックダイアグラムが複雑化し、全体の処理フローを把握することが困難になります。

ループ間のデータ受け渡しが場当たり的になる

あるループから別のループへデータを渡す際、グローバル変数やローカル変数をその都度使用すると、どのループがいつどの値を書き換えているか追跡できなくなります。

ループの内部にループが入れ子になる

繰り返し処理のためにケースストラクチャ内へ while ループを配置すると、外部からの停止指示やコマンドを受け付けられず、制御不能な処理ブロックが生まれます。

これらはいずれも小規模なシステムでは問題が顕在化しにくいですが、機能追加や改修が重なるにつれて保守性を著しく低下させます。ペリテックでは、こうした問題を構造的に防ぐために以下の設計ルールを明文化し、全開発に適用しています。

2. ルール① メインVIに置くループは「2つだけ」

ペリテックのLabVIEW開発では、メインVI(UI画面を持つ最上位VI)に配置するループを次の2つのみと定めています。

ループ役割と担当処理
イベントループUI イベント(ボタン押下・値変更・タブ切替など)を受け取り、対応する指示を他ループへ発行する。エラー状態の監視も担当する。
シーケンスループロギング開始・停止・収録中といった全体の動作フローを制御する。ケースストラクチャでステップを切り替えながら進行する。動作フローが変わった場合はケースの追加・削除で対応する。
メインVIの全体構成(ブロックダイアグラム)― イベントループ・シーケンスループ・サブループVI・Flow 制御VIの構成
シーケンスループの動作フロー(初期化→ロギング待機→収録→停止の状態遷移)

機器制御や計測など、並列で動かしたいその他の処理はすべてサブループVIとして実装します(ルール②)。

メインVIのループ数を制限する理由

メインVIはシステムの入り口であり、全体の構造を把握するための基点となります。ループ数を2つに限定することで「UIへの応答」と「全体フローの進行」のみに責務を集中させることができ、可能性と保守性を維持できます。また、メインVIにはイベントループとシーケンスループ以外のループを配置しないことで、並列処理が必要な場合はサブループVIとして切り出す習慣を徹底します。

3. ルール② 並列処理はすべて「サブループVI」に切り出す

機器の制御、計測、データの表示・保存など、それぞれ独立したタイミングで動かしたい処理は、サブVI化してその中にループを閉じ込める。ペリテックではこれを「サブループVI」と呼んでいます。

サブループVIは収録項目(アナログ信号、熱電対、CAN、GPSなど)や処理の種類(データ保存、グローバル変数管理など)ごとに独立して作成し、常時監視や常時収録を行う動作が必要な場合に使用します。

サブループVIの例処理内容対象機器・データ
アナログ信号収録VI波形取得・解析・判定DAQ、オシロ、VNA
熱電対収録VI温度データ取得熱電対モジュール
CAN収録VICANバスデータ取得CANインタフェース
GPS収録VI位置情報取得GPSモジュール
データ保存VI収録データのファイル出力CSV/TDMS等
グローバル変数管理VIループ間データ共有の一元管理システム全体
メインVI構成図(イベント処理ループ・シーケンス処理ループと各サブループVI)

機能追加の方針

「機能が増える → メインVIにループを追加する」ではなく、「機能が増える → サブループVI を追加する」という方針を徹底することで、メイン VI の構造をシンプルに保ち続けることができます。収録項目が増えた場合(例:LIN収録やデジタル信号集録の追加)はサブループVIを新規作成して対応してください。

■サブループVIの内部構造

サブループ VI の内部はシフトレジスタを使ったステートマシンで状態を管理します。メインVI から指示を受けるためにFlow制御VIを使用します。

なお、サブループVIの内部へ while ループを入れ子で配置することは禁止としています。ケースを一度抜けて同じケースを再実行する方式で繰り返しを実現してください(詳細は「禁止事項」章を参照)。

サブループVIのブロックダイアグラム外観(「初期化」→「収録」ケースで状態遷移)
サブループVIの処理フロー(エラー判定→イベント受付→収録動作のステートマシン構造)
■処理早見表
処理内容メインVIイベントループメインVIシーケンスループサブループVI
Flow制御VIによる指示発行
制御器のイベント処理
常時監視・常時収録動作
収録項目(CAN・LINなど)
データの保存処理
ドライバVIの配置
画面の更新処理
全体の動作シーケンス

各処理をどのループが担当するかを上記の表に整理しています。

4. ルール③ ループ間通信は「Flow制御VI」に集約する

並列で動作する複数のループ間でどのようにデータをやり取りするかは、LabVIEW 設計における重要な課題です。

ペリテックでは、キュー関数を使ってメインVI内の処理ループとサブループVIの間で指示(コマンド+パラメータ)のやり取りを行うための仕組みを「Flow 制御 VI」という 1 つのサブVIとして集約しています。すべてのループ間通信は必ずこのVIを経由させます。

4.1 Flow 制御VIの構成(4つのサブVI)

Flow 制御VIは次の4つのサブVIで構成されています。

VI名役割使用タイミング
INITキューを初期化するメインVI起動時(初期化シーケンス)
ADDコマンドをキューへ追加する(送信)イベントループ・シーケンスループからサブループVIへ指示を出すとき
PICKUPキューからコマンドを取り出す(受信)サブループVI・シーケンスループがコマンドを受け取るとき
ENDキューを終了・解放するメインVI終了時(終了処理シーケンス)
■LabVIEWキュー関数との対応

要素をエンキュー(ADD に対応)

要素をデキュー(PICKUP に対応)

4.2 転送データのフォーマット

Flow 制御VIで転送されるデータは、次のクラスタ形式で統一しています。

Cluster {
Command : String
// 例: “start”, “stop”, “end”
Parameter : Variant // 任意の型を格納(バリアント型)
}

コマンド/パラメータ クラスタ(転送データ形式)

コマンドは文字列、パラメータはバリアント型である。バリアント型は任意のデータ型を格納できるため、シンプルな指示から複雑な設定構造体まで同じ仕組みで扱える。

4.3 コマンド送信元の制限

Flow 制御VIを使って指示を出す(ADDを呼び出す)のは、メインVI上の2つのループからのみとしています。サブループ VI はコマンドの受信専用(PICKUP のみ使用可)とします。
この制限により、処理が複雑にならないようにしています。

ループコマンド送信(ADD)コマンド受信(PICKUP)
イベントループ
シーケンスループ
サブループ禁止
ループ間のコマンド通信フロー(イベント処理ループ→シーケンス処理ループ→各サブループVI)

コマンド送信元を限定する理由

送信元が複数のループに分散すると、あるコマンドがどのループから発行されたものかを追跡することが困難になります。イベントループ(ユーザ操作起点)とシーケンスループ(フロー制御起点)の2か所に集約することで、処理フローの全体像を常に把握できる状態を維持します。

4.4 Flow 制御VIを使った実装例

次のブロックダイアグラムは、シーケンスループが ADD でコマンドを送信し、サブループVI がPICKUPでコマンドを受け取ってステートを切り替える場面を示しています。

ADDによるコマンド送信(シーケンスループ側)― INIT後にADDでコマンドを送信する例
PICKUP によるコマンド受信とステート切り替え(サブループVI側)― PICKUPで取り出したコマンドに応じてステートを変更する例

5. 禁止事項

3 つのルールを徹底するために、次の実装パターンを明示的に禁止しています。いずれも短期的には実装が容易に見えますが、長期的に保守性を低下させる原因となります。

禁止① ループ間でのグローバル変数によるデータ受け渡し

グローバル変数は複数の VI 間でデータを共有できる便利な手段ですが、システムの規模が大きくなると「いつ・どのループが・どの値を書き込んだか」の追跡が困難になり、バグの原因となります。グローバル変数への書き込み場所を制限することで管理を行いやすくします。

グローバル変数管理VIによるアクセス一元化(各サブループVIは専用変数VIを通じて書き込み、管理
VI がメインVI側へ集約する)
バッファVI経由のデータ共有(サブループVIが表示用・保存用バッファVIへ書き込み、シーケンスループが読み取る)

推奨 代替手段
データの共有が必要な場合は、機能的グローバル変数(FGV)またはリファレンス私を使用します。やむを得ずグローバル変数を使用する場合は「グローバル変数管理 VI」を経由させ、メインVIとサブループVIそれぞれに専用のグローバル変数VIを割り当てた上でアクセス箇所を一元管理します。

禁止② サブループVIからのコマンド発行(ADDの使用)

サブループVIからFlow制御VIのADDを呼び出して他ループへコマンドを送信することは禁止としています。送信元が複数のループに分散すると、全体のフローを把握することが困難になるためです。Flow制御VIのイベント生成(ADD)はメインVIのループからのみ使用します。

推奨 代替手段
コマンドの送信はイベントループ(ユーザ操作起点)とシーケンスループ(フロー制御起点)の2か所のみに許可します。サブループVIはPICKUPを使ってコマンドを受信して処理を実行する役割に専念します。

禁止③ シーケンスループ・サブループVI内へのwhileループ配置

ケースストラクチャ内にwhileループを配置して処理を滞留させると、ステートマシンの構造が崩れ、外部からの停止指示やコマンドを受け付けられなくなります。

推奨 代替手段
繰り返し処理が必要な場合は、ケースを一度抜けて同じ処理ケースを再実行する方式で実装します。これにより各サイクルで停止指示やコマンドを受け付ける機会が生まれ、外部からの制御が可能な状態を保つことが出来ます。なお、回数が確定しているForループはこの制限の対象外となります。

6. 本ルールが特に効果を発揮する場面

ペリテックでは、自動車・半導体・航空宇宙分野の試験装置・データロガー開発においてこのルールを長年運用してきました。特に次のような要件を持つシステムで効果が得られます。

  • 複数の計測器・デバイスを同時並行で制御するシステム(アナログ・CAN・GPS等の多チャンネル収録)
  • 試験シーケンスが複雑で、後から収録項目・条件分岐・ステップ追加が発生しやすいシステム
  • 複数のエンジニアが分担して開発・保守を行うプロジェクト
  • 長期間にわたって機能拡張や改修が続く生産設備・評価装置・データロガー

一方で、単機能の小規模ツールに対してはこのルールが過剰になる場合もあります。プロジェクトの規模や保守期間を考慮した上で適用を判断してください。

関連動画

お問い合わせ

計測・試験システムのSIに関するご相談は、ペリテックWebサイトのお問い合わせフォームよりお寄せください。

技術資料 ダウンロード

本記事の技術資料は以下のボタンより無料でダウンロードが可能です。