4. IEC 61131-3编程基础在PLCnext中的实现

PLCnext Control 的运行时完整支持 IEC 61131-3 标准,但它的实现方式与传统的“单一控制器 + 单一工程”有明显差异:变量、程序组织单元(POU)、任务配置、库函数和在线调试分别落在不同的工程对象中,并通过 ACF(Axioline 组件框架)与 Linux 侧的组件协同。理解这些对象之间的对应关系,是后续做 HMI 集成与数据交换的前提。

变量与数据类型:从标准类型到 PLCnext 扩展

IEC 61131-3 定义了 BOOL、BYTE、WORD、DWORD、SINT/INT/DINT、USINT/UINT/UDINT、REAL/LREAL、TIME、STRING 等基本类型。在 PLCnext Engineer 中,这些类型可直接用于变量声明,但需要注意两点:一是 STRING 默认长度为 80 字符,若用于 HMI 显示需显式声明 STRING[255];二是 PLCnext 扩展了 LTIME、LWORD 以及 ARRAY、STRUCT 等复合类型,其中结构体在跨 HMI 通信时建议使用扁平化成员,避免嵌套过深导致符号映射困难。

变量按作用域分为三类:局部变量(VAR,仅在 POU 内可见)、输入/输出变量(VAR_INPUT/VAR_OUTPUT,用于 POU 间调用)、全局变量(VAR_GLOBAL,位于 GVL 中,可被 HMI 直接访问)。工程实践中,HMI 需要读写的变量应统一放入 GVL,并加前缀区分,例如 gHmi_StartCmd、gHmi_SpeedSet,便于在 OPC UA 或 Proficloud 中做符号过滤。

声明变量时建议显式指定初值,例如 iCounter : INT := 0;。PLCnext 在冷启动时按初值初始化,热复位时保留保持型变量(RETAIN/PERSISTENT),这一差异会直接影响 HMI 上电后的显示状态。

程序组织单元:FC、FB 与 PRG 的分工

IEC 61131-3 的 POU 分为函数(FUNCTION)、功能块(FUNCTION_BLOCK)和程序(PROGRAM)。在 PLCnext 中,三者的使用边界比较清晰:

  • FC:无内部状态,适合做数学运算、单位换算、位操作。例如把 REAL 转速换算为 INT 显示值。
  • FB:带内部状态,适合做电机控制、PID、报警管理等需要记忆上次状态的逻辑。FB 必须实例化后调用,实例名建议与设备名一致,如 fbPump1。
  • PRG:程序入口,通常一个任务对应一个 PRG,内部按顺序调用各 FB 和 FC。

一个常见的组织方式是:PRG_Main 作为主程序,内部依次调用 fbConveyor、fbValve、fcScale,而 HMI 只与 GVL 中的变量交互,不直接调用 FB。这样做的目的是让 HMI 与逻辑解耦,后续修改控制逻辑时不必重新映射 HMI 变量。

任务与周期配置:把逻辑放到正确的时间片

PLCnext 的任务配置决定了 POU 的执行时机。在 PLCnext Engineer 的“任务与事件”视图中,可以创建周期性任务并绑定 PRG。典型配置如下:

任务名周期绑定程序典型用途
Task_Fast10 msPRG_Fast高速计数、急停逻辑
Task_Main50 msPRG_Main常规控制、联锁
Task_Slow500 msPRG_SlowHMI 数据刷新、统计

任务优先级由周期决定:周期越短优先级越高。若把 HMI 刷新放在 10 ms 任务中,会挤占控制逻辑的 CPU 时间,因此 HMI 相关变量建议放在 100 ms 以上的任务中更新。此外,PLCnext 支持事件触发任务,例如由 EVE_Input 触发,适合处理外部中断信号。

PLCnext 特有库函数

除标准库(如 TON、CTU、R_TRIG)外,PLCnext 提供了若干专用库,工程中常用的有:

  • PLCnextBase:提供系统信息、时间同步、诊断读取,例如 GetSystemTime()。
  • Arp 库:用于 Axioline 模块的参数读写,如读取模块温度、通道状态。
  • Profinet 库:用于 PROFINET 设备的诊断与参数访问。
  • OPC UA 相关函数:用于在控制器内部构建 OPC UA 变量节点,供 HMI 或 SCADA 订阅。

使用这些库时,需要在“库”视图中添加对应库引用,并在 POU 中声明实例。例如调用 Arp_ReadModuleTemperature 时,需传入模块槽号与通道号,返回值为 REAL 温度值,可直接写入 GVL 供 HMI 显示。

在线调试与变量监视

PLCnext Engineer 的在线调试支持变量监视表、强制、写入和断点。实际操作中,先建立“监视表”,把需要观察的变量拖入,例如 gHmi_SpeedSet、fbPump1.Status、iCounter,然后点击“在线”进入监视模式。此时变量值以绿色显示实时值,若为 FALSE 则显示为灰色。

强制(Force)用于临时覆盖输入值,适合排查传感器故障;写入(Write)用于修改输出或内部变量,适合测试 HMI 命令。需要注意:强制值在退出在线模式后失效,而写入值会保留到下一次逻辑刷新。调试完成后应清除所有强制,避免遗留状态影响正式运行。

PLCnext 工程对象与任务执行关系 GVL 全局变量 gHmi_StartCmd : BOOL gHmi_SpeedSet : INT gHmi_Status : WORD HMI 读写入口 PRG_Main fbConveyor() fbValve() fcScale() 调用 FB / FC 功能块实例 fbConveyor : FB_Conveyor fbValve : FB_Valve 内部状态保持 RETAIN / PERSISTENT 读写 调用 任务与周期配置 Task_Fast 10 ms PRG_Fast Task_Main 50 ms PRG_Main Task_Slow 500 ms PRG_Slow PLCnext 特有库函数 PLCnextBase 系统时间/诊断 Arp 库 模块温度/通道 Profinet 库 设备诊断 OPC UA 函数 变量节点发布 在线调试:监视表 → 强制/写入 → 清除强制 → 恢复运行

把上述对象串起来看:GVL 是 HMI 与逻辑之间的数据接口,PRG 是任务绑定的执行入口,FB 承载设备状态,库函数提供系统级能力,而在线调试则是验证这条链路是否按预期工作的手段。实际工程中,建议先定义 GVL 变量表,再编写 FB,最后配置任务并绑定 PRG,这样能减少后期因变量作用域或任务周期不匹配导致的返工。