刚入行的时候,我拿到第一台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,脉冲只有5ms,PLC可能根本看不到它有跳变。所以高速计数场合要用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基本指令的学习,关键是“动手踩坑”。看手册十遍,不如自己写一段星三角启动,再写一段计数分拣逻辑,然后在实物上或者仿真软件里跑一遍。跑起来,你才会真正理解扫描周期和指令位置的分量。那些看起来毫不起眼的常开触点、定时器、计数器,组合起来能实现的逻辑,比想象中要丰富得多。
最后再分享一个小技巧:写程序之前,先在纸上把控制流程画出来,标清楚哪一步该有什么条件、哪个输出在什么情况下动作、哪一段需要保持。这个习惯帮我省下了大量在线调试的时间。基本的功夫,往往就是最值钱的功夫。