LabVIEWでデータ測定用のハードウェア(DAQ)を扱おうという初心者の方に向けて、道しるべになるような情報を発信していこうという試みです。
シリーズ4回目としてタスクの中の要素であるタイミングやトリガの機能についてもう少し詳しく紹介していきます。
この記事は、以下のような方に向けて書いています。
- DAQmxのタイミングとトリガの設定について知りたい
- 入力と出力での違いは?
もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。
なお、前回の記事はこちらです。
必須ではないけれどよく使う要素:タイミングとトリガ
前回の記事でDAQのプログラムの基本的な流れにそってよく使用される関数を紹介しました。
今回はその中でもタスクとして構成する要素の一部であるタイミングとトリガの話についてもう少し詳しく紹介していきます。
実は、DAQのプログラムを組むうえで、これらタイミングやトリガの構成は必須ではありません。タスクとして構成するのに最低限必要なのは、どのハードウェアのどのチャンネルを使用するか(そしてそのチャンネルで何を測るか)というチャンネル設定だけです。
タイミングの設定がなくても上の図のようにソフトウェアタイミングとして動作しますし、トリガがなくてもタスクを開始の関数が実行されることでプログラムが測定を開始してくれます(裏で開始トリガが動いているようですが)。
その意味で今回の記事の二つは必須項目ではないのですが、せっかくDAQを使用してLabVIEWを使用してハードウェアの操作をカスタマイズする以上、なんやかんやこれらの項目は頻繁に使用されます。
また、測定に限らず信号出力のときにもこれらの機能をタスクに組み入れることがあるため、どんなときに使用できるか、次回以降でアナログ入出力やデジタル入出力それぞれの特有の話に入る前に整理したいと思います。
DAQmxタイミング
入力
ハードウェア操作のタイミングを決めるために使用するのがDAQmxタイミングの関数です。この関数では前回紹介したようにサンプリングレートを決めています。
測定(入力)について言えば、500であれば1秒に500個のデータを取る、2000であれば1秒間に2000個のデータを取るといった意味になります。
サンプリングレートが大きいほど、一点一点のデータ間隔が短くなるので、元の波形をより正確に再現するためには大きくします。
ただしもちろん、ハードウェアによってサンプリングレートの限界はあるのでそれを超えるサンプリングレートは設定できません。プログラム上で指定はできても、実行するとエラーになります。
なお、これはシミュレーションデバイスであっても同様で、かつシミュレーションデバイスで構成、使用したデバイス毎にエラーが出るレートやエラーの内容もちゃんと異なります。
また、サンプリングレートはハードウェアによっては任意の値が取れないという話も前回しました。例えば、NI 9234(NI MAXのシミュレーションデバイスで構成できます)を指定して1000と指定して実行すると実際には1652となります。
NI 9234のマニュアルを見ると、サンプリングレートはデータレートというところで確認でき、とびとびの値しかとれないことが記載されています。
なぜとびとびの値しか取れないかは「そういうADC(アナログデジタル変換器)を使っているから」という理由なのですが、詳しく知りたい方はNational Instruments社の出している資料を参考にされてみてください。
DAQmxタイミングの関数の入力はサンプルレートだけではありません。
入力値の一つであるサンプリングクロックソースとは、そのハードウェアがデータを取得するタイミングを決める「サンプリングクロック」はどれを使用するか?という指定になっています。
何も入力しないとそのハードウェア(もしくはcompactDAQのシャーシなど)が持っているクロックを使用しますが、外部からの信号を取り入れて、その信号をクロックとして取り込むことができます。ただしこの場合であってもそのハードウェア自身が出せる最高のサンプリングレート速度を超えることはできません。
外部からの信号を取り入れるための端子が必要になるわけですが、モジュールやあるいはシャーシについている場合があります。以下の図では、cDAQ9178というシャーシにPFIという端子がついているのでここから外部信号をクロックソースとして取り入れる際の例を表わしています。
サンプリングモードは、連続か有限かあるいはハードウェアタイミングシングルポイントかを決めます。大雑把には、ループと使用して停止ボタンを押すあるいは何らかの上限を満たすなど、あらかじめ最終的なデータの数が決まらない場合には連続、指定の個数のデータだけ欲しいのであれば有限を選びます(ハードウェアタイミングシングルポイントはその名の通りハードウェアのタイミングで1点ずつデータを取るもので今回は割愛)。
有限であっても、あらかじめ決めたサンプル数と一致するのであればForループとともに使用するといった使い方もできます。
例えば以下では、有限のサンプリングモードで10000のデータを必要とする時に一度に読み取るデータ(これはグラフに表示されるデータ数に相当)を1000とすると、Forループが10回回ることで指定の10000データが得られるのでこれでプログラムはエラーなく動きますが、これよりForループが一度でも多く回るとエラーが起きます。
サンプル数の指定は、このサンプリングモードが連続か有限かで役割が異なります。
有限の方は、既に出てきたように、この部分の指定で最終的にいくつのデータを取得するかを指定します。
モードが連続の場合には、このサンプル数の指定によりバッファの大きさが決まるという説明がされているのですが、大雑把に1チャンネルにつきどの程度のデータを毎回取得しておくかの目安と考えておけば特に問題ありません。一番トラブルになりにくいのは、前回の記事でも紹介した通りDAQmx読み取りの関数へのチャンネル数入力と一致させることです。
DAQmx読み取りから出力されるデータは、常にこのサンプル数の値と一致していました。これをDAQmxタイミングでも指定する、ということになります。
なお、DAQmx読み取りの関数のサンプル数入力に何も配線しないと、その時点で読み取れるデータを全て読み取る、という状態になります。
しかしこれではDAQmx読み取りの関数が実行されるタイミングにより得られるデータの数がまちまちになるため期待した表示とはならないことがあるので注意が必要です。
出力
信号出力時のDAQmxタイミングの関数も、タイミングを決めるという意味では同じです。
サンプリングレート、という言葉はいかにも「データを取っている」というニュアンスがあるのですが、何かの資料に書いてあったアップデートレートという言葉が個人的にはしっくりきます。
DAQのプログラムとして信号を出力する場合には、どんな値(電圧値)をハードウェアから出したいかを事細かに指定する必要があります。
例えば、最初は0 V、次に0.1 Vを出して、その次は0.2 Vを出して、ということを指定する必要があります。
実際はこれらの値(0や0.1や0.2)をまとめた配列データ用意して出力用の関数に渡すのですが、この「次に~を出して」という、値と値の間の時間がアップデートレート(DAQmxタイミングの関数的にはあくまで「サンプリングレート」という名前ですが)になります。
連続サンプルの場合、DAQmx書き込みの関数に渡したデータが全部終わると、(デフォルトのモードでは)同じデータを自動的に繰り返します。自動的に繰り返さないモードなんかもあります。
一方で、有限サンプルの場合には書き込んだデータが終わると出力が終わります。
そのため、このアップデートレート次第では望みの信号を出力できない可能性があるので注意が必要です。この辺りはまたアナログ出力の記事を扱うときにもう少し紹介していきます。
なお、DAQmxタイミング関数のサンプル数入力については、サンプルプログラムでもそうなのですが、特に設定をしなくても、出力用の関数に渡すデータの数で自動的にバッファサイズが決定されるようです。
ただし、有限サンプルの場合には、DAQmxタイミングの関数へサンプル数を明示的に指定してバッファを設けるような書き方をします。
また、サンプリングクロックの考え方は入力と同様、外部のクロックソースを受け付けることもできます。
ここら辺の話はまたアナログ出力のプログラムについての記事で触れていこうと思います。
DAQmxタイミングについては以上のことを知っていれば基本的な使用で困ることはないと思います。
トリガの設定
入力
次に取り上げるのはトリガの設定です。もしトリガの設定をしない場合には、DAQmxタスクを開始の関数が実行された後に、裏で開始トリガが実行される状態になるようです。そんな裏で行われていることを明示的に指定するのであればトリガの指定が必要です。
なお、トリガに関してはシミュレーションデバイスでは設定が効きません。設定をしたとしてもそのトリガは無視されます。
また、以下に示すイメージはデジタルのトリガを想定していますが、アナログのトリガも基本的には同様です。
開始トリガはその名の通り開始のタイミングを決めます。このトリガを受けてからサンプリングを始めます。イメージとしては下の図のような感じです。一度開始トリガを受け取ると、その後にトリガがきたとしても何も関係ありません。
一時停止トリガもその名の通り一時停止を行うためのトリガです。「一時」というからには再開することもあるはずで、これは条件を満たしたら停止、満たさなくなったら再開という形になります。
なのでデータの取得の仕方は以下のようなイメージです(立ち上がりで停止の場合)。
基準トリガは名前が分かりにくいですが、トリガの前後でデータをとりたい場合に使用します。何かの基準(となる信号)の前にもデータをある程度取っておきたいという場合に使用します。
プログラムでは、プレトリガ、つまりトリガが来る前にどの程度のデータが欲しいかの数と、全体のデータ数を指定します。全体とはこの場合、プレトリガとポストトリガ、つまりトリガ前後のデータの合計です。プレトリガもポストトリガどちらも最低データ数2は指定する必要があります。
基準トリガの前後では決まったデータ数サンプリングするため、トリガ後は指定のサンプリングを行った後は停止する必要があります。そのためDAQmxのサンプリングモードが連続では使用できないのは以前紹介したとおりです。
もう一つ、これらとは別に開始時間トリガというものもあります。
これは、その名の通り時間を指定してその時間になったら測定を開始するというトリガになります。サンプルを見てもわかるように、時間(タイムスタンプ)を手動で決めたり、プログラム的に時刻を取得して、プログラム実行後10秒後など決まった時間経過後に開始、なんてことができます。
これは、一時停止や基準トリガのような使い方ではなく開始のタイミングに対するトリガになります。
出力
トリガの仕様自体は入力の時と同様です。
ただし、出力の場合基準トリガはありません。トリガの前後で値を出す、という概念がそもそもないからですね。
今回の記事ではタスクの要素の中でもよく登場するサンプリングの条件とトリガの条件について紹介してきました。
これらは設定しなくてもタスクとしては成り立ちハードウェアを操作することはできるのですが、特にタイミングについては結局頻繁に使用することがあると思うので、実際にハードウェアを動かしながら、あるいはシミュレーションデバイスを使いながら、慣れていければいいかなと思います。
次回以降、アナログやデジタルの入出力それぞれに特有の話について紹介していきます。
既に今までのお話でアナログ入力を例に紹介してきましたが、まだ紹介していない部分があるのでまずはアナログ入力を取り上げてみます。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいたいただきありがとうございました。
コメント