3. 报警优先级分布审计与偏差识别

审计对象与判定基准

报警优先级分布审计的核心不是“数一数各优先级有多少条”,而是判断优先级结构是否与风险结构匹配。ISA 18.2 给出的参考分布是:紧急(P1)约 5%、高(P2)约 15%、低/提示(P3)约 80%。这个比例是设计目标而非硬性验收线,审计时应把它作为“偏差方向”的参照,重点识别两类问题:

  • 高优先级泛滥:P1+P2 合计显著超过 20%,通常意味着大量报警被“就高不就低”地配置,操作员对高优先级产生钝化。
  • 低优先级缺失:P3 占比过低、P1/P2 挤占空间,说明分级粒度不足,缺少“提示类”报警的缓冲层。

海洋平台的特殊性在于系统间风险差异极大:工艺系统(分离器、压缩机、外输泵)报警量大但多数属可延迟处理;火气(F&G)与安全仪表(ESD)报警量小但单条权重高。因此审计必须按系统分组统计,再与全平台总体分布对照,否则总量比例会被工艺系统的大基数稀释,掩盖 F&G 系统的分级异常。

统计口径与数据准备

审计输入沿用标准化报警数据集,至少需要四个字段:system(所属系统)、priority(优先级,统一映射为 P1/P2/P3)、tag(位号)、event_time(事件时间)。统计前需固定三条口径,避免不同人算出不同结果:

  1. 按报警事件计数,而非按位号计数——同一高位号反复触发会放大其权重,这正是泛滥的真实表现。
  2. 优先级缺失值单列:priority 为空或为“未定义”的记录不并入 P3,单独作为“未分级”统计,它本身就是审计发现。
  3. 统计窗口一致:所有系统使用同一时间窗(如连续 30 天),窗口内无报警的系统标注为“无数据”,不与“零报警”混淆。

分布计算与偏差量化

对每个系统计算三个量:各优先级事件数、各优先级占比、与 ISA 18.2 参考值的偏差。偏差用百分点(pp)表示,便于跨系统比较。下面是一段可直接运行的统计脚本,输入为 CSV,输出按系统分组的分布表与偏差标记。

import pandas as pd

# 参考比例(ISA 18.2 建议)
REF = {"P1": 0.05, "P2": 0.15, "P3": 0.80}
# 偏差判定阈值(百分点)
HIGH_FLOOD_PP = 10.0   # P1+P2 超出参考合计 20% 的容忍度
LOW_MISSING_PP = 15.0  # P3 低于参考 80% 的容忍度

df = pd.read_csv("alarm_std.csv", parse_dates=["event_time"])
df["priority"] = df["priority"].fillna("未分级").str.upper().str.strip()

# 按系统 × 优先级计数
cnt = (df.groupby(["system", "priority"]).size()
         .unstack(fill_value=0))
for p in ["P1", "P2", "P3", "未分级"]:
    if p not in cnt.columns:
        cnt[p] = 0

cnt["总事件"] = cnt[["P1", "P2", "P3", "未分级"]].sum(axis=1)
cnt = cnt[cnt["总事件"] > 0]

# 占比(%)
for p in ["P1", "P2", "P3", "未分级"]:
    cnt[f"{p}占比"] = (cnt[p] / cnt["总事件"] * 100).round(1)

cnt["高优先级合计占比"] = (cnt["P1占比"] + cnt["P2占比"]).round(1)
cnt["高优先级偏差pp"] = (cnt["高优先级合计占比"] - 20.0).round(1)
cnt["P3偏差pp"] = (cnt["P3占比"] - 80.0).round(1)

# 偏差标记
def flag(row):
    tags = []
    if row["高优先级偏差pp"] >= HIGH_FLOOD_PP:
        tags.append("高优先级泛滥")
    if row["P3偏差pp"] <= -LOW_MISSING_PP:
        tags.append("低优先级缺失")
    if row["未分级"] > 0:
        tags.append("存在未分级")
    return ";".join(tags) if tags else "基本符合"

cnt["审计结论"] = cnt.apply(flag, axis=1)
print(cnt[["总事件", "P1占比", "P2占比", "P3占比",
           "高优先级偏差pp", "P3偏差pp", "审计结论"]]
      .sort_values("高优先级偏差pp", ascending=False))

