3. IEC 61131-3编程语言概览

IEC 61131-3是工业自动化领域唯一的国际编程语言标准,它定义了五种编程语言:结构化文本(ST)、梯形图(LD)、功能块图(FBD)、顺序功能图(SFC)和指令表(IL)。这五种语言并非相互替代的关系,而是针对不同控制任务、不同技术背景工程师以及不同维护阶段而设计的互补工具。在Codesys开发环境中,理解这五种语言的本质差异与适用边界,是构建高效、可维护自动化程序的前提。本章将从语法特征、执行逻辑、工程适用性三个维度展开,帮助您建立语言选型的系统判断力。

IEC 61131-3 五种语言 ST 结构化文本 类Pascal高级语言 适合复杂算法/数据处理 LD 梯形图 继电器电路图形化 适合开关量/电气逻辑 FBD 功能块图 信号流连线式 适合过程控制/信号处理 SFC 顺序功能图 状态机/步进控制 适合流程/工步控制 IL 指令表 汇编风格助记符 适合简单逻辑/遗留维护 选型核心判断维度 • 逻辑复杂度:简单开关→LD/IL;复杂运算→ST • 流程控制:步进/状态机→SFC;连续调节→FBD • 团队背景:电气工程师→LD/FBD;软件工程师→ST • 维护成本:需现场快速排查→LD/FBD图形化更直观

3.1 核心原理:五种语言的语法本质与执行模型

IEC 61131-3标准的底层设计思想是"任务-程序-组织单元"的层级模型。无论使用哪种语言,最终都会被编译为统一的指令序列在PLC上执行。但不同语言的表达方式直接影响了程序的可读性、调试效率和运行性能。

ST(结构化文本)是一种高级文本语言,语法接近Pascal或C语言。它支持变量声明、IF/CASE条件分支、FOR/WHILE循环、数组和结构体等复杂数据类型。ST的编译效率高,适合实现PID控制算法、运动控制插补、数据处理和通信协议解析等计算密集型任务。在Codesys中,ST是默认的文本编辑语言,也是编写功能块(FB)和函数(FC)内部逻辑的首选。

LD(梯形图)源于继电器控制电路,以左右母线为电源线,中间用触点(常开/常闭)和线圈表示逻辑关系。LD的图形化特性使其在电气工程师中接受度极高,尤其适合离散量控制(如电机启停、阀门开关、互锁保护)。LD的每个网络(Network)从左到右执行,触点串联表示AND,并联表示OR,逻辑关系一目了然。

FBD(功能块图)将程序表示为信号流经功能块(如定时器TON、计数器CTU、比较器、PID)的连线图。FBD强调数据流而非电流流,适合模拟量处理、闭环控制和信号调理链路。在过程控制领域(如化工、水处理),FBD的直观性远超文本语言。

SFC(顺序功能图)基于Petri网理论,用步(Step)、转换(Transition)和有向连线描述顺序控制流程。SFC将复杂的顺序逻辑分解为多个稳定状态,每个步可以关联动作(Action),转换条件满足时步与步之间切换。SFC特别适合批处理、装配线、包装机械等具有明确工步顺序的设备。

IL(指令表)是一种类似汇编语言的助记符形式,每条指令占一行,如LD %IX0.0、AND %IX0.1、ST %QX0.0。IL在小型PLC和遗留系统中仍有应用,但在Codesys中已不是主流选择。其优点是执行效率极高、占用内存小,但可读性差,维护困难。

执行模型关键点:无论使用哪种语言,PLC程序都按照扫描周期执行:读取输入→执行程序→更新输出。但SFC和ST中的循环结构需要特别注意扫描时间的影响,避免因循环次数过多导致看门狗超时。

3.2 判断方法:如何根据控制任务选择最优语言

语言选型没有的对错,但存在"更优解"。以下是基于工程实践的选型决策流程,建议在项目启动阶段就完成语言规划。

  1. 第一步:识别控制类型。将整个控制任务分解为三类:离散逻辑(开关量)、过程调节(模拟量)、顺序流程(步进)。离散逻辑优先考虑LD或IL;过程调节优先FBD或ST;顺序流程优先SFC。
  2. 第二步:评估算法复杂度。如果涉及浮点运算、数组操作、字符串处理或自定义函数,ST是唯一合理选择。LD和FBD虽然支持数学指令,但复杂表达式会严重降低可读性。
  3. 第三步:考虑团队技能矩阵。如果维护团队以电气工程师为主,LD和FBD的图形化界面能降低排障门槛;如果团队有软件背景,ST的代码复用性和模块化优势更明显。
  4. 第四步:检查目标PLC性能。老旧或低端PLC对IL和LD的编译支持最好,而ST和SFC需要更多内存和CPU资源。在Codesys中,所有语言都会被编译为相同的中间代码,但复杂ST代码在低性能控制器上可能产生更长的扫描周期。
