数据压缩记录用于从数组采集并且压缩数据。当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指向一个数组,则以下应用: 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例程使用。 为所有必需的数组配置空间。地址被存储在这个记录的合适字段中。 当设置RSET,ALG或N时,调用这个例程。它执行一个重置。 这被dbNameToAddr调用。它使得dbAddr结构体指向保存这个结果的实际缓存。 从由VAL索引的环形缓存获取值。 写值到由VAL索引的环形缓存中。 获取PREC。 为一个字段设置上显示和下显示限制。如果这个字段是VAL,这些限制被设置成HOPR和LOPR,否则如果这个字段有已经定义好的上和下限制,将使用它们,否则将使用对应这个字段类型的上和下最值。 为一个字段设置上控制和下控制限制。如果这个字段是VAL,这些限制被设置成了HOPR和LOPR,否则如果这个字段有已经定义好的上和下限制,将使用它们,否则将使用对应这个字段类型的上和下最值。 1) 如果INP不是数据库链接,检查monitors和forward链接并且返回。 2) 获取由INP引用的当前数据。 3) 执行合适的算法: 4) 如果成功,设置UDF为FALSE。 5) 检查是否调用monitors。 6) 如果需要,扫描forward链接,设置PACT为FALSE,并且返回。 数据库实例文件如下,由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时的结果。 将上述数据库实例文件加载到IOC中,查看记录实例: 另开一个命令终端,用通道访问命令对以上不同算法的compress记录进行测试: 1) compress记录输入是数组,算法为N to 1 Average 2) compress记录输入是标量,算法为N to 1 Average 3) compress记录输入是标量,算法为Average 4) compress记录输入是数组,算法为Circular Buffer 5) compress记录的输入是标量,算法为Circular Bufer

用于操作显示的参数

用于警报的参数
运行时参数

记录支持
记录支持例程
long init_record(struct dbCommon *precord, int pass)long process(struct dbCommon *precord) long special(struct dbAddr *paddr, int after) long cvt_dbaddr(struct dbAddr *paddr) long get_array_info(struct dbAddr *paddr, long *no_elements, long *offset)long put_array_info(struct dbAddr *paddr, long nNew); long get_units(struct dbAddr *paddr, char *units); long get_graphic_double(struct dbAddr *paddr, struct dbr_grDouble *p);long get_control_double(struct dbAddr *paddr, struct dbr_ctrlDouble *p);记录运行
compress记录使用示例: