我在工作中需要监控多个EPICS PV并联动语音报警,于是用Python写了这个小工具。它的主要功能包括:
- 支持7个通道的PV实时监控,可设置上升沿、下降沿或双边沿触发
- 每个通道可以指定独立的wav或mp3音频文件
- PV连接状态和当前值实时显示,有手动刷新
- 报警语音通过队列顺序播放,避免并发冲突
- 配置保存为JSON,支持开机自启动
下面记录一下开发过程中的关键点。
EPICS环境搭建
在Windows上使用EPICS,首先得装好EPICS Windows Tools。下载安装后,把C:\Program Files\EPICS Windows Tools加入系统PATH。接着要设置EPICS_CA_ADDR_LIST环境变量,填上IOC的地址列表,比如:
EPICS_CA_ADDR_LIST = 10.0.23.109:5064,10.0.20.3:5064
多个地址用逗号分隔,端口默认5064,不写端口也行。之后在命令行敲caget -h验证一下是否安装成功。
caget CS:SMS:Mode
caget LTTR:MA:PLA:manualok
caget CS:LS:20Ready01:On
caget TR:TAR:ManInPosW
如果连不上,先检查网络是否通,然后确认环境变量是否正确。
caRepeater 这个坑
caget能工作还不够,实际跑起来发现经常报错,连接一会儿就断。查了一下,原来Windows下必须保持caRepeater.exe进程一直在跑,它是PV监控的常驻服务。所以程序一启动就要用subprocess把它拉起来:
import subprocess
process = subprocess.Popen(r"C:\Program Files\EPICS Windows Tools\caRepeater.exe")
这样在程序运行期间,PV连接才稳定。
Python项目初始化
Python环境我用的是3.13.9。项目目录结构这么规划的:
epics_alarm_system/
├── venv/ # 虚拟环境
├── main.py # 主程序
├── config/ # 配置目录(自动生成)
│ └── voice_alarm_config.json
├── voices/ # 语音文件目录
│ ├── alarm1.wav
│ └── alarm2.mp3
└── requirements.txt # 依赖列表(自动生成)
建虚拟环境就不多说了,python -m venv venv然后激活。依赖包只需要几个:
pip install PyQt5 pygame pyepics winshell
winshell是为了后面做自启动快捷方式,不是必须的,可以不用。
核心代码片段
整个程序用MVC的思路拆开:界面用PyQt5画,EPICS监控和语音播放各自封装成独立的类,通过PyQt的信号/槽机制通信。


