说实话,入行第三年的时候,我曾经一度怀疑自己选错了方向。倒不是觉得PLC这行没前途,而是发现自己每天都在踩坑——今天程序下载不进去,明天现场通讯莫名其妙断了,后天客户打电话说设备突然停机。带我的老师傅忙得脚不沾地,很多问题只能自己去翻手册、上论坛找答案。后来我把这些踩过的坑、绕过的弯,一条条记进笔记里,慢慢整理出一套自己的排查清单。从输入输出接线到通讯协议,从仿真调试到宕机处理,前前后后攒了90条。
我打算把这90条按主题分批放出来,每天更新一期。今天是第一批,先更21条。内容覆盖编程习惯、通讯调试、仿真工具、品牌兼容、设备稳定性这几个方向,适合入行1到3年的PLC工程师,也适合刚从学校出来还在摸索现场的同行。已经有一定经验的老师傅,可以当作查漏补缺的清单翻一翻,里面有一部分是平时手册里不会明说的细节。
1. 入行头三年,先练的其实是这几种能力
很多新人一开始学PLC,第一件事就是找视频、背指令,恨不得一个月把三菱、西门子、汇川、倍福全学会。但真到了项目里,大概率会碰一鼻子灰。原因很简单:PLC工程师的核心技能不是写代码,而是把现场的工艺需求翻译成程序逻辑,再把程序变成稳定运行的设备。指令表背得再熟,看不懂设备动作流程,照样写不出一段能用的程序。
1.1 编程语言选择:先吃透一台设备,再谈第二门语言
这不是劝你从一而终,而是说1-3年这个阶段,精力太分散是大忌。不同品牌的PLC,编程思路确实有差别,但底层逻辑是共通的——扫描周期、输入输出映像、寄存器地址、通讯协议,这些东西换了个品牌照样成立。
我的建议是:你手上现在接触哪台设备,就先把它对应的软件吃透。比如你在长三角的加工厂里,周边三菱、汇川设备多,那就先把GX Works2/Codesys搞明白;你在外企或者汽车产线,西门子TIA Portal和博途就是主线;锂电、风电行业倍福TwinCAT很常见,那就从EtherCAT和软PLC体系入手。等你在一个平台上能独立完成从I/O表梳理、程序架构设计到现场调试,再去学第二门语言,最多两周就能上手。
经验001:选型看区域生态。跳槽时你会发现,同一个城市的企业用的PLC品牌基本就那么几种,与其追逐热门,不如先把本地主流品牌吃透。
1.2 读图纸和接线,比背指令更值钱
我在现场见过一个新人,程序写得挺漂亮,结果排查故障时连传感器是NPN还是PNP都没搞清,愣是怀疑程序逻辑不对。这种事发生过不止一次。PLC程序里的每一个输入输出,最终都要落在端子上。接线错,程序再对也白搭。
数字量输入这一块,最容易搞混的就是漏型(Sink,低电平有效)和源型(Source,高电平有效)接法。三极管输出的三菱FX系列,很多默认是漏型输入;西门子S7-1200/1500的输入模块则可以通过接线方式配置成源型或漏型。如果传感器是NPN输出,信号端是低电平有效,那接漏型输入模块就顺理成章;反过来PNP传感器输出高电平,接源型输入模块才匹配。搞反了最常见的表现是:触摸屏上信号时有时无,万用表量端子电压又正常,但PLC就是不认。
经验002:接完线不要急着上电,先用万用表量一遍输入端子对COM的电压,确认高电平、低电平的有效逻辑和传感器输出类型一致,这一步能省掉后面半天排查时间。
模拟量信号更别大意。4-20mA电流信号抗干扰能力比0-10V电压信号强,距离稍远或现场变频器多,优先用电流信号。屏蔽层必须单端接地,也就是控制柜那一端接地,现场传感器那一端悬空。我见过一个项目,温度读数一直在2-3度之间跳,排查到最后是屏蔽层两端都接了地,形成地环路感应电流。这种小问题,传感器、模块、程序换了个遍都没解决,想想都亏。
1.3 第一次现场调试,先做三件防烧设备的事
新手第一次独立去现场调试,最怕的不是程序跑不起来,而是"放炮"——烧输出点、烧电源、烧模块。这些事故十有八九是上电前没做检查。
第一件事:万用表二极管档量输出端子和公共端之间是否有短路。输出点烧毁多数是负载直接短路或者接错线把高电压引到了输出端子。第二件事:**确认外部电源极性,**尤其是直流供电的设备,NPN接近开关三根线颜色搞错,轻则信号不动作,重则烧传感器。第三件事:先空载上电,再逐点带载。也就是先把输出负载的断路器全部断开,PLC上电RUN起来,用强制表逐一点动输出,确认每个输出点的动作逻辑和你写程序时预期一致,再合闸带负载。这个习惯能让你在最安全的条件下验证逻辑,真有问题也只是程序问题,不会烧硬件。
经验003:实机调试顺序固定为——检查接线、空载上电、观察输入点状态、手动点动输出、最后才下载程序联调。倒过来做,大概率会付出硬件代价。
2. 通讯调试为什么总卡在"连不上"
PLC工程里最让人抓狂的,永远是通讯问题。SCADA如何与PLC连接、触摸屏连不上PLC、上位机读不到数据、C#读PLC频率多少合适,这些关键词几乎隔几天就被翻出来问一遍。其实通讯的本质就那么点东西,你把它当两个人在打电话理解,很多问题就通了。
2.1 PLC和上位机之间,到底在传什么
PLC和上位机(SCADA、触摸屏、工业电脑)之间的数据交换,说白了就是你读我的寄存器,我回你寄存器里的值;你要我改某个输出,就给我写寄存器。不管是Modbus RTU、Modbus TCP,还是西门子的S7协议、三菱的MC协议,都逃不出这个框架。
打个比方:打电话要先拨号码(对方的IP地址或站号),接通后要说双方都能听懂的语言(协议),然后还得按双方约定的格式报信息(寄存器地址、数据类型)。这三层任何一层不对,通讯就起不来。
所以排查通讯问题时,心里始终要有这条链路:
- 物理层:网线、串口线、AB线有没有接对,屏蔽好不好
- 数据链路层:波特率、数据位、停止位、校验位,两端是否一致
- 应用层:站号/IP地址对不对,协议类型是否匹配,寄存器地址是否映射正确
经验004:调试通讯前,先画一张"通讯拓扑表",写上每个设备的IP/站号、协议、波特率、寄存器起始地址。这张表现场就是救命稻草,90%的通讯问题都能从表里找出矛盾点。
2.2 连不上时先查这三样,顺序不能乱
新手排查通讯,最容易犯的错是一上来就改程序、换协议,东一榔头西一棒子。按下面顺序查,基本能覆盖绝大多数情况。
第一,查站号和IP地址。触摸屏或者上位机软件里填的从站地址,和PLC通讯模块里设的站号是不是同一个。Modbus RTU从站地址范围一般是1到247,两边差一个数字都连不通。以太网通讯则先ping一下,能通再谈协议。
第二,查通讯参数。波特率、数据位、校验位这组参数必须完全一致。串口通讯最常见的就是两边设备出厂默认值不同,比如PLC侧设的是9600,8,E,1,触摸屏侧却选成了9600,8,N,1,校验位差一位就握手失败。这时候不要反复改软件,直接用USB转485调试器连到PLC通讯口,用串口助手发一条读寄存器指令,看有没有正常返回帧。这一步直接帮你判断问题出在PLC还是出在HMI侧。
第三,查线缆。RS485的A(D-)、B(D+)一旦接反就会完全没反应,两端的终端电阻如果不匹配,距离稍长就丢帧,表现是通讯时通时断。
经验005:串口通讯连不上,先用串口调试助理直连PLC测通,确认PLC侧正常后再去查触摸屏。这比两边来回怀疑效率高得多。
经验006:以太网通讯不要一上来就抓包。先ping通,再确认PLC网关、子网掩码,最后才看协议端口有没有被防火墙拦掉,顺序反过来会白白浪费时间。
2.3 SCADA能用起来,但是读取频率别乱来
SCADA能读到数据只是第一步,读得好不好、稳不稳定是另一回事。很多人写上位机程序时,不管什么变量都是100毫秒读一次,甚至用while循环疯狂读,结果通讯链路被占满,数据刷新反而不稳定。读取频率要跟实际需求匹配,不是越快越好。
这里给个参考,基于我自己的调试经验:
- 设备状态、报警信息这种秒级变化的数据,500ms到1s轮询一次足够
- 需要曲线趋势显示的模拟量,建议100ms到300ms
- 位置闭环、高速计数这种数据,通常不走普通上位机轮询,而是走专用总线或硬件实时通道
用C#写上位机时,最常见的是用定时器定时读取,而不是在循环里连读。比如用System.Windows.Forms.Timer或者Thread.Sleep控制节奏,每500ms读一次保持型寄存器,读到以后先存到本地变量,界面显示时再从本地取。这样界面刷新和通讯读写解耦,即使通讯瞬间延迟,也不会引起界面卡顿。
经验007:上位机写操作比读操作更要谨慎。写单个线圈、写寄存器这类操作,最好每次操作后都读回验证一次,并在界面上给出成功或失败反馈,防止点击后没有写入又被界面状态误导。
3. 程序看着没问题,一跑就翻车:编程阶段的坑
程序能不能跑是一回事,跑得稳不稳定、后期好不好维护是另一回事。入行头几年,我见过太多"当时能跑,三个月后没人敢碰"的程序,问题往往出在下面这几个地方。
3.1 双线圈和扫描周期,新手排错第一大元凶
新手做程序,最喜欢在一个程序段里置位某个输出,又在另一个程序段里复位它,逻辑上觉得自己想得很清楚。但实际上,PLC程序是严格按照从上到下、从左到右的顺序循环扫描的,同一个输出地址在程序里被赋值多次,最后生效的是最后一次扫描的结果。前面哪怕你把Q0.0置ON了,后面某个程序段又把它置OFF,执行到那一行时Q0.0照样灭掉。这就是所谓的"双线圈冲突"。
排查方法很笨但很有效:在软件里对输出地址做交叉引用(Cross Reference),看看这个输出到底被多少个程序段写过。如果数量超过一个,老老实实改成中间变量。也就是说,程序里只在一个固定位置对真实输出赋值,其他逻辑都对内部中间变量(比如M区、DB块里的Bool变量)操作,最后统一把结果传给输出点。这样逻辑清晰,排查故障也快,还能避免将来别人改程序时不小心动了你的输出点。
经验008:交叉引用工具是排查双线圈问题的利器,不用一行行翻程序,直接搜地址就能看到所有引用位置。
另外还要理解扫描周期带来的输入输出滞后。输入采样是在扫描开始前统一读取,输出刷新是在扫描结束后统一写入,所以一个输入信号变化,最快要经过一个扫描周期才会反映到输出。编写需要快速响应的联锁逻辑时,要考虑这个延迟,必要时用中断程序或者硬件输出点来处理急停、限位这类安全信号。
经验009:安全联锁逻辑尽量用硬件回路,程序里的联锁只是辅助。别指望PLC扫描周期来兜底急停响应。
3.2 复杂流程别用一堆M点堆,试试状态机思路
自动流程一旦超过五六个步骤,再靠一堆M点置位复位串流程,就会变成一盘散沙。我见过一份程序,二十多步动作全靠M0到M150接力,谁置位谁复位根本理不清,排查故障时简直像刑侦。
更好的做法是用状态机思路:用一个整型变量当状态字,每一步动作一个状态号,程序结构拆成两大块——状态转移条件和状态动作。比如:
- 当前状态等于10时,执行"夹爪闭合"动作
- 等到"夹爪到位信号"变为ON,且"安全门关闭"成立,状态跳到20
- 状态等于20时,执行"手臂上升"动作
这个思路的好处是,任何时候你看看状态字的值,就知道设备走到哪一步了。触摸屏上加个状态显示,多调试一个晚上,后面维护一年都轻松。三菱用D寄存器存储状态号,西门子用DB块的Int变量,汇川Codesys里用整型变量,原理都一样。
3.3 变量命名和注释,是我见过最被低估的事
程序写得再漂亮,不写注释、不命名符号,三个月后你自己都认不出来。这是行业通病,坏习惯一旦养成,换一个项目就坑一次。
我建议新人从第一天就养成这套习惯:
- 硬件I/O映射统一前缀:DI(数字量输入)、DO(数字量输出)、AI(模拟量输入)、AO(模拟量输出)
- 设备动作统一命名:Motor(电机)、Valve(阀门)、Cylinder(气缸)、Sensor(传感器)
- 每个程序段至少写三行注释:这段干什么、什么条件触发、动作失败会怎样
现场改过线之后,第二天就要更新图纸和I/O表。别看这一件小事,很多单位设备运行三五年后图纸和实际接线对不上,全是当初偷懒埋的雷。入行时要是养成了这个习惯,后面涨工资都靠它。
经验010:一个执行机构在程序里对应一个"软元件",命名里带上设备号。比如"3号工位夹紧气缸"就写成
Cylinder_3_Clamp,别省那几个字。
4. S7-PLCSIM Advanced启动不了,error 11排查全过程
仿真软件这个话题,几乎每周都有人问。尤其是S7-PLCSIM Advanced v5.0,有人启动实例时报错,甚至干脆不报错,就是点启动没反应。我在折腾这个玩意儿上也花了不少时间,这里把排查链路完整放出来。
4.1 先确认版本对应关系,大部分启动失败都出自这里
S7-PLCSIM Advanced不是独立软件,它要求先装好基础版S7-PLCSIM,然后再安装对应版本的高级版,同时还要和TIA Portal(博途)处于同一个大版本代际。很多人装了PLCSIM Advanced v5.0,博途却是V16或者V17的老版本,那启动失败太正常了,因为V5.0是跟着博途V18那一代走的。版本不匹配是最常见的坑,而且这种失败经常没有明确报错,就是实例启动不了。
我的建议是:装软件之前,先查官方兼容性表。不是说查到哪个版本就装哪个,而是把你现有的博途版本记下来,再对表里找支持这个博途版本的PLCSIM和PLCSIM Advanced版本号。顺序上,先装博途,再装基础版PLCSIM,最后装PLCSIM Advanced,每装完一个都重启一次电脑。
4.2 error 11且无报错的完整排查链路
如果你确认版本对应关系没错,启动时还是报error 11或者干脆没反应,按下面这个顺序来,这是我自己实测下来效率最高的链路:
- 右键以管理员身份运行。PLCSIM Advanced需要访问虚拟网卡和系统服务,普通权限经常静默失败。
- 检查Windows服务。Win+R运行
services.msc,找到名称里带Siemens或者PLCSIM的服务,确认处于"运行"状态。被安全软件禁用是常有的事。 - 清理残留实例。之前异常退出导致实例没有正常释放时,新实例就创建不了。到PLCSIM Advanced管理界面把所有实例删光,重启服务再试。
- 检查虚拟网卡适配器。PLCSIM Advanced会装一张虚拟网卡,去设备管理器里看它有没有被禁用、驱动是否有感叹号。
- 关杀毒软件和防火墙。运行中的实时防护会拦截虚拟通讯端口,可以先临时关掉再试。
- 检查许可证。到自动化许可证管理器里看PLCSIM Advanced对应的授权是不是有效。
经验011:装了杀毒软件的工作站,装完PLCSIM Advanced后,把整个Siemens安装目录加入白名单,不然哪天更新病毒库后突然就启动不了了。
整个排查下来,我遇到的情况大多是版本不匹配和杀毒软件拦截这两类。如果你也卡在error 11且没有日志,先把基础版PLCSIM卸掉重装一遍,再把Advanced装到同一目录,很多玄学问题都这么解决了。
4.3 仿真与实机的差距,心里要有数
仿真能帮你验证程序逻辑,但替代不了现场。PLCSIM仿真的重点在程序逻辑,它不关心你的接线,也不仿真外部传感器信号。所以你写程序时,不能因为用了仿真就放飞自我,搞一堆仿真特有的取巧写法,比如直接用M区替代I/O点、跳过报警逻辑等等。你偷的懒,实机调试时全会还给你。
我个人的建议是,仿真阶段就要按实机标准写程序:输入输出照常用I/O地址映射,模拟量在DB块里专门建一个变量区用来塞仿真数值,报警、互锁逻辑一条不少地写好。这样仿真过了,下载到实机上,大概率只要调调参数就能跑。要是仿真时为了省事把互锁跳过了,实机上一定会有那么一次,让你为这个偷懒买单。
5. 各种品牌混用时,最常见的兼容性官司
设备商做项目很少只用一种品牌的PLC:上位机是威伦通或者昆仑通态的触摸屏,控制器是汇川、信捷或者西门子,变频器又是ABB的。品牌一多,兼容性问题就跟着来。
5.1 威伦通触摸屏找不到汇川PLC驱动,我建议这样处理
有人问威伦通触摸屏软件里找不到汇川PLC的驱动,头都大了。这个问题分两层看。
先看型号和时间:威伦通的EBPro软件其实是有汇川驱动选项的,但老版本的软件或者部分定位低端的老型号触摸屏驱动列表不全。这时候第一件事是升级EBPro到最新版,然后检查触摸屏固件版本,老固件也要更新。
如果更新完还是没有对应驱动,走通用Modbus协议。汇川的多数PLC都支持Modbus RTU或Modbus TCP从站功能,威伦通触摸屏里直接选Modbus RTU设备或Modbus TCP设备,然后手动填写PLC侧的寄存器地址映射就可以了。这个方案最稳妥,因为Modbus是公开协议,几乎所有组态软件和触摸屏都支持。
经验012:当你遇到"我的触摸屏怎么没有XX品牌PLC驱动"这类问题时,先别急着找驱动,问自己一句:这台PLC支不支持Modbus从站?支持就万事大吉。
昆仑通态MCGS连信捷PLC也是类似套路。MCGS较新版本自带信捷驱动,直接选就行;找不到时,信捷XD/XC系列都可以开启Modbus从站功能,MCGS里用通用Modbus设备连,地址按Modbus地址映射表填。跨品牌通讯的万能钥匙就是Modbus,这句话值得记下来。
5.2 三菱老款FX2的软件,在Win10上装不上怎么办
还有人拿着三菱老式FX2系列PLC,编程软件是FXGP/WIN这个古董,在Win7/8/10/XP上各种装不上、连不上。老设备在项目现场还有很多,这个问题的标准解法不是硬装新系统,而是开虚拟机。
FXGP/WIN在Windows XP或Win7 32位系统下运行最稳。在Win10/11主机上装个虚拟机软件,里面跑一个Win7 32位或XP的虚拟机,然后在虚拟机里装FXGP/WIN。USB转串口线要把USB设备映射到虚拟机里,一般选"连接到虚拟机"选项就行。这样既不影响主机日常使用,老软件也跑得稳稳当当。
如果嫌虚拟机麻烦,也可以试GX Developer,它对新系统兼容性比FXGP/WIN好一点点,但连FX2N这类老CPU时,还是要用串口或USB转串口线,驱动用三菱的USB驱动或者兼容FTDI芯片的驱动。最关键的还是那句:老设备的软件别硬装,开个虚拟机最省心。
5.3 汇川Codesys和AB指令,初上手思路先调整
汇川这几年在市场上铺得很快,AM系列和部分Easy系列走的是Codesys生态。很多从三菱或者西门子转过来的工程师,第一次打开Codesys会有点懵,找不到GX Works那种梯形图菜单。实际上,Codesys是IEC 61131-3标准环境,它不像某个品牌那么"专属",更像一个平台:你可以在里面写梯形图、ST结构化文本、FBD功能块图,还可以挂运动控制库、CANopen总线库、EtherCAT库。
上手Codesys,先弄懂三件事:任务(Task)配置、库(Library)管理、程序组织单元(POU)的调用关系。三菱、西门子转过来的习惯是"块随便建,PLC程序从上往下跑",Codesys里需要明确主任务调用哪个POU,调用顺序是什么,扫描周期在哪设。这些理顺了,后面写逻辑就顺手了。
至于AB公司的PLC,有人问"SWJ是指什么"——我翻过不少AB官方指令手册,没找到这个缩写对应的指令。AB(罗克韦尔)的控制器上,常见的跳转指令是JSR(跳转到子例程)、MCR(主控复位)、以及用于位操作的Latch/Unlatch等,但没有一个叫SWJ的公开指令。如果是在某台老设备或者第三方功能块里看到这个符号,大概率是项目自定义的函数块名或者某个文本命名,建议直接用Studio 5000软件打开程序,定位符号定义处看它绑定的实际指令。
经验013:查指令不要只看缩写瞎猜,找到软件里的交叉引用,看这个符号到底对应哪个指令块,比问搜索引擎靠谱。
6. 宕机的设备千篇一律,排查的方法各有不同
PLC宕机这事儿,几乎所有现场工程师都遇到过。设备跑着跑着没反应了,触摸屏黑屏、指示灯全灭,客户电话一个接一个。宕机的原因五花八门,但排查思路是有章法的。
6.1 PLC宕机,先看供电和干扰,别乱下载程序
第一步不是急着连电脑查程序,而是先看电源。PLC宕机最普遍的原因是供电异常。开关电源老化、电网电压波动、柜内大功率设备启停瞬间压降,都会让CPU掉电重启或者直接停机。到现场先看电源模块指示灯,用万用表量24V输出,确认稳定再说别的。
第二步看干扰。变频器、伺服驱动器、高频加热设备启动时产生的电磁干扰,可能通过电源线和信号线串入PLC,导致CPU死机或者看门狗超时。表现就是设备运行一段时间后突然停止,过一会儿重启又正常。处理的常规做法是:PLC供电回路加装隔离变压器或者DC-DC隔离电源模块,信号线用屏蔽线并单独穿管走线,和动力电缆拉开距离。
第三步才是检查程序本身。CPU的看门狗设置过长或过短都有问题,一些死循环、大量浮点运算、通讯指令无超时等待,都可能把CPU拖死。但记住:登录程序之前先保存现场诊断数据,比如CPU的诊断缓冲区、故障时间戳、I/O状态。这些信息在重启后就没了,先采集再处理。
经验014:现场宕机,先拍照记录所有LED指示灯状态和触摸屏报警画面,再断电重启。很多故障信息只出现一次,错过了就只能等下次故障。
6.2 "时间到期自动停机"的正规实现方式
有人问"PLC怎么设置时间到期自动停机",这类需求在设备租赁分期、维护保养提醒里确实存在。先说清楚立场:任何隐蔽后门、未经合同约定的强制锁机都是合规风险,正规项目不能这么干。我讲的只是设备管理中常见的"运行时间到期提醒"和"保养到期停机"功能。
实现思路不复杂:
- 用PLC的实时时钟(RTC)或者累计运行时间寄存器作为时间基数
- 在断电保持区里存一个"授权到期时间"或"保养周期"设定值,比如某年某月某日或运行满5000小时
- 每个扫描周期比较当前时间和到期时间,到期时置位一个"到期标志"
- 程序在设备启动条件里串联这个到期标志,并同时在触摸屏上显示明确的到期原因和维护提醒
- 维护人员完成保养或续费后,通过受密码保护的HMI画面写入新的到期时间
注意,写这个功能时必须和客户有明确的合同或维护协议约定,到期停机不是"偷偷锁死设备让客户打钱",而是"到了法定的保养周期,主动停机提醒维护"。停机逻辑也要做到透明、可追溯:触摸屏上有倒计时提示,到期前提前一段时间开始声光报警,给现场留出安排生产的缓冲期。
经验015:到期停机逻辑务必写在明文程序段里,注释写清楚是"保养周期提醒"用途,不要搞让人看不懂的加密算法,否则后期验收和交接环节说不清。
6.3 本期21条之后,剩下的69条每天更新
写到这里,第一批21条算是放完了。这里面的每一条,都是我这些年要么自己踩过、要么帮别人擦屁股擦出来的经验。剩下还有设备启动时序、伺服定位调试、变频器参数匹配、梯形图转ST语言、程序安全管理、远程监控、数据采集报警联动这些内容,后面我会按主题继续更新下去。这段时间你要是哪条踩了坑,或者觉得我漏了什么,欢迎在评论区补充,说不定你的问题就是下一批更新的选题。