LabVIEWを触ったことがない方に向けて、それなりのプログラムが書けるようになるところまで基本的な事柄を解説していこうという試みです。
シリーズ7回目としてデータのファイル保存プログラムを扱っていきます。
この記事は、以下のような方に向けて書いています。
- LabVIEWではどのようにファイル保存のプログラムを書くの?
- 具体的にファイル保存をするプログラムの流れを知りたい
もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。
なお、前回の記事はこちらです。
LabVIEWでのデータ保存の考え方
前回の記事で数値を扱って摂氏華氏の変換プログラムができました。
しかし、こうした何かしらの結果を出すプログラムを実行してせっかく結果を得られても、そのままではプログラムを消したらその結果も消えてしまいますよね。
それではもったいない。ということでこの結果をファイルに保存することを考えます。
ファイルにデータを保存するのってなんだか難しそうじゃないですか?少なくとも私は最初そう思っていました。でも、LabVIEWでは次の3つのステップを覚えればできてしまうんです。
- ファイルを開く
- ファイルにデータを書き込む
- ファイルを閉じる
ファイル操作について覚えるのはこれだけです。もちろん他にもこまごました機能追加することはありますが、基本的な考え方はこれで全てです。ちなみに、ファイルからデータを読み取る場合には二番目の「書き込む」が「読み取る」になるだけであとは同じです。
少し脱線しますが、LabVIEWの良いところは、多くの操作で共通した考え方でプログラムを組むことができることだと思っています。ファイル操作の基本が上記の3つのステップでしたが、実は似たようなステップはファイル操作だけでなく、
- ハードウェアの操作
- データ通信の操作
といったファイル操作とは全然異なる他の操作でも同様に考えることができます。
なので、一度この考え方を身に着けてしまえば、初めて他の操作に対してプログラムを書く場合にも同じようにコードを書けてしまうことが多いです。その中でもファイル操作(ファイルIOと呼んだりするみたいですが)は関数の名前もステップの名前そのままなので特にわかりやすいと思います。
実際にファイル保存のプログラムを書いてみる
ファイル操作に話を戻していきますね。もし前のシリーズで作った摂氏華氏の変換プログラムを作成した方は、ここではファイル操作に集中するために新規のviを用意することにします。
LabVIEWが開いている状態で、何かしら(LabVIEWの起動画面かあるいはいずれかのvi)が選択されている状態であれば、Ctrl + Nで新規のviを開けるのでこのブロックダイアグラムに次の関数を用意してみてください。
これらの関数がどこにあるかは一番最初の図の通りです。ブロックダイアグラム上で右クリックして出る関数パレットの「ファイルI/O」のパレットにあります。
なお、関数を探す際には右上の虫眼鏡マークや、クイックドロップ機能が便利です(この後でてきます)。ブロックダイアグラム上に各関数をラベル表示しているので、これらの名前で検索してみてください。
これらを左から一つずつ配線して、下の図のように配線する必要があります。ここで重要なのは、refnumの入出力(緑色のワイヤ)です。聞きなれない単語ですよね。
簡単に言えばこのrefnumというのは「どのファイルを扱いますか」という情報を持ったデータのことを表しています。
最初のファイルを開くの関数でファイルを指定してから、その特定のファイルに対してデータを書き込みますよ、ファイルを閉じますよ、といった「このファイル」という指定した情報をrefnumを渡していくことでファイル操作を行っていきます。
なお、おさらいですが、各関数同士をつないでいる下側の黄色いワイヤはエラーのワイヤです。どこかの関数で何かしらのエラーが起こると、そのエラーが起きたという情報を流していきます。既にやりましたね。
さて、上の図のように、今回は3つの関数をつなげていますが一つ一つ選択してつなげるのがめんどくさい!と思った方もいると思います。
そんなときにはショートカットが便利です。その方法は
- つなげたい関数をまとめて選択する
- Ctrl + スペースキーを押して「クイックドロップ」を表示させる
- Ctrl + W
このショートカットで、関連する入出力、今回で言えばrefnumとエラーのワイヤを自動的につなげてくれます。とても便利なショートカットなので覚えていて損はないはずです。(以下のページでも紹介しています)
ちなみに、このCtrl + スペースで表示されるクイックドロップは関数の検索に使用できます。いちいち関数パレットから目的の関数を探してクリックするより、関数の名前がわかっている場合にはクイックドロップで関数名を入力してEnterすればまさに「クイック」にその関数を「ドロップ」つまりブロックダイアグラム上に配置できます。
さらに関数名ではなくそれぞれの関数の略称にも対応しているため、LabVIEWの操作に慣れているプログラマーはそれらショートカットでさらに素早くコードを書けるみたいです(私はそこまでの域ではないですが)。
また話がそれてしまいましたが、とにかく上の図のように3つの関数が配線出来たら、さらにもう少し定数を用意します。下の図のようにしてください。
ファイルを開く関数からは操作(open)の部分で定数を出しています。これは列挙体定数と呼ばれる、列挙体(というデータタイプ)の定数です。文字列や数値データタイプと同様、関数の該当する箇所を右クリックして作成、定数で用意できます。
またファイルに書き込む関数については「テキスト」という部分で定数を作成します。こちらは「テキストファイルに書き込む」関数であるため、文字列の定数が用意されます。
ここまで用意し終えたら、定数を編集します。openと書かれた列挙体をクリックすると他の選択肢が一覧で表示されます。列挙体定数はこのように複数の選択肢を列挙するデータタイプというイメージです。
最初に表示されているopenは、既に存在するファイルを開くことを指定する場合に使用する選択肢ですがここではopen or createとします。これは、指定したファイルが存在する場合にはそれを開き(open)、存在しない場合には新たにファイルを作成する(create)場合に使用する選択肢ということになります。
ファイルに書き込むデータは、書き込むの関数に配線した「テキスト」の文字列定数の値になります。試しに、「これはテストです」と入力します。
これで準備ができました。実行ボタンが壊れていない状態であれば、プログラムを実行することができます。ここで「ファイルはどこに保存されるのか?」と疑問に思った方がいるかもしれませんが、問題ありません。とりあえずこのまま実行してみます。
実行すると、どこのファイルに保存しますか?というダイアログが表示されるようになります。このダイアログを使用して、適当な場所に適当な名前で保存します。だからファイルを保存する場所を指定しなくてもいいんですね。このとき、今回はとりあえず拡張子を.txtとしてファイル名のところに入力してOKを押します。
するとプログラムが終わり、指定した場所に指定した名前のファイルができることが確認できると思います。
今回はテキスト、つまり文字をtxtファイルに保存しましたが、csvなどの別拡張子のファイルに保存する場合も同じプログラムで対応できます。ファイルダイアログの画面でファイル名を.csvとするだけです。
また、もちろんテキストは定数でなければいけないわけではなく、文字列制御器にすることも可能です。
LabVIEWでデータをファイルに保存するプログラムの基本的な書き方は以上です。とても簡単ですよね。あとはこれをベースにファイル操作にもいろいろ付け加えることはできるのですが、まずこの考え方をしっかり持ってください。
ファイル操作の扱いに慣れる
さて、前回作った摂氏華氏の変換プログラムの結果を保存するようなこともしてみましょう。といってもやることは上で書いたプログラムとほぼ同じで、数値を文字列に変換する関数を付け加えるだけです。
どのようなプログラムになるかわかりましたか?一例として以下の図のような形になります。
プログラムができたら、実行して先ほどと同じくデスクトップ上にthis_is_test.txtとして保存してみてください。
すると、保存された結果はおかしな結果に表示されることが分かるかと思います。
なぜこうなるか?これは、プログラムでファイルを開く際に列挙体をopen or createとしていることが原因になっています。
列挙体のこの選択肢は「指定したファイルが存在する場合にはそれを開き(open)、存在しない場合には新たにファイルを作成する(create)」という動作だと説明しました。
今回は既にあったthis_is_test.txtを選択したので、openの状態となっていたわけですが、この関数は既存のファイルに書き込む場合には「先頭から」書き始めてしまいます。なので「これはテストです。」という元々あった文字のデータの最初の方が、摂氏華氏置換の結果の数値に置き換わっている状態となってしまっていました。
これを回避し、既存のファイルの最後から値を書き始めるには方法があるのですが、こちらについてはファイル操作についてより詳しくまとめた回で扱っていこうと思います。
なので今回は、とりあえずファイル保存時に同じ名前はつけないでプログラムを実行してみてください。例えば、拡張子をcsvとするとcsvファイルを作ることができます。
もちろん、上で扱った以外の数値でも他のテキストでも試すことができます。今回はベーシックにテキストファイルにデータを保存する方法を紹介していますが、バイナリファイルの操作も流れは全く同じです。(読み書きに使用する関数としてバイナリ用の関数を使うだけです)
ファイル操作には保存だけではなく、ファイルの中のデータの読み取りなどもありますが、その他のファイル操作も含めて別の機会で色々まとめていこうと思います。
さて、まずこれシリーズとしてファイル操作の基本は以上になります。繰り返しになりますが、最後にファイル操作の流れについて大事なことなのでもう一度。
- ファイルを開く
- ファイルにデータを書き込む
- ファイルを閉じる
この基本は絶対に忘れないようにしてください。特にこのファイルを閉じるという関数が忘れ去られがちです(というのも、ファイルを閉じるという関数がなくてもファイル保存はできてしまうんです)。
でも、大筋はしっかりとつかんでください。常に上記のステップを念頭に置いてプログラムを組めば、LabVIEWの他の操作でも似た考え方で色々書けるんです。
あれ、ファイルにデータを保存するのはわかったけれど、データを読み取るのは?と思った方。今回の記事ではデータ保存をメインとしたので別記事でまとめました。よろしければ確認してみてください。
ファイル操作はプログラムの中でも特に重要です。せっかく何かデータを得られてもそれを保存できなければ無駄にしてしまうことになりかねないですね。LabVIEWはその中でもTDMSというファイル形式を推しているようで、確かに慣れると便利で使いやすいのですが、少しクセがあります。
TDMSについてまとめた記事も作ったので参考にしてみてください。
いやむしろ、もっと手軽にファイル保存を行う方法はないのか?といった方向けにも記事を作っていますのでよろしければどうぞ。
さて、前回までの内容と今回もいろいろな新しい関数等が出てきました。新しい関数は使い方もわからず苦労しますよね。
どんな挙動をするかもわからないので、何を入力として配線したらいいかもわかりません。例えば、今回の例では「ファイルを開く」の関数ではファイルパスを指定しなくても動作していましたが、「ファイルに書き込む」関数では書き込むテキストの定数あるいは制御器がないとプログラムが動かなかったですよね。
特定の関数に慣れるのであればまだしも、普通はどんな入力をしていいか、しなければいけないのかなんてわからないと思います。が、ちゃんと調べる術があるんです。
というわけで、次回は今後にも備えて関数の使い方の調べ方について話していこうと思います。そこまできたら、それ以降はいよいよ一気にプログラミングらしい内容を扱おうと思います。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいただきありがとうございました。
コメント