【LabVIEWでDAQを扱う③】DAQのプログラムの流れを知ろう

LabVIEWでDAQを扱う

スポンサーリンク

LabVIEWでデータ測定用のハードウェア(DAQ)を扱おうという初心者の方に向けて、道しるべになるような情報を発信していこうという試みです。

シリーズ3回目としてDAQのプログラムはどういう流れで書かれているのか、タスクの構成がLabVIEWでどのようにされているのかを紹介していきます。

この記事は、以下のような方に向けて書いています。

  • LabVIEWでDAQ操作のプログラムを作るときの構成を知りたい
  • 各関数はどういった役割を持つの?

もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。

なお、前回の記事はこちらです。

スポンサーリンク

LabVIEWプログラムでタスクを組む

前回の記事ではLabVIEWのサンプルを実行して信号の値を得て、それがどんなプログラムになっているかを見ました。そしてDAQのプログラムを構成する上で、タスクというものを扱う必要があることを紹介しました。ここではもう少し深く取り上げてみます。

参考とするのはやはりサンプルで、前回同様アナログ入力の電圧連続入力サンプルを例にとります。ただ、説明の中では適宜他のサンプルの作りも確認していきます。

このブロックダイアグラムを元に、各関数の役割を見ていきます。参考にするのはアナログ入力のものですが、同じような関数はアナログ出力やデジタルの入出力でも使用します。それぞれの種類ごと、個々のタスクの種類でまた考え方が異なる部分はあるのですがそ の紹介は別の記事で紹介するとして 、まずは大雑把にどういった関数を使うのかの流れを確認します。

以下では、このサンプルのブロックダイアグラム上の区分に従って、

  • チャンネル設定
  • タイミング設定
  • ログ設定
  • トリガ設定
  • データを集録

のそれぞれの項目の役割を紹介していきます。

チャンネル設定

その名の通り、ここではチャンネルの設定を行います。なにはともあれ、まずはどのデバイスのどのチャンネルを使用するの?ってことを決めないと先に進みません。

チャンネルの設定のためにDAQmxチャンネルを作成という関数を使用しています。このチャンネルの作成に際して、

  • 信号の種類(アナログなのかデジタルなのか、など)
  • どのハードウェアのどのチャンネルをタスク中で使用するか
  • その他測定の種類によって必要な設定値

を決めます。アナログ信号を測定するということであれば測定種はアナログ入力となりますが、さらに細かく信号の種類が電圧なのか、電流なのか、温度センサからの信号なのか圧力センサからの信号なのかを決めます。

そしてこの種類によって信号の種類ごとに特定のパラメタ設定を必要とする場合があります。電圧連続入力のサンプルではもちろん電圧測定ですが、他のサンプルで異なる測定の種類のサンプルを見ると、このチャンネルを生成の関数の設定が変わっているのを確認できると思います。

タイミング設定

次にタイミングに関する設定を行います。ここでいうタイミングとは、データを取る(サンプリングすると表現することもあります)タイミングのことをさしています。何を基準にどうデータを取るの?ってことを決めます。

使用されているのはDAQmxタイミング関数です。この関数は、「ハードウェアタイミングのタスクなのかソフトウェアタイミングのタスクなのか」を決めるために使用します。例外的な使用法を除けば、基本的にはこのDAQmxタイミング関数を使用するとハードウェアタイミング、使用しないとソフトウェアタイミングです。

例えば、サンプルファインダの中にある「電圧 – SWタイミング入力」というサンプルを見るとDAQmxタイミングの関数は使用されていないことがわかります。

これは何かというと、信号(測りたいデータ)測定をハードウェア側で確定的なタイミングで行うのか、あるいはソフトウェア側での非確定的なタイミングで行うかに関わっています。

ハードウェアは信号を測定する際にサンプリングクロックという、タイミングの基準になるクロックの周期に合わせてデータを測定(サンプリング)します。別に詳細は知りたくないということであれば、大雑把に「一つ一つのデータを取得するための基準となる精度の高い時計があって、その時計で決められたタイミングで信号を測定している」と思ってください。

