NI-​DAQmx​における​10​種類​の​関数​の​習得​および​多く​の​データ​集録​アプリケーション​に​対処​できる​処理​について

内容

NI-​DAQmx​シリーズ​入門​では、​NI-​DAQmx​を​使用​した​プログラミング​の​基本​について​解説​し​ます。​Measurement & Automation Explorer (MAX) を​使​っ​た​デバイス​操作​の​確認​や、​LabVIEW​を​使用​した​データ​収集​アプリケーション​の​プログラミング​など​の​方法​を​説明​した​ビデオ​や​テキスト​による​チュートリアル​を​ご覧​い​た​だけ​ます。​DAQ​アシスタント​を​使用​した​こと​の​ない​ビギナー​から​NI-​DAQmx​の​高度​な​機能​に​関心​を​持つ​上級​ユーザ​まで、​あらゆる​レベル​の​ユーザ​を​対象​として​い​ます。

NI-​DAQmx:​開発​時間​の​短縮​と​パフォーマンス​の​向上

NI-​DAQmx​の​リリース​以来、​NI​データ​収集​(DAQ)​ハードウェア​の​ユーザ​は、​開発​時間​の​短縮​と​データ​収集​アプリケーション​の​パフォーマンス​向上​の​両方​を​達成​する​よう​設計​さ​れ​た​多く​の​機能​を​フル​に​活用​し​てい​ます。

​開発​時間​を​大幅​に​短縮​する​機能​の​1​つ​に、​NI-​DAQmx​アプリケーション​プログラミング​インタフェース​(API)​が​あり​ます​が、​これ​は​デバイス​の​機能​と​デバイス​ファミリ​の​すべて​にわたって​同じ​です。​つまり、​マルチ​ファンクション​デバイス​の​すべて​の​機能​が​同じ​関数​セット​(アナログ​入力、​アナログ​出力、​デジタル​I/​O、​カウンタ)​を​使用​し​て​プログラム​さ​れ​て​いる​という​こと​です。​さらに、​デジタル​I/​O​デバイス​と​アナログ​出力​デバイス​の​両方​が​同じ​関数​セット​を​使用​し​で​プログラム​さ​れ​てい​ます。​これ​を​可能​にし​て​いる​の​が​LabVIEW​の​多​態​性​です。​多​態​性​VI​は、​1​つ​以上​の​入力​端子​や​出力​端子​に​複数​の​データタイプ​を​受け入れ​ます。​また、​NI-​DAQmx API​は​適用​可能​な​すべて​の​プログラミング​環境​で​一貫​し​てい​ます。​単一​の​関数​セット​の​使用​方法​を​習得​する​だけ​で、​複数​の​プログラミング​環境​で​ほとんど​の​NI​データ​収集​ハードウェア​を​プログラミング​できる​よう​に​なり​ます。

​開発​経験​を​向上​させる​NI-​DAQmx​の​もう​一つ​の​機能​が​DAQ​アシスタント​です。​この​ツール​では、​単純​な​データ​収集​タスク​と​複雑​な​データ​収集​タスク​両方​の​構成​に​対応​した​グラフィカル​インタフェース​を​介​し​て、​プログラミング​なし​で​アプリケーション​を​作成​でき​ます。​さらに、​トリガ​信号​や​クロック​信号​を​手動​で​経路​設定​しな​け​れ​ば​なら​ない​ため、​通常​は​実装​が​難しい​同期​プロセス​も、​単一​の​デバイス​の​異なる​機能​領域​間​および​複数​の​デバイス​間​で​信号​の​経路​設定​を​自動的​に​実行​する​NI-​DAQmx​を​使用​す​れ​ば​簡単​に​実行​でき​ます。

​NI-​DAQmx​を​使用​し​て​ビル​ド​した​データ​収集​アプリケーション​は、​パフォーマンス​を​最大​化​する​よう​設計​さ​れ​た​アーキテクチャ​の​利点​を​享受​でき​ます。​その​最初​の​利点​が、​不要​な​再​構成​を​排除​した​効率​的​な​状態​モデル​です。​この​オーバー​ヘッド​を​取り​除​いたこ​と​で、​構成​と​収集​の​両方​が​最適​化​さ​れ​ます。​さらに、​50kS/​s​を​上回る​シングル​ポイント​I/​O​レート​を​実現​でき​ます。​この​レベル​の​パフォーマンス​を​可能​にし​て​いる​の​が、​メモリ​マップ​ド​レジスタ​です。

​NI-​DAQmx​アーキテクチャ​の​もう​一つ​の​重要​な​機能​に、測定​の​マルチスレッド​処理が​あり​ます。​NI-​DAQmx​は​マルチスレッド​なので、​複数​の​データ​収集​操作​を​同時に​実行​でき​ます。​そのため、​複数​の​操作​を​含む​アプリケーション​の​パフォーマンス​を​大幅​に​向上​させる​こと​が​でき​ます。​また、​この​よう​な​アプリケーション​の​プログラミング​を​大幅​に​簡素​化​でき​ます。

いくつか​の​関数​を​習得​する​だけ​で、​これらの​利点​を​活用​できる​よう​に​なる​の​です。​実際、​10​個​の​NI-​DAQmx​関数​で、​データ​収集​アプリケーション​の​80%​を​解決​する​機能​を​提供​でき​ます。​この​ドキュメント​では、​これらの​関数​について、​その​機能​と​用途​の​両方​を​理解​できる​よう​詳​しく​解説​し​ます。

メモ:この​ドキュメント​全体​で​参照​さ​れ​て​いる​例​は、​この技術​サポート​データベース​の​記事で​示​さ​れ​て​いる​場所​に​あり​ます。

