実験装置の制御
ebilab.visa モジュールを用いることで、VISA対応の実験装置を制御できます。
以下のコードは、デジタルマルチメーターを用いて抵抗の測定を行なうサンプルです。
1# Sample of simple resistance measurement using new API
2
3import asyncio
4
5from ebilab.api import BaseExperiment, BasePlotter, FloatField, SelectField
6from ebilab.gui.controller import launch_gui
7from ebilab.visa import K34411A
8
9
10class SimpleResistanceMeasurement(BaseExperiment):
11 name = "simple-resistance"
12 columns = ["R"]
13
14 nplc = SelectField(
15 choices=["0.001", "0.002", "0.006", "0.02", "0.06", "0.2", "1", "2", "10", "100"],
16 default_index=1,
17 )
18 range = SelectField(
19 choices=["auto", "1E+2", "1E+3", "1E+4", "1E+5", "1E+6", "1E+7", "1E+8", "1E+9"],
20 default_index=5,
21 )
22 interval = FloatField(default=0.5, min=0.001, max=10.0)
23
24 async def setup(self):
25 self.logger.info("Connecting to multimeter...")
26 self.multimeter = K34411A()
27 self.logger.info("Connected to multimeter.")
28
29 async def steps(self):
30 while True:
31 r = self.multimeter.measure_resistance(range=self.range, nplc=self.nplc)
32 self.logger.info(f"Resistance: {r}")
33 yield {"R": r}
34 await asyncio.sleep(self.interval)
35
36 async def cleanup(self):
37 self.logger.info("Simple resistance measurement finished.")
38
39
40@SimpleResistanceMeasurement.register_plotter
41class SimpleResistancePlotter(BasePlotter):
42 name = "simple"
43
44 def setup(self):
45 if self.fig:
46 self._ax = self.fig.add_subplot(111)
47
48 def update(self, df):
49 if hasattr(self, "_ax") and not df.empty:
50 self._ax.clear()
51
52 self._ax.plot(df["t"], df["R"], "o-")
53 self._ax.set_xlabel("Time / s")
54 self._ax.set_ylabel("Resistance / Ohm")
55 self._ax.grid(True)
56
57
58if __name__ == "__main__":
59 launch_gui([SimpleResistanceMeasurement])
デバイスの接続
ebilab.visa モジュールに含まれる該当デバイスのクラスを import して使用します。
from ebilab.visa import K34411A
# 自動検出で接続
multimeter = K34411A()
クラスのインスタンスを初期化したタイミングで、自動的に接続されているデバイスを検出します。 デバイスを検出できなかった場合、例外が発生します。
アドレス指定による接続
同種のデバイスを複数台接続する場合や、自動検出が上手く動作しない場合は、
addr 引数でVISAアドレスを直接指定できます。
from ebilab.visa import K34411A
# アドレスを指定して接続
multimeter = K34411A(addr="USB0::0x2A8D::0x0101::MY12345678::INSTR")
デバイスアドレスの確認
接続後、 addr プロパティでデバイスのアドレスを確認できます。
multimeter = K34411A()
print(multimeter.addr) # 例: "USB0::0x2A8D::0x0101::MY12345678::INSTR"
サポートされているデバイス
現在サポートされているデバイスは以下の通りです。
クラス名 |
デバイス |
説明 |
|---|---|---|
Keysight 34411A |
デジタルマルチメーター |
|
Keysight 34465A |
デジタルマルチメーター |
|
Keysight E4980A/AL |
LCRメーター |
|
第一電子 A707 |
電源 |
注釈
デバイスの全ての操作が実装されているわけではありません。 サポートされていない操作が必要な場合は、 visa_write() や visa_query() を用いて直接SCPIコマンドを送信してください。
また、必要に応じて pyvisa_inst プロパティから直接 pyvisa のインスタンスにアクセスすることもできます。
さらに必要であれば、
VisaDevice を継承して
独自のデバイスクラスを作成できます。
独自デバイスの実装
サポートされていないデバイスを使用する場合は、 VisaDevice を
継承して独自のクラスを実装できます。
from ebilab.visa import VisaDevice
class MyDevice(VisaDevice):
# IDN応答の検証パターン(部分一致)
idn_pattern = r"MY_MANUFACTURER,MY_MODEL"
def _initialize(self, **kwargs: Any) -> None:
# SCPIコマンドを送信して初期設定
self.visa_write("*RST;*CLS")
self.visa_write("CONF:PARAM DEF")
def measure_something(self):
# SCPIコマンドを送信して結果を取得
return float(self.visa_query("MEAS:SOMETHING?"))
def set_parameter(self, value):
# SCPIコマンドを送信
self.visa_write(f"CONF:PARAM {value}")