この記事で扱っていること
停止ボタンにすぐに反応する波形測定のプログラムを作る方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWでハードウェアを操作させて何かデータを測定するプログラムを書く上で、不慣れな方が迷うかもしれないポイントに、「サンプリングレート」と「サンプル数」の関係があると思います。
National Instruments社のDAQハードウェアを使用する場合、「DAQmx読み取り」の関数でハードウェアでサンプリングしたデータを取得することになります。
このとき一度に取得する(この関数から出力として得られる)データの数が「サンプル数」であり、それらサンプルを1秒にどれだけハードウェア側で取得するのか画「サンプリングレート」になっています。
そのため、例えばサンプリングレートが1000であれば1秒に1000点のデータを取得し、このときのサンプル数の指定が2000であれば、2000点をDAQmx読み取りの関数が出力する関係上、2000点のデータがたまるまで2秒かかることになるので、DAQmx読み取りがデータを出力する頻度も2秒に1回、ということになります。
この性質で厄介なのは、DAQmx読み取りが実行されないとプログラムが止められない、という点です。この関数にはタイムアウトの入力があり、このタイムアウトの時間が経過したらエラーを出すのですが、その前まではこの関数はデータが指定したサンプル数たまるまで待機してしまいます。
実はこの弱点を克服するプログラムはサンプルとして既に存在するのですが、イベントストラクチャを使うことになります(記事後半で紹介します)。
イベントストラクチャをこれ以外の用途でも使う場合にはプログラムの組み方を工夫する必要がありますが、今回はイベントストラクチャを使わないで弱点を克服する方法を考えてみました。
どんな結果になるか
プログラムでは、ハードウェアの指定やサンプリングレート、サンプル数の指定を行う以外に、反応速度を変えるパラメーターを設けています。
反応速度パラメーターは、数字が大きければ大きいほど停止ボタンに早く反応できます。
例えば、サンプリングレートが1000でサンプル数が2000の場合、通常であれば停止ボタンの状態が読み取られるのに2秒の間隔となりますが、反応速度パラメーターを10とすると、間隔が1/10の200ミリ秒となります。
もちろん、グラフにデータプロットがされる間隔は2秒おきで変わらないのですが、その2秒を待たずとも停止ボタンを押したら即座に停止させることができるようになります。
プログラムの構造
DAQmx読み取りの関数が、指定したサンプル数分データを取得しないと待機してしまうというルールは変わらないので、一度に読み取るデータの数を減らし、指定した数がたまるまでデータを「連結」するようにします。
WhileループにあるDAQmx読み取りの関数へ入力する「サンプル数/ch」の値を、反応速度パラメーターによって小さくしています。
そして、この分のデータがたまるまでは波形を連結しておく、という実装にしています。なので、反応速度パラーメーターは基本的に「サンプル数」を割り切れる数に指定するのが好ましいということになります。
データがたまったらWhileループの内側にあるケースストラクチャのうち、外側のケースストラクチャがTRUEになります。
実際はこのとき、シフトレジスタから得られているデータが空の波形配列であるかどうかでもさらに分岐が必要になります。(こうしないと、反応速度パラメーターが1のときに波形が得られなくなるため)
次に外側のケースストラクチャがFALSEのとき、つまり本来のサンプル数分のデータがまだたまっていない時の中身を以下の図のようにしています。
中にまたケースストラクチャがありますが、これは「データがたまりはじめる最初かどうか」で波形の連結を行うか否かが変わるためその判定を「等しい?」で行っています。
なお、上で紹介したプログラムに出てきた波形の連結には、波形パレットにある関数を使用します。
注意点としては、二か所にある「等しい?」には集合比較を使ってください。(デフォルトは要素比較になりますが、これをすると出力されるのはブールの配列になります)
イベントストラクチャを使用したサンプル
停止ボタンに即座に反応するプログラムは、この記事で紹介したプログラムでなくてもサンプルが存在します。
こちらの方がイベント検知をしている分、より早く停止ボタンに反応してくれることになる一方で、プログラム全体をイベントストラクチャで構築し、ハードウェアからデータを取得する以外の操作もイベントストラクチャで扱っている場合、プログラム全体の構造をちゃんと考えないと実装が難しい場合があります。
なお、今回の記事の方法の場合、データがサンプル数で指定した数たまる前に停止ボタンを押したとしても、それまでに得られたデータを得るためにはループの外でシフトレジスタの値を見ることになります。
一方で、サンプルファインダにあるイベントストラクチャを使用するプログラムの場合には、ループ終了後に、その時にまだLabVIEWによって読み取られていなかったデータを読み出すことになります。
本記事では、停止ボタンにすぐに反応する波形測定のプログラム例を紹介しました。サンプルでも同様な操作をすることができますが、イベントストラクチャとの兼ね合いを考えるのが設計上大変、メンドクサイ、といった場合に参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント