• EPICS -- autosave模块使用示例


    Autosave自动保存EPICS过程变量(PVs)的值到一台文件服务器上文件中,并且在IOC(输入输出控制器--EPICS业务端)被重启时,恢复那些值。

    以下展示一个如何使用这个autosave模块的完整步骤:

    1) 新建一个目录,在这个目录中创建这个IOC应用程序的框架:

    1. [blctrl@bjAli exer]$ mkdir exer29
    2. [blctrl@bjAli exer]$ cd exer29
    3. [blctrl@bjAli exer]$ makeBaseApp.pl -t ioc autosaveTest
    4. [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模块的完整路径

    1. # Variables and paths to dependent modules:
    2. #MODULES = /path/to/modules
    3. SUPPORT=/usr/local/EPICS/synApps/support
    4. #MYMODULE = $(MODULES)/my-module
    5. AUTOSAVE=$(SUPPORT)/autosave
    6. # If using the sequencer, point SNCSEQ at its top directory:
    7. #SNCSEQ = $(MODULES)/seq-ver
    8. # EPICS_BASE should appear last so earlier modules can override stuff:
    9. EPICS_BASE = /usr/local/EPICS/base
    10. # Set RULES here if you want to use build rules from somewhere
    11. # other than EPICS_BASE:
    12. #RULES = $(MODULES)/build-rules
    13. # These lines allow developers to override these RELEASE settings
    14. # without having to modify this file directly.
    15. -include $(TOP)/../RELEASE.local
    16. -include $(TOP)/../RELEASE.$(EPICS_HOST_ARCH).local
    17. -include $(TOP)/configure/RELEASE.local

    3) 编辑autosaveTestApp/src/Makefile文件,添加如下两行:

    autosaveTest_DBD += asSupport.dbd

    autosaveTest_LIBS += autosave

    这两行位置如以下文件所示:

    1. TOP=../..
    2. include $(TOP)/configure/CONFIG
    3. #----------------------------------------
    4. # ADD MACRO DEFINITIONS AFTER THIS LINE
    5. #=============================
    6. #=============================
    7. # Build the IOC application
    8. PROD_IOC = autosaveTest
    9. # autosaveTest.dbd will be created and installed
    10. DBD += autosaveTest.dbd
    11. # autosaveTest.dbd will be made up from these files:
    12. autosaveTest_DBD += base.dbd
    13. # Include dbd files from all support applications:
    14. autosaveTest_DBD += asSupport.dbd
    15. # Add all the support libraries needed by this IOC
    16. autosaveTest_LIBS += autosave
    17. # autosaveTest_registerRecordDeviceDriver.cpp derives from autosaveTest.dbd
    18. autosaveTest_SRCS += autosaveTest_registerRecordDeviceDriver.cpp
    19. # Build the main IOC entry point on workstation OSs.
    20. autosaveTest_SRCS_DEFAULT += autosaveTestMain.cpp
    21. autosaveTest_SRCS_vxWorks += -nil-
    22. # Add support from base/src/vxWorks if needed
    23. #autosaveTest_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
    24. # Finally link to the EPICS Base libraries
    25. autosaveTest_LIBS += $(EPICS_BASE_IOC_LIBS)
    26. #===========================
    27. include $(TOP)/configure/RULES
    28. #----------------------------------------
    29. # ADD RULES AFTER THIS LINE

    4) 进入到autosaveTestApp/Db/目录下,创建一个数据库文件autosaveTest.db,内容如下:

    1. record(ai, "$(USER):In:Float")
    2. {
    3. field(DTYP, "Soft Channel")
    4. field(INP, "1")
    5. field(SCAN, "Passive")
    6. }
    7. record(longin, "$(USER):In:Long")
    8. {
    9. field(DTYP, "Soft Channel")
    10. field(INP, "1")
    11. field(SCAN, "Passive")
    12. }
    13. record(waveform, "$(USER):Waveform")
    14. {
    15. field(NELM, "10")
    16. field(FTVL, "SHORT")
    17. field(SCAN, "Passive")
    18. field(DTYP, "Soft Channel")
    19. }
    20. record(waveform, "$(USER):FileName")
    21. {
    22. field(NELM,"100")
    23. field(FTVL, "CHAR")
    24. field(SCAN, "Passive")
    25. field(DTYP, "Soft Channel")
    26. }

    将以上文件,用DB += autosaveTest.db语句添加到相同目录的Makefile文件中。

    5) 切换到这个IOC应用程序的顶层目录执行make,编译程序。

    6) 切换到启动目录中,并且创建一个autosave目录

    1. [blctrl@bjAli exer29]$ cd iocBoot/iocautosaveTest/
    2. [blctrl@bjAli iocautosaveTest]$ mkdir autosave

    7) 创建"请求"文件(例如:auto_settings.req),它指定了你想要保存和恢复其值的PVs。对应这些请求文件".req"后缀的保存文件后缀被替换成了".sav"。请求文件也可以包含宏变量,它们的值将在使得这个请求文件被处理的调用中被定义。创建一个auto_settings.req的文件,内容如下:

    1. $(P):In:Float.VAL
    2. $(P):In:Long.VAL
    3. $(P):Waveform.VAL
    4. $(P):FileName.VAL

    8)编辑启动脚本文件st.cmd:

    1. #!../../bin/linux-x86_64/autosaveTest
    2. #- You may have to change autosaveTest to something else
    3. #- everywhere it appears in this file
    4. < envPaths
    5. cd "${TOP}"
    6. ## Register all support components
    7. dbLoadDatabase "dbd/autosaveTest.dbd"
    8. autosaveTest_registerRecordDeviceDriver pdbbase
    9. # 使用一个或多个set_requestfile_path调用,指定一个或多个用于搜索请求文件的路径
    10. set_requestfile_path("$(TOP)/iocBoot/$(IOC)","")
    11. set_requestfile_path("$(TOP)/iocBoot/$(IOC)","autosave")
    12. # 通过调用set_savefile_path函数指定你想要.sav文件被写到哪个目录中。
    13. set_savefile_path("$(TOP)/iocBoot/$(IOC)/autosave")
    14. # 使用set_pass_restoreFile()函数
    15. # 指定哪些save文件要在记录初始化前(pass 0)前被恢复,以及哪些save文件在记录初始化后(pass 1)被恢复
    16. set_pass1_restoreFile("auto_settings.sav")
    17. save_restoreSet_numSeqFiles(3)
    18. save_restoreSet_SeqPeriodInSeconds(600)
    19. save_restoreSet_RetrySeconds(60)
    20. save_restoreSet_CAReconnect(1)
    21. save_restoreSet_CallbackTimeout(-1)
    22. ## Load record instances
    23. dbLoadRecords("db/autosaveTest.db","USER=blctrl")
    24. cd "${TOP}/iocBoot/${IOC}"
    25. iocInit
    26. # 启动保存工作
    27. create_monitor_set("auto_settings.req",5,"P=blctrl")
    28. ## Start any sequence programs
    29. #seq sncxxx,"user=blctrl"

    save-file选项:

    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) 另开一个命令终端进行测试: 

    1. # 首次启动这个IOC程序后,观察记录实例的值
    2. [root@bjAli exer29]# caget blctrl:In:Long blctrl:In:Float blctrl:Waveform
    3. blctrl:In:Long 1
    4. blctrl:In:Float 1
    5. blctrl:Waveform 10 10 0 0 0 0 0 0 0 0 0
    6. [root@bjAli exer29]# caget -S blctrl:FileName
    7. blctrl:FileName \003
    8. # 向记录实例中写值,修改当前值
    9. [root@bjAli exer29]# caput blctrl:In:Long 28
    10. Old : blctrl:In:Long 1
    11. New : blctrl:In:Long 28
    12. [root@bjAli exer29]# caput blctrl:In:Float 2.8
    13. Old : blctrl:In:Float 1
    14. New : blctrl:In:Float 2.8
    15. [root@bjAli exer29]# caput -a blctrl:Waveform 10 1 2 3 4 5 6 7 8 9 10
    16. Old : blctrl:Waveform 10 3 0 0 0 0 0 0 0 0 0
    17. New : blctrl:Waveform 10 1 2 3 4 5 6 7 8 9 10
    18. [root@bjAli exer29]# caput -S blctrl:FileName "/usr/local/EPICS"
    19. Old : blctrl:FileName \003
    20. New : blctrl:FileName /usr/local/EPICS
    21. # 进入到.sav文件的保存路径中,查看auto_settings.sav中的值
    22. [root@bjAli exer29]# cd iocBoot/iocautosaveTest/autosave/
    23. [root@bjAli autosave]# cat auto_settings.sav
    24. # autosave R5.3 Automatically generated - DO NOT MODIFY - 221029-150711
    25. blctrl:In:Float.VAL 2.8
    26. blctrl:In:Long.VAL 28
    27. blctrl:Waveform.VAL @array@ { "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" }
    28. blctrl:FileName.VAL @array@ { "47" "117" "115" "114" "47" "108" "111" "99" "97" "108" "47" "69" "80" "73" "67 " "83" "0" }
    29. # 退出当前IOC程序后,重启这个IOC程序后,再查看各记录的初始值
    30. [root@bjAli autosave]# caget blctrl:In:Long blctrl:In:Float blctrl:Waveform
    31. blctrl:In:Long 28
    32. blctrl:In:Float 2.8
    33. blctrl:Waveform 10 1 2 3 4 5 6 7 8 9 10
    34. [root@bjAli autosave]# caget -S blctrl:FileName
    35. blctrl:FileName /usr/local/EPICS
  • 相关阅读:
    速盾:cdn与云服务区别有哪些方面?
    华为与美团达成合作,正式启动鸿蒙原生应用开发。
    Istio Arch-Overview
    MyBatis基于配置文件实现对数据库的增删改查
    nigix代理失败的排查过程
    JAVA ----- Map 集合
    2023.5.30 深信服 c++ 一面
    Cannot use object of type __PHP_Incomplete_Class as array
    ISP算法——UVNR
    C#列表List的创建与使用
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/127587497