Proceedings of the 12th Annual Meeting of Particle Accelerator Society of Japan
August 5-7, 2015, Tsuruga, Japan

PASJ2015 THP101Python による加速器制御用 GUI プログラミング
GUI PROGRAMMING FOR THE ACCELERATOR CONTROL SYSTEM USINGPYTHON中村達郎#, A), 青山知寛 B), 藤田誠 B), 中村卓也 B), 吉井兼冶 B)
Tatsuro Nakamura #, A), Tomohiro AoyamaB), Makoto FujitaB), Takuya NakamuraB), Kenzi YoshiiB)
A)
High Energy Accelerator Research Organization (KEK)B)
Mitsubishi Electric System & Service Co., Ltd.

Abstract

KEKB and SuperKEKB accelerator control system has been built based on EPICS, which is the software frameworkfor the distributed control system. Among the EPICS standard toolkits, there are several kinds of graphical editors tobuild the application programs with GUI (Graphical User Interface), such as MEDM, EDM and CSS BOY. Although
they are powerful and easy to use without programming, another way to build applications using scripting languages
such as Python is still available. The GUI programming is the more flexible way to develop applications but rather
complicated. We have developed some programming tools in Python6 for the EPICS-based control system in order tomake the GUI programming easy and efficient. These tools are presented in this paper.
これら制約のある Display Manager と比べて高度で柔軟な GUI を制限なく作成可能な反面、作成に手間がかかり、また技術の習得にも時間が掛かるのが難
加速器の遠隔制御システムでは、中央制御室から操作を行なうためにグラフィカルユーザインター 点であった。
KEKB 加速器では 2000 台を超える電磁石電源をフェース（GUI）を備えた計算機プログラムを使う扱うことから大規模な操作パネルの開発が必要でことが広く行われている。このようなプログラムはしばしば「操作パネル」と呼称される。GUI を使う あったこともあり、Python によるプログラミングにことで加速器の運転員は直観的な操作が可能になる。 よる操作パネルの開発が行われた。その過程でなる
KEKB/SuperKEKB 加速器では、制御システムを構築 べく開発を容易にし、効率化するための様々な工夫
す る た め の ソ フ ト ウ ェ ア ・ ツ ー ル キ ッ ト と し て が試みられた。以下では Python による開発環境につEPICS (Experimental Physics and Industrial Control いて説明を加えた後、二つの試みについて報告する。

1.

はじめにSystem) [1]を採用している。EPICS においても操作パ
Python による開発環境
ネルを作成するためのツールが各種提供されている。 2.
Python は平易な文法で初心者でも学習が容易なイ
特にグラフィカル・エディタを備え、操作パネルの設計・製作も GUI によって直観的に行なえるような ンタプリタで動作するプログラミング言語である。
ツールは非常に重要で、EPICS では Display Manager 平易なだけでなく、リスト、タプル、辞書といったと呼ばれており、EDD/DM, MEDM, DM2K, EDM, 高度なデータ構造を扱うことができ、オブジェクトCSS BOY など、幾多のツールが開発・提供されて 指向プログラミングもサポートする。また各種の拡来た。いずれもプログラミングを行なう事無しに操 張モジュール（ライブラリ）の開発が盛んに行なわ作パネルを作成することができ、計算機に習熟して れており、様々な分野に適用することができる。
いないユーザでも素早い開発が可能で、効率よく開 GUI のための拡張モジュールはいくつかあるが、KEKB 加速器では Tcl/Tk とのインターフェース・モ発が行える。
一方これと異なるアプローチとして Python などの ジュールである Tkinter を採用した。Tkinter は古くスクリプト言語を用い、プログラミングによって からあるモジュールで、基本的な widget は揃っておGUI を構築して操作パネルを開発する方法がある。 り、複雑な GUI を構築するための機能も備えている。
Display Manager では開発が容易な反面、GUI 部品 しかし複雑な制御用の GUI を作り込んで行くにはそ（widget）は用意されているものから選ぶため機能 れなりの量のプログラミングが必要である。
EPICS はネットワーク分散型の制御システムであや外見が制約されることになる。（Display Manager
によってはユーザによる機能拡張がある程度可能な る 。 制 御 対 象 ハ ー ド ウ ェ ア に 接 続 さ れ た 計 算 機ものもある。）また多数の制御点に対応して多数の （IOC, Input Output Controller）や、操作パネルなどwidget を並べた操作パネルを作成するような場合、 の上位アプリケーションを実行する計算機（OPI,手作業で widget を配置して行くのは却って手間がか Operator Interface）など、多数の計算機が分散処理をかり誤りも起きやすいため、作成の自動化を図る仕 行なうシステムに向いたソフトウェアであり、その組みが必要になる。プログラミングによる方法では、 中核となる通信プロトコルは Channel Access（CA）と呼ばれ、クライアント・サーバ・モデルに基づく。
# tatsuro.nakamura@kek.jp___________________________________________- 1282 -Proceedings of the 12th Annual Meeting of Particle Accelerator Society of Japan
August 5-7, 2015, Tsuruga, JapanPASJ2015 THP101

