KeysightのEDUX1052Gのプログラママニュアルには、Pythonの例文が掲載されているので、ある程度参考にはなるのだが、Pyvisaではないようなのでそのまま走らせるわけにはいかないようだ。
他にも参考になりそうなサイトをググってみると、USBメモリにSAVEしたファイルを転送するものはあったが、そのまま読み込む例文は、なかなかみつからなかった。
下記のテクトロのユーザーフォーラムの中に例文があった、
https://forum.tek.com/viewtopic.php?f=580&t=138613
下記の様な記述がありシンプルなので、これをパクらせてもらった。
scope.write("HARDCopy STARt")
imgData = scope.read_raw()
# Generate a filename based on the current Date & Time
dt = datetime.now()
fileName = dt.strftime("%Y%m%d_%H%M%S.png")
imgFile = open(fileSaveLocation + fileName, "wb")
imgFile.write(imgData)
imgFile.close()
テクトロ用なので、ハードコピーのコマンドを変えればOKだ。
また、ファイル名の時間は、Secだけでは足りないので、us単位までファイル名にすることにした。秒以下の記述もググってみたがなかなか見つからなかった。
%f:usオーダーをつけたいときに使用する。
%Y%m%d_%H%M%S%f このように書かなくてはいけないようだ。
テクトロのサンプルをまねても、どうしてもPNGとして読み込めないので、バイナリEDTORで見てみると、#800xxxxxの10Byteのデータが先頭に、#8から始まるByte数を表すデータがついてきてしまうようなのだ。仕方がないので、
Len_sDisplay = inst.read_bytes(10)
こいつを前に挿入して、先に10Byte読み込ませてから、PNGのデータを読ませることにした。
100Mを超えることはないので、特にByte数を認識させる仕組みにはしなかった。
こうすることで、PNGファイルとして読み込めるようになった。
しかし、問題はほかにもある。
PNGとして認識するのはよいのだが、SAVEしたファイルは、上部に例外なくRemote Operation Completedの表示がついてしまう。
マニュアルを見た限りでは、これを消す手法はなさそうだ。
SINGLEコマンドを送って、*OPC?で同期をとっているつもりだったが、*OPC?で1が返ってきてからSLEEP(4)を入れて、なんとか、Remote Operation Completedの表示の入らない画像を得ることができるようになった。
インターフェース経由でも、画像取得には、約2.1秒かかることが分かった。
オシロスコープ本体にUSBメモリを差して、USBメモリにSAVEしても、あまりSAVEにかかる時間は変わらないようだ。逆にちょっと高速で1.9秒間隔でSAVEできた。
しかし、USBにSAVEするのでも、やはりRemote Operation Completedの表示が入ってしまうことが分かった。
この辺の癖はメーカに聞かないとわからないそうだ。
しかし、Python素人の自分が、とりあえず画像取得もできるようになったので、今後の生かせそうだ。下記は、Raspberrypiのプログラムだ。
import pyvisa as visa
import time
from datetime import datetime
from time import sleep
#SAVE interval=2.1ec in this instrument EDUX1052G
rm = visa.ResourceManager('@py')
address="TCPIP::192.168.1.1::inst0::INSTR"
inst = rm.open_resource(address)
print(inst.query("*idn?"))
inst.write("SAVE:IMAGE:FORMAT PNG")
i=0
for i in range(10): #10 times loop
inst.write("single")
print(inst.query("*OPC?"))
sleep(4) #escapw for display "remote operation cmplete" at least 4sec sleep time
dt=datetime.now()
filename = dt.strftime("/home/pi/WAVECH1_%Y%m%d_%H%M%S%f.png")
inst.write("DISPlay:DATA? PNG, color")
Len_sDisplay = inst.read_bytes(10) #Read preamble 10Bytes "#800xxxxxx" first
sDisplay=inst.read_raw()
f = open(filename,"wb")
f.write(sDisplay)
print(inst.query("*OPC?"))
f.close()#8から始まるByte数を表すデータがついてきてしまうようなのだ。
print("Screen image written to "+filename)
inst.close()
rm.close()
そして、こちらが、USBメモリにSAVEするプログラム。
こちらの肝は、ファイル名の指定を'SAVE:IMAGE:START の後に指定しないと、定型のファイル名の上書きになってしまうことだ。
また、指定しなくても定型のファイル名で、サフィックスの数字がカウントアップされず、同じファイル名のままになってしまうので、リモート制御の場合は、必ずファイル名を指定しなければいけないようだ。
これに気付くにもけっこう時間をとられた。
import pyvisa as visa
import time
from datetime import datetime
from time import sleep
#SAVE interval=2.3Sec in this instrument EDUX1052G
rm = visa.ResourceManager('@py')
address="TCPIP::192.168.1.1::inst0::INSTR"
inst = rm.open_resource(address)
print(inst.query("*idn?"))
#inst.write("recall:setup 2")
#inst.write(":WGEN:FREQuency 1000")
inst.write("SAVE:IMAGE:FORMAT PNG")
i=0
for i in range(10):
inst.write("single")
print(inst.query("*OPC?"))
dt=datetime.now()
filename = dt.strftime('"WAVECH1_%Y%m%d_%H%M%S%f.png"')
cmd='SAVE:IMAGE:START '+filename
print(cmd)
inst.write(cmd)
print(inst.query("*OPC?"))
inst.close()
rm.close()