1. 从“开关”到“大脑”PLC逻辑指令的本质是什么如果你刚接触工业自动化可能会觉得PLC可编程逻辑控制器是个神秘的黑盒子里面装满了复杂的代码和电路。但说穿了它的核心工作尤其是在入门阶段和我们小时候玩的积木、或者用开关控制灯泡的逻辑在本质上没什么不同。PLC的梯形图编程就是一种用图形化的“开关逻辑”来指挥机器干活的语言。而构成这门语言最基础的单词和语法就是那些基本逻辑指令。我干了十几年自动化带过无数新人发现很多人一上来就急着写复杂的流水线程序结果连最基础的“与”、“或”、“非”都搞混程序跑起来要么乱动要么死机。这就像没学会走路就想跑肯定要摔跤。所以今天咱们不扯那些高大上的通讯、运动控制就扎扎实实地把这27条基本逻辑指令掰开揉碎了讲清楚。这27条指令尤其是LD取、OUT输出这些是PLC编程的“原子”后面所有复杂的函数、功能块都是由它们组合而成的。掌握它们你才算真正拿到了打开PLC世界大门的钥匙。网上教程很多但往往只给指令表和简单的真值表看完还是不知道怎么用。我这篇不一样我会结合我这些年调试设备、培训学员时遇到的实际问题用最接近现场的场景——比如一个小型传送带启停、一个仓库门的光电感应、一个简单的混料罐控制——来带你一条条指令过。你会看到每一条指令在梯形图里长什么样在真实的PLC里是怎么工作的更重要的是在什么情况下该用它用错了会出什么幺蛾子。咱们的目标是看完这篇文章你不仅能说出这27条指令的名字更能闭着眼睛画出它们的应用场景在真正的项目里能毫不犹豫地用对它们。2. 指令家族的基石触点与线圈类指令深度解析当我们打开任何一款PLC的编程软件比如三菱的GX Works2西门子的TIA Portal开始绘制梯形图时最先用到的、也是最频繁使用的就是触点与线圈类指令。你可以把整个梯形图的左母线想象成电源的火线右母线想象成零线。电流能流从左边流到右边这个流动的过程就代表了逻辑的“导通”或“执行”。触点就是路上的开关线圈就是被控制的负载比如电机、指示灯。2.1 LD, LDI, OUT程序的起点与终点LD (取指令)这是所有程序的发令枪。它的作用是从左母线开始取用一个常开触点的状态。常开触点你可以理解为平时断开的开关只有被“按下”对应的存储位为ON或1时它才闭合允许能流通过。梯形图符号-| |-操作对象X输入继电器、Y输出继电器、M辅助继电器、T定时器触点、C计数器触点等。关键理解LD指令决定了逻辑行的开始条件。它不产生任何输出动作只负责“侦察”某个条件是否满足。LDI (取反指令)LD的孪生兄弟但性格相反。它取用的是常闭触点的状态。常闭触点平时是闭合的当对应的存储位为ON时它反而会断开阻止能流。梯形图符号-|/|-操作对象同上。一个经典误区很多新手会把LDI理解为“对LD的结果取反”这是不对的。LDI是直接去“侦察”一个常闭触点。比如LDI X0的意思是侦察输入点X0所连接的按钮假设是常闭型急停按钮是否被按下。如果没按下常闭触点闭合则条件满足。OUT (输出指令)逻辑行的终点站也是执行动作的命令。它把前面所有触点逻辑运算的结果输出到指定的线圈上。梯形图符号-( )-操作对象Y输出继电器、M辅助继电器、S状态继电器、T定时器线圈、C计数器线圈等。核心规则一夫一妻制在基本指令中一个逻辑行最后只能有一个OUT线圈但可以通过并联多个OUT指令输出到不同设备这涉及到ORB等指令后面会讲。线圈不能直接接左母线OUT前面必须至少有一个LD或LDI触发的逻辑条件不能空着。双线圈冲突这是新手最容易栽跟头的地方。绝对禁止在同一个程序扫描周期内用两个不同的逻辑条件去OUT同一个线圈例如在第一行Y0被置为ON在第十行另一个条件又把Y0置为OFF。PLC从上到下扫描执行后面的结果会覆盖前面的导致输出状态不可预测设备动作混乱。解决双线圈问题是编程规范的第一课。实操场景一个最简单的启保停电路假设X0是启动按钮常开X1是停止按钮常闭Y0控制电机。X0 X1 Y0 -| |------|/|----( )- | Y0 -| |---对应的指令表程序是0 LD X0 // 侦察启动按钮是否按下 1 OR Y0 // 与Y0的自锁触点并联下节讲 2 ANI X1 // 与停止按钮常闭串联下节讲 3 OUT Y0 // 输出到电机这个程序里LD X0是起点OUT Y0是终点。如果没有LDOUT就失去了判断的依据。2.2 AND, ANI, OR, ORI逻辑的串联与并联这四个指令是用来修饰和组合LD/LDI建立起的初始条件的。AND (与指令)串联一个常开触点。意思是“而且”。只有当前面的逻辑结果为“通”并且这个AND触点也“通”时能流才能继续向后。梯形图符号-| |-串联在已有触点后面示例LD X0 AND X1 OUT Y0。意思是只有X0和X1同时为ONY0才得电。ANI (与非指令)串联一个常闭触点。意思是“而且不”。梯形图符号-|/|-串联示例LD X0 ANI X1 OUT Y0。意思是X0为ON而且X1为OFF即常闭触点闭合时Y0得电。这常用于停止、急停、安全门检测等条件。OR (或指令)并联一个常开触点。意思是“或者”。当前面的逻辑结果或者这个OR触点任意一个为“通”时能流就能通过这个分支。梯形图符号从上一行并联下来画一个-| |-示例这就是上面启保停电路中自锁的原理。LD X0 OR Y0表示“启动按钮按下或者Y0自己已经得电”形成了一个自锁回路。ORI (或非指令)并联一个常闭触点。梯形图符号并联的-|/|-示例相对少用但在一些复杂的互锁、选择逻辑中会出现。比如LD X0 ORI M10表示“X0通或者M10断”时条件满足。经验之谈在画复杂的并联、串联逻辑时很容易把自己绕晕。我的习惯是先用布尔代数与或非把逻辑关系写在纸上比如Y0 (X0 Y0) * /X1其中表示或*表示与/表示非。然后再根据这个式子去搭梯形图先LD第一个条件然后看是串联AND/ANI还是并联OR/ORI一层层画下去不容易出错。2.3 LDP, LDF, ANDP, ANDF, ORP, ORF捕捉信号的变化瞬间这是一组边沿检测指令极其重要它们不关心信号是0还是1只关心信号有没有发生变化。在处理按钮、传感器信号时这是避免误动作的神器。LDP (取上升沿)只在指定触点的状态从OFF变成ON的第一个扫描周期内导通。梯形图符号-| P |-应用场景单次按钮触发。比如用按钮X0点动控制一个动作如果你用LD X0那么按住按钮期间动作会一直持续。而用LDP X0则无论你按多久该动作只执行一个扫描周期通常几毫秒非常适合用于计数、启动一个只需触发一次的过程。LDF (取下降沿)只在指定触点的状态从ON变成OFF的第一个扫描周期内导通。梯形图符号-| F |-应用场景松开按钮时触发。比如在安全设备中有时需要在松开急停按钮常闭触点从断开到闭合的瞬间触发一个复位或状态确认信号。ANDP, ANDF, ORP, ORF分别是边沿检测的串联与并联形式。例如LD X0 ANDP X1表示X0为ON并且在X1出现上升沿时条件满足。踩坑实录边沿指令的“一次性”特性既是优点也是陷阱。我曾经调试一台设备用LDP X0来触发一个物料推进动作结果发现偶尔会漏推。查了半天才发现是因为PLC扫描周期很快操作员按按钮的时间如果恰好跨了两个扫描周期LDP指令就能捕捉到但如果按下的瞬间刚好在某个扫描周期中间且松开也在同一个周期内虽然人感觉不到但机械触点可能抖动LDP就可能漏掉这个变化。解决方案对于关键的手动触发信号最好配合一个几十毫秒的定时器做防抖滤波或者用“信号状态边沿检测”的双重判断逻辑更稳妥。3. 构建复杂逻辑栈操作与主控指令当逻辑不再是简单的一行而是有多重分支、嵌套时就需要栈操作指令来管理这些分支的“上下文”了。你可以把它理解为编程中的“括号”用来明确逻辑的运算顺序。3.1 MPS, MRD, MPP逻辑堆栈的“记忆面包”这三条指令是三菱FX等系列PLC的特色用于处理分支公共点的输出。西门子S7-200/300/400的ALD、OLD指令以及S7-1200/1500的“T型分支”其思想是相通的。MPS (进栈)将当前逻辑运算结果压入堆栈记忆保存起来。MRD (读栈)读取堆栈最顶层保存的逻辑结果但不把它从堆栈里拿走。MPP (出栈)读取堆栈最顶层保存的逻辑结果并把它从堆栈里弹出来。它们解决什么问题看一个典型需求一个总开关控制三个设备但每个设备还有自己独立的开关。X0总开关 -| |----------------------( Y0 )- // 设备1仅受总开关控制 | |----| X1 |--------( Y1 )- // 设备2需总开关和X1同时开 | |----| X2 |--------( Y2 )- // 设备3需总开关和X2同时开如果用基本触点指令硬写需要重复写LD X0。用栈指令可以更清晰0 LD X0 // 判断总开关 1 MPS // 将“X0通”这个结果存起来进栈 2 OUT Y0 // 直接控制Y0 3 MRD // 读出刚才存的结果读栈 4 AND X1 // 和X1进行“与”运算 5 OUT Y1 // 控制Y1 6 MPP // 读出并清除栈顶结果出栈 7 AND X2 // 和X2进行“与”运算 8 OUT Y2 // 控制Y2使用限制与技巧栈的深度是有限的例如FX系列是11层。嵌套太多会复杂难懂现代编程中更推荐使用辅助继电器(M)来中转逻辑。比如上面例子可以LD X0 OUT M0然后后面分别用LD M0 AND X1 OUT Y1等程序可读性更强也便于调试。3.2 MC, MCR给程序段加上“总闸”主控指令用于控制一大段程序的执行与否相当于一个“程序段开关”。MC (主控开始)当MC前面的条件满足时执行从MC到MCR之间的程序。不满足时这之间的程序全部被跳过其中所有的普通输出Y M变为OFF但定时器、计数器、SET/RST指令的状态会保持视具体PLC型号而定需查手册。MCR (主控复位)主控区域的结束标志。梯形图符号MC指令像是一个带条件的左母线分支点。应用场景模式选择设备有“手动”、“自动”、“维修”多种模式。可以用一个模式选择开关的对应状态作为MC的条件将不同模式下的程序段分别用MC/MCR包起来使程序结构清晰避免模式间的误干扰。急停处理将急停信号常闭触点取反后作为MC的条件。一旦急停按下MC条件不满足主控区内所有输出强制断开设备立即停止而急停复位后程序能从中断点继续或按预设流程启动。注意事项MC/MCR可以嵌套使用但必须一一对应不能交叉。滥用MC/MCR会让程序流程变得隐蔽不利于调试。在结构化编程思想流行的今天更推荐使用“子程序调用”或“功能块”来实现类似的分段控制这样逻辑更模块化。4. 置位、复位与脉冲输出让控制更稳定可靠SET和RST是一对强大的指令它们改变了OUT指令“每个扫描周期都刷新”的特性实现了“锁存”功能。4.1 SET, RST状态的“开关锁”SET (置位)当执行条件从OFF变ON时将指定的软元件位置为ON并保持即使执行条件后来变为OFF了它依然ON。RST (复位)当执行条件从OFF变ON时将指定的软元件位置为OFF并保持。RST还可以对字元件如定时器T、计数器C的当前值数据寄存器D进行清零。梯形图符号-( S )-和-( R )-与OUT指令的核心区别 用OUT Y0如果前面的条件断开Y0立刻变OFF。而用SET Y0只要被执行过一次Y0就永远ON直到被RST Y0复位。这完美解决了“自锁”需求而且程序更简洁。 上面的启保停电路可以改写为X0 X1 -| |-------------[ SET Y0 ]- X1 -| |-------------[ RST Y0 ]-这里X0启动的上升沿让Y0置位并保持运行X1停止的上升沿让Y0复位停止。注意这里对停止按钮X1的取反处理在硬件接线或软件里很重要。RST的扩展应用RST T0不仅将定时器触点T0复位还将它的当前值清零。RST C0同理复位计数器触点并清零计数值。RST D0将数据寄存器D0的值清零。4.2 PLS, PLF产生一个扫描周期的脉冲PLS (上升沿脉冲)当执行条件从OFF变ON时让指定的软元件通常是辅助继电器M产生一个宽度为一个扫描周期的ON脉冲。PLF (下降沿脉冲)当执行条件从ON变OFF时产生一个扫描周期的ON脉冲。梯形图符号-( PLS M0 )-和-( PLF M1 )-它们有什么用驱动SET/RST这是最经典的用法。用按钮的边沿信号去触发SET/RST避免因按钮按下时间过长导致重复置位/复位。X0启动按钮 -| |--------------[PLS M0]- M0 -| |--------------[SET Y0]- // Y0启动并保持 X1停止按钮 -| |--------------[PLS M1]- M1 -| |--------------[RST Y0]- // Y0停止信号分频与状态切换配合计数器可以实现按N次按钮切换一次状态的功能。触发单次操作比如只执行一次的初始化、数据传送等。核心心得在工业现场机械按钮、传感器不可避免地会有抖动。SET/RST配合PLS/PLF或LDP/LDF使用是消除抖动影响、确保动作准确可靠的黄金组合。我定下的一条编程铁律就是所有来自现场的手动按钮信号在参与重要逻辑控制前必须进行边沿处理。这能避免无数奇葩的偶发性故障。5. 定时器与计数器让PLC拥有“时间”和“记忆”基本逻辑指令处理的是瞬间状态而定时器和计数器让PLC能处理“持续一段时间”和“发生了多少次”这类问题这是实现顺序控制、流程控制的基础。5.1 定时器指令定时器本质是一个累加器当它的驱动条件成立时开始对时钟脉冲如100ms10ms进行累加当当前值达到设定值时其触点动作。OUT T (驱动定时器线圈)例如OUT T0 K50。驱动T0设定值为50单位取决于定时器类型如100ms定时器就是50*100ms5秒。常开/常闭触点定时器时间到后其常开触点T0闭合常闭触点T0断开。定时器的两种基本类型通电延时型 (TON)最常见。驱动条件ON后开始计时时间到触点动作驱动条件OFF定时器立即复位当前值清零触点恢复。X0 T0 -| |------------[ OUT T0 K100 ]- // X0接通10秒后 | | | ----( )- // T0触点接通 | T0 -| |----------------( Y0 )- // Y0得电断电延时型 (TOF)驱动条件ON时触点立即动作当前值清零驱动条件OFF时开始计时时间到触点才复位。某些PLC型号有专门的断电延时定时器指令。关键参数与常见问题设定值可以是常数K也可以是数据寄存器D的值后者可以实现可变定时。当前值在PLC停电时普通定时器的当前值会清零。如果需要保持需用断电保持型定时器。精度与误差定时器的计时基于PLC的扫描周期和内部时钟。在驱动条件刚ON的那个扫描周期开始计时时间到后的下一个扫描周期触点才动作。因此定时器的最小误差是一个扫描周期。对于高精度定时需求需使用高速定时器或中断。5.2 计数器指令计数器用来对输入脉冲的个数进行计数。OUT C (驱动计数器线圈)例如OUT C0 K5。驱动C0设定值为5。RST C (计数器复位)RST C0将计数器当前值清零触点复位。计数输入计数器的驱动条件每出现一次从OFF到ON的上升沿当前值加1。计数器的两种基本类型16位增计数器计数范围0-32767。当当前值达到设定值如K5时计数器触点动作并保持即使继续有脉冲输入当前值也不再增加有些型号会继续增加但触点状态不变。必须用RST指令复位。X0计数脉冲 X1复位 -| |--------------------[ OUT C0 K5 ]- | | | ----( )- | C0 -| |-----------------------( Y0 )- // 计满5个脉冲Y0亮 X1 -| |-----------------------[ RST C0 ]- // 复位C032位增减计数器有专门的加计数输入和减计数输入当前值可增可减范围-2,147,483,648到2,147,483,647。常用于位置控制等场合。应用技巧长定时/长计数用一个定时器或计数器计时/计数到后触发另一个定时器/计数器如此串联可以实现几乎无限长的时间或计数。高速计数普通计数器受扫描周期限制频率不能太高。对于编码器、高速脉冲信号必须使用PLC硬件支持的高速计数器(HC)功能。计数器自复位将计数器自己的常开触点并联在复位条件上可以实现计满设定值后自动复位循环计数。6. 梯形图绘制规则与程序优化实战心得懂了指令不等于能画出好程序。梯形图有它自己的“语法”规则违反这些规则软件会报错或者程序行为诡异。6.1 必须遵守的绘图“军规”左重右轻上重下轻触点应尽量画在左侧和上方线圈画在右侧和下方。能流方向永远是从左到右从上到下。不允许出现从右向左的“反向能流”。线圈右边不能有触点输出线圈OUT SET等必须放在逻辑行的最右端。避免双线圈前文已强调这是大忌。同一个线圈编号在同一个扫描周期内只能被驱动一次。复杂逻辑的等效变换对于复杂的串并联电路有时需要运用逻辑代数进行化简或者使用栈指令、辅助继电器来重构使其符合梯形图格式。例如(A*B) (C*D)这样的逻辑需要拆分成两个并联支路。6.2 从“能用”到“优秀”的编程思维掌握了27条指令和绘图规则只能写出“能用”的程序。要写出稳定、易读、易维护的“优秀”程序还需要一些工程化的思维。1. 善用辅助继电器(M)不要把所有的逻辑都直接堆到输出Y上。辅助继电器是你的“草稿纸”和“中间变量”。分步逻辑将复杂的条件判断先用M存储中间结果最后再用M去驱动Y。这样逻辑清晰便于分段调试。程序注释给每一个有明确功能的M点加上详细的注释比如M100自动启动允许标志、M101气缸A前进到位。几个月后回头看你还能看懂。功能隔离用不同的M区间划分不同功能模块比如M0-M99用于手动模式M100-M199用于自动流程M200-M299用于报警处理。2. 建立标准的起保停与模式框架对于一个设备程序一开始就规划好结构。总急停与复位用最重要的安全信号如急停按钮、安全门作为总MC条件或直接串联在关键输出回路。模式选择用一个字如D0或一组M点来明确表示当前模式手动、自动、单步、维修。所有动作逻辑都必须判断当前模式。手动操作部分每个执行机构气缸、电机都应有独立的手动点动、前进/后退控制方便调试和维护。自动流程部分用步进顺序控制可以用基本指令搭也可以用步进指令STL或SFC来实现每一步的条件和动作要明确。3. 信号处理与抗干扰输入滤波PLC软件里通常可以设置输入点的滤波时间如10ms滤除短于该时间的干扰脉冲。对于关键信号可以在程序里用定时器自己做软件滤波。互锁与连锁两个不能同时动作的部件如电机的正转和反转必须在程序里进行互锁确保一个输出ON时另一个的驱动回路被强制切断。连锁则是确保动作A未完成前动作B不能开始。状态反馈超时检测对于一个输出动作如电磁阀得电必须监测其应有的反馈信号如气缸磁簧开关是否在合理时间内到位。如果超时则触发报警并停止流程。这是防止设备卡死、损坏的关键。4. 调试与注释在线修改与监控充分利用编程软件的在线监控功能实时观察触点、线圈、定时器/计数器当前值的变化这是排查故障最快的方式。强制与模拟在设备不动或安全前提下可以强制某些输入点ON/OFF模拟现场信号测试程序逻辑。但强制输出要极其小心注释注释注释在每一个网络、每一个关键指令后写上注释说明这段程序是干什么的为什么这么写。这不仅是给同事看更是给三个月后的自己看。回到最初的27条指令它们是你的工具。一个优秀的电工不仅认识螺丝刀、扳手更知道在什么场合用什么工具最顺手怎么用力最省劲、最安全。PLC编程亦然。通过大量的练习把这些指令融入你的思维看到一台简单的设备脑子里就能自然浮现出用这些基本指令搭建的控制逻辑框架那时你才算真正入门了。接下来的路还有功能指令、通讯、运动控制等更广阔的天地但脚下这27块基石务必打牢。