2008年12月12日金曜日

Python 3K

あぁ、早く 2.6 に上げないと、と思っていたら。 3K のリリース。
いまのところ print () にするのと、多用してる raw_input() をなんとかすればよさそうなので、運用中の PC は、2.6 に上げて。開発用の自分の PC は 3K にしました。

まぁ、積み上げている資産も、そんなにありませんので、使うごとに確認しながらメンテしようと思っています。

GUI の方針を変更しました。Qt はやめにして、WxPython にします。
Wx にも簡単 GUI ビルダ が見つかったので。資料の豊かさ。メインストリームから離れすぎない、(いや、Python て時点で既に。。)ように Wx で進めます。

あと、Python 2.6 でも 3K 対応のコードの実行も大丈夫にするようなモジュール等が、あると思いますので探します。

2008年10月23日木曜日

ここの概要

対象読者
  • Python の「変な使い方」に興味がある方
  • PC による制御・計測・データ解析に興味がある方
  • PCのプログラムを「現実」の世界につなげたい方
  • 何もかも安く済ませたい方
  • 手早く実現したい方
  • ややこしいことが嫌いな方、不精な方
  • とりあえず今だけでも動けばいい、と納得できる方
  • 同業者、友達

問題と基本的対策方法の方針

パソコンを使っての制御や計測、データ解析を行うのですが。一つのことを実現するにも、たくさんの方法があります。いろいろな方法がある中で、私がとる(とりたい)方法は、極力、安く、できるだけ早く、統一された環境で、簡単に開発するです。そこで Python を中心に進めます。くどいようですが Ruby もいいと思います、でも私は、もう Python を始めてしまったので、どうしようもなく困るまで Python です。

安くする為に、LabView、AgilentVee、MatLab、等極力を使わず、でも彼らとのインターフェースを残すぐらい根性無しです。手早くする為に、VBA(Excel)、Cコンパイラ、Java 等を極力使わずに済ませようと思っています。OS も Linux では無く Win32 をベースに進める方針です。

たくさんの言語やシステムを覚えて使いこなす(必要はあるのですが)のを避けたいです。


言い訳


責任を取りたくないので、趣味のブログ、と逃げてます。
知識のレベルが低いので、常識外れの無茶なことをする(してる)かもしれません。
出来るだけ、何も追加で買ったりせず実現する方法を。のつもりですが、つい手元にある有償のモノを使うことがあります。これは手早くの一部なのです。すいません。

Web サイト、Web アプリ の開発とか、文字列や日本語の処理とか、GUI設計、まったく専門外です。
オブジェクト指向プログラミング?とかも、よく意味が分かってません。


ブログを始めた理由

どこのコミュニティーやメイリングリスト等ででも、私のしたいことは 「変」 なので仕方なく。。。自分で。

2008年10月16日木曜日

io.dll で Printer Port の読み込み

前に Python windows で ctypes と io.dll をつかって LPT Port に書き込みましたが、まだデータを読み込んでいませんでしたので、読み込んでみます。環境設定などは、前の記事を見てください。
読み込み自体はうまく行くのですが、表示を期待する形にするのにすこし手間がかかります。

プリンタポートの無い ノートパソコンでは実行しないでください。
プリンターポートのアドレス( 例では0x378)は、parmon.exe などを使って調べて、自分のパソコンのアドレスに合わせてください。
  1. ctypes をインポート
  2. io.dll の IsDriverInstalled という関数の答(1Bit の1か0)をもらって表示します。
  3. プリンターポートに 16進数で 55 の値を io.dll の PortOut 関数で書き込みます。
  4. 自分で書き込んだデータを io.dll の PortIn 関数で読み出します(8ビット)。
自分で「こう表示されるのだろう」と思う値と違う数が表示されるので、ちょっと途惑いますが、落ち着いて考えれば分かりますので、自分が期待する通りの表示になるように対策しましょう。

2.の問題は、1ビットのデータ、「1」の上位が全て 1詰めされて 数値上は -1。
8桁16進表示にすれば FFFFFFFF と 出るかと思うと、そこにも -1。
最下位ビットだけを ビット演算 And で取り出すとやっと思った結果に。

4.の問題は、8ビットだけのデータが欲しいのに上位に不要なデータが入ってるので思わぬ結果に。
16進表示にしても上位にどこから来たのか分からないデータが
16進表示の下二桁だけ表示すればいいかと思いましたが、またおかしい結果に
真面目に8ビットだけ and でマスクしてやっと希望の形になりました。

これは .dll が返す値のフォーマットと Python が受け取る(期待する)フォーマットの食い違いのせいです。本来 argなんとか、で極力合わせて使うべきなのでしょうが、つい(自分にとって)簡単な方向に流れがちで反省しています。将来の課題です。 argなんとか。。。

あぁ、ソースの折り返しがうまく出来てませんね。コピペして見てください。


#
# Win32 (XP)
# Python 2.5
# io.dll c:\windows\system32
#

from ctypes import *


a = 0 # initialize for test
a = windll.io.IsDriverInstalled()
print 'IsDriverInstalled ( decimal ) = ',a
print 'IsDriverInstalled ( 8 digits hex ?) = %(d)08X ' %{'d' :a}
print 'IsDriverInstalled ( 1 digit hex, masked ) = %(d)01X '%{'d' :a & 0x1}


port = 0x378
data_wr = 0x55
windll.io.PortOut(port,data_wr)
print 'PortOut ( 8 digits hex ) = %(d)08X ' %{'d' :data_wr}


