wiki:epics/channelfilter

Version 4 (modified by michkawa, 8 weeks ago) (diff)

--

channel filter

EPICS 3.15.1以降に正式実装された機能で、JSON フィールド修飾子を使用してフィルターとパラメーターを選択して、各レコードに分割することができる機能です。
中でも特に有用だと思われるのがArray filterです。

今までwaveformやaaiのようなレコードから一部のデータを切り出して別レコード化するには、SNCsequencerやasubレコード等で分割するのが常でしたが、array filterを使うことで同様の処理が簡単にできるようになり、処理内容も見やすくなります。

使い方は、Channel Filtersの例題を見ればすぐにわかると思いますので、活用してみてください。

(注意) 但し、recordのINP fieldでDB Linkされるのは、EPICS base R7.0.5以降です。それ以前のEPICS baseでは caget では機能しますが、INP fieldでは "CP"を付けないと正常に動作しません。

EPICS Base の違いによる動作

テスト用database fileをsoftIOCで実行。

record(waveform, "TEST:wf") {
    field(FTVL, "DOUBLE")
    field(NELM, "10")
    field(FLNK, "TEST:d1")
}

record(ai, "TEST:d1") {
    field(INP, "TEST:wf.[0:0]")
    field(FLNK, "TEST:d2")
}

record(ai, "TEST:d2") {
    field(INP, "TEST:wf.[5:5]")
    field(FLNK, "TEST:d3")
}

record(aai, "TEST:d3") {
    field(INP, "TEST:wf.[1:4]")
    field(FTVL, "DOUBLE")
    field(NELM, "4")
    field(FLNK, "TEST:d4")
}

record(aai, "TEST:d4") {
    field(INP, "TEST:wf.[1:2:10]")
    field(FTVL, "DOUBLE")
    field(NELM, "4")
}

EPICS Base R7.0.5以降

R7.0.7でテスト

$ caput -a TEST:wf 10 1 2 3 4 5 6 7 8 9 10
Old : TEST:wf 10 0 0 0 0 0 0 0 0 0 0
New : TEST:wf 10 1 2 3 4 5 6 7 8 9 10
$ caget TEST:d1
TEST:d1                        1
$ caget TEST:d2
TEST:d2                        6
$ caget TEST:d3
TEST:d3 4 2 3 4 5
$ caget TEST:d4
TEST:d4 4 2 4 6 8

EPICS Base R7.0.5より前

R7.0.3でテスト

$ caput -a TEST:wf 10 1 2 3 4 5 6 7 8 9 10
Old : TEST:wf 10 2.50321e-308 0 0 0 0 0 0 0 0 0
New : TEST:wf 10 1 2 3 4 5 6 7 8 9 10
$ caget TEST:d1
TEST:d1                        1
$ caget TEST:d2
TEST:d2                        1
$ caget TEST:d3
TEST:d3 4 1 2 3 4
$ caget TEST:d4
TEST:d4 4 1 2 3 4