ハードウェアタイミングはソフトウェア(LabVIEW側)とは独立していますが、ソフトウェアタイミングはLabVIEWがハードウェアに対して都度データをとるように指示を出してデータを1点ずつ取得することになります。

言い換えればLabVIEWが動作して、後述するDAQmx読み取りの関数が実行されるタイミングに依存して、データを得られる周期が変わるということになります。

LabVIEWはソフトウェアなので、例えばWindows OS上で動作しているのであればこのOSの支配下におかれています。そのため、LabVIEWのプログラムとしては例えば10 ミリ秒ごとに値を欲しいと考えても、実際に10ミリ秒きっかりで動作することはなく、毎回タイミングがまちまちになります。

するとどういった不便が起こるか。もし仮にデータを取るタイミングが常に精度よく一定であれば特定の周波数を持つ信号を「きれいなデータ」として測定することができます。

一方で、タイミングがまちまちだと、データとデータの間隔があるところでは1ミリ秒、別のところでは1.2ミリ秒などとなってしまい、本来の測定信号が持つ実際の周波数などの特徴が誤ったり失われた形でしかデータ取得できないことになります。

例えば下の図は少しわかりにくいのですが、プロット間の間隔が必ずしも一定にはなっていません。

これらのことから、ハードウェアタイミングの方がより正確な時間間隔での測定に優れているといえます。

「であればソフトウェアタイミングを使う場合はあるのか?」と考えるかもしれませんが、ハードウェアによってはハードウェアタイミングの測定が行えないものがあるので、その場合はソフトウェアタイミングで実行するしかありません(これはデジタル信号を扱う場合でも同様です)。

DAQmxタイミングの関数には他にも指定がありますが、詳しくは次回の記事で掘り下げます。

DAQmxタイミング関数はタイミングに関するパラメタを設定するとして、サンプルのブロックダイアグラムに戻ると、その後にはプロパティノードがついています。

サンプルの例では、「SampleClk.Rate」と書かれた、サンプリングクロック>>レートのプロパティが選択されています。これは、DAQmxタイミングの関数で指定したサンプリングレートと実際にハードウェアが構成できるサンプリングレートが異なる場合に、実際のサンプリングレートを知るのに便利です。

「え、指定したサンプリングレートにならないことがあるの?」と思われるかもしれませんが、一部のDAQハードウェアはADCの性質上任意のサンプリングレートがとれないものがあるようです(NI 9234など)。

なので、このプロパティノードは必須ではないですが、使用するクセは付けておいた方がいいと思います。

ログ設定

このログ設定に関しては絶対に覚えなければいけない、というものではありません。

ここで使用されているDAQmxロギングを構成の関数一つでデータをTDMSというファイル形式で保存することができるのですが、細かいカスタマイズができません。今後、データを保存することについても記事で扱っていき、そこである程度のカスタマイズができるようになれば、この関数を使用することはなくなると思っていいです。

もし使用する場合には、フロントパネル上でロギングモードをONにして、どこに保存するかのパスを指定すればデータの保存ができます。

トリガ設定

次はトリガの設定です。いくつかのトリガから使用したいものがあればそれを使うという感じです。

特にトリガを使用することはないよ、ということであれば、トリガの関数そのものを使用する必要はありません。

ハードウェアによって選択できないトリガもありますが、サンプリング操作自体をコントロールするためにトリガを設けることで柔軟なサンプリングができるようになります。

大雑把に説明すると、

  • 開始トリガ:その名の通りこのトリガが入ってくるとサンプリングを開始します
  • 一時停止トリガ:条件を満たすトリガが入ったときに一時停止し、条件を満たさなくなると再びサンプリングします
  • 基準トリガ:トリガ信号が入る前と後でそれぞれ指定した数のデータをサンプリングします
  • 時間トリガ:指定した時間にタスクを開始させることができます

ただし、DAQmxタイミングで指定したサンプリングモードが連続の場合には基準トリガは使用できません。トリガ後の特定のサンプル数をとる、という概念が連続モードにはないからです。

