ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PLC工程师实战错题本:90条现场踩坑经验与避坑指南

PLC工程师实战错题本:90条现场踩坑经验与避坑指南

1. 为什么入行1-3年的PLC工程师最需要一份“实战错题本”

干了十几年工控,带过的徒弟少说也有二十来个。我发现一个特别有意思的现象:刚入行半年的新人,反而敢问问题,因为他们知道自己不会;干了五六年往上的老手,遇到问题也能凭经验摸出个大概。最尴尬的就是入行1到3年这个阶段——基础指令都会了,梯形图也能写,但一到现场就各种翻车,而且翻车之后还不好意思问,因为觉得自己“应该会”。

这个阶段的人最缺的其实不是知识,而是一份踩坑记录。学校里教的是“电机正反转怎么接线”,但现场遇到的是“为什么这个光电开关在下午三点之后就开始误动作”。前者是知识,后者是经验。知识可以看书,经验只能靠踩坑,或者靠别人把坑指给你看。

我自己刚入行那会儿,在一个包装线上调伺服,位置怎么都对不上,折腾了整整两天,最后发现是机械联轴器的键槽装反了。这种事没人会写在手册里,但每个老工程师都能给你讲出一堆类似的。所以我把这些年积累的、带徒弟过程中反复被问到的、以及自己在现场摔过的跟头,整理成了这90条实战经验。它们不按教科书章节排列,而是按你真正会遇到问题的顺序来组织——从选型、接线、编程、调试到维护,一条一条说清楚。

这篇文章会挑其中最有代表性的几类问题展开讲,不是简单罗列90条就完事,而是把每条经验背后的“为什么”讲透。你看完之后,至少能在下次遇到类似情况时,脑子里能蹦出一句:“哦,这个坑有人踩过,我知道大概往哪个方向查。”

2. 硬件选型与接线阶段:那些手册上不会写的判断依据

2.1 输入输出点数的“隐藏消耗”怎么算

新手最常犯的错误,就是按设备实际需要的I/O点数去选PLC,比如算出来需要14个输入、10个输出,就选一个16入16出的型号。结果程序写到一半发现点数不够了,因为很多“隐藏消耗”在前期根本想不到。

我自己的经验是:实际需要的I/O点数乘以1.5,再往上取整到最近的常见型号。为什么是1.5?因为你要预留至少10%的备用点给后期改造,还要考虑一些“看起来不需要但实际会占点”的情况。比如一个气缸,你以为只需要一个输出点控制电磁阀,但如果要检测气缸的两个到位状态,那就还要占两个输入点。再比如,很多安全回路、急停回路、复位按钮,虽然不参与逻辑控制,但往往也要接入PLC或者至少占用模块通道。

还有一个特别容易被忽略的:高速计数器和脉冲输出会占用普通I/O的物理通道。比如某款PLC标称有8个输出点,但其中2个是晶体管输出用于脉冲,如果你用了这两个点做PTO(脉冲串输出),那它们就不能再当普通输出用了。选型的时候一定要看清楚模块的通道分配表,别只看总数。

提示:如果项目有扩展需求,优先选带扩展接口的CPU,而不是一开始就买点数很大的单体机。扩展模块可以后期加,单体机点数不够就只能换整机,成本差好几倍。

2.2 传感器选型:NPN和PNP到底怎么选

这个问题几乎每个新手都问过。简单说,NPN输出的是低电平有效(漏型),PNP输出的是高电平有效(源型)。但实际选型的时候,不是看你喜欢哪个,而是看你的PLC输入模块支持哪种接法。

大部分日系PLC(比如三菱、欧姆龙)的输入模块是漏型输入,也就是公共端接24V正极,输入点接传感器信号线,传感器导通时把信号线拉到0V。这种接法配NPN传感器最方便。欧系PLC(比如西门子)很多是源型输入,公共端接0V,输入点接传感器信号线,传感器导通时输出24V。这种配PNP传感器。

