☰
IEC 61131-3标准详解:五种PLC编程语言选型与实战
2026/9/29 10:57:20 网站建设 项目流程

干了十几年PLC项目,从继电器柜画到Codesys,从三菱FX系列摸到西门子博途,我越来越觉得有一个标准被太多人低估了:IEC 61131-3。很多人一提到PLC编程,第一反应就是梯形图,觉得只要会梯形图就能走天下。但真正做过国际化项目、或者被甲方要求统一编程规范的时候,你会发现,IEC 61131-3定义的这五种编程语言,才是打通不同品牌PLC之间那道墙的通用语言。这一篇,我想把这个标准掰开揉碎,结合我实际项目里的体会,聊聊五种PLC编程语言各自的门道,以及现场到底该怎么灵活用。

1. 五种语言到底在解决什么问题

1.1 一个真实场景:同一个工艺,五种写法

先讲一个我亲身经历的事。早些年做一条生产线改造,控制系统用的是某国产品牌PLC(当时还没普及Codesys,都是厂家自家的编程软件)。甲方工艺工程师拿着一份老外的流程描述,要求实现一个“自动清洗循环”:注水→加热→保温→排放→重复三次,期间温度超过上限要立刻报警并暂停。这套逻辑放在三菱PLC里,我大概率用梯形图加一堆定时器和计数器;放在西门子S7-1200里,我可能用STEP 7的SCL写个FOR循环;放在Codesys环境里,我甚至能用SFC把整个清洗过程画成一个个状态框,每个状态之间用转换条件连起来。

同一个工艺,在不同平台上有不同写法,这其实是IEC 61131-3出现前最让工程师头痛的事。你在这个品牌PLC上积累的梯形图经验,换个牌子基本要推翻重来,因为指令集不一样,寻址方式不一样,甚至程序组织单元的叫法都不一样。IEC 61131-3想解决的,就是这个问题——它给出了五种标准的编程语言,并且定义了统一的软件模型和指令结构,让程序在不同平台间移植成为可能。

1.2 标准和产业逻辑:为什么企业强制推行它

您可别小看这个标准。在欧洲,很多大型设备制造商在招标技术规格书里明确写着“程序必须符合IEC 61131-3标准”,原因很简单:设备生命周期长,动辄十几二十年,如果原设计工程师离职、PLC品牌停产,后面的人接手时无从下手。有了标准化的语言体系和统一的变量声明方式,维护团队哪怕没接触过这个平台,也能快速看懂逻辑脉络。而且,现在主流的中高端PLC软件几乎全部向着IEC 61131-3靠拢,比如Codesys、博途的SCL/FBD、倍福TwinCAT、汇川InoProShop、信捷XDPPro,底层都遵循这个标准框架。理解了这五种语言,就等于你拿到了一把通用钥匙,换平台时不需要再从零学起。

2. 五种编程语言逐个拆解

2.1 梯形图(LD):电气工程师的母语

梯形图是所有语言里最直观、最接近传统继电器控制电路的一种。它用左母线、右母线、常开触点、常闭触点、线圈、功能块这样一套图形元素,把原来的物理继电器接线图转换成PLC内部的软逻辑。对老一代电气出身、没系统学过高级语言的工程师来说,梯形图是最友好的表达形式。现场调试时,你拿万用表量到一个24V信号,回来在梯形图里找一个常开触点,这种思维模式在梯形图里是零成本的。

梯形图的思考方式叫做“能流”。电流从左母线流向右母线,一路穿过串并联的触点,最终驱动线圈。但实际上PLC是循环扫描执行的,所谓能流只是一种视觉模拟。常见的注意点包括:串联多个常闭触点时容易误判逻辑,双线圈输出需要特别小心——同一个线圈在一个扫描周期内被多次赋值,最终结果取决于最后一次,这往往是程序里潜伏的Bug来源。

实际项目中,我建议把梯形图主要用于:启动停止回路、电机正反转互锁、手自动切换、现场按钮和指示灯的映射逻辑、报警硬接线的状态读取这些“看得见摸得着”的部分。不要硬拿梯形图去算PID或处理字符串,那不仅写起来痛苦,后期维护更是灾难。

2.2 功能块图(FBD):信号流向思维的图形化表达

FBD是第二种图形语言,它不像梯形图那么强调“能流”,而是采用信号流线的概念:每个功能块有输入引脚和输出引脚,你用连线把前一个块的输出接到后一个块的输入,整个程序就像一张数据流的电路图。从事仪表控制、DCS系统转过来的工程师会非常适应FBD,因为它和模拟仪表控制回路里的函数块几乎一个思路。

