从一段“诡异”的PLC灯控程序说起:扫描周期如何“偷走”你的输出信号
第一次在产线上看到那组“不听话”的指示灯时,我差点以为是设备出现了硬件故障。D3-D8的流水灯效果完美运行,唯独D1和D2像被施了魔法般拒绝点亮——这显然违背了程序设计的逻辑。直到用示波器捕捉到那转瞬即逝的4毫秒脉冲,才意识到我们正在面对PLC编程中最经典的“双线圈输出”陷阱。这个看似简单的灯光控制案例,实际上揭示了可编程逻辑控制器最核心的运行机制:扫描周期。
1. 现象观察:当灯光控制逻辑“失效”时
那天的调试场景至今记忆犹新。我们设计了一个典型的流水灯控制系统:
- 前段程序:用AA开关直接控制D1/D2两盏指示灯
- 后段程序:通过移位指令实现D1-D8的循环点亮
理论上,当AA开关断开时,后段程序的移位控制应该让所有指示灯依次点亮。但实际运行中出现了诡异现象:
| 指示灯 | 预期状态 | 实际观察 |
|---|---|---|
| D1-D2 | 循环点亮 | 持续熄灭 |
| D3-D8 | 循环点亮 | 正常点亮 |
更奇怪的是,用示波器抓取的信号波形显示:
text复制D1/D2信号波形:
______|¯¯|____ (4ms高电平脉冲)
这短暂的脉冲说明程序确实执行了点亮操作,但最终输出却被“吞噬”了。要理解这个现象,我们需要深入PLC的底层工作机制。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 扫描周期解剖:PLC的“思考”节奏
PLC不像普通计算机那样实时响应每个指令,而是采用独特的循环扫描机制。每个扫描周期包含三个阶段:
- 输入采样:读取所有输入端口状态
- 程序执行:从上到下、从左到右运行用户程序
- 输出刷新:将运算结果写入输出模块
关键在于:在整个扫描周期内,输出点的状态可能被多次修改,但只有最后一次写入会生效。这就是“双线圈输出”问题的根源。
回到我们的灯光控制案例,当AA开关断开时,程序执行流程如下:
- 执行前段程序:由于AA=FALSE,将D1/D2置为FALSE
- 执行后段程序:根据移位指令将D1/D2置为TRUE
- 循环回到前段程序:再次将D1/D2置为FALSE
- 输出刷新:最终D1/D2=FALSE
提示:这解释了为什么示波器