但现实情况往往更复杂:一个项目里可能既有NPN又有PNP的传感器,因为不同厂家的标准不一样。这时候你有两个选择:一是选支持源型/漏型切换的输入模块,二是加中间继电器转换。我个人的建议是尽量统一成一种类型,因为混用之后排查故障会非常痛苦——你永远记不清哪个传感器是哪种接法。

还有一个坑:两线制传感器和PLC输入模块的漏电流问题。两线制传感器在关断状态下仍然有微弱的漏电流通过,如果这个漏电流足够大,PLC的输入点可能会误判为ON。特别是当输入模块的导通阈值比较低的时候。解决办法是在输入点并联一个泄放电阻,或者直接选用三线制传感器。这个坑我在一个水处理项目上踩过,当时液位开关明明没动作,PLC输入灯却微微亮着,查了半天才反应过来是漏电流。

2.3 电源容量:别让PLC“饿着肚子干活”

PLC的电源容量计算,很多人只算了CPU和扩展模块的背板电流消耗,忘了算外部负载的电流。比如输出模块驱动继电器线圈,每个线圈可能要几十毫安,如果同时有8个输出点动作,那就是几百毫安。再加上传感器供电、触摸屏供电,很容易超出开关电源的额定容量。

我的做法是:把所有需要24V供电的设备列一张表,标出每个设备的额定电流和同时工作的最大数量,然后总和乘以1.3的余量。开关电源选型的时候,还要注意它的额定电流是在什么温度下测的。很多电源标称5A,但那是在25度环境下的数据,如果电柜内温度到了50度,实际能输出的电流可能只有3.5A左右。所以电柜空间允许的话,电源选大一号没坏处。

另外,PLC的24V输出(如果有的话)最好不要用来驱动外部负载。那个输出通常只有几百毫安的容量,是给内部电路或者少量传感器用的。你拿它去驱动一堆继电器,轻则电源保护,重则烧掉CPU内部的电源模块。我见过一个案例,有人用PLC自带的24V输出接了六个中间继电器,运行了三个月后CPU直接罢工,返厂维修说是电源模块烧了。

3. 编程逻辑中的“想当然”陷阱:从梯形图到实际动作的鸿沟

3.1 扫描周期导致的“幽灵动作”

PLC是循环扫描执行的,一个扫描周期包括输入采样、程序执行、输出刷新三个阶段。新手写程序的时候,往往默认“输入变了输出马上变”,但实际不是这样的。输入信号的变化要等到下一个扫描周期的输入采样阶段才能被读到,输出信号的变化也要等到输出刷新阶段才会真正送到端子。

这个特性在大多数情况下没问题,因为扫描周期通常只有几毫秒到几十毫秒。但在一些特殊场景下会出大问题。比如你用PLC做一个高速计数或者位置捕捉,如果信号持续时间比扫描周期还短,那这个信号可能完全被漏掉。再比如,你在程序里写了“如果X0接通,则Y0接通;如果Y0接通,则X1复位”,这种逻辑在扫描周期的影响下可能会产生你意想不到的时序。

我遇到过一个典型案例:一个分拣系统,用光电开关检测物品通过,然后气缸推料。程序逻辑很简单,光电开关接通就触发气缸动作。但实际运行的时候偶尔会漏推。查了半天发现,光电开关的输出信号只持续了不到5毫秒,而PLC的扫描周期在某些情况下会超过10毫秒(因为程序里有一段复杂的浮点运算)。信号在输入采样阶段没被读到,自然就不会触发动作。解决办法是把光电开关的信号先经过一个高速计数模块或者用中断输入,而不是走普通输入点。

注意:如果你的程序里有大量浮点运算、PID运算或者通信处理,扫描周期会明显变长。这时候要特别小心那些“一闪而过”的信号。

3.2 定时器的“累计误差”和“刷新机制”

PLC的定时器不是硬件定时器,而是靠扫描周期累加计时的。这意味着定时器的实际定时时间会略大于设定时间,因为每个扫描周期都会产生一点误差。对于一般的延时控制,这点误差无所谓,但如果你用定时器做精确的时间控制,比如每100毫秒发一个脉冲,那累计误差就会越来越明显。

