ARが激しい大電流実験の後の長い眠りについてから早1年と2ヶ月、ついに復活の時が来てしまいました。今回の復帰にあわせて、南直線部西側、かつての大電流実験時には進行方向用キッカーを入れていた場所に3種類のDCCTテストチェンバーを入れ、チェンバーの発熱およびB社コアのテストを行うことになりました。
この場所には昔の進行方向用キッカーで使っていた温度測定用配線がありますので、昔のシステムをそのまま動かせば基本的には大丈夫なはずです。ただ、前の作業時はepicsについて未(無)知な部分が多々あり、あまりスマートでないやり方をしているところが目に付きます。そこで、この機会に以下の変更を行うこととしました。
| Name | Value | 備考 |
|---|---|---|
| FTVL | FLOAT | 配列要素のタイプ |
| HOPR | 100.0 | 最大温度(Strip chartなどで使う) |
| LOPR | 20.0 | 最低温度(同上) |
| MALM | 10 | 親の配列の大きさ |
| NELM | 1 | subArrayの配列の大きさ |
| PREC | 1 | 小数点以下の精度 |
| INDX | 数字 | 親の何番目の要素から始まるかのindex |
親のwaveformから子のsubArrayに値を渡すには、親のVALをsubArrayのINPに、親のFLNKをsubArrayのSLNKにつなげればよいのですが、しかしここで問題が発生します。1つのVALを多くのINPにつなぐことに関しては何の問題もありません。残念ながら、1つのFLNKは1つのSLNKにしかつなげられないのです。今思いつく解決策としては
注意: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))
)
を追加すると良いでしょう。
| Name | Value | 備考 |
|---|---|---|
| CALC | A*100.0 | 計算式(INPAにもとの値を入れる) |
| EGU | mA | 単位(どうでもいい) |
| HOPR | 50.0 | Strip Chartなどで使う |
| LOPR | 0.0 | Strip Chartなどで使う |
| PREC | 1 | 精度指定 |
# recTimestamp.c recTimestamp.o:$(SRC)/recTimestamp.cという部分を作り、objfrc40ディレクトリから
(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の様に追加するのを忘れずに。

不幸にしてmedmが落っこちたときは、