SpringBoot工控告警引擎实战:越限、突变告警实现
·
标签:#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 系统基础告警需求。
关注我,下一篇带来工控告警防抖实战,彻底解决误告警问题!
更多推荐

所有评论(0)