上司「ウチにあるスペアナなんだけど自動化できるかな?できるよね?(圧)」
上司「今度の検査で使うから」
上司「じゃ、頼んだわ」
ワイ「え?前にレンタルした奴じゃダメなんすか?」
ワイ「使用実績もありますけど」
上司「いや~あれ結構したんだよねえ~」
上司「あ、校正も出しといてね」
ワイ「へい…」
##今回の環境
###用意したもの
・PC(windows10)
・スペアナ (E4407B, Agilent)
・GPIB-USB変換ハブ (GPIB-USB-HS, NATIONAL INSTRUMENTS)
・資料を読み漁る根性
###使用技術
・GPIB
・Python(pyVisa)
・Google翻訳
##第一弾完成まで
ワイ「変換ハブのドライバをインストールして…おっっっも」
ワイ「スペアナ動かすのは公式でアプリかなんかあるやろ」1
ワイ「Agilent時代の機器だけどKeysightで探して…」
ワイ「あるやん!チョッロ!」
しかし…
ワイ「英語でよくわからんけどなんかアラートが出てるな…翻訳したろ」
アプリ「その機器には対応してへんで。すまんな」
ワイ「」
####機器が古すぎた
ワイ「公式だとアプリは出てなさそうやな」
ワイ「まあQiitaなら誰かしらやってるやろ」
ワイ「None…だと…」
####その後も検索して…
ワイ「Githubでスクショするだけのコードは見つけたで」2
ワイ「とりあえず上司に聞いてみるか」
上司「うーん、OK!」
上司「あと見づらいから白黒だけ反転させといてや」
ワイ「は?めんどくさ(おかのした)」
上司「え?」
ワイ「はい?」
###第一弾コード:機器画面のスクショ&色反転
import pyvisa
import tkinter
import tkinter.filedialog as fd
import datetime
from PIL import Image, ImageOps
rm = pyvisa.ResourceManager()
inst_1 = rm.open_resource("GPIB0::18::INSTR")
inst_1.timeout = 10000
print("connect")
inst_1.write(":MMEM:STOR:SCR 'R:PICTURE.GIF'")
capture = inst_1.query_binary_values(message=":MMEM:DATA? 'R:PICTURE.GIF'", container=list, datatype='c')
print("capture")
root = tkinter.Tk()
root.withdraw()
today = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
filename = fd.asksaveasfilename(filetypes=[("GIF", ".gif")], initialfile=today, defaultextension="gif")
with open(filename, 'wb') as fp:
for byte in capture:
fp.write(byte)
#色調を反転させる
img = Image.open(filename).convert('RGB')
im_inv = ImageOps.invert(img)
im_inv.save(filename, 'gif')
inst_1.write(":MMEM:DEL 'R:PICTURE.GIF'")
print("save")
inst_1.close()
rm.close()
ワイ「成し遂げたぜ」
#第二弾完成まで
ワイ「第一弾のコードじゃ物足りないねんな」
ワイ「csvデータが欲しい言われたら詰むし」
ワイ「せや!やれるようにしたろ!」
~以下はただの苦労話なのでそんなんいらんて人は第二弾コードまで飛んで、どうぞ~
ワイ「とりあえずpyVISA公式にそれっぽいのあるし試してみるか」3
ワイ「SPAN変更ヨシ!中心周波数取得ヨシ!マーカー取得ヨシ!」
ワイ「いけるやん!あとは電力一覧の取得や!」
ワイ「どうやってもタイムアウトになる………」
~数日後~
ワイ「どうやっても…でき…」
ワイ「ん?SCPI…?」4
ワイ「これや!」
###第二弾コード:電力値のトレース
import pyvisa
import matplotlib.pyplot as mp
import numpy as np
rm = pyvisa.ResourceManager()
inst_1 = rm.open_resource("GPIB0::18::INSTR")
inst_1.timeout = 10000
inst_1.write("*rst; status:preset; *cls")
inst_1.write("initiate")
inst_1.write(":FREQ:START 1000000; STOP 2000000")
pow = inst_1.query(":TRAC? TRACE1")
inst_1.close()
rm.close()
pow2 = list(map(np.double, pow.split(',')))
freq = np.arange(1.0*10**6, 2.0*10**6+1, 2500.0)
mp.grid()
mp.ylim(-100,0)
mp.plot(freq, pow2)
mp.show()
ワイ「なんかよくわからんけど録れたからヨシ!」
#終わりに
ワイ「最初からSCPIに行き着いてたらすぐ終わったんやなって」
ワイ「改めて見たら色んな所に書いてるわ」
ワイ「公式資料はよく読めってことやなあ…」5
#参考資料
・https://qiita.com/Yuziii/items/8e0437b33555647b0fc4
・SCPIコマンド集
・Agilent機器公式リファレンス
・E4407Bスクショコード