引言
什么是PLC的扫描周期呢?
扫描周期指的是PLC完成一次完整工作循环所耗费的时间。具体来说,这个循环包括三个步骤:读取输入信号、执行用户程序、刷新输出状态。把这三个步骤都完成一遍,所花费的总时长,就是扫描周期。
打个简单的比方,可以把PLC想象成一个不知疲倦、一圈又一圈巡逻的保安:
他始终在巡逻,一圈接着一圈,永不停歇。
每巡逻一圈,他都会查看一遍所有传感器的状态,进行一番逻辑运算,再对设备进行一次控制操作。
他巡逻一圈所花费的时间,就是PLC的扫描周期。
一、 PLC扫描周期的工作方式
一个标准的PLC扫描周期包含五个阶段:
自诊断
检查自己是不是“生病”了。
通信服务
跟触摸屏、上位机通个气。
输入采样
把现场传感器的信号(开关状态)统统读进来,存进“输入映像寄存器”。
程序执行
根据你写的逻辑,从头到尾算一遍。
输出刷新
把算好的结果发给现场的执行机构(阀门、电机)。
重点来了:在这个周期内,输入信号只读一次,输出信号只发一次。这直接决定了我们编程的思维模式。
二、 核心逻辑:输入与输出的“时间差”
理解扫描周期,最关键的是要理解“映像寄存器”的概念。
举个最经典的例子:
假设你有一个按钮接在输入点 I0.0,控制一个灯 Q0.0。
如果不考虑扫描周期,你会觉得:按下按钮,灯亮;松开按钮,灯灭。
但在PLC的世界里,过程是这样的:
输入采样阶段
:PLC看了一眼 I0.0,发现它是按下的状态(1),于是把这个“1”记在心里的一个小本本上(输入映像寄存器)。
程序执行阶段
:PLC开始跑程序。它不看外面的真实按钮,只看刚才那个小本本。看到小本本上写着“1”,于是决定让灯亮。
输出刷新阶段
:PLC把“让灯亮”的命令发给 Q0.0,外面的灯终于亮了。
问题来了:如果在PLC正在“跑程序”的第5毫秒,你突然松开了按钮,灯会灭吗?
答案是:不会!
因为PLC在跑程序时,是“两耳不闻窗外事”的,它只认刚才采样时的状态。只有等到这一个周期跑完,下一个周期开始进行输入采样时,PLC才会发现:“哦,原来按钮松开了。”
这个时间差通常只有几毫秒,人眼无法察觉,但在高速逻辑控制中,这就是致命的误差。
三、 实战举例:那些年我们踩过的“坑”
光说不练假把式,我们来看两个实际工程中常见的案例,看看扫描周期是如何“坑”你的。
案例 1:用自锁电路实现“点动”变“自锁”
很多初学者想做一个启停控制:按一下启动,电机转;再按一下停止,电机停。
程序写成了这样:
LD I0.0 // 启动按钮按下
O Q0.0 // 或 输出自锁
AN I0.1 // 且 停止按钮未按
= Q0.0 // 输出线圈
问题场景:
如果这段程序在同一个扫描周期内被多次调用(比如在不同的功能块FB里),或者你在程序里写了多个地方对 Q0.0 进行赋值。
坑点:
PLC是从上往下执行的。
程序第一行:检测到 I0.0 按下,Q0.0 线圈得电。
程序第二行(假设你又在后面写了一句):R Q0.0(复位Q0.0)。
在一个扫描周期内,Q0.0 刚被置位,马上又被复位。等这一个周期结束,输出刷新时,Q0.0 其实根本没亮过!
教训:永远不要在同一个扫描周期内,对同一个线圈进行多次写入(双线圈输出),否则只有最后一次操作有效。
案例 2:竟然能用一个常开触点切断自己?
这是一个更有趣的逻辑陷阱。假设你想做一个“单按钮启停”功能(按一下开,再按一下关)。
很多老工程师会教你用“异或”逻辑或者计数器,但初学者可能会写出这种“神奇”的代码:
LD I0.0 // 按钮按下
AN M0.0 // 且 中间标志位为0(初始状态)
= Q0.0 // 输出开启
LD I0.0 // 按钮按下
= M0.0 // 将中间标志位置1
让我们带入扫描周期推演一下:
第一个周期:
I0.0 按下(为1)。
执行第一段:I0.0=1,M0.0还是0(因为还没执行到第二段),所以 Q0.0 得电开启。
执行第二段:M0.0 被置为1。
周期结束,灯亮了。
第二个周期(假设按钮一直按着没松):
I0.0 依然为1。
执行第一段:I0.0=1,但此时 M0.0 已经是1了(上个周期刚存的),所以AN M0.0条件不满足,Q0.0 断开!
执行第二段:M0.0 保持为1。
周期结束,灯灭了!
看!你没有松手,灯却在一个周期内完成了“开-关”的切换。这就是为什么很多初学者做单按钮控制时,发现灯闪烁或者动作不稳定,因为他们没意识到同一个周期内,变量的状态会被后面的程序修改并立即影响前面的逻辑判断。
四、 如何利用扫描周期“变废为宝”?
理解了扫描周期,不仅能避坑,还能用来写高效的代码。
经典应用:上升沿与下降沿的检测
在没有专用指令的老旧PLC中,如何检测一个按钮的上升沿(从0变1的瞬间)?
这就利用了“上个周期的状态”和“这个周期的状态”的差异。
逻辑如下:
用一个中间变量 M0.0 记录上一次的输入状态。
在程序最后,把当前的输入 I0.0 赋值给 M0.0。
在程序开头,判断:(当前的 I0.0 是1) AND (上次的 M0.0 是0)。
如果条件满足,说明在这一瞬间,信号发生了跳变。
代码示意:
LD I0.0 // 当前输入是1
AN M0.0 // 上一次记录的是0
= M0.1 // 产生一个周期的脉冲(上升沿)
// ... 中间执行你的逻辑 ...
LD I0.0 // 更新状态
= M0.0 // 把当前状态存下来,给下一个周期用
这就是扫描周期赋予我们的“记忆”能力。PLC虽然无眼无耳,但通过寄存器和周期迭代,它能“记住”上一秒发生了什么。
总结:扫描周期决定设备反应的快慢
PLC的扫描周期是其“心跳”,决定了系统对外部变化的“眼睛”有多快。
1、过程是循环的:PLC并不是实时“守着”每一个输入,而是 按顺序 进行一系列操作:输入采样 程序执行 输出刷新,并不断重复。
2、时间决定速度:完成这一套操作所需的时间长短就是扫描周期。如果周期很短(如几毫秒),PLC就能“每秒看上几百次眼”,反应自然快。
3、决定反应快慢:在 PLC 的工作模式下(即“顺序执行”模式),它只能在扫描结束时才会更新输出。因此,如果扫描周期过长,输入的变化必须“等着”下一个周期才能被处理,导致明显的延迟。
总结:PLC的扫描周期就像人的呼吸节奏,呼吸(扫描)得快,身体(设备)反应就快;呼吸慢了,身体反应自然就慢。
一句话记住
扫描周期 = PLC 跑一圈的时间,决定设备反应快慢
PLC经典案例与源程序