テキスト​ベース​の​プログラミング​環境​で​NI-​DAQmx​を​使用​する

内容

Overview

通常、​DAQmx​を​使用​した​データ​収集​プログラミング​は​以下​の​手順​に​なり​ます。

  • タスク​と​仮想​チャンネル​を​作成​する
  • タイミング​パラメータ​を​構成​する
  • タスク​を​開始​する
  • DAQ​から​の​読み取り​操作​を​実行​する
  • DAQ​へ​の​書き込み​操作​を​実行​する
  • タスク​を​停止​し​て​クリア​する

テキスト​ベース​の​プログラミング​環境​における​データ​収集​は、​LabVIEW​を​使用​した​NI-​DAQmx​プログラミング​と​非常​に​似​てい​ます。​これ​は、​関数​の​呼び出し​方法​が​NI-​DAQmx VI​と​同じ​で​ある​ため​です。

タスク​と​仮想​チャンネル​を​作成​する

仮想​チャンネルと​は、​名前、​物理​チャンネル、​入力​端子​接続、​計測​や​生成​の​種類​など​の​設定​の​集合​で​あり、​スケール​情報​を​含む​場合​も​あり​ます。

タスクと​は、​NI-​DAQmx​の​重要​な​概念​で、​タイミング、​トリガ、​その他​の​プロパティ​を​持つ​1​つ​または​複数​の​仮想​チャンネル​の​集合​です。​概念​として​は、​タスク​は、​実行​する​計測​または​生成​を​意味​し​ます。​タスク​は、​アナログ​入出力、​デジタル​入出力、​カウンタ​操作​用​に​作成​でき​ます。

C​言語​で​タスク​と​アナログ​入力​チャンネル​を​作成​する​に​は、​以下​の​関数​呼び出し​を​使用​し​ます。

DAQmxCreateTask("", &taskHandle));

DAQmxCreateAIVoltageChan (taskHandle, "Dev1/​ai0", "Voltage", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL);

.NET​で​タスク​と​アナログ​入力​チャンネル​を​作成​する​に​は、​以下​に​示す​とおり、​タスク​オブジェクト​を​インスタンス​化​し​て​チャンネル​を​作成​し​ます。

