このページではPDS5022というDSO(Digital Storage Oscilloscope)のファイルフォーマットを解説しています。 元ネタはOWON製デジタルオシロスコープ PDS5022を買ってみた。 というページの"オシロのバイナリデータの解析"というところです。 残念なことにこの有用なWebサイトは既に消えています(上記リンクはアーカイブページです)。
このオシロスコープは比較的安価なタイプです。
僕が買ったのはPDS5022SというSTN液晶を搭載したタイプで、秋月で3万1千円でした。
現在はPDS5022Tというタイプで、
これはTFT液晶を搭載したモデルです。
15年06月10日現在で、このモデルは3万400円で売っています。
すでにディスコンマークがついていますが、あと160台くらい有るようなので、しばらくは買えると思います。
このオシロは購入時期によって機能に差がありますが、CH1とCH2の簡単な演算(四則演算程度)や、FFT解析等を行うことが出来ます。 新品のオシロスコープとしては最安値のクラスだと思いますが、ちょっとしたアナログ回路には十分な性能だと思います (デジタル回路には使いづらいですが、デジタル回路を見れるオシロは値段が2桁くらい違いますしね)。
このオシロは低価格ということもあり、プロトコル解析などは出来ません。 が、USBでPCに接続することが出来、メーカー配布のソフトウェアを使用することによりバイナリファイルとして保存することが出来ます。 バイナリファイルから波形ファイルに変換してしまえば、あとは波形を適当な閾値でデジタル値に変換し、プロトコル解析を行うことが出来ます。
以下には独自解釈が含まれます。 解釈において不都合が生じた場合は適時解釈を変更してください。
ADDRESS | LENGTH | 内容 |
0x00000000 | 6 | "SPBV01" ファイルフォーマット種別?(うしろ2文字はバージョン?) |
0x00000001 | ||
0x00000002 | ||
0x00000003 | ||
0x00000004 | ||
0x00000005 | ||
0x00000006 | 4 | UINT32 ファイル長 |
0x00000007 | ||
0x00000008 | ||
0x00000009 |
4文字の"SPBV"と2文字の数字?
ヘッダや波形を含めたデータサイズ。
ADDRESS | LENGTH | 内容 |
0x00000000 | 3 | "CHn" チャンネル1 or チャンネル2を識別するための文字列 "CH1","CH2"のどちらか |
0x00000001 | ||
0x00000002 | ||
0x00000003 | 4 | UINT32 データバイナリ長 この長さに3バイト(Ch識別文字列分)を足した長さが実際のデータ長 |
0x00000004 | ||
0x00000005 | ||
0x00000006 | ||
0x00000007 | 4 | UINT32 波形データ長 波形データの数を示す |
0x00000008 | ||
0x00000009 | ||
0x0000000A | ||
0x0000000B | 4 |
UINT32 波形データ長 波形データの数を示す(オフセット0x7と同じデータ?) |
0x0000000C | ||
0x0000000D | ||
0x0000000E | ||
0x0000000F | ||
0x00000010 | ||
0x00000011 | ||
0x00000012 | ||
0x00000013 | 1 | UINT8(列挙型からのキャスト) 時間軸 |
0x00000014 | ||
0x00000015 | ||
0x00000016 | ||
0x00000017 | 4 | INT32 表示オフセット量 |
0x00000018 | ||
0x00000019 | ||
0x0000001A | ||
0x0000001B | 1 | UINT8(列挙型からのキャスト) 電圧軸 |
0x0000001C | ||
0x0000001D | ||
0x0000001E | ||
0x0000001F | 1 | UINT8(列挙型からのキャスト) プローブのレンジ |
0x00000020 | ||
0x00000021 | ||
0x00000022 | ||
0x00000023 | ||
0x00000024 | ||
0x00000025 | ||
0x00000026 | ||
0x00000027 | ||
0x00000028 | ||
0x00000029 | ||
0x0000002A | ||
0x0000002B | ||
0x0000002C | ||
0x0000002D | ||
0x0000002E | ||
0x0000002F | ||
0x00000030 | ||
0x00000031 | ||
0x00000032 | ||
0x00000033 | 波形データ長 * 2 | INT16 波形RAWデータ |
この3文字でチャンネルを識別します。 date[0x00000002]から0x30(ASCII'0')を引いて数値とすることも出来ます。 文字列の配列長が3ですから、数値への変換でも複数桁数を気にする必要はないはずです。
波形データ本体の長さです。
この数値に3を足すと正確な長さになります。
例えばCH1のデータ長が12,548の場合、CH1の絶対位置は0x0000000Aですから、
CH2の絶対位置は12548と3を足して0x00003111となります。
CH2のデータ長も12,548の場合、0x0000000A+(3+12548)+(3+12548)で、CH2の次の位置は0x00006218になります。
しかし、ヘッダのファイル長には0x00006218と書いてあり、差は0ですから、残りのデータは存在しないとわかります。
波形データのサンプル数です。 波形データはINT16型なので、実際のデータサイズは 波形データ長 * 2 となります。
オシロスコープで選択した時間軸の列挙型です。
5ns = 0, 10ns, 25ns, 50ns, 100ns, 250ns, 500ns, 1us, 2.5us, 5us, 10us, 25us, 50us, 100us, 250us, 500us, 1ms, 2.5ms, 5ms, 10ms, 25ms, 50ms, 100ms, 250ms, 500ms, 1s, 2.5s, 5s, 10s, 25s, 50s, 100s,
値に0.04を掛けた積がオフセット電圧[V]。 0xFFFFFFB5の場合値は-75なので、オフセット量は-3Vとなり、画面の中心から下に3V分移動した場所が0Vとなる。
オシロスコープで選択した電圧軸の列挙型です。
5mV = 1, 10mV, 20mV, 50mV, 100mV, 200mV, 500mV, 1V, 2V, 5V,
電圧軸はプローブレンジに応じて修正する必要があります。 プローブがx1ならそのまま使用できますが、x10なら10倍に、x1000なら1000倍にする必要があります。
プローブレンジの列挙型です。
x1 = 0, x10, x100, x1000,
何らかの不具合を発見した場合や、改善点・変更リクエストは 青猫(@rian_y)までご連絡ください。