css/opi_diff – Epics Users JP
    

wiki:css/opi_diff

CSS 3.1.2 → CSS 3.2.xへのバージョンアップに伴う変更点

(((注意))) CSS 3.2.xを使用する際には、必ずユーザディレクトリのCSS-Workspacesと以前作成したOPIファイル等のバックアップを作成してから行ってください。

CSS 3.1.2で作成したOPIをCSS 3.2.xで動かすための修正点と動作が変わった箇所を記述。

## Mac OSX版が起動しない

CSSの元になっているEclipseとJavaのバージョンの不一致が原因。
解決方法は、こちらを参照。

## loc://の初期値設定

一番大きな変更点としてloc://がある。CSS 3.2.xからはloc://には初期値の設定が必須になっていて、これを設定していないと disconnectになる。
修正方法は、loc://xxxxとなっているところを、数値ならloc://xxxx(0)、文字列ならloc://xxxx("")のように修正する。

一つ一つOPI Editorでやっていくのは面倒なので、OPIファイルを開くときにNavigatorのファイル上で右クリックし、サブメニューを表示してOpen with->Text Editorを選択し、テキストエディターでloc://xxxxを検索してloc://xxxx(0)変換した後に、動作がおかしいところを直したほうが早い。

BOY Example の 3_6_ChoiceWidgets.opi をみると、各選択widget loc://MyChoiceには初期値が設定されていないし、実際の動作も問題なさそう。
あまりに不評だったから、コンストラクタの多態性を設定することで逃げているのかも。

preferences->CSS Applications->Display->BOY->OPI Runtimeの PV Connection Layerの設定をutility_pvに設定すると、loc:xxxに初期値を設定しなくてもエラーにならないが、pvmanagerにすると、以下のようなエラーになる。

