古川制御日記

佐賀県武雄市の組み込み開発屋ブログ

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

であるので、ぱっと見関数に見えません。
何ですかこれは。
一旦終わり。

Parsec

HaskellParsec関連メモっておく。

[Haskell]Parsecというパーサーライブラリで電卓を作る簡単な方法

[Haskell]Parserを書く(Programming in Haskell/Chapter8)

[haskell]細・Haskellを使ってmarkdownをパースして... [Parsecライブラリの使い方]

Haskell_Parsec

ParsecでPL/0の構文解析 - 式の構文解析

Haskell で parser を書くには (初心者編)

Posts tagged parsec

ParsecでJSONパーサ

siroccoさんの

Parsec, a fast combinator parser@microsoft

最強のパーザー、Parser Combinator

TuringとChurchの狭間で

何か計算機理論みたいなのをちゃんと勉強するべきな気がしてきた。。。。

https://www.fpcomplete.com/search?search=parsec

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);
}