更隐蔽的问题是定时器的刷新机制。不同品牌的PLC,定时器的刷新方式不一样。有的定时器在达到设定值后,当前值会保持,直到复位信号到来;有的定时器在达到设定值后会自动复位重新开始计时。如果你不清楚用的是哪种,程序逻辑就可能出错。

我自己的习惯是:对于需要精确时间控制的场合,用系统时钟脉冲或者中断程序,而不是普通定时器。比如西门子的OB35循环中断,可以设置固定的中断周期,不受扫描周期影响。三菱的PLC可以用特殊继电器(比如M8013是1秒时钟脉冲)来触发动作。这些方式比用定时器累加要可靠得多。

还有一个新手常犯的错误:在同一个程序里重复使用同一个定时器编号。比如在子程序里用了T0,在主程序里也用了T0,两个地方都在控制这个定时器,结果就是谁最后执行谁说了算。这种bug特别难查,因为你看主程序逻辑是对的,看子程序逻辑也是对的,但合在一起就是不对。解决办法是给每个子程序分配独立的定时器编号段,比如子程序1用T0-T9,子程序2用T10-T19。

3.3 模拟量处理的“量程转换”到底怎么算

模拟量输入模块读回来的原始值是一个整数,比如0到27648(西门子)或者0到4000(三菱)。你需要把它转换成实际的物理量,比如温度、压力、流量。这个转换公式看起来简单,但实际写程序的时候有几个坑。

第一个坑:量程不是从零开始的。比如一个压力变送器,量程是0到10bar,输出4到20mA。对应的PLC原始值,4mA对应的是5530(西门子S7-1200的0-20mA量程),20mA对应的是27648。所以转换公式不是简单的“原始值除以27648乘以10”,而是要先减去4mA对应的偏移量。

第二个坑:过冲和欠量程的处理。如果传感器故障或者线路断了,原始值可能低于5530或者高于27648。这时候如果不做处理,转换出来的物理量就会是负数或者超大值,可能导致误报警或者误动作。我的做法是在程序里加一段限幅逻辑:如果原始值小于5530,就按5530算;如果大于27648,就按27648算。同时输出一个故障标志位,让上位机知道传感器可能有问题。

第三个坑:浮点数运算的精度问题。有些PLC在做浮点运算时会有精度损失,特别是当你的转换公式里有除法的时候。比如你先除以27648再乘以10000,和先乘以10000再除以27648,结果可能不一样。一般来说,先乘后除的精度更高,因为除法会产生小数,小数再参与后续运算会累积误差。

4. 现场调试阶段:那些让你怀疑人生的瞬间

4.1 通信不上?先查这五个地方

PLC和触摸屏、变频器、伺服驱动器之间的通信问题,是现场调试最耗时的环节之一。我总结了一个排查顺序,按这个顺序走,能解决80%的通信故障。

第一,查物理连接。网线水晶头有没有压好?终端电阻有没有接?通信线有没有和动力线走同一个线槽?这些看起来是废话,但我见过太多次因为网线水晶头没压好导致通信时断时续的案例。特别是Profinet或者EtherCAT这种以太网通信,对线缆质量要求很高,普通的网线在电磁干扰大的环境下根本扛不住。

第二,查站号。Modbus通信里每个从站必须有唯一的站号,如果两个从站站号一样,主站就不知道该听谁的。这个错误特别容易发生在复制粘贴配置的时候——你从站1的配置复制到站2,忘了改站号。

第三,查波特率和数据格式。主站和从站的波特率、数据位、停止位、校验方式必须完全一致。我遇到过有人把波特率设成9600,但从站是19200,结果通信指示灯闪都不闪,因为主站发的数据从站根本解析不了。

第四,查通信地址映射。Modbus的寄存器地址有几种表示方式:有的文档写40001,有的写0,有的写1。如果你按40001去读写,但实际设备用的是0基地址,那就会偏移一个寄存器。这个坑几乎每个做Modbus的人都踩过。

