软件说明
软件功能:
- PV(过程变量)监控:支持多个通道的EPICS PV实时监控,可设置触发边沿(上升沿、下降沿、双边沿)。
- 音频通道:每个PV通道可配置独立的语音文件,支持多种音频格式(wav, mp3)。
- 实时监控:实时显示PV连接状态和当前值,并可手动刷新。
- 报警队列:采用先进先出的队列管理报警语音播放,避免并发播放冲突。
- 配置保存:将PV配置、语音文件路径、播放时长、触发边沿等设置保存到JSON文件。
- 自启动:可设置开机自启动,通过创建快捷方式或批处理文件实现。
环境依赖安装:
- Python第三方库:
PyQt5(图形),pygame(音频),pyepics(EPICS),winshell(Windows工具可选,用于自启动)。 - EPICS环境:
caRepeater进程(用于Windows系统的实时PV监控:EPICS Windows Tools工具)。
一、Windows EPICS 环境部署
在 Windows 下查看 EPICS(实验物理和工业控制系统)的 PV(Process Variable)值,核心是使用 EPICS 客户端工具(命令行或图形化),确保客户端与 EPICS IOC(输入输出控制器)网络互通,配置好系统环境变量,就可以在终端 CMD 对 PV 实时监控。
1. EPICS 基础环境安装
- 下载并安装 EPICS Windows Tools 客户端工具。
- 设置环境变量:
- 环境变量(PATH)添加路径:
- 右键点击'此电脑'→属性→高级系统设置→环境变量→在系统变量中找到 PATH,点击编辑→添加安装目录(
C:\Program Files\EPICS Windows Tools)的路径→确定保存。
- 右键点击'此电脑'→属性→高级系统设置→环境变量→在系统变量中找到 PATH,点击编辑→添加安装目录(
- 新建系统变量(PV 服务地址列表)
- 变量名:
EPICS_CA_ADDR_LIST - 变量值:
10.0.23.109:5064,10.0.20.3:5064 - 注意:多个 IOC 用逗号分隔,端口默认 5064。简化版:只写 IP 地址(不写端口)也可工作。
- 变量名:
- 环境变量(PATH)添加路径:
- 完成后,在命令提示符中输入
caget -h测试是否安装成功。
2. PV 连接测试
- 如果有的 PV 连不上,检查环境变量
EPICS_CA_ADDR_LIST是否设置正确的 IOC 地址; - 检查网络是否通畅。
# 测试命令
caget CS:SMS:Mode
caget LTTR:MA:PLA:manualok
caget CS:LS:20Ready01:On
caget TR:TAR:ManInPosW
# PV 控制测试
caput LTTR:MA:PLA:manualok 0
caput LTTR:MA:PLA:manualok 1
3. caget 报错(caRepeater)
- 启动 PV 实时监控服务
caRepeater(窗口需打开状态,关闭窗口 PV 连接出错)。 - 添加服务'caRepeater.exe'自启动代码(软件打开时启动服务窗口)。
解决办法:
import subprocess
process = subprocess.Popen(r"C:\Program Files\EPICS Windows Tools\caRepeater.exe")
代码中已启动(确保 caRepeater 可用)。
二、Python 开发环境搭建
1. 安装解释器
- 安装 python-3.13.9-amd64.exe。
- 推荐使用 VSCode + Python 扩展 或 PyCharm。
2. 目录设计
epics_alarm_system/
├── venv/ # 虚拟环境(命令生成)
├── main.py # 主程序
├── config/ # 配置目录(自动生成)
│ └── voice_alarm_config.json
├── voices/ # 语音文件目录
│ ├── alarm1.wav
│ └── alarm2.mp3
└── requirements.txt # 依赖列表(自动生成)
3. 项目环境
- 在项目目录下建立虚拟环境。
- 步骤 1:导航目录
CMD>cd /d D:\epics_alarm_system_20251114IDE>cd D:\epics_alarm_system_20251114
- 步骤 2:创建环境
python -m venv venv
- 步骤 3:激活环境
CMD>venv\Scripts\activate.batIDE>venv\Scripts\activate
- 步骤 1:导航目录
- 安装项目所需要的库。
pip install PyQt5 pygame pyepics winshell- 或者如果有 requirements.txt 文件
pip install -r requirements.txt一键进行环境搭建。
- 检查所有安装的库:
pip list。 - 运行项目:
Python main.py。 - 导出库列表:
pip freeze > requirements.txt。
三、Python 代码编写
1. 代码结构设计
- 采用 MVC 模式,将界面(PyQt5)、业务逻辑(EPICSMonitor, VoicePlayer)和数据模型(pv_configs)分离。
- 使用
信号 - 槽机制进行模块间通信。
2. 核心功能实现
- EPICSMonitor 类:负责 PV 连接、监控、值更新和连接状态管理。
- VoicePlayer 类:负责语音文件的播放和队列管理。
- VoiceAlarmSystem 类:主界面,集成 PV 配置、语音配置、日志显示和用户交互。
# 步骤 1:EPICS 连接建立
def connect_pv(self, index, pv_name):
if EPICS_AVAILABLE:
pv = epics.PV(pv_name, auto_monitor=True)
# 步骤 2:PV 状态监控回调
def _create_callback(self, index):
def callback(pvname=None, value=None, **kw):
self.pv_changed.emit(index, value, self.pv_values[index])
# 步骤 3:连接状态管理
def _create_connection_callback(self, index):
def connection_callback(pvname=None, conn=None, **kw):
self.pv_connection_changed.emit(index, conn, "状态信息")
# 步骤 1:音频播放器初始化
def __init__(self):
pygame.mixer.init()
self.is_playing = False
# 步骤 2:播放队列管理
def play_next_alarm(self):
if not self.voice_player.is_playing and self.alarm_queue:
alarm_info = self.alarm_queue.pop(0)
self.voice_player.play_voice(...)
# 步骤 3:播放完成处理
def on_play_finished(self):
self.is_playing = False
self.play_next_alarm() # 播放下一个
# 步骤 1:UI 组件创建
def init_ui(self):
# PV 配置表格(7 通道)
self.pv_name_edits = [] # PV 名称输入
self.voice_path_edits = [] # 语音文件路径
self.trigger_edge_combos = []# 触发边沿选择
self.status_labels = [] # 连接状态显示
self.value_labels = [] # 当前值显示
# 步骤 2:实时数据更新
def on_pv_value_updated(self, index, value):
self.value_labels[index].setText(str(value))
# 根据值状态设置颜色
if value:
self.value_labels[index].setStyleSheet("color: red;")
3. 配置管理实现
- 使用 JSON 文件保存配置,包括每个通道的 PV 名称、语音文件路径、播放时长、触发边沿和自动连接设置。
- 使用 QSettings 保存应用程序设置(如窗口大小、位置等)。
# 步骤 1:配置数据结构设计
pv_configs = [
{"name": "PV1", # PV 名称
"voice_path": "alarm.wav", # 语音文件
"duration": 5, # 播放时长
"auto_connect": True, # 自动连接
"trigger_edge": "上升沿"} # 触发条件
for _ in range(7)
]
# 步骤 2:JSON 配置保存
def save_config(self):
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(config_data, f, indent=4, ensure_ascii=False)
# 步骤 3:配置自动加载
def load_config(self):
if os.path.exists(self.config_file):
with open(self.config_file, 'r', encoding='utf-8') as f:
return json.load(f)
4. 自启动实现
- 使用 winshell 创建快捷方式到启动文件夹,实现开机自启动。
- 提供备用方案:创建批处理文件实现自启动。
# 步骤 1:自启动设置
def set_auto_start(self, enable):
if enable:
# 创建启动文件夹快捷方式
shortcut_path = os.path.join(startup_folder, "app_name.lnk")
with winshell.shortcut(shortcut_path) as link:
link.path = app_path
link.working_directory = os.path.dirname(app_path)
else:
# 删除快捷方式
os.remove(shortcut_path)
# 步骤 2:备用方案(批处理文件)
def create_bat_file(self, app_path, startup_folder, app_name):
bat_path = os.path.join(startup_folder, f"{app_name}.bat")
with open(bat_path, 'w') as f:
f.write(f'"{app_path}"')
四、功能测试发布
1. 测试与调试
- 模拟测试 PV 监控和语音播放(代码逻辑)。
- PV 连接测试(真实 EPICS 环境)。
- 语音播放测试(各音频格式)。
- 触发逻辑测试(上升沿/下降沿/双边沿)。
- 配置持久化测试。
- 自启动功能测试。
- 多通道并发测试。
2. 打包与部署
使用 PyInstaller 等工具将 Python 脚本打包成可执行文件,方便在没有 Python 环境的 Windows 机器上运行。
pip install pyinstallerpyinstaller --onefile --windowed --name "EPICS 语音报警系统" XXXX.py(不包含数据文件)
包含数据文件:
pyinstaller --add-data "voices;voices" --add-data "config;config" XXXX.py(需先创建好文件夹)
五、开发流程总结
1. 技术架构
应用架构层:
- 表示层 (PyQt5 UI)
- 配置界面
- 实时监控面板
- 系统日志
- 业务逻辑层
- EPICS 监控引擎
- 语音播放队列
- 报警触发逻辑
- 数据访问层
- EPICS PV 访问
- 配置文件管理
- 系统注册表
- 系统集成层
- 音频子系统 (pygame)
- 自启动服务 (winshell)
- 进程管理 (subprocess)
2. 注意事项
- EPICS 环境依赖:生产环境必须安装 EPICS 依赖。
- 音频兼容性:测试不同格式音频文件的播放兼容性。
- 资源清理:确保程序退出时断开所有 PV 连接。
- 错误恢复:实现网络中断后的自动重连机制。


