さて、私が高レベルで行っていることは、システムに接続されているすべての VISA デバイスをシステムでスキャンし、それらを識別させることです。
問題は、すべての VISA デバイスが自分自身を識別する機能をサポートしているわけではないことです。私が知っている唯一の方法は、デバイスにそれを行うように指示することです。これにより、自分自身を識別できないものは、最小 1 秒のタイムアウトに依存するようになります。タイムアウトを待っている間、タイムアウトが完了するまで TCL スクリプトと Wish アプリケーションがフリーズします。複数のデバイスを使用すると、何が起こっているのかをユーザーに更新することができず、数秒かかる可能性がある厄介な待機時間が残ります。
これが私のコードです:
proc ::VISA::Scan {} {
# Open a temporary resource manager
set TemporaryResourceManagerId [::visa::open-default-rm]
# Get addresses for all devices on system
foreach address [::visa::find $TemporaryResourceManagerId "?*"] {
# Create temporary VISA channel
set TemporaryChannel [visa::open $TemporaryResourceManagerId $address]
# Have device identify itself while suppressing errors
if {![catch {puts $TemporaryChannel "*IDN?"}]} {
if {![catch {gets $TemporaryChannel} result]} {
if {![string is space $result]} {
puts $address
puts "$result \n"
}
# Clear any potential errors
puts $TemporaryChannel "*CLS"
}
}
# Destroy temporary channel
close $TemporaryChannel
unset TemporaryChannel
}
# Destroy temporary resource manager
close $TemporaryResourceManagerId
unset TemporaryResourceManagerId
}
照会するデバイスのタイプを知る方法がないため、TCL 側でこれを防ぐ方法があるかどうか疑問に思っていました。スクリプトのいくつかの異なる場所で「update」と「update idletasks」を使用してみましたが、フリーズの間に少し時間がかかるだけです。
どんな助けでも大歓迎です。前もって感謝します!