EPICS 的安装
EPICS 官网
EPICS 官网 https://epics-controls.org/
EPICS入门
- 在Linux / UNIX / Darwin(Mac)上安装
我们假设您或多或少了解EPICS是什么。在这里,我们想
从头开始,直到拥有一台工作服务器的位置,提供一些
PV来读取(caget或pvget)和写入(caput或pvput),然后我们从同一计算机或其他终端上的另一个终端上对其进行读写。在同一网络中的另一个网络上。如果要使用两台不同的计算机,则必须为两台计算机重复安装EPICS的步骤。 - 准备系统
您需要make,c ++和libreadline才能从源代码进行编译。在macOS上,可以使用例如来安装这些依赖项homebrew。在Linux上,您可以使用apt-get install。 - 安装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提供的程序,可返回您的系统架构。因此,上面的代码对于每种体系结构都应该适用。
- 测试EPICS
新建一个命令窗口 运行softIoc
如果一切正常,您应该看到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
停留在 Description上。现在,我们 softIoc
再次开始,但是这次使用此记录数据库。
softIoc -d test.db
现在,在EPICS提示符下,您可以使用 dbl
命令列出可用的记录,您将看到类似
epics> dbl
temperature:water
epics>
打开一个新终端(命令2),然后尝试使用命令行工具 caget
和 caput
。您会看到类似
your prompt> caget temperature:water
temperature:water 0
your prompt> caget temperature:water.DESC
temperature:water.DESC Water temperature in the fish tank
your prompt> caput temperature:water 21
Old : temperature:water 0
New : temperature:water 21
your prompt> caput temperature:water 24
Old : temperature:water 21
New : temperature:water 24
your prompt> caget temperature:water
temperature:water 24
... etc.
现在打开另一个终端(命令3),并尝试监听命令 camonitor
camonitor temperature:water
首先,看看从端子(命令2) 更改温度:(water)水值时会发生什么。使用 caput
。然后,尝试将数值微调一些,例如15.500001、15.500002、15.500003……您会看到有 camonitor
反应,但读数没有变化。如果您想查看更多数字,可以运行
camonitor -g8 temperature:water
关于信道接入协议的更多细节,包括文档上 caput
,caget
,camonitor
…命令行工具,请参阅信道访问参考手册。
但是,在现实生活中,温度计返回的8位数字(在本示例中)不太可能都是有效的。因此,我们应该将流量限制在大约百分之一度的变化范围内。为此我们在文件中添加一行test.db,以便读取 【控制显示】
record(ai,“ temperature:water”)
{
field(DESC,“实验室10中的水温”)
field(MDEL,“ .01”)
}
MDEL
代表 Monitor Deadband。如果现在运行
softIoc -d test.db
对于新的test.db文件,您将看到它 camonitor
仅对大于0.01的更改做出反应
这只是一个简单的例子。有关更多信息,请参考《记录参考手册》
- 创建一个演示/测试IOC以测试CA和PVA
mkdir -p $HOME/EPICS/TEST/testIoc
cd $HOME/EPICS/TEST/testIoc
makeBaseApp.pl -t example testIoc
makeBaseApp.pl -i -t example testIoc
make
cd iocBoot/ioctestIoc
chmod u+x st.cmd
ioctestIoc> ./st.cmd
#!../../bin/darwin-x86/testIoc
< envPaths
epicsEnvSet("IOC","ioctestIoc")
epicsEnvSet("TOP","/Users/maradona/EPICS/TEST/testIoc")
epicsEnvSet("EPICS_BASE","/Users/maradona/EPICS/epics-base")
cd "/Users/maradona/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=junkes"
dbLoadRecords "db/dbSubExample.db", "user=junkes"
#var mySubDebug 1
#traceIocInit
cd "/Users/maradona/EPICS/TEST/testIoc/iocBoot/ioctestIoc"
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.1.2-DEV
## EPICS Base built Mar 8 2018
############################################################################
cas warning: Configured TCP port was unavailable.
cas warning: Using dynamically assigned TCP port 52907,
cas warning: but now two or more servers share the same UDP port.
cas warning: Depending on your IP kernel this server may not be
cas warning: reachable with UDP unicast (a host's IP in EPICS_CA_ADDR_LIST)
iocRun: All initialization complete
2018-03-09T13:07:02.475 Using dynamically assigned TCP port 52908.
## Start any sequence programs
#seq sncExample, "user=maradona"
epics> dbl
maradona:circle:tick
maradona:compressExample
maradona:line:b
maradona:aiExample
maradona:aiExample1
maradona:ai1
maradona:aiExample2
... etc. ...
epics>
现在在另一个终端中,可以尝试使用命令行工具,例如
caget, caput, camonitor,
cainfo (Channel Access)
pvget, pvput, pvlist,
eget … (PVAccess)
- 添加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_ARCH)
现在开始运行
make
- 安装StreamDevice(由PSI的Dirk Zimoch提供)
StreamDevice没有其自己的位置和 top/configure 目录。期望将其放入已经存在的顶级目录结构中。我们可以简单地创建一个 makeBaseApp.pl 文件
cd $HOME/EPICS/support
mkdir stream
cd stream/
makeBaseApp.pl -t support
git clone https://github.com/paulscherrerinstitute/StreamDevice.git
cd StreamDevice/
rm GNUmakefile
现在我们必须编辑 $HOME/EPICS/support/stream/configure/RELEASE
。未注释的行必须阅读
# Variables and paths to dependent modules:
MODULES = ${HOME}/EPICS/support
# If using the sequencer, point SNCSEQ at its top directory:
#SNCSEQ = $(MODULES)/seq-ver
# EPICS_BASE should appear last so earlier modules can override stuff:
EPICS_BASE = ${HOME}/EPICS/epics-base
# These lines allow developers to override these RELEASE settings
# without having to modify this file directly.
-include $(TOP)/../RELEASE.local
#-include $(TOP)/../RELEASE.$(EPICS_HOST_ARCH).local
-include $(TOP)/configure/RELEASE.local
ASYN=$(MODULES)/asyn
请记住,$(NAME)
如果它是在同一文件中定义的,那是可行的,但 ${NAME}
如果要使用shell变量,则必须使用大括号。编译器可能不喜欢某些替换。在这种情况下,请${NAME}使用完整路径替换变量,例如/Users/maradona/EPICS…
最后运行make 我们在目录中(…/EPICS/support/stream/StreamDevice)
创建输入/输出控制器(IOC)
IOC允许通过以太网与设备对话。为IOC 创建目录。例如 $HOME/EPICS/IOCs
为一个名为sampleIOC的IOC创建一个顶部
mkdir sampleIOC; cd sampleIOC
makeBaseApp.pl -t example sampleIOC
makeBaseApp.pl -i -t example sampleIOC
Using target architecture darwin-x86 (only one available)
The following applications are available:
sampleIOC
What application should the IOC(s) boot?
The default uses the IOC's name, even if not listed above.
Application name? (just return)
现在,通过运行make,构建了一个示例IOC,如演示/测试IOC 。接下来,我们要将asyn和StreamDevice添加到IOC。为此,我们将流和asyn库添加到Makefile中。编辑 sampleIOCApp/src/Makefile 并添加块
#add asyn and streamDevice to this IOC production libs
sampleIOC_LIBS += stream
sampleIOC_LIBS += asyn
应用程序也必须加载同步数据库和流.dbd使用StreamDevice。这可以放入一个生成的dbd,例如xxx支持.dbd 已经包含在生成文件。所以xxx支持.dbd现在读到:
cat sampleIOCApp/src/xxxSupport.dbd
include "xxxRecord.dbd"
device(xxx,CONSTANT,devXxxSoft,"SoftChannel")
#
include "stream.dbd"
include "asyn.dbd"
registrar(drvAsynIPPortRegisterCommands)
registrar(drvAsynSerialPortRegisterCommands)
registrar(vxi11RegisterCommands)
要查找dbd文件,必须在中添加这些文件的路径 configure/RELEASE
...
# Build variables that are NOT used in paths should be set in
# the CONFIG_SITE file.
# Variables and paths to dependent modules:
SUPPORT = ${HOME}/EPICS/support
ASYN=$(SUPPORT)/asyn
STREAM=$(SUPPORT)/stream
# If using the sequencer, point SNCSEQ at its top directory:
#SNCSEQ = $(MODULES)/seq-ver
...
如果make是之前完成,make distclean则可能是必需的。无论如何,然后make。新创建的IOC可以与以下命令一起运行:
cd iocBoot/iocsampleIOC/
chmod u+x st.cmd
./st.cmd
还不是很有趣,因为没有数据库文件也没有协议文件
ls -la sampleIOCApp/Db/
total 56
drwxr-xr-x 11 maradona staff 374 Jun 1 16:47 .
drwxr-xr-x 5 maradona staff 170 Jun 1 12:46 ..
-rw-r--r-- 1 maradona staff 523 Jun 1 12:46 Makefile
drwxr-xr-x 2 maradona staff 68 Jun 1 16:47 O.Common
drwxr-xr-x 3 maradona staff 102 Jun 1 16:47 O.darwin-x86
-rw-r--r-- 1 maradona staff 1761 Jun 1 12:46 circle.db
-rw-r--r-- 1 maradona staff 1274 Jun 1 12:46 dbExample1.db
-rw-r--r-- 1 maradona staff 921 Jun 1 12:46 dbExample2.db
-rw-r--r-- 1 maradona staff 286 Jun 1 12:46 dbSubExample.db
-rw-r--r-- 1 maradona staff 170 Jun 1 12:46 sampleIOCVersion.db
-rw-r--r-- 1 maradona staff 307 Jun 1 12:46 user.substitutions
请注意,这是一个Db目录,而不是db
./sampleIOC中的目录。对于Tektronix的MDOxxxx示波器,数据库(.db)和协议(.proto)文件可能类似于
cat MDO.db
record(stringin, $(P)$(R)idn){
field(DESC, "Asks for info blabla")
field(DTYP, "stream")
field(INP, "@MDO.proto getStr(*IDN,99) $(PORT) $(A)")
field(PINI, "YES")
}
cat MDO.proto
Terminator = LF;
getStr{
out "$1?";
in "%s";
@replytimeout {out "$1?"; in "%s";}
}
现在,我们 sampleIOCApp/Db/Makefile 在信息中添加了
这些文件必须包含在编译中的信息。所以
cat sampleIOCApp/Db/Makefile
TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
# ADD MACRO DEFINITIONS BELOW HERE
# Install databases, templates & substitutions like this
DB += circle.db
DB += dbExample1.db
DB += dbExample2.db
DB += sampleIOCVersion.db
DB += dbSubExample.db
DB += user.substitutions
DB += MDO.db
DB += MDO.proto
# If .db template is not named *.template add
# _TEMPLATE =
include $(TOP)/configure/RULES
#----------------------------------------
# ADD EXTRA GNUMAKE RULES BELOW HERE
同样,make在目录sampleIOC中。最后,我们添加IP端口配置,设置Stream路径并将数据库加载到st.cmd文件中。的内容st.cmd应为:
cat st.cmd
#!../../bin/darwin-x86/sampleIOC
#- You may have to change sampleIOC to something else
#- everywhere it appears in this file
< envPaths
epicsEnvSet ("STREAM_PROTOCOL_PATH","$(TOP)/db")
cd "${TOP}"
## Register all support components
dbLoadDatabase "dbd/sampleIOC.dbd"
sampleIOC_registerRecordDeviceDriver pdbbase
## Load record instances
dbLoadTemplate "db/user.substitutions"
dbLoadRecords "db/sampleIOCVersion.db", "user=UUUUUU"
dbLoadRecords "db/dbSubExample.db", "user=UUUUUU"
#IF if the user also defines EPICS_CAS_INTF_ADDR_LIST then beacon address
#list automatic configuration is constrained to the network interfaces specified
#therein, and therefore only the broadcast addresses of the specified LAN interfaces,
#and the destination addresses of all specified point-to-point links, will be automatically configured.
#epicsEnvSet ("EPICS_CAS_INTF_ADDR_LIST","aaa.aaa.aaa.aaa")
# connect to the device ... IP-Address ! Port 2025 used by textronix, see manual
drvAsynIPPortConfigure("L0","bbb.bbb.bbb.bbb:pppp",0,0,0)
## Load record instances
dbLoadRecords("db/MDO.db", "P=UUUUUU:,PORT=L0,R=MDO:,L=0,A=0")
#- Set this to see messages from mySub
#var mySubDebug 1
#- Run this to trace the stages of iocInit
#traceIocInit
cd "${TOP}/iocBoot/${IOC}"
iocInit
## Start any sequence programs
#seq sncExample, "user=UUUUUU"
在这里,您必须将UUUUUU替换为运行
EPICS IOC 的用户名(UserName)。bbb.bbb.bbb.bbb 是设备的IP(例如
示波器),而pppp是其侦听的端口。如果有两个网络接口(例如wlan和eth0),则可以使用 EPICS_CAS_INTF_ADDR_LIST
对于多个网络接口,可能需要以下命令:
export EPICS_CA_ADDR_LIST=ccc.ccc.ccc.ccc << Broadcast address of the network
export EPICS_CA_AUTO_ADDR_LIST=NO