EPICS -- autosave模块使用示例
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模块使用示例相关推荐
- EPICS modbus模块驱动程序示例2(模拟量)
本文以聚英电子的JY-DAMAIAO模拟量测控模块为例,讲解如何使用EPICS modbus模块实现对模拟设备读写控制.由于对设备施加电压以及测量电压都较电流容易,本人选择的这个模块能够读取6路0-1 ...
- EPICS modbus模块驱动程序示例1(数字量)
本文以Moxa ioLogik E2210(Moxa官网对这种设备的详细介绍ioLogik E2210 - 通用控制器和远程 I/O ioLogik E2200 系列 | MOXA)通用控制器和远程I ...
- EPICS stream模块使用示例 -- 基于字符串协议的通信
1.按如下步骤,建立IOC应用程序框架: [blctrl@bjAli exer37]$ makeBaseApp.pl -t ioc streamTest [blctrl@bjAli exer37]$ ...
- boost::safe_numerics模块有理数示例程序
boost::safe_numerics模块有理数示例程序 实现功能 C++实现代码 实现功能 boost::safe_numerics模块有理数示例程序 C++实现代码 #include <i ...
- (19)System Verilog模块设计示例
(19)System Verilog模块设计示例 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog模块设计示例 5)结语 1.2 FPG ...
- js模块封装示例_AngularJS模块教程示例
js模块封装示例 In this post, we are going to cover one of the most important feature in AngularJS called M ...
- 用8266学习单片机-13-HC-SR04超声波模块测距示例-Ultrasonic-US-015
HC-SR04原理 重点 5v供电.Tri引脚需要至少10us的高脉冲去触发.Echo返回的是超声波发射到返回的时间 距离怎么算看上面第三张图,US-015原理相似,注意测量范围最小值和最大值 接线 ...
- Pygame Event事件模块(示例)
Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...
- 【微信小程序控制硬件13 】 与硬件平台无关,微信小程序 AP 配网安信可 Wi-Fi 模块入网示例。【AT篇,附带Demo】
文章目录 前言 一 材料准备 二 实现目的 三 配置的数据交互协议 3.1 小程序发送网络信息阶段 3.2 模组连接路由器的回调: 四 配置原理和过程 五 设备端 AT 交互过程 另外,不要把我的博客 ...
最新文章
- win10 安装字体且不占用系统盘资源
- sob攻略超详细攻略_北海涠洲岛旅游超详细住宿攻略!!!
- Hibernate 一级缓存,二级缓存,查询缓存
- Tensorflow的高级封装
- SAP Spartacus简介
- [LeetCode-JAVA] Remove Linked List Elements
- 计组之存储系统:1、存储系统的概念与基本组成(层次、分类、性能指标、基本结构、寻址)
- 垃圾回收器如何确定哪些对象要回收---《深入理解java虚拟机》
- Unity3D实习生面试题总结-图形学相关
- Vijos1982 NOIP2015Day2T2 子串 substring 动态规划
- 小程序注册开发全流程
- 算法4-中兴捧月杯热身赛1素数判断-热身赛2亲和串-热身赛3旅游路线-
- 考研复试数据库原理课后习题(一)——绪论
- “知识付费”的分类及传播特征
- 搞明白activated和deactivated
- 【Windows Server 2019】DHCP服务器配置与管理——验证DHCP服务 备份与恢复DHCP数据 Ⅲ
- 滚动加载分辨率scrollTop小数问题
- 静态路由 动态路由 php,静态路由汇总(路由聚合)
- 软件测试方法进行调优,一种大型软件测试方法
- TOMCAT原理详解及请求过程
热门文章
- 使用ffmpeg把mp4与m3u8相互转换的操作
- GIS--矢量数据,栅格数据,切片,瓦片,金字塔的概念
- go-kit入门指南
- 使用云主机,我们可以做哪些事情
- ffmpeg 4.2.1 版本升级日志 APIChanges
- 【文献阅读】Federated Accelerated Stochastic Gradient Descent
- 你不可不知的《哈利波特》秘密(五)
- 航天信息a3连接不上服务器,航天信息睿财A3使用说明
- Burp Suite使用介绍(一)
- 关于python循环结构错误的是_以下关于Python的循环结构说法错误的是(_____)。...