纯技术 · 数据处理

历史数据压缩怎么做?死区压缩、旋转门SDT算法原理与压缩偏差取值实战

2026-10-08  //  上位机软件纯技术文章
首页 / 行业资讯 / 技术文章

做上位机历史趋势,迟早遇到这个矛盾:曲线数据想长期保存,可一秒一个点、几十上百个测点,一年下来数据量大得查不动。全量存当然最精确,但成本高且大部分点是冗余的。这篇讲工业上最经典的两类趋势压缩方法——死区压缩和旋转门算法(SDT),原理、参数和误差一次讲清。

趋势数据为什么能压缩

先看一组真实感受:温度、压力、液位这类缓变模拟量,连续相邻的采样值往往只差零点几,把每个原始点都存下来,曲线视觉上和抽稀后几乎没有区别。真正需要完整保留的是变化段——设备升温、阀门动作、故障发生时,数据变化快,每个点都有意义。

所以好的压缩不是均匀隔几个点丢一个,而是"平的地方多丢、变的地方多留",按变化率自适应。死区压缩和旋转门都是这个思路,区别只在判断规则和压缩率。

先搞懂最简单的死区压缩

死区压缩(也叫例外报告 Exception Reporting)规则一句话:以最近一次发送/保存的值为基准,新值和它的差值绝对值不超过死区 V 就不保存,一旦超过就保存这个新值,并把基准更新为它。再配合最大最小间隔:即使一直没变化,超过最大间隔也强制存一个点,保证断档不会无限长;变化再快,两次保存也不小于最小间隔,防止抖动期刷爆数据。

死区法实现最简单、无状态好理解,缺点是对"缓慢但持续"的单向漂移不友好——只要每步变化都不超过死区,它就一直不存点,还原时趋势线是平的,累积偏差可能很大。旋转门算法就是为解决这个问题设计的。

旋转门 SDT 到底怎么"转"

旋转门(Swinging Door Trending)的名字很形象:把数据序列想成时间轴上的点,从一个已保存点出发,上下各有一扇"门",门宽对应压缩偏差 E。逐点看时,两扇门随着新数据不断调整角度,只要两扇门还能保持"门不交叉"(上门斜率始终不小于下门斜率),就认为这段趋势可以用一条直线近似,继续往里加点;一旦门要交叉了,就把交叉前的最后一个点保存下来,再以它为起点重新开门。

用更工程化的语言描述,算法实际维护的是两条边界斜率:从起点到当前各点连线的最大斜率和最小斜率,新点进来更新这两个极值;保存的不是起点,而是触发结束那个区间的关键转折点附近的值。不同实现(是否带起始/结束偏移、取哪个点落盘)细节略有差别,但"两条发散边界夹住一条线性趋势"的核心不变。

对比死区法就能看出它的优势:缓慢线性漂移时,边界斜率持续发散,最终一定会触发保存,累积偏差被限制在 E 附近,不会出现长期平台段。

压缩偏差 E 怎么取值

E 是唯一核心参数,直接决定压缩率和精度。取法不能拍脑袋,正确姿势是结合测点的工程意义:

务必带上超时保存(比如最长 10 分钟一个点),长时间真正平稳时也能证明"这段时间确实没数据变化",而不是数据丢了让人猜。

压缩后怎么还原,误差怎么评估

压缩后相邻保存点之间用直线连接还原,原始数据偏离这条直线的幅度被算法保证不超过 E(上下各一个偏差,总带宽约 2E),这是可验证的数学性质,不是"感觉差不多"。

上线前建议拿现场真实数据做一次离线评估:同一段原始数据,分别用不同 E 跑压缩,统计三个数——压缩率(原始点数比保存点数)、最大绝对误差、平均绝对误差。压缩十几倍而最大误差不超过工艺容忍值,参数就能定下来。别拿实验室方波数据评估,真实工艺数据的曲线形态才作数。

工程落地的几个要点

一句话建议:先在一条数据线上用真实数据试参数,压缩率和误差都达标再推广,千万别全站一个 E 用到底。需要压缩算法的参考实现或离线评估脚本,可以找赢式科技索取,电话 15001875806、邮箱 ys_soft@163.com。