☰
PLC基本指令深度解析:从逻辑取到移位,避开双线圈与定时器陷阱
2026/10/23 1:12:08 网站建设 项目流程

1. 为什么还要从基本指令开始啃PLC

干了这么多年自动化,我越来越觉得,PLC这东西跟学外语一个道理。你上来就背高级句型、玩复杂从句,结果连最基本的“主谓宾”都摆不明白,程序跑起来不是这里报错就是那里逻辑打架。基本指令就是PLC世界的“主谓宾”——看着简单,但真正能把它们用对、用巧、用出花来的人,我见过的还真不多。

这篇文章想聊的,就是PLC基本指令到底该怎么理解、怎么用、怎么避坑。不管你是刚入行的电气小白,还是从继电器控制转过来的老师傅,又或者是干了几年但总觉得程序写得不够利索的同行,都能从这里找到点有用的东西。我会把每个指令背后的逻辑、实际编程中容易踩的坑、以及一些教科书上不会写的经验,掰开揉碎了讲清楚。

先说说PLC基本指令的范畴。不同品牌的PLC指令系统有差异,但核心那几条是通用的:逻辑取、输出、置位、复位、定时器、计数器、比较、传送、移位。这些指令构成了所有复杂程序的骨架。你看到的那些几百上千步的程序,拆到底层,无非就是这些基本指令的不同组合。所以别小看它们,基本功扎不扎实,直接决定了你写的程序是“能跑就行”还是“稳如老狗”。

我见过太多人,程序写出来功能是实现了,但设备运行三个月就出问题,查来查去发现是定时器用错了、置位复位没配对、或者比较指令的扫描周期没考虑。这些问题,根子都在基本指令的理解上。所以这篇文章不贪多,就围绕这些最基础的东西,把每个指令的脾气秉性讲透。

2. 逻辑指令:看着简单,用对不容易

2.1 常开常闭的本质区别与选择逻辑

常开触点和常闭触点,这俩是PLC编程里出现频率最高的元素。但很多人对它们的理解停留在“常开就是断开、常闭就是闭合”这个层面,这就埋下了隐患。

从硬件角度说,常开触点的物理状态是断开,常闭触点的物理状态是闭合。但到了PLC程序里,常开指令(LD/LDI)和常闭指令(LDI/ANI)代表的是“条件成立”和“条件不成立”两种逻辑判断。我举个实际例子:一个启动按钮接在输入点X0上,程序里用常开指令还是常闭指令,取决于你的控制逻辑需要。

假设你要做一个“按下启动按钮,电机运转”的功能。按钮是常开按钮,按下时接通。那么程序里用常开指令LD X0,当按钮按下时条件成立,输出接通。这很直观。但如果你用的是常闭按钮呢?按钮没按时是接通的,按下时断开。这时候你就要用常闭指令LDI X0,这样按钮没按时条件成立,按下时条件不成立。逻辑正好反过来。

注意:这里有个新手特别容易犯的错误——把物理触点的状态和程序指令混为一谈。物理触点是常开还是常闭,和程序里用常开还是常闭指令,是两码事。程序里用什么指令,取决于你的控制逻辑需要“什么条件下执行”。

我个人的经验是,在写程序之前,先画一个简单的逻辑关系图。把每个输入信号对应的“有效状态”标出来,然后决定程序里用常开还是常闭。这个习惯能帮你省下大量调试时间。

2.2 输出指令的扫描周期陷阱

输出指令(OUT)是PLC程序里最直接的指令,但也是最容易出问题的地方。问题出在扫描周期上。

PLC的工作方式是循环扫描:读输入、执行程序、刷新输出,然后循环。这意味着输出指令的执行结果,要到下一个扫描周期才能反映到物理输出点上。对于大多数应用,这个延迟(通常几毫秒到几十毫秒)可以忽略。但在一些高速场合,比如精确定位、高速计数,这个延迟就可能要命。

更隐蔽的问题是双线圈输出。同一个输出点,在程序的不同位置被OUT指令驱动了两次。PLC的扫描顺序是从上到下,后面的OUT会覆盖前面的结果。如果你没意识到这一点,程序逻辑就会和你预想的完全不一样。

我踩过的一个坑:做一个气缸控制程序,手动模式和自动模式分别写了两个OUT指令驱动同一个电磁阀。手动模式下一切正常,切到自动模式后电磁阀死活不动。查了半天才发现,自动模式的OUT指令在手动模式OUT指令的后面,手动模式的条件一直不满足,但自动模式的条件满足了,结果输出被自动模式覆盖了。后来改成用SET/RST指令,问题解决。

