1. 从“故障”到“报警”:一个被忽视的工程思维分水岭
在工业自动化现场待久了,你会发现一个有趣的现象:很多刚入行的工程师,甚至一些有几年经验的老手,会把“设备不转了”和“系统报警了”混为一谈。在他们看来,这无非都是设备出了问题,需要去处理。但如果你深入参与过几个大型项目的调试和维护,尤其是经历过因为一个误报导致整条产线停机的“惊魂时刻”,你就会明白,把“故障处理”升级为“报警管理”,是工程师思维从“操作工”迈向“系统设计师”的关键一步。
报警,绝不仅仅是让一个红灯闪烁或者HMI上弹出一行字那么简单。它是一个完整的信号处理、逻辑判断、信息传递和决策支持的闭环。一个设计良好的报警系统,能在故障萌芽时就精准定位,引导维护人员快速响应,同时避免无关紧要的干扰信息淹没关键告警。而一个糟糕的报警设计,轻则让人疲于奔命、误判连连,重则掩盖真实风险,导致生产事故。今天,我们就抛开那些枯燥的手册定义,从我踩过的坑和总结的经验出发,聊聊PLC编程中这个“必会”但常被“轻视”的功能——报警。无论你是用西门子、三菱、欧姆龙还是罗克韦尔,这套思维逻辑都是相通的。
2. 报警系统的核心四要素:不只是“位”的置位与复位
很多人一提到PLC报警,第一反应就是用某个BOOL变量(位)来触发。这没错,但太初级了。一个完整的报警实例,至少包含四个不可分割的要素,缺少任何一个,这个报警都是不完整的。
2.1 报警源与触发条件:定义“什么情况下算异常”
这是报警的起点,也是最考验工程师对工艺理解深度的地方。触发条件不能简单地等于“传感器没信号”。举个例子,一个水泵的“运行反馈”信号丢失,可能触发“水泵故障”报警。但触发条件应该是什么?
- 初级做法:
启动命令=1AND运行反馈=0,持续2秒。这能捕捉到命令发出但泵没转的情况。 - 深入思考:如果泵是变频控制的呢?频率低于某个阈值时,可能无法产生有效的运行反馈信号。那么触发条件可能需要加入频率判断:
启动命令=1AND运行反馈=0AND输出频率 > 5Hz,持续1秒。这就避免了低速运行时误报。 - 再进一步:要不要加入电流判断?如果运行反馈有,但电流远低于额定值,可能是空转或叶轮脱落。这时可以触发“水泵运行异常”报警,而非“故障”。
这里的关键是条件要具体、可测量、且与工艺安全或设备安全直接相关。我习惯为每个报警点建立一个简单的配置表,哪怕只是写在注释里:
| 报警编号 | 报警描述 | 触发条件(逻辑表达式) | 延迟时间 | 复位条件 |
|---|---|---|---|---|
| AL1001 | 1#进料泵启动失败 | 泵启动命令AND NOT泵运行反馈 | 3秒 | 泵运行反馈OR泵启动命令撤销 |
| AL1002 | 1#进料泵空载运行 | 泵运行反馈AND (泵电流< 额定值*0.3) | 10秒 | 泵运行反馈丢失 OR泵电流恢复正常 |
注意:延迟时间是避免抖动误报的利器,但时间设置要合理。对于快变信号(如液位开关)可能只需100-200毫秒,对于慢变过程(如温度)可能需要数秒甚至分钟级。
2.2 报警状态与生命周期:理解“报警的活法”
一个报警从产生到消失,是有生命周期的。通常我们关注三个核心状态:
- 未决报警:触发条件满足,但尚未被操作员确认。这是最紧急的状态,需要最显著的提示(如闪烁、声音)。
- 已确认报警:操作员在HMI上按下了“确认”键,但触发条件依然存在。此时报警指示应变为静态(如常亮),声音停止。这表示“已知晓,正在处理”。
- 已恢复报警:触发条件消失,无论是否经过确认,报警都应进入恢复状态。在历史记录中,这会形成一个完整的“产生-确认-恢复”时间链。
很多新手会忽略“已确认但未恢复”和“已恢复但未确认”的状态处理。一个重要的实践是:报警的“恢复”应该由逻辑条件自动判断,而不是手动复位。手动复位(或称为“清除”)只应用于那些需要人工干预才能恢复的报警,并且要谨慎使用,避免掩盖问题。
2.3 报警文本与信息分级:让人一眼看懂“发生了什么”和“多严重”
“电机故障”这种报警文本是无效的。好的报警文本应该遵循“位置+设备+问题”的格式,例如:“反应釜R101 - 搅拌电机M201 - 过热保护跳闸”。这样维护人员无需查阅图纸就能直奔现场。
信息分级则直接关联响应优先级。我常用的四级分类是:
- 紧急停止:涉及人身或设备重大安全,触发立即停机。如“急停按钮按下”、“安全光栅被遮挡”。
- 故障:设备功能丧失,需立即干预。如“电机过载”、“阀门动作超时”。
- 警告:工艺参数偏离或设备亚健康状态,需要关注但可能不影响立即生产。如“水箱液位低”、“过滤器压差偏高”。
- 提示:正常的模式切换、操作完成等信息。如“自动模式已启动”、“配方下载完成”。
在HMI上,不同级别应用不同颜色(红、黄、橙、蓝)和声音区分。
2.4 报警记录与历史追溯:为“为什么”提供证据
“昨天夜班那个报警到底怎么回事?”没有历史记录,这就是一笔糊涂账。PLC的报警记录不仅要记录报警文本和时间,强烈建议记录触发时的关键工艺参数快照。例如,一个“反应温度超限”报警,历史记录里应该同时保存触发瞬间的温度值、设定值、加热阀开度、冷却水流量等。这为后续的问题根因分析提供了宝贵的数据。
在PLC里实现,可以定义一个报警结构体,触发时将相关数据写入一个数组或发送给上位机数据库。结构体可以包含:时间戳、报警ID、报警文本、报警级别、触发值、设定值、设备位号等。
3. 主流PLC平台的报警实现套路与避坑指南
不同品牌的PLC提供了不同的报警工具,但内核思想一致。这里以两种典型思路为例。
3.1 基于“报警字/报警块”的集中管理(以西门子S7-1200/1500为例)
西门子的博途平台提供了强大的“报警”编辑器,但其底层逻辑值得理解。我们可以自己实现一个轻量、可控的框架。
核心思路:为每个报警定义一个唯一的ID和一个结构化的数据块(DB)。
- 定义报警结构体:在全局DB中创建一个数据类型(UDT),例如
Alarm_Struct,包含:ID(Word)、Active(Bool)、Acknowledged(Bool)、Message(String)、TimeStamp等。 - 创建报警实例数组:建立一个DB,其中包含一个
Alarm_Struct类型的数组,比如AlarmDB.AlarmArray[1..100]。 - 触发与复位逻辑:
// 在循环中断OB中调用 FOR #i := 1 TO 100 DO // 判断触发条件 IF #触发条件 THEN #AlarmDB.AlarmArray[#i].Active := TRUE; #AlarmDB.AlarmArray[#i].TimeStamp := NOW(); // 获取当前时间 IF NOT #AlarmDB.AlarmArray[#i].Acknowledged THEN // 产生未决报警,触发HMI显示和声音 #未决报警总数 += 1; END_IF; ELSE // 触发条件消失 #AlarmDB.AlarmArray[#i].Active := FALSE; // 可以在这里记录恢复时间 END_IF; END_FOR; - HMI连接:在WinCC RT Advanced或精智面板中,可以直接绑定
AlarmDB.AlarmArray的Active和Message到报警视图控件。确认信号则写回Acknowledged位。
避坑提示:自己管理报警数组时,最大的坑是扫描周期与时间戳。如果你在多个不同的OB(组织块)中置位报警,
NOW()函数获取的系统时间可能因OB调用时刻不同而有微小差异。对于要求严格顺序的记录,建议在同一个快速循环OB(如OB30)中集中处理所有报警的判断和状态更新,确保时间戳的一致性。
3.2 基于“功能块”的模块化封装(通用模式)
这是一种更工程化、可复用的方法,尤其适合设备厂商或大型项目。
- 设计报警功能块:创建一个FB,例如
FB_Alarm。输入参数包括:Trigger(触发条件)、Ack(确认信号)、Message(报警文本)。输出参数包括:Active、Acknowledged、ActiveEdge(上升沿)等。内部处理延时、状态跳转。// FB_Alarm 内部逻辑简化示意 IF #Trigger THEN #ton_Delay(IN:=TRUE, PT:=T#3S); // 延时定时器 IF #ton_Delay.Q THEN #Active := TRUE; #ActiveEdge := NOT #LastActive AND #Active; // 检测上升沿用于一次触发 #LastActive := #Active; END_IF; ELSE #Active := FALSE; #ton_Delay(IN:=FALSE); END_IF; IF #Ack THEN #Acknowledged := TRUE; ELSIF NOT #Active THEN #Acknowledged := FALSE; // 自动复位确认状态 END_IF; - 实例化与调用:在控制每个设备的FB中,实例化多个
FB_Alarm。例如,在FB_Pump中:#Alarm_StartFail(Trigger:= #StartCmd AND NOT #RunFeedback, Ack:= #HMI_Ack, Message:= '泵启动失败'); #Alarm_Overload(Trigger:= #Current > #MaxCurrent, Ack:= #HMI_Ack, Message:= '泵过载'); - 汇总报警:将所有实例的
#Alarm_xxx.Active信号通过“或”运算汇总到一个总报警输出,并可以将ActiveEdge信号用来触发一个全局的报警事件,方便上位机捕获。
这种方法将报警逻辑和设备控制逻辑紧密绑定,高度模块化,调试和修改都非常方便。
4. 高级议题:让报警系统从“好用”到“智能”
解决了有无问题后,我们需要考虑如何优化报警系统,减少误报和漏报,提升其可用性。
4.1 报警抑制与过滤:避免信息洪水
不是所有报警在任何时候都有意义。典型的抑制场景包括:
- 开机抑制:设备启动过程中,某些传感器未达到正常状态是预期的。可以在“启动模式”下,屏蔽诸如“液位低”、“压力低”等报警,持续30秒或直到某个启动步骤完成。
- 设备停运抑制:当设备被手动停机或置于维护模式时,其相关的运行状态报警(如“电机过载”)应被自动抑制。
- 关联抑制:一个根源故障会引发一系列连锁报警。例如,主电源丢失会导致所有电机报“故障”。此时应只报告最根本的“主电源故障”,并抑制所有下游设备的报警,防止报警列表被刷屏。
实现上,可以给每个报警功能块增加一个Suppress输入管脚,由模式选择或更高级的逻辑来控制。
4.2 报警死区与迟滞:应对信号波动
对于模拟量报警(如温度、压力),直接使用一个固定阈值进行比较,会在阈值附近产生频繁的报警抖动。必须引入死区。
- 设定值:80°C,高报警:90°C。
- 简单比较:温度达到90°C报警,低于90°C恢复。若温度在89.5-90.5°C波动,则报警频繁启停。
- 加入死区:温度达到90°C报警,但直到温度回落到88°C(或85°C)才恢复。这个88°C就是恢复死区。这确保了报警状态的稳定。
在PLC中实现,就是一个简单的比较逻辑:
IF #ActualValue >= #HighAlarmLimit THEN #HighAlarmActive := TRUE; ELSIF #ActualValue <= #HighAlarmRecoverLimit THEN // 恢复死区限值 #HighAlarmActive := FALSE; END_IF; // 低报警同理,方向相反4.3 报警性能与扫描周期:看不见的瓶颈
在一个有上千个报警点的大型系统中,如果处理不当,报警扫描会成为性能瓶颈。如果你的报警逻辑分散在主循环OB中,且条件复杂,可能会显著拉长扫描周期。
- 优化建议一:将报警触发条件的计算,尽可能放在设备控制的功能块内部完成,只输出一个干净的BOOL报警信号给报警汇总逻辑。
- 优化建议二:对于非关键性的报警(如提示信息),可以放在扫描周期较慢的OB中处理。
- 优化建议三:避免在报警逻辑中使用大量复杂的浮点运算或间接寻址,这些操作耗时较长。
我曾经遇到一个项目,扫描周期从20ms莫名增加到50ms,最后排查发现,是工程师在报警逻辑里对一段长达1000个字的字符串进行了实时拼接和比较。将字符串处理移到报警触发后的单独序列中,问题立刻解决。
5. HMI上的呈现与交互:人机界面的最后一道坎
报警最终是给人看的,HMI的设计至关重要。
- 报警视图:必须支持按级别筛选、按时间排序、按未决/已确认状态筛选。最重要的信息(如报警文本、时间、设备)要一眼可见。
- 确认与操作:确认按钮要醒目且容易操作。对于某些报警,可以提供“确认并跳转到相关画面”的快捷按钮,直接定位到出问题的设备控制面板。
- 报警总览:在首页或关键画面,要有全局的报警摘要栏,显示最高级别的未决报警及其数量。颜色编码必须一致。
- 声音提示:不同级别报警应有区别化的声音。紧急故障用急促连续声,警告用间歇声,提示可能只需要一个短促音效。并且一定要提供“消音”按钮,但不能关闭报警视觉提示。
一个常见的坏实践是:操作员为了消除烦人的报警声音,养成了不看内容就快速点击“确认”的习惯。这完全违背了报警系统的初衷。因此,设计时要考虑如何让关键报警“无法被轻易忽视”,例如,紧急停止报警可能需要输入密码或长按确认键才能确认。
6. 实战复盘:一个由报警设计缺陷引发的停产事故
最后,分享一个我亲身经历的教训。在一个涂装生产线上,有个关键参数叫“风压平衡”。系统设计了一个报警:“风压平衡偏差超限”。逻辑很简单,实测风压与设定值相差超过10%就报警。
问题出在恢复逻辑上。最初工程师设置的是“偏差低于10%就自动恢复”。这听起来合理。但在生产过程中,由于风机波动,风压会在9%-11%之间频繁震荡。导致的结果是:这个报警在HMI上以每分钟数次的频率反复“激活-恢复-激活”。操作员很快就产生了“报警疲劳”,认为这是个无关紧要的“假报警”,开始习惯性忽略。
直到某天,一个真正的故障发生:过滤网严重堵塞,导致风压偏差持续增大到30%。报警依然在触发,但因为它一直在频繁闪烁,混在一堆历史信息里,没有引起任何人注意。几小时后,由于工艺环境恶化,导致整批产品涂层不合格,全线停产整顿。
根因分析:
- 无死区设置:报警在阈值附近抖动。
- 无延迟时间:没有对波动进行滤波。
- 无级别提升:持续的超差没有从“警告”升级为“故障”。
- HMI设计缺陷:频繁的报警恢复刷屏,淹没了持续存在的严重状态。
解决方案:
- 为报警增加延时(如持续超差5秒才触发)和死区(触发限12%,恢复限8%)。
- 修改逻辑:一旦报警触发,必须由操作员手动确认后才能复位,即使参数暂时恢复正常。这迫使人员必须介入查看。
- 增加第二级报警:如果超差持续超过2分钟,则触发更高级别的“风压严重失衡”故障报警,并关联生产节奏降速。
- 在HMI报警视图上,对“已确认但未恢复”的报警给予更突出的显示(如橙色背景)。
这个案例让我深刻体会到,报警系统的设计,本质上是人因工程和控制逻辑的结合。它不仅要告诉系统“哪里不对”,更要有效地告诉人“哪里不对”、“有多不对”、以及“现在该做什么”。把这套逻辑吃透,你的PLC项目就不仅仅是“能运行”,而是“可靠、可维护、易于诊断”的工业级产品。