做上位机历史趋势,迟早遇到这个矛盾:曲线数据想长期保存,可一秒一个点、几十上百个测点,一年下来数据量大得查不动。全量存当然最精确,但成本高且大部分点是冗余的。这篇讲工业上最经典的两类趋势压缩方法——死区压缩和旋转门算法(SDT),原理、参数和误差一次讲清。
趋势数据为什么能压缩
先看一组真实感受:温度、压力、液位这类缓变模拟量,连续相邻的采样值往往只差零点几,把每个原始点都存下来,曲线视觉上和抽稀后几乎没有区别。真正需要完整保留的是变化段——设备升温、阀门动作、故障发生时,数据变化快,每个点都有意义。
所以好的压缩不是均匀隔几个点丢一个,而是"平的地方多丢、变的地方多留",按变化率自适应。死区压缩和旋转门都是这个思路,区别只在判断规则和压缩率。
先搞懂最简单的死区压缩
死区压缩(也叫例外报告 Exception Reporting)规则一句话:以最近一次发送/保存的值为基准,新值和它的差值绝对值不超过死区 V 就不保存,一旦超过就保存这个新值,并把基准更新为它。再配合最大最小间隔:即使一直没变化,超过最大间隔也强制存一个点,保证断档不会无限长;变化再快,两次保存也不小于最小间隔,防止抖动期刷爆数据。
死区法实现最简单、无状态好理解,缺点是对"缓慢但持续"的单向漂移不友好——只要每步变化都不超过死区,它就一直不存点,还原时趋势线是平的,累积偏差可能很大。旋转门算法就是为解决这个问题设计的。
旋转门 SDT 到底怎么"转"
旋转门(Swinging Door Trending)的名字很形象:把数据序列想成时间轴上的点,从一个已保存点出发,上下各有一扇"门",门宽对应压缩偏差 E。逐点看时,两扇门随着新数据不断调整角度,只要两扇门还能保持"门不交叉"(上门斜率始终不小于下门斜率),就认为这段趋势可以用一条直线近似,继续往里加点;一旦门要交叉了,就把交叉前的最后一个点保存下来,再以它为起点重新开门。
用更工程化的语言描述,算法实际维护的是两条边界斜率:从起点到当前各点连线的最大斜率和最小斜率,新点进来更新这两个极值;保存的不是起点,而是触发结束那个区间的关键转折点附近的值。不同实现(是否带起始/结束偏移、取哪个点落盘)细节略有差别,但"两条发散边界夹住一条线性趋势"的核心不变。
对比死区法就能看出它的优势:缓慢线性漂移时,边界斜率持续发散,最终一定会触发保存,累积偏差被限制在 E 附近,不会出现长期平台段。
压缩偏差 E 怎么取值
E 是唯一核心参数,直接决定压缩率和精度。取法不能拍脑袋,正确姿势是结合测点的工程意义:
- 按显示精度取:操作员看曲线能分辨的最小变化,比如温度显示到 0.1℃,E 取 0.1~0.2℃,再小的误差肉眼也看不出;
- 按工艺允许误差取:控制和考核关心的精度,比如压力允许 0.5% 的偏差,E 就不能超过它;
- 按量程百分比取:传感器本身误差量程的 0.2%~0.5%,E 设得比传感器误差还小毫无意义,存的是噪声;
- 不同测点分级配置:关键质量点 E 小甚至不压缩,普通监视点 E 放大,压缩率能差好几倍。
务必带上超时保存(比如最长 10 分钟一个点),长时间真正平稳时也能证明"这段时间确实没数据变化",而不是数据丢了让人猜。
压缩后怎么还原,误差怎么评估
压缩后相邻保存点之间用直线连接还原,原始数据偏离这条直线的幅度被算法保证不超过 E(上下各一个偏差,总带宽约 2E),这是可验证的数学性质,不是"感觉差不多"。
上线前建议拿现场真实数据做一次离线评估:同一段原始数据,分别用不同 E 跑压缩,统计三个数——压缩率(原始点数比保存点数)、最大绝对误差、平均绝对误差。压缩十几倍而最大误差不超过工艺容忍值,参数就能定下来。别拿实验室方波数据评估,真实工艺数据的曲线形态才作数。
工程落地的几个要点
- 压缩在采集网关或存储服务上做,每测点维护少量状态即可,计算量极小;但要保证压缩是逐点在线进行的,不能事后批量算(事后压缩可以做归档,实时链路必须在线);
- 报警、状态切换、启停事件点强制保存为转折点,事件前后的曲线必须完整,不能被算法省掉;
- 压缩数据和原始数据可以分层:近期(如一个月)保留全量方便精细分析,远期归档用压缩数据,兼顾成本和追溯;
- 点表中给每个测点记录压缩方法和 E,参数可配置,工艺调整后跟着改。
一句话建议:先在一条数据线上用真实数据试参数,压缩率和误差都达标再推广,千万别全站一个 E 用到底。需要压缩算法的参考实现或离线评估脚本,可以找赢式科技索取,电话 15001875806、邮箱 ys_soft@163.com。
