1.1 EPICS有关于什么?
我们假设你多少知道EPICS是什么。这里我们从头开始并且达到这一点:我们有一台提供某些用于读取(caget或pvget)和写入(caput或pvput)的PVs的工作服务器,并且从在相同机器或者相同网络中另一台机器的另一个终端读和写它们,你将必须重复对应为它们安装EPICS的步骤。
1.2 准备你的系统
你需要make,C++和libreadline来从源代码编译。在macOS上,通过使用例如homebrew可以按照这些依赖。在Linux上,你可以使用apt-get install。在CentOS8上EPICS所需包的文档列出了构建EPICS base,sequencer, synapps模块和areaDetector所需的所有包。
1.3 安装EPICS
mkdir $HOME/EPICS
cd $HOME/EPICS
git clone --recursive https://github.com/epics-base/epics-base.git
cd epics-base
make
在编译之后,你应该通过添加以下到${HOME}/.profile或${HOME}/.bashrc两个文件之一:
export EPICS_BASE=${HOME}/EPICS/epics-base
export EPICS_HOST_ARCH=$(${EPICS_BASE}/startup/EpicsHostArch)
export PATH=${EPICS_BASE}/bin/${EPICS_HOST_ARCH}:${PATH}
EpicsHostArch是一个由EPICS提供的程序,它返回你系统的架构。因而以上代码应该适合每种架构。
1.4 测试EPICS
现在登出并且再次登录,使得你的新路径被正确设置。此外,用从终端直接导出开始,你可以执行以上三行代码。
运行softIoc并且如果每件事都正常,你应该见到一个EPICS提示符。
[blctrl@rockygu EPICS]$ softIoc
epics>
你可以用ctrl-c或者输入exit退出。
那不太令人印象深刻,但你至少知道EPICS被正确地安装了。所以,现在让我们尝试更复杂的事情,它将可以建议EPICS如何运行。
在你喜欢的任何目录中,准备一个文件test.db,其内容如:
record(ai, "temperature:water")
{
field(DESC, "Water temperature in the fish tank")
}
这个文件定义了一个名为temperature:water的记录,它是一个模拟输入记录(ai)。如你所想DESC代表描述。现在我们再次启动softIoc,但这次使用了这个记录数据库。
[blctrl@rockygu EPICS]$ softIoc -d test.db
Starting iocInit
############################################################################
## EPICS R7.0.6.2-DEV
## Rev. R7.0.6.1-106-g2f8272d3a17065693b29-dirty
############################################################################
iocRun: All initialization complete
epics>
现在,从你的EPICS提示,你可以用dbl命令列出可用的记录并且你将见到像这样的东西:
epics> dbl
temperature:water
epics>
打开一个新终端(我们称它nr2),并且尝试命令行工具caget和caput。你将见到像这样的东西:
[blctrl@rockygu root]$ caget temperature:water
temperature:water 0
[blctrl@rockygu root]$ caget temperature:water.DESC
temperature:water.DESC Water temperature in the fish tank
[blctrl@rockygu root]$ caput temperature:water 21
Old : temperature:water 0
New : temperature:water 21
[blctrl@rockygu root]$ caput temperature:water 24
Old : temperature:water 21
New : temperature:water 24
[blctrl@rockygu root]$ caget temperature:water
temperature:water 24
现在再打开另一个终端(nr3)并且按以下尝试camonitor:
[blctrl@rockygu root]$ camonitor temperature:water
temperature:water 2022-06-12 17:19:00.186735 24
首先看一下在你从终端nr2使用caput更改temperature:water值时发生什么。接着,尝试更改这个值某个微小量,就15.500001,15.500002,15.500003, ... 你将见到camonitor响应但读取没有变化。如果你想要看到更多数字,你可以运行:
camonitor -g8 temperature:water
[blctrl@rockygu EPICS]$ caput temperature:water 15.5
Old : temperature:water 24
New : temperature:water 15.5
[blctrl@rockygu EPICS]$ caput temperature:water 15.500001
Old : temperature:water 15.5
New : temperature:water 15.5
[blctrl@rockygu EPICS]$ caput temperature:water 15.500002
Old : temperature:water 15.5
New : temperature:water 15.5
[blctrl@rockygu EPICS]$ caput temperature:water 15.500003
Old : temperature:water 15.5
New : temperature:water 15.5
[blctrl@rockygu root]$ camonitor -g8 temperature:water
temperature:water 2022-06-12 17:19:00.186735 24
temperature:water 2022-06-12 17:21:40.665269 15.5
temperature:water 2022-06-12 17:21:51.569668 15.500001
temperature:water 2022-06-12 17:21:58.426327 15.500002
temperature:water 2022-06-12 17:22:00.335431 15.500003
有关通道访问协议的进一步细节,包括有关caput, caget, camonitor...命令行工具,请参考
在现实中,你的温度计(在本例中)返回的8个数字不可能都重要。我们应该限制量级更改为百分之一度。要做这件事,我们添加一行到文件test.db,因而它读为:
record(ai, "temperature:water")
{
field(DESC, "Water temperature in Lab 10")
field(MDEL, ".01")
}
MDEL代表监视死区。如果你现在用新的test.db文件运行:
softIoc -d test.db
你将看到camonitor只响应大于0.01的变化。这只是一个简单示例。更多信息请参考最新Record Reference Manual(https://epics.anl.gov/base/R3-15/7-docs/RecordReference.html)。
[blctrl@rockygu EPICS]$ caput temperature:water 15.5
Old : temperature:water 0
New : temperature:water 15.5
[blctrl@rockygu EPICS]$ caput temperature:water 15.5001
Old : temperature:water 15.5
New : temperature:water 15.5001
[blctrl@rockygu EPICS]$ caput temperature:water 15.501
Old : temperature:water 15.5001
New : temperature:water 15.501
[blctrl@rockygu EPICS]$ caput temperature:water 15.51
Old : temperature:water 15.501
New : temperature:water 15.51
[blctrl@rockygu EPICS]$ caput temperature:water 15.52
Old : temperature:water 15.51
New : temperature:water 15.52
[blctrl@rockygu root]$ camonitor temperature:water
temperature:water <undefined> 0 UDF INVALID
temperature:water 2022-06-12 17:25:53.235584 15.5
temperature:water 2022-06-12 17:26:55.705535 15.52
1.5 创建一个demo/test来测试ca和pva
[blctrl@rockygu EPICS]$ mkdir -p TEST/testIoc
[blctrl@rockygu EPICS]$ cd TEST/testIoc/
[blctrl@rockygu testIoc]$ ls
[blctrl@rockygu testIoc]$ makeBaseApp.pl -t example testIoc
[blctrl@rockygu testIoc]$ makeBaseApp.pl -i -t example testIoc
Using target architecture linux-x86_64 (only one available)
The following applications are available:
testIoc
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name?
[blctrl@rockygu testIoc]$ ls
configure iocBoot Makefile testIocApp
[blctrl@rockygu testIoc]$ cd iocBoot/ioctestIoc/
[blctrl@rockygu testIoc]$ ls
configure iocBoot Makefile testIocApp
[blctrl@rockygu testIoc]$ make
make -C ./configure install
make[1]: Entering directory '/home/blctrl/EPICS/TEST/testIoc/configure'
perl -CSD /EPICS/epics-base/bin/linux-x86_64/makeMakefile.pl O.linux-x86_64 ../..
...
perl -CSD /EPICS/epics-base/bin/linux-x86_64/convertRelease.pl -t /home/blctrl/EPICS/TEST/testIoc envPaths
make[2]: Leaving directory '/home/blctrl/EPICS/TEST/testIoc/iocBoot/ioctestIoc'
make[1]: Leaving directory '/home/blctrl/EPICS/TEST/testIoc/iocBoot'
[blctrl@rockygu testIoc]$ cd iocBoot/ioctestIoc/
[blctrl@rockygu ioctestIoc]$ ls
envPaths Makefile README st.cmd
[blctrl@rockygu ioctestIoc]$ ./st.cmd
#!../../bin/linux-x86_64/testIoc
< envPaths
epicsEnvSet("IOC","ioctestIoc")
epicsEnvSet("TOP","/home/blctrl/EPICS/TEST/testIoc")
epicsEnvSet("EPICS_BASE","/EPICS/epics-base")
cd "/home/blctrl/EPICS/TEST/testIoc"
## Register all support components
dbLoadDatabase "dbd/testIoc.dbd"
testIoc_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/testIocVersion.db", "user=blctrl"
dbLoadRecords "db/dbSubExample.db", "user=blctrl"
#var mySubDebug 1
#traceIocInit
cd "/home/blctrl/EPICS/TEST/testIoc/iocBoot/ioctestIoc"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.6.2-DEV
## Rev. R7.0.6.1-106-g2f8272d3a17065693b29-dirty
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncExample, "user=blctrl"
epics> dbl
blctrl:aSubExample
blctrl:circle:angle
blctrl:line:a
blctrl:circle:x
blctrl:circle:y
blctrl:calcExample
blctrl:calcExample1
blctrl:calc1
blctrl:calcExample2
blctrl:calc2
blctrl:calcExample3
blctrl:calc3
blctrl:line:b
blctrl:aiExample
blctrl:aiExample1
blctrl:ai1
blctrl:aiExample2
blctrl:ai2
blctrl:aiExample3
blctrl:ai3
blctrl:circle:step
blctrl:circle:period
blctrl:circle:tick
blctrl:testIoc:version
blctrl:subExample
blctrl:compressExample
blctrl:xxxExample
epics>
现在在另一个终端中,可以尝试像以下的命令行工具:
caget, caput, camonitor, cainfo (Channel Access)
pvget, pvput, pvlist, eget, ... (PVAccess)
1.6 添加asyn包
cd $HOME/EPICS
mkdir support
cd support
git clone https://github.com/epics-modules/asyn.git
cd asyn
编辑$HOME/EPICS/support/asyn/configure/RELEASE并且像如下设置EPICS_BASE:
EPICS_BASE=${HOME}/EPICS/epics-base
由于此刻不需要IPAC=...和SNCSEQ=...,注释它们。整个文件应该读为:
#RELEASE Location of external products
HOME=/Users/maradona
SUPPORT=$(HOME)/EPICS/support
-include $(TOP)/../configure/SUPPORT.$(EPICS_HOST_ARCH)
# IPAC is only necessary if support for Greensprings IP488 is required
# IPAC release V2-7 or later is required.
#IPAC=$(SUPPORT)/ipac-2-14
# SEQ is required for testIPServer
#SNCSEQ=$(SUPPORT)/seq-2-2-5
# EPICS_BASE 3.14.6 or later is required
EPICS_BASE=$(HOME)/EPICS/epics-base
-include $(TOP)/../configure/EPICS_BASE.$(EPICS_HOST
1.7 安装StreamDevice(由Dirk Zimoch编写,PSI)
cd $HOME/EPICS/support
git clone https://github.com/paulscherrerinstitute/StreamDevice.git
cd StreamDevice/
rm GNUmakefile
编辑$HOME/EPICS/support/StreamDevice/configure/RELEASE指定EPICS base的安装路径以及其它软件模块,例如:
EPICS_BASE=${HOME}/EPICS/epics-base
SUPPORT=${HOME}/EPICS/support
ASYN=$(SUPPORT)/asyn
记住:如果在相同文件中定义了它,$(NAME)有效。如果一个shell变量是meant,必须使用带有花括号的${NAME}。编译器不喜欢某些替换是可能的。在这种情况下,用像/Users/maradona/EPICS...的完整路径替换${NAME}。
sCalcout记录是synApps的组成部分。如果应该对这个记录的支持构建streamDevice,你必须首先至少安装来自synApps的calc模块。由于它被忽略了,现在用我们只要用#注释点那行。
#CALC=${HOME}/EPICS/support/synApps/calc
如果你想要启用正则表达式匹配,你需要PCRE包。对于大多数Linux系统,已经按照了它。在那种情况中,告诉StreamDevice PCRE头文件和库的位置。但预安装的包只能被用于host架构。因而,不要添加它们到RELEASE,而是到RELEASE.Common.linux-x86(如果linux-x86是你的EPICS_HOST_ARCH)。注意:不同的linux发行版可能在不同目录中定位这些文件。
PCRE_INCLUDE=/usr/include/pcre
PCRE_LIB=/usr/lib
对于64位安装,这个库的路径可能不同:
PCRE_INCLUDE=/usr/include/pcre
PCRE_LIB=/usr/lib64
如果你此时你对正则表达式匹配的支持不感兴趣,则你使用#注释掉在configure/RELEASE文件中指向PCRE的行。总是能在后面添加它。
最终(我们在目录中...EPICS/suppport/StreamDevice)运行make。