CA で扱うデータ単位は制御点一点一点に対応した 3.2 CA-variable
値（スカラー値、文字列、もしくは配列データ）でTk では変数（variable）を定義することができ、あり、チャネル（Channel）と呼ばれる。チャネルは ある種の widget では変数の値を表示したり、オペそれに付けられた名前で区別・参照される。CA の レータが入力した値を変数に受け取ったりすること
基 本 動 作 は あ る 意 味 単 純 で あ り 、 値 の 読 み 取 り ができる。この便利なメカニズムを利用して、変数（get）、値の書き込み（put）、値の監視（monitor） に CA のチャネルを結びつけることで、変数を通じの 3 つがある。値の監視とは、値に変化があった時 てチャネルの値を表示したり、変数への入力値をなどに非同期的に通知が行われるもので、クライア チャネルに書き込んだりすることが簡単にできるよ
ント側では予め登録されたコールバックルーチンが うになる。Tkinter では変数は Variable クラスを継承呼び出される。CA のクライアント・ライブラリは して実装されている。そこで Variable クラスを継承
様々なプログラミング言語での実装があり、Python し CA の機能を持たせた caVar クラスを作成した。
では ca モジュールが作られている。
このクラスから派生した 4 つのクラス（caStringVar,caIntVar, caDoubleVar, caBooleanVar）のインスタン
3. 制御用 widget ライブラリ
スを CA-variable と呼ぶ。CA-variable には EPICS のチャネルと結び付けを行なう
assign メソッドが用意
3.1 widget と EPICS の連携されていて、チャネル名とモードを指定して呼び出
一 つ 目 の ア プ ロ ー チ は 、 制 御 で よ く 使 わ れ る す。モードには’monitor’, ’put’, ’both’があり、それぞwidget をライブラリとして用意しておくことで、操 れチャネルの読み出し、チャネルへの書き込み、読作パネル開発の効率化を図るものである [2]。さらに み書き両方を行なう事を指定する。
widget ライブラリそのものの開発も、EPICS CA とCA-variable を用いたプログラミングは、(1) CA連携させるツールを用意することで定型化し、効率 variable を作ってチャネルと結び付け、(2) それを化を図った。
Tk の一般的な widget に渡す、という手順になる。
## Example of customizing procedure#Label (Tk standard widget) --> caLabel (CA-widget)#
import Tkinterfrom caxtk import *class caLabel(caWidget,Tkinter.Label) : # Base classes are caWidget and Label_widgetbase = Tkinter.Label# Base widget class_mode = "monitor"# Mode of caVar_varkey = "textvariable" # Option name to accept a variable in base class_ruleset = RULESET# Predefined Configuration Rules## Example of how to use a CA-widget (caLabel)#
if __name__=="__main__" :root = Tkinter.Tk()# create root window

caLabel(root,channel="COTEST:TESTREC:AI",rule=1).pack()# Simple example

caLabel(root,channel="COTEST:TESTREC:AI",rule=1,conv=lambda x:x*1000,format="%10.3f mV",relief="groove",bd=2).pack(padx=8,pady=8)# More options

Tkinter.Button(root,text="Exit",command=root.quit).pack() # Exit button
xca.pend_event(0.1)# flush CA requestroot.mainloop()# main event loop

Figure 1: Sample program using CA-widget; the source code (left) and the result (right).

- 1283 -Proceedings of the 12th Annual Meeting of Particle Accelerator Society of Japan
August 5-7, 2015, Tsuruga, Japan

PASJ2015 THP101
3.3

CA-variable のデータ変換と書式

CA-variable は GUI による入出力データと CA でやり取りされるデータを仲介するものと言えるが、その際にデータの加工を行なうこともできるようにした。conv オプションによりデータ変換関数を指定できる。また format オプションで書式を指定することでデータの文字列への変換を細かく指定することもできる。なお both モードでは読み書き両方を扱うため、conv オプションに加え、逆変換関数を rconv オプションで指定する。
3.4

CA-widget

CA-variable を使うことでプログラムが短縮化できる が 、 さ ら に 一 歩 進 め て CA-variable の 生 成 とwidget の生成を 1 度に行えるようにしたのが CAwidget である。これは一般の widget をベースに CAの機能を組み込み、EPICS 用にカスタマイズしたものであって、様々な widget があるがそれらを総称して CA-widget と呼んでいる。CA-widget を容易に開発するため caWidget という抽象クラスを導入した。
CA-variable の生成や EPICS CA に関係する機能はcaWidget クラスが集中的に受け持っている。ベースとなる widget と caWidget とを併せて継承することで簡単に CA-widget を創り出すことができる。ベースとなる widget は EPICS とは関係なく作られた汎用のもので良く、Tk の変数を受け入れるように作られていることが唯一の必須条件である。Figure 1 はプログラミング例である。ここの前半では caWidget
クラスを用いて caLabel という名称で CA-widget のクラスを一つ定義し、後半では作成した caLabel クラスを使って簡単な表示パネルを作っている。
3.5