DAQ​アシスタント

Tools→Create/​Edit DAQmx Tasks [CVI]
Project»Add New Item»DAQmx Task [.NET]






 

DAQ​アシスタント​は、​NI-​DAQmx​仮想​チャンネル​と​タスク​を​インタラクティブ​に​作成、​編集、​実行​する​ため​の​グラフィカル​インタフェース​です。​NI-​DAQmx​仮想​チャンネル​は、​DAQ​デバイス​の​物理​チャンネル​と、​入力​レンジ​や​カスタム​スケール​といった​この​物理​チャンネル​の​構成​情報​から​なり​ます。​NI-​DAQmx​タスク​と​は、​仮想​チャンネル、​タイミング/​トリガ​情報、​収集​と​生成​に​関わる​その他​の​プロパティ​の​集まり​です。​以下​の​図​では、​DAQ​アシスタント​は​有限​歪み​測定​を​行う​よう​に​構成​さ​れ​てい​ます。

 


​以下​の​ドキュメント​では、​LabVIEW、​LabWindows/​CVI、.NET​で​の​DAQ​アシスタント​の​使用​方法​について​説明​し​てい​ます。

NI-​DAQmx Express VI​チュートリアル
LabWindows/​CVI​で​DAQ​アシスタント​を​使用​する
Measurement Studio​で​DAQ​アシスタント​を​使用​する

​DAQ​アシスタント​では、​指定​さ​れ​た​収集​または​生成​の​構成​や​実行​用​の​コード​を​生成​する​こと​も​でき​ます。​LabVIEW​で​の​この​手順​について​は、DAQ​アシスタント​の​ヘルプと「DAQ​アシスタント​で​自動的​に​LabVIEW​コード​を​生成​する」​という​ドキュメント​で​説明​し​てい​ます。​以下​の​図​は​DAQ​アシスタント​の​インスタンス​と、​その​結果​として​自動​生成​さ​れ​た​設定​と​LabVIEW​コード​の​例​を​示し​てい​ます。


​特定​の​データ​収集​アプリケーション​では、​DAQ​アシスタント​で​提供​さ​れる​より​も​高い​柔軟性​と​パフォーマンス​が​求め​ら​れ​ます。​これらの​アプリケーション​に​は、​以下​に​説明​する​シンプル​かつ​パワフル​な​NI-​DAQmx​関数​が​必要​です。

NI-​DAQmx​仮想​チャンネル​を​作成



Library»NI-​DAQmx»Channel Creation/​Configuration [CVI]

Task.Channel.CreateChannel Property [.NET]








「NI-​DAQmx​仮想​チャンネル​を​作成」​関数​は、​仮想​チャンネル​を​作成​し​て​タスク​に​追加​し​ます。​複数​の​仮想​チャンネル​を​作成​し​て、​すべて​を​1​つ​の​タスク​に​追加​する​場合​に​も​使用​でき​ます。​タスク​が​指定​さ​れ​てい​ない​場合​は、​タスク​が​作成​さ​れ​ます。​「NI-​DAQmx​仮想​チャンネル​を​作成」​関数​に​は​多数​の​インスタンス​が​あり​ます。​これらの​インスタンス​は、​仮想​チャンネル​が​実行​する​特定​の​タイプ​の​測定​または​生成​に​対応​し​てい​ます。

LabVIEW​で​チャンネル​を​作成​する

以下​の​図​は、​「NI-​DAQmx​仮想​チャンネル​を​作成」​VI​の​異なる​インスタンス​の​4​つ​の​例​を​示し​てい​ます。


​「NI-​DAQmx​仮想​チャンネル​を​作成」​関数​へ​の​入力​は、​関数​の​インスタンス​ごと​に​異​なり​ます。​ただし、​すべて​では​ありま​せん​が、​関数​の​ほとんど​の​インスタンス​で​共通​する​入力​が​あり​ます。​たとえば、​仮想​チャンネル​が​使用​する物理​チャンネル(アナログ​入力​と​アナログ​出力)、ライン(デジタル)、​またはカウンタを​指定​する​に​は​入力​が​必要​です。​また、​アナログ​入力、​アナログ​出力、​および​カウンタ​操作​では、最小値最大値の​入力​を​使用​し​て、​信号​の​最小​期待​値​と​最大​期待​値​に​基​づ​い​て​測定​および​生成​を​構成​し、​最適​化​し​ます。​さらに、​多く​の​タイプ​の​仮想​チャネル​にはカスタム​スケールを​適用​でき​ます。​以下​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​「NI-​DAQmx​仮想​チャンネル​を​作成」​VI​を​使用​し​て​熱電​対​仮想​チャネル​を​作成​し​てい​ます。

 

.NET​で​チャンネル​を​作成​する

NI-​DAQmx .NET​ライブラリ​の​ほとんど​の​クラス​は、​直接​インスタンス​化​でき​ま​せん。​これらの​クラス​は、​クラス​の​サブ​オブジェクト​として​使用​さ​れ​ます。

これらの​クラス​に​は、​特定​タイプ​の​チャンネル​に​固有​の​プロパティ​が​含​まれ​てい​ます。​たとえば、カウントのようなプロパティはカウンタにのみ適用され、CIChannelクラスとCOChannelクラス​で​のみ​使用​でき​ます。​以下​の​タイプ​の​チャンネル​は、​NI-​DAQmx .NET​クラス​ライブラリ​の​以下​の​クラス​に​関連付ける​こと​が​でき​ます。

アナログ​入力​チャンネル​―AIChannel​クラス

アナログ​出力​チャンネル​―​AOChannel​クラス

