在工业自动化领域,有一个残酷的真相:90%的上位机故障,都不是因为功能写错了,而是因为异常没处理好。
我见过太多这样的项目:功能测试完美通过,一到产线就三天两头崩溃;PLC偶尔断一次网,整个上位机就卡死不动;相机闪一下,程序就直接退出,留下满屏的红叉和停转的产线。去年我接手一个烂尾项目,客户说他们的上位机平均每天崩溃3次,每次崩溃都要停线半小时重启,一个月下来光停线损失就超过100万。
深入排查后我发现,整个程序里只有不到10个try-catch,而且全是这样写的:
try{plc.WriteD(0,1);}catch{// 什么都不做}异常被直接吞掉,没有日志,没有报警,没有任何处理。当PLC断连时,写操作会抛出异常,然后程序就进入了未知状态,最终导致崩溃。
工业现场的环境永远是恶劣的:网络波动、电磁干扰、设备掉线、电源不稳……这些都是常态,而不是例外。一个合格的工业上位机,不是永远不会遇到异常,而是遇到异常后能够自动恢复,不影响产线的正常运行。
经过8年的工业落地实践,踩过无数坑之后,我总结出了C#上位机异常处理与自动重连的8个核心实现要点。这套方案已经在50多个工业项目中得到了验证,能够将系统的可用性从95%提升到99.99%,基本杜绝了因异常导致的产线停线。
一、传统异常处理的三大致命缺陷
绝大多数开发者写的异常处理,都只是在"应付差事"。他们只处理了自己能想到的异常,而忽略了工业现场可能发生的所有意外。
1.1 一刀切的try-catch,吞掉所有异常
这是最常见也是最致命的错误。很多人为了不让程序崩溃,在最外层加一个大的try-catch,吞掉所有异常。这样做确实能让程序不退出,但会导致程序进入未知状态,数据错乱,逻辑混乱,最终造成更严重的后果。
我曾经遇到过一个项目,因为吞掉了PLC写操作的异常,导致不合格的产品流到了客户手中,最终赔偿了几百万。
1.2 没有自动恢复机制,必须人工干预
很多上位机在遇到通信中断时,只会弹出一个"连接失败"的对话框,然后就什么都不做了,必须等工人过来点击确定,手动重启程序。
在24小时连续运行的产线上,半夜里一个小小的网络波动,就可能导致整个产线停一整夜,直到第二天早上工人上班才发现。
1.3 日志不全,问题无法排查
当程序出现问题时,日志是唯一的排查依据。但很多上位机的日志要么什么都不记,要么只记一句"发生错误",没有时间、没有模块、没有上下文信息,根本无法定位问题。
我曾经花了一周时间排查一个随机崩溃的问题,最后发现是因为串口偶尔会返回一个非法字节,而程序没有处理这个情况。如果当时日志里记录了收到的字节内容,问题几分钟就能解决。
二、工业级异常处理整体架构
工业级的异常处理不是零散的try-catch,而是一个完整的体系。我们采用分层异常处理架构,将异常分为三个层次,每层处理自己能处理的异常,向上抛出不能处理的异常。