Autosave自动保存EPICS过程变量(PVs)的值到一台文件服务器上文件中,并且在IOC(输入输出控制器--EPICS业务端)被重启时,恢复那些值。
以下展示一个如何使用这个autosave模块的完整步骤:
1) 新建一个目录,在这个目录中创建这个IOC应用程序的框架:
- [blctrl@bjAli exer]$ mkdir exer29
- [blctrl@bjAli exer]$ cd exer29
- [blctrl@bjAli exer]$ makeBaseApp.pl -t ioc autosaveTest
- [blctrl@bjAli exer]$ makeBaseApp.pl -i -t ioc autosaveTest
2) 编辑configure/RELEASE文件,添加以下适当位置添加以下两行:
SUPPORT=/usr/local/EPICS/synApps/support
AUTOSAVE=$(SUPPORT)/autosave
SUPPORT是你安装autosave模块所在的路径,AUTOSAVE是autosave模块的完整路径
- # Variables and paths to dependent modules:
- #MODULES = /path/to/modules
- SUPPORT=/usr/local/EPICS/synApps/support
- #MYMODULE = $(MODULES)/my-module
- AUTOSAVE=$(SUPPORT)/autosave
- # If using the sequencer, point SNCSEQ at its top directory:
- #SNCSEQ = $(MODULES)/seq-ver
-
- # EPICS_BASE should appear last so earlier modules can override stuff:
- EPICS_BASE = /usr/local/EPICS/base
-
- # Set RULES here if you want to use build rules from somewhere
- # other than EPICS_BASE:
- #RULES = $(MODULES)/build-rules
-
- # These lines allow developers to override these RELEASE settings
- # without having to modify this file directly.
- -include $(TOP)/../RELEASE.local
- -include $(TOP)/../RELEASE.$(EPICS_HOST_ARCH).local
- -include $(TOP)/configure/RELEASE.local
3) 编辑autosaveTestApp/src/Makefile文件,添加如下两行:
autosaveTest_DBD += asSupport.dbd
autosaveTest_LIBS += autosave
这两行位置如以下文件所示:
- TOP=../..
-
- include $(TOP)/configure/CONFIG
- #----------------------------------------
- # ADD MACRO DEFINITIONS AFTER THIS LINE
- #=============================
-
- #=============================
- # Build the IOC application
-
- PROD_IOC = autosaveTest
- # autosaveTest.dbd will be created and installed
- DBD += autosaveTest.dbd
-
- # autosaveTest.dbd will be made up from these files:
- autosaveTest_DBD += base.dbd
-
- # Include dbd files from all support applications:
- autosaveTest_DBD += asSupport.dbd
-
- # Add all the support libraries needed by this IOC
- autosaveTest_LIBS += autosave
-
- # autosaveTest_registerRecordDeviceDriver.cpp derives from autosaveTest.dbd
- autosaveTest_SRCS += autosaveTest_registerRecordDeviceDriver.cpp
-
- # Build the main IOC entry point on workstation OSs.
- autosaveTest_SRCS_DEFAULT += autosaveTestMain.cpp
- autosaveTest_SRCS_vxWorks += -nil-
-
- # Add support from base/src/vxWorks if needed
- #autosaveTest_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
-
- # Finally link to the EPICS Base libraries
- autosaveTest_LIBS += $(EPICS_BASE_IOC_LIBS)
-
- #===========================
-
- include $(TOP)/configure/RULES
- #----------------------------------------
- # ADD RULES AFTER THIS LINE
4) 进入到autosaveTestApp/Db/目录下,创建一个数据库文件autosaveTest.db,内容如下:
- record(ai, "$(USER):In:Float")
- {
- field(DTYP, "Soft Channel")
- field(INP, "1")
- field(SCAN, "Passive")
- }
-
- record(longin, "$(USER):In:Long")
- {
- field(DTYP, "Soft Channel")
- field(INP, "1")
- field(SCAN, "Passive")
- }
-
- record(waveform, "$(USER):Waveform")
- {
- field(NELM, "10")
- field(FTVL, "SHORT")
- field(SCAN, "Passive")
- field(DTYP, "Soft Channel")
- }
-
- record(waveform, "$(USER):FileName")
- {
- field(NELM,"100")
- field(FTVL, "CHAR")
- field(SCAN, "Passive")
- field(DTYP, "Soft Channel")
- }
将以上文件,用DB += autosaveTest.db语句添加到相同目录的Makefile文件中。
5) 切换到这个IOC应用程序的顶层目录执行make,编译程序。
6) 切换到启动目录中,并且创建一个autosave目录
- [blctrl@bjAli exer29]$ cd iocBoot/iocautosaveTest/
- [blctrl@bjAli iocautosaveTest]$ mkdir autosave
7) 创建"请求"文件(例如:auto_settings.req),它指定了你想要保存和恢复其值的PVs。对应这些请求文件".req"后缀的保存文件后缀被替换成了".sav"。请求文件也可以包含宏变量,它们的值将在使得这个请求文件被处理的调用中被定义。创建一个auto_settings.req的文件,内容如下:
- $(P):In:Float.VAL
- $(P):In:Long.VAL
- $(P):Waveform.VAL
- $(P):FileName.VAL
8)编辑启动脚本文件st.cmd:
- #!../../bin/linux-x86_64/autosaveTest
-
- #- You may have to change autosaveTest to something else
- #- everywhere it appears in this file
-
- < envPaths
-
- cd "${TOP}"
-
- ## Register all support components
- dbLoadDatabase "dbd/autosaveTest.dbd"
- autosaveTest_registerRecordDeviceDriver pdbbase
- # 使用一个或多个set_requestfile_path调用,指定一个或多个用于搜索请求文件的路径
- set_requestfile_path("$(TOP)/iocBoot/$(IOC)","")
- set_requestfile_path("$(TOP)/iocBoot/$(IOC)","autosave")
-
- # 通过调用set_savefile_path函数指定你想要.sav文件被写到哪个目录中。
- set_savefile_path("$(TOP)/iocBoot/$(IOC)/autosave")
-
- # 使用set_pass
_restoreFile()函数 - # 指定哪些save文件要在记录初始化前(pass 0)前被恢复,以及哪些save文件在记录初始化后(pass 1)被恢复
- set_pass1_restoreFile("auto_settings.sav")
-
- save_restoreSet_numSeqFiles(3)
- save_restoreSet_SeqPeriodInSeconds(600)
- save_restoreSet_RetrySeconds(60)
- save_restoreSet_CAReconnect(1)
- save_restoreSet_CallbackTimeout(-1)
-
- ## Load record instances
- dbLoadRecords("db/autosaveTest.db","USER=blctrl")
-
- cd "${TOP}/iocBoot/${IOC}"
- iocInit
-
- # 启动保存工作
- create_monitor_set("auto_settings.req",5,"P=blctrl")
- ## Start any sequence programs
- #seq sncxxx,"user=blctrl"
a) save_restoreSet_DatedBackupFiles(1)
告诉save_restore要写过时的备份文件。启动时,进行恢复的软件从它恢复PV's的".sav"文件写一个此文件的备份副本。这个文件可以或被命名为xxx.sav.bu,并且每次重启时被写,或者被命名为xxx.sav_YYMMDD-HHMMSS,此处"YY..."是日期。过时的备份不被重写。如果你想要过时的备份文件,把save_restoreSet_DatedBackupFiles(1)行放在你st.cmd文件中对iocInit()调用前。
注意:如果一个文件在pass 0和pass 1都被恢复,启动-备份文件将只在pass 0过程中被写。
b)save_restoreSet_NumSeqFiles(3)
save_restoreSet_SeqPeriodInSeconds(600)
告诉save_restore保存顺序文件。以上命令将使得save_restore以10分钟间隔维护每个.sav文件的三个副本。注意:如果autosave写.sav文件失败,它将在它再次成功前停止产生顺序副本。
c) save_restoreSet_RetrySeconds(60)
指定在一次失败的.sav-file写和再次写之间的延时。默认延时是60秒。如果在延时期间,PV's的列表变化了,将写新的值。
d)save_restoreSet_CAReconnect(1)
指定autosave是否应该周期性地重试连接其初始连接尝试失败的那些PVs。当前,连接重试间隔被硬编码为60秒。
f) save_restoreSet_CallbackTimeout(-1)
以秒为单位指定强制的save-file写之间的时间间隔(-1表示永远)。这是用于即使正常触发机制损坏时写save文件。
通过调用create_XXX_set()到你EPICS启动脚本文件iocInit之后,调用这个软件的"save"部分作为EPICS启动顺序的组成,例如,添加这样形式的行:
create_monitor_set("auto_positions.req", 5, "P=xxx:")
create_monitor_set("auto_settings.req", 30, "P=xxx:")
传给create_monitor_set()的第三个参数是一个宏替代字符串。
9) 用以下命令启动这个IOC应用程序:
[blctrl@bjAli iocautosaveTest]$ ../../bin/linux-x86_64/autosaveTest st.cmd
10) 另开一个命令终端进行测试:
- # 首次启动这个IOC程序后,观察记录实例的值
- [root@bjAli exer29]# caget blctrl:In:Long blctrl:In:Float blctrl:Waveform
- blctrl:In:Long 1
- blctrl:In:Float 1
- blctrl:Waveform 10 10 0 0 0 0 0 0 0 0 0
- [root@bjAli exer29]# caget -S blctrl:FileName
- blctrl:FileName \003
- # 向记录实例中写值,修改当前值
- [root@bjAli exer29]# caput blctrl:In:Long 28
- Old : blctrl:In:Long 1
- New : blctrl:In:Long 28
- [root@bjAli exer29]# caput blctrl:In:Float 2.8
- Old : blctrl:In:Float 1
- New : blctrl:In:Float 2.8
- [root@bjAli exer29]# caput -a blctrl:Waveform 10 1 2 3 4 5 6 7 8 9 10
- Old : blctrl:Waveform 10 3 0 0 0 0 0 0 0 0 0
- New : blctrl:Waveform 10 1 2 3 4 5 6 7 8 9 10
- [root@bjAli exer29]# caput -S blctrl:FileName "/usr/local/EPICS"
- Old : blctrl:FileName \003
- New : blctrl:FileName /usr/local/EPICS
- # 进入到.sav文件的保存路径中,查看auto_settings.sav中的值
- [root@bjAli exer29]# cd iocBoot/iocautosaveTest/autosave/
- [root@bjAli autosave]# cat auto_settings.sav
- # autosave R5.3 Automatically generated - DO NOT MODIFY - 221029-150711
- blctrl:In:Float.VAL 2.8
- blctrl:In:Long.VAL 28
- blctrl:Waveform.VAL @array@ { "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" }
- blctrl:FileName.VAL @array@ { "47" "117" "115" "114" "47" "108" "111" "99" "97" "108" "47" "69" "80" "73" "67 " "83" "0" }
-
- # 退出当前IOC程序后,重启这个IOC程序后,再查看各记录的初始值
- [root@bjAli autosave]# caget blctrl:In:Long blctrl:In:Float blctrl:Waveform
- blctrl:In:Long 28
- blctrl:In:Float 2.8
- blctrl:Waveform 10 1 2 3 4 5 6 7 8 9 10
- [root@bjAli autosave]# caget -S blctrl:FileName
- blctrl:FileName /usr/local/EPICS