2015-01-xx xx:xx:xx ERROR: Error from pv connection layer:
java.lang.IllegalArgumentException: Syntax for local channel must be either name, name(Double) or name(String) (e.g "foo", "foo(2.0)" or "foo("bar")

コンストラクタで逃げているわけではなく、utility_pvとpvmanagerのデフォルト動作が違うから、問題になったりならなかったりしていただけのようである。
IOCを再起動するとwidgetがDisable状態になる場合があるのように、IOC再起動時にwidgetがグレーアウト(disable)する問題を解決できるので、新規に作成する場合にはなるべくpvmanagerを使ったほうがいいと考えられる。
utility_pvを使用する場合でも、初期値を設定しておくと後で移行しやすくなる。

## createPV APIの変更

次に問題になるのが、PVUtilのcreatePV API。
CSS 3.1.2ではunofficalながら

from org.csstudio.utility.pv import PVFactory
pv = PVFactory.createPV(pvName)
pv.start()

と記述することで使用可能だった。

3.2.xからは正式にcreatePVがサポートされたが、引数も使い方もまるっきり違うものになっている。

from org.csstudio.opibuilder.scriptUtil import PVUtil
from org.csstudio.simplepv import IPVListener
class MyPVListener(IPVListener):
def valueChanged(self, pv):
widget.setPropertyValue("text", PVUtil.getString(pv))
pv = PVUtil.createPV("sim://noise", widget)
pv.addListener(MyPVListener())

いちいちclassを作らなくてはならないのがjava風だが、それよりも問題なのがwidgetを引き数に追加する必要があること。
widgetとは全く関係ないclassを作っても、引数にwidgetが必要になってくるので、既存のclassのコンストラクタ等を変更する必要が出てくる。

この例題では、値が変化したときに呼ばれるvalueChangedメソッドでwidgetのtextプロパティを変更しているが、何を変更するかはプログラムによって異なるので適当に変更する必要がある。
また、IPVListener class自体もCA monitorをする場合には必要だが、プログラム独自のタイミングでデータを取得する場合には必要ない。
その場合には以下のように書くことができる。

from org.csstudio.opibuilder.scriptUtil import PVUtil
pv = PVUtil.createPV("sim://noise", widget)
widget.setProprtyValue("text", PVUtil.getDouble(pv))

## Name に loc://

CSS 3.1.2では、各widgetのName属性に loc://xxxx と設定し、スクリプトに渡す引数でloc://xxxxを設定すると

wgt = display.getWidget(str(pvs[0]))

でwidget objectが取得できたが、CSS 3.2.16では、loc://xxxxがスクリプトに渡される時点で展開されてしまうようで、こんな感じの

2014-09-26 13:49:37 ERROR: Error in ../scripts/setROIRangeLine.js on Polyline.
org.mozilla.javascript.WrappedException: Wrapped java.lang.Exception: Widget with name "org.csstudio.simplepv.utilitypv.UtilityPV@74a15bb9" does not exist! (script#21)

エラーになる。

loc://xxxxを取得する場合には

wgt = display.getWidget(pvs[0].getName())

とするといい。

loc:// の表示がorg.csstudio.simplepv.utilitypv.UtilityPV@xxxxに

以前はopiを実行中にShow PV Infoでloc://xxxxという表示がされていたが、CSS 3.2.xからはorg.csstudio.simplepv.utilitypv.UtilityPV@xxxxという表示に変わってしまい、関連付けがわかり辛くなってしまっている。
script中でのloc://の書き方が間違っていたので、このような表示なっていたようだ。
以前はstr(pv)でloc://xxxが取得できていたが、pv.getName()に変更する必要がある。

## epics pv名の取り方

CSS 3.1.2でstr(pv)すると、EPICS_V3_PV型の文字列として取得されてしまい、純粋なPV名ではないのでpv.getName()すると、epics://pvname となる。
CSS 3.2.16では、pv.getName()で純粋なPV名がとれる。
CSS 3.1.2で同様のことをする場合には、pv.getName().replace("epics://","")とする。

## Intensity Graph

Intensity GraphのGraph Area Width、Graph Area HeightがWidth、Heightと同じ値に設定できなくなっている。(CSS 3.1.2ではできる)
何故か、Graph Area WidthはWidth - 12、Graph Area HeightはHeight - 9 になっているようだ。

CSS 3.2.16で編集したOPIを CSS 3.1.2 で動かした場合

CSS 3.2.1の頃は、バージョンが違うという意味の警告ダイアログが表示されたが、CSS 3.2.16との間では何も表示されない。
バージョンが違うというメッセージは表示されるが動作は問題ない。表示さうるさいなら、CSS 3.1.2でファイルを保存すればそれ以降は表示されない。
ただ、CSS 3.1.2 には存在しないAPIやwidgetが使われていたりするとエラーが発生する。逆もまた然り。

CSS 3.2.16でのpython script内に日本語

通常のpythonと同様に、encodingを設定する

# -*- coding: utf-8 -*-

をファイルの先頭に記述しておけば、日本語でのコメントが記述できるようになった。

## ENUM 型の扱いが厳密になってる

CSS 3.1.2では、IOCのbiやmbbiにZRST,ONST等の設定がなくても処理してくれたが、CSS 3.2.16は

Traceback (most recent call last):
File "<script>", line 11, in <module>
at org.epics.vtype.IVEnum.<init>(Unknown Source)
at org.epics.vtype.ValueFactory.newVEnum(Unknown Source)
at org.csstudio.simplepv.utilitypv.UtilityPV.iValueToVType(Unknown Source)
at org.csstudio.simplepv.utilitypv.UtilityPV.getValue(Unknown Source)
at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
java.lang.IndexOutOfBoundsException: java.lang.IndexOutOfBoundsException: VEnum index must be within the label range

というような例外が発生する。

CSS 3.2.16のソースコードでは、

public IVEnum(int index, List<String> labels, Alarmn alarm, Time time) {
super(alarm, time);
if (index < 0 || index >= labels.size()) {
throw new IndexOutOfBoundsException("VEnum index must be within the label range");
}
this.index = index;
this.labels = labels;
}

となっている。

## IOCを再起動するとwidgetがDisable状態になる場合がある

CSSパネルを表示したまま該当レコードを持つIOCを停止し起動しなおすとこの状態になる。
このような状態になった場合には、OPI画面を選択し、F5キーを押してリフレッシュすることで復旧する。
復旧するにはパネルを立ち上げなおす必要があり、対策としてはスクリプト経由で書き込むようにすると発生しなくなる。

preferences->CSS Applications->Display->BOY->OPI Runtimeの PV Connection Layerの設定をpvmanagerにすると、IOCを再起動しても自動的に再接続される。
ただし、loc://の初期値設定のような問題が発生する。

Last modified 9 years ago
Last modified on 01/19/15 10:03:45