EPICS记录参考--sub-Array记录(subArray)
subArray记录类型的一般用法是从waveform记录获取子数组。设置元素数目(NELM)或索引(INDX)字段使得这个记录再被运行依次,因此使用标准EPICS操作接口工具能够实现这样的应用程序,在这个应用程序中在一个waveform记录中一个子数组的长度和位置动态变化。
subArray记录的第一个元素(在被引用的waveform记录中INDX位置)可以以标量被显示,或者用与waveform记录相同的方式显示整个subarray(NELM长度)。如果被引用waveform记录在INDX后的元素少于NELM个元素,返回实际可以获取的元素数目,并且被读取元素数目字段(NORD)被设置来反映这个。这个记录类型不支持写新值到waveform记录。
参数字段
记录专用字段在下面描述,按功能分组:
用于扫描的参数
subArray记录有用于指定在什么情况下将运行这个记录的标准字段。这些字段在Scan Fields中列出。
用于读取的参数
subArray输入链接(INP)应该被配置成引用Waveform记录。它应该指定一个waveform记录的VAL字段。INP字段可以是通道访问链接和数据库链接。
这些参数确定了数组元素的数目(数组长度)和那些元素的数据类型。字段值的类型(FTVL)字段确定了这个数组的数据类型。
用户在MALM字段中指定了要被读入到这个subarray的数目最大数目。这通常应该等于Waveform数组中元素数目(在Waveform的NELM字段中找到)。MALM字段用于分配内存。subArray的元素数目字段是用户指定subArray将提取的实际元素数目的地方。它当然不应该大于MALM;如果它是,记录运行的process例程设置其等于MALM。
INDX字段确定了subArray记录的数组相对于Waveform数组的偏移。例如,如果INDX是2,则subArray将读取NELM元素从Waveform的数组的第三个元素开始读取NELM个元素。因而,它等于Waveform的数组的索引号。
实际的子数组是被VAL字段引用。
这些参数用于向操作者显示有意义的数据。它们以文本或图形显示这个subArray记录的值和其它参数。EGU是一个最长16个字符的字符串,描述这个subArray记录保存值的工程单位。通过get_units()记录支持例程获取它。
HOPR和LOPR字段为这个sub-array元素设置上下显示限制。get_graphic_double()和get_control_double()记录支持例程都获取这些字段。
PREC字段确定了用什么浮点精度显示VAL。当调用get_precision()记录支持例程时使用它。
有关记录名(NAME)和描述(DESC)字段的更多信息见Fields Common to All Record Type。
用于警报的参数
subArray记录有所有记录类型共有的警报参数。Alarm Fields列出了与所有记录类型共有警报相关联的字段。
运行时参数
这些字段不是由用户配置的。它们用于记录内部运行或者代表这个记录的当前状态。
NORD字段保存了实际被读入这个数组的元素数目。当NELM和INDX字段之和超过了在源数组中找到的已有元素数目时,它将少于NELM。
BPTR包含了一个指向这个记录的数组的指针。
记录支持
记录支持例程
1) init_record
long (*init_record)(struct dbCommon *precord, int pass)
使用MALM和FTVL,为数组分配空间。数组地址存储在BPTR。这个例程检查设备支持是否可用以及设备支持读取例程是否被定义。如果二者中有一个不存在,发出一条错误消息,并且终结运行的process。如果设备支持包含init_record(),它被调用。
2) process
long (*process)(struct dbCommon *precord)
3) cvt_dbaddr
long (*cvt_dbaddr)(struct dbAddr *paddr)
这被dbNameToAddr()调用。它使得dbAddr结构体指向保存这个结果的实际缓存。
4) get_array_info
long (*get_array_info)(struct dbAddr *paddr, long *no_elements, long *offset)
获取NORD。
5) put_array_info
long (*put_array_info)(struct dbAddr *paddr, long nNew)
设置NORD。
6) get_graphic_double
long (*get_graphic_double)(struct dbAddr *paddr, struct dbr_grDouble *p)
对于数组中元素,这个例程设置HOPR和LOPR。对于INDX字段,这个例程返回MALM-1和0。对于MALM,返回MALM和1。对于其它字段,它调用recGblGetGraphicDouble。
7) get_control_double
long (*get_control_double)(struct dbAddr *paddr, struct dbr_ctrlDouble *p)
对于数组元素,这个例程获取HOPR和LOPR。否则,调用recGblControlDouble()。
8) get_units
long (*get_units)(struct dbAddr *paddr, char *units)
获取EGU。
9) get_precision
long (*get_precision)(const struct dbAddr *paddr, long *precision)
记录运行
记录运行实现以下算法:
1) 检查合适的设备支持模块是否存在。如果它不存在,则发出一条错误消息并且用PACT字段仍设置为TRUE终止正在运行的process。这确保了不再为这个记录调用processes。因而不会发生错误风暴。
2) 检查NELM和INDX。如果NELM大于MALM,它被设置成MALM。如果INDX大于或等于MALM,它被设置成MALM-1。
3) 调用设备支持的read_sa()例程。预计这个例程从缓存起始放置所需的子数组,并且设置NORD为被读取的子数组的元素数目。
4) 如果PACT已经被更改为TRUE,设备支持读取操作已经开始,但还未结束写新值。
5) 检查是否应该调用monitors。
- 如果警报状态或者严重性发生变化,调用警报监视器
- 总是调用archive和值变化监视器
- NSEV和NSTA被重置为0
6) 如果需要,扫描forward链接,设置PACT为FALSE,并且返回。
设备支持
设备支持有关字段
设备支持例程主要使用以下字段:
设备支持例程(devSASoft.c)
设备支持由以下例程组成:
1) long report(int level)
这个可选的例程被IOC命令dbior调用,并且被传递用户请求的报告等级。它应该打印一个有关设备支持的报告到stdout。level参数可以用于用更改等级输出更加详细的信息,或者选择用不同级别的不同信息类型。级别0应该输出一小段概述。
2) long init(int after)
这个可选的例程在IOC初始化时被调用两次。第一次调用用整数参数after设置为0在进行任何init_record()调用前发生。第二次调用用after设置为1在已经进行了所有init_record()调用后发生。
3) init_record
long init_record(subArrayRecord *prec)
这个例程被记录支持init_record()例程调用。
4) read_sa
long read_sa(subArrayRecord *prec)
从源waveform开始读取源waveform足够到BPTR,去包含请求的子数组。接着数组被复制到这个缓存的起始。NORD被设置成被采集的子数组的元素数目。
软记录的设备支持
当前只提供设备支持模块Soft Channel。
Soft Channel
预计INP指向一个waveform记录或者类似的一个数组字段。
示例:数据库实例文件
这个数据库实例文件有三个记录实例组成:
1) $(USER):arrayIn记录实例是waveform类型记录实例,它驱动$(USER):subArray记录实例运行并且为其提供数据源。
2) $(USER):subArray记录实例是subArray类型记录实例,它用其INDX和ELEM字段从其源waveform记录实例数组中提取子数组,放入本记录数组中,并且驱动$(USER):arrayOut记录实例运行并且为其提供数据源。
3) $(USER):arrayOut记录实例是waveform类型记录实例,它从$(USER):subArray记录实例的数组中获取数组,存入本记录的数组中。
record(waveform, "$(USER):arrayIn")
{field(SCAN, "Passive")field(DTYP, "Soft Channel")field(NELM, "10")field(FTVL, "LONG")field(FLNK, "$(USER):subArray")
}record(subArray, "$(USER):subArray")
{field(SCAN, "Passive")field(DTYP, "Soft Channel")field(FTVL,"LONG")field(MALM, "10")field(NELM, "5")field(INDX, "2")field(INP, "$(USER):arrayIn.VAL")field(FLNK, "$(USER):arrayOut")
}record(waveform, "$(USER):arrayOut")
{field(SCAN, "Passive")field(DTYP, "Soft Channel")field(FTVL, "LONG")field(NELM, "10")field(INP, "$(USER):subArray.VAL")
}
将上述记录数据库文件加载到IOC中,用dbl观察一共加载的记录实例:
epics> dbl
blctrl:arrayIn
blctrl:arrayOut
blctrl:subArray
另开一个命令窗口,用通道访问命令对以上记录实例的数据传递进行测试:
# IOC初始化时,三个记录各自初始的值
[root@bjAli ~]# caget blctrl:arrayIn blctrl:subArray blctrl:arrayOut
blctrl:arrayIn 10 3 0 0 0 0 0 0 0 0 0
blctrl:subArray 10 327690 0 0 0 0 0 0 0 0 0
blctrl:arrayOut 10 0 0 0 0 0 0 0 0 0 0# 向blctrl:arrayIn记录中写入一个长度为10的数组,数组元素从1~10
# 观察blctrl:subArray和blctrl:arrayOut记录实例中数组元素以及这两个记录实例实际获取的元素数目
# INDX=2,ELEM=5,subArray记录获取的数组元素是从blctrl:arrayIn数组中第三个元素开始,取5个元素
[root@bjAli ~]# caput -a blctrl:arrayIn 10 1 2 3 4 5 6 7 8 9 10
Old : blctrl:arrayIn 10 3 0 0 0 0 0 0 0 0 0
New : blctrl:arrayIn 10 1 2 3 4 5 6 7 8 9 10
[root@bjAli ~]# caget blctrl:arrayIn blctrl:subArray blctrl:arrayOut
blctrl:arrayIn 10 1 2 3 4 5 6 7 8 9 10
blctrl:subArray 10 3 4 5 6 7 0 0 0 0 0
blctrl:arrayOut 10 3 4 5 6 7 0 0 0 0 0
[root@bjAli ~]# caget blctrl:arrayIn.NORD blctrl:subArray.NORD blctrl:arrayOut.NORD
blctrl:arrayIn.NORD 10
blctrl:subArray.NORD 5
blctrl:arrayOut.NORD 5# 更改subArray记录实例的取值索引起始值
[root@bjAli ~]# caput blctrl:arrayIn.INDX 4
Channel connect timed out: 'blctrl:arrayIn.INDX' not found.
[root@bjAli ~]# caput blctrl:subArray.INDX 4
Old : blctrl:subArray.INDX 2
New : blctrl:subArray.INDX 4
[root@bjAli ~]# caget blctrl:arrayIn blctrl:subArray blctrl:arrayOut
blctrl:arrayIn 10 1 2 3 4 5 6 7 8 9 10
blctrl:subArray 10 5 6 7 8 9 0 0 0 0 0
blctrl:arrayOut 10 5 6 7 8 9 0 0 0 0 0
[root@bjAli ~]# caget blctrl:arrayIn.NORD blctrl:subArray.NORD blctrl:arrayOut.NORD
blctrl:arrayIn.NORD 10
blctrl:subArray.NORD 5
blctrl:arrayOut.NORD 5# 更改subArray记录实例的取值数目值
[root@bjAli ~]# caget blctrl:subArray.NELM 2
Channel connect timed out: some PV(s) not found.
[root@bjAli ~]# caput blctrl:subArray.NELM 2
Old : blctrl:subArray.NELM 5
New : blctrl:subArray.NELM 2
[root@bjAli ~]# caget blctrl:arrayIn blctrl:subArray blctrl:arrayOut
blctrl:arrayIn 10 1 2 3 4 5 6 7 8 9 10
blctrl:subArray 10 5 6 0 0 0 0 0 0 0 0
blctrl:arrayOut 10 5 6 0 0 0 0 0 0 0 0
[root@bjAli ~]# caget blctrl:arrayIn.NORD blctrl:subArray.NORD blctrl:arrayOut.NORD
blctrl:arrayIn.NORD 10
blctrl:subArray.NORD 2
blctrl:arrayOut.NORD 2
EPICS记录参考--sub-Array记录(subArray)相关推荐
- EPICS记录参考3 -- 所有记录都有的字段
这部分包含了一段对所有记录类型都有的字段的描述.这些字段在dbCommon.dbd中定义. 操作显示参数 NAME字段包含了记录名称,它在一个EPICS通道访问名称空间中必须唯一.由程序开发者提供这个 ...
- EPICS记录参考--计算输出记录(calcout)
计算输出或"Calcout"记录类似于Calc记录,其增加了能够输出的特性(一个"output link"和一个"output event" ...
- EPICS记录参考5 -- 数组模拟输入记录Array Analog Input (aai)
static long process(aaiRecord *prec) 数组模拟输入记录类型用于读取数组数据.数组数据能够包含任何可支持的数据类型.这个记录在很多方面类似于waveform记录.它允 ...
- EPICS记录参考1--EPICS概要
EPICS是什么? 实验物理和工业控制系统(EPICS)由一个可以用于创建分布式控制系统的软件组件和工具组成.EPICS提供了期望来自一个分布式系统的代表性功能: 设施设备的远程控制和监控 自动化的操 ...
- EPICS记录参考2--EPICS过程数据库概念
EPICS过程数据库 一个基于EPICS的控制系统包含一个或多个输入输出控制器,IOCs.每个IOC装载一个或多个数据库.一个数据库是各种类型记录的集合. 一个记录是一个对象,有: 一个唯一名称 有其 ...
- EPICS记录参考--Sequence记录(seq)
Sequence记录用于触发最多16个其它记录运行并且发送这些值到那些记录.除了它将获取一个输入值并且写一个输出值而不是仅仅运行一个forward链接的集合外,它类似于fanout记录.它也能够指定若 ...
- EPICS记录参考--多位二进制输入记录(mbbi)
多位二进制输入记录常用于从硬件读取连续,多位输入.二进制值代表最多16种状态中一种.多位二进制记录与使用多个比特位的设备连接. 大部分设备支持从硬件获取值并且在RVAL中放置这个值.对于这些记录支持模 ...
- EPICS记录参考--Fanout记录(fanout)
fanout记录使用若干转发运行链接强制多个被动记录进行扫描.当多个基类由于一个基类被运行而需要被扫描时,那个基类的转发链接可以执行一个fanout记录.fanout记录可以最多指定16个其它记录运行 ...
- EPICS scalcout - String Calculation Output记录
1.介绍 字符串计算输出或"scalcout"记录派生自EPICS base中calcout记录,并且通过在数值表达式外还支持字符串表达式,扩展它.这个记录有12个字符串字段(AA ...
最新文章
- 物联网、云计算商用或从“家庭自动化”得以突破
- [转][3DSMAX][贴图]如何检查遗失贴图
- 文末送书 | Facebook:易于解释的神经元可能会阻碍神经网络的学习
- java中main缺少主体_缺少方法主体,或声明了摘要
- mysql alter event_MYSQL ALTER EVENT介绍
- 1. 普通地图(建筑蓝图、手机导航地图)能直接用于移动机器人的定位导航吗?《移动机器人导航杂谈》系列
- 【Flink】 producer attempted to use a producer id which is not currently assigned to its transaction
- 装ie9后无法用网银解决办法
- JS小游戏-极速快跑
- Unity脚本中查找的几种方法优劣以及坑
- 【Python - wxpython】- 卫星通信系统链路计算软件
- 数据结构严蔚敏 栈基本操作 C语言实现
- c++ 调用批处理 bat 清理浏览器缓存。
- phpspider 简单用法和学习,分类一对多爬取数据
- 腾讯微云 for Mac v
- 【计算机组成】内存和芯片存储容量问题
- 谈谈CornerStone这个工具的使用
- 【安全硬件】Chap.6 IC和半导体产业的全球化;芯片生产猜疑链与SoC设计流程;可能会存在的安全威胁: 硬件木马、IP盗版、逆向工程、侧信道攻击、伪造
- Html网页设计-旅游景点介绍
- Android Activity界面跳转动画讲解
热门文章
- JL-03-Q9 自动气象站 常见气象9参数 空气温湿度 风速风向 雨量光照 大气压力 土壤温湿度
- 程序设计-在校整理-06 最常公共子序列与子串+2048小游戏+KNN简单实例
- ZOJ - 4049 Halting Problem 题解【c++】
- 【linux】部署磁盘列阵RAID 10,报错mdadm: super1.x cannot open /dev/sdb: Device or resource busy
- knex mysql 操作_手把手教你用express + mysql + knex 做个 todoList
- can收发器 rx_CAN/CANFD采样点
- 黎明前的黑暗(励志歌)
- 【狂神说】——Spring笔记(全)
- 3月18日作业-监理师培训
- html页面记录访问次数