[KEKB Bunch Feedback Group]

TCP/IPを使って直接Linux IOCからビーム位相検波器(ADA-204574)を操作するEPICS device supportの製作(Japanese)


by とびやま まこと(Makoto Tobiyama)/KEKB ビームモニターグループ

警告
以下の記述に関しては、意図する、しないに関わらず極めて多くの誤り、誤解が含まれていると思われますので、決して信用してはいけません。これを信じて起きた損害に関しては、当方は一切責任を持ちません。


If you need contact with the author, please E-mail makoto.tobiyama@kek.jp.
目次

1.はじめに

ビーム位相検波器(ADA-204574)は、ビーム位置電極からの2つ信号、及び基準RF信号との位相差を検出するために製作したモジュールで、KEKBモニターグループから株式会社日放電子殿に製作を発注したものです。 このモジュールは、19インチラックマウント仕様で、Ethernet端子を備え、TCP/IPでコマンドを送ることによりリモートコントロール出来ます。内実は、XportデバイスがEthernetから送られたコマンドをSerialに変換して通信をしています。

2.サポートする機能

位相検波器のリモートコマンドはおおむね以下の表の通りです。
HeaderFunctionExample
RAT1CH1 Attenuator(-31〜0)読み込み[要求]RAT1<CR><LF>[応答] AT1:-18<CR><LF>
RAT2CH2 Attenuator(-31〜0)読み込み[要求]RAT2<CR><LF>[応答] AT2:-10<CR><LF>
RCH1CH1レベル読み込み[要求]RCH1<CR><LF> [応答]CH1:-0.5,4005<CR><LF>
RCH2CH2レベル読み込み[要求]RCH2<CR><LF> [応答]CH2:-10.2,305<CR><LF>
RINP位相差を比較する信号読み込み[要求]RINP<CR><LF> [応答]INP:1,2<CR><LF>
RPHV位相差読み込み[要求]RPHV<CR><LF> [応答]PHV:-10.35<CR><LF>
RREFRefレベル読み込み[要求]RREF<CR><LF> [応答]REF:-3.5,802<CR><LF>
RSAM平均回数読み込み[要求]RSAM<CR><LF> [応答]SAM:1024<CR><LF>
RTEM恒温室温度読み込み[要求]RTEM<CR><LF> [応答]TEM:32.5,258<CR><LF>
RVERソフトバージョン表示[要求]RVER<CR><LF> [応答]VER:1.01 2004/06/02 (142)<CR><LF>
SAT1CH1 Attenuator(-31〜0)設定[要求]SAT1:-17<CR><LF>[応答] AT1:-17<CR><LF>
SAT2CH2 Attenuator(-31〜0)設定[要求]SAT2:-10<CR><LF>[応答] AT2:-10<CR><LF>
SINP位相差を比較する信号設定[要求]SINP:1,2<CR><LF> [応答]INP:1,2<CR><LF>
SSAM平均回数設定[要求]SSAM:1024<CR><LF> [応答]SAM:1024<CR><LF>

この他にも、DSP/CPUリセットコマンドがありますが、省略します。

3.EPICS環境

本デバイスサポートは、Linux PC上で動作しているEPICS R314.6+Async driver 3-3で開発したものです。LinuxはRed Hat 9で、Pentium4(3GHz) CPU上で動作しています。EPICSそのものに対する説明、入門出家入道遁世については専門家に帰依するなり、コントロールグループのページをご参照なさるなりしてください。Linux PC上にEPICS R314.6及びAsync driverのインストール等については、秘伝がありますので、いずれ別項で説明をする予定です。

以下で使う、directory構造は次の通りとお思い願わしゅう存じます。

4.コードの概要

Linux PC上でIOCを立ち上げ、それから直接モジュールとTCP/IPで通信を行うことにします。このため、EPICS async driverを使うことになります。今回は、超安直に、このモジュールがリモートGP-IBデバイスだ、という気になって、GP-IBデバイスサポート的に作ることにします。きっともっとスマートな方法があるとは思いますが。 GP-IBのAsynデバイスサポートについては、 このメモ が参考になるようです。

はじめに、abco1上でGDLファイルを作り、gdcでコンパイルします。

これで出来た.cファイルの中から、このあたりだけを使います。

Linux PCのEPICS application directoryの所に、asynドライバーの中の、testGpibSerialAppの中のdevTestGpibSeal.cをコピーして、devB4phase.cとします。先ほど作ったファイルを使い、秘術を尽くして紆余曲折の結果編み出されたのが、本デバイスサポートです。

以下、変更のポイントを示します。

dbdファイルをデバイスサポートファイルに従い次のように定義します。(file名はdevB4phase.dbd)


#support for testing
device(ai,GPIB_IO,devAiB4phase,"NP_PS")
device(ao,GPIB_IO,devAoB4phase,"NP_PS")
device(bi,GPIB_IO,devBiB4phase,"NP_PS")
device(bo,GPIB_IO,devBoB4phase,"NP_PS")
device(longin,GPIB_IO,devLiB4phase,"NP_PS")
device(longout,GPIB_IO,devLoB4phase,"NP_PS")
device(mbbi,GPIB_IO,devMbbiB4phase,"NP_PS")
device(mbbo,GPIB_IO,devMbboB4phase,"NP_PS")
device(stringin,GPIB_IO,devSiB4phase,"NP_PS")
device(stringout,GPIB_IO,devSoB4phase,"NP_PS")


そして、srcのところにある、Makefileを変更しておきます。
TOP=../..

include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE
#=============================

ASYN = /local/R314.6/modules/soft/asyn/3-3
ASYN_LIB = /local/R314.6/modules/soft/asyn/3-3/lib/linux-x86
ASYN_BIN = /local/R314.6/modules/soft/asyn/3-3/bin/linux-x86

