| 1 | = output レコードに関する Tips = |
| 2 | |
| 3 | === 事例1:ao, bo などの値を、別のレコードに設定したい === |
| 4 | ao, bo など, output 系のレコードを使って、別のレコードに値を設定したい |
| 5 | |
| 6 | 解決方法1:Forward Link を使う |
| 7 | |
| 8 | 例えば、設定したいレコード名を test:target とすると |
| 9 | {{{ |
| 10 | record(ai, "test:target") { |
| 11 | field(INP, "") |
| 12 | field(FLNK, "") |
| 13 | } |
| 14 | }}} |
| 15 | のような、単なる"アナログ値の入れ物"を考える。 |
| 16 | |
| 17 | このレコードに対して、別レコードで計算した値や caput で設定した値などを設定したいことがある。 |
| 18 | そこで ao レコードのOUTフィールドにレコード名を書くのだが、 |
| 19 | 単にOUTに書くだけでは値は設定されるものの、設定先が「プロセス」されないので |
| 20 | ターゲット値は更新されない。 |
| 21 | そこで、Forward Link を使って「プロセス」するのが1つのやり方。 |
| 22 | {{{ |
| 23 | record(ao, "test:ao1") { |
| 24 | field(OUT, "test:target") |
| 25 | field(DOL, "") |
| 26 | field(OMSL, "supervisory") |
| 27 | field(FLNK, "test:target") |
| 28 | } |
| 29 | }}} |
| 30 | |
| 31 | 解決方法2 |
| 32 | いちいちリンクを設定すると複雑になる場合もある。そこでもう1つの方法は OUT リンクに PP (Process Passive)オプションを付けるやり方。 |
| 33 | {{{ |
| 34 | record(ao, "test:ao1") { |
| 35 | field(OUT, "test:target PP") |
| 36 | field(DOL, "") |
| 37 | field(OMSL, "supervisory") |
| 38 | field(FLNK, "") |
| 39 | } |
| 40 | }}} |
| 41 | |
| 42 | === 事例2:calcoutの場合 === |
| 43 | サンプルとして、「biレコードの値を反転した値をtargetに書き込む」ことを考える。 |
| 44 | 計算するだけならば単にcalcレコードだが、出力値を設定したいので calcout レコードを使う。 |
| 45 | {{{ |
| 46 | record(bi, "test:bi1") { |
| 47 | field(ZNAM, "zero") |
| 48 | field(ONAM, "one") |
| 49 | field(FLNK, "test:calcinv") |
| 50 | } |
| 51 | record(calcout, "test:calcinv") { |
| 52 | field(INPA, "test:bi1") |
| 53 | field(CALC, "!A") |
| 54 | field(OUT, "test:target") |
| 55 | field(FLNK, "test:target") |
| 56 | } |
| 57 | }}} |
| 58 | もちろん、事例1と同様にFLNKするかわりに OUT PP しても良い。 |
| 59 | {{{ |
| 60 | record(calcout, "test:calcinv") { |
| 61 | field(INPA, "test:bi1") |
| 62 | field(CALC, "!A") |
| 63 | field(OUT, "test:target PP") |
| 64 | field(FLNK, "") |
| 65 | } |
| 66 | }}} |
| 67 | |
| 68 | |
| 69 | |
| 70 | |
| 71 | 【おまけ】レコードプロセスに関してはao,boと同じ。calcout の場合は便利なオプションがある。それが OOPT (Output Execute Option) という項目。 |
| 72 | この機能を使うと、「出力が1になったときだけプロセスする」とか、「1→0になったときだけプロセスする」などの操作が出来る。 |
| 73 | 詳しくは [https://wiki-ext.aps.anl.gov/epics/index.php/RRM_3-14 Record Reference Manual] に記載されており、 |
| 74 | {{{ |
| 75 | Every Time -- write output every time record is processed. |
| 76 | On Change -- write output every time VAL changes, i.e., every time the result of the expression changes. |
| 77 | When Zero -- when record is processed, write output if VAL is zero. |
| 78 | When Non-zero -- when record is processed, write output if VAL is non-zero. |
| 79 | Transition To Zero -- when record is processed, write output only if VAL is zero and last value was non-zero. |
| 80 | Transition To Non-zero -- when record is processed, write output only if VAL is non-zero and last value was zero. |
| 81 | }}} |
| 82 | というオプションがある。 |
| 83 | これを使えば、「インターロック発生時になにかアクションを起こし、復帰しても自動ではリセットしない」のような |
| 84 | 機能を簡単に実現できる。 |
| 85 | |
| 86 | ※ソフトウェアベースなので、あくまでも補助的な(利便性向上のための)インターロックに使用すべき |