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 applicationPROD_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< envPathscd "${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<N>_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"

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

# 首次启动这个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" }
<END># 退出当前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

EPICS -- autosave模块使用示例相关推荐

  1. EPICS modbus模块驱动程序示例2(模拟量)

    本文以聚英电子的JY-DAMAIAO模拟量测控模块为例,讲解如何使用EPICS modbus模块实现对模拟设备读写控制.由于对设备施加电压以及测量电压都较电流容易,本人选择的这个模块能够读取6路0-1 ...

  2. EPICS modbus模块驱动程序示例1(数字量)

    本文以Moxa ioLogik E2210(Moxa官网对这种设备的详细介绍ioLogik E2210 - 通用控制器和远程 I/O ioLogik E2200 系列 | MOXA)通用控制器和远程I ...

  3. EPICS stream模块使用示例 -- 基于字符串协议的通信

    1.按如下步骤,建立IOC应用程序框架: [blctrl@bjAli exer37]$ makeBaseApp.pl -t ioc streamTest [blctrl@bjAli exer37]$ ...

  4. boost::safe_numerics模块有理数示例程序

    boost::safe_numerics模块有理数示例程序 实现功能 C++实现代码 实现功能 boost::safe_numerics模块有理数示例程序 C++实现代码 #include <i ...

  5. (19)System Verilog模块设计示例

    (19)System Verilog模块设计示例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog模块设计示例 5)结语 1.2 FPG ...

  6. js模块封装示例_AngularJS模块教程示例

    js模块封装示例 In this post, we are going to cover one of the most important feature in AngularJS called M ...

  7. 用8266学习单片机-13-HC-SR04超声波模块测距示例-Ultrasonic-US-015

    HC-SR04原理 重点 5v供电.Tri引脚需要至少10us的高脉冲去触发.Echo返回的是超声波发射到返回的时间 距离怎么算看上面第三张图,US-015原理相似,注意测量范围最小值和最大值 接线 ...

  8. Pygame Event事件模块(示例)

    Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...

  9. 【微信小程序控制硬件13 】 与硬件平台无关,微信小程序 AP 配网安信可 Wi-Fi 模块入网示例。【AT篇,附带Demo】

    文章目录 前言 一 材料准备 二 实现目的 三 配置的数据交互协议 3.1 小程序发送网络信息阶段 3.2 模组连接路由器的回调: 四 配置原理和过程 五 设备端 AT 交互过程 另外,不要把我的博客 ...

最新文章

  1. win10 安装字体且不占用系统盘资源
  2. sob攻略超详细攻略_北海涠洲岛旅游超详细住宿攻略!!!
  3. Hibernate 一级缓存,二级缓存,查询缓存
  4. Tensorflow的高级封装
  5. SAP Spartacus简介
  6. [LeetCode-JAVA] Remove Linked List Elements
  7. 计组之存储系统:1、存储系统的概念与基本组成(层次、分类、性能指标、基本结构、寻址)
  8. 垃圾回收器如何确定哪些对象要回收---《深入理解java虚拟机》
  9. Unity3D实习生面试题总结-图形学相关
  10. Vijos1982 NOIP2015Day2T2 子串 substring 动态规划
  11. 小程序注册开发全流程
  12. 算法4-中兴捧月杯热身赛1素数判断-热身赛2亲和串-热身赛3旅游路线-
  13. 考研复试数据库原理课后习题(一)——绪论
  14. “知识付费”的分类及传播特征
  15. 搞明白activated和deactivated
  16. 【Windows Server 2019】DHCP服务器配置与管理——验证DHCP服务 备份与恢复DHCP数据 Ⅲ
  17. 滚动加载分辨率scrollTop小数问题
  18. 静态路由 动态路由 php,静态路由汇总(路由聚合)
  19. 软件测试方法进行调优,一种大型软件测试方法
  20. TOMCAT原理详解及请求过程

热门文章

  1. 使用ffmpeg把mp4与m3u8相互转换的操作
  2. GIS--矢量数据,栅格数据,切片,瓦片,金字塔的概念
  3. go-kit入门指南
  4. 使用云主机,我们可以做哪些事情
  5. ffmpeg 4.2.1 版本升级日志 APIChanges
  6. 【文献阅读】Federated Accelerated Stochastic Gradient Descent
  7. 你不可不知的《哈利波特》秘密(五)
  8. 航天信息a3连接不上服务器,航天信息睿财A3使用说明
  9. Burp Suite使用介绍(一)
  10. 关于python循环结构错误的是_以下关于Python的循环结构说法错误的是(_____)。...