4. 报警触发逻辑与分级判定编程
报警触发逻辑是环保PLC程序中最容易被“写简单”的部分:很多现场只做一条“测量值 > 限值就置位报警”的比较指令,结果导致瞬时尖峰频繁误报、缓慢恶化迟迟不报、同一异常在不同工段重复刷屏。要让报警真正可用,触发条件必须由阈值、变化率、持续时间三类判据组合构成,分级判定则要在此基础上叠加超标倍数与影响范围两个维度。本节以某污水处理厂进水pH与COD在线监测回路为例,给出可直接移植到梯形图或结构化文本(ST)中的实现方法。
一、三类触发判据的工程含义
阈值判据回答“是否越界”,是最基础的判据,但必须区分高限、高高限与低限,并设置回差(死区)。例如pH正常区间6.5~8.5,高限报警设为8.8、回差0.2,则测量值升到8.8置位,降到8.6才复位,避免在限值附近抖动导致报警反复翻转。
变化率判据回答“恶化是否过快”。pH在10分钟内从7.2跌到6.6,虽然尚未越下限,但斜率已达-0.06/min,往往意味着加酸过量或来水异常,应提前预警。工程上常用一阶差分近似:R = (PV - PV_prev) / Δt,其中Δt取扫描周期或固定采样周期(如10s),并对结果做一阶滤波抑制噪声。
持续时间判据回答“越界是否稳定存在”。用TON定时器对越界条件计时,达到设定延时(如COD高限持续30s)才确认报警,可滤除传感器气泡、电磁干扰造成的单点跳变。三类判据的关系是:阈值给出方向,变化率给出趋势,持续时间给出可信度。
二、分级判定的两个维度
超标倍数用于衡量严重程度。以COD为例,排放限值100 mg/L,可定义:K < 1.2 为一级(提示),1.2 ≤ K < 1.5 为二级(预警),K ≥ 1.5 为三级(紧急)。倍数法比固定多级阈值更易维护,因为限值调整时只需改基准值,分级比例保持不变。
影响范围用于衡量后果广度。同一pH异常,若仅出现在调节池单点,属局部问题;若同时影响中和反应与后续生化段(可通过多测点越界计数或工艺联锁状态判断),则应提升一级。工程实现上常用“越界测点计数”作为范围代理量:计数≥2视为跨工段,等级加一,但最高不超过三级。
三、结构化文本实现片段
下面给出可直接在符合IEC 61131-3的PLC中编译的ST片段,采用“判据分离、分级集中”的结构,便于在线监视与单点调试。示例参数均为教学假设值。
(* 输入:PV_pH, PV_COD 为工程量;采样周期 Ts = 10 s *)
(* 1. 变化率计算与滤波 *)
dPH := (PV_pH - pH_prev) / Ts; (* 单位 pH/min *)
dCOD := (PV_COD - COD_prev) / Ts;
pH_prev := PV_pH; COD_prev := PV_COD;
ratePH := 0.7 * ratePH + 0.3 * dPH; (* 一阶滤波,抑制噪声 *)
(* 2. 阈值判据(含回差) *)
pH_Hi := (PV_pH > 8.8) OR (pH_Hi AND PV_pH > 8.6);
pH_Lo := (PV_pH < 6.5) OR (pH_Lo AND PV_pH < 6.7);
COD_Hi := (PV_COD > 100.0) OR (COD_Hi AND PV_COD > 95.0);
(* 3. 持续时间确认:TON 实例 *)
TON_pHHi(IN := pH_Hi, PT := T#30S);
TON_COD (IN := COD_Hi, PT := T#60S);
(* 4. 变化率判据 *)
rateAlarm := (ABS(ratePH) > 0.05) OR (dCOD > 8.0);
(* 5. 分级判定 *)
K_COD := PV_COD / 100.0;
IF TON_COD.Q AND K_COD >= 1.5 THEN
lvl_COD := 3;
ELSIF TON_COD.Q AND K_COD >= 1.2 THEN
lvl_COD := 2;
ELSIF TON_COD.Q THEN
lvl_COD := 1;
ELSE
lvl_COD := 0;
END_IF;
(* 6. 影响范围修正:跨工段越界计数 *)
scopeCnt := BOOL_TO_INT(pH_Hi) + BOOL_TO_INT(pH_Lo)
+ BOOL_TO_INT(COD_Hi) + BOOL_TO_INT(TP_Hi);
IF scopeCnt >= 2 AND lvl_COD > 0 AND lvl_COD < 3 THEN
lvl_COD := lvl_COD + 1;
END_IF;
(* 7. 报警输出与事件记录 *)
alarmCOD := lvl_COD > 0;
IF alarmCOD AND NOT alarmCOD_old THEN
evtTime := NOW(); evtLvl := lvl_COD; (* 上升沿记录事件 *)
END_IF;
alarmCOD_old := alarmCOD;
若使用梯形图,可将第2、3段分别实现为“比较+置位/复位”网络与TON指令盒网络,第5段用比较指令串联成等级阶梯,第7段用上升沿触点(P)驱动事件记录功能块。两种语言逻辑等价,ST更适合表达倍数运算与多条件分支。
四、调试时的观察点与判断依据
程序下载后不要只看报警灯,应在线监视四个量:滤波后的变化率ratePH、TON的ET累计值、超标倍数K_COD、范围计数scopeCnt。用信号发生器或强制变量模拟一段斜坡输入:让COD从80缓慢升至160,观察lvl_COD是否按1→2→3顺序跳变且每级停留时间与设定延时一致;再注入一个持续5s的尖峰,确认因小于60s延时而不产生报警。若尖峰仍触发,检查TON的IN是否被其他网络重复赋值,或采样周期Ts与实际扫描周期不一致导致变化率虚高。
最后需要强调,触发与分级逻辑中的每个时间参数、倍数门槛都应来自工艺风险评估而非随意取值,并在程序中以常量或参数块集中定义,便于审计时逐项核对。这样编写出的报警程序,才既能及时捕捉真实异常,又能在事件追溯时给出清晰的等级依据。