物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Windows上でEPICS 7.0を使う: プロセス間でリアルタイム通信する

あらゆるものをWindows上で動かさないと気がすまない筆者なので、頑張ってExperimental Physics and Industrial Control System (EPICS) 7.0をWindows上で動かすことにする。

必要なアイテムは4つ

  • Windows用のmake (PATHを通す必要がある)
  • Windows用のperl
  • Visual Studio 2022 Community等
  • Windows用のGit

上記4つの準備が終わったら、Visual Studio 2022 Community 等の x64 Native Tools Command Prompt を開き、Gitで epics-base の最新版をcloneする。

> git clone --recursive https://github.com/epics-base/epics-base.git

このまま

> cd epics-base
> make

とすると途中で止まってしまう。Windows用の makeの abspath コマンドは、WindowsのC:\等を含むPATHに対するバグ(仕様)があるので、それを使ってる configure\CONFIG_BASE を修正する。

# TOOLS = $(abspath $(EPICS_BASE_HOST_BIN))
TOOLS = $(EPICS_BASE_HOST_BIN)

修正後、epics-base ディレクトリで

> make

とすると、で最後までビルド・インストールできるはずである。

C:\Users\Masahiro\epics-base でmakeした場合、以下のように環境変数を設定する。

EPICS_BASE=C:\Users\Masahiro\epics-base
EPICS_HOST_ARCH=windows-x64
PATH=C:\Users\Masahiro\epics-base\bin\windows-x64

EPICSのbaseがインストールできたか確認する。新しいコマンドプロンプトを立ち上げてsoftIoc というコマンドを実行すると、

> softIoc
epics>

「このアプリの機能のいくつかが Windows Defender ファイアウォールでブロックされています」という「Windows セキュリティの重要な警告」が出てくるはずである。他のプログラムでも同様に、各自の判断で、「アクセスを許可する」すること。

epics> と出ればインストールは成功している。Ctrl+Cでプログラムを終了させる。

管理する値を定義する。適当なディレクトリを作成し、次の内容の test.db ファイルを作る。

record(ai, "temperature:water")
{
    field(DESC, "Water temperature in the fish tank")
}

例は水の温度である。

コマンドプロンプトで、test.dbを作成したディレクトリに移動し、softIoc を実行すると、このdbファイルの値を管理するプロセスが立ち上がる。

>softIoc -d test.db
Starting iocInit
############################################################################
## EPICS R7.0.7.1-DEV
## Rev. R7.0.7-183-gb41787b6bf8093caaf00-dirty
## Rev. Date Git: 2023-10-22 17:42:36 -0700
############################################################################
iocRun: All initialization complete
epics>

この中で、値をリスト化するコマンドdblを実行すると、水の温度があることがわかる。

epics> dbl
temperature:water
epics>

別のプロセスから、水の温度の確認、追加をしてみよう。別のターミナル(2番)を開き、値を確認するコマンド caget、値をセットするコマンド caput を実行する。

※ WSL版だと caputではなく caset である。

> caget temperature:water
> caput temperature:water 20

ともあれ、これだけではリアルタイムで値が管理されているか分からない。

別プロセスから値をリアルタイムでモニターしよう。さらに別のターミナル(3番)を開き、モニターするコマンド camonitor を実行する。

> camonitor temperature:water

このままターミナル2番から caput で値をセットすると、セットしたタイミングで以下のように表示されるはずである。

temperature:water              2023-10-13 21:45:09.551818 24
temperature:water              2023-10-13 21:45:43.071098 21

以上で「コンピュータ内のプロセス間でリアルタイム通信する機能」を確認できた。

反応する値の精度を変える説明は、以下の英語のドキュメントを参照してほしい。

docs.epics-controls.org