实操心得:同一个输出点,尽量只在一个地方用OUT指令。如果确实需要在不同模式下控制同一个输出,用SET和RST指令,或者用中间继电器做逻辑汇总,最后统一输出。

2.3 置位复位指令的配对原则

置位(SET)和复位(RST)指令,是解决双线圈问题的利器。SET指令把输出置为ON并保持,RST指令把它复位为OFF。这俩指令必须配对使用,否则就会出现“置位了但没人复位”或者“复位了但没人置位”的情况。

配对原则说起来简单,但实际编程中很容易漏掉。比如一个报警输出,报警条件满足时SET,报警确认后RST。但如果报警条件一直满足,操作员确认了,RST执行后输出变OFF,下一个扫描周期报警条件还是满足的,SET又执行了,输出又变ON。这就变成了“确认不掉”的报警。

解决方法是加一个“报警锁存”逻辑:报警条件满足时SET一个中间位,用这个中间位驱动报警输出。操作员确认时RST这个中间位。这样即使报警条件还在,只要没触发新的报警,输出就不会再ON。

注意:SET和RST指令的执行顺序很重要。如果SET和RST的条件同时满足,程序里谁在后面谁生效。所以写程序时,要把RST放在SET后面,确保复位优先。

3. 定时器与计数器:时间与数量的精确控制

3.1 定时器的三种类型与选型依据

定时器是PLC编程里用得最多的功能指令之一。常见的有三种类型:通电延时定时器(TON)、断电延时定时器(TOF)、保持型定时器(RTO)。

通电延时定时器是最常用的:条件满足时开始计时,计时到了输出动作,条件断开时定时器复位。断电延时定时器反过来:条件满足时输出立即动作,条件断开时开始计时,计时到了输出复位。保持型定时器则是计时过程中条件断开,当前计时值保持,条件再次满足时继续计时。

选型的依据是你的控制需求。比如一个电机启动后的冷却风扇,要求电机停止后风扇继续运行5分钟。这就用断电延时定时器:电机运行时风扇运行,电机停止时开始计时,5分钟后风扇停止。如果用通电延时定时器,逻辑就反了。

我见过有人用通电延时定时器加一堆逻辑来实现断电延时功能,程序复杂不说,还容易出bug。其实直接选对定时器类型,两行指令就搞定了。

3.2 定时器精度与扫描周期的关系

定时器的精度受扫描周期影响。PLC的定时器通常是基于扫描周期计数的,比如一个100ms的定时器,实际计时误差可能在±10ms左右。对于大多数应用,这个精度足够了。但如果你需要更精确的计时,就要考虑用高速定时器或者中断程序。

还有一个容易被忽略的问题:定时器的计时条件如果是一个瞬间信号,定时器可能根本来不及计时。比如一个按钮按下的时间只有50ms,而扫描周期是10ms,那按钮信号可能只被扫描到5次。如果定时器的设定值是100ms,那定时器永远计不到100ms,因为条件只满足了50ms就断了。

解决方法是加一个自锁逻辑,把瞬间信号变成持续信号,再驱动定时器。或者用脉冲捕捉功能,把短脉冲锁存下来。

实操心得:调试定时器时,先确认计时条件是否稳定。如果条件信号是脉冲式的,一定要先做信号展宽或者锁存处理。我一般会在程序里加一个中间继电器,把输入信号自锁,确保定时器有足够的时间完成计时。

3.3 计数器的复位与预置技巧

计数器(CTU/CTD/CTUD)用来对事件计数。上升沿计数、下降沿计数、加减计数,这三种模式覆盖了大部分应用场景。

计数器的关键参数是预置值(PV)和当前值(CV)。当CV达到PV时,计数器输出动作。复位(R)信号把CV清零。这里有个细节:复位信号是电平有效的,只要复位条件满足,CV就一直保持为零。所以复位信号通常用脉冲信号,按一下复位一次。

预置值的设定也有讲究。比如你要计100个产品,预置值设100。但实际调试时,你可能需要先试跑10个,那就把预置值改成10。改完之后别忘了改回来,我就干过这种事,试跑完忘了改,结果设备一直计到10就停,查了半天才发现是预置值没改回来。

注意:计数器的当前值在断电后是否保持,取决于PLC的保持区域设置。如果计数器用在需要断电记忆的场合,一定要把计数器分配到保持区域,否则断电后计数值丢失,来电后从头开始计。

4. 数据指令:比较、传送与移位

