Linux Ubuntu

Linux + Python で VISA/SCPI を使った機器制御

投稿日:

Linux から LAN/USB/Serial/GPIB をインターフェースとして、
VISA/SCPI で機器制御を行うためのメモ。
今回は試した周りの環境・制約から OS はUbuntu。

以前は NIVISA を使って C/C++ でコーディング的なことをした気もするが、
NIVISA Linux版 は辛うじて v17 が iso 直リンクでアクセスできるものの、
それ以降は更新されていません。(Windows版は現時点でv19.5 が公開されている)

今回は言語環境も勢いのある python から
NIVISA に依存せずに機器制御を行えるようにする。
 


 

基本環境作り

python で専用の環境を作っておく。
python は anaconda を使っているので、

この環境に色々突っ込んでいく。

pyvisa は python の VISA フロントエンド。
上記のNIVISAを扱うこともできるが、
今回は pyvisa-py をバックエンドとして用いる。
pyvisa-py は Serial/USB/TCPIP(LAN)/GPIB をインタフェースとして扱えるが、
実際に通信を行うには、各インタフェース毎に多少の設定なり準備が必要になる。

オプションで、この仮想環境を jupyter で使いたいなら、

とかすると、 jupyter kernelspec list で環境がインストールされているのが確認できる。
あとはブラウザの画面で Kernel -> Change Kernel から
display-name で設定した名前の kernel を選べば、
import visa などが通るようになる。

Google Adsense



GPIB による制御

今回は Agilent(Keysight) 8508A Vector Voltmeter を、
Agilent 82357B (USB-GPIB インタフェース) を用いて制御する。
まずは、lsusb で上記が見えていることを確認。
 

linux-gpib

linux kernel 5.3 でも動く最新の 4.3.0 をダウンロード
適当に展開して、中身の kernel, user ビルド、インストール。
前者は kernel module, 後者は gpib_config など。
"user" は ./configure sysconfdir=/etc とかしておくと、
後で gpib_config が /etc/gpib.conf を見に行ってくれる。
私はテスト時にこれを省略したため、/usr/local/etc 下を見に行っていて、
気づくまで少し時間が掛かった。

作業ログに、/usr/local/lib/libgpib.so.0 に向かって /lib からリンクを貼れと書いてある。
恐らく共通アカウントの LD_LIBRARY_PATH に /usr/local/lib が入っておらず、
gpib_conf が同ライブラリを見つけられなかったのだろう。
 

firmware binary

古いが最新の gpib_firmware-2008-08-10.tar.gz をダウンロード, 展開するだけ。
後述の fxload でロードする firmware binary。
 

fxload

これもダウンロードして、適当にビルド。

load kernel modules

/lib/modules/[kernel version]/gpib 下にある。
その場所まで行って、

/etc/gpib.conf

コレ をそのまま使わせてもらった。

Google Adsense



gpib周りの仕上げ

/etc/gpib.conf を見に行かせる、libgpib を見つけさせるのは前述の通り。

Agilent 82357b を認識させる

82357b を刺す。
この時点では赤の "FAIL" LED が点灯している。
lsusb をして busID, deviceID を調べる
(ex: Bus 002 Device 005: ID 0957:0518 Agilent Technologies, Inc.)
上記の busID, deviceID を指定して、先程用意した binary firmware を fxload する。
sudo fxload -D /dev/bus/usb/002/005  -t fx2 -I path/to/firmware/measat_releaseX1.8.hex
この時点でまだ "FAIL" は点いたまま。
もう一度 lsusb をして busID, deviceID を調べる。
(大体 deviceID が一つ増えている模様)
(ex: Bus 002 Device 006: ID 0957:0518 Agilent Technologies, Inc.)
sudo fxload -D /dev/bus/usb/002/006 -t fx2 -I path/to/firmware/measat_releaseX1.8.hex
これで、緑の "READY" LED のみが点灯するはず。
 

簡易テスト

GPIB 周りの確認

ibtest と打って, "d, [address]" とか続けて機器とやりとりできているか確認。
コケたら GPIB 周りのセットアップに失敗。
 

pyVISA 周りの確認

pyvisa-info と打って、Backends: -> py: -> "GPIB INSTR" の出力を見る。
"Available via Linux GPIB" とかなってたら成功。
"No module named ‘gpib’" とかなってたら失敗。
私は最初試した時に後者になった。
libgpib 関連が /usr/local/pythonx.x/site-packages/ 以下にできていたのが原因。
ビルド時に anaconda の仮想環境外になっていたのかもしれない。
私は python のバージョンも近く、面倒だったので、
/usr/local/pythonx.x/site-packages/ 下の
Gpib.py, gpib.cpython~.so, gpib~.egg-info に向かって、
anaconda/env/[env-name]/lib/pythonx.x/site-packages/下からリンクを貼った。

Google Adsense



python で動作確認

みたいな感じで、GPIB経由で機器をハンドルできるようになる。
 

参考

USB による制御

上記 GPIB を使えるようになっている状態でも、
pyvisa-info の Backends: -> py: -> USB INSTR の項をみると、
pyUSBを入れろとかになっていて、USB経由ではハンドルできない。

上とは別の機会に、Agilent 33461A に USB でアクセスした時の追記。
 

pyUSB を追加

Google Adsense



USBの権限を修正

この時点で pyVISA から list_resources() とかしても、
以下のような警告が出て、見つけてはいても正しく認識されない。

Found a device whose serial number cannot be read.
The partial VISA resource name is: USB0::xxxx::xxxx::???::0::INSTR

結論からいうと、USBアクセスの権限が足りないためのようで、
以下のスクリプトを実行すると治る。

スクリプトの中を書き下すと、以下のようなことをやっている。

私は、/etc/udev/rules.d/99-ni_usb_gpib.rules というファイルがあったので、
これに自分で書き加えました。
これで list_resources() で正しい名前が表示されて、
open_resource([name]) で機器にアクセスできるようになる。

もし駄目だったら、sudo service udev restart とかしてもいいかもしれない。
 

参考

Google Adsense

Google Adsense

-Linux, Ubuntu
-, ,

Copyright© HEPtech, 2024 All Rights Reserved.