3. PLC工作原理与扫描周期

PLC(可编程逻辑控制器)之所以能在工业现场稳定可靠地完成逻辑控制、顺序控制、运动控制和过程控制,其核心在于它采用了一种与普通计算机截然不同的工作方式——循环扫描。理解PLC的“输入采样—程序执行—输出刷新”三步循环机制,是区分PLC编程初学者与进阶者的关键分水岭。本章将深入剖析这一底层运行逻辑,并重点讲解扫描周期对程序实时性、稳定性的影响,帮助你在编写梯形图或结构化文本时,能够从“指令正确”上升到“时序正确”的工程思维层面。

PLC 循环扫描工作过程(单周期) ① 输入采样 读取物理输入端子状态 存入输入映像寄存器 I0.0 ~ I7.7 ② 程序执行 逐条执行用户程序 更新输出映像寄存器 Q0.0 ~ Q7.7 ③ 输出刷新 将输出映像寄存器内容 一次性传送至物理输出锁存 驱动外部负载 循环扫描(周期 T = 输入采样 + 程序执行 + 输出刷新 + 系统自诊断) 扫描周期关键特性: • 输入采样:PLC只读取当前扫描周期开始瞬间的输入状态,周期内输入变化不影响本次扫描。 • 程序执行:指令按从上到下、从左到右顺序执行,结果立即写入映像寄存器(非物理输出)。 • 输出刷新:所有输出在扫描末尾统一更新,避免同一周期内输出多次动作。 • 系统自诊断:检查CPU、内存、电源、通信等,异常时进入停机或报警状态。

3.1 循环扫描机制:PLC的“时间片”工作哲学

3.1.1 核心原理:为什么PLC不采用中断驱动方式?

工业控制环境对确定性有极高要求。如果PLC像普通计算机那样采用事件中断驱动,那么当多个输入信号同时变化时,程序执行的顺序将变得不可预测,这会导致控制逻辑混乱。因此,PLC采用周期轮询机制,将整个控制任务划分为固定顺序的时间片。每个扫描周期内,PLC严格按照“输入采样→程序执行→输出刷新”的顺序完成一次完整的控制循环。这种设计保证了:无论程序多复杂,每个输入信号在一个周期内只被读取一次,每个输出状态在一个周期内只被更新一次,从而确保了控制逻辑的时序确定性。

对比维度PLC循环扫描计算机中断驱动
事件响应方式周期性轮询,固定顺序异步中断,优先级抢占
时序确定性高,可精确计算响应时间低,受中断频率影响
程序执行顺序从上到下,从左到右由中断优先级决定
适用场景工业逻辑控制、顺序控制数据处理、复杂算法

3.1.2 判断方法:如何识别PLC当前处于哪个阶段?

在实际调试中,我们无法直接“看到”PLC内部扫描到哪一步,但可以通过以下间接方法判断:

  • 观察输出响应延迟:按下启动按钮(输入),到接触器动作(输出)的时间差,通常为1~2个扫描周期。若延迟明显大于预期,说明扫描周期过长。
  • 使用在线监控功能:大部分编程软件(如TIA Portal、GX Works、Sysmac Studio)支持在线监控梯形图状态,可以实时查看每个触点和线圈的“通电/断电”状态,从而推断程序执行位置。
  • 利用特殊标志位:许多PLC提供“首次扫描标志位”(如西门子的SM0.1、三菱的M8002),该位仅在第一个扫描周期为ON,可用于初始化程序,侧面验证扫描周期是否正常启动。
经验提醒:在调试高速计数或运动控制时,不要依赖普通I/O扫描来响应高速脉冲。应使用PLC的高速计数输入通道或中断功能,否则会丢失脉冲计数。

3.2 输入采样、程序执行、输出刷新的深度解析

3.2.1 输入采样阶段:瞬间的“快照”