4.1 比较指令的边界条件处理

比较指令(CMP)用来判断两个数值的大小关系,常见的有大于、小于、等于、大于等于、小于等于、不等于。看起来简单,但边界条件处理不好,就会出问题。

比如一个温度控制程序,温度低于20度启动加热,高于25度停止加热。用比较指令写:温度<20时SET加热输出,温度>25时RST加热输出。这逻辑没问题。但如果温度正好等于20呢?既不小于20也不大于25,加热输出保持之前的状态。如果之前是加热状态,温度到了20度还在加热,直到超过25度才停。如果之前是停止状态,温度降到20度也不加热,直到低于20度才启动。

这就是死区的概念。在实际控制中,死区是必要的,可以防止执行机构频繁动作。但死区的范围要合理设置,太小了执行机构频繁动作,太大了控制精度不够。

实操心得:用比较指令做控制时,一定要考虑边界条件。我通常会在程序里加一个“回差”逻辑,比如加热启动值20度,停止值25度,中间5度的回差。这样温度在20-25度之间波动时,加热输出不会频繁切换。

4.2 传送指令的数据类型匹配

传送指令(MOV)用来把一个数据传送到另一个地址。看起来简单,但数据类型不匹配是常见错误。

PLC里的数据类型有**位(BOOL)、字节(BYTE)、字(WORD)、双字(DWORD)、整数(INT)、双整数(DINT)、浮点数(REAL)**等。传送指令要求源数据和目标数据的类型一致。如果你把一个浮点数传送到一个整数字地址,数据就会出错。

比如你把一个浮点数3.14传送到一个整数字,结果可能是3,也可能是乱七八糟的数,取决于PLC的处理方式。更隐蔽的是,浮点数和整数在内存中的存储格式完全不同,直接传送会导致数据完全错误。

注意:用传送指令时,先确认源数据和目标数据的类型。如果需要类型转换,用专门的转换指令(如INT_TO_REAL、REAL_TO_INT),不要直接用MOV指令。

4.3 移位指令的循环与溢出处理

移位指令(SHL/SHR/ROL/ROR)用来把数据按位左移或右移。左移一位相当于乘以2,右移一位相当于除以2。循环移位则是把移出的位补到另一端。

移位指令在流水灯控制、步进电机控制、数据打包解包等场景中很常用。但移位操作容易产生溢出。比如一个16位的数据,左移16位后,所有位都移出去了,结果变成0。如果你没意识到这一点,程序逻辑就会出错。

循环移位可以避免数据丢失,但要注意循环移位的位数。移16位等于没移,移17位等于移1位。所以循环移位的位数要对16取模。

实操心得:用移位指令做流水灯时,我通常会用循环左移指令,每次移1位,配合定时器控制移位速度。这样灯珠循环流动,不会出现移着移着全灭的情况。如果要用普通移位指令,记得在移位前判断最高位或最低位,手动补位。

5. 程序结构:主程序、子程序与中断

5.1 主程序与子程序的调用逻辑

稍微复杂一点的程序,都会用到子程序。子程序的好处是代码复用、逻辑清晰、便于调试。但子程序的调用有讲究。

主程序在每个扫描周期都会执行,子程序只有在被调用时才执行。如果子程序里用了定时器或计数器,要注意子程序的调用频率。如果子程序不是每个扫描周期都调用,定时器的计时就会不准确。

我见过一个案例:一个设备有手动和自动两种模式,手动模式的逻辑写在子程序1里,自动模式的逻辑写在子程序2里。主程序根据模式选择调用哪个子程序。结果手动模式下的定时器计时不准,因为手动模式下子程序1不是每个扫描周期都调用。后来改成两个子程序都调用,在子程序内部用模式条件控制逻辑执行,问题解决。

注意:如果子程序里有时序相关的指令(定时器、计数器、脉冲),要确保子程序在每个扫描周期都被调用。如果做不到,就把时序逻辑放在主程序里,子程序只做纯逻辑处理。

5.2 中断程序的触发条件与优先级

中断程序用来处理需要快速响应的事件,比如高速计数器的比较输出、外部输入的中断触发。中断程序的执行不受扫描周期限制,一旦触发条件满足,立即执行。

中断程序的优先级很重要。如果多个中断同时触发,优先级高的先执行。如果中断程序执行时间过长,会影响主程序的执行,甚至导致看门狗报警。所以中断程序里只放最关键的代码,不要放复杂的逻辑或通信操作。

