NI-SCOPE と戯れる (8) フェッチして連続データを取得する - 出来た

実は前回で NI-SCOPE から連続データの取得が出来たとブログに書きましたが、実は出来ていませんでした(笑) 連続データがとれていたと思っていましたが、なんだか勘違いでした。

前回の件

前回はもろもろ事情で、100MS/s 時には取得したデータをグラフに表示せず取得したデータのサイズをみて「100MS/s でとれているらしい」と判断していました。
(10MS/s, 1MS/s ではグラフ描画されているのは確認していましたが・・)

で、100MS/s データの中身は一体何が入っていたかというと、それは最初に取得したデータ。どうも最初に収録されたデータを繰り返し読んでいただけだったようです。

オフセット&トリガの考え方がが間違っていたようです・・・というかドキュメントの記述が分かりにくくて酷い。NI-SCOPE ドキュメントを読むと訳の分からない記述が多く、結果的に遠回りになってしまいました。

今回のコード

しかし今回はちゃんと出来ました。

ブロックダイアグラムはこちら、ループの下半分はデータのストレージ保存用のキューへ送っているもので、重要なものは初期化周り。

前回のコードは、トリガの設定はしませんでした→デフォルトで即時になるようです。が今回はソフトウェア基準トリガにしました。(後述)

次にフェッチ位置は「開始」ではなく「読み取りポインタ」にしました。

あとフェッチ関数は同じですが、フェッチするループ内でオフセットは何も変更しないようにしました。

変更点はこれだけです。

clip_image001

トリガについて

まずトリガは「ソフトウェア基準トリガ」を使用します。連続データ取得だから「常にデータを取得する→トリガは使用しない→即時基準」と思っていたのですが、どうも違うようです。

ドキュメントを見てみると。

clip_image002

「すぐに集録が開始されます」という一文に惑わされてしまったようです。でもこの文書見ると連続データ取得を行なうように読めませんか?

で、ソフトウェアトリガは、

clip_image003

この文書読むと、ソフトウェアトリガエッジを送信するまで集録を開始しないと読めませんか?つまり集録のタイミングはソフト実行時に決まると。

連続データ取得の場合、ソフトからトリガを送信したらタイミングがずれるから、避けますよね普通は?

しかし NI-SCOPE 的には、連続データ収集時はソフトウェア基準トリガを使用するようです。

オフセット位置

前回は NI-SCOPE ドキュメントの通り、オフセット位置==開始、オフセットをフェッチで値を設定していました。

しかし今回はオフセット位置を「読み取りポインタ」にしています。

clip_image004

これは収録したデータの先頭ポインタからデータを読む、という事でしょうから正しいと思います。

むしろドキュメントの方がなんだかしっくり来ません。

オフセットをフェッチも何も設定しません。サイクリックバッファなので「読み取りポインタ」で読み込んでおけば、常に最新のデータをフェッチできるからですよね。

前回のコードのように自分でオフセットをずらすこともなく、自然な感じがします。

フェッチ関数

フェッチ関数の「サンプル数」に、ボード上のメモリに格納されたデータを取得するサンプル数を設定します。5.12M とすると 5,120,000サンプルがホストに取り込まれます。

1秒間に 20 回フェッチすると、100MS/s のデータを取り込むことが出来ますね。

タイムアウトは 0 以外を設定しておかないと、ボード上のメモリに格納されているデータが指定したサンプル数以下でもデータ取得してしまうので、指定したサンプル数がたまるまで末必要があります。

ここでタイムアウトを 0 以上にしておくと、データがたまって取得できるまでブロックして待機します。

clip_image005

動作確認

まずサンプリングレートを 100M/s にして、1回のフェッチで取得するサンプル数を 5.12M にしておきます。

1回で約5M なので 20回フェッチすれば、1回の(1秒間の) データをすべてボードから取得できることになります。

と言うことはループは、50ms で回っていればよろしいと言うことになります。

で、実行したのが以下の図。ループ時間が 50~51ms ですからデータ取得のループは間に合っているようです。

clip_image006

以下がストレージに保存したデータの内容です。

1回に 1k サンプル分グラフに表示しています。右端と左端の波形がつながっているので、ちゃんとデータが保存されていると思います。

(ちゃんと確認するには PN9 などのビット列を送信する必要あり)

clip_image007

と言うわけで、ちゃんと 100MS/s 連続データ収集が出来ました。

一体ドキュメントはなんだったのか・・・

反省??

今回 NI-SCOPE を色々と試してきましたが、これは、

  • 「サンプルのコピペ」はしたくない
  • ちゃんとドキュメントを読んで理解したい

という思いがあって行なってきました。

今まで LabVIEW で色々コードを動かしてきましたが、

あまり深く考えずサンプルで動いていたらそれをコピペしてしまえば良いじゃんか
時間ないし

という手抜き&正しく理解しないまま進めてきてしまったので、こういう事はもうやめにしたかったのです。しかし今回正しく理解しようと試みてきましたが、結果的にはどうなんでしょう、正しく理解出来たのでしょうか?

WDT (波形) は理解できましたし、データログもある程度理解できました。

しかし NI-SCOPE のトリガ挙動などは今回試した範囲では、すんなりと理解できたとは思えず、今もよく分からないままのところが多くあります。

開発は、トライ&エラーで進んでいく事も多くあり、その中で学んでいくこともあります。でもドキュメントを読めば読むほど、実体との乖離(コードの挙動)が広まって行ってしまった・・・というのが正直なところです。

私の能力がないからでしょうか。

それももちろんあると思いますが(笑)、「デベロッパでなくても理解できるように、あえてジャーゴンを使わない言葉遣い」→「ドキュメントの日本語の不適切な用語への翻訳」、言葉の足りなさ、等々も多く問題としてあると思われます。

コメント