1. 为什么是"经验"而不是"教程"
入行前三年,我最大的感受是:PLC编程这件事,课本和手册能给你的东西其实很有限。梯形图怎么写、指令怎么用、通讯怎么配,这些都是标准知识,翻手册就能解决。真正拉开差距的,是那些踩过的坑、绕过的弯、被现场逼出来的判断力——这些东西没人会写进手册,但恰恰决定了你能不能从"会写程序"变成"能扛项目"。
所以我打算把这三年积累下来的90条实战经验陆续整理出来,每天更新几条,顺着调试现场、项目交付、程序架构这些真实场景往下写。这篇是第一部分,先讲清楚我理解中的"实战经验"到底指什么,再挑几条最基础也最容易被忽视的经验展开说。
先说一个很多人容易误解的点:经验不是知识点的堆砌。知道某个指令怎么用,那是知识;知道在什么场景下不应该用这个指令,那是经验。知道PID参数要整定,那是知识;知道现场整定的时候先看哪条曲线、先调哪个参数、什么情况下果断放弃闭环改手动,那是经验。同样是"知道",一个在书里,一个在骨头里。
所以这套经验整理,我不会按指令表逐条讲,而是按场景来组织。我今天先给自己定个框架,也方便后面写的时候不跑偏。整个系列我打算分六个方向:
- 程序架构与模块化设计
- 现场调试与信号排查
- 通讯与第三方设备对接
- 选型与系统设计
- 人机交互与报警处理
- 安全与冗余设计
这里面有些方向我自己还在爬坡,比如安全冗余,做过的项目不算多,写出来主要是整理思路,也希望能被有经验的前辈纠正。但前面几个方向,尤其是现场调试和通讯对接,踩过的坑确实够多,写起来会有底气一些。
2. 程序架构:一开始就乱,后面全是利息
2.1 程序分段规划的最优实践
刚接触PLC编程时,不少人习惯在OB1里一口气写完整个逻辑。这样做在小设备、纯手动控制时短期看不出问题,但当设备超过两三个工位、互锁条件变多之后,这种写法的维护成本会指数上升。一个最简单的判断方法是:当你需要靠搜索功能才能在程序里找到某个阀门对应的输出的时候,说明分段已经跟不上程序复杂度了。
我在某个模拟项目中曾接手一套需要后期频繁修改逻辑的PLC程序。由于原始程序将所有功能块集中在主循环内,每次改动时都必须仔细比对数十行网络注释,否则很容易影响既有逻辑。后来我将其按功能重新划分:将气动机构控制集中到独立功能块,并严格规定主循环只负责调用和调度,不直接承载设备动作逻辑。改动工作量立刻下降,主要的修改都集中在对某几个FC或FB的调整上,避免了对整体循环逻辑的频繁波及。
这里的关键不只是"分段",而是"分段的边界要贴合设备的物理结构"。我习惯按工位分,一个工位的所有动作、互锁、报警集中在一个FB里,内部用局部变量传递状态,外面只留几个接口给主循环调用。这样不管是查问题还是复用逻辑,都清晰很多。设备如果结构上就是模块化的,程序模块化往往能随之受益。
2.2 变量命名的隐性成本
这一条说出来简单,做起来其实比想象中难。变量命名这件事,在程序刚写完的时候永远不会觉得重要,真正理解它的价值是在有人需要接手你的程序、或者你自己在三个月后需要维护它的时候。而恰恰是这种"当时不觉得重要,想起来时已成本很高"的特性,让它很容易被忽视。
我见过不少程序,变量名逻辑混乱,比如直接使用I区地址、M区地址命名,或者用完全无法联想含义的中文拼音缩写。这类程序往往在设备出问题时,只能通过强制在线调试,花费大量时间逐点比对信号来源,才能定位问题。相比之下,清晰规范的前缀命名——比如"Valve_Output_ClampCylinderForward"这种结构——配合注释,能让多数排查工作在离线状态下就能完成,明显降低现场停机时间。
命名这件事还有一个容易忽略的点:一致性比词汇华丽更重要。哪怕你的命名体系不完美,只要全项目统一,后面的人(包括你自己)就能顺着规律推断。我给自己定的规矩是:前缀标类型(阀门、电机、传感器、气缸)、中间标区域(工位号)、后部标动作。不用很复杂,但全项目都要守同一个约定,乱一个地方就很容易演变成大面积混乱。另外,程序中各种变量的强制操作痕迹一定要保留到项目最终交付。不少维护团队曾在调试后期因为误用旧的强制状态,导致调试结果与实际运行状态不一致,浪费了大量排查时间。
3. 现场调试:信号排查才是真正的修罗场
3.1 信号不稳定先看地线
入行头一年,我遇到过一次特别典型的现场问题:某传感器信号偶尔丢失,检查了接线、换了模块,问题依旧。折腾半天后,一位很有经验的老师傅随手用万用表量了一下模拟量模块的电源地和信号地之间的压差,发现有接近两伏的电位差,问题立刻定位到现场地线接法不规范。那次之后我形成了一个习惯——但凡模拟量信号飘忽、数字量信号偶尔误触发,先不急着换硬件,第一优先级是确认接地。
这里顺便科普一下,模拟量信号最怕的就是地环路。现场多个设备共用一个地桩,如果某一路有大功率设备瞬间启动,地电位就会跳动,叠加到信号上就是干扰。处理方式通常是单点接地、信号地和电源地分开走。这件事在项目设计阶段定,比在现场绕线有效得多。很多调试问题其实在布线阶段就已注定,调试只是延迟发现了它。
排查步骤我一般这样走:
- 用万用表交流档量24V电源模块的输出,看波纹是否正常
- 量各模块的信号地和电源地之间的压差,如果超过0.5V,先解决接地
- 把干扰通道的信号线从线槽里抽出来,临时悬空走线,看问题是否改善
- 如果是屏蔽线,确认屏蔽层是单端接地还是双端接地,模拟量信号建议单端接地
3.2 中间继电器和输入点的爱恨情仇
第二个常被轻描淡写、实则影响很大的问题,是干接点信号和PLC输入模块之间的匹配。很多初学者第一次接触现场都会遇到这种情况:传感器在动作,指示灯也亮,但PLC输入点就是没有信号。检查时发现传感器是PNP输出,而PLC输入模块是源型或漏型,两者接线方式不同,自然采集不到信号。
这里再补充一个实际中经常出现的隐蔽问题——中间继电器的线圈两端没有并续流二极管。在有继电器输出的PLC模块直接驱动外部中间继电器时,线圈断电瞬间的反向电动势产生的尖峰,有时会干扰同柜体内其他信号线,导致输入信号误动作。处理方式其实很简单:在继电器线圈两端反向并联一个二极管,或者直接选用带续流保护的继电器模块。但这个小细节,在现场查起来往往要耗费不少力气。
所以排查这类问题的时候,我建议先确认三件事:
- 传感器的输出类型是NPN还是PNP,和输入模块是否匹配
- 中间继电器是直流还是交流线圈,驱动电路有没有反接保护或续流保护
- 输入信号有没有并接其他负载,导致分压不足
这三件事看似基础,但每个都是从现场真实问题里总结出来的。调试过程本身往往是一条线性的排查路径,看似是信号不亮,实际上可能是多种因素叠加,光靠猜和试,时间成本会非常高。
3.3 强制和取消强制的操作纪律
还有一个调试现场经常翻车的操作——强制。强制本来是为了短时间定位问题、让设备按预设状态动作,但很多人强制的点位多了之后,自己都忘了哪些是强制的。最后设备跑起来了,因为某些关键信号仍然处于强制状态,安全联锁失效,这种事故不是没发生过。
我给自己定的操作纪律是:
- 强制操作要有记录,记录哪些点被强制、为什么强制、预计什么时候取消
- 每次强制完,要在程序注释里标明"此处调试强制,待解除"
- 设备交付前,做一次全点位的强制状态检查,确保所有强制解除
- 涉及安全回路的点位,不允许强制,除非另行设置安全旁路并有监督机制
3.4 万用表、信号发生器与示波器,各干各的活
调试现场工具选型其实也体现经验积累。万用表你会带,信号发生器你不一定带,示波器多数人不会考虑。但说实话,对付模拟量飘忽、通讯不稳定这种疑难杂症,示波器比万用表直接得多。不一定要多高端,一个手持示波器就能看出信号波形上的毛刺和电平跳变,这是万用表测平均值根本看不出来的。有一次排查一个高速计数信号时,万用表读数完全正常,但PLC就是计数不准,接上示波器才发现信号在上升沿频繁抖动,最后在传感器输出端加了一个RC滤波才稳定。这类问题如果你只依赖万用表,再多时间也排查不出来。
当然,不是鼓励大家一上来就买示波器。我先说说我平时工具的优先级:
- 基础调试:万用表、螺丝刀、信号发生器(4-20mA模拟)
- 信号疑难:手持示波器、长柄表笔、钩子夹
- 通讯排查:带报文监控功能的调试软件、USB转RS485/232模块
这套配置不算贵,但能覆盖大多数调试场景。具体到通讯排查,下面单独讲。
4. 通讯对接:协议千千万,耐心是第一排
4.1 先定物理层,再谈协议层
通讯问题排查,我踩过最深的坑就是把协议和物理层混在一起。其实在工业现场,很多"通讯时好时坏"的问题,根源都在物理层——线材太差、接头氧化、线缆过长、终端电阻没拨码、屏蔽层接地不对。这些没搞定,上层协议再标准也白搭。我经手的一个项目里,某仪表的MODBUS RTU数据偶尔丢包,检查了波特率校验没问题,程序逻辑也反复核对没问题,最后换了一根正规厂家生产的屏蔽双绞线、并把终端电阻拨上之后,一天的丢包变成了零。这就是典型的物理层碾压。
所以排查通讯的第一步,永远是先确认物理链路本身是否可靠。具体做的事:
- 检查总线终端电阻是否按要求接入(RS485两端都要有)
- 用万用表量A/B间的静态电压,正常应在0.2-0.5V左右,且通信时电压有明显摆动
- 确认屏蔽层是否单端接地,且接地侧在PLC柜内
- 确认波特率、数据位、校验位,PLC端和从站端完全一致,必要时用上位机软件的报文监控来确认
4.2 报文级别的坑,只能靠报文来分析
物理层没问题了,接下来就是协议层。有些问题,比如从站回复CRC错误、偶尔超时,单看程序很难定位,必须抓报文。这时候用支持报文监控的调试软件或者串口监听工具,比空想有效得多。我看到过一种常见的情况:软件配置和从站一致,程序调用的地址也没错,但主站发送的功能码和从站手册里写的不一致,导致整条指令无响应。这种问题如果不通过抓报文观察实际发送内容,光在程序层面分析可能看一天也发现不了。
我的调试习惯是:先按从站手册的帧格式,用串口助手手动发一帧指令,看返回是不是符合预期。如果手动发送能通,说明链路和从站本身没问题,问题大概率在PLC程序组态或寄存器地址映射。如果手动发送也不通,那就要检查物理层和从站参数了。把问题这个切一刀,排查范围瞬间缩小一半。
4.3 寄存器地址映射别想当然
还有一个看起来低级、实际上发生率极高的坑——寄存器地址错位。不同的仪表厂家,保持寄存器地址的起始编号不一致。有的从0开始,有的从1开始,有的还把40001这个偏置写进文档。同样一个地址,在程序里填0和填1,结果可能指向完全不同的寄存器。遇到这类问题,最有效的办法是找设备的手册,确认它说明的MODBUS地址是按什么规则编号的。比如有些设备的说明书写"地址为40001",实际在协议帧里地址是0x0000。这类偏置问题,只能靠抓报文加对照手册来解决,靠经验猜的话误打误撞容易浪费很多时间。
从个人经历看,很多看起来复杂的通讯问题,底下都藏着特别简单的道理。操作上夯实了,协议规范了,问题自然就少了。
5. 报警与HMI:少弹窗多提示,报警也有设计感
5.1 报警分级别,处置分轻重
很多人把报警功能和"错误提示"混为一谈,觉得只要设备一停马上弹个窗就行了。实际上,报警设计的好坏,直接决定了操作工是愿意看报警还是直接忽略报警。如果一台设备动不动就一大堆红叉弹窗,操作工很容易疲劳,最后连真实故障也被一并忽略了。
我自己的习惯是把报警分三级:
- 信息级:设备正常运行但需要注意,比如某个参数接近上限,提示就行,不产生红色弹窗
- 警告级:设备还在运行,但某些条件异常,比如气压偏低,需要在HMI有明确提示,且可以设置允许延时,暂不停机
- 故障级:设备必须停机或禁止启动,比如安全门打开、急停按下,要声光报警,且故障原因必须记录
这个分级不是随便定的,是和工艺人员讨论之后确定的。因为有些报警,现场操作工觉得不影响生产进度,贸然停机反而引起抱怨。而安全相关的报警是底线,绝不能降级处理。所以报警分级是在工艺逻辑和安全需求之间做平衡,不能按照自己感觉来拍脑袋。
5.2 报警文案也是一门学问
报警信息的文字,能直接影响故障处理效率。如果报警写的是"驱动器故障",操作工看到了也只能继续等设备厂商来处理。如果写的是"X轴驱动器过载报警,检查机械卡滞或运行阻力",操作工就能先做初步判断,甚至自己排除一部分问题。所以我会在报警文本里尽量带上"可能原因"和"建议检查方向",虽然写的时候麻烦一点,但后续维护会很省力。
HMI的报警界面我习惯做成列表形式,按时间倒序排列,突出当前活动的故障级报警,历史报警可以按时间段筛选。这样操作工看一眼就知道"发生了什么、什么时候发生的、现在设备能不能继续开"。很多软件支持报警级别和文本描述,这个功能值得认真利用起来,建议不要嫌麻烦跳过。
6. 安全与冗余:有些错误不能靠调试发现
6.1 安全回路的优先级永远最高
PLC程序里,安全逻辑和普通逻辑的编写思路是有根本差异的。普通逻辑追求效率、灵活、自动运行覆盖率,但安全逻辑追求的是简单、可靠、可预测。常用安全回路往往不是用PLC实现的,而是硬接线的安全继电器回路。这不是说PLC不可以做安全相关控制,而是说安全功能的实现方式,越简单越不容易出问题。PLC程序里也可以做安全联锁,但要遵守"独立于普通逻辑、双通道输入、有明确测试周期"这些原则。对于刚入行的工程师,我建议先遵守一条底线:安全回路尽量用硬接线,不要依赖程序。
6.2 双CPU或软冗余要看项目实际需求
冗余这个话题,有时候会被过度设计。一些设备明明停机损失不高,却上了双CPU热备,成本和维护复杂度都上去了。反过来,有些产线的关键工位,停机一次损失数万,却没有做任何冗余配置,出事只能干等。这里的取舍需要回归到停产损失和故障概率来判断,不适合一概而论。对我来说,做冗余方案之前,一定会先问工艺方一个问题:这个工位允许的最长停机时间是多少?答案不同,方案完全不一样。
6.3 调试记录和安全测试,是底线不是流程
最后想强调的一点是调试记录的重要性。很多刚入行的同事觉得,调试记录是写给别人看的,自己心里有数就行。但实际上,调试记录是安全测试的依据,也是后续故障追溯的重要参考。你记录了安全门开关的响应时间、急停回路的切断时间、与第三方安全PLC的通讯中断处理反应,这些数据在平时看起来无关紧要,一旦出现异常,就是定位原因的有效线索。
我长期以来保持的一个习惯是每完成一个调试阶段,就把关键测试数据和当时的环境参数记录下来,哪怕只是随手记在工作群里的一张表格。一段时间后再回去看,很多项目的共性规律就慢慢浮现出来,比如哪些类型的传感器在潮湿环境下容易出现误动作、哪批继电器在低温下的吸合时间偏长。这些经验不是书上看的,是记录带来的回报,也是我写这90条经验的基础来源。
7. 后记:我会怎么持续更新这90条
这90条经验,我不会一次性全部发出来,而是每天更新几条,保证每一条都是自己实际遇到并且验证过的。有些内容可能会比较长,因为我想把背后的排查思路和原理一并写出来,而不是干巴巴地丢结论。毕竟只给出"这样做"的经验,换一个场景可能就失效了,但如果连"为什么这样做"也有完整的逻辑,遇到类似的问题时你就能举一反三。
更新顺序上,我打算先从现场调试和排查开始,这部分最容易帮到正在入行阶段、天天待现场的同行。然后是程序架构和通讯对接,再到报警设计与HMI,最后是选型与安全冗余。如果有新的项目经历产生足够的积累,也会穿插补充。
如果你在阅读过程中有不同意见,或者遇到过类似问题有更好的处理方式,欢迎指出来。因为对我来说,写这套经验本身也是一次整理与反思,有些做法可能只适合某类场景,换个行业、换个设备就不一定成立。愿意读到这里的人,大概率也是愿意在现场多琢磨问题的人,这种交流的价值,往往比单方面输出更大。