コンピュータ関連

Pythonでネットワーク経由のGPIB機器制御

Introduction

ネットワークとGPIB

GPIBは多くの計測器機に内蔵されている、汎用の制御バスである。GPIBを通じてコマンドを送ることで、リモートから測定を開始したり、得られたデータをダウンロードしたりできる。 従来、PCからGPIB機器を制御する場合、PC用のGPIBボードやUSB-GPIB変換ボックスを用いる。しかしこの方法では、PCと計測器機が物理的に近接している(GPIBケーブルの長さ程度)必要がある。また、使用するGPIBボードやボックスのドライバが使用するOS用に提供されていなければならない。そこで、このページではPrologix社製のGPIB-LAN変換Boxを用いて、TCP/IPネットワーク経由でGPIB機器を制御する方法について述べる。

この方法では、ネットワーク経由なので、制御PCと制御対象機器が物理的に近い必要はない。Ethernet-無線LAN変換器を使えば、測定器にネットワークケーブルが刺さっている必要すら無く、実験室内を自由に移動させられる。さらに、単なるTCP/IPなので、特別なドライバーが無くても、TCP/IPが使えるOSならば何でも使える。

Python

この方法でGPIB機器を制御するには、TCP/IP通信を行う必要がある。もっとも簡単な方法は、telnetを利用する方法であり、直接GPIBコマンドを送信することができる。もう少し複雑な制御を行ったり、大量のデータを受信したりする場合はプログラムを組む必要がある。TCP/IP通信ができればいいので、ほぼどのようなプログラミング言語を用いても問題ないが、このページでは、Pythonを利用した例を説明する。

Pythonを利用する理由は、(1)スクリプト言語であり、手軽に使える、(2)オブジェクト指向なので、見通しが良く、再利用性の高いコードが書ける、(3) ここで解説されているように、科学技術計算向けの拡張モジュールが充実しており、ダウンロードしたデータをすぐに加工したりプロットしたりできる、等である。Pythonは対話的な利用にも優れているため、Matlab的な使い方ができる。従って、Python上からGPIB機器が制御できれば、測定、データダウンロード、解析、プロットまでが一つの環境で行えることになる。

GPIB-Ethernet Converterの設定