fblinux_DBD += fblinuxInclude.dbd

#============================

# Build an IOC support library

LIBRARY_IOC += FBsupport

# The following are compiled and added to the Support library
FBsupport_SRCS += devB4phase.c

FBsupport_LIBS += asyn
FBsupport_LIBS += $(EPICS_BASE_IOC_LIBS)

#=============================
# build an ioc application

PROD_IOC = fblinux
# fblinux.dbd will be created and installed
DBD += fblinux.dbd

# <name>_registerRecordDeviceDriver.cpp will be created from <name>.dbd
fblinux_SRCS += fblinux_registerRecordDeviceDriver.cpp
fblinux_SRCS_DEFAULT += fblinuxMain.cpp
fblinux_SRCS_vxWorks += -nil-

# Add locally compiled object code
fblinux_SRCS += dbSubExample.c

# The following adds support from base/src/vxWorks
fblinux_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary

fblinux_LIBS += FBsupport

# NOTE: To build SNL programs, SNCSEQ must be defined
# in the <top>/configure/RELEASE file

ifneq ($(SNCSEQ),)
    # This builds sncExample as a component of fblinux
    fblinux_DBD += sncExample.dbd
    fblinux_SRCS += sncExample.stt
    fblinux_LIBS += seq pv

    # The following builds sncProgram as a standalone application
    PROD_HOST += sncProgram
    sncProgram_SNCFLAGS += +m
    sncProgram_SRCS += sncProgram.st
    sncProgram_LIBS += seq pv
    sncProgram_LIBS += $(EPICS_BASE_HOST_LIBS)
endif

fblinux_LIBS += $(EPICS_BASE_IOC_LIBS)

#===========================

include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE



で、makeで実行ファイルが出来ます。VxWorksの所はこのままではおかしいかもしれません。

5.EPICSデータベースサンプル

このデバイスサポートで使うデータベースの例を示します。
DTYPRecordSignalNameFunctionRemarks
NP_PSlongin0$(USER):PHASE:AT1:READATT1読み込み
NP_PSlongin1$(USER):PHASE:AT2:READATT2読み込み
NP_PSai2$(USER):PHASE:CH1:READCH1レベル読み込み2秒毎にスキャン
NP_PSai3$(USER):PHASE:CH2:READCH2レベル読み込み2秒毎にスキャン
NP_PSmbbi4$(USER):PHASE:MIX:READMixer入力読み込み使用不可
NP_PSai5$(USER):PHASE:PS:READ位相差読み込み2秒毎にスキャン
NP_PSai6$(USER):PHASE:REF:READREFレベル読み込み
NP_PSlongin7$(USER):PHASE:AVE:READ平均回数読み込み
NP_PSai8$(USER):PHASE:TEMP:READ恒温槽温度読み込み
NP_PSstringin9$(USER):PHASE:VER:READソフトバージョン読み込み後半部分は出てこない
NP_PSlongout10$(USER):PHASE:AT1:SETATT1設定
NP_PSlongout11$(USER):PHASE:AT2:SETATT2設定
NP_PSmbbi12$(USER):PHASE:MIX:SETMixer入力設定使用不可
NP_PSlongout13$(USER):PHASE:AVE:SET平均回数設定
NP_PSbo14$(USER):PHASE:INPUT:ABMix入力CH1-CH2設定MBBOの代替
NP_PSbo15$(USER):PHASE:INPUT:ACMix入力CH1-CH3設定MBBOの代替
NP_PSbo16$(USER):PHASE:INPUT:BCMix入力CH2-CH3設定MBBOの代替
NP_PSlongin17$(USER):PHASE:INPUT:READMIX入力読み込み0=CH1-CH2,1=CH1-CH3,2=CH2-CH3
SoftmbbiN/A$(USER):PHASE:INPUT:SELMixer入力読み込み

特記のないreadデータベースのscanは10秒、設定functionがあるものは、設定後flinkですぐreadbackします。 データベースファイル本体例は以下をご参照ください。

ここで、データベースのディレクトリのMakefileも変更しておく必要があります。


TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
#  ADD MACRO DEFINITIONS AFTER THIS LINE

#----------------------------------------------------
#  Optimization of db files using dbst (DEFAULT: NO)
#DB_OPT = YES

#----------------------------------------------------
# Create and install (or just install)
# databases, templates, substitutions like this
#DB += dbExample1.db
#DB += dbExample2.db
#DB += dbSubExample.db
DB += FB_TB4PHASE.db

#----------------------------------------------------
# If <anyname>.db template is not named <anyname>*.template add
# <anyname>_TEMPLATE = <templatename>

include $(TOP)/configure/RULES
#----------------------------------------
#  ADD RULES AFTER THIS LINE


変更したときは、ここ、念のため上でmakeが必要です。

6.スタートアップファイルサンプル

~/epicsApp/iocBoot/iocfblinux/で、st.cmdを変更します。ポイントは、 です。参考のため、st.cmdファイルを以下に示します。 実行時は、./st.cmdでIOCが立ち上がります。

7.おわりに

asynドライバーを使い、Linux PC上で動くEPICS IOCから直接Ethernetデバイスを操作するデバイスサポートの製作を紹介しました。EPICS R314.6のインストール及びASYNドライバーのインストールでは、物質構造科学研究所放射光研究施設光源研究系帯名さまのご指導を頂きました。また、本デバイスサポートの製作では、KEKBコントロールグループの小田切さま、山本さまの手厚いご助力を賜りました。感謝します。
Makoto Tobiyama
21/Jan/2005

Return to FB Home Page...