资讯动态

老旧SCADA系统旁路加装边缘计算网关,实现智能告警推送

发布时间:2026/9/7 13:29:10 来源:尧图企业网站定制
这几年在厂里做设备运维的人应该都有过这种体验产线上那套老旧SCADA系统用了十几年平时还能凑合看画面、存历史曲线但一到后半夜值班真正要命的问题它根本不主动告警——没有推送、没有手机通知报警就只是画面角落里闪一下错过了就是事故。想升级到新版SCADA吧厂家报价吓人还要停产调试想自己加告警模块又怕动到运行中的系统责任担不起。后来我换了个思路不动老系统在它旁边旁路加装一台边缘计算网关把告警能力无损地补起来。这篇文章就从选型、接线、抓包解析、告警规则、通道配置到后期调优把整套方案完整拆开讲一遍给准备做同样改造的朋友一份可落地的参考。1. 老旧SCADA系统的告警困局与旁路方案的整体思路1.1 为什么老旧SCADA系统加告警这么难先说我实际遇到的一个项目。客户现场是一套2008年建设的SCADA系统上位机用WinCC 6.0跑在Windows Server 2003的老机器上下位是好几套S7-300 PLC通过以太网走S7comm协议。这套系统稳定运行了十几年生产数据、历史趋势、报表都在里面但报警功能基本上停留在“画面上弹个框、响一声蜂鸣”的程度。中控室有人盯着还行现在要求设备数据随时推到值班手机上那就根本做不到了。想把告警能力补上常规思路通常有三条但每一条都有一堆坑。第一条升级上位机软件到新版WinCC利用自带的报警器和移动端组件做推送。这个方案听起来最正统但实际一询价光软件授权就是一大笔费用而且老项目的历史归档、画面脚本、报表全都要重新迁移测试工程量巨大现场根本不会给你这么长的停机窗口。第二条在PLC里加报警程序通过PLC的WEB功能或者OPC把数据转发出去。但老PLC的程序是原集成商写的没有完整源码交付没人敢动光是导出变量表就费了大半天劲。第三条单独开发一套告警服务直接从PLC或者SCADA数据库里读数据。问题在于如果从PLC直接读等于和原系统争抢通讯资源万一通讯超时把原系统的采集周期拖慢出了问题第一个被追责的就是你。所以“加告警”这件事的难点从来不在技术上做不出来而在生产不能停、老系统不敢动、预算又没有那么多。这时候就必须换赛道找一个不与原系统产生纠缠的方案。1.2 旁路加装方案的设计思路旁路加装边缘计算网关就是在这种约束下被倒逼出来的方案。核心思路一句话我不去动你的SCADA系统也不和PLC抢通讯我在交换机的某个位置“旁听”一份同样的数据流量用边缘计算网关独立完成协议解析、规则判断和告警推送。原系统继续按它的方式工作新增的告警能力完全叠加在“旁边”不是替换不是修改更不是拦截。打个比方老医院的信报箱一直没人管你不需要重新装修门诊楼只需要在大厅角落放一台智能分诊终端从总配电房借一路电、引一条网络过来它自己就能更新科室信息、引导患者。原来的信报箱没人动该怎么样还怎么样新增服务是在旁边长出来的。旁路方案最大的优势就是可回退、可举证万一新系统出了问题拔掉一根网线就完全还原到改造前的状态这在老系统改造里价值千金。具体到技术落地上旁路有几种常见实现方式交换机镜像端口SPAN把承载PLC和SCADA通讯的交换机端口流量复制一份给网关适合电口环境成本最低、部署最快。分光器/TAP在光纤链路上做无源分光网络报文原样复出一份物理隔离性最强适合汇聚层是光纤的场景。OPC UA/OPC DA只读订阅如果老系统带OPC Server网关可以以低频率只读订阅点位值对原系统负载增加很小适合点位少、改动顾虑重的场景。我这次用的是“交换机镜像端口 Modbus TCP抓包解析”。为什么没有直接对接OPC因为现场老系统的OPC Server跑在那台老掉牙的工控机上本身负担就很重再让它对外支撑几百个点位的订阅请求CPU负载直接飙升客户不同意。而镜像方式完全不干扰原SCADA的采集链路交换机复制一帧报文也就是微秒级的开销可以忽略。选择镜像还有一个隐藏好处后续如果换了新SCADA系统只要端口流量还是Modbus TCP这套旁路告警网关可以平移复用不锁定在任何品牌上位机上。2. 边缘计算网关选型与数据采集方案设计2.1 网关硬件选型够用、低功耗、可冗余边缘计算网关的选型是我花时间最多的一环。工业现场不像机房里随便开一台虚拟机就能完事它要面对断电、高温、粉尘、长时间无人值守。我最后选了一台低功耗x86架构的无风扇工控机原因有三个一是x86生态好Linux下抓包、Python、Node-RED、SQLite、Web服务都没有兼容性问题二是无风扇设计没有机械活动部件在粉尘大的车间里不容易堵风扇烧CPU三是性能和成本均衡四核处理器、8GB内存、64GB SSD这个配置跑告警规则引擎加本地数据库绰绰有余。硬件接口上有个点特别容易忽略至少要有两个物理网口。一个网口专门用来接镜像端口收数据不做任何业务另一个网口接管理网络用于SSH管理、外发告警、远程升级。这两个口的VLAN和IP段也建议分开管理网就算有波动也不影响采集链路的报文接收。如果现场只有单网口工控机也可以用VLAN子接口或USB千兆网卡应急但稳定性和长期运行可靠性远不如原生双网口。内存建议直接8GB起步别省钱。边缘计算网关不只是抓包转发还要跑规则引擎、告警历史存储、Web管理界面、自动升级脚本多开几个服务下来4GB就会很紧张。我见过有人图便宜选了512MB内存的网关结果装上Python环境之后抓包进程一忙就OOM告警推到一半自己崩了。事故现场告警网关先死掉这种场景最尴尬。2.2 数据采集方案镜像抓包解析与应用层协议识别网关硬件确定后数据采集是第一道坎。镜像口进来的原始报文是二层网络包需要从中找到应用层数据再按照协议规范解析出点位值。以这次项目里最常见的Modbus TCP为例完整的以太网帧是这样的结构目的MAC6字节、源MAC6字节、可选的802.1Q VLAN标签4字节、以太网类型2字节0x0800表示IPv4、IP头至少20字节、TCP头至少20字节然后是Modbus应用报文。Modbus TCP默认端口是502只要抓取TCP端口为502的报文内容就能拿到Modbus应用数据单元MBAP头PDU。MBAP头一共7字节事务处理标识符2字节、协议标识符2字节固定为0x0000、后续长度2字节、单元标识符1字节。PDU部分由功能码和数据组成功能码0x03表示读保持寄存器、0x04表示读输入寄存器。请求报文里会写明要读的起始寄存器和数量响应报文的正文就是寄存器值直到字节计数结束。开发解析程序时不需要把整个TCP会话完整拼起来Modbus TCP本身是一问一答的短事务抓包时针对每一个事务的响应帧按起始地址连续切片取出寄存器值即可。解析代码我推荐先用Python快速验证核心逻辑可以这样写import struct def parse_modbus_tcp_response(frame_payload): # frame_payload 是 TCP payload if len(frame_payload) 9: return None transaction_id struct.unpack(H, frame_payload[0:2])[0] protocol_id struct.unpack(H, frame_payload[2:4])[0] length struct.unpack(H, frame_payload[4:6])[0] unit_id frame_payload[6] function_code frame_payload[7] byte_count frame_payload[8] data frame_payload[9:9 byte_count] return transaction_id, unit_id, function_code, data这里有几个“过来人”的提醒。第一如果交换机的镜像端口是Trunk口抓到的报文中会带VLAN标签解析时要在以太网类型之后判断是否有0x8100的VLAN头有就跳过4字节否则会把VLAN头误当成IP头的起始位置后面全部错位。第二注意PLC服务端监听端口不一定是502很多设备支持自定义端口501、502、503都见过抓包过滤别把端口写死直接用tcp[0:2] 0x0000筛选Modbus协议标识更可靠。第三Modbus寄存器值大端在前也就是高位字节先传但个别设备支持小端或字节序交换需要在解析层做可配置的字节序处理否则点位值会出现成倍或乱序的偏差。2.3 告警规则引擎设计阈值、死区、去抖与变化率数据解析出来之后就要进入告警规则引擎。这一块是旁路网关能不能真正实用的灵魂。先说阈值告警。工业现场最常用的是四段式阈值高报High、高高报High-High、低报Low、低低报Low-Low。比如一个反应罐液位高高报设90%高报设80%低报设20%低低报设10%。不同级别对应不同处理策略低低报和高高报往往意味着联锁动作或紧急停机属于P1级告警高报和低报是提醒操作人员关注属于P2级。只设阈值远远不够必须加死区和去抖。死区的含义是比如液位高报值设80%恢复值不能马上设成79.9%否则液位在79.8%和80.1%之间波动时告警会疯狂触发和恢复。常规做法是设置一个恢复回差值比如恢复值80%-5%75%液位不到75%之前高报状态一直保持。去抖的含义是数值越限的持续时间要达到设置值比如3秒才真正触发告警这样能滤掉泵启动瞬间、阀门动作瞬间的瞬时冲击。变化率告警用于捕捉“慢慢变坏”的过程。压力系统里很多泄漏不是一蹴而就而是每分钟掉几个千帕阈值告警发现不了但变化率告警能在压力跌到危险值之前提前发现。变化率的计算不能只拿“当前值减上一秒值”当瞬时速率要采用一段时间窗口内的平均变化率比如5秒内的平均变化率这样现场噪声不容易触发误报。规则引擎我最后直接用YAML配置每条规则包含点位、类型、参数、级别、推送通道后期调整不用改代码。配置片段示例rules: - name: 1#反应罐液位高高报 point: LT_101 type: threshold high_high: 90.0 high_high_recover: 85.0 duration: 3 level: P1 - name: 1#反应罐压力变化率越限 point: PT_101 type: rate max_rate: 0.05 window: 5s level: P2这里有一个特别重要的经验规则先上线跑“旁观模式”只记录不推送跑两三天把误报率调低之后再真正打开推送。别一上来就全量启用否则第一天晚上你就会被群里的告警轰炸第二天就得写检讨。我们内部把这套流程叫作“先旁听后发言”和旁路方案本身的核心思想完全一致。3. 旁路部署实操过程3.1 交换机镜像端口配置与网络拓扑接入到了现场第一步是摸清网络拓扑。老旧SCADA系统通常有一台或多台工业交换机SCADA上位机、PLC、HMI都挂在这台交换机上。我们的目标是把“SCADA上位机所连接的交换机端口”或“汇聚了PLC与上位机流量的上联端口”的流量镜像出来交给边缘网关。我这次拓扑里PLC和上位机连在同一台汇聚交换机上选择把这个汇聚交换机连接PLC区域的端口以及上位机端口作为观察源将流量复制到镜像目的口再把镜像目的口接到边缘网关的eth0。这里提醒一句镜像口不要配置IP不要加入任何VLAN的转发只做流量出口网关的eth1走管理网便于远程登录和告警外发。把配置命令贴出来之前先说明一点不同品牌的交换机命令风格差异很大下面给出华为、思科、H3C三个主流品牌的参考配置大家按现场设备型号对应操作即可。华为S5720配置方式system-view observe-port 1 interface GigabitEthernet0/0/24 interface GigabitEthernet0/0/1 port-mirroring to observe-port 1 both思科Catalyst 2960的配置方式monitor session 1 source interface Gi0/1 both monitor session 1 destination interface Gi0/24H3C S5130的命令是mirroring-group 1 local mirroring-group 1 mirroring-port GigabitEthernet1/0/1 both mirroring-group 1 monitor-port GigabitEthernet1/0/24配置完成后不要急着写解析程序先在网关侧抓包验证流量是否到位。用tcpdump命令抓取502端口报文如果能看到连续的TCP连接和Modbus请求/响应帧说明镜像链路已经通了。抓包这一步最好选在业务低谷期操作避免瞬时大流量把终端窗口刷爆。tcpdump -i eth0 -nn -s 0 port 502这里有两个细节必须强调。一是tcpdump的snaplen参数别用默认的96字节否则很可能只抓到IP/TCP头应用层数据被截断想解析Modbus内容就成了无米之炊建议用-s 0或-s 1518。二是镜像端口默认会把收发双向流量复制如果只看到单一方向的包检查是不是把方向配成了rx或tx一般要配成both才能同时看到PLC的请求和上位机的响应。3.2 点位映射与工程值换算抓包通了接下来是点位映射。这一步是整个项目里最繁琐、最容易出错的地方没有捷径只能对照原SCADA的变量表逐一梳理。现场的老SCADA用的是WinCC变量管理器里导出了一份点表里面是连接、DB块、数据类型、线性标定等信息。我们需要把要告警的关键点位整理成一张新表字段大致如下点位名称设备/PLC协议地址数据类型缩放系数偏移高高限高限低限低低限死区去抖时间LT_101 液位1# PLC4x000116bit无符号0.1090.080.020.010.05.03sPT_101 压力1# PLC4x000216bit无符号0.01-10.02.52.00.50.20.153s这里要解释一下缩放系数和偏移。Modbus寄存器里的原始值往往不是工程值有的PLC程序把液位值放大10倍传输寄存器值1050表示实际液位105.0%有的压力变送器量程是-10kPa到10kPa对应寄存器0到20000那就需要工程值 寄存器值 × (20/20000) - 10。这个换算关系必须和原SCADA系统保持一致否则告警阈值会全部错位。点位表我强烈建议用Excel或CSV维护然后写脚本导入网关规则引擎。千万别在规则引擎里一个点位一个点位手敲点位一多手误率极高。项目验收后新增点位只需更新点位表再重新导入网关无需停机重启这对后续运维来说特别重要。点位映射完成后用“旁观模式”跑一晚上把网关解析到的点位值与中控室SCADA画面上的数值逐点比对确认至少八成点位对得上再继续推进。剩下两成往往藏在数据类型或字节序差异里需要单独排查这个我后面在常见问题里详细讲。3.3 告警通道配置钉钉Webhook与多级通知告警通道是告警能送达的最后一公里。现在很多运维团队的标配就是钉钉或企业微信群机器人Webhook配置简单、不用装插件、手机端推送及时。这里以钉钉群机器人Webhook为例给出网关侧的推送示例。先在钉钉群添加一个自定义机器人得到一个Webhook地址形如https://oapi.dingtalk.com/robot/send?access_tokenxxxxxxxx然后在网关的告警推送模块里调用import requests import json webhook_url https://oapi.dingtalk.com/robot/send?access_tokenxxxxxxxx def send_alert(title, content): payload { msgtype: actionCard, actionCard: { title: title, text: content, btnOrientation: 1, btns: [{title: 打开告警详情, actionURL: http://gateway-status-page/alert/123}] } } r requests.post(webhook_url, jsonpayload, timeout5) return r.status_code, r.text关于钉钉Webhook我提几个实操经验。第一Webhook地址必须以环境变量或配置文件的方式保存不要硬编码在Python脚本里否则代码一泄露任何人都能往群里丢消息而且换机器人时还得改代码重启服务。第二钉钉官方对自定义机器人的频控比较严格每个机器人每分钟最多发送20条左右超过会被限流。如果现场点位多、告警频繁一定要在网关侧做频控同一告警每分钟最多推2条不同告警每分钟总量不超过15条同时依靠降噪规则控制推送量别让群被刷屏。第三告警文本里要带清晰的时间戳、设备、点位、当前值、阈值、级别最好再加一个可点击的管理后台详情链接方便值班人员直接定位问题。除了钉钉Webhook邮件SMTP、企业微信Webhook、飞书Webhook也可以作为备选通道。生产现场如果对电话提醒有硬性要求还可以通过网关的短信猫或者外部语音服务平台调用语音告警这在无人值班站所场景特别管用。告警通道要设计成多级P1级紧急告警同时推钉钉加短信加电话P2级推钉钉加群消息P3级只写历史并汇总晨报避免P3级海量告警把重要消息淹没。4. 告警质量治理降噪、去抖与确认闭环4.1 告警风暴的成因与抑噪策略旁路网关上线后第一个要面对的就是告警风暴。常见成因有几类某台PLC网线松动或断电导致与该PLC相关的几十个点位在同一秒内全部失去数据如果每个点位都单独触发“无数据”告警消息会瞬间爆炸另一种是SCADA上位机重启镜像流量短暂中断告警规则如果对“通讯超时”太敏感也会导致全点位误报。处理告警风暴我个人的实践经验是三层抑噪。第一层根因抑制。网关会维护一份“设备-点位”的从属关系比如LT_101、PT_101、TT_101都挂在1# PLC下面。当1# PLC的通讯状态位从1变成0或者连续超过10秒没有收到该PLC的任何报文时网关自动抑制该PLC下所有点位的数据类告警只推送一条“1# PLC通讯中断”的根因告警。等PLC恢复通讯根因告警先恢复再解除对其余点位的抑制消息量从几十条瞬间降到两三条。这个策略在大型场站效果极其明显我后面统计的数据就是靠它把告警数量压下来的。第二层相似告警合并。同一点位在5分钟内反复触发同一条规则时不重复推送而是把触发次数累加到第一条告警上比如“LT_101液位高高报已连续触发5次”等告警真正恢复时再推一条恢复消息。第三层维护窗口与静默规则。在设备计划停机检修期间网关自动进入静默模式只记录告警不推送不通知等维护窗口结束后再把期间的关键告警做汇总补发。另外告警不只是数据超限这一种类型。像vSphere证书还有几十天过期、备份任务失败、磁盘空间不足这类周期性检查项其实也应该是告警体系里的常客。我在规则引擎里加了定时巡检任务每天早上9点检查一次证书有效期、磁盘剩余空间、服务进程存活状态有异常就推告警把IT侧常见的证书状态告警也统一纳入了同一个推送体系。4.2 告警确认、恢复与屏蔽规则设计告警不能只是推出去就完了还需要有状态闭环。我参考的模型和Zabbix的告警处理方式很相似一条告警会有“触发firing”“确认acked”“恢复resolved”“手动关闭closed”几种状态。值班人员收到推送后可以在网关的Web端或API里点击“确认”表示已知悉、正在处理确认后的告警会从“未确认”列表中消失避免同一事件反复打扰。告警条件恢复后状态自动转为“已恢复”如果现场一时半会儿处理不了也可以手动关闭并填写原因但系统会保留完整审计记录。这个设计思路和Zabbix 7版本里“手动确认关闭告警”的诉求是完全一致的。关于告警屏蔽很多人在做静默规则时都会遇到“屏蔽不生效”的问题这里我专门展开讲一下。最常见的坑有三个一是时间匹配字段理解错误屏蔽规则的时间窗口到底是“当前时间落在窗口内生效”还是“从告警产生时开始计算时长”很多平台这两种语义混在一起导致规则写出来和预期行为完全不符。我这边采用的语义是“告警产生时间落在屏蔽窗口内则该告警整条被静默”再配合告警级别和点位匹配逻辑才清晰。二是设备名称匹配的字符差异比如SCADA里设备名称带前导空格或大小写不一致匹配不到就放行了这种问题要用精确字段比对加日志跟踪方便排查。三是时区问题网关如果跑的是UTC时间屏蔽窗口写的是北京时间结果早上8点的窗口实际上在下午4点生效这属于部署时的低级错误但确实在真实项目里遇到过。告警确认和关闭的API也要提前设计好方便后续接入企业微信审批流或者内部工单系统。我在网关里留了三个标准接口POST /api/v1/alerts/{alert_id}/ack POST /api/v1/alerts/{alert_id}/resolve POST /api/v1/alerts/{alert_id}/close每个动作都会记录操作人和时间戳审计不用愁。4.3 告警升级与值班通知策略告警推送之后没人处理比不推送更糟糕。所以我在网关里设计了一套简单的升级策略。P1级告警推送后30分钟内没有被确认网关自动升级到值班班长再过一小时仍未确认升级到部门负责人。P2级告警2小时内未确认升级到值班班长。这个升级策略用规则引擎的“计时器”实现每个告警维护一个到期时间到期后调用对应的通知通道。现场实践证明升级机制上线后值班人员对P1告警的平均响应时间从20分钟缩短到3到5分钟主要就是因为不敢让告警“躺”在自己名下。夜间的策略我建议更激进一点夜间23点到早上6点之间除了P1/P2级告警外其他P3级告警全部静默汇总成晨报早上7点准时推送到运维群。这样既保证关键故障能叫醒值班人员又不至于让琐碎告警影响一线工程师夜班休息。这里要注意一个细节就是静默与升级之间的联动关系。我之前看到有人反馈“flashduty 告警屏蔽不生效”大概率就是夜间静默和告警升级策略产生了冲突——静默把告警按住了但升级计时器还在跑最后两条消息又同时冲出来。我们的设计里明确了一点被静默的告警升级计时器也必须一并停住等静默解除再恢复计时这样才不会出现“漏网之鱼”。5. 常见问题与排查经验5.1 旁路采集不到数据的排查这是项目上线初期最常遇到的问题我按从网络层到应用层的顺序列一个排查思路能少走很多弯路。第一步确认镜像端口配置生效。在网关上看是否有报文接收如果连报文都没有优先检查交换机的镜像方向、观察口是不是只配了rx或tx旁边对应的是PLC到上位机还是上位机到PLC的流量。第二步确认tcpdump过滤条件先用tcpdump -i eth0 -nn -s 0看全量报文有VLAN标签时端口过滤要写成tcp[0:2] 0x0000或直接过滤VLAN内层端口不能简单过滤port 502因为Trunk口上原始报文端口可能被VLAN头隔开。第三步确认协议不是加密传输。现在部分新PLC的上位机通讯默认开启了TLS加密比如S7-1200/1500较新固件上的S7comm over TLS老式抓包直接看不懂。这种场景要么在协议选型时避开直接用网关读取PLC的OPC UA接口要么让集成商在PLC侧明确通讯模式和加密策略不要指望网关去盲猜解密。还有一个非常隐蔽的问题我花了一整天才定位出来边缘网关的eth0接到了交换机的镜像口但这个网卡的DHCP客户端没有禁用网关一上电就自动向交换机发送DHCP请求交换机误认为该端口需要承载业务流量导致镜像口状态异常。解决方法是把接收镜像流量的网卡直接配置为无IP状态或者用独立物理口隔离业务流量不让网关主动发包进入被镜像的网络。5.2 告警误报与漏报的调优旁路网关调优的核心工具就是“旁观模式”。上线前两周我把所有告警规则都设置为“只记录不推送”每天统计误报率和漏报率。误报的典型案例是阈值告警没有设置死区。有一个蒸汽压力点位正常运行时压力在1.95MPa到2.05MPa之间波动阈值设2.0MPa报警如果不加死区这条告警一天要触发几十次、恢复几十次完全没法看。后来我把高报值设为2.1MPa、恢复值设为1.95MPa告警次数直接降到零因为只有真正升到2.1MPa以上才报警回落到1.95MPa以下才恢复中间的抖动全部被滤掉。死区大小的经验值我一般取正常运行波动的1.5到2倍比如正常运行波动±0.05MPa死区就取0.075到0.1MPa。漏报的典型案例是点位采集周期与告警判断周期不匹配。Modbus通讯是一问一答网关为了不影响原系统请求周期设得比较长比如5秒一次。如果现场有一个温度点位上升速度很快5秒内就从正常升到高高限网关很可能只采到一个高高限的值但由于持续时间不足3秒这条告警被去抖逻辑滤掉了造成漏报。解决方案是把这类关键点位的采集周期单独缩短到1秒并且在高高报规则里把去抖时间降为1秒既不影响全局通讯负载又能保证快速故障不丢。调优时还有一个心得误报率和漏报率是矛盾的调参要“两条腿走路”。先观察一周统计哪些点位最容易误报把死区加上哪些点位最容易漏报把采集周期和去抖时间改短。每次只改一组参数记录改前改后的告警数量对比效果清清楚楚。这样逐步收敛比一次性拍脑袋调一堆参数要可靠得多。5.3 网关自身稳定性与运维注意事项旁路网关是一个独立设备它的可靠性直接决定告警功能可用性。我在这台网关上做了几项基础加固每项都踩过实际的坑。第一看门狗与自恢复。系统层面用systemd托管告警主进程配置Restartalways和RestartSec5进程崩溃后5秒自动拉起。如果对物理看门狗有要求可以选用带硬件看门狗模块的工控机主板在Linux下通过/dev/watchdog喂狗系统死锁时自动重启。第二存储与日志轮转。边缘网关的SQLite库会持续增长日志如果不做轮转两三个月就能写满64GB硬盘。需要给日志配置logrotate保留最近7天即可告警历史在网关侧保留3个月超过3个月的历史转存到中心文件服务器避免本地磁盘膨胀。第三健康检查与心跳。网关要向管理平台定时发送心跳报文比如每30秒一次平台连续3次没收到心跳就告警“边缘网关离线”。这个属于“监控监控者”的兜底没有心跳监测网关断电了你都不知道告警能力形同虚设。第四代码级规范。开发网关采集模块时别用不检点的写法。之前我用Java写过一个采集模块编译后一堆raw type warning测试时没在意等网关跑起来日志文件里全是unchecked告警混在真正的PLC解析日志里排查问题眼睛都快看瞎了。后来老老实实把List写成ListString参数类型用泛型约束清楚编译零警告日志干净清爽。做告警系统的人自己先别制造噪音。5.4 项目上线后的实际效果与经验延伸这个项目上线差不多一个月后我统计了网关的运行数据每天有效告警从最初杂乱无章的日均200多条收敛到日均30条左右其中P1级告警平均每天3条P2级告警12条P3级告警15条。误报率从第一周的35%降到了5%以下漏报的情况在调节采集周期之后基本根除。最让我觉得这套方案值回票价的是有一次后半夜一套疏水泵的出口压力出现缓慢下降变化率告警在压力跌到低报值之前大概20分钟就推送到值班手机上了。值班人员赶到现场检查发现是泵出口止回阀内漏提前切了备用泵避免了一次泵组抽空联锁。后来客户复盘说如果是老SCADA的纯画面报警这种缓慢的压力变化根本不会引起注意大概率要等到设备损坏停机才会发现。旁路加装边缘计算网关的思路其实不只能解决告警问题。同一套镜像网络管道上后续还可以叠加设备健康度分析、能耗统计、设备台账自动化、预测性维护等边缘应用网关的规则引擎和点位表都是可以复用的不会推倒重来。最后我在实际操作中的体会是做老旧系统改造最大的障碍往往不是技术而是“怎么证明我动了不会出问题”。旁路方案最大的优势就是可回退、可举证——上线前出问题拔线就还原上线后对比镜像数据和原SCADA数据双方结果一致客户才放心。如果你也在为一个运行了十几年的老系统发愁不妨试试这个思路从控制风险最小的旁路开始先把告警做起来再慢慢叠加其他能力路会越走越宽。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价