analogInTask = new Task();
AIChannel myChannel;
myChannel = analogInTask.AIChannels.CreateVoltageChannel(
    "dev1/​ai0", //​The physical name of the channel
    "myChannel", //​The name to associate with this channel
    AITerminalConfiguration.Differential, //​Differential wiring
    -10, //​10v minimum
    10, //​10v maximum
    AIVoltageUnits.Volts //​Use volts

タイミング​パラメータ​を​構成​する

ほとんど​の​NI​の​データ​収集​デバイス​では、​サンプル​クロック​を​使用​し​て、​サンプル​の​収集​レート​と​生成​レート​を​制御​し​ます。​この​サンプル​クロック​によって、​サンプル​間​の​時間​間隔​が​設定​さ​れ​ます。​サンプル​クロック​の​ティック​ごと​に、​各​チャンネル​で​1​つ​の​サンプル​が​収集​または​生成​さ​れ​ます。

ソフトウェア​では、​サンプリング​レート​を​指定​する​こと​で​間隔 (クロック​が​信号​を​収集​または​生成​する​速度) を​指定​でき​ます。​また、​信号​に​適用​する​信号​調節、​または​ご​使用​の​アプリケーション​の​チャンネル​数​で、​サンプル​レート​を​制限​する​こと​も​でき​ます。

C​言語​で​タイミング​パラメータ​を​構成​する​に​は、​以下​に​示す​とおり、DAQmxCfgSamp関数​を​呼び出し​ます。

DAQmxCfgSampClkTiming(taskHandle, "", 10000.0, DAQmx_Val_Rising,

DAQmx_Val_FiniteSamps, 1000);

.NET​で​タイミング​パラメータ​を​構成​する​に​は、​以下​に​示す​とおり、Task.Timingプロパティ​を​使用​し​ます。

analogInTask.Timing.ConfigureSampleClock(

"/​Dev1/​PFI0", // external clock source line or use "" for internal clock

10000, // expected rate of external clock or actual rate of internal clock

SampleClockActiveEdge.Rising, // acquire on rising or falling edge of ticks

SampleQuantityMode.ContinuousSamples, // continuous or finite samples

1000 // number of finite samples to acquire or used for buffer size if continuous

);

NI-​DAQmx​が​制御​する​デバイス​が​実行​する​操作​を、​「動作」​と呼びます。​代表​的​な​動作​として、​サンプル​生成​と​波形​収集​の​開始​という​2​つ​が​挙​げ​ら​れ​ます。​各​NI-​DAQmx​動作​に​は​刺激​または​きっかけ​が​必要​です。​刺激​が​発生​すると​動作​が​実行​さ​れ​ます。​動作​の​きっかけ​は​「トリガ」​と​呼​ば​れ​ます。​トリガ​は、​収集​を​開始​する​開始​トリガ​など、​きっかけ​と​なる​動作​に​ち​なんで​名付け​ら​れ​てい​ます。

NI-​DAQmx​トリガ​関数​は、​特定​の​動作​を​実行​する​トリガ​を​構成​し​ます。​最も​一般​的​に​使用​さ​れる​動作は開始​トリガ基準​トリガです。​開始​トリガ​は​収集​や​生成​を​開始​し​ます。​基準​トリガ​は​一連​の​収集​サンプル​で​の​位置​を​確立​し​ます。​ここ​で、​プレトリガ​の​データ​が​終​わり、​ポスト​トリガ​の​データ​が​始まり​ます。​これらの​トリガ​は​どちら​も、​デジタル​エッジ​や​アナログ​エッジ​で​発生​する​よう​に、​または​アナログ​信号​が​ウィンドウ​で​入出力​さ​れ​た​とき​に​発生​する​よう​に​構成​でき​ます。

デバイス​の​PFI​ライン​0​で​受信​さ​れる​立ち上がり​デジタル​信号​の​開始​トリガ​を​構成​する​に​は、​C​言語でDAQmxCfgDigEdgeStartTrig関数​を​使用​し​ます。

DAQmxCfgDigEdgeStartTrig (taskHandle, "PFI0", DAQmx_Val_Rising);

.NET​で​開始​トリガ​を​構成​する​に​は、​以下​に​示す​とおり、Task.Triggers.StartTrigger収集でConfigureDigitalEdgeTriggerを​使用​し​ます。

DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

analogInTask.Triggers.StartTrigger.ConfigureDigitalEdgeTrigger("PFI0, triggerEdge);

 

タスク​を​開始​する

「NI-​DAQmx​タスク​を​開始」​関数​は​明示​的​に​タスク​を​実行​状態​に​遷移​し​ます。​実行​状態​で、​タスク​は​指定​さ​れ​た​収集​または​生成​を​実行​し​ます。​「NI-​DAQmx​タスク​を​開始」​関数​が​使用​さ​れ​てい​ない​状況​で​「NI-​DAQmx​読み取り」​関数​を​実行​する​場合、​タスク​は​暗示​的​に​実行​状態​に​遷移​さ​れる​か、​または​自動的​に​開始​さ​れ​ます。​また、​「NI-​DAQmx​タスク​を​開始」​関数を使用せずに、自動​開始入力​を​指定​し​て​「NI-​DAQmx​書き込み」​関数​を​実行​する​場合​も、​この​暗示​的​な​遷移​が​発生​し​ます。

C​言語​で​タスク​を​開始​する​に​は、DAQmxStartTask 関数​を​使用​し​ます。

DAQmxStartTask(taskHandle);

.NET​で​タスク​を​開始​する​に​は、Task.Start関数​を​使用​し​ます。

analogInTask.start();

 

読み取り​操作​または​書き込み​操作

NI-​DAQmx​に​は、​データ​の​読み取り​と​書き込み​用​に​複数​の​関数​が​用意​さ​れ​てい​ます。​多く​の​場合、​複数​の​オプション​を​使用​でき​ます。​読み取り​関数​と​書き込み​関数​に​は、データ​形式データ​構造の​2​つ​の​主​な​選択​条件​が​あり​ます。​データ​形式​では、​返​さ​れる​データ​の​タイプ​を​指定​し​ます。​たとえば、​カウンタ​読み取り​は​整数​または​浮動​小数点​形式​で​データ​を​返す​こと​が​でき​ます。​2​番目​の​条件​で​ある​データ​構造​は、​データ​が​返​さ​れる​ときの​ストラクチャ​を​処理​し​ます。​たとえば、​アナログ​読み取り​では、​さまざま​な​配列/​スカラ​構造​を​扱い​ます。

データ​操作​に​応​じ​て、​データ​が​収集​または​生成​さ​れ​ます。​収集​モード​の​場合、​読み取り​操作​では、​指定​さ​れ​た​サンプル​数​を​バッファ​から​読み取る​よう​に​要求​さ​れ​ます。​データ​生成​モード​の​場合、​サンプル​が​データ​収集​ボード​バッファ​に​書き​込​まれ​ます。

C​言語​で​データ​を​読み取る​に​は、DAQmxReadAnalog関数​呼び出し​を​使用​し​ます。

DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &read, NULL)'

.NET​で​データ​を​読み取る​に​は、ChannelReaderオブジェクト​を​作成​し、​それをTask.Streamに​バイ​ン​ド​し​て、​以下​に​示す​とおり​読み取り​関数​を​呼び出し​ます。

//​Create the reader and attach it to the stream
AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream);
//​Perform the read
double[] data = reader.ReadMultiSample(100);

.NET​で​の​データ​の​読み取り​と​書き込み​の​詳細​について​は、『NI-​DAQmx .NET 2.0 Framework Help』​の​「Reading and Writing with the NI-​DAQmx .NET Library」​セクション​を​参照​し​て​くだ​さい。

 

タスク​を​停止​し​て​クリア​する

タスク​の​完了​後、​タスク​を​停止​し​て、​予約​さ​れ​て​いる​すべて​の​リソース​の​割り当て​を​解除​し​ます。​「NI-​DAQmx​タスク​を​クリア」​関数​は​指定​した​タスク​を​クリア​し​ます。​タスク​が​実行​中​の​場合、​この​関数​は、​まず​タスク​を​停止​し​て​すべて​の​リソース​を​解放​し​ます。​一度​クリア​さ​れ​た​タスク​は、​再​作成​しない​限り​使用​でき​ま​せん。​したがって、​タスク​を​もう一度​使用​する​場合、​クリア​せ​ず​に​タスク​を​停止​する​ため​に​「NI-​DAQmx​タスク​を​停止」​関数​を​使用​する​必要​が​あり​ます。

C​言語​で​タスク​を​停止​し​て​クリア​する​に​は、​以下​の​関数​を​使用​し​ます。

DAQmxStopTask(taskHandle);

DAQmxClearTask(taskHandle);

.NET​で​タスク​を​停止​し​て​クリア​する​に​は、​以下​に​示す​とおりTask.StopメソッドとTask.Disposeメソッド​を​使用​し​ます。

analogInTask.Stop();

analogInTask.Dispose();

DAQmx Application Programming Interface (API)

DAQmx​は、​データ​収集​プログラミング​に​必要​な​API​が​付属​し​てい​ます。​DAQmx API​は、​すべて​の​データ​収集​操作​の​実行​方法​に​関連​する​関数​を​含む​ライブラリ​セット​です。​これらの​API​に​は、​LabWindows/​CVI、​C、​C​+​+、​Visual Basic 6.0、​VB.NET、​C#​の​サポート​も​含​まれ​ます。

DAQmx API​は​DAQmx​ドライバと一緒にインストールされ、​以下​の​リファレンス​マニュアル​が​含​まれ​てい​ます。

  • NI-​DAQmx C Reference Help
  • NI-​DAQmx C API Visual Basic 6.0 Help
  • NI-​DAQmx .NET Framework 1.1 Help (Visual Studio 2003)
  • NI-​DAQmx .NET Framework 2.0 Help (Visual Studio 2005)
  • NI-​DAQmx .NET Framework 3.5 Help (Visual Studio 2008)
  • NI-​DAQmx .NET Framework 4.0 Help (Visual Studio 2010)


​これらの​各​API​に​は、​関数​および​クラス​の​ライブラリ​を​使用​し​て、​NI​データ​収集 (DAQ) デバイス​に対する​通信​と​制御​を​行う​方法​に関する​詳細​情報​が​含​まれ​てい​ます。

DAQmx Programming in C

NI​データ​収集​ボード​を​使用​し​て​トランスデューサ​から​電圧​の​有限​サンプル​数​を​取得​する​ため​の、​アナログ​入力​の​電圧​操作​に関する​例​を​以下​に​示し​ます。

********************************************************************************

#include <stdio.h>
#include <NIDAQmx.h>
#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

int main(void)
{
       int32       error=0;
       TaskHandle  taskHandle=0;
       int32       read;
       float64     data[1000];
       char        errBuff[2048]={'\0'};

// DAQmx analog voltage channel and timing parameters

DAQmxErrChk (DAQmxCreateTask("", &taskHandle));

DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/​ai0", "", DAQmx_Val_Cfg_Default, -10.0, 10.0, DAQmx_Val_Volts, NULL));

DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", 10000.0, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, 1000));

// DAQmx Start Code

DAQmxErrChk(DAQmxStartTask(taskHandle));

// DAQmx Read Code

DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByChannel, data, 1000, &read, NULL));

// Stop and clear task

Error:
       if( DAQmxFailed(error) )
             DAQmxGetExtendedErrorInfo(errBuff,​2048);
       if( taskHandle!​=0 )  {
              DAQmxStopTask(taskHandle);
              DAQmxClearTask(taskHandle);
       }
       if( DAQmxFailed(error) )
              printf("DAQmx Error: %s​\n",errBuff);
              return 0;
}

********************************************************************************

メモ:  DAQmx​ライブラリ​へ​の​アクセス​を​取得​する​ため​に、​main.c​プログラム​の​NIDAQmx.h​ヘッダ​ファイル​を​含める​こと​が​重要​です。 

この​サンプル​プログラム​では、​この​関数​を​使用​し​て​以下​の​タスク​を​作成​し​てい​ます。

int32 DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle);

これ​により、​作成​さ​れ​た​タスク​を​参照​する​出力​を​持つ​タスク​に​名前​が​割り当て​ら​れ​ます。​この​関数​により、​以下​の​仮想​電圧​チャンネル​を​構成​し​ます。

int32 DAQmxCreateAIVoltageChan (TaskHandle taskHandle, const char physicalChannel[], const char nameToAssignToChannel[], int32 terminalConfig, float64 minVal, float64 maxVal, int32 units, const char customScaleName[]);

この​関数​呼び出し​では、​作成​さ​れ​た​タスク​へ​の​リファレンス、​物理​チャンネル​名、​仮想​チャンネル​に​割り当てる​名前、​チャンネル​の​入力​端子​構成、​計測​する​単位​の​最小​値​と​最大​値、​チャンネル​に​適用​する​カスタム​スケール​名​を​指定​し​ます。

仮想​電圧​チャンネル​の​構成​後、​サンプル​クロック​設定​の​関数​で、​サンプル​レート、​サンプル​モード、​および​読み取り​サンプル​数​を​指定​し​ます。

int32 DAQmxCfgSampClkTiming (TaskHandle taskHandle, const char source[], float64 rate, int32 activeEdge, int32 sampleMode, uInt64 sampsPerChanToAcquire);

また、​DAQmx_Val_ContSamps​定数​を​使用​し​て、​サンプル​モード​を​連続​実行​に​設定​する​こと​も​でき​ます。​電圧​サンプル​の​収集​を​実際​に​開始​する​に​は、​構成​さ​れ​た​タスク​へ​の​リファレンス​を​指定​し​て、​以下​の​関数​を​呼び出す​必要​が​あり​ます。

int32 DAQmxStartTask (TaskHandle taskHandle);

関数​呼び出し​で​示す​とおり、​DAQmxReadAnalogF64​は、​1​つ​以上​の​アナログ​入力​チャンネル​を​含む​タスク​から​複数​の​浮動​小数点​サンプル​を​読み取り​ます。

int32 DAQmxReadAnalogF64 (TaskHandle taskHandle, int32 numSampsPerChan, float64 timeout, bool32 fillMode, float64 readArray[], uInt32 arraySizeInSamps, int32 *sampsPerChanRead, bool32 *reserved);