Prologix製、GPIB-Ethernet Converter(以下GPIB Boxと呼ぶ)は、GPIBポートとEthernetポートを備えている。EthernetポートからTCP/IPの1234番ポートにアクセスすると、GPIB Boxに接続できる。 GPIB BoxのIPアドレスは、NetFinderというソフトで設定をする(http://prologix.biz/resources.phpからダウンロード可能)。このソフトはWindows用なので、IPの設定時にはWindowsが必要となる。
(坪野研のGPIB BoxはすでにIPアドレスが設定済みである。本体にIPアドレスを示すラベルが貼ってあるので、それを参照すること。)

IPアドレスを設定したら、GPIB Boxを制御したいGPIB機器に接続する。GPIBケーブルを使ってディジーチェーンすることも可能である。

基本コマンド

GPIB-Boxは、TCP/IPで送られてくるアスキー文字列のうち、++で始まらないものはそのままGPIB機器に転送する。++で始まるものは、GPIB Boxに対するコマンドとして解釈される。 ここでは、GPIB Boxに対する基本的なコマンドを説明する。詳しくはマニュアル(filePrologixGpibEthernetManual-1.pdf)を参照。

Pythonでのアクセス

PythonからGPIB Boxにアクセスするためのクラスを実装した。このクラスを使えば、PythonからGPIB Box経由で簡単にGPIB機器を制御できる。

インストール

filenetgpibdata.zipをダウンロードし、展開してできたディレクトリを適当な場所に置く。
環境変数PYTHONPATHに、上記ディレクトリを追加する。これで、Pythonからnetgpibモジュールが読み込み可能になる。
簡単なテストのためには、展開してできたディレクトリの中からpythonを起動すれば良い。

netGPIBクラスの使用方法

GPIB Boxにアクセスするには、netgpibモジュールを読み込む。

import netgpib

次に、GPIB Boxに接続する。

dev=netgpib.netGPIB('192.168.2.3',10)

この例では、IPアドレス192.168.2.3のGPIB Boxに接続された、GPIBアドレス10番の機器と通信を開始する。devは、netGPIBクラスのインスタンスで、このオブジェクトを通して、GPIB機器との通信を行う。

GPIBコマンドを送信するには、

dev.command('GPIBCOMM')

というように、commandメソッドを用いる。'GPIBCOMM'の部分をGPIBコマンドの文字列で置き換える。commandメソッドは、答えが返ってこないタイプのコマンドを送るのに使う。従って、コマンド送信後にGPIB機器はTALKモードに設定されない。もし、答えが返ってくる(Queryタイプの)コマンドをcommandメソッドで送った場合、以後の動作がおかしくなることがある。

何らかのデータが返されるようなコマンド(query)を送信するには、

answer=dev.query('GPIBQ',100)

とする。最初の引数は、GPIBコマンド文字列である。二番目の100という引数は、バッファサイズを指定する。デフォルトは100バイトである。ここにはGPIB機器から返されるデータを充分格納できるだけのサイズを指定しなければならない。受け取ったデータは、answerに代入される。

GPIB機器との通信を終了するには、

dev.close()

を実行する。

R9211クラス

netgpibdata.zipにはR9211というモジュールが含まれる。このモジュールは、AdvantestのサーボアナライザーR9211シリーズと、GPIB Boxを介して通信するためのクラスが含まれる。 (このクラスを利用するには、numpyモジュールが必要である。)

使用方法は以下のとおり。

import R9211

とした上で、

dev=R9211.R9211('192.168.2.3',8)

のように、接続を開く。最初の引数はIPアドレスで、次にGPIBアドレスを指定する点は、netGPIBクラスと同様である。

R9211クラスでは、netGPIBと同様に、command()やquery()メソッドが利用できる。 また、データを指定されたディスプレイからダウンロードするメソッドとして、getdata()というものが使える。

(data,hdr)=dev.getdata(disp=[1,2],verbose=1)

この例では、ディスプレイ番号1番と2番から、データをダウンロードする。verbose=1オプションを付けると、ダウンロードの進捗状況が表示される。dataは指定したディスプレイの 数と同じサイズを持つリストである。各要素は、(x,y)というTupleになっており、x,yはnumpy arrayである。x,y等の単位は、hdrに代入される。

現在のR9211の設定を取得したい場合は、

(cparams,dparams)=dev.getparams(disp=[1,2], verbose=1)

とする。cparamsとdparamsは、どちらも設定パラメータ値が入った辞書である。cparamsには、ディスプレイに依らない共通の設定値が入り、dparamsにはディスプレイ毎の設定値が入る。

取得したデータやパラメータをファイルに保存したい場合は、

mcol = dev.saveData('dataFileName.dat',data)
dev.saveParam('paramFileName.par',cparams, dparams, hdr, mcol, disp=[1,2])

というようにする。mcolは、データファイルがmulti columnで保存されたかどうかを示すフラグで、True or Falseである。これは、saveData()メソッドの戻り値である。 saveData()は、もしdataの各ディスプレイが同じ長さのデータを持っているときは、multi-column形式でテキストファイルに書き出す(各行に、全てのディスプレイのデータがx-data,y-dataの順番で並んでいる)。ディスプレイ間でデータ長が違う場合、このような形式では書き出せないので、x,y二列のデータを、ディスプレイ毎に順番に書き出していく(mcol=False)。

R9211では、startというGPIBコマンドを送ると、測定が始まる。測定中であるかどうかを調べるには、isAveraging()メソッドを使う。このメソッドの戻り値がTrueであれば、測定中である。測定終了まで待つには、waitAvg()メソッドを使う。

dev.command('start') #Start averaging
dev.isAveraging()  #Ask if it is still averaging
dev.waitAvg()  #Wait until the averaging is complete

R9211との接続を終了するには、

dev.close()

を実行する。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS