这个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