Microsoft Visual Basic .NET従来NI-DAQからNI-DAQmx移行する: Part 3

概要

メモ: このドキュメントは、『Microsoft Visual Basic .NETで従来型NI-DAQ(レガシー)からNI-DAQmxへ移行する』シリーズの3番目のドキュメントです。このシリーズの別のドキュメントにアクセスするには、このシリーズの別のトピックへのリンクを参照してください。

このシリーズの前のトピックでは、DAQの操作を構成しました。このトピックは、操作の開始および停止方法、読み取りおよび書き込み方法を検証し、実行時のデバイスの動作を区別する方法を説明します。最初に構成されたタスクタイプは、I/Oの実行方法を決定します。

内容

NI-DAQmxヘルプアクセスする

このシリーズは、NI-DAQmxに同梱されている2つの主要なリファレンスマニュアルを参照しています。

  • NI-DAQmxヘルプ―NI-DAQmxの複数言語に対応しているマニュアルを参照しています。『NI-DAQmxヘルプ』はNI-DAQmxの中心的なヘルプで、ドライバの多様な特性と機能に関する概要および背景を説明します。このマニュアルにアクセスするには、スタート→プログラム→National Instruments→NI-DAQmx→NI-DAQmxヘルプを選択します。
  • NI-DAQmx .NET Help―.NET DAQmx APIのマニュアルを参照しています。このリファレンスは.NET APIに特化し、NI-DAQmxのクラス、メソッド、プロパティに関するドキュメントを提供します。また、NI-DAQmx .NET APIの使用に特化したトピックの概要も説明します。このヘルプは、Visual Studio .NETドキュメントに統合されています。Visual Studio .NETでは、Help→Contentsを選択します。『NI-DAQmx .NET Library Help』にアクセスするには、NI Measurement Studio Help→NI Measurement Studio .NET Class Library→Reference→National Instruments.DAQmxを選択します。タスクと概要については、NI Measurement Studio Class .NET Library→Using the Measurement Studio .NET Class Libraries→Using the Measurement Studio NI-DAQmx .NET Libraryを選択します。
      

実行

タスクの構成後、タスクを開始して実際に操作を始める必要があります。Controlメソッドで構成したタスクを開始します。

[VB 6.0]    CWAI1.Start

[VB.NET]    aiTask.Start()

NI-DAQmxでは、タスクを明示的に開始する必要はありません。ReadおよびWriteメソッドを呼び出すと、タスクが自動的に開始されます。Task.Controlメソッドでタスクの状態を変更します。

NI-DAQmxでサポートされている多様なタイプのタイミングに関する詳細については、『NI-DAQmxヘルプ』の「タスク状態モデル」セクションを参照してください。

NI-DAQmx .NET APIのタスク状態モデルの詳細については、『NI-DAQmx .NET Help』の「Verifying, Committing, Starting, and Stopping NI-DAQmx Tasks Programmatically」トピックを参照してください。  

読み取り

従来型NI-DAQ(レガシー)
CWDAQコントロールはReadメソッドのデータを返します。

[VB 6.0]
Private Sub Acquire_Click()

'configure finite acquisition operation
CWAI1.Configure

CWAI1.Start

'read a 1000 samples of data and return it in the data array
CWAI1.Read 1000, data

End Sub

NI-DAQmx
NI-DAQmx .NETライブラリでデータを集録するには、リーダオブジェクトとストリームオブジェクトを使用します。リーダオブジェクトはTaskクラスのサブオブジェクトではありません。クラス階層の表記法については「タスク」のトピックを参照してください。

NI-DAQmx .NETライブラリでは以下のリーダオブジェクトを使用できます。読み取りを行う信号タイプ、およびタスクが単一チャンネルまたは複数チャンネルのどちらの構成であるかに基づいて適切なリーダのタイプを選択します。

  • AnalogSingleChannelReader
  • AnalogMultiChannelReader
  • AnalogUnscaledReader
  • CounterReader
  • DigitalSingleChannelReader
  • DigitalMultiChannelReader


タスクのタイプに基づいて適切なリーダを選択します。リーダオブジェクトを作成するには、タスクのStreamプロパティを使用する必要があります。以下のサンプルは、前に作成した有限アナログ入力信号チャンネルタスクの適切なリーダオブジェクトを初期化し、集録データを読み取る方法を示します。

[VB.NET]
'Create an analog input single channel reader and initialize it using the task Stream property
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」トピックを参照してください。  

書き込み

従来型NI-DAQ(レガシー)

CWAO、CWAOOnePoint(アナログ出力用)、CWDO、CWPulse(デジタル出力用)は、従来型NI-DAQ(レガシー)ドライバで出力信号を生成します。Writeメソッドを使用し、データが出力チャンネルで生成される前に、データを内部ドライババッファに書き込みます。