デジタル​入力​チャンネル​―DIChannel​クラス

デジタル​出力​チャンネル​―DOChannel​クラス

カウンタ​入力​チャンネル​―​CIChannel​クラス

カウンタ​出力​チャンネル​―​COChannel​クラス

Taskクラス​に​は、​6​種類​の​各​タイプ​の​チャンネル​(AIChannels、​AOChannels、​DIChannels、​DOChannels、​CIChannels、​COChannels)​に​対応​する​チャンネル​の​集合​の​プロパティ​が​あり​ます。​チャンネル​を​作成​する​に​は、​チャンネル​の​集合​に​ある​多数​の​チャンネル​作成​メソッド​の​1​つ​を​使用​でき​ます。

新しい​Task​オブジェクト​の​インスタンス​化​後、​Channel​クラス​の​適切​な​メンバー​関数​を​呼び出し​て、​AIChannel​オブジェクト​の​作成​と​割り当て​が​行​われ​ます。​次​の​スニペット​は、​単純​な​アナログ​入力​電圧​チャンネル​を​作成​し​ます。

analogInTask = new Task();

AIChannel myChannel;

myChannel = analogInTask.AIChannels.CreateVoltageChannel(

    "dev1/​ai1", //​チャンネル​の​物理名

    "myChannel", //​この​チャンネル​と​関連付ける​名前

    AITerminalConfiguration.Differential, //​差動​配線

    -10, //​最小​値-10v

    10, //​最大​値​10v

    AIVoltageUnits.Volts //​ボルト​を​使用
);

 

C/​C​+​+で​タスク​を​作成​する

タスク​を​作成​する​に​は​「DAQmxCreateTask()」​関数​を、​アナログ​入力​電圧​チャンネル​を​作成​する​に​は​「DAQmxCreateAIVoltageChan()」​関数​を​使用​し​ます。​異なる​測定​タイプ​の​チャンネル​の​作成​について​は、​「NI-​DAQmx C Reference Help」​を​参照​し​て​くだ​さい。​以下​の​スニペット​では、​2​つ​の​関数​の​使い方​を​示し​ます。

TaskHandle  taskHandle=0;
char        chan[256] = "Dev1/​ai0";
float64     min = -10, max = 10;

DAQmxCreateTask("",&taskHandle);

DAQmxCreateAIVoltageChan(taskHandle ,chan ,"", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

 

参考​と​なる​サンプル:

LabVIEW デジタル​―Finite Output.vi
熱電​対​―Continuous Input.vi
CVI Write Dig Port
Cont Thrmcpl Samples-​Int Clk
.NET WriteDigPort
ContAcqThermocoupleSamples_IntClk

 

NI-​DAQmx​トリガ


Library»NI-​DAQmx»Triggering [CVI]

Task.Triggers Property [.NET]

 

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

LabVIEW​で​トリガ​を​作成​する

以下​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​「NI-​DAQmx​トリガ」​VI​を​使用​し​て、​開始​トリガ​と​基準​トリガ​の​両方​が​アナログ​入力​操作​の​デジタル​エッジ​で​発生​する​よう​に​構成​さ​れ​てい​ます。


​多く​の​データ​収集​アプリケーション​では、​単一​デバイス​の​異なる​機能​領域​(アナログ​出力​や​カウンタ​など)​の​同期​が​必要​です。​複数​の​デバイス​の​同期​が​必要​な​もの​も​あり​ます。​この​同期​を​達成​する​に​は、​単一​デバイス​の​異なる​機能​領域​間​および​複数​の​デバイス​間​で​トリガ​信号​を​経路​設定​する​必要​が​あり​ます。​NI-​DAQmx​は​自動的​に​この​経路​設定​を​実行​し​ます。​「NI-​DAQmx​トリガ」​関数​を​使用​する​場合、​有効​な​すべて​の​トリガ​信号​を​関数​へのソース入力​として​使用​でき​ます。​たとえば、​次​の​「NI-​DAQmx​トリガ」​VI​では、​明示​的​な​経路​設定​を​実行​し​なく​て​も、​デバイス​2​の​開始​トリガ​信号​を​デバイス​1​の​開始​トリガ​の​ソース​として​使用​でき​ます。

 

.NET​で​トリガ​を​作成​する

Task​オブジェクト​と​Channel​オブジェクト​の​作成​後、​Task.Triggers​コレクション​内​の​メソッド​を​呼び出す​こと​で、​タスク​に​トリガ​を​追加​でき​ます。​以下​の​コードスニペット​は、​デジタル​エッジ​開始​トリガ​を​作成​し​ます。

analogInTask = new Task();

DigitalEdgeStartTriggerEdge triggerEdge = DigitalEdgeStartTriggerEdge.Rising;

analogInTask.AIChannels.CreateVoltageChannel( ... );

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

デバイス​は、​「ConfigureDigitalEdgeTrigger」​関数​に​送​ら​れ​た​パラメータ​に​基​づ​い​て、​データ​の​収集​を​開始​する​前​に、​内部​または​外部​ライン​で​立ち上がり​または​立ち​下がり​デジタル​エッジ​を​探​し​ます。​上の​スニペット​は、​PFI 0​で​立ち上がり​デジタル​エッジ​トリガ​を​探す​よう​に​デバイス​を​設定​し​ます。

 

C/​C​+​+で​トリガ​を​作成​する

「DAQmxCfgDigEdgeStartTrig()」​関数​を​使用​し​て、​デジタル​エッジ​開始​トリガ​を​作成​し​ます。​異なる​トリガ​の​作成​について​は、​「NI-​DAQmx C Reference Help」​を​参照​し​て​くだ​さい。​以下​は、​PFI0​で受信され、​その​ライン​で​立ち上がり​エッジ​を​探す​デジタル​開始​トリガ​を​作成​する​関数​の​使用​方法​を​示す​スニペット​です。

char        startTrigger[256] = "Dev1/​PFI0";
int         startEdge = 0; //​立ち上がり​エッジ

DAQmxCreateTask("",&taskHandle));

