EPICS分布式控制系统搭建入门与IOC配置
在大型科研装置(同步辐射光源、粒子加速器、核聚变装置)中,EPICS(Experimental Physics and Industrial Control System) 是构建分布式控制系统的行业标准。它将现场设备封装为 IOC(Input/Output Controller),通过 Channel Access(CA)或 pvAccess 协议供操作员界面(OPI)、存档与扫描服务器访问。本文以 Debian/Ubuntu + EPICS Base 7.x + asyn + StreamDevice 为例,走完最小可运行 IOC 的搭建与配置流程。
一、环境准备:编译 EPICS Base
# 安装依赖
sudo apt update
sudo apt install build-essential libreadline-dev gfortran git -y
# 下载并编译 EPICS Base
cd ~
git clone --depth=1 https://github.com/epics-base/epics-base.git
cd epics-base
make -j$(nproc)
# 设置环境变量(建议加入 ~/.bashrc)
export EPICS_BASE=$HOME/epics-base
export PATH=$EPICS_BASE/bin/linux-x86_64:$PATH
export LD_LIBRARY_PATH=$EPICS_BASE/lib/linux-x86_64:$LD_LIBRARY_PATH
验证:
makeBaseApp.pl --help # 能输出版本信息即成功
二、创建第一个 IOC(软IOC)
cd ~
makeBaseApp.pl -t ioc myioc
cd myioc
makeBaseApp.pl -i -t example myioc # 生成exampleApp(含db、src模板)
make
启动 IOC:
./bin/linux-x86_64/myioc st.cmd
# 进入 epics> 提示符
epics> dbpr "$(IOCNAME)"
epics> exit
三、添加记录(Record)与数据库(.db)
EPICS 用 Record(记录) 抽象每个过程变量(PV),如 ai(模拟输入)、ao(模拟输出)、bi(二进制输入)等。
示例:temperature.db
record(ai, "MYIOC:TEMP:PV")
{
field(DESC, "Chamber Temperature")
field(INP, "@sim(25.0)") # 仿真值,真实设备用 asyn/StreamDevice
field(EGU, "degC")
field(PREC, "2")
field(SCAN, "1 second") # 每秒更新
}
在 st.cmd 中加载:
dbLoadDatabase "dbd/myioc.dbd"
myioc_registerRecordDeviceDriver pdbbase
dbLoadRecords "db/temperature.db"
iocInit
启动后可另开终端用 caget 测试:
caget MYIOC:TEMP:PV
# 应输出 25.00
四、对接真实设备:asyn + StreamDevice 简介
多数串口/网口设备通过 asyn(异步I/O支持) + StreamDevice(协议解析)接入:
1. 编译 synApps/asyn 与 StreamDevice
2. 在 IOC Makefile 中链接 asyn 库
3. 写协议文件(.proto)定义命令/响应格式,例:
Terminator = CR LF;
ReadTemp {
out "TEMP?";
in "TEMP=%f";
@mismatch { in "ERROR"; }
}
4. Record 的 INP 指向 @asyn(StreamDevice, LINK, 0) 并绑定协议
此部分篇幅较长,建议参考 synApps 官方示例。
五、网络与访问控制(Channel Access)
- 默认端口:TCP 5064(Search),UDP 5065(Beacon)
• 若有多网卡或防火墙,指定接口:
export EPICS_CA_AUTO_ADDR_LIST=yes
export EPICS_CA_ADDR_LIST=192.168.10.255 # 显式广播地址
export EPICS_CA_SERVER_PORT=5064
客户端(如 camonitor、MEDM、CS-Studio)用:
camonitor MYIOC:TEMP:PV
六、常见新手问题排查
现象 原因 解决
caget 超时 CA端口被防火墙挡 / IOC未运行 iptables -I INPUT -p tcp --dport 5064 -j ACCEPT;确认 iocInit 成功
Record 不更新 SCAN=Passive 或未设 SCAN 设 SCAN="1 second"
启动报 dbLoadRecords: file not found 相对路径错 用绝对路径或确认 TOP/db/ 下有该 .db
PV名含冒号被shell解析错 shell未加引号 始终 caget "MYIOC:TEMP:PV"
七、结语
EPICS 分布式控制系统的最小闭环是:编译 Base → makeBaseApp 建 IOC → 写 .db 记录 → st.cmd 加载 → caget/camonitor 验证。掌握 Record 模型与 dbLoadRecords 流程后,再逐步引入 asyn/StreamDevice 对接串口设备、Archive 到 Channel Archiver,就能构建出可扩展的大型实验装置控制平台。





