wiki:epics/process_output

Version 3 (modified by obina, 7 years ago) (diff)

--

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 の場合のみであることに注意。詳しくは 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になったときだけプロセスする」などの操作が出来る。 詳しくは 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.

というオプションがある。 これを使えば、「インターロック発生時になにかアクションを起こし、復帰しても自動ではリセットしない」のような 機能を簡単に実現できる。

※ソフトウェアベースなので、あくまでも補助的な(利便性向上のための)インターロックに使用すべき

PP がプロセスされるタイミング

INP系とOUT系ではPPで指定した先が実行されるタイミングは異なる。

  • outputレコードのOUTフィールドに PP を付けた場合、そのレコードがプロセスされた「後に」PPで指定されたレコードがプロセスされる
  • input レコード(INP or DOL) にPPを付けた場合、そのレコードがプロセスされる「前に」PPで指定されたレコードがプロセスされ、その結果がINP or DOL に格納される