LabVIEW 定数配列参考プログラム
(最終改訂 2017/12/08)
LED_scroll.zipの内容
LabVIEWの VI 実行時に必要なデータが外部のファイル中に存在するとき、ファイルパスを直接指
定してプロンプト無しに読込み、外部データであることを意識することなく実行することは可能である。
ただし、この場合は必要なファイルと当該VI のパスの相対位置関係を(ソースを修正しない限りは)
維持する必要があり、必要データをLabVIEWのVIソース中に定数として保持できるならば定数化し ておく方がソフトウェアの管理上有用である。
LED_scroll.zipにはこの例題として、電光掲示板を模したLED_scroll.vi(ソースVI、実行ファイル)
および LED_scroll.vi で使用するフォント情報をファイルから取込み定数化するtabulator.vi(ソース
VIのみ)のLabVIEW2013版とLabVIEW7.1版(ファイル名に_LV71が付く)が含まれている。実行 ファイルを開く場合には同名の設定ファイル(拡張子.ini)を同じフォルダに置く。
1. tabulator.vi
LabVIEWでは、ソースVI(実行ファイルでは不可)を実行後フロントパネルの表示器に表示される
(配列では隠れている要素を含む)内容を停止時にそのままブロックダイアグラムにドラグ&ドロップ してデータ型、配列次元等が表示器と同じプロパティを持つ定数として配置することができる。
tabulator.viは、下記のURLからダウンロードした8×14フォントファイルを読込んでフォント情報
をLED_scroll.viで使用する形式でフロントパネルの表示器(ラベル”pattern”、キャプション”14x256
font array”)に表示するVIである。
http://ftp.bue.de/MTGR/Extras/Fonts/8x14/
前記URLの8×14フォントファイルはASCII256文字セットのパタンを横8縦14のドットで表現
した 3584B のファイルで、文字データ中の最初(アドレスが若い)のバイトが上端の行、バイト中の
MSBが各行左端のドットのブール値を示す。p. 1図1はBOLD.fntの先頭部分をバイナリエディタで 表示した例で、図1左はwxHexEditorによる1行14バイトの16進文字表示、図1右はTSXBINに よる1行1バイトのビット表示で、双方の黄枠内はASCIIコード0x01に対応する部分(図3左ではこ のコードを指定して切出された部分配列と8×14のドットパタンが表示されている)である。
tabulator.vi(図 2 にブロックダイアグラムを示す)では、While ループの外側でフォントファイル
を読込み、ASCII 文字コードを指定してフォント情報を切出せる様に2D配列に整形する。LabVIEW ではメモリ上の配列要素は C と同じ row-major order(LabVIEW 同様に業界標準システムである MATLABはFORTRANと同じcolumn-major orderであることに注意。p.6図8参照)で配置され、
配列のサイズは(14×256ではなく)256×14となる。このまま行指標で切出す方が処理も速いが、こ こではフロントパネル上で2D表示してチェックする便宜のため転置して14×256の配列として表示し
(列指標による切出しとなる)、この形で定数配列化している。
図2 フォントファイルを読込み2D表示するtabulator.viのブロックダイアグラム
図3は、tabulator.viの実行停止後にフロントパネルの表示器を指定(破線の枠が点滅する:図3左)、
ドラグ(フロントパネル上の枠と同サイズでブロックダイアグラムに点線の枠が表示される:図3中)、 ドロップ(枠の中央に配置される:図3右)により新規VIのブロックダイアグラム上に定数として作 成する過程を示している。
図3 フロントパネルの表示器をブロックダイアグラムにドラグ&ドロップして定数化する
2. LED_scroll.vi
LED_scroll.viは、前述のtabulator.viの機能により13種の8×14フォントファイルを定数配列化し て組込み、14行80欄のLEDアレイにASCII文字(日本語など2バイト文字は使えない)のテキスト をスクロール表示させる電光掲示板デモVIである。機能は次の通りで図4、5に実行画面の例を示す。
● "TOD / text"ボタン【起動時の既定ON】により表示文字列をTOD文字列とするか”ASCII text”に 入力した文字列とするかを選択する(図4参照)。
● "TOD / text"がOFFで "scroll"ボタン【既定ON】がONのとき、"with text" ボタン【既定ON】
を表示し、ONで表示サイクルに”ASCII text”の内容を含める。文字列はスクロール中固定(先頭の 文字が画面左に達したとき更新)されるため、連結の順序はTOD文字列が先になる。
● "TOD / text"がOFFで"date-time / time-date" ボタン【既定OFF】を表示し、TOD文字列で日付、
時刻の何れを先にするかを選択する。ON では字配りのため先頭に1文字空白が付き、"scroll"が OFFの停止時に時計として機能する。
● "TOD / text" OFF、"scroll" ON、"date-time / time-date" OFF【既定】のとき、"advance 5s"ボタ ン【既定ON】を表示する。"date-time / time-date" ONでは先頭の空白を表示時に時刻が更新され るが"date-time / time-date" OFF では表示のタイミングで5秒遅れるため、"advance 5s" ONで5 秒進めてこれを補正する(図5参照)。
図4 LED_scroll.vi起動時の既定の設定画面
3. LED_scroll2.vi【2017/12/02追加】
LED_scroll2.vi は、LED_scroll.vi のフロントパネルをメイン画面として、スクロールすると現れる
サブ画面(図6)を設け、クリック可能な文字パタン一覧とタイマーによる設定変更機能を追加したも のである。2Dピクチャが等倍表示ではない場合(ここではプロパティノードの「ズーム」値を 2とし て文字パタン一覧を拡大表示)プロパティノードの「マウス」で取得される座標が版により異なる
(LabVIEW7.1ではフロントパネル上の相対座標そのままであるのに対しLabVIEW2013 ではズーム 係数で補正している)ため_LV71版のソースVIをLabVIEW2013で開いても正しく動作しない。追加 機能は次の通りである。
● キーボードには無い文字もサブ画面指定フォント(起動時の既定は”reverse”)の文字パタン一覧か ら選択して ”append” でサブ画面の文字列制御器 ”ASCII text” のテキスト末尾に追加 し、
“transfer”をクリックするとタイマー動作とは無関係にサブ画面の”ASCII text”の内容をメイン画 面の”ASCII text”に転送する。
● 押しボタンSW ”Time stamp / waiting time” 【既定ON】でタイマー動作設定の制御器を切替え、
OFFでタイムスタンプ(ボックス内で文字列を編集、または右側のカレンダーアイコンをクリック して設定:起動時の既定は起動時刻)、ON で数値(動作待時間を秒で指定:起動時の既定は 10)
を表示する。
● ”SET”ボタンのクリックで(タイムスタンプの設定時刻がクリック以降であるかまたは待時間の値
が正であるとき)タイマーが起動し、”Time stamp / waiting time” 切替SWは非表示となり、”SET”
ボタンとタイマー設定制御器は”RESET”ボタン(クリックで起動したタイマーを解除)と動作まで のカウントダウン(秒)の表示に切替わる。
● タイマー動作時刻にメイン画面の表示設定がサブ画面の設定内容に切替わり、”Time stamp / waiting time” 切替SW、”SET” ボタン、タイマー設定制御器が復帰表示される。
図6 はサブ画面の表示例で、この状態で”SET”ボタンをクリックすると10秒後にメイン画面は反転 フォント、時刻先行のTOD文字列表示、スクロール無しの時計表示となる。
図6 LED_scroll2.viのスクロールで現れるサブ画面
4. tabulator2.vi【2017/12/05追加】
LED_scroll.vi(および追加の LED_scroll2.vi)で使用するフォントデータを定数化するための専用
VIであるtabulator.viの機能を汎用化してバイト順(2017/12/08追加)、データ型、メモリ上の配列要 素配置順、配列サイズを指定して外部ファイルを 2 次元配列定数化用に表示する VI が tabulator2.vi である。データ型は一般的な64b浮動小数点数(LabVIEW既定のデータ型)と32b整数(符号付きま たは符号無し)に音響、信号処理等では使用頻度の高い128b複素数(2017/12/08追加)を加え、複素 数取込みの目的でファイル読取り位置のオフセット指定(2017/12/08追加)を可能にしている(註参照)。
tabulator.vi の 項 で 記 述 の 通 り 実 行 フ ァ イ ル に は 利 用 価 値 が 無 い た め LED_scroll.zip に は
LabVIEW2013のソースVIのみを含めている。要素のビット内容には無関係である配列要素配置順(起
動時の既定はC、LabVIEWの ”row-major”)、整数の符号の扱い(起動時の既定は ”signed”)、配列サ イズ(起動時の既定は1×1)はファイル読込み後に変更が可能である。
註:MATLABでワークスペース変数をファイルに保存する関数saveはバイナリ(既定の”-mat”オプ ション)であってもファイルにはヘッダが付くため MATLAB 以外のシステムでの読込みには関数 fwriteを使用するのが適切であるが、fwriteでは複素数データの保存はできない。関数saveで保 存したファイルのヘッダ長はバイナリエディタで容易に確認できるが、tabulator2.viで読込む前にオフ セット、データ型、配列要素配置順を確認するための簡易ビュワーVI(次項type_check.vi:2017/12/08 追加)を同梱した。
tabulator2.viを起動直後の既定設定のフロントパネルを図7に示す。ファイルの定数化の流れは次の
通り(p.6 ①~⑥の項番は図7中の数字に対応)である。
① ファイル読込みプロンプトのファイル名フィルタパタン(既定は ”*.*”)を指定する。
② ファイル読込み後には変更できない(読込みが正常終了の場合に制御器の操作を無効化)読取り位 置(”offset”:既定は0で先頭から)、バイト順(註参照:既定は”little endian”)、データ型(既定 は64b浮動小数点数)を指定する。
③ “READ”ボタンをクリックし、プロンプトに従い参照するファイルを指定する。”offset” 0で先頭か
ら読む指定では、ファイルサイズが指定データ長の倍数ではない場合、”type mismatch”が点灯し読 取りを中止する。”offset” が 0 ではない場合は、指定位置以降のバイト数を指定データ長で割った 整数商の要素を読込む。
④ 配列要素配置順(既定は”row-major”)、配列サイズ(既定は 1×1)、整数の場合は符号の有無を指 定する。読込まれた要素数と配列サイズとが整合しない場合 ”size mismatch”が点灯し、サイズが 小さい場合はサイズ分のみ使用、大きい場合は過剰な要素の値を0とする。
⑤ 指標を指定して配列要素(ビットパタンと値が表示される)を確認する。停止して再開ではなく設 定を変更してファイルを読込む場合は無効化された制御器を復帰させるため“READ”をクリックし てプロンプトをキャンセルする(VIプロパティの実行カテゴリで「自動エラー処理を有効」のチェ ックを外している)。
⑥ “HALT”ボタンまたは「実行を中断」ボタンをクリックして停止する。
以後の処理はtabulator.vi におけるp.2図3の操作と同様である。例として行番号を実部、列番号を 虚部とする4×4の複素行列Zを作成し(ここではMATLAB互換のOctaveを使用)、関数saveで保 存したバイナリファイルtest(ヘッダ長53B:LED_scroll.zipに同梱)を読取って表示した例を図8に 示す。MATLABの配列要素のメモリ上の配置順はLabVIEWとは逆の”column-major”(配列要素を連 続して参照するループでは外側のループ変数が列の指標)である。図8左上はOctaveの実行結果、左 下 は test の バ イ ナ リ エ デ ィ タ wxHexEditor に よ る 表 示 、 右 は tabulator2.vi で test を 読 込 み、”column-major”、配列サイズ4×4を指定して停止後に配列表示器を指定(黄枠内の点滅する破線 部分)したフロントパネルで、それぞれ赤の角型枠内は行列要素Z(4,1)(MATLABの指標は 0では なく1から始まる)を示す。
図8 Octave実行結果(左上) wxHexEditorの表示(左下) tabulator2.vi実行結果(右)
註:2B以上のデータではデータを指定するアドレスのバイトがMSBを含む場合(big endian)とLSB を含む場合(little endian)とがありデータのバイト順が異なる。PC系は後者であるが、メインフレー
ム機、PowerPC系CPUは前者である。因みにIPアドレス、ポート番号はbig endianで記述すること
とされLabVIEWのファイル読取りVIはbig endianを既定としている。
5. type_check.vi【2017/12/08追加】
type_check.viは、tabulator2.viでの読取り準備としてヘッダ付ファイルのデータ開始位置、バイト
順、データ型、配列要素配置順を確認するための簡易ビュワーVIで、ファイルの指定位置から32Bを 符号無し整数およびASCII文字で表示し、指定位置から4B、8B、16Bの内容をそれぞれ整数(符号付 き、符号無し)、浮動小数点数、複素数と解釈して2種類のバイト順で並行表示する。LED_scroll.zip にはLabVIEW2013のみ(LabVIEW7.1では配列のスクロールバーを表示できない)ソースVIおよび 実行ファイルを含めている。
type_check.vi を起動して”READ”をクリックし、バイナリファイル test を開いた直後のフロントパ
ネルを図 9 に示す。配列のスクロールバーまたは配列指標の増減ボタンでデータ開始位置を探索し、
little endian、big endianの両表示を見て何れのバイト順であるかを確認する。
図9 バイナリファイルtestを開いたtype_check.viのフロントパネル
図10はデータの先頭に位置付けた画面で、以後、”byte”を16にして”increment”をクリックし要素 を順次表示して配列要素配置順が”column-major”であることを確認できる。“clear index”をクリックす るとファイル先頭に位置し、続いて”decrement”をクリックするとファイル最後尾に位置する。