DAQmxCreateAIVoltageChan(taskHandle, chan, "", DAQmx_Val_Cfg_Default, min, max, DAQmx_Val_Volts, NULL);

DAQmxCfgDigEdgeStartTrig(taskHandle, startTrigger, startEdge);
 

 

NI-​DAQmx​の​タイミング​と​同期​の​特性」​ドキュメント​に​は、​NI-​DAQmx​で​同期​を​実行​する​「NI-​DAQmx​トリガ」​関数​の​使用​に関する​追加​情報​が​記載​さ​れ​てい​ます。

参考​と​なる​サンプル:

LabVIEW 電圧​―Finite Input.vi
電圧​―Continuous Input.vi
CVI Acq-​Int Clk-​Dig Start​&​Ref
Cont Acq-​Int Clk-​Anlg Start
.NET AcqVoltageSamples_IntClkDigStartAndRef
ContAcqVoltageSamples_IntClkAnalogStart

NI-​DAQmx​タイミング


Library»NI-​DAQmx»Timing [CVI]

Task.Timing Property [.NET]







​「NI-​DAQmx​タイミング」​関数​は、​ハードウェア​タイミング​の​データ​収集​操作​の​タイミング​を​構成​し​ます。​これ​に​は、​連続​操作​または​有限​操作​の​指定、​有限​操作​で​収集​または​生成​する​サンプル​数​の​選択、​必要​に​応​じ​た​バッファ​作成​が​含​まれ​ます。

​サンプル​タイミング​を​必要​と​する​操作​(アナログ​入力、​アナログ​出力、​カウンタ)​の​場合、​「NI-​DAQmx​タイミング」​関数のサンプル​クロックインスタンス​が、​サンプル​クロック​の​ソース​(内部​または​外部​ソース)​と​レート​の​両方​を​設定​し​ます。​サンプル​クロック​は、​サンプル​の​収集​レート​または​生成​レート​を​制御​し​ます。​各​クロックパルス​は、​タスク​に​含​ま​れる​仮想​チャンネル​ごと​に​1​つ​の​サンプル​の​収集​または​生成​を​開始​し​ます。

 

LabVIEW​で​タスク​タイミング​を​構成​する


​以下​の​LabVIEW​ブロック​ダイ​ア​グラム​は、​「NI-​DAQmx​タイミング」​VI​の​サンプル​クロック​インスタンス​を​使用​し​て、​外部​サンプル​クロック​による​連続​アナログ​出力​生成​を​構成​する​方法​を​示し​てい​ます。


​データ​収集​アプリケーション​で​同期​を​実現​する​に​は、​トリガ​信号​を​単一​デバイス​の​異なる​機能​領域​間​および​複数​デバイス​間​で​経路​設定​する​必要​が​あり​ます​が、​タイミング​信号​も​同じ​よう​に​経路​設定​する​必要​が​あり​ます。​NI-​DAQmx​は​この​経路​設定​も​自動的​に​行い​ます。​「NI-​DAQmx​タイミング」​関数のソース入力​として、​すべて​の​有効​な​タイミング​信号​を​使用​でき​ます。​たとえば、​以下​の​「DAQmx​タイミング」​VI​では、​明示的な経路設定を行わずに、​デバイス​の​アナログ​出力​サンプル​クロック​信号​を​アナログ​入力​チャンネル​の​サンプル​クロック​の​ソース​として​利用​でき​ます。


NI-​DAQmx​の​タイミング​と​同期​の​特性」​ドキュメント​に​は、​NI-​DAQmx​で​同期​を​実行​する​「NI-​DAQmx​タイミング」​関数​の​使用​に関する​追加​情報​が​記載​さ​れ​てい​ます。

​ほとんど​の​カウンタ​操作​では、​測定​さ​れる​信号​が​タイミング​を​提供​する​ため、​サンプル​タイミング​は​必要​ありま​せん。​これらの​アプリケーション​では、​「NI-​DAQmx​タイミング」​関数の指定​なしインスタンス​を​使用​する​必要​が​あり​ます。​以下​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​「NI-​DAQmx​タイミング」​VI​の​指定​なし​インスタンス​を​使用​し​て、​指定​さ​れ​た​サンプル​数​で​有限​と​なる​よう​に​バッファ​さ​れ​た​パルス​幅​収集​を​設定​し​てい​ます。


.NET​で​タスク​タイミング​を​構成​する

サンプル​クロック​の​ソース、​サンプル​クロック​の​レート、​収集​または​生成​する​サンプル​数​を​設定​する​に​は、​「Channel.Timinging.ConfigureSampleClock()」​関数​を​使用​し​ます。​以下​の​コードスニペット​は、​デバイス​の​PFI 0​に​接続​さ​れ​た​外部​サンプル​クロック​に​基づく​連続​収集​を​作成​し​ます。

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock(

"/​Dev1/​PFI0", //​外部​クロック​ソース​ライン​または​内部​クロック​に""を​使用

10000, //​外部​クロック​の​予測​レート​または​内部​クロック​の​実際​の​レート

SampleClockActiveEdge.Rising, //​ティック​の​立ち上がり​または​立ち​下がり​エッジ​で​収集

SampleQuantityMode.ContinuousSamples, //​連続​または​有限​ン​サンプル

1000 //​収集​する、​または​連続​の​場合​は​バッファ​サイズ​に​使用​する​有限​サンプル数

);

 

