EPICS记录参考--Histogram记录(histogram)

这个histogram记录用于存储一个信号的频率计数到一个任意长度的数组。用户可以配置这个数组将存储的信号值的范围。在这个范围外的任何值将被忽略。

参数字段

在以下描述记录特定的字段。

用于读取的参数

SVL是输入链接,记录从其读取它的值。它可以是一个常数,数据库链接或者通道访问链接。如果SVL是常数,数据库链接或者通道访问链接。如果SVL是一个数据库链接或者通道访问链接,则从SVL读取SGNL。如果SVL是一个常数,则用这个常数值初始化SGNL,但可以通过dbPuts被更改。在DTYP字段中可以指定Soft Channel设备支持模块。

ULIM和LLIM字段确定信号值的可用范围。在LLIM下的或者ULIM上的SGNL任何值超出了这个范围,并且将不被存储在这个数组中。用户必须在NELM字段中指定数组尺寸,例如,数组元素的数目。在NELM字段中每个元素保存数组元素的数目,信号计数范围由ULIM和LLIM指定。通过范围除以NELM确定这些间隔。

 (ULIM - LLIM) / NELM.

操作显示参数

 这些参数用于向操作者显示有意义数据。这些字段用于以文本或图形显示histogram的值和其它参数。有关记录名(NAME)和描述(DESC)字段的更多信息见Fields Common to All Record Types。

 

警报参数

Histogram记录有所有记录类型都共有的警报参数。Alarms Fields列出了与所有记录类型共有的警报相关的字段。

用于监控的参数

MDEL字段实现了monitor计数死区。仅当MCNT大于传给MDEL的值时才触发monitors。MCNT是从上次运行这个记录以来计数数目。如果MDEL是-1时,每次运行这个记录,触发一个monitor。

如果SDEL大于0,它使得一个回调例程被调用。在SDEL中指定的数值是回调例程间隔。每SDEL秒,调用这个回调例程。如果MCNT大于0,回调例程提交一个事件。

运行时和仿真模式参数

 这些参数由运行时代码使用用于运行这个histogram。在运行前,它们不能由用户配置。它们代表记录的当前状态。它们中很多用于更高效地运行这个histogram记录。

BPTR字段包含了一个指向频率值得无符号长整数数组得指针。VAL字段也引用这个数组,BPTR字段在运行时不能访问。

MCNT字段保存从调用上次monitor以来,信号计数的数目。

采集控制字段(CMD)是一个有五个选项的菜单字段:

 当CMD是Read时,这个记录获取它的值并且添加它们到信号数组。当首次调用这个命令将清除已经被读取的信号计数。

Clear命令擦除信号计数,设置在数组中元素位0。之后,cmd字段被置回Read。

Start命令使得记录读取信号值到数组。不同于Read,它不首先清除数组。

Stop命令禁止读取信号值到数组。

Setup命令等待到start或read命令已经被发出开始计数。

CSTA或采集状态字段通过启用或禁用读取值到histogram数组实现CMD字段选项。当FALSE时,没有信号被添加到这个数组。当TRUE时,信号被读取并且被添加到这个数组。此字段被初始化位TRUE。Stop命令是设置CSTA为FALSE的唯一命令。另一方面,Start命令是设置其为TRUE的唯一命令。因而,为了启用计数,在每次Stop命令后,必须调用Start。

这些字段的一般用法是初始化CMD字段为Read(默认它被初始化为这个命令),当需要时,要使用Stop命令禁止计数,在此之后,可以调用Start命令重启信号计数。

WDTH字段是一个私有字段,它保存数组元素的信号宽度。例如,如果LLIM被设置为4.0,而ULIM被设置为12.0,并且NELM被设置为4,则对应每个数组的WDTH为2。因而,它是(ULIM-LLIM)/NELM。

 以下字段用于在仿真模式中操作这个histogram记录。

记录支持

记录支持例程

 1) init_record

使用NELM,分配用于无符号long数组的空间以及计算这个数组的宽度WDTH。

如果SIML类型是CONSTANT链接,这个例程用SIML的值的值初始化SIMM,或者如果SIML类型是PV_LINK,创建一个通道访问链接。根据SIOL是CONSTANT或PV_LINK,SVAL被类似地初始化。

这个例程接着检查设备支持和一个设备支持读取例程是否存在。如果设备支持包含init_record(),调用它。

2) process

下部分讲解。

3) special

当字段CMD,SGNL,ULIM或LLIM被更改时,调用special。

如果SGNL被更改,调用add_count。

如果ULIM或LLIM被更改,重新计算WDTH并且调用clear_histogram。

如果CMD小于或等于1,调用clear_histogram,并且重置为0。如果CMD是2,CSTA被设置为TRUE重置CMD为0。如果CMD是3,CSTA被设为FALSE,并且重置CMD为0。

clear_histogram对histogram数组置0。add_count在histogram数组中增加频率。

4) cvt_dbaddr:这被dbNameToAddr调用。它使得dbAddr结构体指向保存这个数组地实际缓存。

5) get_array_info:从由VAL引用的数组获取值。

