LabVIEWと同様なプログラミングによってWeb Applicationを作成することができるG Web Development Software (以下GWDS)を触ったことがない方に向けて、基本的な事柄を解説していこうという試みです。なお、大部分の事柄は、GWDSの前身であるLabVIEW NXG Web Moduleと共通します。
シリーズ4回目としてデータタイプの説明です。
この記事は、以下のような方に向けて書いています。
- GWDSでどんなデータタイプが扱えるの?
- 各データタイプはどうやって使用するの?
もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。
なお、前回の記事はこちらです。
扱えるデータタイプの種類
前回の記事で、GWDSによってプログラムを作るときには制御器や表示器をワイヤでつないでいくこと、またそれらによりデータが受け渡される処理には順番があることを紹介しました。
このワイヤで繋ぐものには、制御器や表示器そして関数(一部はノードと呼ばれるようですが、不正確な表現であることは前提としつつ、ここでは制御器や表示器以外を全て関数と呼ぶことにします)がありますが、特に制御器や表示器は特定のデータタイプを持ち、関数も多くは特定のデータタイプしか受け付けないようになっています。
GWDSのプログラムの特徴の一つとして、こういったデータタイプは色で分かれており、そのためプログラムを「読む」際にどこでどういったデータが処理されているかわかりやすい点があります。
各データタイプが一部を除いて固有の色を持っているため、「ピンクだから文字列だな」といった判断ができ、これらさえ覚えればプログラムをよりスムーズに読むことができるようになります。
この記事で扱うデータタイプを並べてみても、以下のように様々な色分けがあります。(波形データタイプは制御器、表示器がグラフ形式になるので除外)
プログラムでそもそもどのようなデータタイプを扱えるかを知るのはとても大切です。なぜなら、何らかの処理を行わせる際にその処理の対象は全ていずれかのデータタイプに属している(バリアントと呼ばれる特殊な例外はありますが)ためで、処理の内容に応じて適切なデータタイプを選ぶ必要があるからです。
今この時点では何に使うかよくわからないものがあるかもしれませんが、GWDSのプログラムで使用されうる一通りのデータタイプを紹介していきます。
文字列
既に今までもでてきたように、画面に表示する文字、テキストを扱います。表示色はピンクです。
以前の記事で扱ったような文字を入力、表示するということ以上に説明することはあまりないのですが、GWDSの環境では、文字をただ入力したり表示するための制御器表示器以外に、特殊な「ハイパーリンク文字列」というものがあります。これは、ユーザーがクリックしただけで指定されたリンク先にページが遷移するという特殊な文字列になっています。
例えば、以下のようにハイパーリンク制御器をパネルにおいてプロパティの欄にある「URL」に「https://marblerule.com」と入力してからブラウザ上で実行、この制御器をクリックすると、このブログのトップページに飛ぶことができます。
Web Applicationを作成するプログラミング環境ならではの機能ですね(LabVIEWにこれに対応する文字列制御器はありません)。
また、プログラム的にリンク先を指定することもできるので、プログラム実行中に(動的に)飛ぶ先のURLを変えることができます。(指定を行うには、ハイパーリンク文字列をダイアグラム上で制御器から表示器に変更し、指定したいURLを制御器や定数で指定する必要があります)
数値
これまた文字列と同じくらい、もしくはそれ以上に頻繁に扱うであろうデータタイプで、数字を扱います。
数値は複数の色を持ちます。この表示色は数値の形式によって変わりますが、青が整数、オレンジが(複素)小数で表されます。形式毎に扱える数の大きさの上限、下限が異なったり、負の数が扱えないなどがあるので注意します。(unsignedが正の数のみ)
数値データタイプは制御器や表示器の種類も他のデータタイプと比べて豊富で、見た目がだいぶ異なるものがあるものの、扱える内容は一緒です。何のためにその数字を入力(出力)したいかで見た目を変えるといいと思います。
また、グラフやチャートはこの数値データタイプの派生みたいなものです。繰り返し処理の話に絡んで使用されることが多いため、繰り返し処理を紹介した後にまた説明していきます。
なお、他の言語ではできるような「演算」がGWDSではできなかったりするので注意が必要です。例えば、Pythonであれば文字列の掛け算を実行し、文字を連結することができますが、GWDSにおいては文字列は文字列同士、数値は数値同士でしか扱えないためそのような操作ができません。
GWDSでは、処理に適したデータタイプが接続されていない場合には、上の図のようにワイヤに警告マークがつきます。この警告マークがプログラム中に一つでもある場合、プログラムをそもそも実行することができません。
実行のためにRunボタンを押すことはできるのですが、実行される代わりにエラーの一覧が表示されます。エラーをクリックすると、どこでエラーが起きていたかをハイライトするので、プログラムが大きくてもどこに問題があるかすぐに確認することができます。
この機能、便利なのですが、あくまでプログラムの記述時の文法的な間違いを指摘しているだけで、アルゴリズムの間違い(例えば本当は足し算であるべきところが引き算になっているなど)は検出されないので注意します。
ちなみに、もし文字列と数値の演算を行うのであれば数値を文字列(あるいはその逆)に変換することが必要です。(ただしPythonのように「555」の文字列を「3倍」して「555555555」とするには工夫が必要になります。あまりそのような機会はないと思うのでここでは説明を省きます)
ブール
基本的なデータタイプとしてはブールも忘れてはいけません。「真」か「偽」か、といった二択を表わすデータタイプです。英語で言えば「TRUE」か「FALSE」なので、ブールの定数は「T」か「F」かになっています。表示時の色は緑です。
二択しか扱えないデータタイプなのに何で重宝されるかというと、何かの条件の判定に便利だからです。例えば何か入力された数値について5未満なら処理Aを、5以上なら処理Bを行う、といった場合の判定に条件「5以上?」がTRUEかFALSEかで処理を分けることができます。
以下の図は、Xが5以上であればLED(ブールの表示器)を光らせる、という処理を行う場合の例です。
また、ブール同士の「演算」もできます。二つのブール値入力から一つのブール値の結果を出すイメージです。高校の数学で扱ったベン図を考えるとわかりやすいと思うのですが、ANDやORといった処理が行えます(演算のための処理関数はAND、OR以外にもあります)。
こうした条件分岐はもう少し後の記事で紹介することになりますが、次回扱う繰り返し処理にもこのブールデータタイプが登場します。
もう一つ、ブールデータタイプで覚えておくべきなのは、「機械的動作」の種類です。これは、アルゴリズムにも関わってきますが、ユーザーがブールの制御器を使用するときの動作に大きく関わります。
機械的動作、には大きく分けて「スイッチ」と「ラッチ」があります。大まかに説明すると以下の違いがあります。
- スイッチ : ユーザーがTRUE、FALSEを決める(言い換えれば、ユーザーがボタンを押さない限りTRUEからFALSE、またはその逆、に切り替わらない)
- ラッチ : ユーザーがボタンをクリックした後、プログラムがその状態を読み取ったら、プログラムがデフォルトの状態に切り替える(例えばプログラム実行時のデフォルトがFALSEなら、TRUEに切り替える)
よく見る説明として、機械的動作のスイッチというのは部屋の照明用のスイッチと同じ動作をします。あれは、ユーザー(照明の使用者)が、ユーザーのタイミングでON、OFFを切り替えられますよね。(タイマーの機能などない限り)照明側が勝手に照明を落とす、なんてことはないです。そしてもちろん、何も押さなければずっと照明の状態は変わらないですね。これがスイッチ、です。
一方で、ラッチは家の玄関チャイムのような動作をします。玄関チャイムの動作をプログラムチックに考えると(実際は違いますが)以下のように考えられます。
- ユーザー(使用者)がチャイムを押す(ブールで言うところのFALSEからTRUEになる)
- チャイムが鳴る(ブールがTRUEになったことでチャイムを鳴らすという処理が実行される)
- チャイムが元の位置に戻る(処理が実行されたことでチャイム側がTRUEからFALSEに戻す)
もう少しGWDSのプログラムに即して説明すると以下のようになります。
ブール制御器のデフォルトがFALSEだったとして、ユーザーが操作したことによってFALSEからTRUEになっている(デフォルトではない状態になっている)と、ダイアグラム上でプログラムがブールの状態を読み取るときに「あ、このブールはTRUEになっているな」と判断し、TRUEとして読み取り後、プログラム側がブールの状態をTRUEからFALSEに戻します。
スイッチかラッチか、慣れるまでは戸惑うかもしれませんが、動作が結構違うので、区別はつけやすいと思います。
どちらかというと区別をつけにくいのは、これらをさらに細分化した、「押した時(when pressed)」、 「放した時(when released)」、 そして「放されるまで(until released)」だと思います。
例えばWindowsのファイルエクスプローラなどで右上のバツ印を押す時、押した後にマウスカーソルをバツ印から話してクリックしていた指を放すと閉じる動作をキャンセルすることができますよね?まるでクリックしたという動作をおこなっていないみたいに。ああいった、「ボタンをクリックして指を放すまで実際には押したことにしない」という動作が「放した時(when released)」です。
一方で、押した瞬間に指を放すタイミングと関係なく押したことを認識させるのが「押した時(when pressed)」です。(「放されるまで」はほぼ使用しないので説明を割愛します)
なお、これらが選べるのはブールの「制御器」のみです。表示器にこれらの違いはありません。
配列
配列とは、処理を繰り返すようなプログラムと相性のいいデータタイプです。他のプログラム言語ではリストなどと呼ばれるものに対応します。表示時の色は、中身により異なるため、特定の色に固定されません。
配列は、一つの決まったデータタイプのデータを複数保持しておける箱のようなものをイメージするとわかりやすいと思います。「数値の配列」、とか「文字列の配列」といった、他のデータタイプのデータを複数まとめて扱いたいというときに使用します。
ただし、「数値と文字列の配列」というものは作ることができません。あくまで一つのデータタイプに特化して、複数の値をまとめて扱うのに使用します(似たようなものを作ることはできますが)。
また、配列の配列も作ることができません。が、配列の配列を作る代わり(?)に、配列そのものに次元という概念があります。
1次元配列なら縦あるいは横にデータを一直線に保持しておけますが、2次元配列だと縦と横それぞれにデータを保持しておけます。Excelで言うところの、シートを変えるような感覚で、表が複数あるような状態を表わせる3次元配列も作れます。
実際は4次元以降も配列は作れますが、ほとんどのアプリケーションの場合には3次元あれば事足りると思います。
既に紹介した3つと異なり、配列は「作る」必要がありますが、とてもシンプルです。空の配列を用意し、そこに「配列にしたいデータタイプ」をドラッグするだけで完成です。
作った配列を縦や横に並べると薄い色で表示される状態になります。一つ一つの枠組みを配列の要素と呼びますが、これらの要素が薄い時、それは特定のデータを持っていない状態になります。
要素が入っているかどうかと、サイズの変更は何の関係もありません。例えば以下の図では配列の要素が何も入っていない状態で配列の次元を1から2に変えています。次元の変更は、配列の要素の番号が表示されている部分を引き延ばすことで行えます。
特定のデータを持たせるには、「初期化」を行う必要があります。初期化の仕方は簡単で、扱いたい配列の要素に何か具体的に値を入力するだけで行えます。初期化をすることで明るく表示されるので、どこまでが初期化されているかは見た目で判断できます。
例えば以下の図では、要素番号3までは値が入っていて初期化されていますが、要素番号4は薄く表示されているので初期化されていません。0と薄く表示されていますが、これはこの配列で扱っている数値のデフォルト値を示しているだけで、実際に0という値を持っている状態ではないことになります。
配列の要素にはそれぞれを識別するための番号、要素番号がつけられています。 上に書いた文章で、「 要素番号3までは値が入っていて 」は書き間違えではないのか (要素番号4ではないのか) ?と思った方がいるかもしれないですが、 上の図のように0から数え始めるのがポイントです。
なお、要素番号の数字を変更すると、その要素番号の表示部の右の値がその番号に対応した要素の中身を表示するようになります。
この番号を使って、例えば「要素番号2の要素を取り出す」だったり「要素番号(1, 5)の値を別の値に交換する」といった指定を行うことができるようになります。
なお、配列は他のデータタイプと異なる特徴がダイアグラム上でも見られます。
それはワイヤ線の太さです。GWDSでは、配列かそうでないか(そうでない、単体の値の場合をスカラと呼びます)をワイヤの太さで区別することができます。
初めに書いたように配列は繰り返しの処理と相性がいいので、次回の記事で具体的な使い方について紹介していきます。
クラスタ
配列では「一つのデータタイプ」を扱うことができましたが、場合によっては「複数のデータタイプをまとめて扱いたい」ことだってあると思います。
そんなときに使用するのがクラスタデータタイプです。このデータタイプはまさに複数のデータタイプを格納することができるデータタイプになっています。こちらも、表示時の色は中身によって変わるため固有の色を持ちません。
配列のところで、「数値と文字列の配列」は作ることができないものの似たようなものを作ることはできると書いたのがまさにこのクラスタのことで、「数値と文字列を持ったクラスタ、の配列」を作ることができます。
ただ、具体的にどのような場面で複数のデータタイプをまとめて扱うことがあるのか、疑問に思われる方も多いと思います。実際にある程度本格的にプログラムを書く場合にかなり使用することになるのですが、そもそも使い方に慣れようと思っている段階では使用場面がなかなか思いつかないと思います(私がそうでした)。
もう少し後の記事で紹介するチャートの表示で実際に使用する例が出てくる予定です。
それ以外でもいくつか見る機会はあって、その中でもよく見るであろう例が、エラーを扱う場合です。このときには普通のクラスタと異なり特別に「エラークラスタ」と呼ばれ、固有の表示色(黄色)を持ちます。
何がまとまっているかというと以下の3つのデータタイプがまとまっています。
- エラーコード(数値):エラーの内容を直接表す数値。この数値に対応して各エラーの内容を調べることができる。
- エラーステータス(ブール):エラーが起きたかどうかを表わす。
- エラーメッセージ(文字列):エラーが起きた場所を表わす
このどれもエラーを適切に対処するためにはかかせません。どれも「エラー」を表わすのに関連しているので、ひとまとめにされていることでわかりやすくなります。
エラークラスタは少し特殊で、「エラークラスタを作る」ことは基本的にありません。「エラークラスタ」として最初から存在しています。
ではエラークラスタ以外の普通のクラスタをどう作るかというと、これは配列のときと同じような操作なので簡単です。空のクラスタを用意し、ここに様々なデータタイプをつめこむだけです。
数値や文字列、ブールだけでなく配列をクラスタに入れたり、別のクラスタを含んだクラスタを作成することもできますが、「制御器」と「表示器」をごちゃ混ぜにしたものは作ることができません。作ろうとしても、「すべてが制御器」「すべてが表示器」のいずれかに統一されます(クラスタ自身も制御器か表示器どちらか片方になるためです)。
また、クラスタはプログラム的に作ることができます。クラスタに含めたいデータタイプを入力していくだけで作れるのでこちらも楽ですが、プログラムを作成している時点でどのようなクラスタを扱えばいいかは大体決まっていると思うので、あまりプログラムの途中でクラスタを作る場面は少ないかもしれません。
どちらかというとクラスタの中のデータにどうアクセスするかが重要ですが、こちらについても専用の関数が用意されています。
Cluster Propertiesという関数を使用し、クラスタを配線、あとはそのクラスタのどの要素を読み取りたいのか(表示したいのか)を選択したら、右クリックして表示器をつけるだけです。
なお、上の図でBuild Clusterからcreated clusterとCluster Propertiesにワイヤが分岐していますが、ワイヤの途中から配線を始めたい場合にはキーボード上でCtrlを押しながらワイヤの途中をクリックすることで行えます。
もしクラスタの中身のいずれかの要素の値を抽出したいのであればこれで終わりですが、中身の値を書き換えたい場合には以下の図のように右クリックして書き込みに変更する必要があります。
ここら辺の扱いは実はLabVIEWと異なる(LabVIEWではバンドル、バンドル解除を使用していた)ため、LabVIEWの操作に慣れていると違和感があるかもしれません。
タイムスタンプ
前回の記事のサンプルで少し扱いましたが、時間の情報を扱う際にはタイムスタンプデータタイプを使用することができます。表示時の色は茶色です。
現在の時間を取得したり、その時間の表示の仕方を変えることができます。
波形
読んで字のごとく、波形のデータを扱う際に適したデータタイプです。表示時の色はタイムスタンプと同じように茶色です。
そもそも波形って何なの?という話ですが、次の3つがセットになったデータになっています。
- Y値(数値の配列)
- サンプリング周期、dt(数値)
- 波形の「最初の時間」、t0(タイムスタンプ)
これらは、正確に波形を書くのに欠かせません。t0は場合によっては適当でもいいかもしれないですが、波形を構成するデータ値そのもの、およびデータ値とデータ値の間隔がわからないと表すことができないからです。
厳密にはもう一つ、属性を表わすバリアントデータタイプがついていますが、基本的には上記の3つのデータがセットになっているとだけ考えて使用しても困ることはまずありません。
これらがセットになっている、というとクラスタっぽく聞こえますが、一応区別されていて、この波形データを扱う際の専用の関数が用意されています。
クラスタで、上記の3つの要素を持った項目を作ることはもちろんできるのですが、「波形」として扱うことができないため、例えばグラフ表示をすることができません。
列挙体
これまでに紹介してきたデータタイプは、それぞれに専用の処理の関数がありました。
しかし列挙体については、「列挙体に対する専用の処理の関数」はありません。むしろ分類としては数値データタイプに属します。そのため表示時の色は青です。
ただ、実態は(少なくともユーザー側としては)数値ではなく文字列のような扱いができる少し変わった制御器/表示器です。
その名の通り、項目を列挙することができ、定義した文字列を表示、ユーザーが選ぶことができます。普通の文字列の制御器や表示器ではこうしたことはできません(いちいち入力する必要があります)。
作る際には、空の列挙体を用意してプロパティとして中身を増やしていきます。なお、列挙体は英語でEnumとなっています。
他にも使用できるデータタイプとしてバリアントデータタイプなどがありますが、使い方が限定されることと、これを知らなくてもプログラムを組めるので(少なくとも今は)割愛します。
今回の記事ではGWDSで使用できる様々なデータタイプを紹介しました。自由にWeb Applicationを作成するために、そもそもどんなデータが扱えるのかを知るのはとても重要です。具体的にどのような場面で使うのかといった細かい部分は今後の記事で紹介していきますが、まずはこういったデータタイプがある、こういう風に作るといったことはしっか覚える必要があります。
次回は、プログラムを組むうえで必須の知識である、繰り返し処理の方法を紹介します。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいただきありがとうございました。
コメント