C / C +​+で​タスク​タイミング​を​構成​する

C​または​C +​+で​タスク​の​タイミング​を​構成​する​に​は、​「DAQmxCfgSampClkTiming」​関数​を​使用​し​ます。​以下​の​コードスニペット​は、​10000 hz​で​動作​する​内部​クロック​へ​の​使用​方法​を​示し​てい​ます。

char        clockSource[256] = "";
float64     rate = 10000;

DAQmxCfgSampClkTiming(taskHandle, clockSource, rate, DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1000);

 

特定​の​データ​収集​デバイス​は、​デジタル​I/​O​操作​の​タイミング​として​ハンド​シェイク​を​採用​し​てい​ます。​ハンド​シェイク​は、​外部​機器​と​の​間​で​要求​タイミング​信号​と​肯定​応答​タイミング​信号​の​交換​を​使用​し​て、​各​サンプル​を​転送​し​ます。​「NI-​DAQmx​タイミング」​関数のハンド​シェイクインスタンス​は、​デジタル​I/​O​操作​の​ハンド​シェイク​の​タイミング​を​設定​し​ます。

参考​と​なる​サンプル:

LabVIEW 電圧​―Continuous Output.vi
カウンタ​―Read Pulse Width and Frequency (Finite).vi
CVI Cont Gen Volt Wfm-​Ext Clk
Buff Semi-​Period-​Finite
.NET ContGenVoltageWfm_ExtClk
MeasBuffered_SemiPeriodFinite

 

DAQmx​タスク​を​開始


Library»NI-​DAQmx»Task Configuration/​Control»Start Task [CVI]

Task.Start Method [.NET]


概要​で​述​べた​よう​に、​NI-​DAQmx​が​採用​し​て​いる​状態​モデル​は、​不要​な​再​構成​を​排除​し、​高い​効率​性​と​パフォーマンス​の​最大​化​を​実現​し​てい​ます。​この​状態​モデル​は、​タスク​が​存在​できる​5​つ​の​状態​で​構成​さ​れ​てい​ます。​これらの​各​状態​の​詳細​について​は、NI-​DAQmx​ヘルプの​「 NI-​DAQmx​の​概念」​→「NI-​DAQmx​の​チャンネル​と​タスク」​→「NI-​DAQmx​の​タスク」​→「タスク​の​状態​モデル 」​を​参照​し​て​くだ​さい。

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

​「NI-​DAQmx​タスク​を​開始」​関数​は​必須​では​ありま​せん​が、​この​関数​を​使用​し​て、​ハードウェア​タイミング​による​収集​や​生成​を​含む​タスク​を​明示​的​に​開始​する​こと​が​推奨​さ​れ​ます。​また、​「NI-​DAQmx​読み取り」​関数​や​「NI-​DAQmx​書き込み」​関数​を​ループ​など​で​複数​回​実行​する​場合​も、​「NI-​DAQmx​タスク​を​開始」​関数​を​使用​する​必要​が​あり​ます。​使用​しない​と、​開始​と​停止​が​繰​り​返​さ​れる​ため、​タスク​の​パフォーマンス​が​低下​し​ます。​「NI-​DAQmx​タスク​を​開始」​関数​を​使用​する​タイミング​について​は、「LabVIEW​で​DAQmx​タスク​を​開始​VI​と​DAQmx​タスク​を​停止​VI​を​使用​する」​を​参照​し​て​くだ​さい。

 

LabVIEW​で​タスク​を​開始​する

以下​の​LabVIEW​ブロック​ダイ​ア​グラム​は、​アナログ​出力​生成​が​単一​の​ソフトウェア​タイミング​サンプル​のみ​で​構成​さ​れ​て​いる​ため、​「NI-​DAQmx​開始」​関数​を​使用​する​必要​が​ない​状況​を​示し​てい​ます。


​逆に、​以下​の​LabVIEW​ブロック​ダイ​ア​グラム​は、​カウンタ​から​の​読み取り​の​ため​に​「NI-​DAQmx​読み取り」​関数​を​複数​回​実行​し​て​いる​ため、​「NI-​DAQmx​開始」​関数​を​使用​する​必要​が​ある​状況​を​示し​てい​ます。

 

.NET​で​タスク​を​開始​する

タスク​を​開始​する​に​は、​Task​オブジェクト​で​「Start()」​関数​を​使い​ます。​以下​の​コードスニペット​は、​「Start()」​関数​の​使用​方法​を​示し​てい​ます。

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

analogInTask.Timing.ConfigureSampleClock( ... );

analogInTask.Start();

 

C/​C​+​+で​タスク​を​開始​する

タスク​を​開始​する​に​は、​「DAQmxStartTask()」​関数​を​使用​し​ます。​その​使用​方法​の​コードスニペット​を​下​に​示し​ます。

DAQmxStartTask(taskHandle);

 

参考​と​なる​サンプル:

LabVIEW カウンタ​―Continuous Output.vi
電流​―Continuous Input.vi
CVI Dig Pulse Train-​Cont
Cont 0-20mA Samps-​Int Clk
.NET GenDigPulseTrain_Continuous
ContAcq0_20mACurrentSamples_IntClk

NI-​DAQmx​読み取り


Library»NI-​DAQmx»Read Functions [CVI]

ChannelReader Class [.NET]



