LabVIEWを触ったことがない方に向けて、それなりのプログラムが書けるようになるところまで基本的な事柄を解説していこうという試みです。
シリーズ5回目としてプログラムを作る際に大切なデータタイプのお話をしています。
この記事は、以下のような方に向けて書いています。
- データタイプって何?
- ブールデータの機械的動作がわからない
- スタイルってあるけれどこれは何?
もし上記のことに興味があるよ、という方は読んでいただけると嬉しいです。
なお、前回の記事はこちらです。
データタイプを知る
本格的にLabVIEWでプログラムを書いていこうと思う前に、まずはLabVIEWでどういった「データ」が扱えるかを知っておく必要があります。
プログラムを書く、というのはデータを関数に渡していく作業の積み重ねになりますからね。そもそもどんなデータが扱えるの?ってことがわからないとプログラムは書けません。
なお、データの中身そのもの(数値でいう1とか27とか)と区別するために、データの種類ということでデータタイプと呼ぶことにします(他の言語ではデータ型といった呼び方ですね)。
LabVIEWは各データタイプは目で見て違いが判るので、少し使えばすぐに慣れることができるはずです。主なデータタイプには以下のようなものがあります。
- 数値
- ブール
- 文字列
- 配列
- クラスタ
- ダイナミック
- ・・・
他にも種類はありますが、上記のデータタイプは基本的なものばかり挙げてみました。他の言語を知っている方にはクラスタは構造体のことだというと理解しやすいかもしれません。
フロントパネル上での見た目はもちろんのこと、ブロックダイアグラム上でも端子やワイヤの色がそれぞれ違うことが分かるかと思います。つまり、ワイヤの色を見て「ここには数値のデータが通っているんだな」といったことが判断できます。
基本的、と言いましたが、ダイナミックデータは少し特殊で、LabVIEWの中でも一部の機能を使用する場合に表れ、他のデータタイプへの変換が可能になっています。
ここで余談。LabVIEWはもう30年くらい前に作られたソフトですが、バージョンが上がるごとに機能追加など行われています。2018か2019だったかではそれまでになかった新しいデータタイプ、マップやセットが増えたりしているくらいです。
話を戻しますが、上に挙げた様々なデータタイプの中にはプログラム言語に慣れていない方にとってはよくわからないものもあると思います。今後の記事で文字列より下の項目についてはまた記事を書こうと思っていますが、上3つは基本中の基本です。
もしブールとは何かを知らない方がいましたら、「TRUEかFALSEか」「0か1か」などといった、二者択一のような状態を表すデータタイプとイメージしてください。エラークラスタのステータス表示で出ていました。
何かを判断した際に、それが正しいか間違っているか、や実行されたかされていないか、エラーが出ていたかいなかったかのような「2つに1つ」の選択肢のうちどちらであるかを示す、といった使い方ができます。
上の図のように、何かを判定した結果を表すのに向いています。プログラムは処理の連続であり、その処理の結果から次の処理を判断するということが頻繁に発生するためこのブールデータタイプは重要です。
あるいは、アルゴリズム上の処理ではなくても、ユーザーインタフェースつまりフロントパネルでユーザーが何かしらのボタンを押したことで処理を分岐させるときにも、ユーザーがボタンを押したかどうかの判定にブールを使用します。
ところで、上の図のブール表示器はエラー出力を除いて緑色の丸になっています。冒頭で紹介したブールの表示器とは異なる見た目をしていますよね?
ブールはユーザーが操作したりあるいは判断するためによく使われるのですが、ユーザーインタフェース上わかりやすく表記するために多くの「見た目」があります。
もし上の図のようなラインナップではない場合、あとで説明する「スタイル」が「シルバー」ではない状態だと思います。フロントパネルで右クリックして出る制御器パレットで「シルバー」と書かれた部分からブールを探してみてください。
どんな見た目であれ、基本的に全て二者択一であることに変わりはありません。
ただし、ブールの挙動についてはもう少し細かい分類があります。次の項目でそれを見ていくことにします。
ブールの仕組みを知る
ブールの話をもう少し突っ込んで紹介していきます。上のブールの説明では、二者択一の状態を表すと説明しました。ブールというデータタイプが表すデータはこの通りなのですが、これを「操作」する場合にはより動作が細分化され、そのために(ちゃんと区別すれば)とても便利に扱うことができるものになります。
まず大きく分けて
- スイッチ
- ラッチ
という仕組みがあります。
スイッチについては身近な例としては部屋の明かりがあります。単純に部屋の壁についているものを想像してください。
このスイッチ、人が一度OFFからONにすると、部屋の明かりがつくわけですね。では消すときにはどうするか?当然、また人が押してOFFからONにしますね。逆に言えば、「人(ユーザー)が操作しない限り切り替わらない」わけです。
何を当たり前のことを言っているんだ?と思うかもしれません。とりあえずスイッチはまさにこの説明の通りです(プログラム的に切り替える方法もあるにはありますがそれは今はおいておきます)。
対してラッチとは「ユーザーがOFFからONに切り替えた後は、プログラムがONからOFFに切り替える」ような動作をします。もう少し正確には、「ユーザーがOFFからONにした後、プログラムがONを読み取ると自動的にOFFに戻る」動作です。
なかなか難しいですね。ではスイッチと比較して、このように考えてみるのはどうでしょうか?
- スイッチは、LabVIEWがブールのONを読み取るかどうかに関係なくOFFにできる(LabVIEWがONを読み取ったかどうかわからない可能性あり)
- ラッチは、LabVIEWがブールのONを読み取ったらOFFになる(ユーザーが操作しないでOFFになったということはLabVIEWがONを読み取ったということ)
図式的に説明するのが難しいのですが、論より証拠、実際にプログラムの中で触って確かめた方が分かりやすいと思います。
ブールの上記のスイッチ、ラッチの区別は、ブールの制御器あるいは表示器を右クリックして「機械的動作」から切り替えることができます。しかし、動作を確認するには「プロパティ」に進んでから動作のタブを選びます。
さて、右クリックしてみると、「押されたら~」とか「放されたら~」、「放されるまで~」とさらに区分され、合計6つの機械的動作があることが分かると思います。
これらの区分が良くわからんという方は、LabVIEWのサンプルで「機械的動作」を探してみてください。サンプルの見方は覚えていますか?ヘルプのメニューから、「サンプルを検索」でNIサンプルファインダを開くのでした。
このサンプル、6つの機械的動作を知るために、よくできたサンプルだと思います。各機械的動作のアイコンを選択したあとは、実際に触ってみてください。きっとそれぞれの違いが分かると思います。
これらの機械的動作、選んだブールの見た目の種類によって、デフォルトでスイッチなのかブールなのかが異なります。
どんなときにスイッチやラッチを使うかって?例えば以下のような使い分けが多い気がします。
- ・スイッチ:パラメタや設定の切替
- ・ラッチ:プログラムの停止、何かしらのイベントを発生させるとき
LabVIEWに勝手に切り替えてほしくない、常にユーザーが切り替えるべきパラメタや設定はスイッチで、それ以外はラッチ、という感覚です。マウスによるクリック操作はラッチと呼べます。
「押されたら~」とか「放されたら~」というのは適宜使い分けるのですが、「放されたら~」の方が便利な場面が多いかもしれないです。なぜなら「放されたら~」の場合にはキャンセルができるからです。
例えばブールのボタンが「放されたらラッチ」となっていたとして、ユーザーがこれをクリックした後にやっぱりクリックした動作をキャンセル、というときにはそのボタンからマウスカーソルを外して指を放せばキャンセルできるからです。
ウィンドウの右上にある、ウィンドウを閉じるためのバツ印あれもキャンセルできますよね?あの操作は「放されたらラッチ」になっています。
これでブールの説明は終わりなのですが、さらに知りたい!という方向けに別記事でも紹介しています。
データタイプを区別しよう
基本的なデータタイプの中でブールはあまり扱っていなかったので少し突っ込んで説明しましたが、データタイプの話に戻ります。
LabVIEWのブロックダイアグラム上で各データタイプは色で区別できるという説明をしました。最初は色とセットで覚えるのが難しいかもしれないですが、慣れると一瞬でデータタイプを判断できるようになります。
これらのほとんどに、それぞれ「定数」、「制御器」、「表示器」があります(ダイナミックデータにはダイナミックデータそのものの定数などはないようです)。
ただし、定数はブロックダイアグラム上でしか作れません。「定まった値」なので、フロントパネルからのユーザーの入出力に関係がないためですね。
また、とくに数値はLabVIEWのプログラムでも頻繁に扱うことになると思いますが、さらに細かい分類ができます。I8とかU32、floatingといったものですが、これらも色分けされています。
これらがなんの違いを表しているのかわからない、という場合には、とりあえず表せる範囲や表す形式が変わる、という程度で覚えてください。
I8なら-128~127で、とかU32なら0~4294967295まで表せる、小数を表すにはfloatingなどを使う、みたいな使い分けをします。これらの使い分けはメモリ管理を気にする場合重要ですが、とりあえずLabVIEWに慣れたいということであれば「選んだものによって表せる範囲が違う」ということだけおぼえていればいいと思います。
制御器、表示器のスタイル
また、フロントパネルを操作して、「シルバー」の項目以外に「モダン」や「システム」といった項目にも、シルバーと同じく「数値」や「文字列」といった項目があることに気づいた方もいると思います。これらシルバーやモダン、システムなどはスタイルが違うといい現わされます。
それらもフロントパネル上に配置してみてください。すると、それぞれで異なる見た目をしたオブジェクトが表れると思います。例えば以下では各スタイルの数値制御器を表しています。
一方で、ブロックダイアグラム上では特に見た目の変化はありません。これら「シルバー」や「モダン」といった区分けは、単純にユーザーインタフェースの見た目に関わる違いだけであって、アルゴリズム、コードの実装についてはどれを使っても問題ありません。
ただし、見た目はなるべく統一したほうがいいと思います。逆に言えば、どのデータタイプの制御器、表示器も、同じ「シルバー」デザイン、あるいは「モダン」デザインに統一すれば、それなりに見栄えの良いプログラムが書けるということになります。
ただ注意しなくてはいけないのは、物によっては「このデザインにしかない」といった機能もあります。例えばタブ制御器という、タブを変えることで表示を切り替えることのできる仕組みがあるのですが、これはシルバーにはありません。
見た目もそうですが、欲しい機能からもデザインを選定することになる場合があるのは注意が必要です。
データタイプをそろえて使う
これだけくどくどデータタイプについて細かく知る必要があるのか?と思うかもしれません。最後にその部分だけ少し説明します。
ブロックダイアグラム上にある同じデータタイプの制御器と表示器をそれぞれワイヤで結んでやると、フロントパネル上で指定したそれぞれのデータ(および状態など)が、プログラム実行によってそれぞれの表示器に表れることは以前文字列データタイプについて見ました。
では、例えば数値制御器と文字列表示器をワイヤでつなぐとどうなるでしょう?疑問に思ったらとりあえずまずやってみることでプログラムへより早く慣れることができますよ。
実際にワイヤでつなぐとエラーが起こります。実行ボタンを押してエラーリストを確認すると、「タイプの異なる2つの端子を接続しました」と表示されます。×印のワイヤにマウスを合わせてもエラーの内容を確認できますね。
これは、数値を扱う数値制御器と、文字を扱う文字列表示器とでデータタイプが異なっているのでこれらを同時に扱うことはできませんよ、というエラーになっています。
当たり前のことですが、異なるデータタイプを同士をそのまま結びつけることはできません。私はLabVIEWをやり始めた頃、プログラムを書いていてこういった間違いをして「うまくこことここが繋げられない」という状況によく陥っていました。
データタイプはそれぞれ独立しています。必ず同じデータタイプ同士でワイヤを配線するように心がけてください。
でも、例えば上記の例に対して「いやいや、文字として数値を表したいんだ」と思うかもしれません。であれば、文字列制御器に数値を書き込むか、あるいは数値制御器の値を文字列に変換します。
LabVIEWにはデータタイプを変換するための関数が備わっています。これらで適切にデータタイプを変換してワイヤを繋げられるようにするとエラー箇所をぐっと減らすことができるかもしれません。
上記以外にも、ブールデータを0、1という数値に変換する関数やファイルパスを文字列に変換する関数、これらの逆の操作を行う関数などがあるので適切に使用することが大事です。
これらのデータタイプの操作に慣れることはプログラムを書く上で基本となるのでしっかりと身に着ける必要があります。とはいえ、実際はそんなに身構えなくてもやっているうちに勝手に覚えると思いますのでそんなに不安に思わないでくださいね。
さて、次回はもう少しプログラム作りに慣れるとともに、デバッグツールの使い方を見ていきます。以前に紹介した文字を表示させるだけのプログラムではなく、ちょっとした演算を含んだ「それっぽい」プログラムを作ることを目指します。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいただきありがとうございました。
コメント