2019年4月20日土曜日

macOS MojaveでmakeしたときにFrameworkが探せなくなった<解決済み>

十年近く使ってきた測定用のmacbookを新調しました。
今しかないと思って,あえてのMacBookAir(非Retina)です。
税込約10万円で,旧USBポートが備わっていて,GPIBとserial通信両方同時にできそうなすばらしいハードウエア,と思ったのですが,罠が。。。。。

以前からつかっていた測定用のコードがコンパイルできません。 


小一時間,というかもう少し悩んで,いろいろ試しました。
NI4882は/Library/Frameworks以下にあります。
まずはni4882.hがみつけられないのだから-Iで探させてみたのですが,それでも次はldがNI4882をFile not foundと言ってきて,泥沼の様相。
NI4882の場所がいけないのかと思い,ldのmanやappleのdocを読み込んでみても,/Library/Frameworksで良さそう,っていうか/Library/Frameworksにしろと書いてある。
それこそHighSierraにダウングレードしようかなど考えていたのですが,どうやら-Fというオプションがある模様。
そこで,makefileに-F/Library/Frameworks を加えてみたところ,あっさり成功。



ちょっと苦労したので忘れないようにメモ。

2019年2月14日木曜日

pythonで超伝導マグネット電源から磁場の値を読み込む。closeの方法も。

先日メモしたように,Cryogenicの超マグ電源から,シリアル通信で現在の磁場の値を読み込むと,

>>> import visa
>>> rm = visa.ResourceManager()
>>> instr1 = rm.open_resource('ASRL1::INSTR')
>>> cmd = instr1.query('get o\n')
>>> cmd
'OUTPUT: 0.0000 TESLA AT 0.0 VOLTS \r\n'

のように,余計な文字列がたくさんついてきます。
どうやら,pythonはこういうときの処理がとても得意みたいです。

split()で空白で区切ると単にlistになるのですが,

>>> cmd.split()
['OUTPUT:', '0.0000', 'TESLA', 'AT', '0.0', 'VOLTS']
>>> type(cmd.split())
<class 'list'>

このままでは当然strのままです。

>>> type(cmd.split()[1])
<class 'str'>

これをfloat()にしてあげればよくて,

>>> field = float(cmd.split()[1])
>>> field
0.0
>>> type(field)
<class 'float'>
>>> 

のようにみごとに分割した文字列から一発で磁場の値を浮動小数点に変換できます。
ちなみにcloseの方法は簡単で,

>>> instr1.close()
>>> exit()
bhoona:~ yishii$ 

のように,ResourceManagerから持ってきたデバイス名に.close()をつけるだけです。
前回のエラーはすっかり消えました。

pythonすごいです,おどろくほど短いコードで済みます。

2019年1月24日木曜日

PyVISAは無敵かも

春休みに磁気抵抗を測定しようと思い,マグネット電源とシリアル通信しないといけないなぁ,となんとなく気が重くなっていたのですが,すばらしい解決方法を見つけてしまいました。

環境としては,
macOS HighSierra
Python 3.6.3 (finkでインストール)
NI VISA 18.0.0

pip3でpyserialをインストールし,ためしに通信してみました。





こんな感じで,無事に通信できました。
実はここに至るまで紆余曲折あり,一筋縄ではいきませんでした。

ポイントは,コマンドの文字列を送るところです。
最初,ネットの記事を参考に,

>>>ser.write("get o¥n")

のようにしてみたのですが,うまくいかず,基本にもどって,公式ドキュメントを参考にしてみたところ,

>>>ser.write(b'get o¥n')

と書くのが正しいようだったので,そうしてみました。
(いつも学生に,『安易なネット検索はいかん』と言っていたのに,自分でハマってしまった。。。)

帰ってきた文字列を見てみると,CRとかLFが入っているし,『b' '』で囲まれてしまっているので,ちょっと厄介だなぁ,と思っていました。

つづいて,PyVISAをインストール。
うっかり最初,easy_install pyvisaとやってしまったところ,python2.7用のVISAがインストールされてしまいました。
これはいかんと,pip3でインストールしたところ,無事python3用のpyvisaがインストールされました。

PyVISAも,ネット上にはいろいろな情報があふれているのでw,基本にかえりながら,



ここで,重大なことに気づきました!!!
今,macにはusbで(と言ってもUSB-Serial変換アダプタ経由で)マグネット電源が,NIのGPIB-USBアダプタ(アドレスは3)で温度コントローラが繋がっています。

>>> rm = visa.ResourceManager()
>>> print(rm.list_resources())

とやってリストをみると,GPIB機器(GPIB0::3::INSTR)のほかに,ASRL1::INSTRという装置が見えます。

そうでした,そこがVISAのすばらしいところでした。
つまり,pyserialは必要なかったのです。。。

>>> instr1 = rm.open_resource('ASRL1::INSTR')
>>> instr2 = rm.open_resource('GPIB0::3::INSTR')


のように,二つの機器にそれぞれinstr1とinstr2という名前をつけて,通信してみたところ,

>>> instr1.write('get o\n')
(8, <StatusCode.success: 0>)
>>> print(instr1.read())
OUTPUT: 0.0000 TESLA AT 0.0 VOLTS 

>>> instr2.write('*idn?')
(7, <StatusCode.success: 0>)
>>> print(instr2.read())
LSCI,MODEL350,LSA14J9/#######,1.4

>>> 


と,無事にシリアルかGPIBかの区別を全く感じずに通信することができました。

ただ,このままexit()すると

>>> exit()
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 108, in __del__
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 243, in close
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 235, in before_close
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 252, in __switch_events_off
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 309, in disable_event
  File "/sw/lib/python3.6/site-packages/pyvisa/ctwrapper/functions.py", line 410, in disable_event
  File "/sw/lib/python3.6/site-packages/pyvisa/ctwrapper/highlevel.py", line 188, in _return_handler
pyvisa.errors.VisaIOError: VI_ERROR_INV_OBJECT (-1073807346): The given session or object reference is invalid.
Exception ignored in: <object repr() failed>
Traceback (most recent call last):
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 108, in __del__
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 243, in close
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 235, in before_close
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 252, in __switch_events_off
  File "/sw/lib/python3.6/site-packages/pyvisa/resources/resource.py", line 309, in disable_event
  File "/sw/lib/python3.6/site-packages/pyvisa/ctwrapper/functions.py", line 410, in disable_event
  File "/sw/lib/python3.6/site-packages/pyvisa/ctwrapper/highlevel.py", line 188, in _return_handler
pyvisa.errors.VisaIOError: VI_ERROR_INV_OBJECT (-1073807346): The given session or object reference is invalid.

のようにちょっと嫌なメッセージが出ます。
おそらくcloseしていないからでしょうが,今日はここまでにします。
うまくいけば,PyQtとか使ってらくちんに測定できるかもしれません。