Changes between Version 1 and Version 2 of epics/streamdevice/mes2manyrec


Ignore:
Timestamp:
02/19/13 00:05:36 (12 years ago)
Author:
Takashi Obina
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • epics/streamdevice/mes2manyrec

    v1 v2  
    55目的:相手の機器から1行のメッセージが返ってきたとき、それを複数のレコードに入れたい
    66
    7 == case1 : コマンドを送ると、あるフォーマットにのって複数の値が返ってくる場合 ==
     7== case1 : コマンドを送ると、決まったフォーマットで複数の値が返ってくる場合 ==
    88例1
    99{{{
     
    7373}}}
    7474
     75プロセス順について:I/O Intr を使うので、valA,B,Cの3つのレコードがプロセスされる順番は確定しない
     76
     77
     78=== 解決方法2 ===
     79レコードの [http://epics.web.psi.ch/software/streamdevice/doc/formats.html#redirection redirection] を使う方法。
     80
     81プロトコルファイル中に、レコード名を直接書くことでそこに値を入れることが出来る。(レコード名).(フィールド名)の形式も使うことができる。フィールド名を省略した場合はデフォルトでVALフィールドが使用される。
     82
     83protocol file (sample2.proto)
     84{{{
     85Terminator = CR LF;
     86
     87recvABC {
     88  out "VAL?";
     89  in "A=%f, B=%(obina:valB)f, C=%(obina:valC)f";
     90}
     91}}}
     92
     93DB file (sample2.db)
     94{{{
     95record(ai, "obina:valA")
     96{
     97    field(DTYP, "stream")
     98    field(SCAN, "1 second")
     99    field(INP,  "@sample2.proto recvABC PS1")
     100}
     101record(ai, "obina:valB")
     102{
     103    field(INP,  "")
     104}
     105record(ai, "obina:valC")
     106{
     107    field(INP,  "")
     108}
     109}}}
     110
     111この例の場合、valB, valC のレコードはvalAレコードの入力に対して"process passive"で実行されるので、DBの定義ファイル中ではSCAN Passiveにしておけば良い。
     112B,Cが先にプロセスされ、そのあとでAが更新される。
     113
     114
     115=== 解決法2の補足 ===
     116上の方法では、プロトコルファイル中にレコード名を明示する必要がある。
     117このままでも良いのだが、汎用性やDBファイルとプロトコルファイルとの役割分担を考えるとあまりよろしくない。
     118対策としてプロトコルファイル中にDBファイルからのパラメータとして渡すことができる。
     119
     120
     121{{{
     122Terminator = CR LF;
     123
     124recvABC {
     125  out "VAL?";
     126  in "A=%f, B=%(\$1)f, C=%(\$2)f";
     127}
     128}}}
     129
     130DB file (sample3.db)
     131{{{
     132record(ai, "obina:valA")
     133{
     134    field(DTYP, "stream")
     135    field(SCAN, "5 second")
     136    field(INP,  "@sample3.proto recvABC(obina:valB,obina:valC) PS1")
     137}
     138record(ai, "obina:valB")
     139{
     140    field(INP,  "")
     141}
     142record(ai, "obina:valC")
     143{
     144    field(INP,  "")
     145}
     146}}}
     147
     148