30台PLC的数据采集总是丢数据,查了一周发现是通讯超时设得太保守了——一个SCADA项目的排查记录
去年给一个做汽车配件的工厂做设备数据采集,30多台PLC,涵盖了西门子S7-1200、S7-1500、三菱FX5U和几台老款FX3U,要统一采集到一套SCADA系统里,再上传到他们集团的MES平台。听起来就是个标准的数采项目对吧?结果上线第一周我就差点被搞崩溃了。
问题出在哪呢?数据不完整。有的设备一天的产量数据丢了2个小时,有的设备一天丢了三四次,每次丢十几分钟到半小时不等。MES那边导出来的报表永远是缺斤少两的,车间主任天天打电话来问:我这边的产量怎么对不上?
一开始我怀疑是网络问题。车间环境你懂的,电磁干扰大,AP和交换机也杂。我带着笔记本去现场ping每台PLC,发现网络延时都正常,ping值在1到3毫秒之间,没有丢包。交换机端口统计上也没有CRC错误。网络层面看起来没问题。
然后又怀疑是PLC程序本身有问题。我把每台PLC的数据采集程序段都读了一遍,发现有的PLC是用定时中断做数据缓存,有的是用轮询方式写DB块。改了几台程序,加了数据校验和重发机制,问题依旧。
折腾了三天,一点进展都没有。那几天我压力太大了,晚上睡不着都在想这个问题。
转机:一个偶然发现的规律
第四天早上,我让车间的人帮我把所有设备出问题的时间段记下来。到下午的时候,我对照SCADA的日志一看,发现了一个规律:数据中断的高发时段集中在每小时的整点和半点前后。再仔细看,每次中断持续的时间大概在15到20分钟之间。
这个时间规律让我一下子想到了什么。我跑到车间问了一下现场的电工,他说那些时间段正好是车间的换班和休息时间,有些工位会暂停生产。
等等,问题就出在这里了。
车间一暂停生产,PLC那边的数据就不更新了。产量、节拍、设备状态,这些变量就停在最后那个值上不走了。而我的SCADA采集端设了一个通讯超时时间,如果某个数据点连续一段时间没有变化,系统就认为这台设备离线了,然后开始重新建立连接。重新连接的过程加上后续的数据补采,刚好需要15到20分钟。
我赶紧回去翻SCADA的配置,发现采集站上设了一个参数叫”Deadband”(死区),默认值是1%。也就是说数据变化幅度不到1%的时候,系统不会把新的数据传给上层。再加上我设的”Communication Timeout”是60秒超时后断开,重连间隔30秒,重试3次后标记离线。
好家伙,三个参数加在一起,正好给数据中断埋了一个定时炸弹。
问题的根子在哪里
说白了,这是我犯了一个很蠢的错误:我用的是通用数据采集的配置模板,没有针对PLC数据采集的特点做调整。
通用设备的采集,比如温度、压力这种模拟量信号,数据是一直在变化的,不太会出现长时间0变化的情况。但PLC采集产线数据不一样,设备待机或者暂停生产的时候,产量计数器可能十几分钟都不变。这时候SCADA采集端一看,哎这个点不动了,是不是设备挂了?然后就按超时处理了。
而且我还发现第二个问题:PLC的通讯连接管理也有坑。我用的是S7-1200做采集代理,上位机通过S7协议跟PLC建连接。S7-1200最多支持16个PUT/GET连接,如果采集端频繁断开重连,会把连接数耗尽。有一次现场看了PLC的诊断缓冲区,里面全是”Connection closed by remote partner”的报警。
后来我专门做了一个测试,让一台S7-1200的DB块停止更新,模拟设备停机。结果上位机那边的TCP连接在65秒后断开,然后立即尝试重连,重连成功后数据正常,等数据再静止65秒又断了。如此反复。每个重连周期大概8到12秒,这期间的数据就丢了。
我的解决方案
改了三个地方,问题彻底解决。
第一,把Deadband死区取消了。对于产线计数值和设备状态这种离散量,不需要死区过滤,有变化就上传,没变化就维持上一次的值。
第二,通讯超时时间从60秒调整到了300秒。产线设备暂停生产十几分钟是正常的,给足余量。同时增加了”心跳”机制,在每台PLC的程序里加了一个3秒翻转一次的M位,专门用来做通讯心跳。只要心跳还在跳,系统就知道设备没死,只是在休息。
第三,在SCADA端加了一个”Grace Period”(宽限期)的逻辑:数据不更新15分钟之内不标记离线,只记录一条日志。连续15分钟以上无数据,才认为设备真的离线了,触发报警。
改完之后跑了一周,数据完整性从之前的85%左右直接拉到了99.8%。MES那边终于不再抱怨了。
回头看的感悟
这个坑说实话踩得很低级,但也很典型。做设备数据采集,很多人一上来就装采集软件、配驱动、调通通讯就完事了。但实际上最磨人的是参数调优——超时时间设长了,设备真的挂了不能及时发现;设短了,正常暂停也被当成故障。
现在我做数据采集项目,会比以前多花两天时间专门做一件事:先跟现场的生产主管聊清楚车间的作息规律。什么时间换班、什么时间休息、哪些工位会间歇性停产、哪些设备是连续运行的。把这些搞清楚之后,再针对性地配置通讯参数。
还有一个经验你们记一下:给PLC的数据采集程序里一定要加心跳位。不需要太复杂,一个M位定时翻转,上位机采集端只要检测心跳正常,就知道通讯链路和设备都在正常工作状态。这个心跳是区分”设备离线”和”设备待机”的关键信号。
最后说一句,踩坑不可怕,关键是要把解决思路记下来。这次之后我把通讯参数的配置模板做成了一个检查清单,每次新项目上线前一条条过,后面再也没出过类似的问题。
你们做数据采集的时候遇到过什么奇奇怪怪的问题?来评论区分享一下,大家一起长经验。