标签:#SpringBoot #工控告警 #告警引擎 #SCADA #轨道交通ISCS

摘要:本文实现工业级实时告警引擎,支持数值越限告警、数值突变跳变告警,采用内存规则校验,高性能、无阻塞,可直接用于地铁 ISCS、工厂 SCADA、能耗监测系统,附带完整可运行源码。

一、前言

在工业监控与轨道交通综合监控系统中,告警是保障设备安全、运维响应的核心功能。无论是设备超限、数据异常波动,都需要系统实时识别、记录并推送。

本文专注实现一套轻量、高效、可直接上线的内存告警引擎。

二、告警类型

1. 越限告警

点位数值超过上限或低于下限,立即触发告警。

2. 突变告警

短时间内数值剧烈波动,判定设备异常或信号抖动。

三、告警规则实体类

import lombok.Data;

@Data
public class AlarmRule {
    // 点位 ID
    private String pointId;
    // 设备 ID
    private String deviceId;
    // 告警类型 1越限 2突变
    private Integer alarmType;
    // 上限值
    private Double maxValue;
    // 下限值
    private Double minValue;
    // 突变阈值
    private Double changeThreshold;
    // 点位名称
    private String pointName;
    // 子系统类型
    private String systemType;
}

四、采集数据统一格式

import lombok.Data;

@Data
public class CollectDataDTO {
    private String pointId;
    private String deviceId;
    private Double value;
    private Long ts;
    private String systemType;
}

五、核心告警引擎(完整版)

import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class AlarmEngine {

    private final Map<String, Double> lastValueCache = new ConcurrentHashMap<>();

    public boolean check(CollectDataDTO data, AlarmRule rule) {
        if (data == null || rule == null || data.getValue() == null) {
            return false;
        }

        double current = data.getValue();
        boolean overLimit = checkOverLimit(current, rule);
        boolean valueChange = checkValueChange(data.getPointId(), current, rule);

        lastValueCache.put(data.getPointId(), current);
        return overLimit || valueChange;
    }

    private boolean checkOverLimit(double val, AlarmRule rule) {
        return val > rule.getMaxValue() || val < rule.getMinValue();
    }

    private boolean checkValueChange(String pointId, double curr, AlarmRule rule) {
        Double last = lastValueCache.get(pointId);
        if (last == null) {
            return false;
        }
        double diff = Math.abs(curr - last);
        return diff > rule.getChangeThreshold();
    }
}

六、告警历史存储表(TDengine)

CREATE STABLE IF NOT EXISTS alarm_history (
    ts TIMESTAMP,
    point_value DOUBLE,
    content VARCHAR(256),
    alarm_type TINYINT,
    status TINYINT
) TAGS (
    device_id BINARY(32),
    point_id BINARY(64),
    system_type BINARY(32)
);

七、业务调用示例

// 1. 获取采集数据
CollectDataDTO data = collectService.getRealTimeData();

// 2. 获取告警规则
AlarmRule rule = ruleService.getRuleByPointId(data.getPointId());

// 3. 执行告警判断
boolean alarm = alarmEngine.check(data, rule);

if (alarm) {
    // 告警入库
    tdEngineService.insertAlarm(data, rule);
    // 推送大屏
    websocketService.push(data);
}

八、现场常见问题

设备信号波动导致频繁误告警
百万级点位内存占用高
告警重复刷屏

下一篇将实现:告警防抖、延时滤波、告警合并。

九、总结

本文实现了工业/轨交项目最核心的实时告警能力,代码简洁、高性能、可直接集成到现有项目。支持越限、突变两类最常用告警,满足 SCADA/ISCS 系统基础告警需求。

关注我,下一篇带来工控告警防抖实战,彻底解决误告警问题!

更多推荐