この記事ではLabVIEWで作成したEXEに対して外から引数を渡してやる方法を紹介しています。
LabVIEWで作成したプログラムを、LabVIEWの開発環境がインストールされていないPCで使用するためにアプリケーション(EXE)化して配布することができます。
このEXE、コマンドプロンプトから実行する際に、特定のパラメタを引数として外から与えることができます。
外から与えた引数はEXEの中で使用できるのですが、プログラム内部ではそれ専用の関数(実体はプロパティノード)を使用して受け取るようにする必要があり、また受け取った後のデータについては適した形に変換して使用することになります。
この記事では、EXEへの引数の渡し方とその変換についてのアイデアを紹介しています。
プログラム側の準備
まず、そもそものプログラムで引数を受け取る準備をする必要があります。
が、これは簡単で、専用の関数が用意されています。

この関数の中身、ダブルクリックして確認することができるのですが、実態は単にプロパティノードを使用しているだけです。

このプロパティノードは文字列配列として結果を出力しますが、その配列の要素0は渡された引数にはなっていないため、引数として使用する部分は要素1からの値となります。
たとえどんな引数を与えていたとしてもこの時点では「文字列」の配列になっていることがポイントです。
EXEビルド時の準備
プログラム的に引数をもらえるように構成したらそれでそのままEXE化して終わり、かというとそうではなく、EXE化する、つまりビルド時に設定が必要です。デフォルトの状態ではいくらプログラム的に引数を受け取るように関数を使用していても受け取ることができない点に注意が必要です。

あとのビルドプロパティの設定は特別なことはありません。
なお、そもそもどうやってEXEを作ればいいの?と疑問に思っている方は基本的なEXEの作り方も以下の記事で紹介しています。
引数の渡し方
引数を渡す際には、コマンドプロンプト上でEXEを指定した後にその渡したい引数をスペース区切りで入力していきます。
例えば、EXEの名前がtestapp.exeで、これに対して「Hello」と「3」という引数を渡すとします。この場合、コマンドプロンプト上では以下のように指定することになります。
Application.exe Hello 3
Application.exeの部分は実際のアプリケーション(EXE)ファイルの名前にする必要があり、またこの操作はこのアプリケーションファイルがあるディレクトリに「cd」で移って実行しています。

注意点としては、2番目の引数である「3」はこの時点では「数字としての3」なのか「文字情報としての3」なのかは指定されていないことです。
最初に紹介したように、プログラムの中では、どんな引数だろうと最初は文字の情報として受け取ります。なので、ただ単に「3」と与えた状態であれば、これは3という文字情報であり、数値として四則演算を行えるものにはなっていません。
そのため、例えば数値を入力させているのであれば、プログラム側で文字を数値に変換します。
そもそもEXEへの引数はどのようなデータタイプを渡すべきか決まっているはずなので、プログラム側でそれぞれ渡された引数に対して適切な変換を施してやればいいということになります。
引数の変換例
では、実際にどのように変換していくかの例を以下で紹介していきます。
数値
まずは数値です。これはそのままずばり、文字列を数値に変換する関数を使用することになります。
10進数以外の形式に変換することもできますが、10進数の場合には整数か小数も含めるかで使用する関数が変わります。

ブール
ブール値としての文字列情報を変換するには、いくつかの方法が考えられます。
関数で判定させる方法としてはTRUE/FALSE文字列を追加の関数を使用できます。

が、単純にTRUEかどうかを判定させるのであれば、「等しい?」関数やケースストラクチャも使えます。
特にケースストラクチャだと大文字小文字を気にしなくても判定できるモードを使えるので便利です。

ファイルパス
ファイルパスについても、文字列情報からファイルパスデータへ直接変換する関数があるのでこれを利用できます。
ただし、ファイルパスの中に半角スペースがあるとそこで区切られてしまうので注意が必要です。

配列
引数として配列を渡す場合には少し工夫が必要です。
配列は必然的に複数のデータを渡すことになるため「ここからここまでが一つの配列に入っているデータ」ということを明示的に示す方が分かりやすいと思います。
EXEへ引数を渡す際にはスペースで区切られていなければそれは一つの文字列として扱われるのですが、見やすさのためには例えば角括弧でくくり、要素の区切り(デリミタ)をカンマ等にすることで見やすくなります。
他の言語で角括弧で配列を表わすことに倣って例えば
[1,2,3,5,7]
などと入力させ、まず角括弧の間の文字を取り出してカンマ区切りになっているものを配列のそれぞれの要素として解釈するためにスプレッドシート文字列を配列に変換関数を使用します。

角括弧の中身の要素をカンマ等で区切るときにスペースを入れてしまうと正しく読み取れなくなることに注意します。
実際に試した例が下の図です。

また、多次元配列なんかも工夫次第で指定することができます。
似たような操作を繰り返す部分にはForループを使用し、そのForループが回る回数を指定する数字を角括弧の先頭につけています。(もちろんこれ以外の指定の仕方も考えられると思います。あくまで一例です。)

クラスタ
クラスタも配列同様工夫が必要になります。
とはいっても思想は配列と同じで、中の要素ごとに変換の形を変えてやるというのが基本的な方針になります。
配列は角括弧としていたので、丸括弧ででも囲っておくことにします(別に丸括弧である必然性はありません)。

あとはこれをクラスタに当てはまるように成形するだけです。

タイムスタンプ
あまりタイムスタンプ情報を引数として渡すことは少ないかもしれませんが、タイムスタンプを示した文字列をタイムスタンプデータに変換することができます。
便利なのは文字列からスキャンの関数を使用する方法です。この関数の形式文字列として「%<>T」とし、<>の間に時間形式文字列を指定します。
以下は実行例です。

引数の与え方が間違っている場合
EXEに対する複数の引数の与え方が間違っている場合、当然入力パラメタの不正としてEXEは正しく動作させられないことになります。
それを使用者に伝える方法としてはダイアログを表示させることが挙げられます。
例えば、引数を本来は3つ与えないといけないのに2つしかなかった場合には配列サイズを使用して引数の数を調べれば対応できます。

上の例では、変換がうまくされなかったことで引数の与え方が異なることを検出したとして、引数をこのように記述してくださいというダイアログを表示させるといったことも考えられます。
引数の数は合っていてもそれぞれの引数の内容がプログラムが期待するものと異なる場合、これを検出するのには工夫が要ります。変換に対してエラーが出るような関数はいいのですが、特にエラーも出さない関数もあるので、何かしらチェック機能を設けることになりますが、データタイプによって異なるのでここでは割愛します。
LabVIEWで扱えるデータタイプは他にもありますが(波形データなど)、EXEに対して引数として渡しうるデータの種類としては上で紹介したものでほぼ事足りると思います。
この記事ではLabVIEWで作成したEXEに対して引数を与える方法を紹介しました。
プログラム的には常に文字列データとしてしか受け取れないため、これを如何に目的のデータタイプとするかについて工夫することになりますが、その参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント