通常、DAQmxを使用したデータ収集プログラミングは以下の手順になります。
テキストベースのプログラミング環境におけるデータ収集は、LabVIEWを使用したNI-DAQmxプログラミングと非常に似ています。これは、関数の呼び出し方法がNI-DAQmx VIと同じであるためです。
DAQmxには、データ収集プログラミングに必要なAPIが付属しています。DAQmx APIは、すべてのデータ収集操作の実行方法に関連する関数を含むライブラリセットです。これらのAPIには、LabWindows/CVI、C、C++、Visual Basic 6.0、VB.NET、C#のサポートも含まれます。
DAQmx APIはDAQmxドライバと一緒にインストールされ、以下のリファレンスマニュアルが含まれています。
これらの各APIには、関数およびクラスのライブラリを使用して、NIデータ収集 (DAQ) デバイスに対する通信と制御を行う方法に関する詳細情報が含まれています。
仮想チャンネルとは、名前、物理チャンネル、入力端子接続、計測や生成の種類などの設定の集合であり、スケール情報を含む場合もあります。
タスクとは、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, //外部クロックの予測レートまたは内部クロックの実際のレート
SampleClockActiveEdge.Rising, //ティックの立ち上がりまたは立ち下がりエッジで収集
SampleQuantityMode.ContinuousSamples, //連続または有限ンサンプル
1000 //収集する有限サンプルの数、または連続の場合はバッファサイズに使用される
);
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();
これがどのように機能するかをわかりやすく示している例については、このドキュメントに後述されているサンプルコードをご覧ください。
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を呼び出す前の状態に戻し、タスクで予約したすべてのリソースを解放します。タスクの再作成や再ロードなしで、一度クリアしたタスクを使用することはできません。
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クラスライブラリが含まれている必要があることに注意してください。
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ドライバをインストールし、C言語または.NETのサポートを選択すると、ヘルプへのショートカットがスタートメニューのプログラム→National Instruments→NI-DAQ→テキストベースコードサポートに表示されます。
NI-DAQmxの詳細に関するその他のドキュメントは、NI-DAQmxヘルプに用意されています。プログラム→National Instruments→NI-DAQを選択してください。