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