实操心得:用中断程序时,我通常会在中断里只做最简单的操作,比如置位一个标志位,然后主程序里根据这个标志位做后续处理。这样既保证了响应速度,又不会因为中断执行时间过长影响系统稳定性。

6. 常见问题与排查技巧实录

6.1 程序能下载但设备不动作

这是新手最常遇到的问题。程序下载到PLC了,在线监控也看到输出点亮了,但设备就是不动作。排查思路如下:

排查步骤检查内容可能原因
1PLC输出指示灯指示灯亮但设备不动,问题在外部电路
2输出端子电压用万用表测量输出端子,确认是否有电压输出
3中间继电器如果输出经过中间继电器,检查继电器是否动作
4设备电源检查设备供电是否正常
5接线检查输出端子到设备的接线是否松动或接错

我遇到最多的情况是输出端子的公共端没接好。PLC的输出通常是分组控制的,每组有一个公共端。如果公共端没接电源,输出指示灯亮但端子没电压。这个坑我踩过不止一次。

6.2 定时器计时不准

定时器计时不准的原因通常有三个:扫描周期影响、计时条件不稳定、定时器类型选错。

扫描周期的影响前面说过了,这里补充一点:如果扫描周期波动很大,定时器的误差也会波动。扫描周期波动大的原因可能是程序里有大循环、通信操作、或者中断程序执行时间过长。

计时条件不稳定,比如用按钮信号直接驱动定时器,按钮按下的时间不确定,定时器计时就不准。解决方法是用自锁电路把按钮信号展宽。

定时器类型选错,比如需要断电延时却用了通电延时,逻辑就完全反了。

6.3 计数器计数不准

计数器计数不准,通常是信号抖动或计数脉冲太窄导致的。

机械触点(如接近开关、行程开关)在动作时会产生抖动,一个动作可能被计数多次。解决方法是在计数器前加一个滤波电路,或者用PLC的输入滤波功能。大多数PLC的输入点都有可设置的滤波时间,把滤波时间设长一点,可以消除抖动。

计数脉冲太窄,比如编码器的脉冲频率很高,PLC的扫描周期跟不上,就会丢脉冲。这种情况要用高速计数器,高速计数器的计数不受扫描周期影响。

实操心得:调试计数器时,我习惯先用一个按钮手动计数,确认计数逻辑正确。然后再接实际信号,观察计数是否准确。如果实际信号计数不准,先查信号质量,再查计数器设置。

6.4 程序修改后设备行为异常

修改程序后设备行为异常,最常见的原因是程序没完全下载或者PLC没切换到运行模式。

有些PLC支持在线修改,修改后的程序立即生效。但有些修改需要重新下载整个程序。如果只下载了部分修改,程序逻辑可能不完整。

另外,修改程序后要确认PLC处于运行模式。有些PLC在下载程序后会自动切换到停止模式,需要手动切换到运行模式。

注意:修改程序前,先备份原程序。修改后,先在线监控确认逻辑正确,再让设备运行。我见过有人直接改程序让设备跑,结果逻辑写反了,设备直接撞机。

7. 从基本指令到稳定程序的进阶思路

基本指令用熟了,下一步就是如何把它们组织成一个稳定、可维护的程序。我的经验是:模块化、标准化、注释化。

模块化就是把功能独立的逻辑写成子程序或功能块,主程序只负责调用。这样程序结构清晰,调试方便,复用性高。标准化就是统一编程风格,比如输入输出地址分配规则、中间继电器使用规则、报警处理规则。这样别人看你的程序能看懂,你自己过半年再看也能看懂。注释化就是给每段程序加注释,说明这段程序的功能、输入输出、注意事项。

还有一个经验:程序里留调试接口。比如加一个“调试模式”开关,调试模式下可以手动强制某些输出,方便排查问题。但调试模式一定要有超时自动退出的机制,防止调试完忘了退出,设备带着调试模式运行。

最后说一个我自己的习惯:每次程序写完后,我会在纸上把程序的逻辑流程画一遍,从输入到输出,每个环节都过一遍。这个过程能发现很多逻辑漏洞。画图比看程序直观,很多在程序里看不出来的问题,一画图就暴露了。

PLC基本指令这东西,说简单也简单,说深也深。简单是因为就那么几条,深是因为每条指令在不同场景下的用法和注意事项都不一样。我写了这么多年程序,到现在也不敢说把每条指令都用透了。每次遇到新问题,回头翻手册,总能发现之前没注意到的细节。所以别急着学高级指令,先把基本指令吃透,后面的路会好走很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询