3. IEC 61131-3编程基础

IEC 61131-3 是 PLC 编程领域最重要的国际标准,它统一了编程语言、数据类型、程序组织方式和任务执行模型。在 CODESYS 中,HMI 与远程运维功能最终都要落到 PLC 程序上,因此理解这套标准是后续开发的基础。本节从标准语言、变量类型、程序组织单元(POU)、任务配置和基本调试五个方面展开,帮助建立完整的编程认知框架。

一、标准编程语言:五种表达方式

IEC 61131-3 定义了五种标准编程语言,CODESYS 全部支持。它们并非互相替代,而是针对不同场景各有优势:

  • LD(梯形图):以继电器逻辑为原型,适合电气工程师快速阅读开关量逻辑。
  • FBD(功能块图):以方框和连线表达信号流,适合连续控制和信号处理。
  • ST(结构化文本):类 Pascal 的高级语言,适合复杂算法、循环和数据处理。
  • IL(指令表):类似汇编的助记符语言,现已逐渐被弃用。
  • SFC(顺序功能图):以步和转换为核心,适合描述顺序流程和状态机。

实际项目中,常见做法是用 ST 编写算法和通信逻辑,用 LD 或 FBD 编写联锁与安全逻辑,用 SFC 组织设备动作流程。CODESYS 允许在同一 POU 中混合使用不同语言,例如在 ST 中调用 FBD 编写的功能块。

二、变量类型:数据的基础

变量类型决定了数据的取值范围、存储方式和运算规则。IEC 61131-3 将数据类型分为基本类型和派生类型。基本类型包括 BOOL、BYTE、WORD、DWORD、SINT、INT、DINT、USINT、UINT、UDINT、REAL、LREAL、TIME、STRING 等。派生类型则通过 ARRAY、STRUCT、ENUM 等方式组合而成。

在 CODESYS 中声明变量时,需要明确变量类别:VAR 为局部变量,VAR_GLOBAL 为全局变量,VAR_INPUT 为输入参数,VAR_OUTPUT 为输出参数,VAR_IN_OUT 为引用传递参数,VAR RETAIN 为保持型变量,VAR PERSISTENT 为持久化变量。保持型变量在断电后由后备电池或超级电容维持,持久化变量则写入非易失存储区,适合保存配方和累计值。

VAR_GLOBAL
    g_rSetTemp   : REAL := 25.0;      // 全局设定温度
    g_bRunEnable : BOOL := FALSE;     // 全局运行使能
END_VAR

VAR
    i          : INT;                 // 循环索引
    rSum       : REAL := 0.0;         // 累加值
    aTemp      : ARRAY[1..8] OF REAL; // 8路温度数组
    stRecipe   : STRUCT
        sName  : STRING(32);
        rTemp  : REAL;
        tHold  : TIME;
    END_STRUCT;
END_VAR

三、程序组织单元(POU)

POU 是 IEC 61131-3 中程序的基本组织单位,分为三类:程序(PROGRAM)、功能块(FUNCTION_BLOCK)和函数(FUNCTION)。程序是任务调度的直接对象,拥有独立的输入输出和内部状态;功能块具有记忆能力,每次调用保留上次的状态,适合封装设备控制逻辑;函数没有内部状态,相同输入必得相同输出,适合数学运算和类型转换。

CODESYS 中,一个功能块可以实例化多次,每个实例拥有独立的数据区。这种“一次编写、多处复用”的机制是构建大型项目的关键。例如,将一台电机的启停、故障检测、运行计时封装为 FB_Motor,项目中 20 台电机只需声明 20 个实例即可。

提示:功能块内部不要直接访问全局变量,应通过 VAR_INPUT / VAR_OUTPUT 接口传递数据,这样功能块才能在不同项目中复用。

四、任务配置:决定程序何时执行

任务配置定义了 POU 的调用时机和优先级。CODESYS 支持循环任务、自由运行任务和事件触发任务。循环任务按固定周期执行,如 1 ms、10 ms、100 ms;自由运行任务在上一轮结束后立即开始下一轮;事件触发任务由外部事件或系统事件启动。

任务优先级数值越小优先级越高。高优先级任务可抢占低优先级任务,因此高速控制逻辑应放在高优先级短周期任务中,HMI 刷新和日志记录放在低优先级长周期任务中。下表给出一个典型的分层配置:

任务名称 类型 周期/触发 优先级 典型用途
Task_Fast 循环 1 ms 1 高速计数、位置闭环
Task_Main 循环 10 ms 5 逻辑联锁、设备控制
Task_Slow 循环 100 ms 10 温度采集、PID 运算
Task_HMI 循环 200 ms 20 HMI 数据刷新、通信
Task_Event 事件 上升沿触发 3 报警捕获、配方切换

任务配置不当是现场故障的常见原因。若将 HMI 通信放在 1 ms 任务中,会因通信耗时导致任务超时;若将安全联锁放在 100 ms 任务中,则可能响应不及时。因此,任务周期与优先级必须与工艺要求匹配。

IEC 61131-3 编程要素与任务执行关系 程序组织单元 POU PROGRAM(程序) FUNCTION_BLOCK(功能块) FUNCTION(函数) 变量类型与类别 基本类型:BOOL/INT/REAL/TIME 派生类型:ARRAY/STRUCT/ENUM 类别:VAR/VAR_GLOBAL/RETAIN 参数:VAR_INPUT/OUTPUT/IN_OUT 五种标准语言 LD 梯形图 · FBD 功能块图 ST 结构化文本 · IL 指令表 SFC 顺序功能图 同一 POU 可混合调用 任务配置与执行时序 t=0 1ms 10ms 100ms 200ms P1 P1 P1 Task_Main Task_Main Task_Slow Task_Slow Task_HMI 优先级 1(最高) 优先级 5 优先级 10 优先级 20(最低)

五、基本调试方法

CODESYS 提供了一套完整的在线调试工具,掌握它们可以显著缩短排障时间。常用手段包括:

  1. 在线监视:将变量值实时显示在声明区或监视窗口中,观察逻辑是否符合预期。
  2. 断点与单步:在 ST 代码行设置断点,程序运行到该行暂停,可逐行执行并查看变量变化。
  3. 强制与写入:强制变量为固定值,用于模拟传感器信号;写入变量用于临时修改设定值。
  4. 采样跟踪:以微秒级精度记录变量随时间的变化曲线,适合分析偶发故障和时序问题。
  5. 调用栈:断点触发后查看 POU 调用层级,快速定位问题来源。
注意:强制变量会覆盖程序输出,调试完成后必须取消强制,否则可能造成设备误动作。在线修改代码后,务必重新下载并确认任务周期未超时。

六、常见误区与复盘

初学者常犯的错误包括:把功能块写成函数、在功能块内部直接读写全局变量、任务周期设置过短导致 CPU 负载过高、变量未初始化就参与运算、以及用 REAL 类型做精确比较。复盘时应重点检查三点:任务周期是否与工艺匹配、POU 接口是否清晰、变量类型是否与数据范围一致。

一个典型的排障案例是:某设备 HMI 刷新卡顿,检查发现 HMI 通信任务与 1 ms 高速任务共用同一优先级,导致通信被频繁抢占。将 HMI 任务降为低优先级、周期改为 200 ms 后,界面恢复流畅,高速控制也不受影响。这说明任务配置不是“越快越好”,而是要与实际需求分层匹配。

掌握以上五部分内容后,就可以在 CODESYS 中搭建结构清晰、易于维护和调试的 PLC 程序,为后续 HMI 画面开发和远程运维打下坚实基础。