data_rd = 0 # initialize for test
data_rd = windll.io.PortIn(port)
print 'PortIn ( decimal ) = ',data_rd
print 'PortIn ( 8 digits hex ) = %(d)08X ' %{'d' :data_rd}
print 'PortIn ( 2 digits hex ?) = %(d)02X ' %{'d' :data_rd}
print 'PortIn ( 2 digits hex, masked ) = %(d)02X '%{'d' :data_rd & 0xFF}

2008年9月26日金曜日

PyQt4 win32 環境設定

PyQt4 win32 環境設定

Windows XP
Python 2.5 (win32)



PyQt-Py2.5-gpl-4.4.3-1.exe (Riverbank)

をインストール(ダブルクリックするだけ)する、だけ。で、デモが動くので、うまく行ったのだと思います。
コンパイル済みの SIP も Qt(Trolltech) runtime も入ってるので、文字通り、Python 本体以外は、本当に全部込みのパッケージでした。コンパイルなどの作業はありません。

Example フォルダ tutrial の E1 から E12 は Trolltech の Qt 大砲ゲームの C++ を Win32 Python で書き直してあるので、最後の行をコメントアウトすると Idle でも、そのまま実行できます。
最後の行がなんかエラー起こす理由が分からないのは、ただただ、私の勉強不足ですね。

ドキュメントは Unix/Linux 用のまま、なので、そのまま打ち込んでも動かない例もあります。
sys OS とか、その辺のちがいは、このE1-E12 よく見るとなんとなく分かるような、分からないないような。


さて、PyQt4 に決めたのは、とりあえず手数を少なく「Init、Start、Abort」程度のボタンを持つ 小さい GUI を今作るには、一番近道だったので、そうしたのです。
たかがそれだけのために、改めて .NET framework を機嫌よく動いてる XP にインストールする気にもなれず WxPython は外しました。

でも将来本気で GUI カリカリ攻めたい人には wxPython の方がいいかもしれません。(いや、それ以前に Python より Ruby にすべきかもしれません)
Qt がライセンスで、もめてる間に市民権を得た wx の方が文献やネット上の資料も多いし。

それだけではなく Enthought Python も現状 wxPython です。勢いが違います。
まぁ、Qt wx 両方入れることも出来るでしょうから(想像)時間があるうちに、ちまちま試すつもりです。

充分楽しんだら、Enthought Python を買うと思います。
今はなんとか、個人で把握できてますが、近い将来バージョンあわせのパニックになるのは目に見えていますので。


追記: Qt やめて Wx にします。 .Net は Agilent の I/O 何とかをインストールした時点で自分の PC に入っているようでした。ごめんなさい。

2008年9月25日木曜日

PyQt4 参考文献

  • Rapid GUI Programming with Python and Qt

GUI を何らかの方法で、ということで、いろいろ考えましたが Qt にしました。PyQt4 で行きます。
追記:やめて WxPython にします

Free ebooks からダウンロードしました。広告多いです。
Windows, Python, Qt の環境設定の方法などが、事前に読めて助かりました。

すぐ切れるかも知れませんが、直リンク。きれたら消します。
http://knowfree.net/2008/02/29/rapid-gui-programming-with-python-and-qt.kf



SRA さんの Qt Whitepaper の日本語訳も助かります。

  • Qt 4.3 Whitepaper/日本語 PDF


気をつけないといけないのは、 多くのドキュメント、Help が
 Qt はC++ を前提にしている。
 QtPy も Linux を前提にしている。

その中から、Windows Python で Qt の情報をさがすのに手間がかかります。
自分が変なことをしようとしている、という認識を持って慎重に行きましょう。

2008年9月23日火曜日

Python から ctypes で .dll を使う

ctypes で .dll を使う

Python でプリンターポートを制御する方法、その2
io.dll という、プリンターポートを制御するダイナミックリンクライブラリ、を Python から利用して LPT ポートの各信号を制御します。
もちろん Windows XP です。

Python2.5 の標準 ctypes モジュールを使います。
2.4 以前の Python から使うには win32all を別途インストールして ctypes モジュールを用意します。

io.dllGeekhideout からダウンロードして \windows\system32 のフォルダにコピーします。

動作確認、とアドレスの確認のために 同じく Geekhideout から parmon.exe をダウンロードして実行します。parmon.exe と以下の Python コードは同時に実行できます。シリアルポートと違って緩いようです。

事前に parmon.exe を実行して、parmon からパラレルポートのアドレスをもらいます、自分の目で読みます。parmon.exe に表示されている 16進数のプリンターポートのアドレスをそのまま利用して動作確認をします。

サンプルのコードは
  1. ctypes モジュールをインポート
  2. port にプリンターポートのアドレスを 16進数で設定(0x:ゼロエックス) 378 は parmon で表示された私のPCのプリンターポートのアドレスです。
  3. data にデータを 16進数で設定(0x) 00 (ゼロゼロ) で D0-D7 を全て Low レベルに
  4. ctypes の windll で IO.dll の PortOut を使い 2. のport(ポート) に 3.のdata(データ)を出力します。
  5. 書き込んだ値を表示(10進)
  6. キー待ち、で一時停止

-------

from ctypes import *

port = 0x378 # in Hex, 0x3BC
data = 0x00 # in Hex, 0xAA 0x55 0xFF

windll.io.PortOut(port,data)
print 'data = ',data

raw_input()

-------

data を適当に AA とか 55 とかにも変えて、parmon.exe で状態が変わるのを見て下さい。
io.dll の使い方(下のほう)に、 C から呼び出すサンプルとか VB から使うサンプルがあります。
PortOut 以外にも PortIn とか色々あって便利です。

