在实验物理和工业控制系统(EPICS)领域,搭建一个可靠的开发环境往往是新手面临的第一个挑战。许多初学者在Ubuntu系统上从源码编译EPICS Base时,常因依赖缺失、环境变量配置错误或编译选项不当而陷入困境。本文将提供一份经过实战验证的完整指南,帮助你在Ubuntu 22.04 LTS系统上一次性成功搭建EPICS开发环境,并运行一个最简单的IOC实例作为验证。
在开始EPICS Base的编译之前,确保你的Ubuntu 22.04 LTS系统已经更新到最新状态。打开终端,执行以下命令更新软件包列表并升级现有软件:
bash复制sudo apt update && sudo apt upgrade -y
EPICS Base编译需要一系列开发工具和库文件的支持。以下命令将安装所有必要的依赖项:
bash复制sudo apt install -y build-essential git libreadline-dev \
libncurses-dev perl libperl-dev libx11-dev libxext-dev \
libxft-dev libxpm-dev libxmu-dev libxt-dev libssl-dev
关键点说明:
libreadline-dev是EPICS命令行交互的核心依赖,缺少它会导致softIoc无法正常工作libncurses-dev提供终端处理功能,对EPICS命令行工具至关重要验证gcc和make是否安装成功:
bash复制gcc --version
make --version
建议在用户主目录下创建专门的EPICS工作目录,保持项目结构清晰:
bash复制mkdir -p ~/EPICS
cd ~/EPICS
从官方GitHub仓库克隆EPICS Base源码(推荐使用7.0.6.1稳定版本):
bash复制git clone --branch R7.0.6.1 --depth 1 https://github.com/epics-base/epics-base.git
进入源码目录并开始编译:
bash复制cd epics-base
make -j$(nproc)
编译过程注意事项:
-j$(nproc)选项会使用所有CPU核心加速编译编译完成后,需要将EPICS环境变量添加到shell配置文件中。编辑~/.bashrc文件,在末尾添加:
bash复制export EPICS_BASE=~/EPICS/epics-base
export EPICS_HOST_ARCH=$(uname -m)-linux-gnu
export PATH=$EPICS_BASE/bin/$EPICS_HOST_ARCH:$PATH
使环境变量立即生效:
bash复制source ~/.bashrc
执行以下命令验证EPICS是否安装成功:
bash复制softIoc
如果看到类似以下的EPICS提示符,说明安装成功:
code复制epics>
可以通过输入dbl命令查看当前数据库记录(此时应为空),然后输入exit退出。
常见问题排查:
EPICS_HOST_ARCH变量与系统架构匹配(Ubuntu 22.04通常为x86_64-linux-gnu)IOC(Input/Output Controller)是EPICS的核心组件,下面我们创建一个最简单的温度监控示例。
首先创建一个工作目录:
bash复制mkdir -p ~/EPICS/myIOC
cd ~/EPICS/myIOC
创建数据库定义文件test.db:
bash复制cat > test.db << 'EOF'
record(ai, "temperature:water") {
field(DESC, "Water temperature in the fish tank")
field(SCAN, "1 second")
field(PREC, "2")
field(EGU, "°C")
}
EOF
这个数据库定义了一个名为"temperature:water"的模拟输入记录,描述为"鱼缸水温",每1秒扫描一次,精度为2位小数,单位为摄氏度。
启动IOC并加载这个数据库:
bash复制softIoc -d test.db
在IOC命令行中,输入dbl应该能看到我们定义的记录:
code复制epics> dbl
temperature:water
保持IOC运行,打开另一个终端窗口,我们可以测试记录值的读写功能。
首先获取当前值(默认为0):
bash复制caget temperature:water
设置一个新的温度值:
bash复制caput temperature:water 25.3
再次获取值验证:
bash复制caget temperature:water
你应该能看到类似输出:
code复制temperature:water 25.3
在EPICS环境搭建过程中,可能会遇到以下典型问题:
问题1:编译时报错"readline.h: No such file or directory"
解决方案:
bash复制sudo apt install libreadline-dev
问题2:运行softIoc时出现段错误(segmentation fault)
解决方案:
这通常是因为环境变量设置不正确。检查:
EPICS_BASE路径是否正确EPICS_HOST_ARCH是否与系统匹配source ~/.bashrc问题3:caget/caput命令找不到
解决方案:
确保PATH环境变量包含EPICS的bin目录:
bash复制export PATH=$EPICS_BASE/bin/$EPICS_HOST_ARCH:$PATH
虽然基础EPICS已经可以工作,但实际应用中通常需要Asyn和StreamDevice等扩展支持。以下是精简安装步骤:
bash复制cd ~/EPICS
mkdir support
cd support
git clone https://github.com/epics-modules/asyn.git
cd asyn
编辑configure/RELEASE文件,确保EPICS_BASE指向正确路径:
code复制EPICS_BASE=$(HOME)/EPICS/epics-base
编译Asyn:
bash复制make -j$(nproc)
bash复制cd ~/EPICS/support
git clone https://github.com/paulscherrerinstitute/StreamDevice.git
cd StreamDevice
编辑configure/RELEASE文件,设置:
code复制EPICS_BASE=$(HOME)/EPICS/epics-base
ASYN=$(HOME)/EPICS/support/asyn
编译StreamDevice:
bash复制make -j$(nproc)
为了让IOC实例能够随系统启动或方便管理,可以创建systemd服务。创建服务文件:
bash复制sudo tee /etc/systemd/system/epics-ioc.service > /dev/null << 'EOF'
[Unit]
Description=EPICS IOC Service
After=network.target
[Service]
User=$USER
WorkingDirectory=/home/$USER/EPICS/myIOC
Environment="EPICS_BASE=/home/$USER/EPICS/epics-base"
Environment="EPICS_HOST_ARCH=$(uname -m)-linux-gnu"
ExecStart=/home/$USER/EPICS/epics-base/bin/$(uname -m)-linux-gnu/softIoc -d /home/$USER/EPICS/myIOC/test.db
Restart=always
[Install]
WantedBy=multi-user.target
EOF
启用并启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable epics-ioc
sudo systemctl start epics-ioc
检查服务状态:
bash复制systemctl status epics-ioc