
刚接触PLC的人十有八九会在指令表面前愣住LD、AND、OR、OUT、SET、RST、TON、CTU……一屏英文缩写看起来像另一门语言。我自己带过不少从电工转过来的同事大家最困惑的往往不是指令本身难而是搞不清每一句指令到底对应现场哪根线、哪个按钮、哪个接触器。这篇文章就把PLC基本指令里最常用的一批逐条拆开讲透位逻辑指令怎么读开关、控线圈定时器和计数器怎么实现延时与计数数据传送和比较指令怎么让程序会算数最后再用电机启保停、抢答器这类入门必练的小程序把知识串起来。适合刚入门的电气工程师、设备维护人员、自动化专业学生也适合想做设备程序阅读理解的人。看完你会形成一套自己的判断拿到一台小PLC能独立写出能启动、能停止、能延时、能计数的程序。1. 先建立画面PLC到底按什么节奏思考1.1 输入采样、程序执行、输出刷新一个周期的完整过程PLC的一次思考严格分成三段。第一段叫输入采样。PLC把所有输入端子的电平状态一次性读进内部存储区形成当周期的输入快照。注意程序执行期间即使现场按钮状态变了PLC也当作没看到一切以下一轮采样为准。第二段叫程序执行。CPU从梯形图的第一行扫到最后一行逐条执行指令。第三段叫输出刷新。CPU将这轮运算得到的线圈结果统一写到输出端子驱动外部接触器、指示灯。整个过程叫扫描周期小型PLC通常只有几毫秒到几十毫秒。这个扫描节奏非常重要。你拿万用表量到按钮已经按下去了可输出就是没反应很多情况下不是程序错了而是输入状态发生在程序执行中途需要等到下一个周期才被采样到。理解了这一点调试时就不会瞎怀疑。1.2 指令的本质把继电器控制柜搬进芯片里想象一下老式电气柜交流接触器、中间继电器、时间继电器加上密密麻麻的硬接线。电机启保停靠的就是接触器自锁、互锁那套接线逻辑。PLC干的事就是用程序去模拟这些接线的通断。所以基本指令本质上只做两类事情一是判断电位也就是触点通断二是控制线圈也就是输出通断。从数据处理的角度看指令操作的对象分两类位元件只保存0或1。常见的有X输入继电器、Y输出继电器、M中间继电器、T定时器触点、C计数器触点。字元件保存数值可以做运算。常见的有T的当前计时值、C的当前计数值、D数据寄存器。新人不用急着记全部指令。我习惯给新学员列一张最小指令清单LD与LD NOT读触点状态、AND与OR串联与并联逻辑、OUT驱动线圈、SET与RST置位与复位、TON延时导通定时器、CTU递增计数器、MOV数据传送、CMP或触点比较数据大小判断。这十几条指令学明白入门阶段90%的逻辑都能搭出来。2. 位逻辑指令LD、AND、OR、OUT的正确用法2.1 LD与LD NOT程序里怎么读一个按钮LD是Load意思是读入。梯形图里每条支路的起始位置必须是LD或LD NOT。LD后面跟常开触点LD NOT后面跟常闭触点。这段描述看起来简单但和现场接线对应起来才是关键。比如你用一个常开启动按钮按下后X0变为ON那程序就用LD X0作为启动条件。反过来急停按钮通常接常闭触点程序里就要用LD NOT X1来读。X1没被按下时为ON按下后变为OFF逻辑断开输出切断。很多新人想不明白急停为什么用常闭其实是为了断线保护——急停线断了程序读到的是OFF设备照样停安全逻辑不失效。2.2 AND与OR串联、并联两种组合逻辑AND是把两个条件串联两个都为ON结果才为ON对应现场就是两张限位都到位才允许动作。OR是把两个条件并联任意一个为ON结果就为ON对应现场就是两处按钮都能启动。这里特别提一下AND NOT和OR NOT。AND NOT代表串联一个常闭点OR NOT代表并联一个常闭点。很多设备安全回路会这样写正常条件是门没开为ON门一开就断开动作条件。与其绕来绕去用取反不如直接记住串常闭、并常闭两种形态配合图纸看得快。2.3 OUT与双线圈问题一条铁律OUT指令把运算结果送到线圈。但在用OUT指令时有一条现场调试中血泪换来的铁律同一个线圈在程序里尽量只出现一次。原因在于PLC从上到下扫描如果Y0第一次OUT的结果是ON后面又有一段OUT把Y0改为OFF最终外部输出由最后一段决定前面那段逻辑相当于被覆盖了。这叫双线圈输出问题是新手程序中最高频的隐蔽错误之一。处理思路有三种不同分支用不同的中间继电器M做中转最后集中用一次OUT。把需要保持某状态的逻辑改用SET、RST实现。确实要分多处控制同一个输出时把条件汇总到一个总逻辑段里再输出。2.4 SET与RST不用自锁也能保持状态SET和RST是锁定式指令。SET执行一次线圈一直保持ON直到RST把它复位。和OUT加自锁触点的写法相比省去了OR自己的那根线程序更直观。一个典型的故障锁定逻辑LD X0 SET Y0 LD X1 RST Y0X0触发一次Y0保持X1复位后Y0才断开。这套写法在报警灯、故障停车、安全联锁里非常常见。要注意的坑是SET之后即使程序跳到别处线圈状态依然保持排查故障时容易忽略这个线圈是被哪条SET拉起来的建议在程序注释里写清每个SET的来源。3. 定时器与计数器让设备学会等待和记账3.1 三种定时器TON、TOF、TONR怎么选PLC定时器就像一只有触点的秒表。按使用场景最常见的是三种。TON是延时导通型。输入条件一成立定时器开始计时时间到触点动作输入条件一旦断开定时器立即复位。星三角启动中星形接法转三角形接法的延时用的就是TON。TOF是延时断开型。输入条件成立后触点立即动作输入断开才开始计时时间到触点才复位。冷却风扇在设备停机后继续转5分钟再停就是用TOF实现的。TONR是累计型定时器。计时过程中输入断开时间不丢失下次再接通接着累计累计到设定值后触点动作只有RST清零。设备运行总时间的保养提示计时用TONR很方便。3.2 时间参数与定时器编号时基不能想当然定时器指令写成TON T0 K50K50是设定值。但真正的时间是多少取决于定时器编号对应的时基。1毫秒基数的定时器K50就是50毫秒100毫秒基数的定时器K50就是5秒。差了一百倍。我见过有人把延时3秒写成了300秒设备半天不动作查了半天才发现是时基没看。不同厂家的定时器编号和时基分配不一样编程前一定先查手册确认定时器编号属于哪一时基。这是新手最常犯、也最容易自我怀疑的一个坑。3.3 计数器CTU按脉冲个数做事情CTU是递增计数器。每来一个上升沿当前值加1当前值达到设定值时计数器的触点动作用RST清零后可以重新计数。典型应用场景绕线机圈数计数、产品通过光电传感器计数、连续运行次数统计。计数器有个和定时器完全不同的特性它靠边沿触发不是电平触发。输入一直为ON计数器只记1次。如果现场出现一次通过记了好几下的情况通常是光电信号抖动需要在硬件上调整传感器灵敏度或者在程序里对输入信号做滤波处理。这个边沿概念对后面理解PLS上升沿指令也很重要。3.4 实战串联星三角启动里的延时过程把定时器串起来用才真正体会到它们的分工。一个星三角降压启动按下启动按钮后主接触器吸合星形接触器吸合电机降压启动3秒后星形接触器断开间隔0.5秒防止电弧短路再让三角形接触器吸合电机全压运行。LD X0 OR M10 ANI X1 OUT M10 LD M10 OUT Y0 LD M10 ANI T0 OUT Y1 LD M10 AND T0 OUT T1 K5 LD M10 AND T1 ANI Y1 OUT Y2T0负责3秒的启动延时T1负责星形断开后那0.5秒等待。这中间还用了互锁Y1和Y2不会同时吸合防止相间短路。基本指令不多但控制逻辑的严谨性全在这几行里。4. 数据传送与比较指令让PLC开始会算数据4.1 MOV指令给数据搬家MOV是最常用的数据传送指令写法很简单MOV K100 D0把常数100传送到数据寄存器D0。D0其实就是PLC内部一个可以存数值的小格子中间计算结果、配方参数、产量值都可以往里放。人机界面上的速度设定、温度设定通常就是写到D区程序再从D区读出来参与控制。有个实用技巧程序初始化时常用一组MOV把所有D区参数统一赋值避免上电后某些D区残留上次运行的旧值把设备带进错误的状态。4.2 CMP比较指令与触点比较指令程序里的交警比较指令负责判断数值大小关系。传统CMP写法是两个数比较后结果放在专用标志位里程序要额外判断标志位。现代PLC更推崇触点比较写法比如LD D0 D10 OUT Y5这句话的意思足够直白只要D0大于等于D10Y5就输出。当前产量达到设定值就报警、温度超过上限就停加热这种判断用触点比较写出来梯形图读起来和自然语言差不多。我在实际项目里更推荐触点比较因为CMP的标志位组合容易记混现场排障时看半天也反应不过来是谁比谁大。4.3 D数据寄存器的坑断电保持和断电清零数据寄存器按掉电后的表现分为断电保持型和断电清零型。不同型号的PLCD区地址划分规则不同。新手最容易踩的坑是把产量累计值存在断电清零的D区设备一断电再上电产量归零而有些设备参数存在断电保持区改了参数没断电复位旧值一直在程序看起来像没生效。所以做项目时第一件事就是查PLC手册里D区的保持范围表。掉电要保持的配方参数、累计产量、运行时间统一规划到保持区临时计算的中间量放在清零区反而更安全避免下次开机带着脏数据运行。5. 运算指令与程序控制让程序能跳转、会分支5.1 四则运算指令格式统一但要注意细节ADD、SUB、MUL、DIV的写法格式大致相同ADD D0 D2 D4意思是D0加D2结果存入D4。做产量统计时每完成一个工件给一个脉冲执行一次ADD加一累计值就出来了。这里有几个容易翻车的点结果寄存器最好不要和源寄存器重叠否则下一轮扫描会用上一轮的结果当输入逻辑就乱了除法要考虑除数为零的情况程序里先判断跳过数值溢出也一样结果超过寄存器范围时需要用溢出标志或改用更大位数的寄存器。实际工程里我没有一次是直接写完就完事的总会顺手把边界条件加进去。5.2 INC、DEC与边沿指令加一也要讲节拍INC和DEC是单操作数自加、自减指令比ADD K1简洁。但它们和计数器一样是按扫描周期执行的。如果驱动条件一直是ONINC每个扫描周期都会执行一次一秒钟可能加了上百次。正确做法是配合上升沿指令使用。上升沿指令只在信号从OFF变ON的那一刻导通一个周期类似按了一下按钮。老式PLC里常写PLS生成一个扫描周期的脉冲所以PLC在程序里会生成一个尖脉冲信号既可以用它去触发计数和累加也可以用它让某些动作只执行一次。搞懂边沿很多程序就不会出现莫名其妙的重复动作。5.3 CJ跳转与子程序让程序结构告别一团乱麻设备程序一旦超过几百行全部堆在主程序里会非常难维护。CJ跳转指令可以实现跳过一段程序不执行手动/自动切换就很典型手动模式跳过自动运行段自动模式跳过手动调试段。这样两种模式互不干扰也不会出现手动按了启动自动段里又输出一遍的乱象。子程序调用则适合同一套逻辑重复用。比如一条产线上有4台相同的风机每台控制逻辑一样那就不必复制4遍代码写一个风机控制子程序在主程序里调用4次。别人看你程序时结构清楚改参数也集中一处改处处改。5.4 配方切换小案例把数据指令串起来用用两套配方举个例子。X0按下配方1写入D1等于50X1按下配方2写入D1等于100。然后比较D1和当前产量D90产量达标就亮Y5。LD X0 MOV K50 D1 LD X1 MOV K100 D1 LD D1 D90 SET Y5这里把MOV的赋值、触点比较的判断、SET的保持一次全用上了。这种配方参数实时数据比较的模式在各种小型设备上出现频率非常高。6. 新手必踩的坑基本指令使用中的常见问题与排查6.1 双线圈与扫描顺序的真相前面提过双线圈问题这里再展开一层为什么上一个OUT不会真正起作用。PLC扫描是严格的先后顺序后面的赋值覆盖前面的赋值。所以排查时遇到输出状态和你预期不符第一件事不是怀疑硬件而是全网搜索这个线圈到底在程序里出现了几次。一个实用的检查习惯在编程软件里按一下交叉引用功能把某个线圈的所有引用位置列出来逐个看。凡是超过一处的OUT引用都要手动确认彼此的时序关系。很多间歇性故障排查到最后全是这个问题。6.2 定时器和计数器为什么没动作新人问得最多的问题是T0条件明明导通了为什么线圈没反应排查顺序通常是这样的定时器线圈的驱动条件真的为ON吗在监控模式下直接看那行指令有没有变成绿色。定时器编号的时基对不对K值对应的实际时间是否符合预期。是否在程序里其他地方对同一个定时器编号重复使用计数器则再加一项信号是不是抖动或者粘连导致边沿没有干净地触发。用监控模式比用万用表量更直接因为它能看到程序内部的实际状态。很多现场问题在软件监控画面里一眼就看穿了。6.3 程序下载了、PLC在RUN设备还是不动这种问题多半不是指令没配对而是系统层面的小疏忽。我整理了一张排查清单现象可能原因处理方向输出点没动作输出没刷新、接线接错、保险烧了看输出指示灯、查公共端输入信号取不到输入公共端没接、接线端子松动看输入指示灯、量端子电压程序没执行PLC还在STOP模式、运行开关没拨切到RUN模式、检查运行条件程序跑但结果怪双线圈、扫描顺序、数据区地址冲突交叉引用、监控数据寄存器断电恢复就乱D区保持属性选错核对保持型D区地址表这条清单基本覆盖了新人调试时80%的设备不动问题。比起反复改程序先确认输入输出本身通不通往往更快找到病根。6.4 边沿指令用不对一个动作变多次上升沿和下降沿指令最大的作用是把持续接通变成短暂脉冲。但这个脉冲宽度只有极短一个扫描周期肉眼在监控画面里甚至看不出来它亮过。所以如果你用边沿去驱动SET、INC这类有记忆的指令要记住它在每个周期只执行一次不是说条件一直ON就会一直执行。这个特性在实际调试中非常有用。比如产品计数每次光电传感器挡住一下就要计一次数正适合用上升沿。但要是现场信号本身抖动软件上就得加延时滤波或者在计数器硬件上做抗干扰处理。7. 两个必练的入门程序从指令到完整逻辑思维7.1 电机启保停完整案例自锁、互锁、急停一次到位不用多功能指令只用位逻辑就能写出完整、安全的电机控制。LD X0 // 启动按钮 OR Y0 // 自锁触点 ANI X1 // 停止按钮常闭 ANI X2 // 急停开关常闭 OUT Y0 // 电机接触器这段程序的逻辑链是按下启动线圈得电同时Y0自己的常开触点闭合形成自锁按下停止串联的常闭触点断开自锁消失线圈掉电急停则用常闭点按下后程序强制断开输出。它虽短但把LD的读入、OR的并联、ANI的串常闭、OUT的输出全部揉在了一起。我建议每个初学者都亲手在软件上把这四行画成梯形图、编译下载再配几个按钮和接触器实打实验证一遍。7.2 三人抢答器用SET与RST实现先按先得抢答器的核心是公平裁决谁先按谁亮灯别人再按无效。用位逻辑和锁定指令做起来非常顺畅LD X0 AND M10 // 允许抢答信号 SET Y0 LD X1 AND M10 SET Y1 LD X2 AND M10 SET Y2 LD X3 // 主持人复位按钮 RST Y0 RST Y1 RST Y2X0、X1、X2是三个抢答按钮Y0、Y1、Y2是对应的灯。谁先触发SET谁的灯先保持亮。第二轮开始前主持人按X3把所有灯复位。如果还想更严谨可以再加一个一旦有灯亮就封锁抢答的逻辑用常闭触点串在三个抢答支路里。这个例子的价值在于SET/RST天然适合记忆状态一个简单的想法用程序表达出来你就完成了从看指令到用指令解决问题的跨越。7.3 练完基本功之后往哪走基本指令熟练后下一步重点学功能指令块模拟量采集与PID调节、高速计数器、脉冲输出做步进和伺服定位、通讯指令读写变频器和仪表。这些领域听着高级其实底层还是条件判断数据处理输出控制的老三样。基础不牢后面学什么都会飘。我个人的体会是带过的同事里面学得最快的都有一个共同习惯手边常备一台淘汰下来的小PLC或者至少装好仿真软件每条指令不是靠看学会的而是靠敲和试学会的。程序写得不好没关系下载进PLC接上几个按钮、灯泡通上电那一刻指令的含义会一下子清晰很多。你先跑通启保停再做延时控制再加计数累加一步步下去基本指令就不再是抽象符号而是你手里顺手的工具。