TCL スクリプトを使用して、Tektronix の RIBinary 形式で Tektronix オシロスコープからデータを取得しています。次に、スクリプト内でそれを 10 進数値に変換する必要があります。
そもそも私はバイナリ変換をほとんど行っていませんが、私の意見では、このバイナリ形式に関するドキュメントも非常に曖昧です。とにかく、これが私の現在のコードです:
proc ::Scope::CaptureWaveform {VisaAlias Channel} {
# Apply scope settings
::VISA::Write $VisaAlias "*WAI"
::VISA::Write $VisaAlias "DATa:STARt 1"
::VISA::Write $VisaAlias "DATa:STOP 4000"
::VISA::Write $VisaAlias "DATa:ENCdg RIBinary"
::VISA::Write $VisaAlias "DATa:SOUrce $Channel"
# Download waveform
set RIBinaryWaveform [::VISA::Query $VisaAlias "CURVe?"]
# Parse out leading label from scope output
set RIBinaryWaveform [string range $RIBinaryWaveform 11 end]
# Convert binary data to a binary string usable by TCL
binary scan $RIBinaryWaveform "I*" TCLBinaryWaveform
set TCLBinaryWaveform
# Convert binary data to list
}
ここで、このコードはマシンから次のデータを取得します。
-1064723993 -486674282 50109321 -6337556 70678 8459972 143470359 1046714383 1082560884 1042711231 1074910212 1057300801 1061457453 1079313832 1066305613 1059935120 1068139252 1066053580 1065228329 1062213553
これは、通常の ASCII データを取得したときにマシンが取得するものです (つまり、上記のデータが変換後にどのように見えるか):
-1064723968 -486674272 50109320 -6337556 70678 8459972 143470352 1046714368 1082560896 1042711232 1074910208 1057300800 1061457472 1079313792 1066305600 1059935104 1068139264 1066053568 1065228352 1062213568
最後に、Tektronix の RIBinary 仕様への参照を次に示します。これは標準のデータ型ではないと思うためです。
http://www.tek.com/support/faqs/how-binary-data-represented-tektronix-oscilloscopes
データの変換の詳細については、Tektronix の Web サイトでしばらく探していましたが、上記の URL しか見つかりませんでしたが、さらに情報が見つかった場合は、この投稿にコメントするか編集します。役に立つかもしれません。
アップデート
- 回答は必ずしも TCL である必要はありません。誰かがこれを高レベルで論理的に処理するのを手伝ってくれるなら、TCLの詳細をハッシュ化できます(これは他の人にも役立つと思います)
- データをバイナリで転送し、後で変換する必要があるのは、最適化のためです。このため、プロセスが遅くなるため、転送前にデバイスに変換を実行させることはできません。
- コードを少し更新したところ、結果は実際の結果に非常に近いものになりました。もともとデータに含まれていたカンマと関係があるのではないかと思います。
- 以下は、解析なしでデバイスから送信された生データの例です。
- @kostix からの提案で、彼がくれたコードを使用して 2 つ目のスクリプトを作成し、それを自分のデータ セットに合わせて変更しました。以下に表示されますが、結果は上記のコードとまったく同じです。
ASCIi
:
:CURVE -1064723968,-486674272,50109320,-6337556,70678,8459972,143470352,1046714368,1082560896,1042711232,1074910208,1057300800,1061457472,1079313792,1066305600,1059935104,1068139264,1066053568,1065228352,1062213568
RIBinary:
:CURVE #280ÀçâýðüÿKì
RIBinary に関する注意 - 「:CURVE #280」はすべて、解析する必要があるヘッダーの一部ですが、#280 の部分は、収集しているデータによって異なる場合があります。#280 の意味に関する Tektronix からの詳細情報を次に示します。
ブロックはバイナリ形式の波形データです。波形は次のようにフォーマットされます。 # は y バイトの数です。たとえば、if = 500 の場合、= 3 です。チェックサムを含めて転送するバイト数です。
つまり、現在のデータ セット x = 2 および yyy = 80 です。バイナリ データの変換に慣れていないので、ブロック形式を処理するためにプログラムで何をすればよいかわかりません。
@kostix からの提案で、データ セットに合わせて変更したコードを使用して 2 つ目のスクリプトを作成しました。
set RIBinaryWaveform [::VISA::Query ${VisaAlias} "CURVe?"]
binary scan $RIBinaryWaveform a8a curv nbytes
encoding convertfrom ascii ${curv}
scan $nbytes %u n
set n
set headerlen [expr {$n + 9}]
binary scan $RIBinaryWaveform @9a$n nbytes
scan $nbytes %u n
set n
set numints [expr {$n / 4}]
binary scan $RIBinaryWaveform @${headerlen}I${numints} data
set data
このコードの出力は、上で提供したコードと同じです。