2. PLC基础概念
在开始搭建完整的Codesys控制项目之前,我们必须先建立对PLC(可编程逻辑控制器)核心运行机制的深刻理解。PLC并非一台简单的“工业电脑”,而是一台以确定性、实时性为设计目标的专用控制设备。它的工作方式、时间模型、地址映射规则以及编程范式,直接决定了我们后续编写控制逻辑、诊断故障和优化性能的方式。本章将围绕PLC的四大基石——工作原理、扫描周期、I/O寻址和编程语言——展开深入剖析,为后续的Codesys实战打下坚实的理论基础。
2.1 PLC工作原理:从“继电器柜”到“循环大脑”
PLC的核心工作原理可以概括为“循环扫描、集中采样、集中输出”。理解这一原理,是区分PLC与普通计算机程序运行方式的关键。传统继电器控制系统通过硬接线实现逻辑,而PLC则将逻辑以程序形式存储在内存中,通过CPU逐条执行指令来模拟继电器回路的通断。
2.1.1 核心原理:串行循环执行
PLC上电后,CPU并非同时处理所有任务,而是按照一个固定的顺序,周而复始地执行一系列操作。这个循环过程通常包含以下四个阶段:
- 内部处理阶段:CPU检查硬件状态、复位看门狗、执行系统诊断。
- 通信服务阶段:处理编程器、触摸屏或上位机发送的通信请求。
- 输入采样阶段:读取所有输入端子的状态(ON/OFF),并存入输入映像寄存器。
- 程序执行阶段:CPU从第一条指令开始,逐条执行用户程序,运算结果存入输出映像寄存器。
- 输出刷新阶段:将输出映像寄存器的状态一次性传送到输出锁存器,驱动外部负载。
上述阶段中,输入采样、程序执行、输出刷新是用户最关心的三个环节,它们共同构成了一个完整的“扫描周期”。
关键理解:在程序执行阶段,即使输入端子的物理状态发生了变化,输入映像寄存器中的值也不会改变,必须等到下一个扫描周期的输入采样阶段才会被更新。这种“集中采样”机制保证了程序在一个周期内看到的是一致的、稳定的输入状态,避免了因输入抖动导致的逻辑竞争。
2.1.2 工作原理的工程意义
这种循环工作方式带来了两个重要特性:
- 确定性:只要程序不变,给定相同的输入状态,输出结果必然相同,且响应时间可预测。
- 实时性受限:输入信号的响应延迟最大为一个扫描周期。例如,若扫描周期为10ms,则一个在采样刚结束后出现的脉冲信号,最长需要等待近20ms才能被程序感知并产生输出。
2.2 扫描周期:PLC的时间脉搏
扫描周期(Scan Cycle)是衡量PLC性能与实时性的核心指标。它决定了控制系统对现场事件的响应速度。
2.2.1 扫描周期的构成与计算
扫描周期(T)由以下四部分时间累加而成:
| 时间片段 | 内容描述 | 典型耗时占比 |
|---|---|---|
| T1 输入采样 | 读取所有输入点状态,耗时与I/O点数相关 | 约5% - 10% |
| T2 程序执行 | 执行用户编写的指令,耗时与程序长度和指令类型相关 | 约70% - 85% |
| T3 输出刷新 | 更新输出锁存器,耗时与输出点数相关 | 约5% - 10% |
| T4 系统服务 | 通信、自诊断、系统时间管理等 | 约5% - 15% |
在Codesys中,我们可以通过PLC_PRG程序或系统诊断库中的函数(如SysTimeRtcRead)来测量实际扫描周期。对于运动控制或高速计数等任务,通常要求扫描周期在1ms以内。
2.2.2 扫描周期与响应时间的关系
从信号输入到输出响应的总延迟时间(响应时间)并非简单的等于一个扫描周期。它由以下公式估算:
最短响应时间 = 输入滤波时间 + 1个扫描周期(输入采样+程序执行+输出刷新)
最长响应时间 = 输入滤波时间 + 2个扫描周期
这是因为输入信号可能恰好在采样阶段结束后到达,需要等待下一个周期的采样。
风险提示:在编写PLC程序时,应避免在程序中使用WAIT或延时循环来“等待”某个条件,这会阻塞CPU,导致扫描周期急剧增大,甚至触发看门狗超时错误。正确的做法是使用定时器(TON/TOF)或状态机来管理时间逻辑。
2.2.3 案例拆解:扫描周期对高速计数的影响
场景:某包装线上使用增量式编码器测量切刀位置,编码器输出频率为5kHz(即每0.2ms产生一个脉冲)。PLC使用高速计数功能块(如MC_HSC)读取计数值。
问题:若PLC扫描周期为10ms,程序在每个周期内读取一次当前计数值。由于扫描周期远大于脉冲周期,程序读取到的计数值是“跳跃式”的(例如:0, 50, 102, 148...),且无法精确捕捉到每个脉冲的到达时刻。
分析:高速计数模块(硬件)负责独立于扫描周期进行脉冲计数,而PLC程序只能“周期性”地读取这个累加值。因此,扫描周期决定了位置控制的采样分辨率。若需要精确控制切刀在特定位置动作,必须依赖硬件中断或高速比较输出功能,而非依赖扫描周期。
解决方案:在Codesys中,使用MC_HSC的“同步输出”功能,当硬件计数值达到预设值时,由硬件直接触发输出,无需等待PLC扫描。这体现了“硬件处理高速事件,软件处理逻辑流程”的工程原则。
2.3 I/O寻址:PLC的“空间地图”
I/O寻址是PLC编程的基础。在Codesys(基于IEC 61131-3标准)中,地址采用%符号开头,后跟区域标识符和位置信息。理解寻址规则,是正确读写信号的前提。
2.3.1 常用地址区域详解
| 地址前缀 | 区域名称 | 数据类型 | 示例 | 说明 |
|---|---|---|---|---|
%I |
输入映像区 | BOOL(位) | %IX0.3 |
物理输入端子,只读 |
%Q |
输出映像区 | BOOL(位) | %QX1.2 |
物理输出端子,可读写 |
%M |
内部存储器 | BOOL(位) | %MX0.0 |
中间变量,无物理对应 |
%MW |
内部存储器 | WORD/INT(字) | %MW10 |
16位存储单元,用于数据计算 |
%IW |
模拟量输入 | WORD/INT | %IW3 |
AD转换后的数字值 |
%QW |
模拟量输出 | WORD/INT | %QW5 |
DA转换前的数字值 |
2.3.2 寻址中的位与字节
对于位地址,格式通常为%I<字节地址>.<位号>。例如%IX0.3表示输入模块第0字节的第3位。在Codesys中,我们更推荐使用符号变量(如Start_Button)来代替地址,但在硬件映射或直接访问系统寄存器时,地址仍然必不可少。
经验建议:在Codesys中,通过“PLCopen”或“设备编辑器”将物理I/O映射到全局变量。例如,将%IX0.0映射为变量Start_PB。这样,程序可读性大幅提升,且当硬件地址调整时,只需修改映射关系,无需改动逻辑代码。
2.4 常用编程语言概述:IEC 61131-3的五种表达
Codesys支持IEC 61131-3标准定义的全部五种编程语言。每种语言都有其独特的适用场景,工程师应根据控制任务的类型选择最合适的语言。
2.4.1 五种语言对比与选型
| 语言 | 缩写 | 图形/文本 | 核心特点 | 典型应用场景 |
|---|---|---|---|---|
| 梯形图 | LD | 图形 | 直观反映继电器电路逻辑,易于电气人员理解 | 开关量逻辑控制、电机启停、互锁保护 |
| 结构化文本 | ST | 文本 | 类似Pascal语言,擅长复杂数学运算、数据处理、流程控制 | 算法实现、PID运算、数据处理、通信解析 |
| 功能块图 | FBD | 图形 | 以功能块(如定时器、计数器)为基本单元,信号流向清晰 | 信号处理、模拟量控制、复杂功能组合 |
| 顺序功能图 | SFC | 图形 | 描述系统状态转移过程,支持并行、选择分支 | 流程控制、工步顺序、自动化生产线 |
| 指令表 | IL | 文本 | 类似汇编语言,执行效率高,但可读性差 | 简单逻辑、对存储空间有严格要求的场合 |
2.4.2 语言混用与工程实践
在实际项目中,我们通常不会只用一种语言。一个优秀的Codesys程序结构往往是“混合编程”的:
- 在程序组织单元(POU)的顶层,使用SFC或ST来构建状态机框架。
- 在具体的状态内部,使用LD或FBD来实现简单的逻辑联锁。
- 在涉及复杂计算或数组处理时,使用ST编写函数或功能块。
实战案例:以一个简单的“传送带分拣”项目为例。主控逻辑使用SFC定义三个状态:IDLE(待机)、RUN(运行)、SORT(分拣)。在RUN状态下,使用LD编写电机启动和停止的梯形图逻辑;在SORT状态下,使用ST编写计算目标料箱编号的算法(例如根据传感器读到的条码计算)。这种混合方式既保证了流程的清晰性,又兼顾了逻辑的简洁性和算法的灵活性。
2.4.3 常见误区与总结复盘
在学习PLC编程语言时,初学者常陷入以下误区:
- 误区一:认为梯形图是“万能”的,所有逻辑都用LD写。这会导致程序冗长且难以处理复杂数学运算。
- 误区二:忽视扫描周期对程序执行的影响。例如,在ST中使用
FOR循环处理大量数据时,会显著拉长扫描周期,影响实时性。 - 误区三:混淆物理输入与映像寄存器。在程序中对
%I地址赋值是无效的,因为输入映像区是只读的。
总结复盘:本章节的核心在于建立“扫描周期”这一时间基准。所有编程语言、所有逻辑设计,最终都运行在这个周期性的时间框架内。在后续的Codesys实战中,请时刻问自己:“这段代码在一个扫描周期内能执行完吗?如果输入信号只持续0.5ms,我的程序能捕捉到吗?” 带着这些问题去编程,才能真正发挥PLC的工业级可靠性优势。