autosave模块为PVs提供了简单的save/restore功能,有函数save_pvs()和restore_pvs()以及一个AutoSaver类。这些类似于来自用于IOCs的synApps的autosave模块,在那个模块中,它们使用一个描述要保存的PVs兼容的request file,以及一个持有被保存值的兼容的save file。当前这里通过通道访问进行读和写,并且不需要与单个IOC相关联。
这个模块的使用需要安装pyparsing包。这是一个相当常见的第三方Python包,被包含在很多包管理器中,或者用诸如easy_install或pip安装,或者从PyPI下载。
Request和Save文件被设计成兼容synApps autosave。注意:支持用宏替换的file命令,所以你可以有一个像这样的Request:
# My.req
file "SimpleMotor.req", P=IOC:, Q=m1
这个SimpleMotor.req文件为:
# SimpleMotor.req
$(P)$(Q).VAL
$(P)$(Q).DIR
$(P)$(Q).FOFF
其能够用于一个SimpleMotor的很多实例。但没有用于查找request文件的自动化机制。你将需要在工作目录中包含这些或者指定绝对路径。
有这样一个文件,只要使用:
import epics.autosave
epics.autosave.save_pvs("My.req", "my_values.sav")
将保存对应的PVs的当前值到文件my_values.sav。之后一段时间,可以用以下恢复这些值:
import epics.autosave
epics.autosave.restore_pvs("my_values.sav")
保存的文件将与autosave机制保存的文件几乎相同格式,并且restore_pvs()函数可以使用来自autosave的save文件读取和恢复值。注意:这里的目的与标准autosave模块的目的(autosave模块被设计成保存值,使得在IOC启动时初始化PVs)非常不同。使用这里的函数将对保存的值进行一次caput()。
autosave.save_pvs(request_file, save_file)
保存在request_file中列出的当前值到save_file。
参数:
如上所述,request_file按照来自synApps的autosave模块的规则。
autosave.restore_pvs(save_file)
从save_file读取值并且为相应的PVs恢复它们。
参数:
save_file:从这个名称的文件读取保存值
注意:restore_pvs()将恢复它能够的所有值,跳过它不能恢复的任何值。
Autosaver class
Autosaver类一种便捷方式:重复保存在一个request文件中列出的PVs,而不必重新连接所有PVs。Autosaver保留PV连接,并且提供一个保存当前PV值到一个文件的简单save()。默认,从这个请求文件和当前时间命名那个文件。这使得你做这样的事情:
#!/usr/bin/env python
# save PVs from a request file once per minute
import time
from epics.autosave import AutoSaver
my_saver = AutoSaver("My.req")
# save all PVs every minute for a day
t0 = time.time()
while True:
if time.localtime().tm_sec < 5:
my_saver.save()
time.sleep(30 - time.localtime().tm_sec)
if time.time() - t0 > 86400.0:
break
time.sleep(0.5)
这将用像My_2017Oct02_141800.sav名称的文件保存PVs。
class autosave.AutoSaver(request_file)
创建基于一个请求文件的自动化Saver。
参数:
request_file:请求文件的名称。
AutoSaver有两个方法:read_request_file()读取一个请求文件,而save()保存结果。
autosave.read_request_file(request_file)
读取和解析请求文件,开始进行PV连接。
参数:
request_file:请求文件的名称。
autosave.save(save_file=None, verbose=False)
读取当前PV值,写保存文件。
参数:
可以用autosave例程保存和恢复所有标量PV值。有一些对waveform(数组)数据的支持。例如,包含长字符串的waveform可以被保存和恢复。此外,可以保存和恢复在waveform中的数值数组。对于数组数据,结果可能不完全兼容autosave模块。
一个使用autosave模块的简单示例:
import epics.autosave
# save values
epics.autosave.save_pvs("my_request_file.req",
"/tmp/my_recent_save.sav")
# wait 30 seconds
time.sleep(30)
# restore those values back
epics.autosave.restore_pvs("/tmp/my_recent_save.sav")