FBD最擅长的场景是连续控制,比如PID调节回路、模拟量处理、变频器通讯状态字的解析、阀门动作联锁等。一个PID功能块,你把PV值连到输入、SP值连到给定、输出引脚连到模拟量输出通道,然后配置好P、I、D参数和上下限,一个温度闭环就成型了。这种“接线式”编程的好处是直观,而且非常适合团队协作——工艺工程师可以直接看图理解信号的来龙去脉,不需要像阅读ST代码那样一行行去逆推。

但FBD也有短板。第一是程序规模一大,页面之间的连线会变得极其混乱,信号跳转如果做了分页,很不方便排查;第二是复杂数学运算,比如矩阵运算、数组处理,用FBD画起来又繁琐又没有效率。我的经验是:FBD适合中小规模的连续控制逻辑和联锁保护,但别想着用它搞定全部程序。

2.3 结构化文本(ST):算法与数据处理的阵地

ST语言是五种语言里最接近高级编程语言(如Pascal、C)的一种。它用赋值语句、IF条件、CASE选择、FOR循环、WHILE循环、函数和函数块调用等方式写控制算法。很多人第一次在PLC里看到ST代码时,都会有一种“这不就是平时写单片机程序吗”的感觉。事实上,它的确是把计算机科学的表达能力引入了PLC领域。

ST的威力体现在什么地方呢?我举个例子:设备要做配方管理,有50组配方,每组配方有20个参数,从配方编号自动加载到当前工艺参数,这用梯形图写只靠传送指令硬堆,代码量大到怀疑人生。用ST写,一个FOR循环加数组索引,10行代码就干干净净地完成了。再比如数据处理类的应用:通讯协议解析、仪表返回的ASCII字符串转浮点数、CRC校验计算、历史数据排列、伺服轴参数批量下发,这些场景ST几乎是唯一合理的选择。

还有一个ST非常擅长的场景——流程算法里需要写复杂判断条件的时候。几个模拟量、几个数字量,要组合出“既满足A又满足B,或者C大于某个阈值且D不在禁止范围内”这样的逻辑,你用梯形图画出来可能会占满半张图,用ST只要一个多条件IF语句。而且ST代码天然具备自上而下的可读性,配合良好的注释,后续维护人员的上手速度远高于图形化程序。国内很多老工程师对ST有畏难情绪,觉得“编程”两个字吓人,其实ST只需要掌握基本的语法规则,比Java、Python简单太多,一周足以入门。

2.4 指令表(IL):汇编级别的底层视角

IL语言现在的出场率已经越来越低了,但我仍然认为理解它对深入理解PLC运行机制有帮助。IL是一种类似汇编语言的文本语言,程序由一条条指令组成,比如LD X0(取常开触点X0)、AND X1(串联常闭触点X1)、OUT Y0(输出到Y0),每行一条指令,操作符和操作数并列。你几乎可以在任何一款PLC软件里把一段梯形图“转换”成指令表视图,这在老式编程软件中很常见,因为指令表历史上曾经是PLC的“通用中间表示”。

对于现代开发,我不推荐用IL作为主力语言,一方面因为它可读性差,程序规模一大就变成了天书;另一方面,国际电工委员会在IEC 61131-3的第三版(IEC 61131-3:2013)中已经将IL列为“被弃用”的语言,新的Codesys版本里虽然还保留兼容性,但官方显然更希望用户转向ST。不过,了解IL仍然有实际价值:当你解析某些老设备的程序备份时,当你在网上找到一些用老式指令表写的参考程序时,读得懂IL意味着你能把这些遗产程序改写成现代语言,这是很多工程师不愿意做,但做成了很显功力的活。

2.5 顺序功能图(SFC):状态机思维的图形化表达

SFC是我个人最偏爱的一种语言,它把整个工艺流程按照“步”(Step)和“转换条件”(Transition)的方式组织起来,本质上就是一种图形化的状态机。每一步里有若干动作,动作可以是任何语言写的逻辑(最常见的用法是在步里调ST代码或梯形图逻辑);满足转换条件后,状态自动从当前步跳到下一步。这种表达方式天然贴合流程性工艺,比如自动清洗、热处理循环、包装线动作序列、注塑机循环周期,甚至交通信号灯控制。