第五,查数据字节序。32位数据在Modbus里传输的时候,高低字的前后顺序不同厂家可能不一样。有的先发高字,有的先发低字。如果字节序搞反了,读回来的数据就是完全错误的值。比如浮点数1.0,字节序反了可能变成-2.5之类的奇怪数字。

提示:调试通信的时候,手边备一个USB转485/232的转换器和一个串口调试助手。直接看原始报文,比在PLC程序里猜要快得多。

4.2 伺服电机“嗡嗡”响但不转,问题可能不在参数

伺服调试是很多新手的噩梦。电机通电后嗡嗡响但不转,或者转起来抖动厉害,大多数人第一反应是去调增益参数。但根据我的经验,至少一半的伺服问题不是参数问题,而是机械或者接线问题。

先查机械:联轴器的顶丝有没有拧紧?丝杠的预紧力是不是太大?导轨的润滑是不是到位?我遇到过一个案例,伺服电机带一个丝杠,空载的时候转得好好的,一装上负载就嗡嗡响。查了半天发现是丝杠两端的轴承座不同心,电机转起来之后丝杠别着劲,伺服驱动器检测到转矩波动就报警了。

再查接线:伺服电机的动力线U、V、W有没有接错?编码器的线有没有接反?动力线和编码器线有没有屏蔽接地?特别是编码器线,如果屏蔽层没有接地,或者和动力线捆在一起走,编码器反馈的信号就会受到干扰,驱动器收到的位置信息和实际位置对不上,电机就会乱转或者抖动。

最后才查参数:增益是不是太高了?惯量比设置对不对?滤波时间常数是不是太小了?调参数的时候,先把增益调低,让电机能稳定转起来,再慢慢往上加。一上来就调高增益,电机很容易震荡甚至飞车。

4.3 触摸屏显示“####”或者乱码,别急着换屏

触摸屏上显示“####”通常是因为数值超出了显示控件的位数范围。比如你设置了一个4位数的显示控件,但实际数值是12345,那就会显示“####”。解决办法要么是增加显示位数,要么是在PLC程序里做限幅。

显示乱码则通常是字符编码问题。比如PLC里用的是ASCII码,触摸屏设置的是Unicode,那中文就会显示成乱码。或者通信数据里的字节序搞反了,一个16位的数据高低字节交换了,显示出来的就是完全不相干的字符。

还有一种情况是触摸屏和PLC的地址对不上。比如你在触摸屏上做了一个按钮,关联的是PLC的M10,但PLC程序里实际用的是M100。这种错误在项目后期修改地址的时候特别容易发生——PLC程序改了,触摸屏忘了改。我的习惯是在项目开始的时候就建一个地址分配表,所有用到的地址都登记在表里,PLC和触摸屏都按这个表来,改的时候两边一起改。

5. 程序维护与故障排查:如何快速定位“昨天还好好的”问题

5.1 先问“改了什么”,再查“哪里坏了”

设备突然出故障,操作工跟你说“昨天还好好的,今天就不行了”。这时候你第一句话应该问:“昨天到今天之间,有没有人动过什么东西?” 根据我的经验,至少60%的突发故障都和最近的改动有关——可能是改了程序、换了传感器、调了参数、甚至只是有人打扫卫生的时候碰松了一根线。

如果确认没有改动,那就按“从外到内”的顺序排查:先看电源指示灯亮不亮,再看PLC的RUN灯是不是绿色,再看输入输出指示灯的状态和实际信号对不对得上。很多时候问题就出在最外层——比如一个急停按钮被按下了没复位,或者一个断路器跳闸了没人发现。

我自己的排查习惯是从执行机构往回查。比如气缸不动作,先看电磁阀有没有电,再看PLC输出点有没有信号,再看程序里这个输出点的条件满不满足。这样一步一步往回推,比从头开始查要快得多。

5.2 用“强制”功能要小心,别把自己坑了