在每个扫描周期的开始,PLC会一次性读取所有数字量输入端子(如I0.0、I0.1)和模拟量输入通道的当前值,并将其存入输入映像寄存器(Input Image Register)。此后,在整个程序执行阶段,CPU只访问这个映像寄存器,而不再直接读取物理输入端子。这意味着:如果在程序执行过程中,某个外部按钮被按下,其状态变化不会立即反映到当前扫描周期的程序中,必须等到下一个扫描周期的输入采样阶段才会被读取。

// 以西门子S7-1200为例,输入采样后的映像区访问方式
// 梯形图中直接使用 I0.0 访问的是输入映像寄存器
// 若需读取物理输入的实时值,可使用" Peripheral "访问(如 IW64:P),但会延长扫描时间
A "Start_Button"   // 访问输入映像区,非实时物理值
S "Motor_Output"   // 置位输出映像区

3.2.2 程序执行阶段:顺序逻辑的“演绎”

CPU从用户程序的第一条指令开始,逐条执行,直到END指令结束。执行过程中,程序对输入映像寄存器进行读取,对输出映像寄存器进行写入。这里有一个关键特性:程序中的线圈(输出)状态改变,不会立即驱动物理输出,而是先暂存在输出映像寄存器中。同时,后续指令如果引用该线圈的触点,读取到的是刚刚更新后的映像状态,这保证了程序内部逻辑的连贯性。

重要概念:输出映像寄存器的“读-写”特性。例如,程序中有两行:
// 第一行:如果I0.0为ON,则Q0.0置ON
A I0.0
= Q0.0
// 第二行:如果Q0.0为ON,则Q0.1置ON
A Q0.0
= Q0.1
当I0.0为ON时,第一行执行后Q0.0映像为ON,第二行读取Q0.0时即为ON,因此Q0.1也会被置ON。这种“即时更新”特性是PLC顺序控制的基础。

3.2.3 输出刷新阶段:统一“发布”

当程序执行完毕后,PLC将输出映像寄存器中的最终状态一次性传送到物理输出锁存器,驱动外部负载(如继电器、接触器、指示灯)。这一设计避免了程序执行过程中输出点频繁抖动,也保证了同一周期内所有输出动作的同步性。值得注意的是,输出刷新是“批量”操作,而非逐点操作,因此即使程序执行阶段某个输出被多次赋值,最终物理输出只反映最后一次赋值的结果。

3.3 扫描周期对程序的影响:实时性与稳定性的博弈

3.3.1 扫描周期的构成与估算

扫描周期(T)主要由四部分组成:系统自诊断时间 + 输入采样时间 + 程序执行时间 + 输出刷新时间。其中,程序执行时间占比最大,与指令条数、指令类型(位逻辑指令快,浮点运算慢)、CPU主频有关。例如,一个包含1000条基本位指令的程序,在10ms扫描周期下,每条指令平均执行时间为10微秒,这通常是合理的。但若程序中包含大量PID运算、字符串处理或通信指令,扫描周期可能延长至50ms甚至更长。

指令类型典型执行时间(μs)对扫描周期的影响
位逻辑指令(A、O、=)0.1 ~ 0.5极小
定时器/计数器指令1 ~ 5较小
整数运算指令2 ~ 10中等
浮点运算指令10 ~ 50较大
通信指令(如MODBUS读写)100 ~ 1000显著增加

3.3.2 扫描周期过长带来的风险

  • 输入信号丢失:若输入脉冲宽度小于扫描周期,PLC可能完全检测不到该脉冲。例如,一个10ms的短暂信号,在20ms扫描周期下可能被漏采。
  • 输出响应滞后:急停信号若在程序执行阶段才到达,必须等到下一周期输入采样才能被读取,再经过程序执行和输出刷新,总延迟可能达到2~3个扫描周期。
  • 运动控制精度下降:在脉冲输出或PWM控制中,扫描周期抖动会导致输出频率不稳定,影响伺服电机运行平稳性。