[VB 6.0]
CWAO1.UpdateClock.Frequency = 1000 ' Updates per second
CWAO1.Infinite = True
CWAO1.Configure 'Settings configured from property pages
CWAO1.Write data
CWAO1.Start


複数チャンネルでデータを生成するには、多次元配列をメソッドに渡すと、同じメソッドを使用できます。
NI-DAQmx
NI-DAQmx .NET APIでデータに書き込みを行うには、ライターとストリームオブジェクトを使用します。ライターオブジェクトはタスククラスのサブオブジェクトではありません。NI-DAQmx .NETライブラリでは、適切なタイプのタスクで使用する以下のライターオブジェクトを使用できます。複数チャンネルを介して生成される書き込みデータに、複数チャンネルのライターオブジェクトを使用します。

  • AnalogSingleChannelWriter
  • AnalogMultiChannelWriter
  • AnalogUnscaledWriter
  • CounterSingleChannelWriter
  • CounterMultiChannelWriter
  • DigitalSingleChannelWriter
  • DigitalMultiChannelWriter


以下のサンプルは、単一チャンネルを使用するように構成したワンショットアナログ出力タスクの適切なライターオブジェクトを初期化する方法を示します。

[VB.NET]

' Configure create and configure the task, channel, and sample rate

'create single channel writer
AnalogSingleChannelWriter writer = _
new AnalogSingleChannelWriter(myTask.Stream)

'write data to buffer
writer.WriteMultiSample(true,data)

myTask.Start()

'Wait 10 seconds for analog output operation to complete
myTask.WaitUntilDone(10000)

'cleanup any DAQ resources
myTask.Dispose()

リーダオブジェクトの詳細については、『DAQmx .NET Help』の「Reading and Writing with the NI-DAQmx .NET Library」のトピックを参照してください。

リーダと同様に、NI-DAQmx .NET APIはライターの非同期I/Oをサポートします。  

非同期I/O

このセクションでは、従来型NI-DAQ(レガシー)とNI-DAQmx .NET APIで非同期I/Oを実行する方法を説明します。

従来型NI-DAQ (レガシー)
非同期I/Oを実行するには、CWDAQコントロールでAcquireDataイベントなどのイベントを設定します。集録されたデータはAcquireDataイベントのパラメータの1つとして返されます。

[VB 6.0]

Private Sub CWAI1_AcquiredData(ScaledData As Variant, BinaryCodes As Variant)
'process acquired data here
End Sub

Private Sub Start_Click()

'set configuration parameters
.
.

'configure the settings and start the operation
CWAI1.Configure
CWAI1.Start

End Sub

NI-DAQmx

NI-DAQmx .NET APIは、同期と非同期のI/Oをサポートします。
同期の操作では、必要なデータポイント数が返されるまでリーダを返しません。
前のセクションでは、有限同期のReadメソッドを使用する1000データポイントの読み取り方法を説明しました。以下のサンプルは、同じ操作を非同期で設定する方法を示します。

[VB.NET]
Public Sub StartAI()

Try
' Create a new task
myTask = New Task("aiTask")

' Create a channel myTask.AIChannels.CreateVoltageChannel(physicalChannelComboBox.Text, "", CType(-1, AITerminalConfiguration), -10.0, 10.0, AIVoltageUnits.Volts)

' Configure timing specs for a finite acquisition
myTask.Timing.ConfigureSampleClock("", 1000, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, 1000)


reader = New AnalogMultiChannelReader(myTask.Stream)
' begin an asynchronous analog input operation
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
' get the data acquired from the asynchronous operation
Dim data As Double() = reader.EndReadMultiSample(ar)

' Use data here…

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でのイベントのサポートを説明します。  

イベント

従来型NI-DAQ (レガシー)
CWDAQコントロールはデータを集録するイベントを使用し、NI-DAQ実行時の警告とエラーを知らせます。集録コントロールは、 AcquiredDataイベントを発生させ、データが準備されるタイミングを知らせます。これにより、イベントの引数の1つを使用してデータを読み取ることができます。連続集録アプリケーションでは、指定したサンプル数が使用可能な場合はいつでもAcquiredDataイベントが連続的に発生します。また、Progressイベントを使用して集録状況を示します。従来型NI-DAQ(レガシー)の操作中に発生する可能性があるランタイムエラーと警告を表示するDAQWarningやDAQErrorのようなイベントが発生します。

NI-DAQmxイベントは異なる目的で動作します。次のセクションで、NI-DAQmxでサポートされているイベントの説明をします。

NI-DAQmx
NI-DAQmx 7.4以降はさまざまなオカーレンスの通知をサポートします。このドライバでサポートされているイベントの最新リストを確認するには、『NI-DAQmxヘルプ』などNI-DAQmxの中心的なドキュメントおよび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ヘルプ』のトピックを参照してください。  

このシリーズトピックリンク

Was this information helpful?

Yes

No