
从毕业进厂跟着师傅拧端子排到现在能独立做完一整套设备电气方案我大概用了两年半。这90条实战经验是我一边踩坑一边记下来的今天先整理成这篇长文后续我会在这个经验库里持续补充每天更新几条直到凑满90条。如果你是入行1-3年的PLC工程师或者正在自学西门子、三菱、汇川这些主流PLC想往工控圈走这篇东西应该能帮你省下不少走弯路的时间。这里面没有教科书上的标准答案全是现场烧过热继、查过半夜程序之后逼出来的判断逻辑。我见过太多新人拿到一台设备第一反应就是扑到电脑前写程序结果硬件的坑还没填平程序写得再花哨也跑不起来。所以我决定从硬件接线开始讲再到程序结构、仿真调试、通讯联调最后聊现场稳定性一层层拆开给你看。入行头三年的问题大多是这四个方向。1. 从接线冒烟到查无信号硬件选型与IO接线的那些入门坑1.1 传感器NPN/PNP混用信号永远不对的根源入行第一年我以为是程序写错排查了一整天才发现是传感器类型选错了。三线制传感器一根棕线接24V正极一根蓝线接24V负极黑色信号线上输出的信号类型分NPN和PNP两种。NPN传感器导通时信号线对负极输出低电平只能接漏型输入的PLCPNP传感器导通时信号线输出高电平要接源型输入的PLC。混用的结果是信号灯要么常亮要么完全没反应。这个问题的难点在于不同品牌PLC的输入类型定义方式还不一样。西门子S7-200 SMART的CPU集成数字量输入是漏型输入公共端接24V负极所以配套的传感器必须选PNP型而S7-1200通过改变输入模块公共端的接法既能接NPN也能接PNP。三菱FX系列大多支持源型/漏型切换有些型号靠M端接线决定。汇川Easy系列、信捷XD系列这些国产主流PLC出厂默认大多是漏型输入按PNP传感器来配就没错。实战里我的判断顺序是这样的先看PLC输入模块端子有没有标明S/S、COM这类公共端再把公共端接24V还是24V-给确认清楚最后去核对传感器型号。现场没有说明书的时候拿万用表量信号线对地电压没触发时24V左右、触发后掉到0V就是NPN反过来没触发时0V、触发后升到24V就是PNP。这个测量方法值得收藏。1.2 源型漏型接线实操西门子S7-1200的公共端玩法西门子S7-1200的输入模块上不同的公共端定义会影响整体接线方案。以SM 1223 DI 16/DQ 16模块为例输入端子的1M、2M公共端接24V输入就是源型PNP传感器把公共端接24V-输入就是漏型NPN传感器。模块选型时看手册上写的输入类型可切换这个特性非常实用一套模块能适配两种传感器。新人最容易犯的错误是公共端只在一组端子接好了另一组没接。比如SM 1223分了1M和2M两组输入每组有8个通道如果只给1M接公共端2M那组会全部误动作或者没反应。我以前排查过一台设备零点信号和限位信号偶尔消失拆开端子排一看2M端子松了传感器信号全部悬空PLC内部光耦被悬空电平干扰信号时有时无。把公共端拧紧之后再也没出现过。接线顺序上我习惯按“先电源、后信号、再公共端”走。每组输入先确认供电正常再逐个接传感器信号线最后核对公共端接法是否和传感器类型匹配。通电前用万用表二极管档测一下输入点对公共端的压降能看到0.6V左右的管压降表明极性接对了读数不正常就别上电先继续查。1.3 继电器输出与晶体管输出的选型边界输出类型选错轻则动作慢重则烧模块。继电器输出内部是机械触点触点寿命有限响应时间大概10毫秒左右好处是交直流都能带而且触点容量大晶体管输出是电子开关响应时间在0.1毫秒级别能做高速脉冲输出但只能带直流负载而且要注意极性接反了输出管直接击穿。选型规则是这样的控制接触器线圈、电磁阀这类交流负载选继电器输出控制伺服脉冲方向信号、步进电机脉冲选晶体管输出直流中间继电器如果频率不高两种都能用但我推荐晶体管输出因为寿命长、不会有触点氧化问题。还有一类场景我踩过坑晶体管输出并联感性负载比如直流继电器线圈的时候必须反向并联续流二极管。断电瞬间感性负载会产生反向电动势没有续流二极管输出管会被高压打穿。二极管负极接24V正极接输出点这个细节做设备维护的同事都知道但新手基本没人提醒。1.4 老平台与新系统三菱FX与国产PLC的兼容性现实很多厂里还有三菱老式FX系列设备编程软件FXGP/WIN在Win7、Win8、Win10乃至Win11上的运行兼容性是个老大难。我见过有人为了刷一台FX2N程序专门翻出一台装XP的老笔记本。如果你也遇到这个问题优先找带管理员兼容模式运行的FXGP/WIN版本实在不行装虚拟机。最稳妥的做法是准备USB转RS422编程线但老式FX系列用的是圆口编程口转接线驱动一定要装好不然通讯端口识别成COM10以上软件里根本选不到。国产PLC里汇川Easy系列和信捷XD系列在产线改造中越来越常见。这两类PLC的编程软件都是Codesys或类Codesys生态但细节上差异不小。汇川AutoShop、信捷XDPPro在创建工程时都要先选对CPU型号下载程序前必须核对PLC固件版本固件太老会导致指令不兼容。我遇到过汇川Easy系列程序下载进去定时器指令不执行最终发现是固件版本太低在线升级之后才正常。2. 让程序从“跑得通”到“扛得住”结构化写法的关键习惯2.1 变量名和注释比程序本身更能救你我刚开始写程序的时候喜欢直接用地址写梯形图X0、Y1、M100满天飞。半个月后回头改程序看着满屏数字脑袋嗡嗡响。后来强制自己用符号表和变量名西门子用DB块和符号寻址三菱用注释和别名汇川在变量表里定义地址。代码顺序可能忘设备功能可能变但变量名写清楚程序逻辑一眼就能看明白。建议从第一天就建立一个命名习惯比如输入信号前缀DIDI_Cabinet_Temp_High输出信号前缀DODO_Pump_Start内部变量用MV开头报警用ALM开头。这样做最大的收益在排障阶段设备报警了HMI上报“冷却水温高”你在PLC程序里搜DI_Cabinet_Temp_High一分钟就能定位到触点而不是靠CTRLF一个个试X32是哪个传感器。注释也不是给别人看的主要给三个月后的自己。我写关键网络注释会写明联锁原因比如“只有在自动模式且液压站压力到达后才允许启动主电机”这样即便设备停机半年再打开程序逻辑上下文还在。2.2 M区规划和FB/FC复用把代码当积木搭三菱PLC的内部继电器M区、西门子的位存储区M区看起来就是一片布尔变量但如果从头到尾把M0到M8000当开关用不加规划程序写不到两千步就乱了。我的规划方法是分块M0到M99做按钮和操作面板索引M100到M199做设备状态M200到M299做报警锁存区M500以上留给配方号或模式标志。汇川Easy这类Codesys平台虽然用变量表但同样建议按前缀区分功能。比寄存器规划更重要的是养成FB/FC复用的习惯。水泵启停、气缸伸出退回、电机星三角启动这些逻辑在每个项目都会出现至少十几次不要每次复制粘贴一遍而是封装成功能块输出引脚接不同的物理点。项目做多了你会发现修改水泵延时参数只需要改功能块的接口变量不用满程序翻网络。我入行时接过一个四层电梯控制程序的图纸别人写的程序把所有逻辑堆在主程序OB1里四千多行排查一个楼层问题要顺藤摸瓜一个多小时。我自己用状态机思路重构过一遍每层一个状态字每层一个FC处理该层的召唤、换速和开关门逻辑剩下的主程序只做状态流转调度改起来轻松太多。程序结构这件事真的是越早明白越赚。2.3 双线圈、沿指令、抖动滤波程序稳定的三重保障“同一输出线圈在程序里只允许出现一次”这条规则我提过无数次但还是有人破戒。PLC扫描是自上而下循环执行的同一个Y0线圈如果在网络5里被置ON在网络20里又因为其他条件被置OFF那最终输出由网络20说了算前面的逻辑全部白写。排查这种问题时看程序监视所有Y0触点的状态你很难发现哪个网络是最后执行的。解决办法是分散逻辑、集中输出每个输出线圈只写在程序最末尾前面所有逻辑用内部继电器代替。沿指令上升沿/下降沿也是新手容易忽略的。按钮开关按下时物理触点抖动会产生多个上升沿如果直接用触点做置位和复位控制会出现按一下按钮M区状态翻转两次甚至三次的现象。正确的做法是用上升沿指令捕捉按钮信号再去做状态切换。西门子里用R_TRIG或P触点三菱用PLS/PLF汇川在Codesys语法里用R_TRIG功能块。开关量滤波更简单实用对于传感器来的关键信号比如产品到位、气缸磁开关在程序里做一个几十毫秒到一百毫秒的定时器延时信号持续超过延时时间才判定为有效。现场电磁干扰经常会产生几纳秒到几十毫秒的毛刺不滤波就可能导致误动作。我遇到过产品计数每班多计数几千个不是因为传感器装歪了而是因为光电开关信号线上有干扰加了滤波之后计数立刻准了。2.4 手自动切换和急停回路安全功能的硬性框架任何一个生产设备手自动切换都躲不掉。手自动切换最容易出的问题是切换瞬间输出跳变——自动模式退出时输出全断设备突然停机或者切到自动模式瞬间设备直接启动。我推荐的做法是手自动切换只换“允许条件”不直接操作输出。自动模式下程序里面增加一个运行使能位所有自动输出都要经过这个使能位。切换时先把使能位清零等设备停稳再把使能位置位。这样切换过程没有冲击。急停回路比任何程序逻辑都重要我在这点上吃过亏。急停按钮一定要进硬接线用PLC的常闭输入点即急停常闭触点串进输入回路而不是程序里的取反逻辑。因为PLC断网、CPU死机或输出模块掉电时程序再怎么写都不可能停设备只有硬回路断了接触器才会真正断开。急停回路里我一般还会串一个安全继电器或者接触器辅助触点确保急停触发后即使程序误置位输出主回路也不会得电。程序侧急停输入触点建议用常闭信号加进每个输出允许条件的最前面同时设置报警锁存。设备急停复位之后不能自动重新运行必须再按一次启动按钮这是我很早学会的安全习惯能避免很多危险工况。3. S7-PLCSIM Advanced启动失败的排查全链路3.1 实例启动不了且没有报错先怀疑环境再怀疑操作在使用S7-PLCSIM Advanced V5.0仿真西门子S7-1500、S7-1200程序时我见过很多同行卡在“PLC实例启动不了也没有任何报错”的状态。程序编译下载正常但PLCSIM Advanced软件里一点启动实例状态还是灰色就像没反应过来一样。这种没有报错的启动失败根因多半是环境问题。我排查时按这个顺序走先看操作系统是否为Windows 10/11专业版或企业版家庭版装PLCSIM Advanced经常出现启动后实例无法创建的情况再看PLCSIM Advanced版本与TIA Portal是否匹配V5.0必须搭配TIA Portal V16及以上版本版本对不上通讯接口加载就会失败最后看虚拟机或物理机的网络适配器PLCSIM Advanced需要虚拟以太网适配器来模拟Profinet接口如果适配器被禁用实例能创建但启动不了。最容易被忽略的是管理员权限。TIA Portal和PLCSIM Advanced都尽量用管理员身份运行我实测过同一台电脑普通双击启动仿真器实例启动概率大概七成右键管理员运行概率接近百分之百。如果还不行打开任务管理器把PLCSIM相关的残留进程全部杀掉再重新启动——这些进程经常卡在上一次仿真异常退出里导致新实例创建后无法接管资源。3.2 Error 11和实例配置的硬性约束S7-PLCSIM Advanced报Error 11很多人搜不到具体含义。根据我的经验这个错误绝大多数和实例命名有关。PLCSIM Advanced的实例名不允许带中文、不允许带空格和特殊字符而且不能以数字开头。我建过一台“PLC_12号_测试”的实例启动就报Error 11改成“PLC_12_T_Test”之后正常了。项目文件路径也尽量不要带中文TIA Portal在某些版本下中文路径会引发仿真器通讯失败。另外一个约束是PLCSIM Advanced同时只能运行一个处于激活状态的仿真实例。你开了实例A再去加载实例BB启动不了的时候先回到实例A把它停止甚至退出整个PLCSIM Advanced软件再重新加载。我遇到过实例列表里残留了大量旧实例每个都占用了虚拟网卡的IP地址导致新实例启动后IP冲突上位机连不上。在网络设置上PLCSIM Advanced默认会给虚拟网卡分配一个IP网段比如192.168.0.1。如果你要仿真支持Profinet的PLC还得确认PLCSIM Advanced里选中了“支持Profinet”的实例类型。很多教程没提这个细节结果HMI或SCADA用Profinet连接时死活找不到设备其实只是仿真实例的Profinet功能没开。3.3 用PLCSIM Advanced调试HMI和SCADA的实用技巧PLCSIM Advanced最大的价值是能配合WinCC、组态王、以及OPC UA工具做联合仿真。我的典型做法是先在TIA里给PLC分配好IP地址比如192.168.0.1把程序编译下载到PLCSIM Advanced实例再用这个IP地址建立HMI连接。因为PLCSIM Advanced支持真实的以太网通讯比传统PLCSIM只能内嵌仿真强太多。配上SCADA时有三种主流连接路径OPC UA、S7协议、Modbus TCP。西门子S7-1500仿真器支持OPC UA服务器功能SCADA软件直接读PLC的OPC节点就能拿到数据上位机里如果用S7协议比如C#写的通讯程序连接参数就填PLC实例的IP机架号和槽号在1500系列设置为0和0这个和1200相同Modbus TCP则在PLC程序里调用MB_SERVER指令把数据映射到保持寄存器地址段里。我曾经用PLCSIM Advanced搭过一套完整的模拟产线逻辑在PLC里跑触摸屏仿真在WinCC里跑SCADA再通过OPC UA采集PLC里的运行数据。这套环境对前期联调帮助极大很多通讯问题在和真实设备接线之前就能暴露出来。3.4 仿真和实机的差异别把仿真结果当现场事实仿真器能解决逻辑问题但不能保证程序到了现场一定没问题。最典型的差异是扫描周期和IO刷新方式仿真器CPU运行得比真实PLC快得多程序中的定时器、计数器数值会失真特别是用定时器做积分、脉冲计数的场合仿真结果不能直接作为性能依据。还有一个我踩过的坑仿真的输入输出地址是虚拟出来的不存在真实物理信号延迟所以你在仿真里优化出来的“响应速度”到了现场会被传感器响应时间、接触器机械动作时间拉长。做设备节拍评估时请以实机的逻辑扫描时间加IO刷新时间再加执行元件动作时间为准不要按仿真时间推算。4. 通讯联调现场PLC、SCADA与触摸屏之间的常见死法4.1 SCADA和PLC连接别一上来就谈协议很多新人问“SCADA如何与PLC连接”其实这个问题的答案分三层物理链路怎么通、数据链路用什么协议、协议背后地址怎么映射。物理链路最常见的是网线直连或走交换机数据链路层西门子和上位机之间用S7协议或OPC UA三菱用MC协议汇川用Modbus TCP或OPC UA信捷走Modbus RTU/TCP地址映射则要弄清楚PLC里的DB块、M区、D区和SCADA变量表之间的对应关系。我给一个可复用的步骤第一步在TIA里为PLC开启“允许从远程通信伙伴进行PUT/GET访问”S7-1200/1500默认可能关闭否则很多SCADA走S7协议连接时会报连接正常但数据不刷新第二步用SCADA自带的通讯诊断工具或第三方工具如HslCommunication的调试助手先单独测试通讯通道能读到数据再去做画面变量绑定第三步画面变量只绑你真正要监控的点不要几千个变量全部一股脑刷一遍越少越稳。我之前遇到过一个案例SCADA和PLC都在同一个网段Ping也通但WinCC画面数据全是空的。最后定位到PLC程序里的DB块没有勾选“优化块访问”S7协议无法从外部读取优化访问的DB块。把这个选项取消勾选或者改用OPC UA的符号寻址数据就上来了。这类问题排查链路很隐蔽但遇到一次你就记住了。4.2 C#读取PLC数据频率别把一个字节的读取跑成洪水做MES、数据追溯时经常要用C#等上位机语言直接读PLC数据。我用过S7.Net、Sharp7和HslCommunication几种库连接方式都是通过S7协议访问西门子PLC。选库方面S7.Net简单但功能少HslCommunication功能全且支持的设备类型多我日常项目里用HslCommunication更多一些。关于读取频率我的实际经验是针对S7-1200/1500常规读取DB块里的实时数据100毫秒到1秒的轮询周期都很稳定。但要注意两点一是不要每个周期都读取整个大DB块比如一个DB块有12KB数据你每秒去读一次轻则通讯延迟增加重则影响PLC的扫描周期。建议只读你需要的那几个变量或者把需要采集的数据集中放在一个小的DB区里按块读取二是高频率写操作要特别克制PLC程序里如果没有对通讯写入做处理上位机每50毫秒写一次参数会导致通讯堆栈拥堵甚至触发PLC的通讯故障。我测过一次极限C#用HslCommunication每秒读S7-1200一个4字节实数连续跑48小时通讯稳定改成每10毫秒读一次半天后PLC通讯模块开始出现偶发超时CPU的通讯负载明显上升。所以项目里如果要求250毫秒以内的实时刷新优先考虑用S7-1500配合IRT实时通讯或者改用OPC UA订阅机制而不是无脑提高轮询频率。4.3 触摸屏软件找不到PLC驱动大部分是驱动库版本问题威纶通、MCGS、昆仑通态、信捷触摸屏这类HMI软件新建工程时第一步要选PLC设备型号。很多人遇到的一个情况是在威纶通的软件列表里找不到汇川的AM系列或Easy系列PLC就以为不支持其实不是设备不支持是软件版本里驱动库太旧没有收录新出的PLC型号。解决办法分三步先到对应触摸屏厂家的官网下载最新版组态软件威纶通EBpro、MCGS嵌入版、昆仑通态MCGS都支持在线升级驱动库升级后重新创建设备在PLC类型列表里选“Modbus TCP”或“符合Modbus TCP协议”的通用驱动这招对几乎所有国产PLC都管用如果非要原厂专用驱动就查PLC厂家官网出品的HMI连接说明书汇川AM系列有专门的HMI变量导入工具能把PLC工程里的变量表直接导出成威纶通格式。信捷XD系列和MCGS通讯时很多人选不到“信捷XD”驱动退而求其次用Modbus RTU也完全可行PLC侧打开Modbus从站功能把寄存器映射表设好HMI侧站号填1波特率9600或19200数据位8停止位1无校验通起来之后稳定得很。通讯不上时先别怀疑协议用万用表量一下RS232/RS485的A、B线是否接反这个原因占了通讯故障的一半。4.4 变频器和PLC通讯ABB与西门子的两种主流套路生产线上变频器与PLC通讯最常见的组合是ABB变频器和西门子PLC。ABB变频器型号不同通讯方式差别很大。ACS510/ACS550这类走Modbus RTU用标准RS485接口PLC侧西门子S7-1200需要加一个RS485通讯模块CB1241或者用CM1241 RS485模块程序里调用MODBUS_MASTER指令变频器侧设置参数组站号、波特率、数据格式。ACS880这种高端型号则常走PROFINET需要把变频器的GSDML文件导入TIA再通过工艺对象控制。我的建议是如果项目赶工期优先用Modbus RTU。它的调试速度比PROFINET快得多不需要配GSD文件只要把那几十个参数设置对了起停、频率给定、电流反馈三组数据通上就够用。Modbus通讯一旦不工作先检查通讯格式8位数据、1位停止位、无校验ABB变频器出厂默认是这个组合如果PLC侧把这个设置改成了“8E1”之类的带校验模式两边完全对不上通讯一点反应都没有但不会报错因为物理链路是通的。PROFINET接线反而简单关键坑在GSD文件和设备名称上。每个PROFINET设备都有“设备名称”这个概念下载完组态之后必须在实物上给变频器分配这个设备名否则PLC报“伙伴站不可用”。用TIA的“可访问设备”功能扫描一下网络找到变频器后在线分配名称再到组态里更新设备通讯就建立了。这个流程我建议每个想碰PROFINET的工程师都亲手做一次做完就不会再觉得它难。5. 现场稳定性的隐性门槛宕机、到期停机与抗干扰5.1 PLC宕机的常见诱因和防线“PLC宕机”这四个字在产线上意味着停线、罚款和半夜电话。我统计过自己处理过的宕机案例绝大多数不是PLC本身坏掉而是外部因素导致的24V电源掉电或电压跌落、通讯模块被异常报文冲击、接地不良导致静电窜入、CPU底板温度过高。电源问题是最常见的宕机元凶。很多设备用一个24V开关电源同时带PLC、传感器、触摸屏一旦某个电磁阀线圈短路整个24V总线电压掉到十几伏PLC虽然不一定立即断电但输入信号逻辑会乱套看程序监视时发现一堆点位闪烁再严重就直接复位重启。防线的做法是分开供电PLC的24V电源和外部传感器、执行器的24V电源分开中间继电器隔离至少给PLC电源串一个二极管防反接。通讯冲击引发的宕机也很隐蔽。上位机写程序时地址越界或者通讯指令的操作数类型不匹配可能会让PLC的通讯处理器进入异常状态CPU扫描可能不停但通讯就彻底挂了看起来也像宕机。对付这类问题我在S7-1200/1500里会让通讯数据放在专门的保持寄存器区上位机只能读写该区域严禁访问其他数据块如果支持还可以把通讯故障报警块加进去触发后HMI弹窗提醒。程序死循环导致宕机的概率很低但确实存在。FOR循环里做了没有终点的递归、跳转指令在某个条件分支里无限跳这些我在第三方程序里都见过。新写的算法类逻辑务必在仿真器里跑一遍边界条件数据极值、0除以0、数组越界这类情况多测测。现场扔一套自动重启机制看门狗定时器或者PLC的自恢复功能在程序异常时把输出全部清零再复位。5.2 时间到期自动停机怎么设计才不被人讨厌“PLC怎么设置时间到期自动停机”这个需求通常出现在设备租赁、分期付款、样品试用这些场景里。老板想限制设备使用期限到期自动停机直到收到尾款。做这个功能不难但做得粗糙会被客户疯狂吐槽甚至搞出纠纷。正确做法是PLC用实时时钟功能读取当前时间。西门子S7-1200/1500用READ_RTC或本地时钟系统库函数三菱用时钟读写指令汇川在系统变量里直接读当前时间。在PLC里设定一个目标停机时间比如2026年6月30日23:59:59到期时间存到掉电保持区程序每次扫描都对比系统当前时间和该时间。超过后把输出使能总开关切断HMI弹窗提示“设备服务期到期请联系供应商”同时锁存这个状态。关键细节有三个第一PLC内部时钟电池没电了时间会回退到出厂值到期判断就失效了所以要在程序里加一个“时钟有效位”检查如果时钟异常也可以把设备停机并在HMI显示时钟故障第二到期状态不能通过普通模式切换或重启就清除要设置一个专门的解锁密码或维护口令由供应商输入才能复位否则客户断电重启就绕过去了第三别把这个逻辑写在别人一眼就看出来的网络里稍微拆分一下放到几个不相关的FC里避免被现场人员在线修改绕过。我还在一些项目里做过“倒计时提示”版本提前30天开始每天减少剩余天数到期前一周每次开机HMI都弹一次提示。这类功能本质上考验的不是编程水平而是需求沟通和现场服务策略建议多做一步确认到底是硬性停机、限速运行还是只提示不限制。方案不同程序结构完全不同。5.3 模拟量信号干扰和屏蔽接地的实操笔记现场设备稳定性的另一个大头是模拟量信号。4-20mA电流环和0-10V电压信号是两种最常见的模拟量接口但在电磁干扰强的电柜里电压信号非常容易漂移。4-20mA之所以在工业现场长盛不衰就是因为电流环对线路电阻不敏感抗干扰能力强。接线规范上模拟量信号线必须用屏蔽双绞线屏蔽层只能单端接地。我见过有人把屏蔽层两头都接地结果地电位差在屏蔽层上形成了环流干扰不但没减弱反而更强了信号在PLC读取端跳得跟心电图一样。单端接地的位置一般选择在PLC侧也就是电柜内这一端接地。模拟量信号线和动力线分开走线是基本功。同一根线槽里变频器输出电缆和模拟量信号线平行走超过20厘米干扰就可能达到无法接受的程度。正确做法是动力电缆和信号电缆分别走两侧线槽中间留出至少20厘米的距离实在没法避开就用金属隔板隔开。如果空间实在不够在模拟量输入模块前加信号隔离器隔离器能切断地环路也能滤掉一大半共模干扰。还有一个我没少踩的坑模拟量输入端和传感器共地。如果传感器变送器和PLC不共地模拟量输入模块读到的数值会整体偏高或偏低而且不是固定的偏置是随负载波动的偏移。遇到读数莫名其妙的设备先量一下传感器电源负端和PLC的24V负端之间的电压差超过1V就要考虑共地了。把这两个负端可靠连到一起很多模拟量漂移问题就自动消失了。5.4 掉电保持区的规划掉电丢参数这种锅没人想背PLC程序里配方参数、设备设定值、累计产量、到期时间这些数据必须放到掉电保持区。三菱FX系列里有些M区和D区默认带锁存功能型号不同锁存范围也不同西门子S7-1200里数据块可以设置“保持性”在DB属性里直接勾选或者用保持性存储区设置S7-1500的保持性设置方式更灵活可以在数据块内部对单独的变量设置掉电保持。我见过最惨的一个案例是客户方电工觉得程序偶尔丢参数就把PLC电池给换了结果原厂电池还没到货第二天设备断电配方参数全丢。其实根本不是电池问题是程序里的配方数据放在普通M区根本没勾保持。所以做程序的第一天就要把数据区规划写清楚哪些变量掉电必须保持哪些变量上电需要清零。我的习惯是运行状态位、临时计算变量全部不上保持上电自动初始化配方、产量累计、到期时间、通讯参数才进入保持区。掉电保持区也不是无限可用的S7-1200的保持区大小受CPU型号限制规划时要留余量。而且不能把今天这种工艺参数、明天那种调试数据全塞进去保持区一旦写满有些品牌PLC会直接报存储区溢出更麻烦。数据老化策略也值得做产量累计每天写一次备份重要数据定期转存到U盘或者上传到SCADA历史库。最后说句掏心窝的话。我列这90条经验的初衷是因为自己入行前三年踩的坑太多了有些甚至是在同一个坑里反复摔。PLC这行书本教会你指令和硬件但真正值钱的经验全在现场——接线怎么断的、通讯怎么不通的、程序怎么被人改乱的。写这篇经验库不是让你背答案而是希望你遇到类似问题时脑子里能多几条排查路径少走几步弯路。后面我会持续更新把剩下那些还没写进去的实战经验一条一条补上来包括红绿灯程序的状态机写法、倍福PLC在Windows下的软PLC调试、大棚灌溉这类项目从需求到程序的完整拆解。咱们接着往下看。