ライブラリ関数呼び出しノードの使い方(仮)
2006/10/26
ここでは、LabVIEWで外部DLLの関数を使うための方法を記述する。
C言語で書かれた関数は、ソースそのままで、「コードインターフェースノード」で使えるが、Fortranなどの言語で書かれた関数に関しては、一度DLLにしてから「ライブラリ関数呼び出しノード」を使うしかない。
今のところ、試してないので実際の所の動作は検証してないが、以下に、たぶんこうなら動くだろうということを書いておく。
検証に関しては、そのうちやる予定だが、もしこれを見た方は、検証はご自分でお願いします。
まず、DLLの作り方から記述する。言語は、CとFortran中心に記述する。
Fortranで言うところのサブルーチン (Subroutine) は、C言語などでいうところ関数である、と思う。
ただ、その仕様に違いがあるが、この「ライブラリ関数呼び出しノード」を使う上では、関数の引数とかの定義など関数の作りに違いがでないようになる。一応、両方の書式にしたがって記述してみる。
関数の中身は簡単に、関数にa,bの変数を渡して、x=a+bとy=a-bの計算して変数x、yの値を返すものとする。C言語場合、変数xの1個だけなら関数の戻り値で返せるが、返す変数が2個ある場合はポインタを使って記述するのが通常である。しかし、「ライブラリ関数呼び出しノード」の特性上、ポインタを使う必要が無いので、「ライブラリ関数呼び出しノード」を使用することにあわせた記述にする。Fortranの場合、戻り値もポインタも関係ないので、そういう意味では、C言語の関数はFortranのサブルーチンに似た記述になる。以下関数の記述例。ちなみに、Fortranは、余りに久しぶりすぎてうろ覚えなので間違ってるかもしれない。。。
C言語の場合
void func(int a, int b, int x, int y)
{
x = a + b;
y = a - b;
}
Fortranの場合
subroutine func(a,b,x,y)
integer a,b,x,y
x = a + b
y = a - b
end
さて、関数を記述したところで、「ライブラリ関数呼び出しノード」の機能を解説する。この「ライブラリ関数呼び出しノード」は、どちらかというとFortranのsubroutineとC言語の関数を合体したような動作をする。Fortranの場合、計算した後に取り出したい変数も引数に入れるが、Cの場合はその変数が1つの場合はreturnの戻り値で取り出せる。Cで取り出す変数が2つ以上の場合、先にも書いた通り、引数にポインタを使うが、この「ライブラリ関数呼び出しノード」では、引数にポインタを使用せず普通の変数を使っても、引数でいれた変数の最終的な値を取り出すことができる。それも、引数で指定した全て。これは、引数の変数に値を入れるのと同時に、そのメモリアドレスも管理してポインタ的な動作をしていると思われる。
さて、自分で書いていて分かり辛いので、先に進む。
上記の関数 (subroutine) を作ってDLLにする。で、LabVIEWでは、以下のようにする。
「ライブラリ関数呼び出しノード」を一つ貼り付ける。そこでW左クリックをすると、ダイアログが現れる。
参照で、作ったDLLを指定する。そうすると、関数名をクリックすると、DLLにある関数一覧がでるので使う関数を指定する。呼び出し規約は、C言語の関数ならCで良いが、他はどうだろう。。。検証の必要有り。UIスレッドの実行、のところも良くわからない。そのままでも、動くと思う。
問題はパラメータの所である。恐らく、引数で指定した変数の数だけ、指定する必要があると思う。初めからあるreturn
typeは、C言語の戻り値である。今回は使用してないので、タイプはvoidのままで良い。で、パラメータを後に追加を4回する(変数4個なので)。そうすると以下のようになるはず。
パラメータの順番は、そのまま引数の順番となるので、指定するときには注意が必要である。パラメータの名前は好きなものを付けられるので、分かりやすい名前をつけておく。タイプは、今回の関数だと数値でも良いが、後々の使い勝手も考えて、以下のようにする。
タイプが、タイプに適応で、データ形式は、値によるハンドルにする。これで準備完了で、OKを押す。すると以下のように4つのコネクタが増えているはず。
上2つのコネクタが、引数のaとbに対応している。なので、計算に必要となる数値を左コネクタに入れる。下2つのコネクタは値を取り出すための引数であるxとyに対応する。ここで、注意は左側のコネクタには、引数に値を入れると同時にタイプ指定も担っている
(ダイアログのタイプをタイプに適応にしたから)。なので、関数 (subroutine)
で指定したタイプの値をいれないととエラーか予測できない何かがおきる、かもしれない。ということで、タイプ指定ということで、下2つのコネクタには関数の引数のタイプに合わせた初期値を入れている。
さて、右側のコネクタであるが、上から、a,b,x,yに対応していて、関数内の計算が終わった後の数値を参照できるようになっている。ここで必要なのは、計算したxとyの値なので、下2つのコネクタから数値表示機に出力した。もちろん、上2つのコネクタからは、aとbの計算後の値が参照できる
(今回の場合、値を変更する操作してないので、左コネクタで入れた値と同じ値しかでないが)。
さて、行列を計算して、配列データを得たい場合であるが、下図のように左側のコネクタに必要な配列を接続してあげれば良い。できれば、関数内で使用する行列の階数と同じ数にしたほうが良いらしい。たとえば6x6なら、タイプ指定、または導入変数の配列も6行6列に。
以上、健闘を祈る。