Table of Contents
NI-DAQmxシリーズ入門では、NI-DAQmxを使用したプログラミングの基本について解説します。Measurement & Automation Explorer(MAX)を使ったデバイス操作の確認や、LabVIEWを使用したデータ集録アプリケーションのプログラミングなどの方法を説明したビデオやテキストによるチュートリアルをご覧いただけます。DAQアシスタントを使用したことのないビギナーからNI-DAQmxの高度な機能に関心を持つ上級ユーザまで、あらゆるレベルのユーザを対象としています。
概要
通常、DAQmxのデータ集録プログラミングは以下の手順になります。
- タスクと仮想チャンネルを作成する
- タイミングパラメータを構成する
- タスクを開始する
- DAQから読み取り操作を実行する
- DAQへ書き込み操作を実行する
- タスクを停止してクリアする
テキストベースのプログラミング環境におけるデータ集録は、関数の呼び出し方法がLabVIEWでのNI-DAQmxプログラミングと非常に似ています。
タスクと仮想チャンネルを作成する
仮想チャンネルとは、名前、物理チャンネル、入力端子接続、測定または生成の種類、スケール情報を含む設定の集合です。
タスクとは、NI-DAQmxの重要な概念で、タイミング、トリガ、その他のプロパティを備えた単一または複数の仮想チャンネルの集合です。概念としては、タスクは実行する測定または生成を意味しています。タスクは、アナログ入出力、デジタル入出力、カウンタ操作用に作成できます。
C言語でタスクとアナログ入力チャンネルを作成するには、以下の関数呼び出しを使用します。
|
.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 ); |
タイミングパラメータを構成する
ほとんどのナショナルインスツルメンツのデータ集録デバイスは、サンプルクロックでサンプルを集録するもしくは生成するレートを制御します。このサンプルクロックは、サンプル間の時間間隔を設定します。このクロックの各ティックごとに、各チャンネルで1つのサンプルの集録または生成を開始します。
ソフトウェアでは、サンプルレートを指定して、間隔(クロックが信号集録または信号生成を行う速度)を指定できます。また、信号に適用する信号調節、またはご使用のアプリケーションのチャンネル数で、サンプルレートを制限することもできます。
NI-DAQmxで制御されるデバイスは、「動作」を実行します。2つの典型的な動作は、サンプル生成と波形集録開始です。各NI-DAQmx動作には刺激またはきっかけが必要です。刺激が発生すると動作が実行されます。動作のきっかけは「トリガ」と呼ばれます。トリガは、集録を開始する開始トリガなど、きっかけとなる動作にちなんで名付けられています。トリガのきっかけとなる動作を指定することに加えて、使用するトリガのタイプを選択する必要があります。これにより、トリガの生成方法が決定します。
C言語でタイミングパラメータを構成するには、以下に示すとおり「DAQmxCfgSamp」関数を呼び出します。
| DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000); |
.NETでタイミングパラメータを構成するには、以下に示すとおりTask.Timingプロパティを使用します。
analogInTask.Timing.ConfigureSampleClock(
|
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書き込み」関数を指定された内容に従ってauto startと一緒に実行する場合も、この暗示的な遷移が発生します。
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アプリケーションプログラミングインタフェース(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)
それぞれのAPIには、NIデータ集録(DAQ)デバイスの通信と制御を行う関数とクラスのすべてのライブラリの使用方法に関する詳細情報が含まれます。
C言語でのDAQmxプログラミング
データ集録ボードの1つを使用してトランスデューサから電圧サンプルの有限数を集録するため、アナログ入力の電圧操作を実行すると仮定すると、ANSI Cでの典型的なコードは以下のようになります。
|
******************************************************************************** #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
// 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_ContSamp定数を使用し、同じモードを連続で設定することもできます。電圧サンプルの集録を実際に開始するには、構成されたタスクへのリファレンス付きで、以下の関数を呼び出す必要があります。
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」を呼び出す前の状態に戻し、タスクで予約したすべてのリソースを解放します。タスクの再作成や再ロードなしで、一度クリアしたタスクを使用することはできません。
.NETでのDAQmxプログラミング
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(); ******************************************************************************** |
また、プログラムを正しく実行するには、「NatioanlInstruments.DAQmx」クラスライブラリが含まれている必要があることに注意してください。
サンプルコード
NI-DAQmxは、各プログラム環境に対するサンプルのセットと一緒になっています。以下のディレクトリにはC言語のAPIを使用したサンプルがあります。
C:\Program Files\National Instruments\NI-DAQ\Examples\DAQmx ANSI C
もしくは
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
もしくは
C:\Documents and Settings\All Users\Documents\National Instruments\NI-DAQ\Examples\DotNET2.0
VBという名前のフォルダにはVisual Basic.NETのサンプルがあり、CSという名前のフォルダにはC#のサンプルがあります。
Visual Basic 6.0のサンプルは、以下のディレクトリにあります。
C:\Program Files\National Instruments\NI-DAQ\Examples\Visual Basic 6.0
もしくは
C:\Documents and Settings\All Users\Documents\National Instruments\NI-DAQ\Examples\Visual Basic 6.0
NI-DAQmxヘルプおよびAPIドキュメント
NI-DAQmxドライバをインストールする際にC言語または.NETのサポートのチェックボックスがオンになっていることを確認してインストールします。サポートファイルがインストールされると、スタートメニューのプログラム » National Instruments » NI-DAQ » NI-DAQmx C Reference HelpまたはNI-DAQmx .NET 2.0 Framework Helpからヘルプにアクセスできます。
NI-DAQmxの詳細のドキュメントは、上記のAPIドキュメントとして、同じスタートメニューフォルダの「NI-DAQmx Help」に用意されています。
Legal
This tutorial (this "tutorial") was developed by National Instruments ("NI"). Although technical support of this tutorial may be made available by National Instruments, the content in this tutorial may not be completely tested and verified, and NI does not guarantee its quality in any way or that NI will continue to support this content with each new revision of related products and drivers. THIS TUTORIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND AND SUBJECT TO CERTAIN RESTRICTIONS AS MORE SPECIFICALLY SET FORTH IN NI.COM'S TERMS OF USE (http://ni.com/legal/termsofuse/unitedstates/us/).
