3. PLC工作原理与扫描周期
PLC(可编程逻辑控制器)之所以能在工业现场稳定可靠地完成逻辑控制、顺序控制、运动控制和过程控制,其核心在于它采用了一种与普通计算机截然不同的工作方式——循环扫描。理解PLC的“输入采样—程序执行—输出刷新”三步循环机制,是区分PLC编程初学者与进阶者的关键分水岭。本章将深入剖析这一底层运行逻辑,并重点讲解扫描周期对程序实时性、稳定性的影响,帮助你在编写梯形图或结构化文本时,能够从“指令正确”上升到“时序正确”的工程思维层面。
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,可用于初始化程序,侧面验证扫描周期是否正常启动。
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控制中,扫描周期抖动会导致输出频率不稳定,影响伺服电机运行平稳性。
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 操作步骤与解决方案
- 缩短扫描周期:将MODBUS通信改为“轮询+超时”模式,避免单次通信占用过长时间;将PID运算周期从每个扫描周期执行改为每5个扫描周期执行一次(使用定时中断或计数器分频)。优化后扫描周期降至12ms。
- 启用输入中断:将启动按钮I0.0配置为上升沿中断(如S7-1200的Edge Interrupt),在中断程序中直接置位启动标志位,不依赖循环扫描采样。
- 增加软件滤波:在程序中对I0.0进行延时确认(如连续采样3次均为ON才认为有效),防止抖动干扰。
3.4.4 结果对比与复盘
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 平均扫描周期 | 35ms | 12ms |
| 按钮响应成功率 | 约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秒后,认为气缸已经到位。实际上,定时器只是软件延时,与物理动作完成时间无关。若气缸卡滞或传感器故障,程序会继续执行,导致逻辑错误。正确做法是:使用到位传感器信号作为条件,而非单纯依赖定时器。