PLC编程必知:IEC 61131-3五种语言详解与选型实战 1. 从一门老手艺讲起为什么PLC编程需要国际标准干了好几年PLC项目的工程师没人不知道IEC 61131-3。这个标准说白了就是给PLC编程语言定的一套“普通话”让西门子、三菱、罗克韦尔、施耐德、汇川、台达这些品牌虽然各说各的方言但底层逻辑能互通。我刚入行那会儿从三菱FX系列跳到西门子S7-1200最大的感受不是硬件差异而是编程思路的转换成本太高——三菱的梯形图习惯和西门子的函数块思维完全是两套体系。后来真正看懂IEC 61131-3才明白这标准解决的就是“工程师换品牌要重新学”这个大痛点。很多人以为五种语言就是五种工具随便挑一个用就行。真到项目上你会发现这五种语言各有各的脾气有的适合画逻辑有的适合写算法有的天生就是用来描述流程的。选错语言不是不能跑而是后期维护、排查故障的时候能让你多熬几个通宵。本文就围绕IEC 61131-3规定的五种编程语言——梯形图LD、功能块图FBD、顺序功能图SFC、结构化文本ST、指令表IL把它们的原理、适用场景、实操技巧和踩坑经验一次性说清楚。这篇内容适合谁看准备入行PLC的电气工程师、正在学编程语言的自动化专业学生、以及做非标设备调试想系统梳理编程方法的从业者。读完你至少能回答三个问题这五种语言到底在什么场合用它们之间能不能混着写选型时到底听厂家的还是听项目的2. 五种语言概览它们分别解决什么问题IEC 61131-3把PLC编程语言分成图形化语言和文本化语言两大类。图形化的是梯形图LD、功能块图FBD、顺序功能图SFC文本化的是结构化文本ST和指令表IL。这个分类不是随便分的图形化语言胜在直观适合电气背景的工程师文本化语言胜在灵活适合有计算机编程思维的人。下面我逐一拆解每种语言的核心定位。2.1 梯形图LD电气图纸的直接延伸梯形图是所有PLC语言里最接近传统继电器控制电路的一种。它左右两条母线中间是触点和线圈老电气工程师看着继电器图纸就能直接上手。它的核心逻辑就是“导通”和“断开”——左母线是电源条件满足电流流到右母线线圈得电。这种语言的优点非常明显直观、易懂、故障排查快。车间老师傅不懂ST代码但你给他一张梯形图他能顺着每个触点很快找到问题在哪。不过梯形图也有它的局限性。处理模拟量运算、PID调节、复杂数学公式时梯形图写起来非常痛苦。你见过有人用梯形图去算一个三角函数或者解析一串字符串吗那画面太美我不敢看。所以在实际项目中梯形图主要用于开关量逻辑控制比如电机启停、互锁、顺序启动这些典型的PLC应用场景。实用建议初学者一定从梯形图入门它能帮你建立“扫描周期”、“常开常闭”、“自锁互锁”这些最底层的概念。但别沉迷其中它只是起点。2.2 功能块图FBD像搭积木一样组逻辑功能块图的核心思想是把逻辑封装成一个一个的块输入输出用连线表示。每一个功能块就像一个小封装——加法块、比较块、定时器块、PID块你要做的就是连线。这种语言在过程控制领域用得极多因为它和仪表控制图PID的表达习惯非常契合。FBD的优势在于结构化。一个复杂系统的控制逻辑用梯形图可能要几十行用FBD可以把功能分区画清楚读起来一目了然。尤其是PID回路、模拟量处理、阀门控制这一类的应用FBD的先天优势非常明显——它天生是把信号流和数据流具象化的语言。不过它的缺点也很实际画大项目时连线容易乱而且层的画面大小有限一旦块多了工具图的画面管理就很吃力。实操中我习惯把FBD用在模拟量处理和小型过程控制配合自定义功能块复用率很高。比如温度采集、压力转换、流量累计这些封装成一个FB不同工位直接拖出来用。2.3 顺序功能图SFC天生为流程控制而生SFC是用步Step和转换Transition来描述系统运行流程的。你想象一个生产线的流程上料——夹紧——加工——松开——下料每一步有对应的动作每两个步之间有一个转换条件。这种描述方式天然贴合工艺流程特别适合周期性重复、带明确状态变化的生产设备。SFC最强大的地方在于它把复杂的连锁逻辑拆成了“步”的跳转跳转条件清楚当前程序运行到哪一步一眼就能看出来。这在调试多工位设备时简直就是神器——以前排查故障要翻几十页梯形图用SFC直接看高亮的步就知道在哪卡住了。但SFC也有难度它要求工程师对设备工艺流程理解非常透彻而且状态机思维要强。如果流程本身模糊SFC就会写得一塌糊涂。给个参考单机自动化的包装设备、装配设备、输送线控制SFC是非常优秀的选择。但纯模拟量调节为主的项目SFC发挥不出优势。2.4 结构化文本ST唯一的“高级语言”ST的语法和Pascal、C语言非常接近支持变量声明、IF/ELSE、FOR循环、CASE语句、函数调用。如果五种语言里要选一个“最强大脑”那一定是ST。它能把复杂的数学运算、数据处理、通信协议解析、算法逻辑写得简洁优雅。比如做视觉定位的坐标变换或者机械手的轨迹规划插补用梯形图去写能写到你怀疑人生用ST几十行代码就搞定了。ST的价值不仅仅在于写算法它还能让PLC程序的可读性和维护性大幅提升。程序逻辑再复杂ST的结构化表达也比满屏触点和线圈好维护。而且现在越来越多的PLC支持ST甚至有取代IL成为文本语言主流的趋势。你要是懂一点高级语言基础学ST基本上就是熟悉一下语法的事。但它也有门槛——如果你完全没接触过代码ST的变量类型、作用域、函数返回这些概念会让你头疼。我见过不少老电气工程师画梯形图很溜一碰ST就发怵。这很正常思维方式不一样。好在现在学习资源多花一阵子就能上手。2.5 指令表IL老古董但依然值得了解指令表是一种类似汇编语言的低层文本语言。它是从早期PLC的指令系统演变来的格式是“操作符操作数”比如LD %I0.1、AND %I0.2、OUT %Q0.0。很多人觉得IL已经是上个时代的东西了不值得学。这话有道理但不完全对。在一些老设备维护项目里你打开程序发现全是IL写的接不接手、看不看得懂直接决定你项目的难度。另外IL是理解PLC工作原理最直接的语言——它没有图形化语言的“包装”每条指令怎么执行、操作数怎么寻址一目了然。我可以负责任地说IL的实用性在下降但学习IL对深入理解PLC运行机制非常有帮助。现在IEC 61131-3第三版里IL已经降级为可选语言很多现代PLC软件默认不支持IL了。所以学IL的心态是“懂原理不依赖”真要写复杂逻辑还是用ST。3. 实操选型真实项目里怎么组合这五种语言很多新人会问“我学哪种语言就够了”答案是单用任何一种都不够。实际工程项目里五种语言经常混着用。这就是IEC 61131-3一个很重要的设计思想——编程模型允许在同一个程序组织单元里使用不同语言。下面我讲讲真实项目中的搭配思路。3.1 主程序用哪种语言看项目主旋律我拿到一个新项目会先问自己三个问题主要控制对象是开关量还是模拟量工艺流程有没有明显的步骤状态数据处理复杂度高不高这三问基本能定下主编程语言的方向。如果是配电柜、MCC控制柜、水泵启停这类以电机控制为主的项目主程序用梯形图因为电气维护人员最熟悉这种表达方式交接方便。如果是温度、压力、流量闭环控制为主比如加热炉、恒压供水那主程序用FBD把PID、模拟量处理这些功能块连起来逻辑清晰。如果设备有明确的工作节拍和工序流程比如注塑机、压装机、多工位转盘SFC做主框架各步的动作细节用梯形图或ST填充。如果涉及大量数据运算、坐标变换、通信报文解析ST当主力梯形图干体力活。这里强调一下很多人对SFC有误解觉得它是用来替代梯形图的。其实SFC最适合做“骨架”梯形图和FBD是“血肉”。我在做多工位装配线时主逻辑用SFC描述各工位的顺序流转每个工位内部的逻辑还是在“步”里用梯形图写这样整个程序既有流程的宏观视野又有逻辑的微观细节。3.2 不同品牌的实现差异别拿一个标准套所有PLC虽然大家都说自己支持IEC 61131-3但不同PLC品牌对五种语言的支持程度和实现风格差异不小。西门子的TIA Portal基本全支持而且ST的语法表现很接近高级语言博途里S7-Graph就是图形化的SFC实现非常好用。三菱GX Works3也开始支持ST、FBD但三菱的强项还是梯形图其结构化编程体验相比西门子还是有点差距。汇川、信捷这些国产PLC这几年走得很快InoProShop就支持完整的IEC语言基本逻辑就是围绕IEC 61131-3做的代码复用率很高这也是国产PLC进步的一个缩影。所以学编程不能只学一套软件的操作要理解IEC逻辑本身。你今天用惯了三菱的梯形图明天跳到西门子S7-1500只要IEC思维在元素的摆放方式、指令的调用方式虽然不同底层逻辑是通的。3.3 程序结构怎么分程序组织单元POU与功能块说到混用语言就绕不开IEC 61131-3里的另一个核心概念——程序组织单元Program Organization Unit, POU。它又分三种函数Function、功能块Function Block、程序Program。函数没有内部状态一样的输入得到一样的输出适合写数学运算功能块有记忆功能每次调用会保持内部变量状态适合封装定时器、计数器、PID这类需要“记住”上一次结果的处理逻辑程序就是PLC主循环里的顶层执行单元。我做个简单类比函数就像你口袋里的计算器按一次给一次结果功能块就像有记忆的机器人他记得上次走到哪里、上次数到多少能基于历史状态继续干活程序就像车间主任负责调度人、机器、任务。具体到工程实现时我们把每个工位定义为一个功能块内部用ST或者FBD写具体算法然后在主程序里调用。这样程序组织的结构非常清晰调试时直接监控某一个FB的输入输出效率特别高。4. 深入细节五种语言的核心语法与隐藏技巧前面讲的都是整体思维现在深入到每种语言的具体写法拿典型例子展示实际代码和逻辑实现。这部分是纯干货我会把每种语言的关键语法、编程习惯、容易出错的地方全部点透。4.1 梯形图的深层操作不只是画线圈很多教程教你画电机启停画完自锁互锁就没了。梯形图的功力其实体现在扫描顺序的理解上。PLC是循环扫描的扫描周期内梯形图按从上到下、从左到右的方式执行。这带来一个隐藏的问题——相同输出线圈不能被重复赋值否则后者覆盖前者。这就是常见的Double Coil问题。举个例子设备报警输出Q0.0你在梯形图第一段让它输出又在第三十段再次输出结果两个条件任何一个成立都会触发报警且状态不是你预期的。这在调试现场非常糟心——报警莫名其妙。所以好的习惯是一个物理线圈在程序里只出现一次其他逻辑用中间变量M来承接。还有两个梯形图高频技巧一是电机启动采用“启动优先”逻辑即停止条件用常闭触点串联二是急停用外部硬继电器接常闭点不依赖PLC内部程序这条涉及安全回路不懂的人最容易犯必须靠硬件兜底。再有多设备连锁时建议把“安全联锁”做成一个全局标志位任何一台设备故障置位故障标志启动允许条件必须检查该标志位。这个思路哪怕用梯形图写也能把程序维护成本降到最低。4.2 FBD的结构化复用从画图到“搭系统”FBD要说细核心还是功能块的封装和复用。你写一个电机控制FB输入是启停按钮、故障信号、允许条件输出是接触器线圈、故障输出、运行状态标志。然后项目里所有电机控制都调用这个FB不仅程序代码量大幅下降而且修改控制逻辑只需要改一个FB所有实例同步更新这个就是“复用”的魔力。FBD的连线也需要讲究技巧。原则是数据流从左向右控制流从上到下模拟量信号和开关量信号分开区域布线。连线别交叉实在有交叉的地方用跳线符号或网络标签。还有一个小技巧FBD里每个功能块都要设置合理的“使能端EN”在条件不满足时让功能块输出保持或者清零这个处理在PID、累计器这类易受扫描周期影响的功能块中特别关键。FBD若要做稍微复杂一点的模式切换用“MUX”功能块做多路选择非常高效比如“手动/自动”切换把两套给定值作为输入一个布尔变量选择输出哪一套——比用梯形图做切换的代码量少一半。4.3 SFC的步进控制要点别把SFC写成梯形图SFC最关键的要素是步、转换条件和动作。一个步有两个状态活动和不活动。当活动步的所有动作执行完毕且下一步的转换条件满足时状态就跳到下一步。SFC编程有三个容易翻车的点。第一个是初始步设备上电必须有一个初始化动作别忘了初始化输出状态和让机械回到原点否则第一刀就可能撞机。第二个是超时保护设备在某个工位卡住了机械手没到位程序死等转换条件如果没做超时报警操作员根本不知道设备停在哪个环节。第三个是步的互斥性SFC要求任意时刻只有一个活动步除非用并行分支不然逻辑就崩了。SFC上手后你会发现它最舒服的场景是“整个动作序列一目了然”。设备停了看一眼当前活动步就知道它在等什么条件调试和售后的沟通成本大幅下降。4.4 结构化文本的实用写法ST里的工程陷阱这里给出一段ST代码示例展示模拟量处理和报警判断的写法IF bManualMode THEN rSetpoint : rManualSetpoint; ELSE rSetpoint : rAutoSetpoint; END_IF; rError : rFeedback - rSetpoint; IF ABS(rError) 10.0 THEN bDeviationAlarm : TRUE; ELSE bDeviationAlarm : FALSE; END_IF; IF rPV rHighLimit OR rPV rLowLimit THEN bProcessAlarm : TRUE; END_IFST要写得安全有几个硬规矩。第一变量命名要规范可读用匈牙利命名法和功能前缀混搭比如rFeedback表示浮点反馈bManualMode表示手动模式布尔量一眼看去就知道这个变量是什么。第二除法运算前必须检查除数不为零PLC和计算机一样除零直接导致运行时错误。第三ST里的CASE语句很好用但如果变量类型是浮点数就尽量不要CASE浮点比较误差很大要用区间范围做判断。第四循环语句谨慎用扫描周期不允许长时间阻塞如果要做大数据量的数组处理确保循环次数可控别把扫描周期拉到上百毫秒不然运动控制的高响应就没了。我自己的经验是ST特别适合做通信协议解析。不管是Modbus报文、自由协议数据帧解析就按字节来切数组和FOR循环一配合解析逻辑极其清晰。梯形图做这个我能写哭。4.5 IL的实用价值定位IL的实际工程场景确实越来越少但这不代表你完全用不到。在做老设备升级维护时打开别人十年前写的IL程序你得能看懂它在干嘛。IL是中间层语言留下一些IL代码反而能最快弄懂老程序的动作逻辑。另外IL很小巧精炼在一些微小型PLC和运动控制器里还有存在学好IL不亏。关键是把操作符搞清楚LD(装载)、AND(与)、OR(或)、OUT(输出)、SET/RST(置位/复位)、CMP(比较)、JMP(跳转)。这几种熟练掌握看一般IL代码没压力。5. 项目实战视角从“翻译需求”到“选型落地”光学会语法还不够工程项目的核心是把“工艺需求”翻译成“程序逻辑”。这个翻译能力恰恰是最难教的。这里我结合自己做非标设备的经验走一个完整的项目思路。5.1 从设备动作要求到程序架构设计接到一个设备需求比如一条小型装配线自动上料、定位、锁螺丝、检测、下料各工位独立又需要联动。我的第一件事不是写代码是先做控制流程图。把设备有哪些传感器输入光电开关、接近开关、编码器、哪些执行输出气缸阀岛、伺服电机、报警灯、哪些工艺参数速度设定、扭矩设定全部列出来做成一张I/O表这是整个程序的地基。I/O表错了后面全白干。然后确定程序结构。这种多工位自动线我倾向主框架用SFC每个工位一个时序步每个工位内部再写一个功能块用ST处理位置、扭矩这些数值数据。这样的好处是电气调试、售后维护、机构工程师核对动作流程的时候都很舒服。5.2 编程实操步骤记录多工位装配线的逻辑实现片段下面用一个简化版的关键步展示代码思想。假设2号工位是锁螺丝工位流程包括夹紧工件、伺服下压、电动螺丝刀拧紧、等待扭矩达到、抬起、松开工件。SFC里面大概是这样一个流程那我用ST来写其中一个功能块的核心逻辑(* 锁螺丝工位核心逻辑 *) IF step 2 AND bClampDone THEN bServoPress : TRUE; IF rTorque rTorqueSetpoint THEN bScrewDone : TRUE; bServoPress : FALSE; step : 10; (* 转到松开步 *) END_IF; END_IF这段例子最关键的是“扭矩达到”的判断不单是数字对比。实际工况下扭矩会有波动还经常出现“卡死——扭矩上升但角度不动”的异常情况。所以只判断扭矩是不够的还要加一个角度增量超时判断。这里就能看到ST的优势把两个判断条件同时在一个IF里处理清晰高效。梯形图也能做但代码会啰嗦不少。5.3 手动模式、自动模式、报警逻辑怎么设计程序不只是自动跑手动模式同样重要尤其是设备调试初期手动能帮你把每一根线、每一个动作都验一遍。我的习惯是做一个总的手动/自动切换开关手动模式下所有自动动作全部禁止执行器由面板按钮直接控制自动模式下程序按工艺顺序执行。这个互锁必须做得非常严密不然机器人或者气缸在手动操作时误动作伤人这是非常严重的安全风险。报警逻辑建议独立编写一个报警功能块。把所有报警按类型分组工艺报警扭矩不足、定位偏差、设备报警气缸到位超时、伺服报警、通信报警上位机失去连接。报警至少要有触发条件、保持/自锁、复位方式按键复位、条件复位。用ST写报警逻辑最好数据可以用数组和结构体统一管理HMI显示也方便。6. 避坑指南五年项目里踩过的典型坑这部分是纯经验分享每一种坑我都真实遇到过写出来供大家参考。6.1 环境与调试的坑最经典的一个坑就是PLC与模拟屏不兼容的问题比如某品牌PLC和某品牌HMI通信不上。一查发现是通信协议不一致常见的是Modbus RTU和Modbus TCP混用或者波特率、数据位、校验位设置不对。还有一个频率很高的坑是接线及端口设置——比如InoProShop在连接PLC时需要设置正确的通信端口很多人默认设置不对就狂报错其实是端口号、网络ID没配对。排查思路我建议按这个顺序先查通信物理链路网线/串口线再查配置文件里的端口号和网络ID然后查PLC侧是否把该端口开放最后查HMI侧是否建了相同的通信变量标签。大多数情况是参数没对上不是硬件坏了。还有一次项目里博途PLC与模拟屏不兼容设备老是断连。查了半天发现是PLC侧通信负载过高因为模拟屏在疯狂地读变量而PLC又在同时做高速脉冲轴控制。最后我做了两件事降低HMI的刷新频率把非关键变量的刷新率降到500毫秒一次把通信报文做了划分重变量走专用通道。问题就解决了。6.2 语言选择与程序维护的坑我见过最惨的一个项目程序是用梯形图写了几万个网络一个设备逻辑穿插在几十个网络里添加一个功能要翻上百页程序。这就是典型的“语言选型失误”——开关量逻辑确实梯形图直观但复杂联动逻辑和状态管理必须用结构化语言来组织。所以我的原则是超过三个工位的联动机器人工作站不建议无脑用梯形图铺开写超过一个矩阵运算或坐标变换不建议用非ST语言硬扛。程序可维护性是工程项目的生命线设备运行三年后谁维护谁说了算。项目交付时我会附一份程序结构说明文档把POU结构、变量表、各FB的功能边界写清楚方便后任维护工程师快速接手。6.3 跟项目周期与PLC选型语言功能相关的一些话现在国产PLC和中高端PLC的界限越来越模糊。汇川、信捷的编程软件都是IEC 61131-3体系ST、FBD、梯形图混合编程都很成熟。所以在PLC选型时语言支持能力也是重要指标。如果项目有大量数学运算和视觉通信需求尽量选择对ST支持更好的品牌和型号。如果你是自动化毕业的学生想选一门值得深耕的编程语言ST的通用性和延展性确实最强——学会ST你的思维方式可以直接过渡到高级语言。7. 网上的常见提问速查与我实际经验对照下面整理几个网友高频问题我和大家交流一下实际经验。问三菱PLC用ST编程到底值不值得学我的体会是值得。虽然三菱的梯形图生态很强但GX Works3对ST的支持已经很好了数学运算和数据处理明显比梯形图省力。尤其做毕业设计或竞赛项目ST能显著提升开发效率。问西门子博途到底用结构化文本还是梯形图我的建议是看程序类型。逻辑控制为主用梯形图数学处理和通信为主用ST流程动作用S7-Graph也就是SFC图形化实现。不要迷信最强大要匹配最合适。问PLC编程入门基础知识最重要是哪块我认为是“扫描周期”和“I/O寻址”这两个概念。不管用什么语言不理解扫描周期你写的时序逻辑一定是错的。先搞懂这两个基础再谈语言细节。问温度PID波动温差大如何调节这个问题项目里经常被问。我的建议是先抛开语言检查参数PID的采样周期、比例增益、积分时间是否匹配被控对象的惯性。温度对象大惯性P值不能太大积分时间不能太短必要时加微分抑制超调。ST写PID参数自整定逻辑会方便很多。8. 学习路径建议从入门到混编高手的路线如果你是从零开始学PLC编程我建议按下面的顺序走基本不会走弯路第一步用梯形图建立基础。从电机的星三角降压启停开始学会常开、常闭、线圈、定时器、计数器、置位复位。这个阶段的目标是懂逻辑、懂扫描、懂I/O映射。第二步玩FBD搭建模拟量系统。做一两个恒压供水或者温度控制学会模拟量采集标定、PID闭环、上下限报警处理。第三步用ST处理算法数据。做一些坐标计算、数据排序、通信报文解析的小程序彻底落一次ST的代码手感。第四步用SFC整合项目。自己搭一个多工位时序流程的项目把前面学的所有功能细化装进去体会“骨架”和“血肉”如何协调配合。第五步回头看标准和原理。回头认真读IEC 61131-3里程序组织单元、变量类型、执行控制的相关定义你会发现很多应用层疑问迎刃而解。每一步都配实际的上手操作不要只看视频不敲指令。编程能力是用手练出来的不是看出来的。9. 我在实际项目里的几点体会做PLC编程这一行回头再看IEC 61131-3这五种语言最大的体会是它们不是五种对手而是一套组合拳。单用一种语言的人就像工具箱里只有一把锤子什么零件都敢砸一砸但活干得糙。真正熟练的工程师会根据场景随时换工具——开关量逻辑顺手就画梯形图模拟量PID拉两个功能块连起来复杂算法开个ST页面敲代码流程顺序就用SFC做主轴结构。有几次项目我故意把同一个功能用两种语言实现比如同样一个保压逻辑第一版用梯形图第二版用ST。对比下来ST是更适合表达复杂工艺参数的梯形图是更适合车间电工直观理解的。这个事让我印象特别深——你选语言不光是选工具还是在选“这程序以后谁来接手维护”。设身处地为后面的维护工程师着想选用的语言就会更克制、更有体系。最后再分享一个小技巧写大型PLC程序一定给每个POU加上版本号和修改注释。哪怕是你自己过了半年回头看你写的程序没有注释也会头皮发麻。这个习惯用一句俗话说就是“今天的注释是明天的救命稻草”。