1. 为什么入行1-3年的PLC工程师最需要一份“实战错题本”
干了十几年工控,带过的徒弟少说也有二十来个。我发现一个特别有意思的现象:刚入行1到3年的PLC工程师,技术资料存了上百个G,网盘里全是手册、例程、视频教程,但真到了现场,一个简单的模拟量跳变就能让他们在电柜前蹲一下午。问题出在哪儿?不是理论没学透,是缺少一份把“书本知识”翻译成“现场动作”的对照表。
这份90条实战经验,就是我在这些年项目里一条一条攒下来的“错题本”。它不跟你讲PID的微分方程怎么推导,而是告诉你:为什么你写的PID在实验室调得好好的,到了现场一投运就震荡;为什么你的程序在模拟器里跑得飞起,下载到PLC里却报通讯超时;为什么老工程师看一眼你的梯形图就说“这程序带病”。
这篇文章适合谁看?如果你刚入行,能独立写一些逻辑但遇到模拟量、通讯、运动控制就发怵,那这90条里至少有60条能直接帮你省下加班时间。如果你已经干了两年多,能独立做小项目了,那剩下的30条关于程序架构、标准化、调试策略的内容,就是你从“能干活”到“干得漂亮”的分水岭。我会把最核心的几条展开讲透,剩下的以清单形式列出来,方便你直接抄作业。
注意:下面所有经验都基于一个前提——你用的是主流品牌的中小型PLC,梯形图和SCL/ST混用。不同品牌指令有差异,但底层逻辑是通的。
2. 硬件接线与信号采集:那些手册上不会写的“玄学”问题
2.1 数字量输入:为什么你的按钮信号会“抖”到怀疑人生
新手最容易忽略的是输入滤波。PLC的DI模块一般都有默认滤波时间,通常是10ms左右。但如果你接的是机械触点按钮,尤其是那种用了两三年的老按钮,按下瞬间的抖动可能持续20ms以上。这时候如果你在程序里用上升沿直接触发动作,运气好一次成功,运气不好就是按一下设备动两下。
我的做法是:程序里再做一个软件滤波。具体操作很简单,用一个定时器,检测到输入信号后延时50ms再确认。别小看这50ms,它能过滤掉90%的机械抖动。但注意,如果是急停信号,绝对不能加滤波,必须硬件常闭直接切断回路,这是安全底线。
还有一个坑:PNP和NPN混接。有些传感器是PNP输出,有些是NPN,如果你没注意,把NPN的传感器接到PNP的PLC输入上,信号永远是反的。更麻烦的是,有些PLC的输入公共端可以接正也可以接负,但一旦接错,整个模块的输入状态全乱。我见过一个项目,调试了一整天,最后发现是公共端接反了。
2.2 模拟量采集:4-20mA信号为什么总在跳
模拟量是新手最大的噩梦。你接了一个压力变送器,4-20mA信号,PLC读上来的数值一直在±50跳。你以为是干扰,加了磁环,换了屏蔽线,还是跳。这时候先别急着怀疑干扰,先检查三个地方:
第一,模块的滤波设置。很多PLC的模拟量模块有硬件滤波参数,默认可能是无滤波或者低滤波。你把它设成“强滤波”或者“50Hz抑制”,跳变立刻小一半。第二,信号负端和模块电源负端是否共地。如果不共地,会形成一个地环路,干扰直接串进来。第三,变送器的供电是否独立。如果变送器和变频器共用一路24V电源,变频器一启动,模拟量就跳。这时候给变送器单独加一个隔离电源,问题就解决了。
还有一个经典问题:量程换算。4-20mA对应0-1000,但PLC读上来的原始值是0-27648(以某品牌为例)。很多人直接写(raw/27648)*1000,结果发现小数点后全是误差。正确的做法是用浮点数运算,并且先减去6400(4mA对应的值),再除以(27648-6400),最后乘以量程。这样精度能提高一个数量级。
2.3 输出接线:继电器输出和晶体管输出的选择陷阱
选型的时候,很多人只看点数够不够,不看输出类型。继电器输出可以接交流负载,但寿命有限,频繁动作的场合一年就得换模块。晶体管输出响应快、寿命长,但只能接直流负载,而且有漏电流。我见过一个案例:用晶体管输出直接驱动一个24V的中间继电器,结果继电器不释放,一直嗡嗡响。原因是晶体管有漏电流,虽然很小,但足以让高灵敏度的继电器保持吸合。解决办法是并联一个泄放电阻,或者换成继电器输出模块。
提示:如果一个项目里既有频繁动作的直流负载,又有交流负载,最稳妥的方案是全部用继电器输出模块,然后在频繁动作的负载前加一个中间继电器。中间继电器坏了换一个几十块钱,模块坏了换一个几百上千。
3. 程序逻辑与架构:从“能跑”到“好维护”的鸿沟
3.1 为什么你的程序别人改不动
入行1-3年的人写程序,最大的问题是没有架构意识。所有逻辑堆在Main里,一个网络接一个网络,从头写到尾。你自己写的时候思路清晰,但过两个月让你改一个参数,你得从头看到尾才能找到那个参数在哪儿。别人接手你的程序,更是灾难。
我的建议是:按功能分块,按设备分层。具体做法是,每个独立的设备(比如一台电机、一个气缸)写一个FC或FB,输入输出参数定义清楚。主程序只负责调用和协调。这样你改一台设备的逻辑,不会影响其他设备。而且调试的时候可以单独调用某个FB,不用整个程序跑一遍。
还有一个细节:变量命名。别用M0.0、M0.1这种地址命名,用Conveyor_Start、Conveyor_Fault这种有意义的符号名。现在的PLC都支持符号寻址,你定义好符号表,程序可读性直接翻倍。我见过一个项目,程序写了三千多步,变量全是M和I,后来原作者离职了,接手的人花了两个星期才理清楚逻辑。
3.2 状态机:让复杂逻辑变得像流程图一样清晰
很多新手写顺序控制,喜欢用一堆定时器和计数器串起来。设备少的时候还行,设备一多,逻辑就乱成一团麻。状态机是解决这个问题的利器。简单说,就是把设备的运行分成几个状态:待机、启动中、运行、暂停、故障。每个状态只做该状态该做的事,状态之间的切换条件写清楚。
举个例子:一个简单的气缸动作,可以分成“原位等待”“伸出中”“伸出到位”“缩回中”“缩回到位”五个状态。每个状态用一个整数表示,程序里用CASE语句切换。这样你调试的时候,直接看当前状态号就知道设备走到哪一步了。而且加一个急停状态,所有状态都能跳过去,逻辑非常清晰。
3.3 定时器和计数器的隐藏坑
定时器的时间基准是个容易被忽略的参数。有些PLC的定时器是1ms、10ms、100ms、1s可选,如果你选错了基准,定时时间会差十倍。更坑的是,有些品牌的定时器编号和基准是绑定的,比如T0-T199是100ms,T200-T255是10ms。你写T0 K100,以为是100ms,其实是10秒。
计数器也有坑。如果你用计数器做产量统计,断电后计数器值会丢失。这时候需要用保持型寄存器,或者把计数值存到EEPROM里。但EEPROM有写入次数限制,不能每个产品都写一次。我的做法是:正常计数用普通寄存器,每生产100个或者断电前,把值存到保持寄存器里。
4. 通讯与网络:那些让你半夜被叫去现场的故障
4.1 Modbus通讯:为什么读不到数据
Modbus是工控里最常用的通讯协议,但也是问题最多的。新手最常遇到的是站号、波特率、校验位不匹配。这三个参数必须和从站设备完全一致,差一个都不行。我建议你做一个表格,把所有从站设备的参数列出来,调试的时候一个一个对。
还有一个隐蔽的问题:寄存器地址偏移。Modbus协议里,寄存器地址是从1开始的,但很多PLC的地址是从0开始的。比如你要读从站的40001寄存器,在PLC里可能要写40000或者0。不同品牌处理方式不一样,必须看手册确认。
通讯超时也是常见问题。如果从站响应慢,而你把超时设得太短,就会频繁报错。我的经验是:超时时间至少设成从站最大响应时间的2倍。如果从站手册没写响应时间,就设500ms起步,再根据实际情况调整。
4.2 以太网通讯:IP地址冲突的排查思路
以太网通讯比串口快,但问题也不少。最常见的是IP地址冲突。你设了一个IP,ping不通,以为是网线问题,换了网线还是不行。这时候先别急着换设备,用电脑直连PLC,看能不能ping通。如果能ping通,说明PLC没问题,问题在网络上。如果ping不通,再检查IP是否和电脑在同一网段。
还有一个坑:子网掩码。很多人只改IP,不改子网掩码。比如IP是192.168.1.10,子网掩码是255.255.255.0,这是对的。但如果IP是192.168.1.10,子网掩码是255.255.0.0,那它和192.168.2.10就在同一网段了,可能会冲突。所以改IP的时候,子网掩码也要一起检查。
4.3 通讯负载率:别让你的网络堵车
一个网络上挂的设备越多,通讯负载率越高。如果负载率超过60%,通讯就会不稳定。我见过一个项目,一条Modbus总线上挂了二十多个从站,轮询一圈要好几秒,操作员按了按钮要等半天才有反应。解决办法是分网段,或者提高波特率,或者优化轮询策略,把实时性要求高的设备单独轮询。
注意:轮询的时候,不要每个扫描周期都发请求。用一个定时器,比如每100ms发一次请求,给从站足够的响应时间。如果从站没响应,不要死等,直接跳过,下一个周期再试。
5. 调试与排错:老工程师的“望闻问切”
5.1 在线监控:怎么看波形图
很多新手调试的时候只看变量值,不看波形。波形图能告诉你很多变量值看不出来的信息。比如一个模拟量信号,你看数值是稳定的,但波形图上能看到它有周期性的尖峰。这个尖峰可能就是干扰源,或者某个设备启动时的冲击。
看波形图的时候,重点看跳变沿和周期性。跳变沿太陡,可能是信号抖动;周期性波动,可能是某个设备在周期性动作。把波形图和设备动作时间对照起来看,很快就能定位问题。
5.2 强制变量:什么时候用,什么时候千万别用
强制变量是调试的利器,但也是事故的源头。调试的时候可以用,但一定要记录。我见过一个事故:调试的时候强制了一个输出,忘了取消,结果设备一上电就动作,差点伤到人。所以我的习惯是:强制变量的时候,在程序里加一个明显的标志位,或者在HMI上显示“有强制”,提醒自己和其他人。
还有一个原则:永远不要强制安全信号。急停、安全门、光幕这些信号,绝对不能强制。如果你为了调试方便强制了安全信号,那就是在拿生命开玩笑。
5.3 程序备份:别等硬盘坏了才后悔
我见过太多人,程序只存在电脑桌面上,电脑一坏,程序全没了。程序备份必须做到三点:第一,每次修改后,另存一个版本,文件名带日期和修改内容;第二,定期把程序拷贝到U盘或者移动硬盘;第三,重要项目的程序,打印一份纸质版存档。
还有一个细节:备份的时候要连注释一起备份。有些PLC下载程序的时候可以选择不下载注释,如果你只备份了下载文件,没有注释,以后想改程序就麻烦了。所以备份的时候,一定要把源程序(带注释的)和下载文件(不带注释的)都备份。
6. 90条实战经验速查清单
下面这90条,是我从这些年项目里挑出来的,每一条都对应一个具体的坑或者技巧。因为篇幅关系,前面已经展开讲了最核心的几条,剩下的以清单形式列出来,方便你快速查阅。
6.1 硬件与接线(1-20条)
- DI模块的公共端接正还是接负,必须看手册确认,接错会烧模块。
- 急停信号必须用常闭触点,硬件直接切断,不能只靠程序。
- 模拟量信号线必须用屏蔽双绞线,屏蔽层单端接地。
- 变频器输出线不能和信号线走同一个线槽,交叉时尽量垂直。
- 24V电源的容量要留30%余量,别刚好够用。
- 继电器输出模块接感性负载时,必须加续流二极管。
- 晶体管输出模块接继电器时,注意漏电流问题。
- 输入滤波时间根据信号类型设置,按钮50ms,传感器10ms。
- 模拟量模块的滤波参数要设置,默认值往往不够。
- 变送器供电尽量独立,不要和变频器共用电源。
- 接地电阻要小于4欧姆,接地线尽量粗。
- 电柜内的走线要分槽,动力线和信号线分开。
- 传感器安装要避开强磁场和热源。
- 编码器信号线要用屏蔽线,屏蔽层接编码器侧。
- 通讯线要用双绞线,A接A,B接B,不能交叉。
- 终端电阻只在总线两端接,中间设备不接。
- 电柜风扇要定期清理,灰尘多了会影响散热。
- 备用I/O点要留10%-20%,方便以后扩展。
- 模块的电源和信号电源最好分开,避免干扰。
- 接线端子要拧紧,虚接是很多“玄学”问题的根源。
6.2 程序逻辑(21-45条)
- 变量命名用符号名,别用M0.0这种地址。
- 每个设备写一个FB,输入输出参数定义清楚。
- 主程序只负责调用,不写具体逻辑。
- 顺序控制用状态机,别用一堆定时器串。
- 状态号用整数,CASE语句切换,清晰明了。
- 急停状态要能覆盖所有状态,优先级最高。
- 定时器的时间基准要确认,别选错。
- 计数器断电保持用保持寄存器,别写EEPROM。
- 模拟量换算用浮点数,先减偏移再除量程。
- PID参数先调P,再调I,最后调D。
- PID输出要限幅,防止积分饱和。
- 手动/自动切换要无扰,切换时输出保持。
- 报警要分等级,紧急的用红色,一般的用黄色。
- 报警要记录时间和值,方便事后分析。
- 程序里加一个“调试模式”标志位,方便强制变量。
- 强制变量要有明显提示,HMI上显示“有强制”。
- 永远不要强制安全信号。
- 程序修改后要另存版本,文件名带日期。
- 重要程序打印纸质版存档。
- 备份程序要连注释一起备份。
- 程序里加看门狗,防止死循环。
- 通讯程序要加超时处理,不能死等。
- 轮询策略要优化,实时性高的设备单独轮询。
- 程序里加运行时间统计,方便维护。
- 程序里加版本号,方便确认下载的是哪个版本。
6.3 通讯与网络(46-65条)
- Modbus站号、波特率、校验位必须完全一致。
- 寄存器地址偏移要看手册确认,不同品牌不一样。
- 通讯超时设成从站最大响应时间的2倍。
- 以太网IP地址不能冲突,改IP时子网掩码一起改。
- 通讯负载率不要超过60%,超了要分网段。
- 轮询不要每个扫描周期都发,用定时器控制。
- 从站没响应不要死等,跳过下一个周期再试。
- 通讯线用双绞线,A接A,B接B。
- 终端电阻只在总线两端接。
- 通讯距离太长要加中继器。
- 变频器通讯干扰大,通讯线要远离动力线。
- 无线通讯要考虑延迟和丢包,重要信号要有确认机制。
- 通讯程序要加错误计数,超过阈值报警。
- 从站设备要定期巡检,提前发现通讯质量下降。
- 通讯参数要记录在案,方便以后维护。
- 不同品牌的Modbus地址映射不一样,要查手册。
- 以太网通讯要用交换机,不要用HUB。
- 交换机要选工业级的,商用级的不稳定。
- 网线要选超五类以上,水晶头要压好。
- 网络拓扑要简单,不要级联太多层。
6.4 调试与排错(66-90条)
- 调试前先检查硬件接线,再检查程序。
- 在线监控要看波形图,不只看变量值。
- 波形图的跳变沿和周期性是重要线索。
- 强制变量要记录,调试完必须取消。
- 程序备份要定期做,别等硬盘坏了才后悔。
- 调试的时候带一个笔记本,记录每一步操作。
- 遇到问题先问“上次改了什么”,往往能找到原因。
- 不要同时改多个地方,一次只改一个,改完验证。
- 设备动作异常先看气源、电源、液压,再看程序。
- 传感器信号异常先看指示灯,再看程序。
- 通讯故障先看物理层,再看协议层。
- 模拟量跳变先查接地和屏蔽,再查程序。
- 程序跑飞先看看门狗和中断,再看逻辑。
- 调试的时候用示波器看信号质量,比万用表准。
- 电柜里放一个备用模块,坏了直接换。
- 调试记录要写清楚,方便以后查。
- 遇到“玄学”问题,先检查接线端子是否拧紧。
- 设备运行声音异常,先停机检查,别硬撑。
- 调试的时候不要一个人,至少两个人,互相照应。
- 带电插拔模块前,先确认是否支持热插拔。
- 换模块前先断电,等电容放电完再操作。
- 调试完成后要跑空载和负载测试,不能只跑空载。
- 交付前要培训操作员,告诉他们哪些不能动。
- 交付后要定期回访,了解设备运行情况。
- 每次项目结束写总结,把坑记下来,下次不再踩。
7. 从“能干活”到“干得漂亮”的分水岭
写了这么多,其实最想说的是:PLC工程师的成长,不是看你写了多少行程序,而是看你踩过多少坑,并且把坑填上了。入行1到3年,正是从“能干活”到“干得漂亮”的关键期。这个阶段,你不需要追求多高深的技术,而是要把基础打牢,把常见的坑都踩一遍,然后记住它们。
我见过太多人,干了三年还在重复第一年的经验,遇到问题还是靠试。也见过一些人,每做一个项目就总结一次,三年下来,经验值顶别人五年。区别就在于,你有没有把经验变成自己的东西。
这份90条清单,你可以直接拿去用,但更重要的是,你要在自己的项目里继续积累。每次遇到问题,解决了之后,问自己三个问题:这个问题为什么会发生?我下次怎么避免?如果别人遇到同样的问题,我怎么告诉他?把答案记下来,一年之后,你也有自己的90条了。
最后分享一个小技巧:我习惯在手机备忘录里建一个“踩坑记录”,每次遇到问题就记一条,解决了的标绿,没解决的标红。标红的定期回顾,往往过一段时间再看,突然就有思路了。这个习惯坚持了十几年,现在我的备忘录里有上千条记录,它们比任何手册都管用。