表3-1 五种语言特性对比矩阵
维度STLDFBDSFCIL
语法类型文本高级语言图形继电器逻辑图形信号流图形状态机助记符文本
最适合场景算法/数据处理离散量/电气互锁过程控制/信号链顺序/步进控制简单逻辑/遗留维护
可读性(电气背景)低高中高中极低
可读性(软件背景)高中中中高低
复杂运算支持极强弱中弱弱
调试便利性变量监视/断点触点/线圈高亮信号线高亮步状态高亮单步执行
代码复用性极高(函数/功能块)低(需复制网络)中(功能块实例化)中(动作封装)低
执行效率高中中中极高

3.3 案例拆解:混合语言编程在包装产线中的应用

为深入理解语言选型,我们以一个典型的包装产线控制项目为例。该产线包含三个工位:物料输送(变频器控制)、封口加热(PID温控)、贴标定位(伺服步进)。项目约束:PLC为Codesys软PLC(运行于工业PC),扫描周期要求≤10ms,维护团队为3名电气工程师和1名软件工程师。

初始方案与问题:团队最初全部使用LD编程。输送工位的变频器启停和互锁逻辑用LD实现非常顺利,但封口加热的PID参数整定需要频繁修改浮点系数,LD中的PID功能块参数调整极不直观;贴标定位的伺服控制涉及位置计算和加减速曲线,LD中编写数学公式导致网络数量爆炸,程序扫描时间达到23ms,超出要求。

重构方案:采用混合语言策略——

  • 输送工位(离散逻辑):保留LD,利用其触点/线圈的直观性实现急停、过载保护、正反转互锁。
  • 封口加热(过程控制):改用FBD,将温度传感器信号经滤波→PID→占空比输出,信号流清晰可见。PID参数通过HMI绑定到FBD功能块实例的变量,在线整定效率提升60%。
  • 贴标定位(运动控制):使用ST编写位置规划函数块,内部实现梯形加减速算法和误差补偿。ST支持数组存储位置曲线,代码量仅为LD的1/5。
  • 整机顺序(流程管理):最外层用SFC组织三个工位的协同流程,每个工位封装为一个动作(Action),转换条件为传感器信号或定时器。

结果对比:重构后扫描周期降至7ms,程序总行数减少40%,电气工程师通过LD/FBD/SFC的图形界面即可完成80%的日常维护,软件工程师专注于ST算法模块。关键风险在于SFC的转换条件竞争——当两个转换条件同时满足时,SFC默认按优先级执行,需在属性中显式设置优先级。

经验复盘:混合语言不是"炫技",而是让每种语言回归其最擅长的领域。建议在项目初期用一张语言分布图(哪个功能块用哪种语言)作为设计文档的一部分,避免后期混乱。

3.4 常见误区与总结复盘

在培训和企业咨询中,我们发现工程师在语言使用上存在几个高频误区,需要特别警惕。

误区一:盲目追求"纯图形化"。有些企业强制所有程序必须用LD或FBD,理由是"电气工程师看得懂"。但当控制算法涉及矩阵运算或自定义数据结构时,图形化语言的表达能力严重不足,反而催生了大量难以维护的"面条式"网络。正确做法是:图形化用于逻辑和流程,文本化用于算法和数据处理。

误区二:忽略SFC的初始化与安全步。SFC虽然擅长顺序控制,但很多工程师忘记定义初始步(Init Step)和异常处理步。当设备急停后重启,SFC必须能回到安全初始状态,否则可能从错误步继续执行。建议在SFC开头增加一个"复位检测"转换条件,确保所有执行器处于安全位置后才进入运行步。

误区三:在ST中滥用全局变量。ST的灵活性诱使程序员大量使用全局变量进行数据交换,这会导致程序耦合度极高,排查问题时难以定位变量被谁修改。应遵循IEC 61131-3的封装原则:数据尽量定义在功能块内部,通过接口(VAR_INPUT/VAR_OUTPUT)传递。

误区四:认为IL已完全淘汰。虽然Codesys默认不推荐IL,但在某些安全PLC(如Pilz、HIMA)的认证编程中,IL仍是唯一允许的语言,因为其行为可预测性最强。如果您的项目涉及功能安全(如ISO 13849),建议保留IL的阅读能力。

风险提示:在同一个POU(程序组织单元)内混用多种语言是允许的(Codesys支持在POU内部嵌套不同语言编写的功能块),但禁止在同一个网络或语句块中混用语法。切换语言时,注意变量类型隐式转换可能带来的精度损失,例如REAL转INT时需显式使用REAL_TO_INT函数。

总结:IEC 61131-3的五种语言构成了一个完整的表达光谱——从最底层的IL到最高层的SFC,每种语言都有其不可替代的价值。在Codesys中,您甚至可以在同一个工程中自由组合这些语言,只要遵循"逻辑用图形、算法用文本、流程用SFC"的总体原则。下一阶段的学习中,我们将深入ST语言的语法细节,因为它是实现复杂控制策略的核心工具,也是理解其他语言编译行为的钥匙。