NI Linux Real-Time上で動作するNI-DAQmx Cアプリケーションを、Eclipseで開発する

更新しました Aug 16, 2022

環境

ハードウェア

  • PXI Controller

ソフトウェア

  • LabVIEW Real-Time Module

ドライバ

  • NI-DAQmx

オペレーティング・システム

  • LabVIEW Real-Time (NI Linux Real-Time)

プログラミング言語

  • C

C/C++ Development Tools for NI Linux Real-Time, Eclipse Edition (Eclipse)を使用してCアプリケーションを開発し、NI Linux Real-Time (Linux RT) 上でDAQデバイスを制御する方法を説明します。

まず事前準備として、Getting Started with C/C++ Development Tools for NI Linux Real-Time, Eclipse Edition を参考に、EclipseをPCにインストールします。インストール完了後、上記資料の Running a C/C++ Executable on Your NI Linux Real-Time Target までを手順に従って行います。ここまでの作業で、"Hello World!" が表示されるプログラムを開発、Linux RT上で実行できていることを確認します。

次からの手順で、プログラムにNI-DAQmx APIを組込み、DAQデバイスの制御コードを実装していきます。
  1. ヘッダファイルを含むフォルダを、Eclipseのプロジェクトが配置されたディレクトリへコピーします。フォルダは 
    C:\Program Files (x86)\National Instruments\Shared\ExternalCompilerSupport\C 
    にあります。パスにスペースが含まれると、Eclipseプロジェクトが正常にパスを認識できない場合があるので、注意してください。

  2. 添付のsoファイルを、Eclipseのプロジェクトが配置されたディレクトリへコピーします。
  3. プロジェクトプロパティを開きます。
  4. プロパティウィンドウ左側のメニューから、C/C++ Build 》Settingsを開きます。Cross G++ Compiler 》Includesを選択し、手順1でコピーしたヘッダファイルを含む4種類のフォルダのパスを指定します。

    Include setting

  5. 同じSettingsページから、Cross G++ Linker 》Librariesを選択し、下図のようにLibrariesとSearch Pathを記述します。

    Library setting

  6. Cross G++ Linker 》Miscellaneousを選択し、Linker Flagsを以下のように記述します。
    --sysroot=C:\build\17.0\x64\sysroots\core2-64-nilrt-linux -Wl,-allow-shlib-undefined

    Linker Flag setting

  7. 設定は以上です。コードを記述しコンパイル後に実行すると、DAQデバイスから電圧を取得できている様子が確認できます。

    Final execution result


この資料では、以下のようなサンプルコードを記述し実行しています。
#include <stdio.h>
#include <stdlib.h>
#include <NIDAQmx.h>

int main (void) {
	TaskHandle taskHandle = 0;
	int32       read;
	float64     data[1];

	// Create DAQmx Task
	DAQmxCreateTask("", &taskHandle);
	// Create DAQmx Voltage Channel, use NI 9215/ai0
	DAQmxCreateAIVoltageChan(taskHandle, "Mod3/ai0", "", DAQmx_Val_Cfg_Default, -5, 5, DAQmx_Val_Volts, NULL);

	// Start DAQmx Task
	DAQmxStartTask(taskHandle);

	// Read Voltage. This example is running at SW timing acquisition
	DAQmxReadAnalogF64(taskHandle, 1, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &read, NULL);

	// Close DAQmx Task
	DAQmxClearTask(taskHandle);

	printf("%8.4f\n", data[0]);

	return 0;
}

 

Attachments