【LabVIEW】数値関数の解説・使い方
本記事ではLabVIEWの数値関数について使い方や解説を記載しています。一部の関数について使用例も記載しています。
LabVIEWの数値関数について解説
Labviewの参考書については下記の記事で紹介をしております。
解説する数値関数について
今回はパレットの中にある数値関数について解説を行います。
数値関数のパレットの中身としては上図のようになります。用意されている関数群がかなりの数となるため、本記事ではオレンジ枠内の関数を紹介しています。
変換関数についても追記しました。(2021/06/13)
LabVIEWの数値について
Labviewの数値データは
- 整数(I32,I16,I8など)
- 浮動小数点(DBL,SGL等)
- 固定小数点(FXP)
の3つに大きく分類ができます。
基本的には整数と浮動小数点を使用してプログラムを組んでいきます。FPGA機器を利用する場合は無駄なメモリを使わないように固定小数点を用いたりします。
数値の制御器と表示器には数値のデータタイプどのタイプ(DBL,I32等)になっているかが表示されています。アイコン表示ありよりもアイコン表示なしの方がデータタイプは見やすいです。
個人的にはブロックダイアグラムに配置することを考えると「アイコン表示なし」をオススメします。
制御器、表示器、定数を右クリックをして表記法と記載された欄にカーソルを合わせると、選択した数値のデータタイプを青枠で表示されています。
他のデータタイプを選択するとデータタイプを切り替えられます。
データタイプが違うと関数の入力部分に強制ドットが表示されるので注意してください。
強制ドット(オレンジ丸内の赤印)があると意図しないデータが出力されたり、プログラムのパフォーマンスを悪化させる要因になったりします。
入力側の場合は、LabVIEWが自動で強制ドットのある側のデータ型を変換してくれたりするので、問題なく計算は出来たりします。しかし、意図しない計算をすることがあるため、型変換は明示的に行う必要があります。(※型変換をする際に別のメモリとして格納されるためメモリ容量は余計に使用されます。)
出力側の表示器に強制ドットは付かないようにしてください。表示器に入力された値と表示器で出力される値が違ってきます。(内部で流れているデータと表示で齟齬が発生する。)
数値関数
四則演算
定数または数値制御器を二つ入力することで数値出力を行うことができます。
四則演算には配列データを入力することも可能です。
【配列+定数】の場合は配列に定数の値を全て加算したり減算をしたりします。
【配列+配列】の場合は同じ位置にある値を加算したり減算をします。
商&余り
四則演算の商(割り算)の計算と割り切れない数値(余り)を出力します。
使用例としてはループ(For,While)中に発生している値が偶数または奇数で処理を分岐させたりすることが可能です。
画像は、ループの回数「i」の値を「商余り」に入力を行い、余りが「0ゼロ」であれば偶数として判断しています。「0ゼロ」以外は奇数としています。
インクリメント&デクリメント
インクリメント入力された数値に対して「1」を足して出力します。
デクリメント入力された数値に対して「1」を引いて出力します。
インクリメントの場合はループ内での条件に合致した場合の回数をカウントしたりするのに使用します。
偶数の場合のみ数値を「+1」加算します。奇数の場合は加算しません。
デクリメントは逆に数値を減らすので条件に合致した場合のみ数値を減らすことでループを停止する条件として使用したりすることが出来ます。
配列要素の和
配列に格納されている数値を全て足します。一次元配列だけではなく二次元配列なども足し算します。
「配列要素の和」は配列にある値を全てを足すため、二次元配列などで行ごとの和を出力させたい場合は、Forループなどで指標付けを行ってから配列要素の和に入力する必要があります。
配列要素の積
配列に格納されている数値を全て掛け算します。
使い方は配列要素の和と同じです。
複合演算
四則演算(和と積のみ)と論理演算(AND,OR,XOR)が出来ます。
複数の数値を計算する場合は通常は画像の右のように複数の関数を用いますが、複合演算を用いることで関数を1つにまとめることが可能です。
ブロックダイアグラムをすっきりさせることが出来ます。しかし、複合演算の演算種類を表した記号が小さいので四則演算の関数を用いた場合より可読性が悪いかもしれません。
複合演算にカーソルを合わせて右クリックを行うと複合演算の処理方法を変更することが出来ます。
絶対値
入力された数値を絶対値で出力します。
最も近い値に丸め込み
最も近い値に丸め込みます。単純な四捨五入ではないため、数値によっては切り下げや切り上げになったりします。統計の計算をする際に誤差が出にくいように処理がされています。四捨五入だと数値の誤差が出やすくなるため。
丸め込み方法についての詳細は下記に記載されています。
https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z000000P82kSAC&l=ja-JP
切り下げ整数化
小数点を全て切り捨てます。
切り上げ整数化
小数点を全て切り上げます。
2の累乗でスケール
元となる数値に2の累乗(任意)を掛け算して出力を行います。
配列データを入力することも可能です。
平方根
入力された値の平方根を出力します。
配列データを入力することも可能です。
2乗
入力された値の2乗を出力します。
配列データを入力することも可能です。
反転
入力された値の正負を反転して出力します。
逆数
入力された値の逆数を出力します。(入力された値を分数の分母にして計算する)
符号
入力された値が
正なら「1」を出力
負なら「-1」を出力します。
乱数
乱数:0~1の乱数(DBL)を出力します。
Random Number:任意範囲(下限~上限)の乱数を出力します。
出力する値の種類を選ぶことが出来ます。整数(U64,I64)または浮動小数点(DBL)。
数値関数:変換
数値関数パレット内にある変換関数についての説明をします。変換関数について主に入力された数値を別のデータ型に変換することを目的として関数群です。
浮動小数点、整数などへの変換
入力された数値を別のデータタイプ型へ変換するための関数です。
よく使用するデータ変換関数としては、『DBL』、『I32』、『U32』などの浮動小数点と整数の変換関数になります。
数値の変換関数を使用せずにLabVIEWでプログラムを組むことは出来ますが、入力する数値のデータタイプ型が違うと強制ドットが発生します。
強制ドットが発生するとパフォーマンスの低下に繋がるので、途中に変換関数を挿入することで強制ドットを無くします。(強制ドットがあると、別のメモリ領域に強制ドットによって変換された値が格納されます。)
タイプに強制変換
データのデータタイプ型を強制的に変換します。
互換性のあるデータ同士でしか強制変換を行うことが出来ません。数値であれば数値型にしか変換をすることは出来ません。
上図では数値型をブール型へ変換するようにしていますが、数値はブール型と互換性がないため、入力が不良ワイヤになっています。
NIのオンラインヘルプを見ると、型変換を行う場合は『型変換』関数よりもこちらのタイプに強制変換関数を推奨しているようです。
https://zone.ni.com/reference/ja-XX/help/371361R-0112/glang/coerce_to_type/
数値をブール配列に変換
入力された数値をブール配列に変換して出力を行います。
ブール配列に出力の仕方としては『2進数』で表記されます。左から『1、2,4,8,16….』と値が続いていきます。
ブール配列を数値に変換
ブール配列を数値に変換します。数値をブール配列に変換の逆の動作になります。
ブールから(0,1)に変換
入力されたブールの状態によって『0』または『1』を出力します。
True:1
False:0
タイムスタンプに変換
入力された値からタイムスタンプを出力します。
LabVIEWのタイムスタンプの基準位置が「1904/01/01 00:00:00.000」となっているため、『1以上」の数値が入力された場合は基準の時間に加算するようになっています。
『0』が入力された場合には基準のタイムスタンプは出力されずに『0』のタイムスタンプが出力されます。
文字列をバイト配列に変換
文字列をバイト配列に変換します。
文字を数値への変換方法ですが、ASCⅡ値によって変換されます。
http://www3.nit.ac.jp/~tamura/ex2/ascii.html
1文字ずつASCⅡ値に変換し、まとめて配列として出力されます。
バイト配列を文字列に変換
入力されたASCⅡ値のバイト配列を文字列として出力を行います。
単位変換
純粋な値に任意の単位に変換をすることが出来ます。(上図だとm/s)
もしくは単位の付いている数値を純粋な値に変換します。単位の付いている数値に同じ単位で『単位変』すると純粋な数値になる。
物理的な数値(単位)の付いている数値は、同じ単位同士でないと計算を行うことが出来ません。
単位の違いもの同士を四則演算をしようとしても不良ワイヤとなるため計算をすることが出来ません。
(単位の違うものや純粋な数値と間違って計算をしないためにある機能だと考えています。)
基本単位をキャスト
入力された物理的な数値を別の単位に変換します。数値は維持されます。
上図では単位が『m/s』で入力していますが、『基本単位をキャスト』で『kg』に単位を変換するようにしているため出力としては『9.8kg』という数値+単位になります。
単位自体を完全に変えてしまうため、使用時は注意が必要です。
色をRGBに変換
色『定数』または『制御器』で入力された色を『RGB』と『カラーコード』に分解をします。
色をカラーコードの数値で表す場合は一般的に16進数で表記されます。
白色の場合は「FFFFFF」
黒色の場合は「000000」
といった6桁表示になっています。
RGBで使用される数値の最大は255となっているため、16進数で表記すると「00~FF」の2桁で表記が出来ます。
カラーコードは
先頭の2桁が「R:赤色」、先頭から3,4桁目が「G:緑色」、5,6桁目が「青色」となっています。
「FF00FF」はRGBで見た場合に「赤:255、緑:0、青:255」を指しています。
RGBを色に変換
『RGB』を数値として入力を行い色表示器として出力をします。
上から赤、緑、青の数値を入力します。
RGBを色に変換するVIを使ったソフトを作ってます。
データ操作
型変換
型変換関数を使用すると『タイプに強制変換』関数とは違い異なるデータ型にも変換を行うことが出来ます。
型変換で異なるデータ型へ変化を行う時はLabVIEWで確保しているメモリ(ビット)が影響してくる。
数値を文字列に変換
U8数値を文字列に変換した場合、ASCⅡコードに対応した文字列が出力される。
U16やU32で上図と同じく「4C」で入力した場合、出力文字『L』の前に空白が含まれる
数値を文字列に変換する際に8ビット単位で文字変換を行っているため、U16(16bit)の場合だと上位の8ビットが『x00』となっているためASCⅡコードの『NULL』が出力されます。
下位の8ビットが『x4C』となっているため『L』が出力されます。結果『(空白)L』が出力されます。
遊びみたいな物ですが、下記のようにU8で数値配列を組み文字列に変化を行うと、任意の文字列を作成することが出来ます。
ブール値を数値に変換
ブールが「True」で数値変換を行った場合、データ型によって出力が変化します。
U8またはI8:「1」
U16またはI16:「256」
U32またはI32:「16777216」
U64またはI64:「72057594037927936」
文字列に平坦化
入力された文字列または配列データを『バイナリデータ』へと変換します。
データ型については任意のデータタイプを入れることが出来ます。
文字列の平坦化で「配列または文字列サイズを先頭に追加」をTrueにすると、出力された文字列の先頭に「配列または文字列のデータサイズ(32bit分)」が追加されます。
デフォルトではTrueになっているので、不必要な場合はFalseのブールを接続する必要があります。
バイナリデータが複数のデータ型で構成されている場合、元に戻すためにサイズデータが必要になったりします。
クラスタデータも配列にすることで文字列に平坦化を行うことが出来ます。
※バイト順序を指定することも出来、標準ではビックエディアンが指定されています。
文字列から非平坦化
バイナリデータの文字列を所定のデータ型へ変換を行います。
変換するためにはバイナリデータになる前のデータ型を文字列から非平坦化の『タイプ』へ入力を行う必要があります。(入力するデータ型は初期値のままで問題ありません。
もし、バイナリデータの先頭に配列または文字列のデータサイズが付与されている場合は、『配列または文字列サイズ含む』をTrueに設定してください。
Trueに設定されていないと変換が正常に行えないためエラーが出力される場合があります。(変換するデータ型によっては間違った値が出力されます。)
バイト順序についても同様で、バイナリデータにあったバイト順序を選択してください。
文字列に平坦化を非平坦化する
『文字列に平坦化』と『文字列から非平坦化』については上図のように組み合わせることでデータの変換を行うことが出来る。
任意のデータタイプをバイナリデータに変換するときの配列または文字列サイズやバイト順序は元のデータ型へ戻すときにも重要な設定なので設定忘れをしないように注意が必要
配列または文字列のサイズをFalseにすると、バイナリデータ内に配列サイズの情報が無くなってしまうため、1個目データしか変換が出来なくなる場合があるので注意が必要です。
2次元配列を1次元配列に変換する
文字列に平坦化と文字列から非平坦化を組み合わせることで、数値の2次元配列を1次元配列へ容易に変換をすることが可能です。
2次元配列をバイナリデータへ変換した後に元に戻すときに2次元配列ではなく1次元配列を指定することで変換をすることが出来ます。
注意点としては、配列のサイズを「False」にして変換を行ってください。Trueになっていると配列サイズの分しかバイナリデータから変換されません。
元になっている2Dのデータ型と1Dのデータ型は一致させてください。データ型が一致していないと、1要素のバイト(ビット)単位が変わるため違う数字が出力されます。
ディスカッション
コメント一覧
まだ、コメントがありません