[KEKB Bunch Feedback Group]

EPICSを使ったAR温度モニターメモ補足(Japanese)


For more information, please contact with M. Tobiyama.


1.今回のお仕事

ARが激しい大電流実験の後の長い眠りについてから早1年と2ヶ月、ついに復活の時が来てしまいました。今回の復帰にあわせて、南直線部西側、かつての大電流実験時には進行方向用キッカーを入れていた場所に3種類のDCCTテストチェンバーを入れ、チェンバーの発熱およびB社コアのテストを行うことになりました。
この場所には昔の進行方向用キッカーで使っていた温度測定用配線がありますので、昔のシステムをそのまま動かせば基本的には大丈夫なはずです。ただ、前の作業時はepicsについて未(無)知な部分が多々あり、あまりスマートでないやり方をしているところが目に付きます。そこで、この機会に以下の変更を行うこととしました。
  1. waveformからデータを取り出すのにsequencerを使っていたのをやめ、subArrayで直接取り出す。
  2. dcctの電流もハイブリッドレコーダーに入れ、記録をする。このとき、電圧値から周回電流への変換もデータベースの中でcalcを使って行う。
  3. データのロギングを行う。
以下に今回の作業の概要を紹介します。

2.データベースの改造

いままでのバージョンでは、waveformに入ったデータを直接取り出す方法を知らなかったので、sequencerを使いwaveform更新タイミングにあわせてそれぞれのデータをaiレコードに移していました。これはsubArrayというレコードタイプを使えば出来ることが今や判明しています。また、今回は、新たに入れたB社のDCCTの読み値と、前からあるK社のDCCTの読み値(いずれも電圧)もレコーダーから読んできます。ついでに実際の電流値をcalcを使って換算します。capfastで書いたデータベース全体の構造はここをクリックして下さい。

2.1 subArrayを使う

waveformの一部(1要素でも部分配列でも)を取り出すにはsubArrayを使います。今回はwaveformの1要素を取り出します。設定するpropertyは
NameValue備考
FTVLFLOAT配列要素のタイプ
HOPR100.0最大温度(Strip chartなどで使う)
LOPR20.0最低温度(同上)
MALM10親の配列の大きさ
NELM1subArrayの配列の大きさ
PREC1小数点以下の精度
INDX数字親の何番目の要素から始まるかのindex
です。特にFTVL、MALM、NELM、INDXは大事ですな。

親のwaveformから子のsubArrayに値を渡すには、親のVALをsubArrayのINPに、親のFLNKをsubArrayのSLNKにつなげればよいのですが、しかしここで問題が発生します。1つのVALを多くのINPにつなぐことに関しては何の問題もありません。残念ながら、1つのFLNKは1つのSLNKにしかつなげられないのです。今思いつく解決策としては

  1. funoutレコードを使いFLNKを分配する。
  2. subArrayの出口にあるFLNKを次のsubArrayのSLNKにつなぎ...とカスケード接続する。
といったものがあります。今回はfunoutレコードを使うことにします。1つのfanoutは出口が6個しかありませんので、10個のsubArrayをつなぐためには(見栄えを考えて)3個funoutを用意します(多分2個でも良いんだろうけれど、どうも気色悪い)。capfastの拡大図はここをクリックして下さい。

注意:funoutレコードは普通外から直接参照するものではないので名前なんざdefaultでcapfastが付けた訳の分からない名前のままで良いのでないかという横着心を起こしてはいけません。defaultの名前ではconvertの時うまくlinkを張ってくれません(多分、まともなレコードとして配線経路が確保できない)。必ずrelabelして自分で名前を付けましょう。

1構造体(1 waveformを10個のsubArrayに分ける部分)が出来たら、これを全部で6個になるようコピーします。ここでも恐ろしい落とし穴があります。copyのメニューで、"both instance names and wire names"というのは決して使ってはなりません。さもなくば、コピー先のwireを全部消してまた書き直すという呪われた作業が待っております(多分、同じ名前のwireがあると無視してしまうのか?)。当然コピー先のレコード(waveformやsubArray)はrelabelしたり、propertyを正しい物に変更する必要があります。場合によっては一旦saveして、editorでschファイルを編集した方が早い場合もあるでしょう(但しdefaultのpropertyはschファイルで省略されていることが多いので、この場合はcapfast上で変更するのが良いかもしれない)。

