wiki:epics/channelfilter

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"を付けないと正常に動作しません。(R3.15.Xも同様)

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

INP fieldを確認。

epics> dbpr TEST:d2,4
ACKS: NO_ALARM      ACKT: YES           ADEL: 0             AFTC: 0
AFVL: 0             ALST: 6             AMSG:               AOFF: 0
ASG :               ASLO: 1             ASP : PTR (nil)
BKLNK: ELL 1 [0x1731500 .. 0x1731500]   BKPT: 00            DESC:
DISA: 0             DISP: 0             DISS: NO_ALARM      DISV: 1
DPVT: PTR 0x7f8751f62a80                DSET: PTR 0x7f8751f62a80
DTYP: Soft Channel  EGU :               EGUF: 0             EGUL: 0
EOFF: 0             ESLO: 1             EVNT:
FLNK: DB_LINK TEST:d3                   HHSV: NO_ALARM      HIGH: 0
HIHI: 0             HOPR: 0             HSV : NO_ALARM      HYST: 0
INIT: 0             INP : DB_LINK TEST:wf.[5:5] NPP NMS     LALM: 6
LBRK: 0             LCNT: 0             LINR: NO CONVERSION LLSV: NO_ALARM
LOLO: 0             LOPR: 0             LOW : 0             LSET: PTR 0x17d4590
LSV : NO_ALARM      MDEL: 0             MLIS: ELL 0 [(nil) .. (nil)]
MLOK: a0 4d 7d 01 00 00 00 00           MLST: 6             NAME: TEST:d2
NAMSG:              NSEV: NO_ALARM      NSTA: NO_ALARM      OLDSIMM: NO
ORAW: 0             PACT: 0             PBRK: PTR (nil)     PHAS: 0
PINI: NO            PPN : PTR (nil)     PPNR: PTR (nil)     PREC: 0
PRIO: LOW           PROC: 0             PUTF: 0             RDES: PTR 0x1750790
ROFF: 0             RPRO: 0             RSET: PTR 0x7f8751f61580
RVAL: 0             SCAN: Passive       SDIS: CONSTANT      SDLY: -1
SEVR: NO_ALARM      SIML: CONSTANT      SIMM: NO            SIMPVT: PTR (nil)
SIMS: NO_ALARM      SIOL: CONSTANT      SMOO: 0             SPVT: PTR (nil)
SSCN: <nil>         STAT: NO_ALARM      SVAL: 0
TIME: 2024-10-10 08:45:01.620398962     TPRO: 0             TSE : 0
TSEL: CONSTANT      UDF : 0             UDFS: INVALID       UTAG: 0
VAL : 6

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

INP fieldを確認。

epics> dbpr TEST:d2,4
ACKS: NO_ALARM      ACKT: YES           ADEL: 0             AFTC: 0
AFVL: 0             ALST: 1             AOFF: 0             ASG :
ASLO: 1             ASP : PTR (nil)     BKLNK: ELL 1 [0x1c26868 .. 0x1c26868]
BKPT: 00            DESC:               DISA: 0             DISP: 0
DISS: NO_ALARM      DISV: 1             DPVT: PTR 0x7f0b4651da80
DSET: PTR 0x7f0b4651da80                DTYP: Soft Channel  EGU :
EGUF: 0             EGUL: 0             EOFF: 0             ESLO: 1
EVNT:               FLNK: DB_LINK TEST:d3                   HHSV: NO_ALARM
HIGH: 0             HIHI: 0             HOPR: 0             HSV : NO_ALARM
HYST: 0             INIT: 0             INP : DB_LINK TEST:wf.[5:5] NPP NMS
LALM: 1             LBRK: 0             LCNT: 0             LINR: NO CONVERSION
LLSV: NO_ALARM      LOLO: 0             LOPR: 0             LOW : 0
LSET: PTR 0x1c235a0 LSV : NO_ALARM      MDEL: 0
MLIS: ELL 0 [(nil) .. (nil)]            MLOK: 20 3d c2 01 00 00 00 00
MLST: 1             NAME: TEST:d2       NSEV: NO_ALARM      NSTA: NO_ALARM
OLDSIMM: NO         ORAW: 0             PACT: 0             PBRK: PTR (nil)
PHAS: 0             PINI: NO            PPN : PTR (nil)     PPNR: PTR (nil)
PREC: 0             PRIO: LOW           PROC: 0             PUTF: 0
RDES: PTR 0x1bdecd0 ROFF: 0             RPRO: 0
RSET: PTR 0x7f0b4651c580                RVAL: 0             SCAN: Passive
SDIS: CONSTANT      SDLY: -1            SEVR: NO_ALARM      SIML: CONSTANT
SIMM: NO            SIMPVT: PTR (nil)   SIMS: NO_ALARM      SIOL: CONSTANT
SMOO: 0             SPVT: PTR (nil)     SSCN: <nil>         STAT: NO_ALARM
SVAL: 0             TIME: 2024-10-10 08:41:26.760281762     TPRO: 0
TSE : 0             TSEL: CONSTANT      UDF : 0             UDFS: INVALID
VAL : 1

dbのINP fieldにCPオプションを設定した場合

epics> dbpr TEST:d2,4
ACKS: INVALID       ACKT: YES           ADEL: 0             AFTC: 0
AFVL: 0             ALST: 6             AOFF: 0             ASG :
ASLO: 1             ASP : PTR (nil)     BKLNK: ELL 1 [0x13afa68 .. 0x13afa68]
BKPT: 00            DESC:               DISA: 0             DISP: 0
DISS: NO_ALARM      DISV: 1             DPVT: PTR 0x7f85c8adea80
DSET: PTR 0x7f85c8adea80                DTYP: Soft Channel  EGU :
EGUF: 0             EGUL: 0             EOFF: 0             ESLO: 1
EVNT:               FLNK: DB_LINK TEST:d3                   HHSV: NO_ALARM
HIGH: 0             HIHI: 0             HOPR: 0             HSV : NO_ALARM
HYST: 0             INIT: 0             INP : CA_LINK TEST:wf.[5:5] CP NMS
LALM: 6             LBRK: 0             LCNT: 0             LINR: NO CONVERSION
LLSV: NO_ALARM      LOLO: 0             LOPR: 0             LOW : 0
LSET: PTR 0x13ac7a0 LSV : NO_ALARM      MDEL: 0
MLIS: ELL 0 [(nil) .. (nil)]            MLOK: 20 cf 3a 01 00 00 00 00
MLST: 6             NAME: TEST:d2       NSEV: NO_ALARM      NSTA: NO_ALARM
OLDSIMM: NO         ORAW: 0             PACT: 0             PBRK: PTR (nil)
PHAS: 0             PINI: NO            PPN : PTR (nil)     PPNR: PTR (nil)
PREC: 0             PRIO: LOW           PROC: 0             PUTF: 0
RDES: PTR 0x1367e70 ROFF: 0             RPRO: 0
RSET: PTR 0x7f85c8add580                RVAL: 0             SCAN: Passive
SDIS: CONSTANT      SDLY: -1            SEVR: NO_ALARM      SIML: CONSTANT
SIMM: NO            SIMPVT: PTR (nil)   SIMS: NO_ALARM      SIOL: CONSTANT
SMOO: 0             SPVT: PTR (nil)     SSCN: <nil>         STAT: NO_ALARM
SVAL: 0             TIME: 2024-10-10 08:42:19.408107033     TPRO: 0
TSE : 0             TSEL: CONSTANT      UDF : 0             UDFS: INVALID
VAL : 6
Last modified 8 weeks ago Last modified on 10/10/24 08:52:42