• 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。

    1. record(longin, "$(USER):Run")
    2. {
    3. field(INP, "0")
    4. field(SCAN, "Passive")
    5. field(DTYP, "Soft Channel")
    6. field(FLNK, "$(USER):RunCalc.PROC")
    7. }
    8. record(event, "$(USER):RunCalc")
    9. {
    10. field(INP, "1")
    11. field(DTYP, "Soft Channel")
    12. field(SCAN, "Passive")
    13. }
    14. record(calc, "$(USER):Calc")
    15. {
    16. field(SCAN, "Event")
    17. field(EVNT, "1")
    18. field(INPA, "1")
    19. field(CALC, "VAL+1>8?A:VAL+1")
    20. field(FLNK, "$(USER):Histogram")
    21. }
    22. record(histogram, "$(USER):Histogram")
    23. {
    24. field(SCAN,"Passive")
    25. field(SVL, "$(USER):Calc.VAL")
    26. field(DTYP, "Soft Channel")
    27. field(ULIM, "8")
    28. field(LLIM, "0")
    29. field(NELM, "4")
    30. field(MDEL, "-1")
    31. field(SDEL, "2")
    32. }

    测试结果如下:

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

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

    1. [root@bjAli rec]# caput blctrl:Run 1
    2. Old : blctrl:Run 0
    3. New : blctrl:Run 1
    4. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    5. blctrl:Histogram.SGNL 1
    6. blctrl:Histogram 4 1 0 0 0
    7. [root@bjAli rec]# caput blctrl:Run 1
    8. Old : blctrl:Run 1
    9. New : blctrl:Run 1
    10. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    11. blctrl:Histogram.SGNL 2
    12. blctrl:Histogram 4 2 0 0 0
    13. [root@bjAli rec]# caput blctrl:Run 1
    14. Old : blctrl:Run 1
    15. New : blctrl:Run 1
    16. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    17. blctrl:Histogram.SGNL 3
    18. blctrl:Histogram 4 2 1 0 0
    19. [root@bjAli rec]# caput blctrl:Run 1
    20. Old : blctrl:Run 1
    21. New : blctrl:Run 1
    22. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    23. blctrl:Histogram.SGNL 4
    24. blctrl:Histogram 4 2 2 0 0
    25. [root@bjAli rec]# caput blctrl:Run 1
    26. Old : blctrl:Run 1
    27. New : blctrl:Run 1
    28. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    29. blctrl:Histogram.SGNL 5
    30. blctrl:Histogram 4 2 2 1 0
    31. [root@bjAli rec]# caput blctrl:Run 1
    32. Old : blctrl:Run 1
    33. New : blctrl:Run 1
    34. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    35. blctrl:Histogram.SGNL 6
    36. blctrl:Histogram 4 2 2 2 0
    37. [root@bjAli rec]# caput blctrl:Run 1
    38. Old : blctrl:Run 1
    39. New : blctrl:Run 1
    40. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    41. blctrl:Histogram.SGNL 7
    42. blctrl:Histogram 4 2 2 2 1
    43. [root@bjAli rec]# caput blctrl:Run 1
    44. Old : blctrl:Run 1
    45. New : blctrl:Run 1
    46. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    47. blctrl:Histogram.SGNL 8
    48. blctrl:Histogram 4 2 2 2 1
    49. [root@bjAli rec]# caput blctrl:Run 1
    50. Old : blctrl:Run 1
    51. New : blctrl:Run 1
    52. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    53. blctrl:Histogram.SGNL 1
    54. blctrl:Histogram 4 3 2 2 1
    55. [root@bjAli rec]# caput blctrl:Run 1
    56. Old : blctrl:Run 1
    57. New : blctrl:Run 1
    58. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    59. blctrl:Histogram.SGNL 2
    60. blctrl:Histogram 4 4 2 2 1
    61. [root@bjAli rec]# caput blctrl:Run 1
    62. Old : blctrl:Run 1
    63. New : blctrl:Run 1
    64. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    65. blctrl:Histogram.SGNL 3
    66. blctrl:Histogram 4 4 3 2 1
    67. [root@bjAli rec]# caput blctrl:Run 1
    68. Old : blctrl:Run 1
    69. New : blctrl:Run 1
    70. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    71. blctrl:Histogram.SGNL 4
    72. blctrl:Histogram 4 4 4 2 1
    73. [root@bjAli rec]# caput blctrl:Run 1
    74. Old : blctrl:Run 1
    75. New : blctrl:Run 1
    76. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    77. blctrl:Histogram.SGNL 5
    78. blctrl:Histogram 4 4 4 3 1
    79. [root@bjAli rec]# caput blctrl:Run 1
    80. Old : blctrl:Run 1
    81. New : blctrl:Run 1
    82. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    83. blctrl:Histogram.SGNL 6
    84. blctrl:Histogram 4 4 4 4 1
    85. [root@bjAli rec]# caput blctrl:Run 1
    86. Old : blctrl:Run 1
    87. New : blctrl:Run 1
    88. [root@bjAli rec]# caget blctrl:Histogram.SGNL blctrl:Histogram
    89. blctrl:Histogram.SGNL 7
    90. blctrl:Histogram 4 4 4 4 2
  • 相关阅读:
    常识——虚拟机安装centos7与联网
    零基础学前端(三)重点讲解 HTML
    Java面试题总结 - Java集合篇(附答案)
    libVLC 制作一款精美的播放器
    掌动智能云网络流量分析的重要性
    springboot 项目部署到Linux 服务器
    设计数据库表
    【NR 物理资源】
    SpringBoot定时任务 - 什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?
    2-8.基金客户服务
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/127532367