このシリーズは、NI-DAQmxに同梱されている2つの主要なリファレンスマニュアルを参照しています。
Traditional NI-DAQ (Legacy)
CWDAQコントロールでResetメソッドを使用し、このコントロールをデフォルト状態に設定して、構成中に予約したすべてのリソースを解放します。ほとんどの場合、Resetメソッドを明示的に呼び出す必要はありません。Visual Basic 6.0は、アプリケーションが存在する場合、自動的にリソースを解放します。Traditional NI-DAQ (Legacy) のリソースは、オブジェクトにNothingを割り当て、実行時に解放する必要があります。この動作はVisual Basic .NETで変更されました。
NI-DAQmx
.NET Frameworkはリソース管理にガベージコレクションを使用します。バグ処理は、実行中に割り当てられたオブジェクトの寿命を追跡する負担を取り除くため、有益です。ただし、バグ処理は確定的ではありません。.NET Frameworkは、タスクがNothingに設定されていても、修正予定のオブジェクトに関連付けられたリソースが解放される正確なタイミングは保証しません。
タスクの構成時に予約されたNI-DAQリソースを確定的に解放するDisposeメソッドを使用します。
[VB.NET]
'Clear the task and release any resources used by the task
daqTask.Dispose()
Visual Basic.NETのエラー処理は、Visual Basic 6.0のエラー処理とは異なります。
Traditional NI-DAQ (Legacy)
CWDAQ ActiveXコントロールはDAQErrorイベントとDAQWarningイベントによりエラー通知を出します。
[VB 6.0]
Private Sub Start_Click()
CWAI1.Device = 1 'use device 1
'Use channel 0, with a range of +/- 10 volts in differential mode
CWAI1.Channels.Add "0", 10#, -10#, CWAIInputModes.cwaiDIFF
'Configure the sample clock
CWAI1.ScanClock.Frequency = 1000
CWAI1.NScans = 1000
CWAI1.ChannelClock.ClockSourceType = cwaiInternalCS
'Specify the task to be finite
CWAI1.StopCondition.Type = cwaiNoActiveCondition
'Other code
CWAI1.Configure
CWAI1.Start
End Sub
Private Sub CWAI1_DAQError(ByVal StatusCode As Long, ByVal ContextID As Long, ByVal ContextDescription As String)
MsgBox "Error: " & StatusCode & vbCrLf & "Context: " & ContextDescription & vbCrLf & CWDAQTools1.GetErrorText(StatusCode)
End Sub
Private Sub CWAI1_DAQWarning(ByVal StatusCode As Long, ByVal ContextID As Long, ByVal ContextDescription As String)
MsgBox "Warning: " & StatusCode & vbCrLf & "Context: " & ContextDescription & vbCrLf & CWDAQTools1.GetErrorText(StatusCode)
End Sub
NI-DAQmx
Visual Basic .NETは、構造化された例外処理によって、プログラムの実行中に予期しない問題が発生したときに信号を送り、応答するためのオブジェクト指向のソリューションを提供します。NI-DAQmx .NET APIでは、ドライバがエラーを返すたびに、DAQExceptionが発生します。オブジェクトは、エラー番号、エラーメッセージ、スタックなどの情報を提供します。これは、Try-Catch-Finallyブロックを介して行われます。
[VB.NET]
Try
'新規タスクを作成する
myTask = New Task("aiTask")
' Create a channel myTask.AIChannels.CreateVoltageChannel(physicalChannelComboBox.Text, "", CType(-1, AITerminalConfiguration), -10.0, 10.0, AIVoltageUnits.Volts)
' Configure timing specs
myTask.Timing.ConfigureSampleClock("", 1000, SampleClockActiveEdge.Rising, SampleQuantityMode.FiniteSamples, 1000)
reader = New AnalogMultiChannelReader(myTask.Stream)
' Read the data
Dim data As Double(,) = reader.ReadMultiSample(1000)
Catch ex As DaqException
MessageBox.Show(ex.Message)
Finally
myTask.Dispose()
End Try
上記の例では、最初のTryステートメントの後にコードブロック内でNI-DAQmxエラーが発生した場合、エラーはDAQExceptionとして検出されます。NI-DAQmx .NETライブラリのエラーはすべてDAQExceptionオブジェクトの発生により示されます。このサンプルでは、Catchブロックにエラーメッセージを示すメッセージボックスが表示されます。このサンプルでは、Finallyブロックで例外の発生の有無に関わらずNI-DAQmxリソースがクリーンアップされることを確認します。
NI-DAQmx .NET APIは、NI-DAQ警告がアプリケーションの実行停止を要求しないため、この警告のイベントを提供します。エラーはアプリケーションの実行停止を要求します。以下のコードはDAQWarningイベントの使用方法を示します。
'define the daqsystem and initialize it
Private WithEvents daqSystem As DaqSystem = DaqSystem.Local
.
.
.
Public Sub DaqWarningEventHandler(ByVal sender As Object, ByVal e As DaqWarningEventArgs) Handles daqSystem.DaqWarning
'display or log warning message
End Sub
DaqExceptionオブジェクトおよびDaqWarningイベントの詳細については、「NI-DAQmx .NETヘルプ」を参照してください。Visual Basic .NETでの構成例外処理とTry-Catch-Finallyの詳細については、MSDNを参照してください。