Tektronix MSO/DPO 4000 Series を Python で動かす

古い機種ばっか使っていて知らなかったのですが、LAN port を備えた最近のオシロは、めちゃくちゃ簡単に使えるんですね。Baud rate とかも気にする必要なく、telnet 接続するだけで動きます。PySerial よりもずっと簡単。しかも新たに何も install しなくて良い。

Tektronix MSO/DPO 4000 Series の場合、次の Python code で一発です。XX.XX.XX.XX の箇所は実際の IP address (DHCP もしくは固定)、4000 は port 番号でこれが default の設定です。

>>> import telnetlib
>>> tel = telnetlib.Telnet('XX.XX.XX.XX', 4000)
>>> tel.write('*idn?\n')
>>> tel.read_until('\n\r')
'TEKTRONIX,MSO4054B,C010237,CF:91.1CT FV:v1.12 \n\r'

Python の標準 module である telnetlib を使えば、オシロの IP と port 番号を指定して command を送受信するだけです。telnetlib.Telnet.read_until() を使うことで、指定の delimiter が出現するまで読み出します。

こちらは socket module を使用する場合の例。

>>> import socket
>>> soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> soc.connect(('XX.XX.XX.XX', 4000))
>>> soc.send('*idn?\n')
>>> soc.recv(100000)
'TEKTRONIX,MSO4054B,C010237,CF:91.1CT FV:v1.12 \n\r'

(2011/11/10 追記) どちらでやっても、波形の data 点数が 5690 以上だと 'CURVE?' が正常に動作しません。VXI-11 だと動くのですが。

(2011/11/11 追記) Tektronix の日本語電話サポートの情報によると、raw socket での通信に以前から bug があり、転送がうまくいかないとのこと。Protocol を terminal mode にした場合は動作し (ただし binary 転送はうまくいかない)、None にした場合は一切応答しないはずとのこと。しかし、自分とこの環境では部分的には動作しているので、この情報と整合しない。