真面目に使うには、データタイプをあわせる (argなんとか) とか、あるらしいのですが ctypes は上手にこなしてくれるので任せます。これは Windows だけの特権だそうです。うれしいかぎりです。

データの読み込みを行うと、下位 8bit の上にどこから来たの分からないデータがありますので、ビット演算でマスクすると使いやすいデータになります。こんな方法で本当にいいのか、は分かりません。。。


この方法で、Km2Net さんの USB-IO を バケさんの vbausbio.dll を利用して制御すること、等も出来そうです。買って確かめたら、報告します。

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()

2008年4月29日火曜日

Visa.dll

そもそも Visa とななにか? Google 願います。クレジットカードではありませんが、そっちの方がバンバンヒットするかもしれません、Powered by Python みたいなもんで、探すのが嫌になります、が。

pyVISA は visa の dll を使うための便利なインターフェースを提供するだけで基本は dll を使います。多分。また、ラッパーとか ライブラリ とか com サーバーとか、、、いろいろな的確な言葉があるらしいですが、 windows プログラマではないので、私は言葉がまったく理解できていません。

GP-IB とは、測定器を制御するインターフェースの規格で、まぁ Ether net みたいな、各レイヤーの仕様を規定したものです、と思います。。。計測が専門で無い人には、訳の分からない言葉がいっぱい出てきます SICL とか SCPI とか。我慢してください。わたしがソフトのドキュメントを見ても同じようなことを感じます、し、がまんしてこうしてがんばってますので。Visa は、まぁもうちょっと仮想化というか抽象化するための通信規格と思います。多分。

Visa は、一応規格なのですが、各社の解釈や、後方互換性のために独自の機能も含まれます。2大サプライヤーは、Agilent(HP) と National Instruments(NI)です。これが微妙に違うのが問題です。先のケーブルの問題とかもここで吸収しようとするので厄介です。

Visa を Windows PC で扱うときに、なにか、環境変数とか、ファイル名とかをシェア、いや取り合う、互いに上書きしあう?ので面倒なことが起こりがちです。不安なときには、自分の会社がどちらよりのシステムなのか、システム管理者に問い合わせてください(笑)知る分けないですよね。

とりあえず、先輩(得意?)が Agilent派 か NI派 か分かれば、あわせましょう。変に刃向かって違うのをインストールすると、後で仕事が増えるだけです。

GP-IB 機器を制御するには、HP Quick Basic(Agilent) とか Visual Basic 、 C を使うのがメジャーなようです。サンプルコードがいっぱい見つかります。低水準言語です。

「もっと簡単なのないの?」ここから商売が始まります「ありますとも、Agilent(HP) Vee Pro」 「いえいえ、これからは labVIEWですよ!」学生さんとお試し版はもちろんフリーです!とMatlab か Ms-office みたいなことを言い出します。「Pythonですか?(商売にならなくなるので)サポートしてません」とも。。

横道にそれましたが、わたしも会社の都合で Agilent 派、ということでAgilent IO Libraries Suite 14.0 を言われるがまま CDインストール。これでagvisa.dll が適当にインストールされます。注意書きにもあるように、先ずソフトをインストールしてから測定器をつなぎましょう。

近い将来 NI-DAQmx を使うおもちゃ(NI)が手に入りそうなので、ひょっとするとそちらもフォローできるかもしれません。

2008年4月28日月曜日

GPIB シリアルケーブル Agilent

これから、visa.dll と pyVisa を使った計測器制御に行く前に
「agilent comunicating serial」
「agilent comunicating rs232」
で google 願います。

結論から言うと、Agilent (HP)のクロスケーブルは、変態ケーブル です。
クロスオーバーとか ヌルモデムケーブルを自称してますが、クロスオーバー なのにCD と RI が1:1でつながってますので気をつけましょう。これをつながないと機能しないので、市販のケーブルでは、agirent(HP) の機器を制御できません。HP200LXに添付されるケーブルも このHP変態ケーブルです。

pyVisa を試すにあたって、わざわざ PCI カードや USB アダプタを用意できる幸せな人はともかく、、、ちゃちゃっと機能だけシリアルケーブルで試すか、な、などと思いついた人が、きっちりはまってしまう落とし穴です、ここ。

----------
ついでに、RS-232C tips

ネジがマイナスならインチネジ、プラスなら(あまり無いけど産業用機器にたまにある)はミリネジです。

ピンが出てるのは、PC側、DTE機器。
メスは DCE機器。でも、そんなの無視してる評価ボードとか多数あります。とーてもはづかしいでつ。

ケーブルも両端が同じならクロス。これ、外人が居る時はちゃんとクロスオーバーと最後まで言いましょうね、宗教的にクロスだけでは「十字架」になるので嫌な感じになるそうです。基本は、両端が違うコネクタならストレートです、が、半田付けできる人がいる会社や、変態ケーブルを売ってる会社もあるので気をつけましょう。

D(DB)コネクタは、多極なので、オスメスで、ピン番号が入れ替わります、本当に、本気で「見て」 pin番号を確認しましょー

2008年4月23日水曜日

+5V電源 from PC

電子工作2本目!PCから 5V、まぁ普通のアイデアですね。


Posted by Picasa