风险提示:在安全关键回路(如急停、光栅保护)中,严禁仅依赖PLC循环扫描实现保护功能。必须使用硬件安全回路(如安全继电器硬接线)或PLC安全模块(如F-CPU),其响应时间与扫描周期无关。

3.4 实战案例:扫描周期导致的“按钮失灵”故障排查

3.4.1 案例背景与初始现象

某自动化包装产线,使用西门子S7-1200 PLC控制。操作工反馈:偶尔按下“启动”按钮(I0.0)后,设备没有任何反应,需要再按一次甚至多次才能启动。该按钮为自复位式,按下后保持约50ms的闭合状态。产线PLC程序约2000条指令,包含3路模拟量PID调节和1路MODBUS通信(每100ms读写一次)。

3.4.2 分析与判断过程

首先,使用编程软件在线监控扫描周期,发现平均扫描周期为35ms,最大达到48ms。按钮闭合时间约50ms,理论上应能被采样到,但考虑到输入滤波(默认6.4ms)和扫描周期波动,实际有效采样窗口可能不足。进一步分析:当MODBUS通信指令执行时,会阻塞程序执行约15ms,若此时恰好遇到按钮按下,且按钮闭合时间接近扫描周期边缘,则可能被漏采。

3.4.3 操作步骤与解决方案

  1. 缩短扫描周期:将MODBUS通信改为“轮询+超时”模式,避免单次通信占用过长时间;将PID运算周期从每个扫描周期执行改为每5个扫描周期执行一次(使用定时中断或计数器分频)。优化后扫描周期降至12ms。
  2. 启用输入中断:将启动按钮I0.0配置为上升沿中断(如S7-1200的Edge Interrupt),在中断程序中直接置位启动标志位,不依赖循环扫描采样。
  3. 增加软件滤波:在程序中对I0.0进行延时确认(如连续采样3次均为ON才认为有效),防止抖动干扰。

3.4.4 结果对比与复盘

指标优化前优化后
平均扫描周期35ms12ms
按钮响应成功率约85%100%
急停响应时间最大96ms最大36ms

复盘经验:在PLC程序设计中,不仅要关注逻辑正确性,更要评估扫描周期对实时性的影响。对于操作频率高、信号持续时间短的输入,应优先考虑中断或高速计数功能。同时,通信指令应尽量分散执行,避免集中在同一扫描周期内造成“卡顿”。

3.5 常见误区与总结复盘

3.5.1 误区一:认为PLC程序执行是“并行”的

虽然梯形图看起来像继电器电路,但PLC程序本质是串行执行的。同一扫描周期内,上一条指令的结果会影响下一条指令的输入。初学者常犯的错误是:在程序末尾修改某个输出,却期望前面已经执行过的指令能感知到该变化。正确做法是:如果需要“先计算后使用”,应使用中间变量(M区或DB块)暂存结果。

3.5.2 误区二:忽略输入滤波时间

PLC输入端通常带有RC滤波(如S7-1200默认6.4ms),用于抑制触点抖动和电磁干扰。但这会额外增加输入信号的延迟。对于高速信号(如编码器、接近开关),应调整滤波时间或使用高速输入通道。

3.5.3 误区三:在程序中使用“延时”指令来等待物理动作

例如,使用TON定时器延时1秒后,认为气缸已经到位。实际上,定时器只是软件延时,与物理动作完成时间无关。若气缸卡滞或传感器故障,程序会继续执行,导致逻辑错误。正确做法是:使用到位传感器信号作为条件,而非单纯依赖定时器。

总结:掌握扫描周期是PLC编程从“会写”到“写得好”的分水岭。核心要点:①输入采样是“快照”,周期内输入变化无效;②输出刷新是“批量”,程序内多次赋值只认最后一次;③扫描周期是“双刃剑”,过长丢信号,过短增加CPU负担;④关键信号用中断,普通信号靠扫描。在后续章节中,我们将基于此原理,深入讲解定时器、计数器、中断程序及运动控制的应用技巧。