4. IEC 61131-3标准编程基础

IEC 61131-3 是 PLC 编程语言的事实标准,它规定了五种编程语言:梯形图(LD)、功能块图(FBD)、结构化文本(ST)、顺序功能图(SFC)和指令表(IL)。在 PLCnext Engineer 中,前四种语言均得到原生支持,IL 已逐步被 ST 取代。理解这些语言在 PLCnext 中的具体实现方式,以及变量声明、数据类型和程序组织单元(POU)的组织规则,是编写可维护、可复用控制程序的基础。

一、四种编程语言在 PLCnext 中的定位与实现

PLCnext Engineer 采用统一的工程模型,所有语言共享同一套变量系统和 POU 容器。这意味着你可以在同一个项目中用 LD 编写电机启停逻辑,用 ST 编写 PID 计算,用 SFC 组织整条产线的工序切换,它们之间通过变量和 POU 调用直接交互,不需要额外的接口转换。

LD(梯形图)以触点、线圈和功能块框的形式表达布尔逻辑,适合电气工程师快速阅读和修改。在 PLCnext 中,LD 网络被编译为 ST 中间代码,因此其执行效率与 ST 相当。LD 的典型应用是联锁、启停保持和故障复位回路。

FBD(功能块图)用矩形框表示功能块,用连线表示信号流向,特别适合模拟量处理、信号选择和运算逻辑。PLCnext 的 FBD 编辑器支持直接拖放标准库中的功能块(如 LIMIT、SEL、MOVE),并自动处理数据类型匹配。

ST(结构化文本)是一种类 Pascal 的高级文本语言,支持条件分支、循环、数组和自定义功能块调用。在 PLCnext 中,ST 是唯一可以编写复杂算法和状态机的文本语言,也是实现自定义功能块的首选。

SFC(顺序功能图)用步(Step)、转换(Transition)和动作(Action)描述顺序过程。PLCnext 的 SFC 编辑器支持单序列、选择分支和并行分支,转换条件可以用 ST 或 LD 编写。SFC 适合包装机、装配线等有明显工序阶段的设备。

PLCnext 中 IEC 61131-3 语言与 POU 组织关系 LD 梯形图 布尔联锁 / 启停保持 FBD 功能块图 模拟量处理 / 信号选择 ST 结构化文本 算法 / 状态机 / 自定义 FB SFC 顺序功能图 工序步序 / 并行分支 统一编译模型 → ST 中间代码 → 机器码 共享变量空间 PRG 程序 主任务调用入口 FB 功能块 带内部状态 / 可多实例 FC 函数 无内部状态 / 纯计算 变量声明区(VAR / VAR_INPUT / VAR_OUTPUT / VAR_IN_OUT) 数据类型:BOOL · INT · DINT · REAL · LREAL · TIME · STRING · ARRAY · STRUCT 作用域:局部变量 · 全局变量 · 直接地址变量(%I / %Q / %M) 所有语言共享同一变量声明体系,跨语言调用无需类型转换

二、变量声明:从数据类型到作用域

PLCnext 的变量声明遵循 IEC 61131-3 的严格类型体系。每个变量必须声明名称和数据类型,编译器在编译阶段进行类型检查,避免运行时出现隐式转换错误。常用的基本数据类型包括:BOOL(布尔)、INT/DINT(16/32 位整数)、REAL/LREAL(32/64 位浮点)、TIME(时间)、STRING(字符串)。此外还支持 ARRAY(数组)和 STRUCT(结构体)等派生类型。

变量按作用域分为三类:局部变量在 POU 内部声明,仅在该 POU 内可见;全局变量在全局变量表中声明,所有 POU 均可访问;直接地址变量用 %I、%Q、%M 前缀直接映射到输入、输出和标志区,用于与硬件 I/O 绑定。在 PLCnext 中,推荐优先使用符号变量而非直接地址,以提高程序可读性和可移植性。

变量声明区还区分变量类别:VAR_INPUT 表示输入参数,VAR_OUTPUT 表示输出参数,VAR_IN_OUT 表示引用传递参数,VAR 表示内部变量。对于功能块(FB),内部变量在实例调用之间保持状态;对于函数(FC),所有变量在每次调用时重新初始化。

三、程序组织单元(POU)的三种类型

PLCnext 中的 POU 分为三种:程序(PRG)、功能块(FB)和函数(FC)。PRG 是任务调用的入口,每个任务至少绑定一个 PRG,PRG 中可以调用 FB 和 FC。FB 带有内部状态,每次调用需要分配一个实例数据块,适合封装电机、阀门、PID 等具有记忆特性的对象。FC 没有内部状态,适合纯计算或数据转换,如单位换算、限幅、查表等。

下面是一个用 ST 编写的 FB 示例,实现一个带限幅和报警的模拟量处理功能块:

FUNCTION_BLOCK FB_AnalogProcess
VAR_INPUT
    RawValue : INT;          // 原始输入值
    ScaleMin : REAL := 0.0;  // 工程量下限
    ScaleMax : REAL := 100.0;// 工程量上限
    AlarmHigh : REAL := 90.0;// 高报警阈值
END_VAR
VAR_OUTPUT
    EngValue : REAL;         // 工程量输出
    Alarm : BOOL;            // 报警输出
END_VAR
VAR
    ScaleFactor : REAL;
END_VAR

// 计算缩放系数
ScaleFactor := (ScaleMax - ScaleMin) / 27648.0;
// 原始值转工程量
EngValue := ScaleMin + INT_TO_REAL(RawValue) * ScaleFactor;
// 限幅
IF EngValue > ScaleMax THEN
    EngValue := ScaleMax;
ELSIF EngValue < ScaleMin THEN
    EngValue := ScaleMin;
END_IF;
// 报警判断
Alarm := EngValue >= AlarmHigh;
END_FUNCTION_BLOCK

该 FB 在 LD 或 FBD 中调用时,只需拖入一个功能块框,连接 RawValue 输入和 EngValue、Alarm 输出即可。PLCnext 会自动为该 FB 分配实例数据块,保存 ScaleFactor 等内部变量。

四、语言选择与混合编程建议

在实际项目中,四种语言往往混合使用。一个典型的包装机控制程序可能这样组织:用 SFC 描述“上料→封口→切断→输出”的工序步序;每个步的动作中用 LD 编写气缸联锁;用 FBD 处理称重传感器的模拟量;用 ST 编写称重补偿算法和自定义 FB。PLCnext 允许在 SFC 的转换条件中直接嵌入 ST 代码,也允许在 LD 网络中调用 ST 编写的 FB,语言边界完全透明。

选择语言时可以参考以下原则:布尔逻辑和联锁优先用 LD;模拟量处理和信号流用 FBD;复杂算法、循环和状态机用 ST;有明显工序阶段的设备用 SFC。不必强求全项目统一语言,关键是让维护人员能快速理解程序意图。

在 PLCnext Engineer 中,右键点击 POU 可以随时切换实现语言(如将 LD 转为 ST),变量声明和接口保持不变。这为后期重构提供了便利,但转换后的代码可读性可能下降,建议仅在必要时使用。

五、变量声明与 POU 的工程实践要点

第一,为每个 FB 的输入输出添加注释和默认值,默认值可以在调用时省略不连接的参数。第二,避免在 FC 中使用全局变量,保持函数的纯计算特性,便于测试和复用。第三,对于需要跨任务共享的数据,使用全局变量表并明确标注读写方,避免多任务竞争。第四,直接地址变量(%I/%Q)建议只在硬件配置层使用,逻辑层统一用符号变量映射。