各トリガについては次回の記事で掘り下げます。

データを集録

いよいよデータを集録する段階です。

そのためにはまずタスクを開始させます。そのものずばり、タスクを開始の関数です。この関数が実行されると、この関数よりも前に設定していたタスクの内容(どのチャンネルを使うか、どんなタイミングでサンプリングするか、どんなトリガを使うか)に従ってハードウェアの操作を行っていきます。

データの測定の場合には、DAQmx読み取りの関数を使用します。この関数は多態性(複数の設定から選べる状態ということです)の関数なので、アナログ入力だけでも「1チャンネル」なのか「Nチャンネル」か、「波形」なのか「配列」なのかを選べます。

ちなみに、Nチャンネルは1チャンネルも含みます。タスクの最初の仮想チャンネルの生成の時点でいくつのチャンネル数を選んだかによって決めますが、2つ以上のチャンネルを指定する可能性がある場合には常にNチャンネルとしておけばさしあたり問題ありません。

サンプルでは、DAQmx読み取りの関数のチャンネル数入力を、DAQmxタイミングの関数のチャンネル数入力と同じ値としていることに気づくと思います。基本的にこうしておけば問題ありません。

DAQmxタイミングの関数で指定するサンプル数は、取得したデータを一時的に保存しておくバッファの大きさに関係します。

一方でDAQmx読み取りの関数に指定したサンプル数は、DAQmx読み取りの関数の出力値であるデータ値の一回のデータの個数を表わします。データそのものの種類は「波形」か「配列」ですが、「波形」でも中にはYという配列を持っており、この配列の数が指定したサンプル数となります。

つまり、波形グラフに一度に表示されるデータの点数がサンプル数ということになるので、1000と指定していた場合にグラフに表示されるデータ点数は(各チャンネルにつき)1000点、ということになります。

このDAQmx読み取りの関数はWhileループの中にあるため、停止ボタンを押されるかあるいは何らかの理由でエラーが出るまで繰り返されますが、そのループの速度はサンプル数とサンプリングレートで決まります。

なぜなら、指定したサンプル数の数だけのデータを取得するには、「サンプル数」÷「サンプリングレート」の分の時間が必要になるためです。

例えば、サンプリングレートが1 kHzだとします。これは、1秒間に1000個のデータを取る(言い換えれば1個のデータを取るのに1 ミリ秒かかる)ということになります。この設定に対し、サンプル数を5000としていた場合、この5000個のデータを得るためには5秒かかることになるので、必然的にDAQmx読み取りの関数は毎5秒ごとにデータを出力することになります。当然、Whileループ自体の周期もこれに引っ張られ、5秒程度の周期となります。

このWhileループが終わったら、タスクを停止します。Whileループに入る前に開始したものを停止する、ということですね。

その後、タスクをクリアします。プログラムを終了するので、タスクの構成に使用していたリソースを解放する感覚です。

構成し開始したものは最終的にクリアする、こうすることでタスクで使用していたリソースを解放するのはテンプレートとして覚えておくべき流れだと思います。

これで、頻繁に使われる一般的なDAQプログラムの流れはつかめたかなと思います。

さて、電圧の連続入力のサンプルを例に、DAQのプログラムでよく使用する関数についてざっと紹介してきました。

出力の方の説明は全然していませんが、使用される関数は大体かぶっていて、さしあたっての違いといえばDAQmx読み取りの関数ではなくDAQmx書き込みの関数を使用するくらいです。この辺りは、後々アナログ出力やデジタル出力個々の記事を出した際に紹介していく予定です。

もちろんDAQの関数としてはもっと多くの種類があるのですが、頻繁に使うのはこのサンプルで使用されているものたちです。あとはさらに機能を追加したり細かいカスタマイズをするための関数なので、最初から全部覚える必要は全くないと思います。まずはベースに慣れる事がとにかく大事だと思います。

次回は、上記のタスクで必須ではないけれども知っておいた方がいいタイミングとトリガの機能についてもう少し詳しく紹介していきます。

もしよろしければ次の記事も見ていってもらえると嬉しいです。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました