LabVIEW Real-Timeでデータを監視および記録する

更新しました Apr 18, 2024

環境

ソフトウェア

  • LabVIEW
  • LabVIEW Real-Time Module

このチュートリアルは、チュートリアルLabVIEW Real-Timeで最初の測定を行う(データロギング)で学習した内容を前提にしています。
このチュートリアルでは、リアルタイム ターゲット上のローカルディスクにデータを記録する方法を学習します。これは、多くのスタンドアロン アプリケーションで必要なタスクです。このチュートリアルではCompactRIOをリアルタイムターゲットとして使用しますが、説明されている方法はすべてのNIリアルタイムターゲットに適用することができます。

最初の測定を行うためのチュートリアルではプロジェクトを作成するための基本的なタスクの多くを説明しているため、本チュートリアルを実行する前に最初のチュートリアルを確認してください。 サンプルコードはここからダウンロードできます

データログをLabVIEW Real-Timeプロジェクトに追加する

  1. 最初のチュートリアルLabVIEWリアルタイムで最初の測定を行う(データロギング) から完成したソリューションを開くか、このページから.zipファイルをダウンロードします。ダブルクリックしてReal-Time Evaluation.lvprojを開きます。
  2. デフォルトのプロジェクト ツリーにはマイ コンピューターが含まれており、現在開発を進めようとしているWindows マシン上で実行されるコードを作成できます。リアルタイム ターゲットには、リアルタイム OS を実行するプロセッサが搭載されているため、実質的には別のコンピュータであることに注意してください。 RT.vi は、リアルタイム ターゲット上で実行されるコードです。評価ソフトウェアでNI-RIOドライバをインストールしたため、このプロジェクトに保存されたターゲットは、 cRIO-9068シャーシとして示されるリアルタイムCompactRIOターゲットになります。開発用コンピュータと同じネットワーク上でターゲットを適切に構成したら、有効な IP アドレスを入力してターゲットと通信します。
2024-04-18_15h48_46.png
  1. ダブルクリックしてRT.viを開き、 <Ctrl-E>を押してブロックダイアグラムを開きます。 VI は 2 つのウィンドウで構成されます。ユーザー インターフェイスとして機能する灰色のフロント パネルと、コードを開発する白色のブロックダイアグラムです。これまでに完成したコードは、優先度の高いタイミングループでデータを取得し、バッファに保存し、それをより優先度の低いループに時間確定性を持った状態で転送してユーザーインターフェイスに表示します。このチュートリアルでは、ユーザー インターフェイスへの表示に加えて、リアルタイム ターゲットのデータのローカルへのログ記録についても説明します。以下のスクリーンショットでは、最初のチュートリアル の最後の状態にエラー処理とコメントが追加されています。組み込みプロセッサでは安全なシャットダウンを確保するために、エラーの伝播は特に重要です。
2024-04-18_15h54_00.png

優先度の高い DAQ (データ取得の処理)をデータの表示やログといった処理から分離することがベスト プラクティスです。これによりジッターが最小限に抑えられ、タイミングループが「リアルタイム」のパフォーマンスを発揮できるようになり、常に時間どおりに終了します。タスクを個別のループで個別の速度で実行することにより、各タスクを必要な回数だけ実行することで CPU 効率を最大化できます。低優先度のループでは、シェア変数バッファからデータを取得して、ユーザーインターフェイスに表示するだけでなく、ディスクにデータをログします。

  1. TDMSを開くを初期化シーケンスストラクチャに配置します(関数パレットを検索するか、空白スペースを右クリックして関数パレットを表示し、プログラミング>>ファイルI/O>>TDMストリーミング>>TDMSを開くに移動します)。 NI TDMS ファイル形式 を使用すると、データをグループとチャネルに編成できます。
  1. ファイルパス入力端子を右クリックし、作成>>定数を選択します。ファイルパスを/c/test1.txtとして入力します。これは、NI Linux RTOS を実行する cRIO-9068 に対して適切な構文です。 VxWorks や Phar Lap ETS などの別の RTOS を実行しているターゲットの場合は、c:\test1.txtと入力します。LabVIEWはそれを正しい構文に強制します。操作入力用に別の定数を作成し、値としてcreate or replaceを選択します。

注意: ファイル パスを U: ドライブとして入力して、接続された USB または SD カード ストレージに書き込むこともできます。

  1. データバッファ変数からのエラー出力TDMSを開くエラー入力端子に配線します。次に、以下に示すように、エラー出力tdms ファイル出力をシーケンス構造を通じて While ループの境界に配線します。
  1. エラーワイヤを分岐させ、タイミングループのエラー入力にも配線することで、両方のループにエラーを伝播します。
  1. 作成したばかりのファイルに書き込むには、 TDMS 書き込み (プログラミング>>ファイル I/O>>TDM ストリーミング>>TDMS 書き込み)のインスタンスを While ループ内に配置し、エラー入力とファイルリファレンス入力を適切に配線します。
  1. 最初のチャンネルからファイルにデータを書き込むには、部分配列 (プログラミング>>配列>>部分配列)を配置します。データ バッファーのシェア変数から配列入力にワイヤーを分岐します。指標長さの入力を右クリックし、作成>>定数を選択します。最初のチャネルのインデックスは0 、長さは1です。次に、部分配列出力をTDMS書き込みデータ入力に配線します。
  1. ブロックダイアグラム上の停止制御器の隣にOr (プログラミング>>ブール>>Or ) を配置します。次に、以下に示すように、 TDMS書き込みエラー出力端子からの分岐を1つの入力に配線し、停止ボタンからのワイヤをもう1つの入力に配線します。これにより、ボタンが押されたら、またはエラーが発生した場合にプログラムが停止することが保証されます。
  1. 右側の While ループの外側にTDMSを閉じる (プログラミング>>ファイル I/O>>TDM ストリーミング>>TDMSを閉じる) を配置して、ディスク上のリファレンスとファイルが適切に閉じられるようにします。そのためにエラー入力とファイルリファレンスの入力へ配線します。
  1. 最後に、While ループの左端にある各エラートンネルとファイルリファレンスのトンネルを右クリックし、ドロップダウンメニューからシフト レジスタに置換を選択します。シフト レジスタにより、あるループ反復から次のループ反復へのデータの受け渡しが可能になります。 LabVIEWは、右クリックしたトンネルをシフトレジスタ端子に置き換え、カーソルがシフトレジスタアイコン( )になります。ループの反対側にあるトンネルの上にマウスを移動して点滅させ、トンネルをクリックしてシフト レジスタに置き換えます。
  1. ここまでの内容を完了すると、While ループは以下のようになっているはずです。
  1. 最後に、データに意味のあるグループ名とチャネル名を追加して、ブロックダイアグラムの配線を完了します。 TDMS書き込みグループ名入力チャンネル名入力を右クリックし作成>>定数を選びます。以下に例を示します。
 

これで、基本的なデータ取得、分析、ロギングアプリケーションが完了しました。 CompactRIO ハードウェアに接続すると、ターゲット上でコードを実行できます。

 

I/O に適したプログラミング方法の選択

I/OモジュールのFPGAへのアクセスに加えて、新しいNI組込みデバイスでFPGAプログラミングと他のプログラミングアプローチとを組み合わせることも可能です。 NI-DAQmx を搭載した CompactRIO は、CompactRIO コントローラファミリーに新たに追加された製品です。 NI-DAQmxの使いやすさとLabVIEW FPGAの低レベル機能を組み合わせることで、2つのソフトウェアエクスペリエンスを1つに統合します。 信号調整や高精度A/Dコンバーターを内蔵したモジュール式I/Oである100種以上のCシリーズモジュールで任意のバスの任意のセンサーに接続することができます。