en ja

システム構成

本構成は、OWON XDM1000/XDM1241 系デジタルマルチメータを Python から制御するための構成である。低レベル SCPI 層、測定器として扱う上位制御層、長時間測定用 worker、FastAPI/ese774_frame 公開層を分離する。

ファイル構成

xdm1000/
├── config.py
├── xdm1000_scpi.py
├── xdm1000_ctrl.py
├── xdm1000_worker.py
└── server_fastapi/
    ├── spec.py
    ├── models/
    │   └── common.py
    ├── routers/
    │   └── xdm1000_router.py
    └── clients/
        ├── sync_xdm1000_client.py
        └── async_xdm1000_client.py

レイヤ構成

User code / example
        │
        ▼
Xdm1000Ctrl
        │
        ├── use_process=False
        │       └── Xdm1000Scpi を同一プロセスで直接使用
        │
        └── use_process=True
                ├── Parent Process
                │   ├── command queue
                │   ├── response queue
                │   ├── shared state
                │   ├── result store
                │   └── stop event
                │
                └── Worker Process
                    └── Xdm1000Scpi
                        └── pyserial.Serial

ローカル利用

ローカル利用では Xdm1000Ctrl を直接生成する。

from xdm1000.xdm1000_ctrl import Xdm1000Ctrl


dmm = Xdm1000Ctrl(port="/dev/cu.usbserial-10", use_process=True)
try:
    print(dmm.idn())
    result = dmm.meas_voltage_dc()
    print(result)
finally:
    dmm.close()

SCPI 直接利用

低レベル確認では Xdm1000Scpi を直接使う。

from xdm1000.xdm1000_scpi import Xdm1000Scpi


dmm = Xdm1000Scpi(port="/dev/cu.usbserial-10")
try:
    print(dmm.idn())
    dmm.configure_voltage_dc("AUTO")
    dmm.set_rate("F")
    print(dmm.meas_main())
finally:
    dmm.close()

FastAPI 利用

FastAPI 利用では、Xdm1000Ctrl をサーバー側のデバイス実体として生成し、server_fastapi/spec.py の xdm1000_api_spec に定義された API だけを公開する。xdm1000_ctrl.py は FastAPI に依存しない。

設定

config.py は Config クラスを提供する。YAML を渡した場合は YAML の値がインスタンス属性として設定される。SCPI/ctrl の通信パラメータでは config がコンストラクタ引数より優先される。

主な設定値は次である。

PORT: "/dev/cu.usbserial-10"
BAUDRATE: 115200
TIMEOUT: 2.0
LOGGER_LEVEL: "debug"
SERVER_HOST: "127.0.0.1"
SERVER_PORT: 8000