ここ​では、​1000​サンプル​の​読み取り​と​書き込み​が、​収集​さ​れ​た​サンプル​数​と​同じ​サイズ​の​配列​に対して​行​われ​ます。

最後​に、​DAQmxStopTask​と​DAQmxClearTask​によって​タスク​を​停止​し、​その​タスク​を​DAQmxStartTask​を​呼び出す​前​の​状態​に​戻​し、​タスク​で​予約​した​すべて​の​リソース​を​解放​し​ます。​タスク​の​再​作成​や​再​ロード​なし​で、​一度​クリア​した​タスク​を​使用​する​こと​は​でき​ま​せん。

DAQmx Programming in .NET

Visual Basic​および​C#​について​は、​Microsoft .NET Framework​の​DAQmx​ライブラリ​対応​の​API​を​使用​する​こと​で、​同様​の​操作​を​実行​する​ため​の​疑似​コード​を​作成​でき​ます。​この​API​に​は、.NET​インタフェース​を​NI-​DAQmx​に​提供​する​クラス、​委譲、​列挙​体​が​含​まれ​ます。​非常​に​簡単​な​読み取り​操作​の​サンプル​コード​を​以下​に​示し​ます。

********************************************************************************

// Create a channel
   myTask.AIChannels.CreateVoltageChannel(physicalChannelComboBox.Text, "", (AITerminalConfiguration)​(-1), rangeMinimum, rangeMaximum,    AIVoltageUnits.Volts);

// Configure timing specs
   myTask.Timing.ConfigureSampleClock("", sampleRate, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, samplesPerChannel);

// Verify the task
   myTask.Control(TaskAction.Verify);

// Prepare the table for data
   InitializeDataTable(myTask.AIChannels, ref dataTable);
   acquisitionDataGrid.DataSource = dataTable;

// Read the data
   reader = new AnalogMultiChannelReader(myTask.Stream);

// clear task
   myTask.Dispose();

********************************************************************************

メモ:  プログラム​を​正しく​実行​する​に​は、​NationalInstruments.DAQmx​クラス​ライブラリ​が​含​まれ​て​いる​必要​が​ある​ことに​注意​し​て​くだ​さい。

Example Code

NI-​DAQmx​に​は、​各​プログラミング​環境​に​対応​する​一連​の​サンプル​が​付属​し​てい​ます。  以下​の​ディレクトリ​に​は​C​言語​の​API​を​使用​した​サンプル​が​あり​ます。
<Program Files>​\National Instruments​\NI-​DAQ​\Examples​\DAQmx ANSI C
​または
<Documents and Settings>​\All Users​\Documents​\National Instruments​\NI-​DAQ​\Examples​\DAQmx ANSI C

​また、.NET​の​API​の​サンプル​は​以下​の​ディレクトリ​に​あり​ます。
C:​\Program Files​\National Instruments​\MeasurementStudioVS2005\DotNET​\Examples​\DAQmx
​または
<Documents and Settings>​\All Users​\Documents​\National Instruments​\NI-​DAQ​\Examples​\DotNET2.0

VB​という​名前​の​フォルダ​に​は​Visual Basic .NET​の​サンプル​が​あり、​CS​という​名前​の​フォルダ​に​は​C#​の​サンプル​が​あり​ます。

Visual Basic 6.0​の​サンプル​は、​以下​の​ディレクトリ​に​あり​ます。
<Program Files>​\National Instruments​\NI-​DAQ​\Examples​\Visual Basic 6.0
​または
<Documents and Settings>​\All Users​\Documents​\National Instruments​\NI-​DAQ​\Examples​\Visual Basic 6.0

NI-​DAQmx Help and API Documentation

NI-​DAQmx​ドライバ​を​インストール​し、​C​言語​または.NET​の​サポート​を​選択​すると、​ヘルプ​へ​の​ショートカット​が​スタート​メニューのプログラム​→National Instruments→NI-​DAQ→​テキスト​ベース​コード​サポートに​表示​さ​れ​ます。

NI-​DAQmx​の​詳細​に関する​その他​の​ドキュメント​は、NI-​DAQmx​ヘルプに​用意​さ​れ​てい​ます。プログラム​→National Instruments→NI-​DAQを​選択​し​て​くだ​さい。