脚本输出的是“系统级”结论。实际审计中还需要一步下钻:对标记为“高优先级泛滥”的系统,按位号统计 P1/P2 事件数排名,找出贡献最大的前若干位号。这些位号往往集中在少数几个测点(如液位高高、压力高高),是后续降级或抑制的直接对象。

偏差阈值不是标准答案。平台报警总量大、工况波动剧烈时,可适当放宽高优先级容忍度;但“未分级”记录应始终作为独立问题处理,因为它意味着分级工作尚未完成,任何比例结论都不可靠。

分布结构与偏差识别

下图把审计逻辑压缩为一张结构图:左侧是各系统的事件基数,中间是分级占比与参考带的对照,右侧是偏差判定与下钻方向。注意 F&G 系统事件量小但 P1 占比高,属于“合理的高优先级集中”,不应与工艺系统的泛滥混为一谈——这正是按系统分组审计的价值。

按系统分组的优先级分布审计 参考基准:P1≈5% · P2≈15% · P3≈80%(ISA 18.2) 系统事件基数 工艺系统 事件量大 · 位号多 火气 F&G 事件量小 · 单条权重高 安全 ESD 联锁相关 · 分级严格 公用工程 辅助系统 · 提示类多 分级占比 vs 参考带 参考结构 P1 5% P2 15% P3 80% 工艺系统(示例) P1 20% P2 35% P3 45% 火气 F&G(示例) P1 15% P2 20% P3 65% 公用工程(示例):P3 占比偏高,提示类为主 偏差判定与下钻 高优先级泛滥 P1+P2 超出 20% 达 10pp 以上 → 按位号下钻,定位贡献前 N 位号 低优先级缺失 P3 低于 80% 达 15pp 以上 → 检查分级粒度与提示类配置 未分级记录 priority 为空或未定义 → 单列统计,先补分级再谈比例 基本符合 偏差在容忍带内,纳入常规复查 判读要点 ① 比例必须按系统分组看,总量比例会被工艺系统大基数稀释;② F&G 的 P1 集中属合理,工艺系统的 P1/P2 膨胀才是治理重点; ③ 未分级记录优先处理,否则任何比例结论都不可靠;④ 偏差标记只是入口,最终要落到具体位号与降级/抑制动作。

审计结果判读与下钻

拿到分布表后,按以下顺序判读,避免被总量数字误导:

  1. 先看未分级:任一系统存在未分级记录,先补分级,该系统的比例结论暂缓使用。
  2. 再看高优先级偏差:按“高优先级偏差pp”降序排列,排在前面的系统即为高优先级泛滥候选。对每个候选系统,按位号统计 P1/P2 事件数,取累计占比达到该系统高优先级事件 50% 的位号集合,作为降级审查清单。
  3. 最后看低优先级缺失:P3 占比明显偏低的系统,检查是否存在“所有报警都至少设为 P2”的配置习惯,或提示类报警被整体关闭。

需要强调的是,偏差识别只回答“哪里可能有问题”,不直接给出“应该改成什么级别”。降级动作必须结合该位号的工艺后果、联锁关系和操作规程逐条确认,这部分工作属于后续的报警合理化审查,不在本次审计范围内。

不要用全平台总量比例直接下结论。示例中工艺系统 P1+P2 合计可达 55%,但若其事件量占全平台 90%,总量比例会被拉高到接近 50%,看起来“全平台泛滥”,实际 F&G 与 ESD 的分级可能是健康的。分组审计是识别真实偏差的前提。

可复用的审计输出表

审计结论应落成一张可直接交给仪表与工艺专业复核的表,字段如下(示例数据为教学假设,非实测):

系统总事件P1占比P2占比P3占比高优先级偏差(pp)P3偏差(pp)审计结论下钻重点
工艺系统1240020.0%35.0%45.0%+35.0-35.0高优先级泛滥;低优先级缺失液位高高、压力高高类位号
火气 F&G86015.0%20.0%65.0%+15.0-15.0高优先级集中(需结合后果确认)探测器故障类报警
安全 ESD3106.0%16.0%78.0%+2.0-2.0基本符合—
公用工程52003.0%12.0%85.0%-5.0+5.0基本符合—

表中“下钻重点”一列是审计与后续治理的衔接点:它把系统级偏差转化为可核查的位号范围,使降级或抑制工作有明确起点,而不是在全平台范围内盲目筛查。