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

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

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

あらゆるものをWindows上で動かさないと気がすまない筆者なので、頑張ってExperimental Physics and Industrial Control System (EPICS) R3.15をWindows上で動かすことにする。7.0用の記事もあるが、Windowsで動かすには色々バグがあるかもしれない。

ビルドに必要なアイテムは4つ

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

当環境の各バージョンは以下の通り

>make --version
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
これはフリーソフトウェアです. 利用許諾についてはソースを
ご覧ください.
商業性や特定の目的への適合性の如何に関わらず, 無保証です.
This program built for i386-pc-mingw32

>perl --version
This is perl 5, version 32, subversion 1 (v5.32.1) built for MSWin32-x64-multi-thread
Copyright 1987-2021, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

>cl
Microsoft(R) C/C++ Optimizing Compiler Version 19.29.30151 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.
使い方: cl [ オプション... ] ファイル名... [ /link リンク オプション... ]

>git --version
git version 2.37.2.windows.2

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

>git clone --recursive -b 3.15 https://github.com/epics-base/epics-base.git ./epics-base_v3.15

このまま

> cd epics-base_v3.15
> make

とすると、bin/windows-x64 にビルドされた exe がインストールされる。

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

EPICS_BASE=C:\Users\Masahiro\epics-base_v3.15
EPICS_HOST_ARCH=windows-x64
PATH=C:\Users\Masahiro\epics-base_v3.15\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 R3.15.9.1-DEV
## EPICS Base built Nov  1 2023
############################################################################
iocRun: All initialization complete

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

epics> dbl
temperature:water
epics>

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

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

> caget temperature:water
>caput temperature:water 20
Old : temperature:water              0
New : 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

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

当 Windows 環境で以下のエラーが出たのでその解決方法について書いておく。

>caget temperature:water
temperature:water              0
CA.Client.Exception...............................................
    Warning: "Identical process variable names on multiple servers"
    Context: "Channel: "temperature:water", Connecting to: XXX.XXX.XXX.XXX:5064, Ignored: hostname.mshome.net:5064"
    Source File: C:\Users\Masahiro\epics-base_v3.15\src\ca\client\cac.cpp line 1308
    Current Time: Wed Nov 01 2023 20:28:41.805707200
..................................................................

これは、複数のサーバー上で同じプロセス変数名 と言う警告であるが、チャンネルアクセス(CA) を管理しているホストに名前がついていて、IPアドレスと名前でアクセス出来る場合等に起こる現象のようである。

CHAPTER 1 Configuration

を参考に、CAのアドレスに対する環境変数を設定する。例えば、

EPICS_CA_ADDR_LIST=127.0.0.1
EPICS_CA_AUTO_ADDR_LIST=NO

とするとよい。