測定器の遠隔制御がわからん！を解決した


上司「ウチにあるスペアナなんだけど自動化できるかな？できるよね？（圧）」
上司「今度の検査で使うから」
上司「じゃ、頼んだわ」

ワイ「え？前にレンタルした奴じゃダメなんすか？」
ワイ「使用実績もありますけど」

上司「いや～あれ結構したんだよねえ～」
上司「あ、校正も出しといてね」

ワイ「へい…」

##今回の環境
###用意したもの
・PC（windows10）
・スペアナ (E4407B, Agilent)
・GPIB-USB変換ハブ (GPIB-USB-HS, NATIONAL INSTRUMENTS)
・資料を読み漁る根性

###使用技術
・GPIB
・Python(pyVisa)
・Google翻訳

##第一弾完成まで


ワイ「変換ハブのドライバをインストールして…おっっっも」
ワイ「スペアナ動かすのは公式でアプリかなんかあるやろ」[^1]
ワイ「Agilent時代の機器だけどKeysightで探して…」
ワイ「あるやん！チョッロ！」

しかし…

ワイ「英語でよくわからんけどなんかアラートが出てるな…翻訳したろ」

アプリ「その機器には対応してへんで。すまんな」

ワイ「」

####機器が古すぎた

ワイ「公式だとアプリは出てなさそうやな」
ワイ「まあQiitaなら誰かしらやってるやろ」
ワイ「None…だと…」

####その後も検索して…

ワイ「Githubでスクショするだけのコードは見つけたで」[^2]
ワイ「とりあえず上司に聞いてみるか」

上司「うーん、OK!」
上司「あと見づらいから白黒だけ反転させといてや」

ワイ「は？めんどくさ（おかのした）」

上司「え？」

ワイ「はい？」

###第一弾コード：機器画面のスクショ＆色反転

```python:prtscr_E4407B.py
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]

ワイ「これや！」

###第二弾コード：電力値のトレース

```python:Trace_E4407B.py
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コマンド集](https://www.ivifoundation.org/docs/scpi-99.pdf)
・[Agilent機器公式リファレンス](http://anlage.umd.edu/Microwave%20Measurements%20for%20Personal%20Web%20Site/E4401-90507.pdf)
・[E4407Bスクショコード](https://github.com/angry-dad/E4407B-GPIB-Screen-Capture)

[^1]: アドバンテストは有情です
[^2]: [E4407B pyvisa] でググったら出てきました。 最初からやれや
[^3]: [pyVISA User guide](https://pyvisa.readthedocs.io/en/latest/introduction/index.html)
[^4]: Standard Commands for Programmable Instruments 言語。機器によって対応バージョンが違い、E4407BはSCPI-1997に対応しているようです
[^5]: 今回一番の学び