「NI-​DAQmx​読み取り」​関数​は、​指定​さ​れ​た​収集​タスク​から​サンプル​を​読み取り​ます。​関数​の​さまざま​な​インスタンス​を​使用​し​て、​収集​の​タイプ​(アナログ、​デジタル、​カウンタ)、​仮想​チャンネル​数、​サンプル​数、​データタイプ​を​選択​でき​ます。​「NI-​DAQmx​読み取り」​関数​は、​DAQ​ボード​上の​FIFO​から​RAM​上の​PC​バッファ​に​指定​さ​れ​た​数​の​サンプル​が​転送​さ​れ​た​後に、​PC​バッファ​から​アプリケーション​開発​環境​(ADE)​メモリ​に​サンプル​を​移動​し​ます。

LabVIEW​で​データ​を​読み取る

以下​の​図​は、​「NI-​DAQmx​読み取り」​VI​の​異なる​インスタンス​の​4​つ​の​例​を​示し​てい​ます。


​複数​の​サンプル​を​読み取る​こと​が​できる​「NI-​DAQmx​読み取り」​関数​の​インスタンス​に​は、​関数​の​実行​時に​読み取るチャンネル​ごと​の​サンプル数を​指定​する​入力​が​含​まれ​てい​ます。​有限​収集​の​場合、チャンネル​あたり​の​サンプル数を-1​に​指定​すると、​関数​は​要求​さ​れ​た​すべて​の​サンプル​が​収集​さ​れる​の​を​待​って​から、​これらの​サンプル​を​読み取り​ます。​連続​収集​の​場合、チャンネル​あたり​の​サンプル数を -1 に​指定​すると、​関数​の​実行​時に​バッファ​内​で​現在​利用​可能​な​すべて​の​サンプル​が​読み​取​ら​れ​ます。​以下​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​「NI-​DAQmx​読み取り」​VI​は、​複数​の​アナログ​入力​仮想​チャンネル​から​複数​の​サンプル​を​読み​取​って​波形​として​返す​よう​に​設定​さ​れ​てい​ます。​さらに、チャンネル​入力​あたり​の​サンプル数は​定​数値​10​に​配線​さ​れ​て​いる​ため、​VI​が​実行​さ​れる​たび​に​各​仮想​チャンネル​から​10​個​の​サンプル​が​読み​取​ら​れ​ます。

 

.NET​で​データ​を​読み取る

NI-​DAQmx .NET​ライブラリ​で​読み取る​に​は、​リーダ​オブジェクト​と​ストリーム​オブジェクト​を​使用​し​ます。​この​プログラミング​パターン​は、​ファイル​および​ネットワーク​I/​O​を​対象​と​する.NET​フレーム​ワーク​全体​で​使用​さ​れる​パターン​に​似​てい​ます。

DaqStream​クラス​に​は、​CurrentReadPosition​など​の​I/​O​に​関連​する​プロパティ​と​未処理​​I/​O​の​ため​の​メソッド​が​あり​ます。​特定​の​Task​に​対応​するDaqStreamクラス​の​インスタンス​を​取得​する​に​は、​Stream​プロパティ​を​使用​し​ます。DaqStreamクラス​の​インスタンス​を​直接​インスタンス​化​する​こと​は​でき​ま​せん。

NI-​DAQmx​ライブラリ​で​読み取り​を​実行​する​に​は、​reader(リーダ)​の​インスタンス​を​作成​し、​コンス​トラクタでDaqStreamクラス​の​インスタンス​を​渡し​ます。​次に、​以下​の​スニペット​に​示す​よう​に、​reader(リーダ)​クラス​で​メソッド​を​呼び出し​て​データ​を​読み取り​ます。

analogInTask = new Task();

analogInTask.AIChannels.CreateVoltageChannel( ... );

//​reader(リーダ)​を​作成​し​ストリーム​に​接続
AnalogSingleChannelReader reader = new AnalogSingleChannelReader(analogInTask.Stream);

//​読み取り​を​実行
double[] data = reader.ReadMultiSample(100);

 

C/​C​+​+で​データ​を​読み取る
C​または​C​+​+で​アナログ​入力​タスク​から​アナログ​データ​を​読み取る​に​は、​「DAQmxReadAnalogF64()」​関数​を​使用​し​ます。​その他​の​読み取り​関数​について​は、​「NI-​DAQmx C Reference Help」​を​参照​し​て​くだ​さい。​1​つ​の​チャンネル​から​1000​サンプル​を​読み取る​ため​の​コードスニペット​を​以下​に​示し​ます。

int numRead = 0;

DAQmxReadAnalogF64(taskHandle, 1000, 10.0, DAQmx_Val_GroupByScanNumber, data, 1000, &numRead, NULL);

 

参考​と​なる​サンプル:

LabVIEW 電圧​―SW-​Timed Input.vi
デジタル​―Finite Input.vi
CVI One Sample
Read Dig Chan
.NET AcqOneVoltageSample
ReadDigChan

 

NI-​DAQmx​書き込み


Library»NI-​DAQmx»Write Functions [CVI]

ChannelWriter Class [.NET]





「NI-​DAQmx​書き込み」​関数​は、​指定​さ​れ​た​生成​タスク​に​サンプル​を​書き込み​ます。​関数​の​さまざま​な​インスタンス​を​使用​し​て、​生成​の​タイプ​(アナログ​または​デジタル)、​仮想​チャンネル​数、​サンプル​数、​データタイプ​を​選択​でき​ます。​「NI-​DAQmx​書き込み」​関数​は、​アプリケーション​開発​環境​(ADE)​メモリ​から​RAM​内​の​PC​バッファ​に​サンプル​を​移動​し​ます。​その後、​これらの​サンプル​は、​PC​バッファ​から​DAQ​ボード​FIFO​に​転送​さ​れ​て​生成​さ​れ​ます。 

