この記事では、LabVIEWに標準機能として実装されているプローブ機能を、ユーザーが使いやすいようにカスタマイズするための機能、カスタムプローブについて紹介しています。
デバッグ方法をカスタマイズすることで、より便利なプログラミング環境を構築するのに役立ちます。
プローブ機能のおさらい
LabVIEWには数々の有用なデバッグ機能があり、プローブも使いこなせればかなり強力なデバッグ手法となります。
プローブは、指定したワイヤを通るデータ(値)を確かめる機能を持ちます。
「値を見るなら表示器付ければいいんじゃないの?」と思われるかもしれませんが、プローブは圧倒的に手軽です。

そして、複数のプローブを「プローブ監視ウィンドウ」でまとめてみることができるのも通常の表示器にはなかなかできません(フロントパネル上で表示器をまとめればできなくはないのですが手軽ではないです)。

数値だけ、とか文字列だけ、といったデータタイプの縛りもなく、何なら配列やクラスタのデータ、あるいはピクチャ表示に対しても使えます。
もちろん、エラークラスタに対してもプローブを設定することができます。

カスタムプローブとは
プログラム実行中の特定のワイヤ上のデータをその場で確認できるプローブは確かに便利なのですが、デバッグとしては「物足りない」と思う場面もあるかもしれません。
例えば、値の変化の履歴を残すことで、値の変化の様子を確認するようなデバッグが必要になる場合があります。
このようなときに活躍するのがカスタムプローブで、LabVIEWに標準的に用意されているものに「履歴プローブ」があります。
これを使用することで、値の変化を表示することができるようになります。

また、特定の条件を設定し、その条件を満たすとプログラムを一時的に停止できる、条件付きプローブ、というものもあります。

これらはどちらも、「カスタムプローブ」として選択できます。
しかし、場合によってはもっと特定の手段あるいは表示方法でデバッグを行いたいという場合もあり得ます。
そんなときには、自分でカスタムプローブを作成することができます。
例として、数値(スカラー)を例にとり、値の変化をチャート表示させて、さらに値を示す文字列部分も追加されたようなプローブを考えます。
やり方は簡単で、まずはプローブを起きたい部分のワイヤを右クリックし、カスタムプローブから「新規」を選択します。

この後、既存のカスタムプローブをベースに新規のカスタムプローブを作るか、最初から作るかの二択が出ます。
今回は最初から作る方法で紹介しますが、既存のカスタムプローブをベースにする方法でも考え方は同じです。

このカスタムプローブの画面が、そのままプローブ監視ウィンドウで表示される画面になります。
また、プローブ監視ウィンドウの左側に表示される文字列もカスタマイズすることができます。

これらのカスタマイズしたプローブは、C:\Users\<ユーザー名>\Documents\LabVIEW Data\Probesのフォルダに保存され、後から編集することも可能です。

例えば、以下の図のようにチャートを配置して、ブロックダイアグラム上でもValue Stringに渡す文字列データを「文字列にフォーマット」関数で編集したとします。

このカスタムプローブを実際のプログラムで使用すると、作成したフロントパネル通りの画面が表れ、テキストも指定した文字列で表示されます。

作り方がわかったところで、実際にオリジナルのカスタムプローブを作る例をいくつかご紹介します。
カスタムプローブの実装例
最大、最小、平均を調べる
まずは統計的な意味合いを持つプローブです。
そのワイヤをこれまでに通った値の最大値、最小値、平均を調べる機能を用意します。

この場合、「一つ前の時点での最大値は何だったか」といった、「前の値」が必要になります。
グローバル変数的なものを用意して値を保持しておくこともできるかもしれませんが、いちいち用意するのは面倒なので、代わりにフィードバックノードを使用していきます。
平均については、このプローブを配置し始めてからこれまでの全ての値の合計から求めた平均を表示します。
波形のFFTを表示する
波形データを扱う際の統計的処理の代表といえばFFTではないか、ということで、FFTを行う機能を持たせることもできます。

タイムスタンプ付きで履歴を表示する
標準でついている履歴付きのカスタムプローブは、確かに過去の値を残したまま表示してくれるので便利なのですが、タイムスタンプの情報はつきません。
タイムスタンプ付きでデータを表示させることで、データの更新のタイミングも一目で確認できるようになります。

データを保存する
工夫をすれば、データを保存するようなカスタムプローブも作成できます。
初めて呼び出された場合にファイルを作成、それ以降はそのファイルをopenするという設定にすることで、一つのファイルに保存していきます。

本来は、一度ファイルを開いたら、プログラム(この場合はカスタムプローブ)を閉じるまで開きっぱなしとし、最後にファイルを閉じるという処理をするのが一番効率がいいと思います。
しかし、カスタムプローブが閉じられるというタイミングがイベントストラクチャのパネルを閉じる?イベントでも検出できないことから、仕方なく毎回開いて閉じてを繰り返しています。
条件付きブレークポイントとして機能させる
カスタムプローブで条件によって一時停止させる機能を使うことで、条件付きブレークポイントのような使い方ができます。
例えば、5回呼び出されたらブレークポイントによってVIを一時停止させるようなことですね。

通常のブレークポイントは単純にこれが設定されたワイヤが実行されれば否応なしに実行を止めにかかりますが、例えば「5回に1回止める」みたいな条件を付けるにはカスタムプローブを使ったやり方で実現できます。
カスタムプローブはデータタイプごとに
最後に注意点を挙げておくと、カスタムプローブを作成した場合、「そのカスタムプローブを作成したデータタイプでしか使用できない」ものになっています。
例えば、I32の数値のデータタイプに対してカスタムプローブを作成した場合、他のI32のワイヤにそのカスタムプローブを適用することはできますが、U32だったりI8だったり浮動小数については同じカスタムプローブを設定できません。
そのため、それぞれのデータタイプごとにカスタムプローブを作る必要があります。
実際、LabVIEWで元々用意されているカスタムプローブも、数値に対してはI32やU64のような表示形式それぞれに対して対応するviが用意されています。

本記事では、デバッグ方法をカスタマイズする方法としてカスタムプローブを紹介しました。
LabVIEWには便利で効率のいいデバッグ機能が標準的に備わっていますが、より個々のアプリケーションに適したデバッグ方法を用いることでその効率を高めることができます。
デバッグ方法にお悩みの方に参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント