PLC基本指令核心解析:扫描周期、定时器、计数器与边沿检测实战应用

发布时间:2026/10/14 3:23:04
PLC基本指令核心解析:扫描周期、定时器、计数器与边沿检测实战应用
刚入行的时候我拿到第一台PLC的第一反应是翻手册查指令对着表格一条条看常开、常闭、线圈、定时器、计数器……看完了觉得都会了一写程序就懵。后来带过几个新人发现大家卡住的地方惊人的一致不是指令本身多难而是不知道这条指令在什么场景下该用、用了之后扫描周期里到底发生了什么。这篇文章就把PLC基本指令这件事从头捋一遍。不按手册目录念而是按“你拿到一个控制需求脑子里该怎么想”的顺序来拆。适合刚接触PLC的电气工程师、设备维护人员也适合自学自动化想系统补基础的人。读完你能搞清楚常开常闭和线圈背后到底是什么逻辑定时器计数器怎么算时间边沿检测解决什么问题以及程序写出来不对劲的时候最可能错在哪。1. 先把指令放进整个控制逻辑里看很多教程讲指令是一条一条讲的这没问题但容易让人学完就忘。我建议换个角度先把PLC的工作方式弄清楚再回头看指令你会发现每一条指令都是在回答“某个时刻某个条件成立吗”这个问题。1.1 PLC到底是怎么“跑”程序的PLC不是像人读说明书一样一行一行看完就结束它是按扫描周期循环工作的。一个扫描周期大致分三步读输入、执行程序、写输出。程序从头扫到尾扫完一遍再从头开始循环往复速度很快典型扫描周期在几毫秒到几十毫秒之间。这个机制对理解指令特别重要。你写的每一句指令在每个扫描周期里都会被扫描到一次只是条件满足不满足的问题。所以常开触点接通了不代表线圈一直有输出而是说“在程序扫描到这一行的时候这个触点的状态是通的”。举个例子你在第10步给一个线圈通了电在第100步又用它的常开触点去控制别的输出。同一个扫描周期内第100步看到的是第10步刚算出来的结果。这就是所谓的“顺序执行”指令的位置会影响结果。这一点新手容易忽略但确实是最基础的认知。1.2 基本指令在整套知识里的位置PLC的指令体系从大类上分有基本指令、应用指令、通信指令、运动控制指令等。基本指令一般指位逻辑指令、定时器、计数器、边沿检测、比较、传送和程序控制这几类。为什么先学基本指令因为90%以上的开关量控制逻辑都可以靠它们搭出来。电机启停、指示灯控制、报警联锁、自动循环、计时计件这些实际工程里最常见的需求基本指令都能解决。后面学的模拟量处理、PID、通信反而是建立在“你已经能用基本指令把设备动作控制好”的前提上的。工控这个行业有个特点设备的故障往往不在高端功能上而在基础逻辑上。双线圈冲突、定时器没复位、触点用错常开常闭这些基本都是基本指令层面的问题。把基本指令用扎实比会背一堆应用指令更值钱。2. 位逻辑指令整个梯形图的砖块位逻辑指令是PLC程序里最频繁出现的指令。它们处理的都是“位”——也就是一个只有ON/OFF两种状态的量。理解位逻辑重点不是记住指令名字而是理解梯形图中电流从左边母线流到右边的那个过程。2.1 常开触点、常闭触点与线圈梯形图里最基础的三个符号常开触点--| |--、常闭触点--|/|--和线圈--( )--。常开触点的含义是当它对应的那个位为ON时触点闭合允许电流流过为OFF时触点断开。常闭触点正好反过来位为OFF时闭合。线圈则是输出只要左边条件满足有“电流”流过来线圈就置ON。这里有个容易混的点物理继电器上的常闭触点和PLC程序里的常闭触点在“初始状态”上逻辑是一致的但PLC里的触点状态是“内存位的状态”不是真实物理触点。你要是把一个常开按钮接到PLC输入上程序里想检测“按钮没按”这个状态需要用的是常闭触点不是常开。反过来如果按钮接的是常闭急停常闭串在回路里是常态程序里就要反过来处理。实际调试中急停按钮的处理是个经典例子。急停接常闭触点PLC上电后输入点一直是ON。如果程序里用常开触点去检测急停那PLC一上电就认为急停没被按下因为输入是通着的这样反而把逻辑搞反了。正确做法是程序里用常闭触点来映射“急停正常”这个状态或者干脆在硬件回路上切断急停不进PLC。这里面有安全设计的考量不展开细说但基本触点逻辑你一定要能绕明白。2.2 置位与复位锁存逻辑的利器置位Set和复位Reset指令和线圈最大的区别是“保持性”。线圈输出是“扫描周期内有效”条件没了线圈就断开。置位指令一旦执行不管条件还成不成立被操作的位始终保持ON直到被复位指令断开。这个特性在工程里非常实用。比如一个泵的启动和停止启动按钮按一下置位泵运行标志停止按钮按一下复位这个标志。中途启动信号早就没了泵还能一直运行靠的就是置位的保持能力。置位和复位有个优先级问题需要提前想清楚。如果程序中置位和复位同时满足谁排在后面谁赢——后面的指令覆盖前面的结果。所以写程序时复位逻辑一般放在置位逻辑的后面保证停机优先。很多设备误动作的事故就是因为在程序最后又加了一段置位逻辑把前面的复位给覆盖了。不过程序里如果过度使用置位复位后面排查逻辑会很痛苦因为要来回找谁置了它、谁复了它。我见过一些老程序全是置位复位查一个问题翻了十几段逻辑。建议是简单的启停用线圈加自锁就够了存在多条件交叉控制或者需要记忆状态的时候再考虑用置位复位。3. 定时器控制节奏的基本功定时器大概是PLC指令里应用场景最广的一类了。延时启动、延时停止、闪烁、超时报警、设备运行时间统计都要用到定时器。各家PLC的定时器指令名字不一样但功能无非几种通电延时、断电延时、保持型延时。3.1 通电延时定时器TON通电延时是最常用的定时器类型。它的行为是使能条件满足后定时器开始计时时间到达设定值后定时器的输出位变为ON。条件断了输出立即回到OFF当前计时值也清零。在西门子PLC里叫TON在三菱里是T加上OUT指令配合欧姆龙里是TIM。用法逻辑完全一样只是编程时定时器编号和设定值格式有差异。计时精度的概念要说一下。定时器的时基分辨率决定了它内部计时单位常见的有1ms、10ms、100ms。同样是设定值10用1ms时基就是10ms用100ms时基就是1s。实际编程时要根据控制精度需求选不是随便挑一个就行。比如设备要求延时0.5秒后启动用100ms时基的定时器设定值填5就行。如果要求延时0.05秒那就要用10ms甚至1ms时基了。3.2 定时器使用中容易翻车的几个细节第一个坑断电延时怎么做。很多人以为把TON的条件反过来就行其实不对。TON条件消失输出立即消失做不到“输入断开了输出再保持一段时间”。实现断电延时一般用两种方式一是用一个TON它的使能条件是输出的常闭触点逻辑有点像绕二是直接用专门做断电延时的TOF指令大多数PLC都支持直接调用就行。第二个坑定时器复位。保持型定时器TONR也叫积算定时器比如西门子的TONR、三菱的ST和普通TON的差别在于条件断开计时值保持不归零再次满足条件从上次停的位置继续。要让它的计时值清零必须单独用复位指令。如果你用了保持型定时器但没有复位逻辑程序跑一年计时值可能已经超大设定值彻底失去意义。每轮循环必须复位这一点务必养成习惯。第三个坑扫描周期和定时器精度。定时器精度受扫描周期影响这是很多刚接触PLC的人没想到的。PLC定时器的计时基准是内部的定时中断但定时器输出状态的刷新是跟着扫描走的。也就是说如果定时器在扫描周期的末尾刚好到时间输出要等到下一轮扫描才变ON实际误差可能有一个扫描周期。大多数设备控制对这个精度无感但如果做高速场合要留好余量或者改用中断方式处理。3.3 定时器组合实战电机星三角启动延时举一个最常见的例子星三角启动。电机启动时先星形接法延时一段时间后切到三角形接法。用两个TON就能实现。启动信号来之后主接触器吸合同时启动一个延时3秒的TON星形计时。这个TON时间到它的输出位变ON断开星形接触器同时启动另一个延时0.1秒的TON切换延时避开星形与三角形同时接通的瞬间。第二个TON时间到吸合三角形接触器。这里有个细节星形和三角形切换之间加的0.1秒延时是为了防止切换瞬间短路。实际工程里这个时间要看接触器的机械动作时间有的接触器动作慢0.1秒不够要加到0.3秒甚至更多。这种参数不是抄别人的要根据你实际用的接触器和负载来调。4. 计数器计件和定位的基础计数器也是基本指令里没法跳过的一块。计件统计、循环次数控制、位置计数都得靠它。4.1 加计数、减计数与复位最常见的加计数器CTU每来一个脉冲也就是计数输入从OFF变ON的一次跳变计数值加1。当前值到达预设值输出置ON。复位输入有效时当前值清零输出OFF。减计数器CTD则是反过来从预设值开始往下减减到0输出ON。有的场合用减计数更方便比如倒计剩余次数。还有个加减双向计数器CTUD既能加又能减用两个输入分别控制适合位置类计数场景比如编码器正转加、反转减。计数器和PLC扫描周期的关系需要特别理解一下脉冲输入要能“被计数”这个输入的ON状态至少要维持一个扫描周期以上。如果外部信号是一个很窄的脉冲扫描周期20ms脉冲只有5msPLC可能根本看不到它有跳变。所以高速计数场合要用PLC的高速计数器功能那是另一套机制不是基本计数器能处理的。4.2 计数器配合定时器生产节拍统计举个实际的场景一条产线上每完成一个工件传感器会送一个脉冲到计数输入。你一天要统计产了多少件。这个直接用加计数器就能实现复位方式可以手动清零也可以每天零点自动复位。另一个常见用法是“每N个产品取一个样”。比如每生产100个产品发出一个信号让设备暂停操作员抽检一个。计数器的预设值设100输出置位后作为“取样请求”标志操作员取完样按下确认按钮复位计数器重新开始下一轮。这种逻辑用CTU加一个复位输出就能搭出来。计数器的预设值范围各大品牌差别不大一般都是0到65535或者更大具体看PLC型号。如果是双字节的计数范围还不够那就要考虑程序里自己做累加计算了用加法和比较指令配合可以计数到任意大范围。5. 边沿检测只“响应一下”的指令你有没有遇到过这种情况按钮按住不放程序里那个线圈就反复触发或者一个加计数器在按住按钮的期间疯狂计数。这就是“电平触发”带来的问题。很多时候我们需要的是“按钮按下的那一刻只执行一次动作”这就是边沿检测的应用场景。5.1 上升沿和下降沿的区别边沿检测分两种上升沿由OFF变ON的那一刻和下降沿由ON变OFF的那一刻。上升沿检测指令只在信号从0变1的那个扫描周期内输出一个扫描周期的ON脉冲之后就变回OFF了直到下一次再出现0到1的跳变。打个比方电平触发像开关灯灯亮不亮只看开关当前的状态。边沿触发像门铃按钮按一下响一声你一直按着不放手也只在按下去的第一下响后面按住不动不会响。程序里怎么用以三菱为例上升沿是LDP下降沿是LDF在西门子里则用|P|和|N|触点或者R_TRIG/F_TRIG功能块。欧姆龙里是DIFU和DIFD指令。逻辑上都是同一回事。5.2 为什么边沿检测在设备控制里这么重要举一个典型的错误启动按钮控制一个运动的夹紧气缸。你用的是普通常开触点直接驱动气缸电磁阀输出。操作工按了一下启动按钮觉得没反应又按了一下或按住不放。结果按钮一直通的气缸一直在指令夹紧。按你的设计按钮本来就该按一下夹紧一次按两下应该重新循环但因为程序里是电平触发按住不放的时候输出一直是ON整个动作循环就不对了。改成上升沿触发之后按钮按下去只有那一瞬间发出一个脉冲夹紧气缸动作一次。哪怕操作工按住按钮不放也只有一个脉冲再次动作必须松开再按。这就保证了操作逻辑的确定性。顺带说一个实际经验很多设备的启动和停止按钮建议都加边沿检测尤其在自动循环程序里。不然按钮长按或者抖动干扰都可能导致莫名其妙触发两次。老手写程序常年在触点前面带个上升沿不是习惯问题是吃过亏后形成的肌肉记忆。6. 比较指令和程序控制指令让程序有判断力位逻辑、定时器、计数器解决的是“条件满足就执行”的问题。但设备控制里经常还有另一类需求当前计数值到没到某个范围当前时间是白天还是晚上温度值是不是超过了上限这就轮到比较指令上场了。除此之外程序控制类指令主控、跳转、循环也在一些场景里非常好用。6.1 比较指令的几种形态比较指令的常见形式有两种一种是“比较触点”直接在梯形图里当条件用比如“当前值 设定值”这个条件成立输出置ON。另一种是“比较功能指令”比较结果作为标志位通过标志位去参与后续逻辑。按数据类型分比较指令有整数比较大于、小于、等于、不等于、大于等于、小于等于、浮点数比较和字符串比较。整数比较最常用比如产量达到设定值就报警停机、运行时间超过保养周期就亮保养灯。比较的时候有个数据类型匹配的问题很容易被忽略。比如模拟量采集回来的值在某些PLC里以整数存储你拿它和浮点数比系统要么自动转换要么直接报错不同品牌做法不同。写程序前要把数据格式对齐这件事想清楚。6.2 主控指令、跳转指令和循环指令的使用经验主控指令MC/MCR西门子里的MCR区三菱的MC/MCR负责把一段程序整体控制起来。当主控条件是ON时夹在MC和MCR之间的程序正常执行主控条件是OFF时这段程序中的线圈全部断开定时器计数器暂停。这个指令适合控制一个大流程块的投切比如自动模式下执行自动逻辑手动模式下整段跳过。跳转指令JMP能让程序跳过一段逻辑。适合不同配方不同工艺路径的切换。但跳转指令我建议少用因为程序一旦充满了跳转标签可读性直线下降。别人接手你的程序顺着流程走着走着突然跳走了排查故障非常头痛。能用主控或者分段程序结构解决的就别用跳转。循环指令FOR/NEXT在PLC里用得不多但做批量数据处理时很管用比如批量初始化一组数据寄存器。要注意循环体内的指令执行需要时间不要在里面写太多逻辑否则单次扫描周期会被拉长影响整个PLC的响应速度。7. 常见问题与排查技巧实录这部分是我最想写的。基本指令学起来都简单但实际调试中踩的坑九成都是“指令本身没问题组合起来出了问题”。我把带的徒弟和新同事最常遇到的几类问题整理一下你可以当个速查表用。7.1 双线圈输出冲突同一个线圈在程序里出现了两次这是新手特别容易犯的错。比如Q0.0这个输出在A段逻辑里写过一次又在B段逻辑里写了一次。PLC扫描的时候从上往下扫第一次扫描到Q0.0置ON了扫到下面又看到一次Q0.0可能被置OFF了。最终输出来看以最后一次扫描到的结果为准。问题是这个“最后结果”往往取决于程序结构跟你本来想表达的工艺逻辑完全对不上。排查这种问题可以用编程软件的交叉引用功能搜索某个输出的所有使用位置检查是不是有重复赋值。有的话尽量合并为单一输出把控制条件汇总到一处。7.2 扫描顺序导致的“看起来像BUG”的现象有些程序逻辑上没问题但因为指令位置摆放不对出现了违背直觉的现象。一个典型场景一个输出点控制电机你在程序的前面用它的常开触点做联锁又在后面用它去驱动输出线圈。由于前面触点状态是在同一次扫描周期内“读到”的如果电机启动的线圈在很靠后的位置前面联锁逻辑这一轮看到的还是上一轮的状态就可能会出现“按了启动但启动确认信号要等一个周期才同步”的情况。这类问题排查的时候不要盯着某一条指令看把整段逻辑按扫描顺序在纸上画一遍标清楚哪一步在哪一轮生效。多画几次你对PLC的“顺序执行”理解会上升一个台阶。7.3 定时器、计数器不复位的连锁故障自动循环程序里如果定时器或者计数器忘记复位第二轮循环的开始条件可能就不对了。比如第一轮计了80个产品计数器的当前值没有清零第二轮开始继续往上加很快就到预设值提前误触发。记住一条原则任何在循环逻辑里用的定时器和计数器都要有明确的复位路径。要么在循环启动的条件里判断一次并复位要么在流程结束后强制复位。不要指望“条件不满足它自己会清零”——TON的计时值会清零但CTU的当前值不会保持型定时器更不会。7.4 调试时用强制和监视的实战建议在线调试的时候多利用编程软件的监视模式实时看触点和线圈的状态。梯形图上绿色的就是ON灰色的就是OFF一眼能看出来哪一段逻辑不通。找问题的时候从输出端往回追输出没动作就看它的线圈满足条件没有线圈没通就往前看触点通没通。顺着这个思路大多数逻辑问题都能定位到具体某一行。强制功能Force很好用它可以强制某个输入点或输出点的状态。但用的时候要格外小心尤其是强制输出点的状态下设备可能会突然动作。调试之前确认设备处于安全状态周围没有人然后再做强制测试。用完记得及时取消强制不然程序怎么改都不生效查了半天最后发现是强制没取消。写在后面的一点经验带过不少人之后我越来越觉得PLC基本指令的学习关键是“动手踩坑”。看手册十遍不如自己写一段星三角启动再写一段计数分拣逻辑然后在实物上或者仿真软件里跑一遍。跑起来你才会真正理解扫描周期和指令位置的分量。那些看起来毫不起眼的常开触点、定时器、计数器组合起来能实现的逻辑比想象中要丰富得多。最后再分享一个小技巧写程序之前先在纸上把控制流程画出来标清楚哪一步该有什么条件、哪个输出在什么情况下动作、哪一段需要保持。这个习惯帮我省下了大量在线调试的时间。基本的功夫往往就是最值钱的功夫。