wiki:epics/streamdevice/tips_and_tricks

Version 2 (modified by michkawa, 10 years ago) (diff)

--

StreamDevice Tips & Tricks

StreamDeviceのオンラインドキュメントにあるtips & tricksは非常に有用なんですがいまいちわかり辛いので、多少解かりやすくなるように私なりに書き直してみようと思います。

たくさんの同じようなプロトコルがある

INP,OUT fieldには引数を使うことができるので、このように書くことも可能。

field (OUT, "@protocolfile protocol(arg1,arg2,arg3) bus")

プロトコルファイル内では 引数に数値(バイナリ)を設定したい場合には$1 $2 $3、文字列を設定する場合には"\$1 \$2 \$3"と記述する。

例1(文字列を設定)

  • db file
    reocrd(ao, "$(RECORD):ex01") {
      field (OUT, "@motor.proto moveaxis(X) motor1")
      field (DTYP, "stream")
    }
    
  • protocol file
    moveaxis {
      out "move\$1 %.6f";
    }
    

この例では、\$1が文字列Xで置き換わり

moveaxis {
  out "moveX %.6f";
}

と、同じ意味になる。

例2(数値を設定)

  • db file
    reocrd(ao, "$(RECORD):ex02") {
        field (INP, "@vacuumgauge.proto readpressure(0x84) gauge3")
        field (DTYP, "stream")
    }
    
  • protocol file
    readpressure {
        out 0x02 0x00 $1;
        in 0x82 0x00 $1 "%2r";
    }
    

この例では、引数 0x84$1 に設定されるので、

readpressure {
    out 0x02 0x00 0x84;
    in 0x82 0x00 0x84 "%2r";
}

となる。

デバイスが要らないデータをつけて送ってくる

I/O intr処理で送られてきた文字列と同じ場合だけ処理する。(別にI/O intr処理だけではないが例として)

  • db file
    record (ai, "$(RECORD):ex03") {
      field (DTYP, "stream")
      field (INP, "@$(DEVICETYPE).proto read $(BUS)")
      field (SCAN, "I/O Intr")
    }
    
  • protocol file
    read {
        in "new value = %f";
    }
    

この場合、空白も含めてまったく同じ文字列じゃないと処理されないので注意。

複数行のデータを送ってくる

例として、こんな文字列を送ってくるデバイスだとする。

Here is the value:
3.1415

その場合、inを複数記述すればいい。

  • db file
    record (ai, "$(RECORD):ex04") {
      field (DTYP, "stream")
      field (INP, "@$(DEVICETYPE).proto read_value $(BUS)")
      field (SCAN, "I/O Intr")
    }
    
  • protocol file
    read_value {
        in "Here is the value:";
        in "%f";
    }
    

一つのメッセージで複数のデータを扱う必要がある

この問題には色々なアプローチで、複数の解決策がある。

全部同じ型で、同じ文字で区切られているデータを出力

waveform,aaoレコードを使って処理が可能。

  • db file
    record(waveform, "$(RECORD):ex05") {
        field(OUT, "@$(DEVICETYPE).proto array_out $(BUS)")
        field(DTYP, "stream")
    }
    
  • protocol file
    array_out {
        separator=", ";
        out "an array: (%.2f)";
    }
    

%.2fのフォーマット文字列が配列数分、", "で連結されて、こんな文字列が作成される。

an array: (1.23, 2.34, 3.45, 4.56)