この記事は、初心者向けのまずこれシリーズ第7回の補足記事です。データの保存をもっと簡単に行いたい、という方向けにもう少し内容を補足しています。
LabVIEWでデータを保存するためにファイルIOの関数を使用することはまずこれの記事で紹介しました。
ファイルを開いて、書き込んで、閉じて、という流れを3つの関数で実装するだけです。
もちろんもっと凝ったことをするのであればその限りではないのですがこれが基本形です。
とはいえ、それでもやっぱりファイルIOに慣れない、でもデータ保存をしたい!という場合のために、上位の関数を使用するという選択肢も紹介します。
パフォーマンス(プログラムの実行速度など)に目をつぶれば、決まった選択肢から構成を選ぶことにはなりますが、一般的に求められそうな機能を手軽に実装することができます。
なお、本記事ではファイル保存に絞って紹介しており、ファイルから値を読み取る部分については扱っていません。
上位関数と下位関数
本題に入る前に一応用語のお話から。
ファイルIOの関数を使用することを考えたときに、上位関数と下位関数という表現を目にすることがあります。
これはそういう区分があるよという違いで、特別覚える必要があるものではないのですが、
- 上位関数:特定の関数がまとまってある程度の機能を持ったもの
- 下位関数:上位関数を構成する個々の関数
といった分け方がされます。
要は上位関数は最初からある程度の機能のまとまりを持っているものの細かいカスタマイズができず、細かい指定を行うのであれば下位関数を使用する、ということになります。
ファイルIOの場合、上の段に表示された4つが上位関数でその下の関数が下位関数という区分になるかと思います。
実際プログラムを組むうえで、関数パレット上のどこからどこまでが下位関数なのか、ということを考えることにあまり意味はなく、上位関数は機能がまとまっている、下位関数は組み合わせて使用する必要があるということがわかればそれで十分な話です。
本記事ではこの上位関数を使用したファイル操作について扱っていきます。
上位ファイル関数のメリットとデメリット
まずこれの記事で紹介していたのは、冒頭で紹介した、開いて、書き込んで、閉じるという操作を下位関数を並べて書いた方法でした。
しかしそんなことはせず、上位関数だけでデータの保存は実現できてしまいます。後述するデメリットが気にならないのであれば、上位関数を使用してサクっとプログラムを構築してしまうのも手です。
例えば、上位関数と下位関数でともに数値のデータを保存するプログラムを書いたときにどのように違いが出るかを見ます。
この図を見てもわかるように、上位関数は関数を1つ置くだけで済んでいます。このシンプルさこそが上位関数を使用する一番のメリットです。
一方でデメリットとしてはカスタマイズ性に乏しいこととそして無駄が多いという点が挙げられます。
これらのデメリットは上位ファイル関数である「計測ファイルに書き込む」のようなExpress VI全体にも言えることで他の記事でも取り上げています。
スプレッドシートに書き込むの関数はExpress VIの見た目(水色アイコン)をしていないですが、実際はExpress VIと同様で結局中身がサブVIのようになっています。
試しにスプレッドシートに書き込むの関数をダブルクリックすると中には下位関数が使用されていることがわかるかと思います。
特に繰り返しデータを保存する場合には、ファイルを開いて書いて閉じるの3つの動作のうち、本当に繰り返すべきは「書いて」の部分だけで、開いて閉じるは(同じファイルを扱っているのであれば)一回ずつでいいはずです。
しかし実際は毎回これらの動作を繰り返すので、高速でデータを保存する場合にもしかするとデータ保存に思わぬ時間がかかってしまうことになりかねないと考えられます。
とはいえ、別にそこまで速さを追求しない、ということであれば便利なことは確かなので使い方に慣れておくのは良いと思います。
ということで、二つの上位ファイル関数の扱い方を以下で紹介していきます。
スプレッドシートに書き込む関数
まずはスプレッドシートに書き込む関数です。スプレッドシートという呼び名から、Excelのような形式を想像される方もいるかもしれませんが、Excelファイル(拡張子xlsxなど)はこの関数では扱いません。
csvファイル(Excelで開くことができますね)で使用することが多いと思いますが、別にtxtファイルへの出力にも使用できます。
基本的な使い方は簡単で、
- どのファイルに書き込むか、既存であれば上書きするのか、追加で書くのか
- どんなデータを書き込むか
を指定、入力します。
基本的な使い方は数の通りです。ファイルパスは入力をしていないとダイアログが表示されます。
注意点としては「ファイルに追加?」のブール入力です。これをTRUEにするのとFALSEにするのとで繰り返し同じファイルに値を書き込んだときの結果が異なります。
既存のファイルに新たに追加する際には必ずTRUEにする必要があります。同じプログラムの中でループ構造の中にこの関数を入れて使用する場合など特に注意します。
他の入力である、転置や形式文字列の部分については実際の例を見た方が分かりやすいと思います。
数値の情報だけでなく文字列の情報も入れることができます。下記の図では特に問題になっていませんが、日本語は文字化けすることもあるので、可能な限り英語(2バイト文字は使用しない)ことをオススメします。
一つの関数でこれだけ多彩なことができるのも上位関数の特徴です。これらの機能を使えれば十分、かつファイル保存の速度にこだわらないということであれば上記の例を元に使い勝手を確かめてみて実装してみるといいと思います。
計測ファイルに書き込む
もう一つ、ファイル保存に対する上位関数があり、それが計測ファイルに書き込む、です。こちらは見た目通りExpress VIとなっており、扱えるファイルの形式が
- lvm
- TDMS
- TDM
- Excel
から選ぶことができます。
どのファイル形式にするかは用途によるので以下の見た目を参考にしてみてください。
なお、tdmとtdmsは見た目が一緒なのですが、データの保存のされ方が異なります。ヘルプで「TDMとTDMSの違い」という項目に記載されています。なお、TDMSファイルの操作は下位関数を使用してできますが、TDMファイル操作は基本的にこのExpress VIでしかできません。TDMSについては別記事で紹介しています。
計測ファイルに書き込むの関数はまさにExpress VIらしく、これ以外の項目も色々選ぶことができます。ダイアログで表示されるこれらを指定することで、ある程度カスタマイズができます。
動作の項目では、大きく分けて、1つのファイルにずっと保存し続けるのか、あるいは指定した条件を達成したら別のファイルに切り替えて保存するかを選びます。
また同名のファイルが既に存在している場合にファイル名を変えるのか、末尾にデータを追加するのかあるいは上書きするのかといった選択も行います。
セグメントヘッダの項目では保存するデータが複数のチャンネルを持つ場合、それぞれのチャンネルの集録レート(サンプリングレート)が異なっていれば「1ヘッダ/セグメント」に、すべてのチャンネルが同じレートであれば「1ヘッダ」にするとして使い分けることができます。
ただ、Excelへ保存する場合にはそもそもこの項目は関係ない(選べない)ものとなっています。
X値列の項目は時間情報を保存するか、保存するとしたらチャンネル毎に表示するかあるいは全チャンネルのを代表して一つの列だけで表すかを決めます。
こちらも結局、全チャンネルが同じ時間情報を持つのであれば「1列」でよく、複数のチャンネルがそれぞれ異なる時間情報を持つ場合には「1列/チャンネル」として使い分けます。
もし複数のチャンネルが異なる時間情報を持つ(異なる集録レートで測定したデータ)場合、「1列」にしてしまうとデータと時間の組み合わせが正しくなくなってしまうので注意します。
デリミタの項目はデータの区切りをタブにするかカンマにするかという選択です。lvmの場合にのみ使用します。
これらの他に、ヘッダ情報を任意に追加できるファイル詳細と、TDM(S)に対して任意のプロパティを含めるための上級設定があります。
デメリットの部分でカスタマイズがしにくいとはいうお話をしたものの、ファイル操作に必要そうな機能は一通りそろっていると感じる方も多いと思います。
実際ファイル操作を行う上で考えうる操作は一通りできます。ただし、汎用的に使えるようにしている関係で、無駄なことも行われています。このために、ループの中で使用して、保存の処理に時間がかかりすぎるということも起こりえます。
もし実行してパフォーマンスを重視する必要が出てきた、そんなときには必要最低限の機能を実装できるように下位関数を使用することも検討します。
今回の記事では、ファイルへの保存をもっと簡単に行いたいという方のために機能がまとまった上位関数の説明をしました。
LabVIEWはプログラミング言語ですが、LabVIEWを扱っている人はプログラム作りそのものは仕事ではなく、何かLabVIEWで制御したり測定した結果を他に活かすことが重要という方も多くいるかと思います。
そういった方々に、こうした上位ファイル関数を使用することでより素早くプログラムを構築できるんだという便利さが伝われば嬉しいです。
ここまで読んでいただきありがとうございました。
コメント