2. PLC基础概念

在开始搭建完整的Codesys控制项目之前,我们必须先建立对PLC(可编程逻辑控制器)核心运行机制的深刻理解。PLC并非一台简单的“工业电脑”,而是一台以确定性、实时性为设计目标的专用控制设备。它的工作方式、时间模型、地址映射规则以及编程范式,直接决定了我们后续编写控制逻辑、诊断故障和优化性能的方式。本章将围绕PLC的四大基石——工作原理、扫描周期、I/O寻址和编程语言——展开深入剖析,为后续的Codesys实战打下坚实的理论基础。

PLC 核心运行机制与编程模型总览 ① 循环工作原理 读取输入(采样) 执行用户程序(逻辑运算) 更新输出(刷新) 系统自诊断与通信 循环往复 特点:串行、循环、集中采样 输入输出状态在周期内保持不变 ② 扫描周期模型 T1 T2 T3 T4 T1: 输入采样 T2: 程序执行(用户代码) T3: 输出刷新 T4: 系统服务(通信/诊断) 扫描周期 T = T1 + T2 + T3 + T4 典型值:1ms ~ 100ms(取决于程序大小) ⚠ 程序越长,T2越大,实时性越差 ⚠ 输入变化在T1之后才能被感知 ⚠ 输出在T3统一刷新,避免毛刺 ③ I/O寻址与编程语言 I/O寻址模型 %I* / %Q* / %M* / %MW* • %I: 数字量输入(位) • %Q: 数字量输出(位) • %M: 内部存储器(位) • %MW: 内部存储器(字) IEC 61131-3 语言 LD 梯形图 ST 结构化文本 FBD 功能块图 SFC 顺序功能图 Codesys 支持全部五种语言

2.1 PLC工作原理:从“继电器柜”到“循环大脑”

PLC的核心工作原理可以概括为“循环扫描、集中采样、集中输出”。理解这一原理,是区分PLC与普通计算机程序运行方式的关键。传统继电器控制系统通过硬接线实现逻辑,而PLC则将逻辑以程序形式存储在内存中,通过CPU逐条执行指令来模拟继电器回路的通断。

2.1.1 核心原理:串行循环执行

PLC上电后,CPU并非同时处理所有任务,而是按照一个固定的顺序,周而复始地执行一系列操作。这个循环过程通常包含以下四个阶段:

  1. 内部处理阶段:CPU检查硬件状态、复位看门狗、执行系统诊断。
  2. 通信服务阶段:处理编程器、触摸屏或上位机发送的通信请求。
  3. 输入采样阶段:读取所有输入端子的状态(ON/OFF),并存入输入映像寄存器。
  4. 程序执行阶段:CPU从第一条指令开始,逐条执行用户程序,运算结果存入输出映像寄存器。
  5. 输出刷新阶段:将输出映像寄存器的状态一次性传送到输出锁存器,驱动外部负载。

上述阶段中,输入采样、程序执行、输出刷新是用户最关心的三个环节,它们共同构成了一个完整的“扫描周期”。

关键理解:在程序执行阶段,即使输入端子的物理状态发生了变化,输入映像寄存器中的值也不会改变,必须等到下一个扫描周期的输入采样阶段才会被更新。这种“集中采样”机制保证了程序在一个周期内看到的是一致的、稳定的输入状态,避免了因输入抖动导致的逻辑竞争。

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的工业级可靠性优势。