导读:PLC(Programmable Logic Controller,可编程逻辑控制器)是工业自动化里的“大脑”。它把现场的开关量/模拟量等信号“读进来”,按照工程师写好的逻辑程序“算一遍”,再把控制结果“写出去”。这套循环反复执行的过程,叫做扫描周期(Scan Cycle)。为了让程序执行不受接线抖动影响、又能在同一周期内拿到稳定输入,PLC在内存里维护了一块I/O 映像区(IO Image / Process Image)。这一讲,我们把这三件事一次说清楚。
一、PLC 是什么?为什么不是“工业电脑”
-
硬件层面:CPU(或 SoC)+ 存储器(程序区、数据区、保持区)+ 通讯端口 + 可扩展的 I/O 模块(数字量 DI/DO、模拟量 AI/AO、脉冲/高速计数、通讯等)。
-
软件层面:实时操作系统 + 任务调度(周期任务、事件/中断任务)+ 用户逻辑(梯形图、功能块、结构化文本等)。
-
与工控机的区别:PLC强调确定性与抗干扰,掉电保持、诊断自检、端子接线与现场总线更工业化;而 IPC 强于人机交互、计算密集型、开放生态。
二、扫描周期:PLC 每一拍在干什么?
绝大多数 PLC 的“标准周期任务”遵循下图式的顺序(不同品牌叫法略有差异):
-
输入取样(Input Update / Read Inputs):把现场物理输入(DI、AI)一次性读入内存的I 映像区,形成这一周期内稳定的“输入快照”。
-
执行用户程序(Execute Logic):用这份输入快照(而非直接读端子)运行梯形图/FB/ST 等逻辑,读写的都是内存变量与Q 映像区(输出映像的“草稿”)。
-
输出刷新(Output Update / Write Outputs):把 Q 映像区中计算出的结果,一次性写回现场物理输出(DO、AO)。
-
后台服务(Housekeeping):通讯、时钟、诊断、溢出/看门狗检查等,然后进入下一个周期。
扫描时间(Scan Time) ≈ 输入刷新时间 + 程序执行时间 + 输出刷新时间 + 系统开销。典型从几百微秒到几十毫秒不等,取决于 CPU 性能、程序规模、通讯负载、I/O 数量与类型。
三、I/O 映像区:为什么不直接“读端子、写端子”?
如果程序在执行过程中“边跑边读端子”,那这一段时间内端子可能被干扰抖动、或在前后网络读到不一致状态。I/O 映像区的作用就是:
-
输入映像(I或PII):周期开始时统一采样,整个周期内保持不变,供程序读取(例如I0.0、I124、AIW6)。
-
输出映像(Q或PIQ):程序计算期间只改“草稿”,周期末统一刷新到物理输出(例如Q0.1、QW10)。
好处:
-
稳定性:同一周期内所有逻辑看到相同输入。
-
可预测性:输出只在周期末变化,现场执行“有节奏”。
-
易调试:在线监控时变量不“抖”,问题更容易复现。
注意:多数 PLC 也提供“立即读/写(Immediate I/O)”指令,允许跳过映像,直接访问物理端子,用于高速对位/急停等特殊场合。但要谨慎使用,以免打破“同周期一致性”。
四、一次扫描里的“时间”与“边沿”
4.1 定时器/计数器是怎么“动起来”的?
-
定时器(TON/TOF/TP):在每个扫描周期内累加(或比较)系统时钟,典型分辨率 1 ms~10 ms;周期变长可能造成表观“时间偏差”,对严苛定时应采用高速/中断任务或专用时基。
-
计数器(CTU/CTD):对“边沿”敏感。若输入脉冲频率高于扫描速度,普通 DI + 周期任务可能“丢计数”,此时应使用高速计数器或中断任务。
4.2 上升沿/单拍(One-Shot)
为了只在“从 0→1 的那个周期”触发一次动作,PLC 提供边沿/单拍指令。它们在当周期比较“当前输入快照”和“上一周期的状态”来产生一个扫描周期宽度的脉冲。
// ST 伪代码:上升沿检测
IF (Start = TRUE) AND (Start_Last = FALSE) THEN
Pulse := TRUE; // 仅本周期为 TRUE
ELSE
Pulse := FALSE;
END_IF;
Start_Last := Start;
五、示例:最经典的自保持启停(含急停)
目标:按下Start启动电机,按下Stop停止;E_Stop急停常闭,任何时候断开都立刻断电机线圈。
// 结构化文本(ST)示例
// 输入:I.Start, I.Stop, I.E_Stop_NC(常闭急停,正常为 TRUE)
// 输出:Q.Motor
VAR
RunLatch : BOOL; // 运行自保持
END_VAR
// 1) 急停优先
IF NOT I.E_Stop_NC THEN
RunLatch := FALSE;
ELSE
// 2) 启停逻辑(自保持)
IF I.Start THEN
RunLatch := TRUE;
END_IF;
IF I.Stop THEN
RunLatch := FALSE;
END_IF;
END_IF;
// 3) 输出到 Q 映像
Q.Motor := RunLatch;
要点:
-
所有I.*都来自输入映像,不在执行途中直接读端子。
-
Q.Motor先写到输出映像,周期末统一刷新,继电器/接触器在扫描结束时动作。
-
急停应硬接入安全回路(安全继电器/安全 PLC),示例仅说明逻辑先后次序。
六、扫描周期相关的“常见坑”与对策
-
“有时检测不到按钮按下”:按钮抖动/按得太快,单次脉冲窄于扫描时间 → 开启输入滤波/去抖、使用沿检测、或提高任务频率(更短周期)。
-
“计数总是丢脉冲”:普通 DI + 周期任务无法抓住 kHz 脉冲 → 用高速计数器模块或硬件中断输入。
-
“模拟量跳来跳去”:同周期多处直接读物理 AI,或滤波不足 → 只读映像、软件平均/一阶滤波、统一缩放与限幅。
-
“写 DO 早晚不一致”:程序中途直接“立即写端子”与周期末统一刷新混用 → 统一策略:除特殊场景外都先写 Q 映像。
-
“定时器慢/快”:扫描时间波动较大 → 固定周期任务(能设周期就设)、剥离重通讯到低优先级任务、必要时用时钟中断。
-
“看门狗报警/周期超时”:循环体过大或阻塞(大量串口/网口操作、重数学) → 拆小任务、用后台/异步 FB、优化算法。
七、任务与优先级:不仅只有“一个循环”
现代 PLC 往往支持多任务/优先级:
-
周期任务(Cyclic):固定周期执行(如 1 ms、10 ms、100 ms),用来跑主逻辑。
-
事件/中断任务(Event/Interrupt):由硬件事件触发(高速计数器、通信帧到达、定时中断),用于高速响应或捕捉窄脉冲。
-
后台/空闲任务(Background):在空闲时间跑低优先级工作(历史记录、非关键通讯)。
合理分配:把“必须稳定周期”的逻辑放在固定周期任务,把“偶发且急”的放在中断,把“能晚点做”的放后台,既保证实时性,又不堵主循环。
八、数据类型与保持区:掉电后该不该记住?
-
非保持(易失)区:掉电丢失,适合临时变量、运行中间量。
-
保持(Retain)区:掉电保存,适合配方、累计值、设备计数。注意防止频繁写导致寿命问题(若底层是 Flash/NVRAM)。
-
标定与配方:建议集中保存在结构体中,并提供“范围校验 + 默认值恢复”。
九、把“扫描 + 映像”的思想落地为工程方法
-
入口统一:所有输入只在“输入映像”阶段读一次,程序里只用变量,不再直接摸端子。
-
出口统一:所有输出先写到“Q 映像变量”,周期末一口气刷新。
-
边沿规范:凡是“只触发一次”的逻辑,一律用上升/下降沿或 One-Shot。
-
分层组织:把“采集/滤波/诊断 → 逻辑决策 → 执行与互锁 → 人机与报警”拆成功能块,扫描结构更清晰。
-
时间意识:关注扫描时间统计、看门狗、任务负载;把高频/高优先级事件放在合适的任务里。
十、课后小练习(可直接用于你们项目)
-
把一个“启停+自保持+互锁”的小流程,用“只读映像、只写映像”的风格改写一遍,加入急停与故障锁存。
-
为一个 0–10V 模拟量输入实现“均值滤波(8 点)+ 限幅 + 工程量换算”,并只在周期开始时取一次样。
-
为一个 2 kHz 光电脉冲计数通道,分别用“普通 DI+周期任务”和“高速计数器/中断”实现,对比丢计数率。
小结
-
PLC 的本质:不停地“读输入 → 跑逻辑 → 写输出”的扫描机。
-
I/O 映像区:让“一个周期内的输入稳定、输出同步”,是写出可预测逻辑的关键。
-
工程落地:用边沿、定时器、高速任务/中断与保持区,把“扫描思想”落实到可靠、可维护的程序结构里。
推荐阅读:
PLC 基础课 第 3 讲|定时器和计数器:典型 6 种写法(电机延时、风机延时、润滑周期)
PLC 基础课 第 2 讲|常开触点、常闭触点、自锁、互锁:从电气图到梯形图
PLC 基础课 第 1 讲|什么是 PLC?扫描周期、I/O 映像区,一次讲明白