3. 传感器故障分析:失效模式与自检方法

传感器这东西,说白了就是仪器的「眼睛」和「耳朵」。我在现场摸爬滚打这么多年,见过太多因为传感器出问题导致整个系统瘫痪的案例。今天咱们就聊聊传感器的失效模式,以及怎么用程序去发现它们。

3.1 传感器失效的三种典型模式

我个人习惯把传感器失效分成三类:漂移、偏差、完全失效。这三种情况在项目中我都遇到过,处理方式也完全不同。

3.1.1 漂移(Drift)

漂移是最隐蔽的故障。传感器输出缓慢变化,你很难一眼看出来。比如一个pH电极,用了半年后零点慢慢从7.00漂到了7.15。嗯,这就是典型的漂移。

漂移的特征:

  • 输出值随时间缓慢变化
  • 变化方向通常一致(要么偏高,要么偏低)
  • 短期波动小,长期累积明显

我在化工厂遇到过一台气相色谱仪,FID检测器的基线每天漂移0.5mV。操作员觉得「还行吧」,结果一个月后定量误差超过了15%。所以我现在做项目,一定会给漂移设一个阈值。

3.1.2 偏差(Bias)

偏差是传感器输出与真实值之间存在固定差值。说白了就是「不准了」,但数值还算稳定。

举个例子:一个压力变送器,量程0-10MPa,实际压力5MPa时它显示5.3MPa。这个0.3MPa的差值就是偏差。为什么会这样?可能是传感器老化、安装应力、或者温度补偿没做好。

偏差类型典型原因我遇到过的案例
零点偏差传感器零位偏移某红外CO2传感器,零点从0ppm漂到120ppm
增益偏差灵敏度变化热电偶冷端补偿失效,温度整体偏高2℃
非线性偏差传感器特性曲线变形某超声波液位计,中间量程误差大,两端正常

3.1.3 完全失效

这个最好判断——传感器要么没输出,要么输出直接「飞了」。比如输出卡死在最大值、最小值,或者干脆开路/短路。

注意:完全失效虽然容易发现,但后果往往最严重。我曾经遇到一个反应釜的温度传感器突然输出0mV(热电偶断了),结果加热系统还在全功率运行...嗯,那次事故让我学会了「失效安全」设计。

3.2 传感器自检方法

知道了失效模式,接下来就是怎么检测它们。我常用的方法有两种:激励响应法和冗余比较法。

3.2.1 激励响应法

这个方法的核心思路是:给传感器一个已知的激励,看它的响应对不对。就像你按门铃,听到「叮咚」就知道门铃没坏。

具体怎么做?我一般分三步:

  1. 施加激励:通过电路或程序给传感器一个标准信号
  2. 采集响应:读取传感器的输出值
  3. 比较判断:将响应值与预期值对比,误差在允许范围内就算通过

举个实际例子——热电阻(PT100)的自检:

def pt100_self_test():
    """
    PT100传感器自检程序
    通过注入标准电流,测量电压降来判断传感器状态
    """
    # 注入1mA标准电流
    set_excitation_current(1.0)  # 单位mA
    
    # 等待稳定(我习惯等100ms)
    delay_ms(100)
    
    # 读取电压
    voltage = read_voltage()  # 单位mV
    
    # 理论值:PT100在0℃时电阻100Ω,1mA下电压100mV
    expected_voltage = 100.0  # mV
    tolerance = 2.0  # 允许±2mV误差
    
    if abs(voltage - expected_voltage) < tolerance:
        return "PASS"
    elif voltage < 10.0:
        return "FAIL: 开路"
    elif voltage > 500.0:
        return "FAIL: 短路"
    else:
        return f"FAIL: 偏差 {voltage - expected_voltage:.1f}mV"

我的经验:激励响应法最适合检测完全失效和严重偏差。对于缓慢漂移,需要配合历史数据趋势分析。我一般会在自检程序里加一个「漂移累计计数器」,连续3次自检偏差都朝一个方向,就报警提示校准。

3.2.2 冗余比较法

这个方法更直接——用两个或三个传感器测同一个物理量,然后比较它们的输出。你想想看,如果三个传感器里两个读数接近,第三个差很多,那大概率是第三个坏了。

冗余比较法在工业现场很常见,尤其是关键参数(比如反应器温度、压力)。我常用的判断逻辑:

冗余配置判断逻辑适用场景
二取一(1oo2)两个传感器偏差超过阈值,触发报警一般监控
三取二(2oo3)三个传感器中两个一致,取平均值;不一致则投票安全联锁
三取中(Median)取三个传感器读数的中位数高精度测量

我给大家看一段实际项目中的代码——三取中值滤波加故障判断:

def redundant_sensor_check(s1, s2, s3, threshold=5.0):
    """
    三冗余传感器自检
    s1, s2, s3: 三个传感器的当前读数
    threshold: 允许的最大偏差
    """
    values = [s1, s2, s3]
    
    # 计算两两之间的偏差
    d12 = abs(s1 - s2)
    d13 = abs(s1 - s3)
    d23 = abs(s2 - s3)
    
    # 判断哪个传感器可能故障
    if d12 < threshold and d13 < threshold and d23 < threshold:
        # 三个都正常,取中位数
        values.sort()
        return values[1], "ALL_OK"
    
    elif d12 < threshold and d13 > threshold and d23 > threshold:
        # s1和s2一致,s3异常
        return (s1 + s2) / 2, "S3_FAULT"
    
    elif d12 > threshold and d13 < threshold and d23 > threshold:
        # s1和s3一致,s2异常
        return (s1 + s3) / 2, "S2_FAULT"
    
    elif d12 > threshold and d13 > threshold and d23 < threshold:
        # s2和s3一致,s1异常
        return (s2 + s3) / 2, "S1_FAULT"
    
    else:
        # 三个都不一致,可能系统级故障
        return None, "SYSTEM_FAULT"

避坑指南:我曾经在一个项目里用了冗余比较法,结果三个传感器同时漂移了——因为它们都是同一批次、同一安装位置。从那以后,我要求冗余传感器的安装位置必须错开,而且最好用不同原理的传感器(比如一个热电偶、一个热电阻)。

3.3 自检策略的选择建议

说了这么多,到底该用哪种方法?我个人建议:

  • 关键安全参数:冗余比较法 + 激励响应法双重保险
  • 一般过程参数:激励响应法为主,定期手动比对
  • 难以施加激励的传感器(比如振动传感器):冗余比较法或者历史趋势分析

嗯,传感器自检这件事,说白了就是「防患于未然」。我在现场见过太多因为传感器故障导致的生产事故,有些甚至造成了人员伤害。所以,别嫌麻烦,该做的自检一定要做。

下一章咱们聊聊执行器的故障诊断,那又是另一番天地了。