接手一台老设备,打开程序一看,我人傻了
上个月被派去给一个化工厂做设备改造。设备是2012年上的,德国原装进口的西门子S7-300系统。老板说:”程序不改,就加个数据上云的功能,把温度压力流量这些数据传到中控室。”
打开编程软件,连上PLC,上传程序。然后我盯着屏幕看了十分钟没动——十万多步的程序,一个字的注释都没有。
就那种感觉,跟打开一个没标路牌的地图一样。满屏幕的DB块地址,M0.0到M200.7,FC块的管脚参数全靠猜。有一段程序大概是做PID控制的,但我看了半小时才敢确定——因为变量名是DB100.DBD4这种,鬼知道它控制的是反应釜温度还是管道压力。
我问前同事要图纸,他说”早没了,那台设备当年是德国人调的,人家走的时候也没留文档啊。”
这场景你们熟不熟?
我估计十个搞PLC的,八个遇到过这种烂摊子。老设备、没注释、没图纸、编程的人早跑路了。谁接手谁头疼。
折腾了三天的老办法
一开始还是按老办法。对着程序一段一段看,看到有规律的逻辑块就在Excel里记一下:FC10看着像模拟量采集,FC20像是报警逻辑,DB100应该是配方参数。
搞了三天,标记了大概三成的程序。效率低得想哭。而且关键是——你不敢乱猜。猜错了,把M5.0注释成”启动按钮”结果人家是”急停复位”,这口锅你背得起吗?
正烦着的时候,微信上一个兄弟跟我说:”最近AI不是挺火的吗,你把程序导出来喂给AI让它给你加注释啊。”
我当时第一反应是——闹呢?AI懂个P的PLC程序。但转念一想,反正试试又不要钱。
于是我把程序导成STL源文件(STEP 7里可以导出),然后开始了我的AI注释实验。
第一次尝试:直接扔给AI,结果翻车了
我直接把STL文本扔给AI:
A( L #DB_TEMP_AVG L 1.500000e+002 >=R ) A( L #DB_TEMP_AVG L 1.800000e+002我说:"这段程序帮我加注释。"
AI回答:"这是一段温度比较逻辑,当平均温度大于等于150且小于180时,设置低温报警。"
嗯?还真说对了。继续试了几段,大部分都能讲出个大概。我心里有点数了,觉得有戏。
但问题马上就来了——AI不懂PLC的地址映射。它看到DB100.DBD0和DB100.DBD4,不知道这两个地址在物理上对应什么传感器。它猜出来的东西有时候对,有时候完全是在一本正经地胡说八道。
比如它把一段MOVE指令注释成"将数据移动到输出缓冲区",结果我查了那个地址的交叉引用,发现是指向一个临时变量,根本不是什么输出缓冲区。纯属瞎编。
第一次尝试的结果:能用,但不敢全信。每个注释都得人工复核一遍,相当于只省了一半的功夫。
第二次尝试:我给AI喂了张"地图"
我想了个办法——把项目的符号表和变量表也一起导出来喂给AI。符号表里不是有DB块的命名和注释吗?比如"DB100_ReactorTemp"这种。虽然原程序没注释,但设备厂家好歹在符号表里写了点东西。
我做了个prompt模板:
你是一个有20年经验的PLC编程专家。我会给你三段内容: 1. STL源代码 2. 符号表(变量地址到名称的映射) 3. DB块定义(数据结构) 请逐段分析程序,按以下格式输出: [FC块号] [功能说明] [网络号] [每段程序的作用] [地址引用] [注释说明物理含义] 注意:不确定的不要乱猜,标注"待确认"这下效果好了很多。AI知道了DB100.DBD0对应的是"反应釜温度",DB100.DBD4对应的是"反应釜压力",分析出来的注释靠谱多了。
打个比方——第一次是让一个外地人看地图,地图上只有经纬度坐标。第二次是给这个外地人标上了"天安门""故宫""三里屯"。能看懂了。
我挑了一段之前困扰了我一个下午的报警逻辑试了一下。那段程序有二十多行,交叉引用了好几个DB块和M地址,我之前看了一个小时才理清楚。AI花了十几秒,给出的注释虽然有一两处小错误,但整体逻辑分析是对的。我复核了一遍,把几个"待确认"的地方改对,就完事了。
踩到的坑和避坑方法
实验了两周,我总结了几个用AI给PLC程序加注释必须注意的事:
第一,AI对地址映射全靠猜。没有符号表的情况下,AI不知道DB1.DBX0.0和DB1.DBX0.1哪个是启动信号哪个是停止信号。所以尽量把符号表和DB定义喂给它,否则注释质量打对折。
第二,AI对中文支持要看模型。我试了三个模型,只有两个支持把注释写成中文。有一个模型写出来的注释是英文的,还有一个写着写着变成乱码。选模型的时候先试一小段。
第三,同步逻辑AI经常理解错。PLC程序里的OB1主循环、OB35定时中断,AI有时候分不清哪个先跑。特别是涉及多个OB块之间的数据交换,AI经常把因果关系搞反。比如我有一段程序是用OB35里的值去覆盖OB1里的变量,AI说成"OB1将变量传递给OB35",正好反了。
第四,梯形图转STL再给AI,会丢信息。梯形图里有些图形化的逻辑(比如置位优先和复位优先),转成STL后语法上几乎一样,但语义不同。AI识别不出来。所以如果是梯形图为主的项目,建议直接在编程软件里看了再跟AI说。
第五,AI对工艺逻辑完全不懂。它不知道反应釜应该先升温再保温最后降温,也不知道泵启动前要先开阀门。所以AI给工艺段程序加的注释经常在瞎猜工艺目的。这一块必须人工把关。
最后的成果:十万步程序,一人干了一个月
说说最终效果吧。
我给那套S7-300的程序——十万多步——分段喂给AI加注释。我同时也在人工复核。AI先给初稿,我复核修正,然后把确认好的文本写回程序里。
效率对比:以前纯人工,我一天大约能注释3000步(还要中断做别的活)。用了AI辅助,一天能干8000到10000步。算下来,原来要干一个多月的事,现在不到两周就搞定了。
当然不是AI自己干的,我在旁边一直盯着。但整体来说,省了至少一半以上的时间。
评论区肯定有人会说"AI写的你敢信?"——不敢。但AI给的初稿,加上你的专业知识复核,确实能快很多。关键是你要知道AI哪里会错,哪里不会错。就像你带一个刚毕业的徒弟,他写的程序你肯定也要审,但他帮你干了粗活不是吗?
最后给那个化工厂交付的时候,程序的注释覆盖率从0%做到了95%以上。对方老板挺满意,说以后维护不用再求爷爷告奶奶找当年的老工程师了。
我倒是觉得,最值钱的东西不是那95%的注释——而是我在注释过程中把这套程序吃透了。以前没人敢碰的老程序,现在我可以放心地改、放心地升级。
你们有没有接过这种没注释的老程序?最长花了多久才看懂?评论区说说你的经历?