実験装置の制御

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"

サポートされているデバイス

現在サポートされているデバイスは以下の通りです。

クラス名

デバイス

説明

K34411A

Keysight 34411A

デジタルマルチメーター

K34465A

Keysight 34465A

デジタルマルチメーター

E4980

Keysight E4980A/AL

LCRメーター

A707

第一電子 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}")