2008年5月5日月曜日

言い訳とお願い

ちょっと言い訳がましいことを

GPIB と これからの ctypes 使った IO.dll の内容はちょっとミスがあるかもしれません。タイプミスがあるかもしれません。というのも、自宅には GPIBな環境もないし、自宅PCはノートなのでプリンタポートが無いからです。

私は、企業に勤める身なので、会社で開発したソースを外に持ち出せません。それをすると、会社で給料をもらっている作業時間を外部に持ち出す、詐取行為になるからです。

そのため、ここで公開しているコードは、基本的に全て自宅で記憶を元に一からコーディングしているのですが、確認(ベリフィケイション)できているかというと、物理的に出来ないからです。自宅PC にはプリンタポートもGPIB環境も無いからです。

そこでお願いなのですが、もし確認できる環境にある人がいれば、タイプミスや不具合を報告して欲しいのです。会社から自分の(この)ブログにアクセスして確認することも出来るのですが、僕はまだ現職を失いたくないのでそれはしていません。勝手なお願いですが協力していただけると非常にありがたいです。

HandyMan

2008年5月4日日曜日

Python 効果的勉強方法

たまたま自分の都合で、Python を目的にしていますが、勉強するにあたり、資料が少なく、つまることも多いと思います。もちろんPython のマニュアルを読むこと、は、はじめにすることです、が。それでもつまった時、息抜きに他のオブジェクト指向言語やスクリプト言語の解説やチュートリアルを読むと、開けることがあります。

Ruby
チュートリアル とか Matlab の GettingStarted あたりを、ふと流すと、あ?これと同じことか!と目が開くこともままあります。同じ事を違う表現で書いてあるだけで容易に理解できるようになる、ことがあるからです。

私も、本当なら目的に最短の手段(言語)を使いたいのですが、環境(職場やライセンスフィー)がそれを許さないこともあり Python を選び勉強中ですが、「使えるモノは親でも使え!」※1 です。

それ以前にですが、日本で Ruby でなく Python 使う理由、他人を納得させられる理由、「同僚が使うのを嫌がるかもしれない」を越える理由、を考えてから Python を勉強し始めるべきですね。
「流行ってるから」「流行りそうだから」(笑 

でも、「楽しそうだから」は、、アリかも。

※1
あなたがコタツに入って紅白歌合戦を見ているとき、ミカンが食べたくなりました。
ミカンは食器棚の上、手が届きません。でもコタツから出たくありません。
そこに、父親がトイレから帰ってきました。
「お父さん、ミカンとってー」

2008年5月2日金曜日

CSVファイルの作成

Python file IO でCSV ファイルを出力する。
測定器からのデータなどを .CSV ファイルに書いてみます。
  1. 初期設定、現在時刻等を元にファイル名とかを決めます。
  2. Data というリストを、読み込みのバッファにします。
  3. ファイルを開きます。
  4. Data に測定器からのデータを入れます。
  5. Data をカンマを区切りにした文字列にしてファイルに書き込みます
  6. ファイルを閉じます
追記:標準 CSVモジュールを使った記事はこちら


##

from time import time, strftime, localtime

TimeStart = time()
NameTime = strftime('%Y%m%d_%H%M%S_', localtime(TimeStart))
NamePlant = r'test'
Ext1 = r'.csv'
Dlm = r','
CR = '\n'
Data = [0.0 for i in range(4)]


NameFile1 = NameTime + NamePlant + Ext1
print '\nFile name : ', NameFile1

FileOut1 = open(NameFile1,'w')
##FileOut1.write( CR )

## 1st sample
Data[0] = time()
Data[1] = 1.0 ## inst1.read
Data[2] = 1.5 ## inst2.read

FileOut1.write(str(Data[0])+ Dlm +
str(Data[1])+ Dlm +
str(Data[2])+ Dlm +
str(Data[3])+ Dlm +
CR)

## 2nd sample
Data[0] = time()
Data[1] = 2.0 ## inst1.read
Data[2] = 1.6 ## inst2.read

StrData = (str(Data[0])+ Dlm +
str(Data[1])+ Dlm +
str(Data[2])+ Dlm +
str(Data[3])+ Dlm +
CR)

FileOut1.write(StrData)


##FileOut1.write( CR )
FileOut1.close()

##raw_input()

2008年5月1日木曜日

PyVISA でGPIB測定器の制御 その1

機能確認編

前にも書きましたけど PyVISA を試すには VISA32.dll か相当のDLLが必要なので、NI か Agilent から入手してください。測定器を何か買うとそれ風の CD がついてきます。もちろん PyVISA もダウンロードしてインストールしてください。

Agilent の場合、 Agilent connection expert 14.0 という CDがあって、それを CDインストールすると、各種ファイルやツールがインストールされます。

ソフトを試す前に、PC と計測器が GPIBケーブルや、USB、シリアルケーブルで正しく接続され認識されているか確かめます。

Agilent の場合 Agilent IO control というツールが使えます。NI は なんたらSPY とかいうソフトだったと思います。それをつかって VISA リソースネームを調べます。ついでに VISA32.dll の場所やパスも分かると楽です。

では、
  1. PyVISA をインポートします。
  2. 周波数カウンターとマルチメータのVISAリソースを設定します。
  3. 周波数カウンターとマルチメータを初期化します。
  4. 測定値を読みます。
この .write .read だけで殆どの、取扱説明書にある C や QuickBasic のソースから Python に書き換えられると思います。遅いのは測定器の初期化の設定を変えたりコマンドを変えたりとかで高速化出来ます。私は、数年前の HP のデスクトップと USB-GPIB変換と 53132A 54401A でPython 使って 10Hz。分解能を犠牲にすれば 20-50Hz でサンプリングできてます。ここからは、測定器設定屋さんの腕の見せ所(笑)、Python とは違う話なのでやめておきます。

「スクリプト言語だから遅い」というのは昔の話で、YouTube の動画見れるくらいの PC なら Windows でも大丈夫です。

シリアルケーブルで、測定器を制御するには、測定器側の追加の設定も結構必要です。 Agilent IO control とか SPY ソフト?できちんと認識されるレベルまでセットアップしてから、自分のソフトを試しましょう。Agilent のマルチメータは、REMOTE コマンド送ってから1秒くらい sleep() 入れたらうまく動きました。



## $Id$
##
## Win32 (Win XP)
## Python2.5 (for win32)
## PyVISA1.1 (for win32 Python2.5)
##

from pyvisa.vpp43 import visa_library
visa_librery.load_library(r'c:\WINDOWS\system32\agvisa32.dll')
from visa import *
from time import time

## initialize
M1 = instrument('GPIB::22') # multimeter Agilent 34401A
C1 = instrument('GPIB::4') # counter Agilent 53132A

M1.write('*RST')
M1.write('*CLS')
M1.write('VOLT:DC:NPLC 1')
M1.write('VOLT:DC:RANG 10')

C1.write('*RST')
C1.write('*CLS')
C1.write(':FUNC "FREQ 1"')
C1.write(':FREQ:ARM:STAR:SOUR IMM')
C1.write(':FREQ:ARM:STOP:SOUR TIM')
C1.write(':FREQ:ARM:STOP:TIM 0.1')


## measure
M1.write('READ?')
print M1.read()
print time()

C1.write('READ?')
print C1.read()
print time()

raw_input()