PLC编程软件都有强制(Force)功能,可以强制某个输入点ON或者OFF,也可以强制某个输出点ON或者OFF。调试的时候用起来很方便,但强制之后一定要记得取消。我见过太多次因为忘了取消强制,导致设备运行异常的事故。

更危险的是强制输出。你强制一个输出点ON,程序里这个输出点的逻辑条件可能根本不满足,但物理输出端子就是有电。如果这个输出点控制的是一个危险动作,比如机械手下降,那强制输出就可能造成设备损坏甚至人身伤害。

我的做法是:强制之前先想清楚后果,强制之后立刻在纸上记一笔,调试结束前逐条取消。有些PLC软件有“强制列表”功能,能看到当前所有被强制的点,调试完对着列表一个一个取消。这个习惯救过我很多次。

5.3 程序备份:别等硬盘坏了才后悔

这个听起来像是废话,但我真的见过太多人因为没备份程序而抓狂。PLC程序备份要注意几点:第一,备份的时候要连注释一起备份。很多PLC软件默认只备份程序逻辑,不备份符号表和注释。如果你只备份了逻辑,下次打开的时候看到的全是M0.0、M0.1,根本看不懂。第二,备份文件要存至少两个地方。U盘一份,电脑硬盘一份,有条件的话再发一份到自己邮箱。第三,每次修改程序之前先备份。这样万一改出问题了,还能回退到上一个版本。

还有一个细节:不同版本的编程软件可能不兼容。比如你用V15写的程序,用V13可能打不开。所以备份的时候最好把编程软件的版本号也记下来,或者直接连软件安装包一起备份。我吃过这个亏,一个老项目的程序用新版本软件打不开,又找不到旧版本安装包,最后只能重新写了一遍。

6. 那些让我印象深刻的“奇葩”故障案例

6.1 变频器干扰导致PLC输入误动作

这个案例发生在几年前的一个风机控制项目上。设备运行的时候,偶尔会出现某个输入点莫名其妙接通的情况,但对应的传感器明明没有信号。查了程序、换了传感器、甚至换了PLC输入模块,问题依旧。

后来用示波器看输入端的波形,发现每当变频器启动或者加速的时候,输入端就会出现高频干扰信号。原因是变频器的动力线和PLC的信号线走在同一个线槽里,而且距离很近。变频器输出的PWM波形含有丰富的高频谐波,通过线间电容耦合到了信号线上。

解决办法很简单:把动力线和信号线分开走,至少间隔20厘米以上。如果实在分不开,就用屏蔽线,并且屏蔽层单端接地。另外,在PLC的输入点并联一个小电容(比如0.1微法)也能滤掉一部分高频干扰。这个案例让我之后做任何项目都坚持一个原则:动力线和信号线永远分槽走。

6.2 接地不良导致模拟量跳动

模拟量输入跳动是另一个常见问题。一个压力变送器,4到20mA信号,PLC读回来的值一直在上下波动,波动范围大概有几十个计数。换了变送器、换了模块、甚至换了PLC,问题还在。

最后发现是接地问题。这个项目的电柜没有做等电位接地,PLC的模拟量模块地和变送器的地之间存在电位差。这个电位差叠加在4到20mA信号上,导致读回来的值不稳定。解决办法是把PLC的模拟量地、变送器的地、开关电源的地全部接到同一个接地排上,并且这个接地排要真正接到大地。接好之后,模拟量读数立刻就稳定了。

这个案例给我的教训是:模拟量信号对接地非常敏感。如果遇到模拟量跳动的问题,先查接地,再查屏蔽,最后才怀疑模块本身。

6.3 程序里的“死循环”导致PLC停机

PLC的程序是循环执行的,但如果你的程序里有一个循环,而这个循环的退出条件永远不满足,那PLC就会卡在这个循环里出不来。这时候看门狗定时器会超时,PLC报错停机。

我遇到过一个案例:一个配方管理程序,用FOR循环遍历配方数组。正常情况下数组有10个元素,循环10次就退出。但有一次操作员误操作,把配方数量设成了0,循环条件写的是“循环变量小于配方数量”,结果循环变量从0开始,0小于0不成立,循环一次都不执行——这倒没问题。但如果配方数量设成了一个负数,比如-1,那循环变量从0开始,0小于-1不成立,也不执行。真正出问题的是另一种情况:循环变量在循环体内被修改了,导致退出条件永远不满足。

所以写循环的时候一定要小心:确保循环变量在循环体内不会被意外修改,确保退出条件最终一定会满足。如果循环次数可能很大,最好加一个最大循环次数限制,超过就强制退出并报错。

7. 给入行1-3年工程师的几条实在建议

7.1 建立自己的“错题本”

我从入行第二年开始,就养成了一个习惯:每次解决一个故障,就把故障现象、排查过程、根本原因、解决办法记下来。一开始是记在笔记本上,后来记在电脑里。十几年下来,这个错题本成了我最值钱的东西。下次遇到类似问题,翻一翻错题本,往往几分钟就能定位。

错题本不用写得很正式,关键是记下“当时是怎么想的”和“实际是什么问题”之间的差距。比如你以为是传感器坏了,结果是线接错了;你以为是程序逻辑问题,结果是扫描周期导致的。这些“以为”和“实际”之间的差距,就是经验增长的地方。

7.2 学会看手册,但别全信手册

手册是重要的参考资料,但手册上的数据都是在理想条件下测出来的。比如手册说输入模块的响应时间是1毫秒,但实际使用中因为滤波设置、线缆长度、信号质量等因素,响应时间可能是5毫秒甚至更长。手册说通信距离可以达到1200米,但实际在电磁干扰大的工厂环境里,能稳定通信500米就不错了。

所以我的建议是:手册用来查引脚定义、参数范围、接线图,但实际能跑多快、能跑多远,要靠自己在现场试。试的时候留足余量,别卡着手册的极限值用。

7.3 多和机械、电气的人聊天

PLC工程师不能只懂PLC。很多故障的根源在机械或者电气那边,如果你不懂,就会在程序里绕来绕去。比如气缸动作慢,可能是气源压力不够,也可能是电磁阀选型不对,还可能是机械卡涩。你如果只盯着程序看,永远找不到原因。

我自己的习惯是:调试的时候多问机械工程师“这个机构是怎么动的”,多问电气工程师“这个回路是怎么设计的”。了解得越多,排查故障的时候思路就越宽。而且和他们对好关系,下次你怀疑是机械问题的时候,他们才愿意帮你拆开看看。

7.4 别怕问“蠢问题”

入行1到3年的人最容易犯的毛病就是不好意思问问题。觉得这个问题太简单了,问出来会被笑话。但根据我的观察,那些进步最快的,恰恰是敢问“蠢问题”的人。因为很多“蠢问题”背后,其实是基础概念没搞清楚。你今天不问,明天遇到类似的问题还是不会。

当然,问问题之前先自己查一查手册、搜一搜资料,实在搞不定再问。问的时候把现象、你试过的方法、你的猜测都说清楚,这样别人也更容易帮你。最怕的就是一句“PLC不工作了,怎么办”,这种问题没人能回答。

7.5 保持学习,但别追新追得太累

工控行业的技术更新不算快,但也不慢。今天流行Profinet,明天可能就流行EtherCAT;今天用梯形图,明天可能就要用SCL或者ST。保持学习是必须的,但不用每个新技术都追。先把一种PLC玩透,把一种通信协议搞明白,把一种编程语言用熟,然后再去扩展。基础打牢了,学新东西会快很多。

我见过一些人,今天学西门子,明天学三菱,后天学欧姆龙,每个都学了个皮毛,遇到稍微复杂一点的问题就抓瞎。不如先把一个平台吃透,其他的触类旁通。

最后说一个我自己的体会:PLC工程师的价值不在于会写多少种指令,而在于能不能在设备出问题的时候,用最短的时间找到原因并解决。这个能力,靠的就是日积月累的实战经验。这90条经验,每一条背后都是一个或者几个真实的故事。希望它们能帮你少走一点弯路,少熬几个通宵。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进