ReadSを使って失敗を考慮したread
文字列をIntとして読み出したい場合には、
> read "123" :: Int 123
で良いですが、失敗する場合に面倒。
> read "one-two-three" :: Int *** Exception: Prelude.read: no parse
文字列をIntとして読み出したい場合に失敗する可能性がある場合には
> let readi = reads :: ReadS Int
とInt読み出しに特化した関数を定義してやれば、
> readi "123" [(123,"")]
こんなん返ってきます。
Intとしてread出来ない場合には、
> readi "one-two-three" []
空リストが返ってきます。
>:m Data.Maybe > let readi = fmap fst . listToMaybe . reads :: String -> Maybe Int
定義すれば、成功時にJust Int,失敗時にNothingが返ってきます。
> readi "123" Just 123 > readi "one-two-three" Nothing
ここ参考にした。
かなりちまちまやってる感じ。
さらさら書けるようになりたい。
補足
> let readi = reads :: ReadS Int
この場合のreadiのシグネチャは、
> :t readi readi :: ReadS Int
であるので、ぱっと見関数に見えません。
何ですかこれは。
一旦終わり。
GPIBというかVISA
VISA(Virtual Instruments Software Architecture)
82357B GPIBアダプタ云々以前に
VISA対応している機器であればUSB接続であろうとも使えるということがわかった(おいおい)。
自分が持ってるオシロスコープDSOX3014AもこのVISA対応機器?であり
USBインターフェイスはオプション無しで持ち合わせているので
VISAライブラリ(インターフェイス)経由でアクセス出来る。
このオシロスコープがどのようなSCPIコマンドに対応しているかというと
Agilent InfiniiVision 3000 X-Series Oscilloscopes Programmer's Guide
の中に書いてますね。
SCPI.NETなるクラスライブラリがあって、コマンドを文字列として発行する必要が無い仕組みもあるようです。
サンプルの中にはIronPythonがある。。
へー。(汗)
コマンド直打ちよりはこれらのコマンドに対応したクラスが用意されているSCPI.NETな仕組みを使うのがバグらなくて済みそう。
Interactive IO
Agilent IO Library Suiteをインストールすると。
Agilent Connection Expertというプログラムがインストールされる。
この中にInteractive IOという機能がありこれを使って例えば
*IDN? :DVM:ENAB 1 :DVM:SOUR CHAN4 :DVM:CURR?
などとSCPIコマンドを実行すると
-> *IDN? <- AGILENT TECHNOLOGIES,DSO-X 3014A,MY52101223,02.12.2012041800 -> :DVM:ENAB 1 -> :DVM:SOUR CHAN4 -> :DVM:CURR? <- 8.89E+00
という応答が得られた。
めでたしめでたし。
実際はオシロスコープではなく任意波形生成器とかファンクション・ジェネレータとかを自動制御して 開発対象の試験をすることになる。
オシロスコープに備わってる計測機能を使えばちょっとした治具は色々書けそうですね。
GPIBアダプタ来た
Agilentの82357B
*IDN?とかのコマンドって、GPIBコマンドっていう括りだと思ってたけど
SCPIコマンドっていうらしい。
Standard Commands for Programmable Instruments
知らなかった。
プログラム書いて計測器達の操作を自動化して
納品時の試験リストを勝手にやってくれるようにしたい。
そのためのライブラリがVISA,VISA-COMだったりするけどこれらは
Agilent IO Library Suiteに含まれている。
VISA-COMのCOMは多分Common Object Modelの略称としてのCOMで
COMインターフェイス経由でExcelからもアクセス出来るっぽい。
VBA書く必要あるけど。
VISAってのはVirtual Instruments Software Architectureの略で、
IVI Foundationなる団体が標準化している規格のようです。
IVIはInternational Virtual Instrumentsのことだろう。
VISAライブラリを使ったC言語のサンプルはこんな感じです。
C#で書くとは思うけどイメージつかめるように(誰が)貼っておく。
#include <visa.h> #include <stdio.h> void main () { ViSession defaultRM, vi; char buf [256] = {0}; /* Open session to GPIB device at address 22 */ viOpenDefaultRM(&defaultRM); viOpen(defaultRM, "GPIB0::22::INSTR",VI_NULL,VI_NULL, &vi); /* Initialize device */ viPrintf(vi, "*RST\n"); /* Send an *IDN? string to the device */ viPrintf(vi, "*IDN?\n"); /* Read results */ viScanf(vi, "%t", buf); /* Print results */ printf("Instrument identification string: %s\n", buf); /* Close session */ viClose(vi); viClose(defaultRM); }