「NI-​DAQmx​書き込み」​関数​の​各​インスタンス​に​は​自動​開始​入力​が​あり、​タスク​が​明示​的​に​開始​さ​れ​てい​ない​場合、​暗示​的​に​タスク​を​開始​する​か​どうか​を​決定​し​ます。​この​ドキュメント​の​「NI-​DAQmx​タスク​を​開始」​セクション​で​説明​した​とおり、​ハードウェア​タイミング​を​使用​する​生成​タスク​を​明示​的​に​開始​する​に​は、​「NI-​DAQmx​タスク​を​開始」​関数​を​使用​する​必要​が​あり​ます。​また、​「NI-​DAQmx​書き込み」​関数​を​複数​回​実行​する​場合​も、​この​関数​を​使用​し​て​パフォーマンス​を​最大​化​する​必要​が​あり​ます。

LabVIEW​で​データ​を​書き込む

以下​の​図​は、​「NI-​DAQmx​書き込み」​VI​の​異なる​インスタンス​の​4​つ​の​例​を​示し​てい​ます。


​以下​に​示す​有限​アナログ​出力​生成​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​ハードウェア​タイミング​で​生成​さ​れる​ため、​「NI-​DAQmx​書き込み」​VI​の​自動​開始​入力​に​「False」​ブール​定数​が​配線​さ​れ​てい​ます。​「NI-​DAQmx​書き込み」​VI​は、​1​チャンネル​分​の​アナログ​出力​データ​の​複数​サンプル​を​アナログ​波形​として​タスク​に​書き込む​よう​に​設定​さ​れ​てい​ます。


.NET​で​データ​を​書き込む

NI-​DAQmx .NET​ライブラリ​で​書き込む​に​は、​writer(ライタ)​オブジェクト​と​ストリーム​オブジェクト​を​使用​し​ます。​この​プロセス​は、​前述​の​読み取り​データ​と​似​てい​ます。

書き込み​を​実行​する​に​は、​writer(ライタ)​の​インスタンス​を​作成​し、​コンス​トラクタでDaqStreamクラス​の​インスタンス​を​渡し​ます。​次に、​以下​の​スニペット​に​示す​よう​に、​writer(ライタ)​クラス​で​メソッド​を​呼び出し​て​データ​を​書き込み​ます。

analogOutTask = new Task();

analogOutTask.AOChannels.CreateVoltageChannel( ... );

//​writer(ライタ)​を​作成​し​ストリーム​に​接続
AnalogSingleChannelWriter writer = new AnalogSingleChannelWriter(analogOutTask.Stream);

//​書き込み​を​実行
double[] data = writer.WriteMultiSample(100);

 

C/​C​+​+で​データ​を​書き込む
アナログ​データ​を​書き込む​に​は、​「DAQmxWriteAnalogF64()」​関数​を​使用​し​ます。​他の​形式​の​データ​の​書き込み​について​は、​「NI-​DAQmx C Reference Help」​を​参照​し​て​くだ​さい。​1000​サンプル​の​アナログ​データ​を​書き込む​コードスニペット​を​以下​に​示し​ます。

int written = 0;

DAQmxWriteAnalogF64(taskHandle, 1000, 0, 10.0, DAQmx_Val_GroupByChannel, data, &written, NULL);

 

参考​と​なる​サンプル

LabVIEW 電圧​― Finite Output.vi
デジタル​―Finite Output.vi
CVI Volt Update
Write Dig Chan
.NET GenVoltageUpdate
WriteDigChan

 

NI-​DAQmx​完了​まで​待機


Library»NI-​DAQmx»Task Configuration/​Control»Wait Until Task Done [CVI]

Task.WaitUntilDone Method [.NET]


「NI-​DAQmx​完了​まで​待機」​関数​は、​データ​収集​操作​が​完了​する​まで​待機​し​ます。​この​関数​は、​指定​さ​れ​た​収集​または​生成​が​完了​し​て​いる​こと​を​確認​し​て​から​タスク​を​停止​する​ため​に​使用​し​ます。​ほとんど​の​場合、​「NI-​DAQmx​完了​まで​待機」​関数​は​有限​操作​で​使用​さ​れ​ます。​この​関数​の​実行​が​終了​すると、​有限​収集​または​生成​が​完了​し、​操作​を​妨げる​こと​なく​タスク​を​停止​する​こと​が​でき​ます。​さらに、タイム​アウト入力​で​最大​待機​時間​を​指定​する​こと​が​でき​ます。​この​時間​内​に​収集​または​生成​が​完了​しない​場合、​関数​は​終了​し、​適切​な​エラー​が​生成​さ​れ​ます。

LabVIEW​で​の​完了​まで​待機

以下​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​「NI-​DAQmx​完了​まで​待機」​VI​を​使用​し​て、​有限​デジタル​出力​操作​が​完了​し​て​いる​こと​を​確認​し​て​から​タスク​を​クリア​し​てい​ます。


.NET​で​の​完了​まで​待機

.NET​で​この​関数​を​使用​する​方法​の​詳細​について​は、​「GenMultVoltUpdates_IntClk」​の​例​を​参照​し​て​くだ​さい。

C/​C​+​+で​の​完了​まで​待機

バッファ​内​の​すべて​の​サンプル​が​生成​さ​れる​まで​待機​する​に​は、​「DAQmxWaitUntilTaskDone()」​関数​を​使用​し​ます。​書き込み​関数​または​開始​関数​の​後に​呼び出し​ます。

 

参考​と​なる​サンプル

