このシリーズは、NI-DAQmxに同梱されている2つの主要なリファレンスマニュアルを参照しています。
タスクの構成後、タスクを開始して実際に操作を始めます。Controlメソッドで構成したタスクを開始します。
[VB 6.0]
CWAI1.Start
[VB.NET]
aiTask.Start()
NI-DAQmxでは、タスクを明示的に開始する必要はありません。ReadおよびWriteメソッドを呼び出すと、タスクが自動的に開始されます。Task.Controlメソッドでタスクの状態を変更します。
NI-DAQmxでサポートされているさまざまなタイプのタイミングに関する詳細については、『NI-DAQmx Coreヘルプ』の「タスク状態モデル」セクションを参照してください。
NI-DAQmx .NET APIのタスク状態モデルの詳細については、『NI-DAQmx .NET Help』の「Verifying, Committing, Starting, and Stopping NI-DAQmx Tasks Programmatically」トピックを参照してください。
Traditional NI-DAQ (Legacy)
CWDAQコントロールはReadメソッドにデータを返しました。
[VB 6.0]
Private Sub Acquire_Click()
'有限集録操作を構成する
CWAI1.Configure
CWAI1.Start
'1000サンプルのデータを読み取り、データ配列に返す
CWAI1.Read 1000, data
End Sub
NI-DAQmx
NI-DAQmx .NETライブラリを使用してデータを集録するには、リーダオブジェクトとストリームオブジェクトを使用します。リーダオブジェクトはTaskクラスのサブオブジェクトではありません。クラス階層の表記法については「タスク」トピックを参照してください。
NI-DAQmx .NETライブラリでは以下のリーダオブジェクトを使用できます。読み取りを行う信号タイプ、およびタスクが単一チャンネルまたは複数チャンネルのどちらの構成であるかに基づいて適切なリーダのタイプを選択します。
タスクのタイプに基づいて適切なリーダを選択します。リーダオブジェクトを作成するには、タスクのストリームプロパティを使用する必要があります。以下のサンプルは、以前に作成した有限アナログ入力信号チャンネルタスクの適切なリーダオブジェクトを初期化し、集録データを読み取る方法を示します。
[VB.NET]
'アナログ入力単一チャンネルリーダを作成し、タスクストリームプロパティを使用して初期化する
dim analogInReader as AnalogSingleChannelReader= New AnalogSingleChannelReader(aiTask.Stream))
Dim data() As Double = analogInReader.ReadMultiSample(1000)
上記のコード例では、ReadMultiSampleの呼び出しはブロッキング呼び出しです。ブロッキング呼び出しとは、すべてのデータが有効になるまで呼び出しを返さないメソッドです。この方法でのリーダの使用は、通常、高速サンプリングレートで小さいデータセットを返す高速の有限集録操作に適しています。
ただし、この方法でReadを設定すると、多数のポイントが必要でサンプルレートが低い場合、または集録が連続操作の場合に、問題が発生する恐れがあります。DAQアプリケーションにユーザインタフェースがある場合、Readタスクが長すぎると、ユーザインタフェースは応答なしで表示されます。
NI-DAQmx .NET APIは非同期I/Oをサポートしているので、CWDAQ ActiveXコントロールのAcquiredDataイベントに似た操作を設定できます。非同期I/Oについては、後ほど「非同期I/O」セッションで説明します。
リーダオブジェクトの詳細については、『NI-DAQmx .NET Help』の「Reading and Writing with the NI-DAQmx .NET Library」トピックを参照してください。
Traditional NI-DAQ (Legacy)
CWAO、CWAOOnePoint (アナログ出力用)、CWDO、CWPulse (デジタル出力用) などのコントロールは、Traditional NI-DAQ (Legacy) ドライバを使って出力信号を生成します。Writeメソッドを使用し、データが出力チャンネルで生成される前に、データを内部ドライババッファに書き込みます。
[VB 6.0]
CWAO1.UpdateClock.Frequency = 1000 '毎秒ごとに更新する
CWAO1.Infinite = True
CWAO1.Configure 'プロパティページから構成された設定
CWAO1.Write data
CWAO1.Start
メソッドに多次元配列を渡すことで、同じ方法で複数のチャンネルでデータを生成することができます。
NI-DAQmx
NI-DAQmx .NET APIでデータに書き込みを行うには、ライタオブジェクトとストリームオブジェクトを使用します。ライタオブジェクトはタスククラスのサブオブジェクトではありません。NI-DAQmx .NETライブラリでは、適切なタイプのタスクで使用する以下のライタオブジェクトを使用できます。複数チャンネルを介して生成されるデータの書き込みに、複数チャンネルのライタオブジェクトを使用します。
以下のサンプルは、単一チャンネルを使用するように構成したワンショットアナログ出力タスクの適切なライターオブジェクトを初期化する方法を示します。
[VB.NET]
'タスク、チャンネル、サンプリングレートを作成および構成する
'create single channel writer
AnalogSingleChannelWriter writer = _
new AnalogSingleChannelWriter(myTask.Stream)
'write data to buffer
writer.WriteMultiSample(true,data)
myTask.Start()
'アナログ出力操作が完了するまで10秒間待機する
myTask.WaitUntilDone(10000)
'DAQリソースをすべてクリーンアップする
myTask.Dispose()
リーダオブジェクトの詳細については、『DAQmx .NET Help』の「Reading and Writing with the NI-DAQmx .NET Library」トピックを参照してください。
リーダと同様に、NI-DAQmx .NET APIはライタの非同期I/Oをサポートします。
このセクションでは、Traditional NI-DAQ (Legacy) とNI-DAQmx .NET APIで非同期I/Oを実行する方法を説明します。
Traditional NI-DAQ (Legacy)
CWDAQコントロールを使用して、非同期I/Oを実行するためのAcquireDataイベントなどのイベントを設定します。集録されたデータは、AcquireDataイベントのパラメータの1つとして返されます。
[VB 6.0]
Private Sub CWAI1_AcquiredData(ScaledData As Variant, BinaryCodes As Variant)
'集録されたデータをここで処理する
End Sub
Private Sub Start_Click()
'構成パラメータを設定する
.
.
'設定を構成し、操作を開始する
CWAI1.Configure
CWAI1.Start
End Sub
NI-DAQmx
NI-DAQmx .NET APIは、同期および非同期I/Oをサポートします。
同期操作では、必要な数のデータポイントが返されるまでリーダは返しません。
前セクションでは、有限同期のReadメソッドを使用する1000データポイントの読み取り方法について説明しました。以下のサンプルプログラムは、同じ操作を非同期で設定する方法を示します。
[VB.NET]
Public Sub StartAI()
Try
'新規タスクを作成する
myTask = New Task("aiTask")
'チャンネルを作成する myTask.AIChannels.CreateVoltageChannel(physicalChannelComboBox.Text, "", CType(-1, AITerminalConfiguration), -10.0, 10.0, AIVoltageUnits.Volts)
'有限集録のタイミング仕様を構成する
myTask.Timing.ConfigureSampleClock("", 1000, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, 1000)
reader = New AnalogMultiChannelReader(myTask.Stream)
'非同期アナログ入力操作を開始する
reader.BeginReadMultiSample(1000, New AsyncCallback(AddressOf ReadCallback), Nothing)
Catch ex As DaqException
MessageBox.Show(ex.Message)
Finally
myTask.Dispose()
End Try
End sub
.
.
.
Private Sub ReadCallback(ByVal ar As IAsyncResult)
Try
'非同期操作から集録されたデータを取得する
Dim data As Double() = reader.EndReadMultiSample(ar)
'ここでデータを使用する...
Catch ex As DaqException
MessageBox.Show(ex.Message)
Finally
daqTask.Dispose()
End Try
End Sub
上記のコード例では、タスクとチャンネルは同期読み取り操作と同様に構成されています。唯一の違いは、Readメソッドが使用されていることです。BeginReadMultiSampleは、バックグランドのワーカスレッドで発生する読み取り操作のタイミングを設定します。バックグランドのワーカスレッドが読み取り操作を完了した時に呼び出す関数 (このサンプルプログラムではReadCallback) を指定します。1000データポイントが集録されると、ReadCallbackメソッドが呼び出されます。これで集録されたデータにアクセスできます。
この方法でアナログ入力操作を設定すると、読み取り操作が直ちに返されずに、読み取り操作がトリガ信号を待機すると予想できることを確認します。この方法でアナログ入力操作を設定すると、メインのUIスレッドをブロックせず、応答しないUIも作成しません。
非同期I/Oは、連続AI操作を設定する最も効果的な方法です。専用のスレッドでこのAI操作を設定することにより、より効果的にシステムリソースを使用できます。読み取り操作の遅延は、ユーザインタフェースの無応答の原因にはなりません。ただし、非同期I/Oではアプリケーションが高速にならないことに注意してください。リソースを効果的に使用すると、ユーザインタフェースとアプリケーションは応答しない状態ではなくなります。
非同期I/Oはイベントと似ていますが、非同期I/Oはイベントとは異なる目的で動作します。次のセクションで、NI-DAQmxでのイベントのサポートを説明します。
Traditional NI-DAQ (Legacy)
CWDAQコントロールはデータを集録するイベントを使用し、NI-DAQ実行時の警告とエラーを知らせます。集録コントロールは、AcquiredDataイベントを発生させ、データが準備されるタイミングを知らせます。これにより、イベントの引数の1つを使用してデータを読み取ることができます。連続集録アプリケーションでは、指定したサンプル数が使用可能な場合はいつでもAcquiredDataイベントが連続的に発生します。また、Progressイベントを使用して集録の進行状況を示します。Traditional NI-DAQ (Legacy) の操作中に発生する可能性があるランタイムエラーと警告を表示するDAQWarningやDAQErrorのようなイベントが発生します。
NI-DAQmxイベントは異なる目的で動作します。次のセクションで、NI-DAQmxでサポートされているイベントについて説明します。
NI-DAQmx
NI-DAQmx 7.4以降は、さまざまなオカーレンスの通知をサポートします。このドライバでサポートされているイベントの最新リストを確認するには、『NI-DAQmx Core』、および『NI-DAQmx .NET』のドキュメントを参照してください。
デフォルトでは、NI-DAQmxイベントのハンドラはワーカスレッドで発生します。.NET Frameworkでサポートされていないため、ワーカスレッドからユーザインタフェースコントロールにアクセスすることはできません。作成したスレッドからユーザインタフェースコントロールにアクセスすることのみ可能です。このようなケースの処理方法の詳細については、『NI-DAQmx .NET Help』の「Using NI-DAQmx Events help」トピックで「Event Handler Considerations」を参照してください。
CWDAQ ActiveXコントロールはイベントを使用して、AcquiredDataイベントを含む、一連のNI-DAQイベントの非同期通知を配布します。NI-DAQmx .NET APIは、非同期I/Oで同様のメカニズムを提供します。非同期I/Oでは、読み取りまたは書き込み操作が完了したときに実行するコールバックをインストールします。設定方法の詳細については、非同期I/Oのセクションを参照してください。
DAQmxでサポートされているイベントの詳細については、目次→重要なNI-DAQmxの概念→タイミングとトリガから『NI-DAQmx Core Help』のトピックを参照してください。