なお、defaultのedb.defファイルには、subArrayに対応する定義が無いようですから、このままではconvertの時エラーが出てdbファイルに変換できません。自分のedb.defファイルに、

(RECORD "esubarray" "esubarrays"
        (PV (char))
        (Type "subArray")
        (DESC (char))
        (SCAN (char(default("Passive"))))
        (PINI (char(default("NO"))))
        (PHAS (int))
        (EVNT (int))
        (DTYP (char(default("Soft Channel"))))
        (DISV (int))
        (SDIS (char(default("0.000000000000000e+00"))))
        (DISS (char(default("NO_ALARM"))))
        (PRIO (char(default("LOW"))))
        (FLNK (char(default("0.000000000000000e+00"))))
        (PREC (int))
        (FTVL (char(default("STRING"))))
        (INP  (char(default("0.000000000000000e+00"))))
        (EGU  (char))
        (HOPR (float))
        (LOPR (float))
        (MALM (int))
        (NELM (int))
        (INDX (int))
)
を追加すると良いでしょう。

2.2 電流値の計算

DCCTの出力と電流値の関係は、現在300mA/3Vレンジですので、
(電流[mA])=(DCCTの出力[V]×100)
となっております。subArrayに出てきた値を100倍すれば、電流値になるはずです。実際はoffsetとか微妙な換算計数とかあるかも知れませんが、そういった物を含めてcalcレコードで計算します。設定するpropertyは
NameValue備考
CALCA*100.0計算式(INPAにもとの値を入れる)
EGUmA単位(どうでもいい)
HOPR50.0Strip Chartなどで使う
LOPR0.0Strip Chartなどで使う
PREC1精度指定
です。INPAに対応するsubArrayのVALをつなぎ、FLNKとSLNKをつないで出来上がりです。capfastで見た構造はここをクリックして下さい。

2.3 timestampレコードを追加する

medmの上なので現在時刻を表示したい場合、関東情報サービスの吉田さんが作られたtimestampレコードを追加することになります。必要なファイルは以下の通りです。 Makefileに
# recTimestamp.c
recTimestamp.o:$(SRC)/recTimestamp.c
という部分を作り、objfrc40ディレクトリから
make recTimestamp.o
を行います。その後、epicsワーキングディレクトリに移り、ここでmakesdrをします。capfastでtimestampレコードを使うためには、databaseを作っているsubdirectoryにtimestamp.symを入れ、先ほども出た自分のedb.defファイルに、
(RECORD "timestamp"
        (PV (char))
        (Type "timestamp")
        (DESC (char))
        (SCAN (char(default("1 second"))))
        (PINI (char(default("NO"))))
        (PHAS (int))
        (EVNT (int))
        (DISV (int))
        (SDIS (char(default("0.000000000000000e+00"))))
        (DISS (char(default("NO_ALARM"))))
        (PRIO (char(default("LOW"))))
        (FLNK (char(default("0.000000000000000e+00"))))
        (TST  (char(default("YY/MM/DD HH:MM:SS"))))
)
を追加します。iocにmakeして出来たrecTimestamp.oを
ld < ./objfrc40/recTimestamp.o
の様に追加するのを忘れずに。

3 表示部分

今回も表示はmedmで作りました(それ以外の高等な方法はしりまへん)。strip chart表示については前の物をほとんどそのまま、一部削除、名前の変更をするだけで完成です。データベースの名前を今回大幅に変更しましたが、これについては、editorで*.adlファイルの中身を一括更新すれば簡単に直せます。

今回新たにDCCTチェンバーに付けた温度計の概念図をCADで書き、GIFファイルにしてmedmに張り付け、各位置の温度がすぐに分かるようにしました。残念なことに(少なくとも)現在使用しているmedmでは、X-serverが256色でないとき(普通のPCなど)、GIFファイルを開くときにmedm自身が死んでしまいます。このような呪われたソフトウエアは結構な売り物(某H社の某電磁界計算ソフトとか)にもありますが、はっきり言って出来が悪いと思います。HPワークステーションとかXターミナルとかでは、256色しか出ませんのできっと大丈夫です。
不幸にしてmedmが落っこちたときは、
medm -cleanup
としてmedmを再たち上げします。

Makoto Tobiyama
25/Feb/98

Return to FB Home Page...