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 に格納される