LabVIEW デジタル​―Finite Output.vi
電圧​― Finite Output.vi
CVI Dig Pulse
Mult Volt Updates-​Int Clk
.NET GenDigPulse
GenMultVoltUpdates_IntClk

 

NI-​DAQmx​タスク​を​クリア


Library»NI-​DAQmx»Task Configuration/​Control»Clear Task [CVI]

Task.Dispose Method [.NET]


 

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

連続​操作​の​場合​は、​「NI-​DAQmx​タスク​を​クリア」​関数​を​使用​し​て、​実際​の​収集​または​生成​を​停止​さ​せ​て​くだ​さい。

LabVIEW​で​タスク​を​クリア​する

以下​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​連続​パルス列​を​カウンタ​で​生成​し​てい​ます。​While​ループ​が​終了​し、​「NI-​DAQmx​タスク​を​クリア」​VI​が​実行​さ​れる​まで​パルス列​が​出力​さ​れ​ます。


.NET​で​タスク​を​クリア​する

タスク​の​読み取り​または​書き込み​が​終了​したら、​Task.Dispose​メソッド​を​呼び出す​だけ​です。

C/​C​+​+で​タスク​を​クリア​する

タスク​の​読み取り​または​書き込み​が​終了​したら、​「DAQmxClearTask()」​関数​を​使用​し​ます。

参考​と​なる​サンプル

LabVIEW 電圧​―Continuous Output.vi
カウンタ​―Count Edges (Continuous Clock).vi
CVI Cont Gen Volt Wfm-​Int Clk
Cnt Dig Events
.NET ContGenVoltageWfm_IntClk
CountDigEvents

 

NI-​DAQmx​プロパティ

Attribute [CVI]

Property [.NET]

NI-​DAQmx​プロパティ​を​使用​すると、​データ​収集​操作​に​関連​する​すべて​の​プロパティ​に​アクセス​でき​ます。​これらの​プロパティ​は​NI-​DAQmx​プロパティ​に​書き込む​こと​で​設定​でき、​プロパティ​の​現在​の​値​も​NI-​DAQmx​プロパティ​から​読み取る​こと​が​でき​ます。

前述​の​NI-​DAQmx​関数​を​使用​し​て​多く​の​プロパティ​を​設定​でき​ます。​たとえば、サンプル​クロック​ソースプロパティとサンプル​クロック​アクティブ​エッジプロパティ​は、​「NI-​DAQmx​タイミング」​関数​を​使用​し​て​設定​でき​ます。​ただし、​使用​頻度​の​低い​プロパティ​の​一部​は、​NI-​DAQmx​プロパティ​から​のみ​アクセス​でき​ます。

LabVIEW​で​プロパティ​を​使用​する​(プロパティノード)


LabVIEW​では、​1​つ​の​NI-​DAQmx​プロパティノード​を​使用​し​て、​複数​の​プロパティ​へ​の​書き込み​や​読み取り​を​行う​こと​が​でき​ます。​たとえば、​以下​の​LabVIEW NI-​DAQmx​タイミング​プロ​パテ​ィ​ノード​は​サンプル​クロック​の​ソース​を​設定​し​ます。​次に、​サンプル​クロック​の​ソース​が​読み​取​ら​れ​ます。​最後​に、​サンプル​クロック​の​アクティブ​エッジ​が​設定​さ​れ​ます。


​以下​の​LabVIEW​ブロック​ダイ​ア​グラム​では、​NI-​DAQmx​チャンネル​プロ​パテ​ィ​ノード​を​使用​し​て​ハードウェア​ロー​パス​フィルタ​を​有効​にし、​歪み​ゲージ​測定​で​使用​する​ため​の​フィルタ​カットオフ​周波数​を​設定​し​てい​ます。


 

.NET​で​プロパティ​を​使用​する

「タイミング」​セクション​で​述​べた​よう​に、​多く​の​プロパティ​は、​Task​オブジェクト​内​の​サブ​クラス​や​コレクション​から​設定​さ​れ​ます。​NI-​DAQmx​で​の​一般​的​な​プロパティ​の​使用​方法​を​以下​の​スニペット​に​示し​ます。

//​新規​NI-​DAQmx​タスク​を​作成
Task t = new Task();

//​Task​クラス​の​サブ​オブジェクト​プロ​パテ​ィ​に​アクセス
t.Timing.SamplesPerChannel = 1000;

 

C/​C​+​+で​プロパティ​を​使用​する

タスク​の​プロパティ​を​取得​または​設定​する​ため​に、​個々​の​プロパティ​ごと​に​個別​の​ゲッタ​関数​と​セッタ​関数​が​あり​ます。​詳細​について​は、​「NI-​DAQmx C Reference Help」​の​「NI-​DAQmx C Properties」​に​ある​プロパティ​と​関数​の​リスト​を​参照​し​て​くだ​さい。

参考​と​なる​サンプル

LabVIEW 歪み​―Continuous Input.vi
熱電​対​(OTCD​付き)―Continuous Input.vi
CVI Cont Strain Samples
Cont Accel Samps-​Int Clk-​Anlg Start
.NET AcqStrainSamples
ContAcqAccelSamp_IntClk_AnalogStart

 

まとめ

NI-​DAQmx​は​開発​時間​を​短縮​し、​データ収集アプリケーションのパフォーマンスを向上させます。​NI-​DAQmx​は、​少数​の​関数​を​使用​する​だけ​で​機能​の​大部分​を​活用​できる​API​を​提供​し​て​開発​時間​の​短縮​を​実現​し​てい​ます。​実際、​この​ドキュメント​で​説明​した​10​の​関数​を​習得​する​だけ​で、​データ​収集​アプリケーション​の​80%​を​解決​でき​ます。