古いノートPCやデスクトップから 5V!これ、結構気に入ってます(笑 探せば転がってますよね、コレ

Posted by Picasa

2008年4月22日火曜日

データの型、リスト

データの型、リスト

2008/05/02 修正 この記事間違ってます。
変数は変更できます。チュートリアル電卓編の 変数_(アンダースコア)とごっちゃになってます。
変数にオブジェクトを代入すると思わぬ結果になるそうです。オブジェクトのリファレンス先が変更されたとき、、この辺から脳が活動停止してますが、そのうち分かるように。なれるといいんですが。。。
どう間違えたかも、記録のうちなので、本文はそのままで恥をさらし続けます。

最後の方の、リストの初期化の仕方、これは危ないそうです。
>>> Data = [0.0] *6

典型的な Python になれてない人がよくする間違いだそうで、私もはまりました。
Data = [0.0 for i in range(6)]

で個々に初期化する方がいい、とありましたので、次からそうします。
2008/05/02



データタイプについて、今まで変数だけを使っていました、(自分的には、、)そういえば、変数は変更してはいけないというのを思い出しました。
A=1 とか一度した上に、A=2 とか代入してはいけないそうです。変数は不変性オブジェクト(棒読み)<くどいですね、なので変更してはいけないとか、居心地悪いですね。

と、チュートリアルの一番初めのほうにありました。変数を変えてはいけない?じゃあ何が変数よ?定数やんかそれ?ともあれ、後で変更するデータや数値は ’リスト’ とかいうデータの型が好ましいそうです。今までのソース、全部?書き換えが必要ですねー、しませんけど。でもこれからの分には、反映します、気がつく限り。

では、何が不変で何が可変か?初期値は参照するだけなので定数(変数)でいいとしましょう。いい?。可変データは、プログラム中、外の世界からもらってくるデータ。大抵、.read とか .get とか .in とかなんかそんなもの。 COM ポートのPIN のステイタスとか、受信データ、測定データのバッファにするような Data とかはリストにすべきなようです。

リストをつかうには [ ] を使います。
Data[] となれば Data は、変数でなくてリストになります、[]の中にはリストの番地を入れて呼んだり、内容を書いて書き込んだりできるみたいです。別に1つのデータでもいいので、一つのときは[0]番地だけを使うようなりストを作りましょう。

リストを使うには、何らかの形で(初期値を入れるとか)リストであることをPython に伝えないといけません。

>>> ListTest[3] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[3] = 0.0
NameError: name 'ListTest' is not defined


教科書では、初期値を代入するラインから始まっていますが、これでリストを初期化しているのです。
.append()を使って大きさを変えることも出来るので、空のリストを作ってもいいです。いいんですか?(笑

>>> ListTest =[]
>>> ListTest
[]
>>> ListTest[3] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[3] = 0.0
IndexError: list assignment index out of range

あせってはいけません。

>>> ListTest[0]

Traceback (most recent call last):
File "", line 1, in
ListTest[0]
IndexError: list index out of range

ええっ?

>>> ListTest[0] = 0.0

Traceback (most recent call last):
File "", line 1, in
ListTest[0] = 0.0
IndexError: list assignment index out of range

なんですと?
ここで[0] が指すのは1番地、1 のリストですが、「空のリスト」は、0 のリスト、かなり嫌な雰囲気です。
上等な技はスカッと忘れて1個だけのリストを初期化しましょう。

>>> Data = [0.0]
>>> Data
[0.0]
>>> Data[0]
0.0
>>> Data[0] =1.25
>>> Data[0]
1.25
>>> Data[3] =2.3

Traceback (most recent call last):
File "", line 1, in
Data[3] =2.3
IndexError: list assignment index out of range


Data だけだとリストを全体を示す[]がついてくるので、値を引用するには [] のなかに番地を入れましょう。では、6個のリストを初期化しましょう。

>>> Data = [0.0] *6 ## < これはよく無いやりかた、別の↑方法がいいらしいです。
>>> Data
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
>>> Data[0]
0.0
>>> Data[3] = 2.5
>>> Data
[0.0, 0.0, 0.0, 2.5, 0.0, 0.0]
>>> Data[3]
2.5
>>>

番地で内容を呼べるので、for ループとかにも使えそうでまぁ、ちょっと便利そうです。

2008年4月21日月曜日

pyParallel で プリンタポートの制御

ちょっと脇にそれますが pyParallel で、プリンターポートを制御する例を。

pyParallelは、正式リリース版では無いので、自分が大切だと思う用途には使わないほうがいいと思います。
現に私の PC でも動作は、不安定で、動くことがあったとおもうと、動かなくなったりします。
今は動かないので、以下のコードは、動いていたときに確認したつもりですが。最終的に未確認です。

pyParallel が利用する simpleio.dll が windows にはじかれているようです。
この問題をどうにかする為に、私は、比較的(私の環境で)安定して動いている IO.dll を ctypes から利用することにしました。
これはまた後ほど。

LPT ポートの制御プログラムの確認には、同じく GeekHideoutParmon.exe を使っています。
プリンターポートのベースアドレスの値も、この Parmon からもらっています。

Java の更新のせいかリンクとか、うまく機能しないので、うまく動くようになったら本文修正します。

-------- Not checked ----------


import parallel

Par = parallel.Parallel()

Par.setData(0xAA)

Par.setDataStrobe(1)
Par.setAutoFeed(0)
Par.setInitOut(1)
Par.setSelect(0)

a = Par.getInError()
print a
a = Par.getInSelected()
print a
a = Par.getInPaperOut()
print a
a = Par.getInAcknowledge()
print a
a = Par.getInBusy()
print a

2008年4月20日日曜日

Com ポートの制御、その2 マイコンとの通信

RS-232C ポートを pySerial で制御してマイコンと通信してみましょう。

ループバックと違い、いろいろなことを考えないといけません。
通信する相手に手元にある activecell さん の GP232 をターゲットにします。

もともと、GPIBの測定器を古いノートPCで制御するに買いました。とても気に入って使っています。
付属のCD-Rには、丁寧なマニュアルとVB(Excel)による制御ソフトがついていて非常にありがたいです。これを、ADコンバータ入力、PWM出力モードにして Python + pySerialから制御してみましょう。思い出しましたが、このGP232 をもっと使い込みたいというのも Python を勉強するきっかけでした。ありがとうございます。

取り扱い説明書、および Visual Basic のコードに細かく丁寧な説明があるので、詳細はそちらを参照してください。

おおまかに

  1.  COMポートの設定
  2.  DTR を マイナスに、GP232 アダプタにマイナス電源を供給する。
  3.  RTS を、0、1 リセットする
  4.  I コマンドで通信確認を兼ねてファームのバージョンを読み込む35文字あるけど10文字だけ読んで残りは受信バッファーから消す
  5.  アダプターを AD読み込みモードにする
  6.  ボーレートを 9600 から 115200に変更する
  7.  Iコマンドで再度通信確認
  8.  Gコマンドで A/D データを読み込む(3回)
  9.  PコマンドでPWM出力を設定する
  10.  ボーレートを115200 から 9600に変更する
  11.  PコマンドでPWM出力を設定する

デスクトップPCで確認したときは、かなり早い GP-232 でしたが、自宅のノート + USB シリアルで確認すると遅くなりました。これは GP-232のせいではなく USB Serial アダプタのせいだと思われます。 Activecell さんもそのあたり いろいろトラブルが在った様で、同サイトに USB-Serial に関する情報も豊富です。わたしの自宅の USB-Serial adapter は、不運なことに1秒に1回しか反応しない、だめなアダプタのようです。

デスクトップでもある程度スリープが必要な UART コントローラもありますので各自 sleep() を入れる場所と(値)のチューニングをしてください、

-


## $Id$
##
## Win32 (Win XP)
## Python 2.5
## Python2.5 (for win32)
## Pywin32 210 (for win32 Python2.5)
## pySerial 2.2 (for win32 Python2.5)


import serial
from time import sleep, time

ser = serial.Serial(
port = 0, ## COM1 = 0, COM2 = 1, ...
baudrate = 9600,
parity = serial.PARITY_NONE,
bytesize = serial.EIGHTBITS,
stopbits = serial.STOPBITS_ONE,
timeout = 2.0, ## Sec
)

ser.open()

## Initialize Adapter
ser.setDTR(0) # Minus : Supply minus volts
ser.setRTS(0) # Minus : Reset
sleep(0.1)
ser.setRTS(1) # Plus :
sleep(0.1)
ser.flushInput()
ser.flushOutput()

## check Firmware
ser.write('I')
Data = ser.read(10) # (35)
print Data
sleep(0.1)
ser.flushInput()

## set Adapter mode
ser.write('A')
Data = ser.read(2) #
print Data

## change BaudRate
ser.write('B5')
sleep(0.1)
ser.setBaudrate(115200)
print ' ... Change baudrate from 9600 to 115200 '

## check Firmware
ser.write('I')
Data = ser.read(10) # (35)
print Data
sleep(0.1)
ser.flushInput()

## read AD values
ser.write('G')
Data = ser.read(20)
print time(),Data

ser.write('G')
Data = ser.read(20)
print time(),Data

ser.write('G')
Data = ser.read(20)
print time(),Data

## wrire PWM values
ser.flushInput()
ser.write('P10FF') # ch1 = 25%
print ser.read(2)

ser.flushInput()
ser.write('P22FF') # ch2 = 75%
print ser.read(2)

raw_input(' Check duty cycle and press Enter > ' )

## change BaudRate
ser.write('B0')
sleep(0.1)
ser.setBaudrate(9600)
print ' ... Change baudrate from 115200 to 9600 '


## wrire PWM values
Ch = '1'
Duty = 70.0
ser.flushInput()
ser.write('P%(c)s%(d)03X' %{'c':Ch,'d':Duty/99 *0x3FF })
print ser.read(2)

Ch = '2'
Duty = 30.0
ser.flushInput()
ser.write('P%(c)s%(d)03X' %{'c':Ch,'d':Duty/99 *0x3FF })
print ser.read(2)


raw_input(' Check duty cycle and press Enter > ' )
ser.close()





2008年4月18日金曜日

タイマー(その2)

データ収集用ソフトウェアタイマー

タイマーが time ライブラリモジュールの sleep() だけでは寂しいので、よくある要求
「1秒ごとに、3分間のデータを収集する」
というようなことをするためのプログラム。
ソフトウェアトリガーなので、タイムタグは目安程度

  1. 収集する時間を分でセットする TimeMeasurementMinutes
  2. 収集間隔を秒でセットする TimePeriod
  3. 関連する何かを初期化する
  4. while で目的の終了時刻まで処理を続ける
  5. If で収集時刻になったら測定とかデータ収集をする
  6. 終了時刻になったら終わる

本気でやるときには、ハードウェアによる外部トリガを使った方がいいです。また、外部トリガーによるデータ収集の場合でも、この時刻タグの情報(安定度もPCクロックに依存します)を信用して処理に使うとひどい目にあうので、何か工夫しましょう。最高のリアルタイム OS を使っていても mSec の量子化誤差は覚悟してください。


-------------


## Win32 (WinXP)
## Python2.5 (for win32)

from time import time

TimeMeasurementMinutes = 0.02 # in Minute
TimePeriod = 0.1 # Sec
NumberData = 1 # set initial velue

## initializetion

TimeStart = time()

while time() < TimeStart + TimeMeasurementMinutes * 60 :
if time() > TimeStart + TimePeriod * NumberData :
NumberData = NumberData +1
print time()

## measurements

print '\n Done!'

## termination

Python のコードをHTMLに変換する

Python のソース、スクリプトファイル Something.py を Something.html に変換する。
当面不満な部分だけの変換です。まだまだ試してないことだらけです。

Python がインストールされているなら、この .py ファイルを目的のフォルダにコピーしてダブルクリック。Something.py のファイル名だけ Something を(拡張子なし)を入力すると同じファイル名の Something.html ファイルが出来ます。開くのが楽なように拡張子を .txt に変更するには、Extention3 を Extention2 に変更すると Something.txt ファイルになります。なんか大文字小文字を区別して無いようです。ちょっと便利です(苦笑
  1. 目的のファイル名をキーボードから取得します
  2. ファイル名.py のファイルを開き、シーケンス文字列に読み込みます
  3. 必要な変換、文字列の置き換えをします
  4. ついでにヘッダーとフッターも決めておきます
  5. ファイル名.html を開いて、ヘッダー、テキスト、フッターの順で書き込み閉じます
3.の部分が非常に恥ずかしいです。まだ、タプルとかライブラリとか、よく分かって無いんですよね。シーケンス文字列が書き換えできないことだけは、やっと分かりました。
不変性オブジェクト(棒読み)と言うらしいです。


いいんです!今やりたいことだけできれば! < 逆切れ


本気でやりたい人は、バイナリエディタ Stirlig とか使うと、みっちり勉強できます。Extention1 = '.c' とかも、試す値打ちがあるかも、かなり無責任ですけどね。

----- in progress、not fixed -------


## $Id$
## win32
## Python2.5

Extention1 = '.py'
Extention2 = '.txt'
Extention3 = '.html'

NameFile = raw_input('File name? > ')

FileSour = open( NameFile+ Extention1,'r')
TextIn = FileSour.read()
FileSour.close()

##print TextIn

TextOut4 = TextIn.replace(r'&',r'&amp;')
TextOut3 = TextOut4.replace(r'>',r'&gt;')
TextOut2 = TextOut3.replace(r'<',r'&lt;')
TextOut1 = TextOut2.expandtabs(4)
TextOut = TextOut1

HtmlHeader = r'<P><div class="verbatim"><pre>'
HtmlFooter = r'</pre></div>'

FileDest = open(NameFile+ Extention3, 'w')
FileDest.write( HtmlHeader+ '\n'+
TextOut+ '\n'+
HtmlFooter)
FileDest.close()


2008年4月17日木曜日

Python コードを記事にするには???

タイマー(その2) 中止して、日記

タイマーが time ライブラリモジュールの sleep() だけでは寂しいので、よくある要求
「1秒ごとに、3分間のデータを収集する」
というようなことをするためのプログラム。
ソフトウェアトリガーなので、タイムタグは目安程度。

  1. 収集する時間を分でセットする TimeMeasurementMinutes
  2. 収集間隔を秒でセットする TimePeriod
  3. 関連する何かを初期化する
  4. while で目的の終了時刻まで処理を続ける
  5. If で収集時刻になったら測定とかデータ収集をする
  6. 終了時刻になったら終わる
日本Pythonユーザ会(PyJUG) のオンラインドキュメントみたいにインデントが壊れないように、丸ごとコピペしても、IDLE でちゃんと動くように期待して。前後をなんか同じタグで囲ってみました。

 --- 中止!保留! ---

駄目ですねー。Blogger のAuto Save がかかるたびに、TAB スペースやら If 節が消されてしまいました???? スクリプトをブログの記事にするってのに、なにやら根本的な問題があるのかもしれません。HTML のタグを書けないような、エスケープなんとかとか、詳しくないんですよね。。。
やっぱりきちんと、Python コード HTML 変換とか使わないといけないのでしょうか。。。
探したんですけどね、こんな検索キーワードでは見つからないんですよ。「Python HTML変換」 なんて、ねぇ(笑

py2html とか? ちょっと win32 ユーザーは、相手にされてない臭いを感じるんですよね。。。気のせいですか?それにあの派手なカラーリング好きじゃないし。。。

面倒なんです。いえ、そっち方面のプログラム、かなり苦手なんです。。。だからこっちにいるんです!
こんな苦労話聞きたくないでしょ?こんなことさっさと片付けて次に行きたいのに。

Blogger でうまく投稿できなかった Pythonのコード例
あ! < とか > がまずいんだわ、これ。HTMLコードの自動補完かなにか、多分
今日はもう寝ます。

20080418 追記 別記事で挑戦

---- It does not work ----

## Win32 (WinXP)
## Python2.5 (for win32)

from time import time

TimeMeasurementMinutes = 0.02 # in Minute
TimePeriod = 0.1 # Sec
TimeStart = time()
NumberData = 1 # set initial velue
## initializetion

(ここらへんから下で使ってるタブスペース全部消える, <が 勝手に <>に変換されてる?)
while time() <> TimeStart + TimePeriod * NumberData :

(while time() < TimeStart + TimeMeasurementMinutes * 60 : )
( if time() > TimeStart + TimePeriod * NumberData : )


(以下3行元は tab 2個)
NumberData = NumberData +1  
print time() 
## measurements


print '\n Done!'
## termination

2008年4月16日水曜日

Com ポートの制御、その1

pySerial 使って Serial port を制御する。

Win32 + Python で RS-232C ポートを制御するには、(くどいですが) 標準の Python 2.5(win32) に加えてPywin32 と pySerial ライブラリモジュールの追加インストールが必要です。
作業は、これでほとんどの終わりで、あとは書いて試すだけです。

他のターミナルソフト や 確認用ドングル で、実験する COM port のCOM番号を確認します。
port = 0, の値は、確認したCOMの値 -1 、 COM1 なら (-1して)、0 にします。
タイムアウトの値は秒。駄目そうなことが自分で分かる程度、むっとする程度で、きれない程度の秒。

  1. COMポートの設定。
  2. Tx-Rxループの確認、文字を \n 付きで送信する。 readline() で \n まで受信する。
  3. オープンの端子(CD、RI)を読んだ値が、どうなるのか確認しておく。
  4. RTS-CTS ループを確認する。
  5. DTR-DSR ループを確認する。
  6. 4と5 を反転して、もう一度。

確認用折り返しドングルを外し、同じ事をする。

USB serial などで、折り返し確認がうまく行かないときは、
 setXX() と getXX()の間に、time モジュール(標準)の sleep(0.1)
程度入れてみるのも手です。

これで PonyProg みたいなのを自分で作ってみたり。。。とか。。。まだ無理?

あぁ、Tab使ったインデントが壊れてます。これからやばいですねー、なにか対策を考えないと。
まぁ、まだしばらくは、大丈夫なのですが(笑

-----------------

## Win32 (WinXP)
## Python2.5 (for win32)
## Pywin32 210 (for win32 Python2.5)
## pySerial 2.2 (for win32 Python2.5)

import serial

ser = serial.Serial(
port = 0, ## COM1 = 0, COM2 = 1, ...
baudrate = 9600,
parity = serial.PARITY_NONE,
bytesize = serial.EIGHTBITS,
stopbits = serial.STOPBITS_ONE,
timeout = 1, ## Sec
)

ser.open()

## Tx - Rx loop
ser.write('Hi!\n')
LineData = ser.readline()
print 'Rx : ', LineData

## Open pins
RI = ser.getRI()
CD = ser.getCD()

print 'Open RI : ',RI
print 'Open CD : ',CD

## RTS CTS loop
ser.setRTS(1) # Plus
CTS = ser.getCTS()
print 'Set RTS(1) then CTS : ',CTS

## DTR DSR loop
ser.setDTR(0) # Minus
DSR = ser.getDSR()
print 'Set DTR(0) then DSR : ',DSR

## RTS CTS loop
ser.setRTS(0) # Minus
CTS = ser.getCTS()
print 'Set RTS(0) then CTS : ',CTS

## DTR DSR loop
ser.setDTR(1) # Plus
DSR = ser.getDSR()
print 'Set DTR(1) then DSR : ',DSR

ser.close()
##raw_input()

---------------
確認用ドングル が付いているとき。

Rx : Hi!

Open RI : False
Open CD : False
Set RTS(1) then CTS : True
Set DTR(0) then DSR : False
Set RTS(0) then CTS : False
Set DTR(1) then DSR : True
>>>

---------------
確認用ドングル なし、受信タイムアウト (に設定した秒) 後に表示されます。

Rx :
Open RI : False
Open CD : False
Set RTS(1) then CTS : False
Set DTR(0) then DSR : False
Set RTS(0) then CTS : False
Set DTR(1) then DSR : False
>>>

2008年4月15日火曜日

module の確認

Python には、Python をインストールしただけで付いてくる ’標準ライブラリモジュール’ と必要に応じて自分でインストールする必要がある、 ’非標準のライブラリ モジュール’ があります。
Dos の 内部コマンドと外部コマンドみたいな < あ、無視してください。

Windows と Python で シリアルポートの制御、プリンターポートの制御、GP-IBの測定器の制御をしよう!(喜!)というのは、ちょっと、かなり、、、なので、、、標準以外のライブラリモジュールのインストールが必要になります。

Linux でないので(苦笑) 細かいことをするには、Pywin32 ライブラリモジュールが必要です。
Win32all とかとも呼ばれてます。
当面、シリアルポートを制御するのに pySerial ライブラリモジュールが必要です。

そろそろライブラリモジュールと書くのが面倒になってきました。
標準でついてくるのには、モジュール。(time とか)
後付けにするのは、ライブラリ。(serial とか)と呼んでいいですか?
両方ライブラリモジュールなのですが。。。

pySerial の動作確認をしようとしたところ、自宅 PC の Python に pySerial ライブラリ が入ってないことに気がつきました。。。orz

で、ついでなので、設定した環境に必要なモジュールが入っているか確認しましょう。

IDLE (Python shell、Python GUI) で serial ライブラリが入ってるか確認する為に
import serial と打ち込むと
--------
>>> import serial

Traceback (most recent call last):
File "", line 1, in
import serial
ImportError: No module named serial
--------
う、これ、なんか、明らかにだめです。怒られてる雰囲気が満々です。

引き続き、ctypes モジュールが入ってるか確認する為に
import ctypes と打ち込むと。。。何事も無いかのように、これは OK です、多分。(Python2.5 なので)
---------
>>> import ctypes
>>>

-------
あと、ターミナルソフトですが、TeraTerm のほかに、RTS-CTS、DTR-DSR確認用、男子用() 、「あくのりっち」というデバッグ、ターミナルソフトもありますので、pySerial の動作確認には、こちらも是非ご検討ください。

2008年4月14日月曜日

時刻、時間、タイマー

データ収集やハードの制御を主な目的に考えると。Python のデータの型とか以前に、時間とか時刻がどんな風に扱えるのか気になります。

タイムタグとしての時刻は、timeモジュール time() で取れます。
値は、1970年1月1日からの秒数、だとか。計算も出来ます。経過時間 ElapsedTime を計算してみました。

localtime() を使って、ほっとする時刻にできます。
strftime() を使い表示を整形すると、もっとリラックスできます。

Win32 + Python で一番簡単に使えるタイマー は、Time モジュールの sleep() が楽です。
Threading モジュールは、、まだ全然使いこなせてません。
精度は、まぁ、こんなもんでしょう。

やっと Python ですね。う、、いくらなんでも。。。そ、そのうち何とかします。ていうか、良い方法教えてください、色づけスクリプトとか、コピペできる方法とか。。。
最後のところは、おまけです、気にしないで下さい。
---------

from time import time, sleep, strftime, localtime

TimeNow = time()
print TimeNow

TimeConverted = localtime(TimeNow)
print TimeConverted

Strings = strftime('%Y/%m/%d %H:%M:%S', TimeConverted)
print Strings

print strftime('%Y-%m-%d %H:%M:%S', localtime(TimeNow))

print '\n One moment please. \n'

TimeStart = time()
sleep(1.20)
TimeEnd = time()

print strftime('Started from : %Y-%m-%d %H:%M:%S', localtime(TimeStart))
print strftime('Terminated in : %Y-%m-%d %H:%M:%S', localtime(TimeEnd))

TimeElapsed = TimeEnd - TimeStart

print 'Elapsed time (Sec) : ', TimeElapsed

## --- appendix ---

NameTime = strftime('%Y%m%d_%H%M%S_', localtime(TimeStart))
NamePlant = 'test'
Extention1 = '.csv'

Filename = NameTime + NamePlant + Extention1
print '\nFile name : ', Filename

##raw_input()

2008年4月13日日曜日

Python 参考文献1

何もかも自分で思いついたわけではないですよ、ね、もちろん。

「初めてのPython 第2版」オライリー・ジャパン、オーム社
ISBN4-87311-210-9

やっぱし、紙の文献って助かります。ありがとうございます!
これは、1本目の記事に、恥じない、うれしい。

2008年4月12日土曜日

Com ポート確認用リターンケーブル

RS-232C のCOMポート番号とか機能の確認用折り返しケーブル(ドングル?)

pySerial から始めようと思いましたが、動作確認するのに何か無いと面白くないのでこれを。
これが電子工作1本目ですか。。。

シリアルポートを操作するソフトの動作確認は、ちょっと面倒です、もう一台 PC 用意したり、ケーブルでつないだり、それなりのソフト別に用意したり。とか。また、間違ったりすることもしょっちゅう。
COM1とCOM2を市販のクロスケーブルで繋ぐのもいいアイデアです。COM1実験ソフト、COM2確認用ターミナルソフトとか。

--------
D-sub(D) 9pin メス(F) 半田付け用のコネクタに、配線を3本半田付けします。

3 pin(TxD) ---- 2 Pin(RxD)
7 pin(RTS) ---- 8 pin(CTS)
4 pin(DTR) ---- 6 pin(DSR)
1 pin(CD)
9 pin(RI)
5 pin(GND)


後ろから見たところです。CD や RI の機能も確認したいなら、4pin(DTR)とかから接続するといいかもしれません。ピン番号は、コネクタをよーく見ると、ちゃんと数字が書いてあります。

将来のトラブルを減らすために、シェルに納めます。

使い方はこんな感じです。

これを使いたいCOMポートに接続して、自分のソフトの機能確認をします。自分でソフトを組む前に、確実な方法で、自分のソフト以外の部分を確かめておくのは、いい習慣です。

特にCOM番号は落とし穴です、古いノートPCだと COM1 が赤外線通信ポートとかに割り当てられてることもあります。

Windowsのアクセサリ、通信、ハイパーターミナルなら、プロパティで、COM1とか選んで、電話のボタンをクリックして、なにかキーを押すと画面に押したキーが表示されます。

k って押しても k と表示されなければ、何かが違います。このドングルの機能を確認するには(あああ?)、ローカルエコーを有効にしてはいけません。

通信やるなら TeraTerm とか、つかいましょ。その時は、TCP/IP ではなく Serial から起動してくださいね。

2008年4月11日金曜日

Python で GPIB や ハードを制御する環境

Windows XP (Win32)と  Python で 
 GP-IB測定器を制御する環境。
 ハードウェアを制御する環境。
ハード制御といっても COM (RS-232C)ポート やら LPT(プリンタ)ポートいじる程度。

日本語データを扱うとか、その辺は切り捨てる。人生を楽にする為に。

順に
  1. Windows XP (Win32)
  2. Agilent IO Libraries Suite 14.0  :GPIB 制御するのに VISA.DLL を何か。
  3. Python 2.5   
  4. pyWin32  : pySerial 動かすのとか Python 2.5 以前のには ctypes  
  5. PyVISA 1.3 win32 : GPIB測定器制御するのに
  6. pySerial 2.2 win32 :シリアルポートの制御に
  7. io.dll を Geek Hideout から : ctypes の実験を兼ねて、プリンターポートの制御。
またゆっくり リンク先とか整備しますね。当面は、 Google にて
ほとんど SourceForge.net にあります。

インストール した Python のバージョンと OS の種類をあわせましょ。

2008年4月10日木曜日

VB から Python script を実行する

初投稿がこれですか。。。
Visual Basic から Python のスクリプトを実行させる。
フルパスで書く。

Call Shell("c:\python25\python.exe c:\test\tool\test.py")