この記事で扱っていること
- 任意の制御器の値を保存したり呼び出す方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWで作ったプログラムはフロントパネルに制御器を設置することによりユーザーが自由にパラメタを変えて実行することができます。
測定プログラムで、サンプリングレートやサンプリング数などを都度設定できて便利なのですが、「前に使ったパラメタを使用したい」なんて場合に、いちいち各種パラメタを設定しなおすのは面倒だったりします。
そこで、一度決めたパラメタを保存したり、保存したパラメタを反映させるための仕組みを考えてみました。
どんな結果になるか
この記事で紹介するのは、パラメタの保存、読み出しを行うためのサブVIなので、ここでは実際にこのサブVIを使った効果を確かめます。
例えば、以下の図のように適当な制御器を並べたプログラムがあったとします。

このプログラムに対して後で紹介するサブVIを使用すると、パラメタの保存や呼び出しができます。

上のはあまり意味のないプログラムですが、より実践的な例として、National Instruments社が出しているハードウェアであるDAQを使用した電圧測定のサンプルプログラムを使用した場合も紹介します。

プログラムの構造
仕組みとしては単純で「制御器値を指標で設定/取得」の関数を使用した、機能的グローバル変数チックな構造のサブVIとしています。

以下では各ケースについて紹介していきます。
まずは初期化のケースです。ここでは、保存、呼び出しの対象となる制御器がどのVIにあるかというVI自体のリファレンスと、そのVIにあるどの制御器を対象とするかのリファレンス(から取得した制御器指標)を取得しています。
VI自体のリファレンスは、メインVIのリファレンスを入れることになります。

次に、保存用の書き込みケースです。
制御器値を指標で取得関数に、先ほどの初期化のケースで用意したVIリファレンスおよび制御器指標の配列のデータを渡してやり、その結果出力であるバリアントデータをバイナリファイルに保存しています。

そして、ロード用の呼び出しケースです。バイナリファイルからバリアント配列で指定して読みこんだ値を制御器値を指標で設定関数に渡しています。

これら3つのケースをメインVIの中で使用します。
writeやreadの前に必ずinitを使用し、メインVIの中のパラメタ(制御器)で保存したりロードしたいものをリファレンスの配列としてまとめて渡します。
実装の仕方はいろいろ
さて、上で紹介したサブVIは、メインのVI(保存したい制御器のあるVI)と組み合わせて使用する必要があります。が、その組み合わせ方は一通りではありません。
例えば、ユーザーが「この時に保存したい」と思ったタイミングで保存させ、「この時に呼び出したい」と思ったタイミングで読み出したいという場合には、イベントストラクチャとの併用が考えられます。

一方、プログラムの使い方として「前回設定していたパラメタをプログラム実行時に毎回必ず呼び出す」ような使い方をしたければ、以下のようになると思います。
注意点としては、呼び出す対象となる制御器は呼び出しが終わってから各関数に渡す必要がああります。
例えば、以下のDAQのプログラムで「物理チャンネル」を保存していますが、もしこれがイベントストラクチャの外にあった場合、ファイルからの呼び出しが行われる(サブVIのreadが実行される)前にフロントパネル上の値がDAQmxチャンネルを生成の関数に渡ってしまいます。
ファイルから呼び出されて制御器に値が反映されてから、イベント(以下の図の場合には「測定開始」ボタンの値変更)が実行されることで、ロードしたパラメタをDAQmxチャンネルを生成の関数に渡すことができます。

この記事では、制御器の値を保存したり、その保存した値を呼び出す方法を紹介しました。制御器値を指標で設定/取得の関数はこういった場面で便利(というか他の場面であまり使われないかもですが・・・?)なので、覚えておいて損はないと思います。
ここまで読んでいただきありがとうございました。
コメント