LabVIEWを触ったことがない方に向けて、それなりのプログラムが書けるようになるところまで基本的な事柄を解説していこうという試みです。
シリーズ15回目として条件によって処理を変える条件分岐のプログラムの作り方を紹介していきます。
この記事は、以下のような方に向けて書いています。
- LabVIEWで条件分岐はどうすればいいの?
- 条件分岐の条件はどのように指定するの?
もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。
なお、前回の記事はこちらです。
条件分岐のためのケースストラクチャの用意
前回は列挙体を扱いました。項目を列挙してユーザーが指定できるようになったので、条件分岐、ケースストラクチャと相性がいいと紹介していました。早速使っていこうと思います。
なお、下記の説明では前回作成した列挙体(足し算、掛け算、割り算を定義したもの)を使用していきます。
ケースストラクチャは、ループ同様アルゴリズムに関することなのでブロックダイアグラム上で用意します。関数パレットのストラクチャ(ループが入っていたところ)にケースストラクチャがあるのでこれを選択し、ループと同じようにドラッグアンドドロップで枠を広げます。
前回作った列挙体がある場合には、この枠と重なったり、枠の中に入らないようにケースストラクチャを用意します。
ケースストラクチャには左側に?と書かれた部分があります。この?はセレクタ端子とよんでいます。デフォルトの状態だと緑色、つまりブールデータタイプですが、別にブールしか使えないわけではありません。
ケースストラクチャと相性のいい列挙体をこのセレクタ端子につなげてみます。
配線すると、ケースストラクチャの枠の上部に表示されていた文字が切り替わったことが確認できると思います。
この枠、セレクタラベルと呼びますが、下矢印あるいは左右矢印を押して項目名を切り替えることができます。先ほど作った列挙体の項目名が出ていますよね?でも全部が出ているわけではない・・・?
実はこれは仕様で、列挙体をセレクタ端子に配線したときに表示される項目は、列挙体の項目の1番目と2番目だけになっています。3番目以降の項目はどうすればいいかというと以下の二つの選択肢があります。
- 項目名の部分で右クリックして「次のケースに値を追加」
- 項目名の部分で右クリックして「すべてのケースに値を追加」
もし列挙体の項目数が数多くあるのなら、「すべてのケースに値を追加」で一度にすべて用意することができます。
これでケースストラクチャの用意ができました。あとは、それぞれの項目ごとに「この項目の場合にはこのような処理を行う」というコードを書いていくことになります。
ケースごとにプログラムを書いていく
ここでは、「足し算」が選ばれたら与えられた二つの数字を足して、「掛け算」が選ばれたら掛け算して、「割り算」が選ばれたら割り算をするという処理を例にとってみていきます。
まずは「足し算」の場合に下の図のようなコードを書いてみてください。
ループのときにも入力トンネル、出力トンネルという、枠組みの境界の部分が四角で表示される状態がありましたが、ケースストラクチャも同様です。
ただし、ケースストラクチャ自身は繰り返しを行う機能は持たないので、自動指標付けやシフトレジスタといった概念はありません。
ここでは、入力トンネルは塗りつぶされた四角になっているのに対して出力トンネルは白抜きの四角になっていることを少し覚えておいてください。
このとき、プログラムは実行ボタンが壊れていることに注意してください。せっかくなので壊れている理由を知るために、実行ボタンを押してみます。
上記のようなエラーリストが出ると思います。トンネルの割り当てが不明です、と言われてしまいました。
これは何を言っているかというと「足し算が選ばれたときにはどんな値を出せばいいか書いてあるけれど、他の項目が選ばれたときにどんな値を出せばいいのかわからないよ」という意味です。
確かに、足し算をするときには和の関数を置いて二つの入力値を足し算するという処理を書きました。しかし他のケースである「掛け算」や「割り算」では何も書いていませんね。
つまり、もしケースとして掛け算や割り算が選ばれたときに、LabVIEWとしてはどういう値を出力トンネルから出せばいいかわからない、という状態になっています。
ではちゃんと他のケースについても出力を決めてやるために今度は「掛け算」の項目に移ります。掛け算の項目にはまだ何も書いていない状態なので、ちゃんと定義してあげるために掛け算の関数をおいてやります。その後同様に、「割り算」の項目についても割り算の関数をおいてやります。
するとこの時点で、出力トンネルが白抜き四角だったのが塗りつぶされた四角の状態となり、また実行ボタンが正常になったことが分かると思います。
このようにケースストラクチャでは、定義された項目すべてに対して必ず出力の値を与えてやる必要があります。そうでないと、LabVIEW自身としては処理に困ってしまいます。
このようにケースストラクチャでは、出力についてどのケースにおいても必ず何かしら値を出すように指示をしなければいけません。
いちいち指定しなくてもいい?
とはいえ「すべての場合に値を定義するのがめんどくさい」という場合もあるかと思います。
「この項目の場合、出力は何でもいい」や、「このケースとこのケースは入力値と同じ結果を出力するだけでいい」みたいな場合ですね。実はそういう場合用の設定もちゃんと用意されています。
- デフォルトを使用
- 特定のワイヤ配線を自動でするように定義
といった選択肢があります。
例を挙げるために、列挙体に項目を増やします。既に用意した三つの他に、「デフォルト」、「そのまま1」、「そのまま2」という項目を増やして合計6つにします。項目の追加は、列挙体を右クリックして項目を編集で行えます。
項目を追加したら、ケースストラクチャの項目部分を右クリックして「すべてのケースに値を追加」します。すると、「結果」表示器につながった出口トンネルはまた白抜きに戻ってしまいます。理由はもちろん、新たに追加した項目に対して値を定義していないからです。
そこで、まずは「デフォルト」の項目に移ります。そして白抜きになった出口トンネルを右クリックして「配線されていない場合デフォルトを使用」を選択します。すると、出口トンネルが白抜きと塗りつぶしの中間みたいな表示になります。
これは、「この出口トンネルに何も配線されていない場合にはこの出口トンネルのデータタイプのデフォルト値を出します」という状態となります。この時点でプログラムは動かせるはずなので、列挙体で「デフォルト」を選択してプログラムを実行してみます。
結果に0と表示されたでしょうか?これが数値データタイプのデフォルトです。ちなみに、数値以外でよく扱われるデータタイプのデフォルトを示すと
- ブール:FALSE
- 文字列:空文字
- 配列:何も初期化されていない配列
- クラスタ:中身の各データタイプのデータがデフォルトとなったクラスタ
となっています。
この状態で、「そのまま1」や「そのまま2」の項目を見てみます。何も配線されていないですが、プログラム実行できていますよね?
「配線されていない場合デフォルトを使用」は、すべてのケースに対して適用されます。なので特に何も配線していないケースについてはどれでもデフォルト値を出します。
もう一つ、別の方法で出口トンネルの値を変えてみます。「そのまま1」の項目を選択して、出口トンネルを右クリック、「入力トンネルへのリンク」の中の「作成&未配線のケースを配線」を選びます。
これを選ぶとマウスカーソルの形が変わるので、その状態で入力トンネルのいずれかを選んでクリックします。すると、その入力トンネルと出力トンネルが結ばれる状態となりました。これは、入力値をそのまま出力している、ということになりますね。
この状態で「そのまま2」の項目に移ると、ここでも「そのまま1」と同様になっていることがわかります。つまり「作成&未配線のケースを配線」を使用すると、他の項目で未配線になっている出力トンネルが、指定した入力トンネルとワイヤで結ばれるように自動配線してくれるようになります。
実際、ケースストラクチャを使用したときに、ある場合には特定の処理をするけれどもある場合には入力値と同じ値を出力させたいという場面はよくあります。それが複数の項目にわたってありうる場合には、このような処理をおこなうことでいちいちすべての項目で毎回配線する手間が省けます。
他のデータタイプと使用する
さて、ケースストラクチャについて親和性の高い列挙体を交えて紹介してきました。
ただ、ケースストラクチャで項目を指定できるのは何も列挙体に限った話ではありません。実際、数値やブール、文字列といった他のデータタイプもセレクタ端子に配線して、値毎に処理を変えるというプログラムが作れます。
あれ、文字列でも作れるのなら列挙体は必要なの?と思うかもしれません。文字列の場合、列挙体のような「すべての値にケースを追加」はできず、文字列に入る可能性のある文字列値をすべてセレクタラベルに直に書き込んで定義しておく必要があるので便利さは列挙体に劣ります。
ブールももちろん対応しますが、これの延長でエラーワイヤを配線することも多いかなと思います。エラーワイヤを配線した場合、エラーがあるときとないときとで処理を変えられる、つまりエラー処理を実装できるようになります。また、エラーワイヤを配線したときのみ枠の色が変わります。
数字が使えるとなると、こんな疑問が出てくるかと思います。「例えば数値の値によってケースを変える時、0ならこれ、1ならこれ、と決めるとして数値なんて無限のようにあるのにそれらすべてに処理を書く必要があるのか?」と。
試しに、数値データタイプをセレクタ端子に配線したケースストラクチャを考えてみます。
すると、「0,デフォルト」と「1」という二つの項目が出てきました。なので、数値が0の場合と1の場合には何かしら処理をかけることができますが、では数値が2だった場合にはどうなるでしょうか?
正解は「デフォルトの項目が実行される」です。
ここでいう「デフォルト」は「ケースで定義されていないものは全部これを実行します」という意味になります。なので、数値が2の場合には「0,デフォルト」のコードが実行されます。どの項目をデフォルトに設定するかは右クリックで変更でき、どれかを必ずデフォルトにしないとプログラムは実行できません。
もちろん、新たな定義を追加することもできます。
試しに、この数値で指定したケースストラクチャで、あとにケースを追加を選択します。すると、項目名を編集できるようになるので、2と入力すれば、数値が2の時の処理を書けます。
じゃあ例えば「2から5なら全て同じ処理を行う」という場合には
- ・2,3,4,5と表記する
- ・2..5と表記する
の二通りがあります。ただし、上の書き方をしても、書き込みが終わると下の表記に変換されます。
では6以上の場合にはどうするか?答えは「6..」とするだけです。-1以下にはどうするか、似たような考えで「..-1」とします。
なお、この例で出た「デフォルト」は数値以外のデータタイプがセレクタ端子に配線されている場合にも同じような意味となります。例えば文字列データがセレクタ端子に配線された場合、セレクタラベルに定義されていない文字がセレクタ端子に渡された場合にはデフォルトのセレクタラベルケースの中身が実行されます。
ケースストラクチャについてはこれくらいを知っていれば十分使えると思います。
さて、これで条件分岐のプログラムの書き方もわかるようになりました。実際、このシリーズのこれまでの内容だけでかなりいろいろな種類のプログラムが書けるようになります。
ただ、いきなりプログラムを書けと言われてもいざやろうとするとなかなか難しいと思います。そんな悩みを解消するための「テンプレート」の話も後々やるのですが、その前にまだまだ扱うべきことがあるので一つずつ紹介していこうと思います。
次回は効率の良いプログラムを組むための構造について紹介しようと思います。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいただきありがとうございました。
コメント