• compression记录(compress)


    数据压缩记录用于从数组采集并且压缩数据。当INP字段引用一个数据数组字段,它立即使用若干算法之一压缩整个数组一个数组的一个元素,重写先前值。如果INP字段从一个标量值字段获取了它的值,这个compress记录将在这个记录每次运行时采集一个新的采样值,并且添加到它作为环形缓存的被压缩数据数组。

    INP链接也可以指定一个常数;但,如果是这种情况,压缩算法被忽略,并且记录支持例程在检查FLNK字段后仅返回。

    记录专用的菜单

    菜单compressALG

    ALG字段使用这个菜单控制这个记录使用的压缩算法。

     菜单bufferingALG

    BALG字段使用这个菜单控制新值被插入在VAL数组的开头或结尾。

    参数字段

    在下面描述记录特定的字段,按功能分组。

    用于扫描的参数

    压缩记录有用于指定在什么情况下将运行这个记录的标准字段。由于compression记录不支持直接连接硬件,它的SCAN字段不被被设置成I/O Intr。这些描述在Scan Fields中描述。

    算法和相关的参数

     用户在ALG字段中指定要被使用的算法。有6种可能的算法,可以按以下指定它们:

    菜单compressALG

     以下字段确定了要读什么通道以及如何压缩数据:

     如上所述,ALG字段指定了要对数据执行哪种算法。

    INP应该是一个数据库或者通道访问链接。虽然INP可以是常数,仅在INP是数据库链接时才支持数据压缩算法。有关指定链接的信息见Address Specification

    IHIL和ILIL可以被设置成对输入数组的初始值过滤器。如果ILIL

    OFF提供了对于数组数据当前起始的偏移。注意:OFF仅在N to 1算法中被使用。

    在运行时能够访问RES字段使得在达到采样最大数前算法重置自身。

    算法

    1) Circular Buffer算法维护一个长度NSAM的环形缓存。当此记录每次运行时,它获取由INP引用的数据并且把它放置到由VAL引用的环形缓存中。INP可以指向标量或者数组数据并且VAL只是从INP获取的值的时间排序环形缓存。注意:N,ILIL,IHIL和OFF在Circular Buffer算法中不被使用。

    2) Average对随时间从INP获取的数组的每个元素计算平均;即,获取由INP引用的整个数组,并且对于每个元素,计算新的平均值并且被放置在这个值缓存的相应元素中。获取的数组被截短为长度NSAM。N个连续数组被平均并且放置在这个缓存中。因而,VAL[0]保存了INP第一个元素在N个采样值上的平均,VAL[1]保存了INP的下一个元素在N个采样值上的平均,依次类推。以下展示等式:

    3) N to 1:如果选取了任意N to 1算法,则VAL是一个NSAM采样值的环形缓存。实际算法取决于INP是否引用一个标量或者一个数组。

    如果INP指向一个标量,则获取了INP的N个连续时间排序采样值。在获取了第N个采样值后,一个由算法(最小,最大或平均)确定的新值被写入到由VAL引用的环形缓存。如果Low Value,所有采样值的最小值被写;如果High Value,最大值被写;如果Average,所有采样值的平均值被写。Medain设置对标量输入数据行为类似Average。

    如果INP指向一个数组,则以下应用:

    • N to 1 Low Value:压缩N个采样值为1个值,保存最小值。
    • N to 1 High Value:压缩N个采样值为1个值,保存最大值。
    • N to 1 Average::压缩N个采样值为1个值,保存平均值。
    • N to 1Median::压缩N个采样值为1个值,保存中位值。

    compression记录保存NSAM个数据采样值。

    字段N确定多少个元素要压缩到每个结果。

    因而,如果NSAM是3,而N也是3,则算法会按如下图表工作:

    用于操作显示的参数

    这些参数用于向操作者显示有意义数据。它们以文本或图形显示这个记录的值和其它参数。

    EGU字段应该被传给一个描述VAL值的字符串,当调用get_units记录支持例程是使用这个字段。

    HOPR和LOPR字段只为VAL,HIHI,HIGH,LOLO和LOW字段指定上和下显示限制。

    在调用get_precision时PREC控制浮点精度 ,并且被引用的字段是VAL字段(即:在环形缓存中包含了的值之一)。

    有关记录名(NAME)和描述(DESC)字段的更多信息见Fields Common to All Records Types。

    用于警报的参数

    compress记录有在Alarm Fields中描述的所有记录类型共有的警报参数。

    运行时参数

    这些参数被运行时代码使用用于处理数据压缩算法。它们是用户不可配置的,虽然一些参数在运行时是可访问的。它们可以表示waveform或者其字段被INP字段引用的记录的当前状态。

     NUSE和OUSE保存了存储在VAL中当前以及先前的元素数目。

    BPTR是一个指向由VAL引用的缓存的指针。

    SPTR指向了一个数组数组平均的数组。

    WPTR被dbGetLinks例程使用。

    记录支持

    记录支持例程

     long init_record(struct dbCommon *precord, int pass)

    为所有必需的数组配置空间。地址被存储在这个记录的合适字段中。

    long process(struct dbCommon *precord)

     long special(struct dbAddr *paddr, int after)

    当设置RSET,ALG或N时,调用这个例程。它执行一个重置。

     long cvt_dbaddr(struct dbAddr *paddr)

    这被dbNameToAddr调用。它使得dbAddr结构体指向保存这个结果的实际缓存。

      long get_array_info(struct dbAddr *paddr, long *no_elements, long *offset)

    从由VAL索引的环形缓存获取值。

    long put_array_info(struct dbAddr *paddr, long nNew);

    写值到由VAL索引的环形缓存中。

      long get_units(struct dbAddr *paddr, char *units);

    获取PREC。

     long get_graphic_double(struct dbAddr *paddr, struct dbr_grDouble *p);

    为一个字段设置上显示和下显示限制。如果这个字段是VAL,这些限制被设置成HOPR和LOPR,否则如果这个字段有已经定义好的上和下限制,将使用它们,否则将使用对应这个字段类型的上和下最值。

    long get_control_double(struct dbAddr *paddr, struct dbr_ctrlDouble *p);

    为一个字段设置上控制和下控制限制。如果这个字段是VAL,这些限制被设置成了HOPR和LOPR,否则如果这个字段有已经定义好的上和下限制,将使用它们,否则将使用对应这个字段类型的上和下最值。

    记录运行

    1) 如果INP不是数据库链接,检查monitors和forward链接并且返回。

    2) 获取由INP引用的当前数据。

    3) 执行合适的算法:

    • Average:读取INP的N个连续实例并且执行一个元素一个元素的平均。在获取了N个实例前,它仅返回,而不检查monitors或forward链接。当N个实例已经被获取了,结束这个算法,在VAL数组中存储这个结果,检查monitors和forward链接,并且返回。
    • Circular Buffer:写从INP获取的值到作为一个环形缓存的VAL数组,检查monitor和forward链接,并且返回。
    • N to 1 xxx when INP refers to a scalar:从INP获取N个连续值并且对这些值应用N to 1 xxx算法。在各值被获取前,不触发monitors和forward链接。当N各连续值已经被获取,结束这个算法,检查monitors和触发forward链接,并且返回。
    • N to 1 xxx when INP refers to an array:当ILIL

    4) 如果成功,设置UDF为FALSE。

    5) 检查是否调用monitors。

    • 如果警报状态或严重性发生变化,调用警报monitors。
    • 重置NSEV和NSTA为0.

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

    compress记录使用示例:

    数据库实例文件如下,由12各记录实例组成,安装测试目的分成了5组:

    1) $(USER):arrayIn, $(USER):fanout, $(USER):CompressA3to1和$(USER):CompressAAto1是一组,用于测试compress记录的输入为数组,compress记录算法为N to 1 Average时的结果,其中$(USER):CompressA3to1记录把数组中连续3个数值做一次平均,如本例设置,输入数组长度为9,则压缩后输出数组长度为3;$(USER):CompressAAto1记录把数组中连续9个数值做一次平均,输入数组长度为9,则输出为一个标量。

    2) $(USER):longin和$(USER):CompressS3to1是一组,用于测试compress记录的输入为标量,compress记录算法为N to 1 Average时的结果,由于$(USER):CompressS3to1的N字段为3,则这个记录从其INP字段每读取3次,求一次平均。

    3) $(USER):arrayIn2和$(USER):CompressAverage是一组,用于测试compress记录的输入为数组,compress记录算法为Average时的结果。如本例设置,compress记录从INP连续读取3个数组,对数组中相同索引的元素求平均。

    4) $(USER):CompressACircBuff和$(USER):arrayIn3为一组,用于测试compress记录的输入为数组,compress记录算法为Circular Buffer时的结果。

    5) $(USER):CompressSCirBuff和$(USER):longin2为一组,用于测试compress记录的输入为标量,compress记录算法为Circular Buffer时的结果。

    1. record(waveform, "$(USER):arrayIn")
    2. {
    3. field(SCAN, "Passive")
    4. field(DTYP, "Soft Channel")
    5. field(NELM, "9")
    6. field(FTVL, "LONG")
    7. field(FLNK, "$(USER):fanout")
    8. }
    9. record(fanout, "$(USER):fanout")
    10. {
    11. field(SELM,"All")
    12. field(SCAN, "Passive")
    13. field(LNK0, "$(USER):CompressA3to1.PROC")
    14. field(LNK1, "$(USER):CompressAAto1.PROC")
    15. }
    16. record(compress, "$(USER):CompressA3to1")
    17. {
    18. field(SCAN, "Passive")
    19. field(N, "3")
    20. field(NSAM, "3")
    21. field(ALG, "N to 1 Average")
    22. field(INP, "$(USER):arrayIn")
    23. }
    24. record(compress, "$(USER):CompressAAto1")
    25. {
    26. field(SCAN, "Passive")
    27. field(N, "9")
    28. field(NSAM, "1")
    29. field(ALG, "N to 1 Average")
    30. field(INP, "$(USER):arrayIn")
    31. }
    32. record(longin, "$(USER):longin")
    33. {
    34. field(SCAN, "Passive")
    35. field(DTYP, "Soft Channel")
    36. field(INP, "0")
    37. field(FLNK, "$(USER):CompressS3to1.PROC")
    38. }
    39. record(compress, "$(USER):CompressS3to1")
    40. {
    41. field(SCAN, "Passive")
    42. field(N, "3")
    43. field(ALG, "N to 1 Average")
    44. field(INP, "$(USER):longin")
    45. }
    46. record(waveform, "$(USER):arrayIn2")
    47. {
    48. field(SCAN, "Passive")
    49. field(DTYP, "Soft Channel")
    50. field(NELM, "5")
    51. field(FTVL, "LONG")
    52. field(FLNK, "$(USER):CompressAverage.PROC")
    53. }
    54. record(compress, "$(USER):CompressAverage")
    55. {
    56. field(SCAN, "Passive")
    57. field(NSAM, "5")
    58. field(N, 3)
    59. field(ALG, "Average")
    60. field(INP, "$(USER):arrayIn2")
    61. }
    62. record(waveform, "$(USER):arrayIn3")
    63. {
    64. field(SCAN, "Passive")
    65. field(DTYP, "Soft Channel")
    66. field(NELM, "3")
    67. field(FTVL, "LONG")
    68. field(FLNK, "$(USER):CompressACircBuff.PROC")
    69. }
    70. record(compress, "$(USER):CompressACircBuff")
    71. {
    72. field(SCAN, "Passive")
    73. field(NSAM, "8")
    74. field(ALG, "Circular Buffer")
    75. field(INP, "$(USER):arrayIn3")
    76. }
    77. record(longin, "$(USER):longin2")
    78. {
    79. field(SCAN, "Passive")
    80. field(DTYP, "Soft Channel")
    81. field(INP, "0")
    82. field(FLNK, "$(USER):CompressSCirBuff.PROC")
    83. }
    84. record(compress, "$(USER):CompressSCirBuff")
    85. {
    86. field(SCAN, "Passive")
    87. field(NSAM, "4")
    88. field(ALG, "Circular Buffer")
    89. field(INP, "$(USER):longin2")
    90. }

    将上述数据库实例文件加载到IOC中,查看记录实例:

    1. epics> dbl
    2. blctrl:arrayIn
    3. blctrl:arrayIn2
    4. blctrl:arrayIn3
    5. blctrl:CompressA3to1
    6. blctrl:CompressAAto1
    7. blctrl:CompressS3to1
    8. blctrl:CompressAverage
    9. blctrl:CompressACircBuff
    10. blctrl:CompressSCirBuff
    11. blctrl:fanout
    12. blctrl:longin
    13. blctrl:longin2

    另开一个命令终端,用通道访问命令对以上不同算法的compress记录进行测试:

    1) compress记录输入是数组,算法为N to 1 Average

    1. [blctrl@main-machine ~]$ caput -a blctrl:arrayIn 9 1 2 3 4 5 6 7 8 9
    2. Old : blctrl:arrayIn 9 1 2 3 4 5 6 7 9 0
    3. New : blctrl:arrayIn 9 1 2 3 4 5 6 7 8 9
    4. [blctrl@main-machine ~]$ caget blctrl:CompressA3to1
    5. blctrl:CompressA3to1 3 2 5 8
    6. [blctrl@main-machine ~]$ caget blctrl:CompressAAto1
    7. blctrl:CompressAAto1 5

    2) compress记录输入是标量,算法为N to 1 Average

    1. [blctrl@main-machine ~]$ caput blctrl:longin 11
    2. Old : blctrl:longin 0
    3. New : blctrl:longin 11
    4. [blctrl@main-machine ~]$ caget blctrl:CompressS3to1
    5. blctrl:CompressS3to1 2.50321e-308
    6. [blctrl@main-machine ~]$ caput blctrl:longin 12
    7. Old : blctrl:longin 11
    8. New : blctrl:longin 12
    9. [blctrl@main-machine ~]$ caget blctrl:CompressS3to1
    10. blctrl:CompressS3to1 2.50321e-308
    11. [blctrl@main-machine ~]$ caput blctrl:longin 13
    12. Old : blctrl:longin 12
    13. New : blctrl:longin 13
    14. [blctrl@main-machine ~]$ caget blctrl:CompressS3to1
    15. blctrl:CompressS3to1 12

    3) compress记录输入是标量,算法为Average

    1. [blctrl@main-machine ~]$ caput -a blctrl:arrayIn2 5 21 22 23 24 25
    2. Old : blctrl:arrayIn2 5 3 0 0 0 0
    3. New : blctrl:arrayIn2 5 21 22 23 24 25
    4. [blctrl@main-machine ~]$ caget blctrl:CompressAverage
    5. blctrl:CompressAverage 5 2.50321e-308 0 0 0 0
    6. [blctrl@main-machine ~]$ caput -a blctrl:arrayIn2 5 21 22 23 24 25
    7. Old : blctrl:arrayIn2 5 21 22 23 24 25
    8. New : blctrl:arrayIn2 5 21 22 23 24 25
    9. [blctrl@main-machine ~]$ caget blctrl:CompressAverage
    10. blctrl:CompressAverage 5 2.50321e-308 0 0 0 0
    11. [blctrl@main-machine ~]$ caput -a blctrl:arrayIn2 5 21 22 23 24 25
    12. Old : blctrl:arrayIn2 5 21 22 23 24 25
    13. New : blctrl:arrayIn2 5 21 22 23 24 25
    14. [blctrl@main-machine ~]$ caget blctrl:CompressAverage
    15. blctrl:CompressAverage 5 21 22 23 24 25

    4) compress记录输入是数组,算法为Circular Buffer

    1. [blctrl@main-machine ~]$ caput -a blctrl:arrayIn3 3 31 32 33
    2. Old : blctrl:arrayIn3 3 3 0 0
    3. New : blctrl:arrayIn3 3 31 32 33
    4. [blctrl@main-machine ~]$ caget blctrl:CompressACircBuff
    5. blctrl:CompressACircBuff 8 31 32 33 0 0 0 0 0
    6. [blctrl@main-machine ~]$ caput -a blctrl:arrayIn3 3 34 34 36
    7. Old : blctrl:arrayIn3 3 31 32 33
    8. New : blctrl:arrayIn3 3 34 34 36
    9. [blctrl@main-machine ~]$ caget blctrl:CompressACircBuff
    10. blctrl:CompressACircBuff 8 31 32 33 34 34 36 0 0
    11. [blctrl@main-machine ~]$ caput -a blctrl:arrayIn3 3 37 38 39
    12. Old : blctrl:arrayIn3 3 34 34 36
    13. New : blctrl:arrayIn3 3 37 38 39
    14. [blctrl@main-machine ~]$ caget blctrl:CompressACircBuff
    15. blctrl:CompressACircBuff 8 32 33 34 34 36 37 38 39

    5) compress记录的输入是标量,算法为Circular Bufer

    1. [blctrl@main-machine ~]$ caput blctrl:longin2 101
    2. Old : blctrl:longin2 0
    3. New : blctrl:longin2 101
    4. [blctrl@main-machine ~]$ caget blctrl:CompressSCirBuff
    5. blctrl:CompressSCirBuff 4 101 0 0 0
    6. [blctrl@main-machine ~]$ caput blctrl:longin2 102
    7. Old : blctrl:longin2 101
    8. New : blctrl:longin2 102
    9. [blctrl@main-machine ~]$ caget blctrl:CompressSCirBuff
    10. blctrl:CompressSCirBuff 4 101 102 0 0
    11. [blctrl@main-machine ~]$ caput blctrl:longin2 103
    12. Old : blctrl:longin2 102
    13. New : blctrl:longin2 103
    14. [blctrl@main-machine ~]$ caget blctrl:CompressSCirBuff
    15. blctrl:CompressSCirBuff 4 101 102 103 0
    16. [blctrl@main-machine ~]$ caput blctrl:longin2 104
    17. Old : blctrl:longin2 103
    18. New : blctrl:longin2 104
    19. [blctrl@main-machine ~]$ caget blctrl:CompressSCirBuff
    20. blctrl:CompressSCirBuff 4 101 102 103 104
  • 相关阅读:
    *团和*滴2022秋招笔试知识点总结(超详细)
    Linux 特殊文件权限
    Java入门指南
    如何使用Scrapy提取和处理数据
    Linux内核分析(十八)--内存管理之虚拟地址与物理内存分配机制
    C# 简单封装异步Socket Server
    【杂记-浅谈OSPF协议中的Router ID】
    Redis-实战篇-实现商铺缓存与数据库的双写一致(超时剔除和主动更新)
    python二次开发CATIA:根据已知数据点创建曲线
    搜索技术【广度优先搜索】 - 优先队列式广度优先搜索
  • 原文地址:https://blog.csdn.net/yuyuyuliang00/article/details/127411216