= output レコードに関する Tips = === 事例1:ao, bo などの値を、別のレコードに設定したい === ao, bo など, output 系のレコードを使って、別のレコードに値を設定したい 解決方法1:Forward Link を使う 例えば、設定したいレコード名を test:target とする。 {{{ record(ai, "test:target") { field(INP, "") field(FLNK, "") field(SCAN, "Passive") } }}} のような、単なる"アナログ値の入れ物"を考える。 このレコードに対して、別レコードで計算した値や caput で設定した値などを設定したいことがある。 そこで ao レコードのOUTフィールドにレコード名を書くのだが、 単にOUTに書くだけでは値は設定されるものの、設定先が「プロセス」されないので ターゲット値は更新されない。 そこで、Forward Link を使って「プロセス」するのが1つのやり方。 {{{ record(ao, "test:ao1") { field(OUT, "test:target") field(DOL, "") field(OMSL, "supervisory") field(FLNK, "test:target") } }}} 解決方法2 いちいちリンクを設定すると複雑になる場合もある。そこでもう1つの方法は OUT リンクに PP (Process Passive)オプションを付けるやり方。 {{{ record(ao, "test:ao1") { field(OUT, "test:target PP") field(DOL, "") field(OMSL, "supervisory") field(FLNK, "") } }}} ※ PPでプロセスされるのは、PUT先のレコードのSCANフィールドが Passive の場合のみであることに注意。詳しくは [https://epics.anl.gov/base/R3-15/5-docs/AppDevGuide/DatabaseLockingScanningAndProcessing.html Application Developper's Guide]を参照。 === 事例2:calcoutの場合 === サンプルとして、「biレコードの値を反転した値をtargetに書き込む」ことを考える。 計算するだけならば単にcalcレコードだが、出力値を設定したいので calcout レコードを使う。 {{{ record(bi, "test:bi1") { field(ZNAM, "zero") field(ONAM, "one") field(FLNK, "test:calcinv") } record(calcout, "test:calcinv") { field(INPA, "test:bi1") field(CALC, "!A") field(OUT, "test:target") field(FLNK, "test:target") } }}} もちろん、事例1と同様にFLNKするかわりに OUT PP しても良い。 {{{ record(calcout, "test:calcinv") { field(INPA, "test:bi1") field(CALC, "!A") field(OUT, "test:target PP") field(FLNK, "") } }}} 【おまけ】レコードプロセスに関してはao,boと同じ。calcout の場合は便利なオプションがある。それが OOPT (Output Execute Option) という項目。 この機能を使うと、「出力が1になったときだけプロセスする」とか、「1→0になったときだけプロセスする」などの操作が出来る。 詳しくは [https://wiki-ext.aps.anl.gov/epics/index.php/RRM_3-14 Record Reference Manual] に記載されており、 {{{ Every Time -- write output every time record is processed. On Change -- write output every time VAL changes, i.e., every time the result of the expression changes. When Zero -- when record is processed, write output if VAL is zero. When Non-zero -- when record is processed, write output if VAL is non-zero. Transition To Zero -- when record is processed, write output only if VAL is zero and last value was non-zero. Transition To Non-zero -- when record is processed, write output only if VAL is non-zero and last value was zero. }}} というオプションがある。 これを使えば、「インターロック発生時になにかアクションを起こし、復帰しても自動ではリセットしない」のような 機能を簡単に実現できる。 ※ソフトウェアベースなので、あくまでも補助的な(利便性向上のための)インターロックに使用すべき