6) put_array_info:把值写到由VAL引用的数组。

记录运行

记录运行实现以下算法:

1) 检查合适的设备支持模块是否存在。如果它不存在,发出一条错误消息并且用PACT字段设置为TRUE终止运行的process。这确保了不再为这个记录调用processes。因而将不发生错误风暴。

2) readValue被调用。

3) 如果PACT已经被更改为TRUE,设备支持读取例程已经开始但还未结束写这个新值。在这种情况下,正在运行的process例程仅返回,保留PACT为TRUE。

4) 添加计数到histogram数组。

5) 检查是否应该调用monitors。如果警报状态或严重性变化了,调用警报monitors。如果满足MDEL条件,调用archive和值变化monitors。

6) 如果需要,扫描forward链接,设置PACT和INIT为FALSE并且返回。

设备支持

设备支持有关的字段

设备支持主要使用以下字段:

设备支持例程

 设备支持有以下例程组成:

1)  long report(int level)

这个可选的例程被IOC命令dbior调用并且被传递用户请求的报告等级。它应该打印一个有关设备支持的状态报告到stdout。level参数可以用于以更高级别输出更详细的信息,或者用不同等级选择不同信息类型。等级0应该打印一小段概要。

2)  long init(init after)

这个可选的例程在IOC初始化时被调用两次。第一个调用用这个整数参数after设为0在进行任何init_record()调用之前发生。第二次调用用after设为1在已经完成所有init_record()调用之后发生。

3)  init_record(precord)

这个例程被记录支持init_record()例程调用。它确认SGNL是常数,PV_LINK,DB_LINK或者CA_LINK。它也从SGNL为SVL获取一个值。如果SGNL不是以上值,产生一个错误。

4) read_histogram(*precord)

这个例程被记录支持例程调用。它从SGNL为SVL获取一个值。

软记录的设备支持

当前仅提供设备支持模块Soft Channel,但在用户站点可以提供其它设备支持模块。

Soft Channel

Soft Channel设备支持例程从SGNL获取一个值。SGNL必须是常数,PV_LINK, DB_LINK或CA_LINK。

示例:

数据库文件由四个记录实例组成:

1) $(USER):Run记录类型是longin,向这个记录写入一个任意整数,将引起本记录运行,并且触发$(USER):RunCalc记录的运行。

2) $(USER):RunCalc记录类型是event,此记录用于触发$(USER):Calc记录的运行

3) $(USER):Calc记录类型是calc,此记录运行后,输出结果在1~8之间循环。

4) $(USER):Histogram记录类型是histogram,此记录运行后,从(USER):Calc.VAL读取值,将其放入SGNL字段,并且判断这个值落在根据ULIM,LLIM,NELM三个字段划分的哪个区间内,把那个区间内的计数加1。

record(longin, "$(USER):Run")
{
        field(INP, "0")
        field(SCAN, "Passive")
        field(DTYP, "Soft Channel")
        field(FLNK, "$(USER):RunCalc.PROC")
}

record(event, "$(USER):RunCalc")
{
        field(INP, "1")
        field(DTYP, "Soft Channel")
        field(SCAN, "Passive")
}

record(calc, "$(USER):Calc")
{
        field(SCAN, "Event")
        field(EVNT, "1")
        field(INPA, "1")
        field(CALC, "VAL+1>8?A:VAL+1")
        field(FLNK, "$(USER):Histogram")
}

record(histogram, "$(USER):Histogram")
{
        field(SCAN,"Passive")
        field(SVL, "$(USER):Calc.VAL")
        field(DTYP, "Soft Channel")
        field(ULIM, "8")
        field(LLIM, "0")
        field(NELM, "4")
        field(MDEL, "-1")
        field(SDEL, "2")
}

测试结果如下:

对于blctrl:Histogram记录,由NELM字段指定了有4个区间:

输入值在[0,2]之间,数组第0个元素加1,输入值在(2,4]之间,数组第1个元素加1,输入值在(4,6]之间,数组第2个元素加1,输入值在(6,8)之间,数组第三个元素加1。

[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     0
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          1
blctrl:Histogram 4 1 0 0 0
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          2
blctrl:Histogram 4 2 0 0 0
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          3
blctrl:Histogram 4 2 1 0 0
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          4
blctrl:Histogram 4 2 2 0 0
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          5
blctrl:Histogram 4 2 2 1 0
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          6
blctrl:Histogram 4 2 2 2 0
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          7
blctrl:Histogram 4 2 2 2 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          8
blctrl:Histogram 4 2 2 2 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          1
blctrl:Histogram 4 3 2 2 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          2
blctrl:Histogram 4 4 2 2 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          3
blctrl:Histogram 4 4 3 2 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          4
blctrl:Histogram 4 4 4 2 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          5
blctrl:Histogram 4 4 4 3 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          6
blctrl:Histogram 4 4 4 4 1
[root@bjAli rec]# caput blctrl:Run 1
Old : blctrl:Run                     1
New : blctrl:Run                     1
[root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
blctrl:Histogram.SGNL          7
blctrl:Histogram 4 4 4 4 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值