工业控制系统开发中,EPICS(Experimental Physics and Industrial Control System)作为分布式控制系统的开源框架,被广泛应用于粒子加速器、天文望远镜等大型科学装置。本文将手把手带你在Ubuntu 22.04 LTS上完成EPICS Base、Asyn驱动和StreamDevice模块的全套环境搭建,最终实现一个可通信的IOC实例。
在开始前,确保你的Ubuntu 22.04系统已更新到最新状态:
bash复制sudo apt update && sudo apt upgrade -y
EPICS编译需要以下基础开发工具链:
bash复制sudo apt install -y git build-essential libreadline-dev
对于图形界面支持(如需要MEDM等工具),建议额外安装:
bash复制sudo apt install -y libx11-dev libxt-dev libmotif-dev
验证make版本(需≥4.0):
bash复制make --version
# GNU Make 4.3
创建专属开发目录并克隆源码:
bash复制mkdir -p ~/epics && cd ~/epics
git clone --recursive https://github.com/epics-base/epics-base.git
cd epics-base
编译前需设置目标架构(以Linux-x86_64为例):
bash复制export EPICS_HOST_ARCH=linux-x86_64
make -j$(nproc)
编译完成后,将以下内容添加到~/.bashrc:
bash复制# EPICS环境变量
export EPICS_BASE=~/epics/epics-base
export PATH=$EPICS_BASE/bin/$EPICS_HOST_ARCH:$PATH
验证安装:
bash复制source ~/.bashrc
softIoc
# 应出现EPICS提示符 epics>
Asyn是EPICS中实现设备通信的核心模块,支持串口、网络等多种协议:
bash复制cd ~/epics
mkdir support && cd support
git clone https://github.com/epics-modules/asyn.git
配置模块依赖关系,编辑asyn/configure/RELEASE:
makefile复制# 关键配置项
EPICS_BASE=$(HOME)/epics/epics-base
编译模块:
bash复制cd asyn && make
注意:如遇到
IPAC或SNCSEQ相关错误,可注释掉RELEASE文件中对应行
StreamDevice提供了基于协议的设备通信能力,安装步骤如下:
bash复制cd ~/epics/support
git clone https://github.com/paulscherrerinstitute/StreamDevice.git
配置模块路径,编辑StreamDevice/configure/RELEASE:
makefile复制ASYN=$(HOME)/epics/support/asyn
EPICS_BASE=$(HOME)/epics/epics-base
编译StreamDevice:
bash复制cd StreamDevice && make
通过以下命令创建示例IOC:
bash复制cd ~/epics
makeBaseApp.pl -t example testIoc
makeBaseApp.pl -i -t example testIoc
make -C testIoc
集成Asyn和StreamDevice支持,修改testIocApp/src/Makefile:
makefile复制testIoc_LIBS += asyn stream
添加数据库支持,编辑testIocApp/src/xxxSupport.dbd:
makefile复制include "asyn.dbd"
include "stream.dbd"
创建示例协议文件testIocApp/Db/example.proto:
proto复制Terminator = LF;
readTemp {
out "TEMP?";
in "%f";
ExtraInput = Ignore;
}
对应数据库文件testIocApp/Db/example.db:
makefile复制record(ai, "Device:Temperature") {
field(DESC, "Sample temperature")
field(DTYP, "stream")
field(INP, "@example.proto readTemp $(PORT)")
}
启动IOC并测试通信:
bash复制cd testIoc/iocBoot/ioctestIoc
./st.cmd
# 在另一个终端执行
caget Device:Temperature
Q1:make时出现undefined reference错误
RELEASE文件中路径是否正确Q2:IOC启动时报错找不到.so文件
bash复制export LD_LIBRARY_PATH=$EPICS_BASE/lib/$EPICS_HOST_ARCH:$LD_LIBRARY_PATH
Q3:StreamDevice协议解析失败
st.cmd启动时添加调试参数:bash复制var streamDebug 1
网络通信配置要点:
| 参数 | 说明 | 示例值 |
|---|---|---|
| EPICS_CA_ADDR_LIST | 指定广播地址 | 192.168.1.255 |
| EPICS_CAS_INTF_ADDR | 绑定特定网络接口 | eth0 |
| ASYN_PORT_CONFIG | 设备IP和端口 | 192.168.1.100:502 |
实际部署时,建议使用systemd管理IOC进程。创建/etc/systemd/system/epics-ioc.service:
ini复制[Unit]
Description=EPICS IOC Service
[Service]
User=iocuser
WorkingDirectory=/home/iocuser/epics/testIoc/iocBoot/ioctestIoc
ExecStart=/bin/bash st.cmd
Restart=always
[Install]
WantedBy=multi-user.target