できる。Figure 3 は DCR で色を変えた見本である。
色を変え方の規則は予め幾つか用意されていて CAwidget を使う時にユーザが簡単に選択することができる。また決められたものを選ぶだけでなく細かく指定してカスタマイズすることも可能である。DCRも CID と同様に、caWidget を継承するだけで自動的に CA-widget に組み込まれる。

Figure 3: Example of DCR.
3.7

CA-widget の作成例

CA-widget として開発した例を Figure 4、Figure 5に示す。Figure 1 では説明のために単純な例を示したが、これらの例は実際のプログラム開発に使っているものである。
Figure 4 は caBitPattern と呼ぶ widget で、データをビット列として扱い、各ビットのオン・オフ状態を一列に表示するものである。図では表示の向きや形態などが異なる 4 つの widget を並べている。また、
CID の表示や DCR によって赤く警告表示がなされている様子も例示されている。

CID

さらに CA-widget には便利な機能を付加してある。
その一つが CID（Channel Information Display）である。CID はチャネルの情報を表示する小さなウインドウで、CA-widget の上でマウスの中ボタンを押すと表示される。Figure 2 は CID の例である。CID の機 能 は caWidget ク ラ ス に 実 装 し て い る た め 、
caWidget を継承するだけで自動的に CA-widget に組み込まれる。

Figure 4: Example of caBitPattern.

Figure 2: Example of CID.
3.6

DCR

も う 一 つ の CA-widget の 付 加 機 能 は DCR（Dynamic Configuration Rule）である。これはチャネルの状態に応じて色や外見を動的に変えて表示する仕組みである。典型的な例ではチャネルのアラー
ム状態に応じて黄色や赤色の警告表示にすることがFigure 5: Example of caWritableLabel.
Figure 5 は caWritableLabel と呼ぶ widget で、文字列の表示を行なう Tk の Label widget を拡張したものである。通常はデータを文字列で表示しているだ
けだが、ダブルクリックすることで入力用のダイア- 1284 -Proceedings of the 12th Annual Meeting of Particle Accelerator Society of Japan
August 5-7, 2015, Tsuruga, Japan

PASJ2015 THP101

ログボックスが現れ、チャネルの値を書き換えることができる。

ン・ウインドウの雛形を作成したりするなどの工夫を試みて来た。開発に使用した Python は学習が容易なスクリプト言語であり、プログラミングの専門家ではない制御システムのユーザにも使い易い。また
4. アプリケーション・ウインドウの雛形
Python ではオブジェクト指向プログラミングが可能
二つ目のアプローチは、アプリケーション開発の なため、制御に必要な機能を組み込むといった、機ベースとなるウインドウの雛形を用意することであ 能拡張の開発を行なうのにも適している。
一方、今回の試みでは Tkinter を採用したことでる。そこで試行的に簡単な雛形を作成してみた。
Tkに強く依存したものとなっている。GUI の構築
Figure 6 は雛形を利用してアプリケーション・ウイのための拡張モジュールはいろいろな選択肢があるンドウを作った見本である。雛形は widget を配置するためのメインの作業領域を中心にして、メニュー が、相互に互換性が無く共用も難しいため、どれをバー、コマンドボタン領域、ステータス表示領域を 選択するかは悩ましいところである。一度採用した備えている。また、File メニュー、Help メニューを ものから途中で乗り換えるのはコストがかかる。
予め用意しており、画面コピーボタンも組み込まれ もっともこれは Python に限らず GUI のプログラミている。また図では見えないが、バルーンヘルプを ング全般に言えることであり、解決の難しい課題と表示する機能も備えている。図の利用例では雛形を 言える。
基に「Welcome !」という表示、「Misc.」メニュー、 今後は実際の加速器の制御・運転に即した操作パ
ネルの使われ方を研究し、効率的な運転・開発をサ「45%」と書かれたボタンを追加している。
ポートできるようなツールを充実させて行きたい。

5.

まとめ

プログラミング無しで操作パネルを作成できる
Display Manager は強力なツールであるが、場合によってはプログラミングによる方法で開発することが適していることもある。プログラミングの柔軟性をなるべく損なわずに効率化を図るため、制御用のwidget ライブラリを開発したり、アプリケーショ

参考文献[1] http://www.aps.anl.gov/epics/[2] T. T. Nakamura, et al., “Development of the Python/Tk
Widgets for the Control System based on EPICS”, EPAC
2000, Vienna, June 2000, p. 1865.

標準 File メニュー

標準 Help メニュー
バルーンヘルプ

メイン作業領域

カスタマイズ可能なメニューバー

画面コピーボタン

コマンドボタン領域

ステータス表示領域

プログレスバー

Figure 6: Template of the Application Window.

- 1285 -