很多刚接触SFC的工程师最大的困惑是“怎么让程序停在某个状态等条件”。在SFC里这就是默认行为:当前步处于活动状态,其内部的动作持续执行,转换条件不满足就不会往下走,你要做的只是定义好“从第几步在什么情况下跳到哪一步”。相比梯形图里一堆SET/RST加上互锁条件,SFC把状态流转的逻辑单独提炼出来,整个流程一目了然。用SFC后,调试现场时,你直接在监控界面看哪一步是高亮的,就知道设备卡在哪个环节,这种定位效率是梯形图远远比不上的。

SFC需要注意的坑也同样明显。第一,初始化动作必须在初始步里做好,否则上电后状态错乱;第二,分支和并行处理需要用“分支/汇合”结构,语法一旦画错,程序行为会变得非常奇怪;第三,重复循环跳转时要防止振荡——两个步之间转换条件同时满足,程序就会每扫描周期都来回跳。这些细节都需要有项目经验做支撑。

3. 五种语言怎么选、怎么混用

3.1 从项目类型反推语言选型

经常有新手问我:“哪种语言最有用?我该先学哪个?”我的回答通常是:先学梯形图,但要把ST当作最终主力。为什么?因为梯形图是PLC行业的通用交流语言,面试时、和老工程师讨论逻辑时、现场快速搭一个简单手自动切换时,梯形图都是最高效的工具。但一旦项目进入深水区——大批量数据处理、复杂算法、多轴联动、过程控制——梯形图效率太低,ST才是硬通货。

具体到项目选型,我通常这样做判断:如果项目全是开关量逻辑,比如电机启停、阀门开关、信号联锁,那梯形图或FBD足矣,代码直观,维护门槛低;如果项目有连续控制(温度、液位、压力、流量调节),那FBD做PID回路最顺手;如果项目以流程顺序动作为核心,比如清洗机、退火炉、自动上下料,那SFC是最契合的表达方式;如果项目涉及通讯协议解析、班报表统计、配方管理、伺服批量参数初始化,那ST一定占大头。真正的项目,很少只用一种语言,基本都是两三种语言混编。

3.2 实操中的混合编程策略

以Codesys和汇川InoProShop为例,一个标准的“非标自动化项目”程序,我通常这样组织:主任务里用ST写总控逻辑,包括模式切换、报警汇总、数据管理;独立的PRG(程序组织单元)用SFC写自动流程的主序;手动操作和单机调试逻辑用梯形图写在另一个任务里;模拟量闭环控制放在FBD任务里,PID块一目了然。这种混合结构的价值在于:每种语言都充分发挥了它的优势,并且团队里不同背景的工程师可以各取所长——电气出身的人维护梯形图的部分,软件出身的人维护ST的部分,工艺工程师直接看SFC的步骤判断流程合理性。

有一点我得强调:不管用几种语言,变量的定义规范一定要统一。IEC 61131-3本身定义了变量类型(BOOL、INT、REAL、STRING等)以及VAR_GLOBAL、VAR_INPUT、VAR_OUTPUT等声明区,你只要按规范声明变量,程序跨语言混用完全没问题。但如果变量命名随心所欲,比如中英文混写、ad1/ad2/ad3这种无意义命名,那再好的语言结构也救不了你的后期维护。

3.3 语言特性对照与建议
编程语言表达方式最适场景核心优势主要短板
梯形图(LD)图形化(触点-线圈)开关量逻辑、手动控制、电气联锁类继电器电路,电气工程师易上手复杂算法和数据处理效率极低
功能块图(FBD)图形化(信号流连线)PID闭环、模拟量处理、联锁保护数据流一目了然,适合连续控制大规模逻辑连线杂乱
结构化文本(ST)文本(类高级语言)算法、数组处理、协议解析、流程逻辑表达能力强,适合复杂逻辑和数据操作图形化弱,传统电气工程师有门槛
指令表(IL)文本(类汇编)老程序理解与转换、底层调试贴近底层,历史上跨平台通用可读性差,新版标准已弃用
顺序功能图(SFC)图形化(状态步+转换)批处理流程、顺序控制、状态机流程结构清晰,现场定位快状态与转换逻辑学习曲线陡

这张表是我做内部培训时常用来给新人做选型参考的。它不能替代具体的判断,但在项目规划阶段先按表对号入座,方向通常不会跑偏。

4. 实战中的典型问题、排查技巧与进阶建议

4.1 常见问题速查与解决思路

实践出真知,下面我把做项目这几年高频踩到的问题整理成一份速查表,每个问题都给出排查时的具体思路,而不是只写一句“请检查程序”。

