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 4 weeks ago
Last modified on 10/10/24 08:52:42