现象可能的根因排查操作与解决方向
PLC输出指示灯亮,但执行机构不动输出继电器触点问题或外部接线断路先量PLC输出端电压,再量继电器线圈端电压,分段排查;查看输出模块是否过流保护
梯形图里线圈有“能流”,但输出点不动作双线圈赋值或该输出被IL/ST重复驱动在软件里做交叉引用查询,看同一个输出地址被多少个程序段赋值,合并赋值逻辑
PID回路波动大,温差震荡剧烈P值过大、积分时间不合适、输出上下限未限制、PV滤波缺失先把P值降到当前值一半观察趋势,I时间先加大,逐步逼近;确认执行器正反作用和PID极性
SFC流程执行到某一步就卡住不再往下走转换条件始终未满足,或该步动作里的变量被其它任务修改监控SFC当前活动步,同时打开转换条件表达式在线看,检查涉及到的变量是否被强制或双重写入
连接PLC失败,搜索不到CPU,只能通过IP地址连接软件与PLC网关参数不一致或MAC地址绑定错误,例如博途与PLC通讯网口设置问题检查电脑网卡IP与PLC是否在同一网段,确认AMS NetId、端口号,用PING测通后再连;部分软件需先在线分配设备IP
“下载程序时提示组态数据保护密码错误”组态时设置了上传/下载保护密码,常见于S7-PLCSIM Advanced确认安全设置里的保护级别,输入正确密码;无法找回的只能恢复出厂或清除保护位(需谨慎操作)
模拟量采集值跳变,温度/压力曲线毛刺严重屏蔽接地不良或采样滤波参数没设模拟量信号线使用屏蔽双绞线且单端接地;在PLC侧启用数字滤波,采样次数设为8-16次再平均

这里要特别强调“交叉引用查询”这个功能。不管是西门子博途、三菱GX Works还是Codesys,都有交叉引用/使用位置检查的窗口。程序运行异常时,我第一件事往往是查这个输出点或中间变量被哪些程序段写过——大概有三分之一的中级Bug都源于不同程序段对同一变量重复写值,这种问题靠通读代码很难快速定位,用交叉引用一查便知。

4.2 从零基础到独立做项目的进阶路径

如果你完全是新手,刚接触PLC编程,我给一条比较务实的路线。第一步,不要急着背指令集,先理解PLC工作方式——循环扫描、输入刷新、程序执行、输出刷新,这四个阶段是所有PLC的骨架。用生活类比来说:PLC像一位极其严格的门卫,每个固定周期把大门口所有变化状态记下来(输入刷新),然后按你写的规则逐一判断(程序执行),最后统一把结果贴到布告栏上(输出刷新)。理解了这个,梯形图里的“能流”就不是玄学了。

第二步,用小型PLC做基础练习,比如用三菱FX系列或西门子S7-200 SMART实现电机启保停、正反转互锁、星三角降压启动、红绿灯循环闪烁。这些经典案例能帮你建立继电器逻辑思维。第三步,开始学习ST语言:变量类型、IF/CASE、FOR循环、数组、功能块,把这些语法对照梯形图反复练习——同样的功能先用梯形图实现,面试用;再用ST实现,项目用。第四步,把SFC作为进阶方向,找一段有明确流程的工艺去改写,比如自动清洗、温度分段控制。等你把四种主要语言的边界、优势和混编方式都摸清了,就能根据工艺自由搭建程序结构。

4.3 最后的几句经验与一个重要的学习建议

我在实际项目中越用越深的体会是:语言本身只是工具,真正值钱的是对工艺的理解和程序架构的思想。一个完整的PLC项目程序,架构比语言更关键:任务如何划分、变量如何规范命名、程序段之间的耦合度怎么控制、报警和故障处理机制怎么统一、手动模式与自动模式如何无缝切换,这些才是决定一个项目交付质量和后期维护成本的核心。很多工程师困在“会用梯形图”的舒适区,一看到ST和SFC就绕着走,等到真正接手大型非标项目,才发现自己的武器库里根本没有合适的工具。

最后分享一个小建议:不管你当前主力用哪个品牌,都建议找一套Codesys或基于Codesys的国产软件(比如汇川InoProShop)从头到尾做一个练习项目,把同一个功能分别用LD、FBD、ST、SFC四种语言各写一遍,然后对照运行结果。做完这个练习,你对IEC 61131-3五种PLC编程语言的理解,会比看十遍教程都要深刻。这也是我这些年带新人时唯一强制要求交的“作业”——能坚持做下来的人,后面独立做项目时,几乎没有一个人掉链子。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询