资讯详情

IEC 61131-3编程实战:五种PLC语言选型与避坑指南

📅 2026/10/24 12:00:22 | 华诺云谱 👁 阅读
IEC 61131-3编程实战:五种PLC语言选型与避坑指南
1. 从继电器柜到软PLC为什么今天还要啃IEC 61131干了十几年工控我越来越觉得IEC 61131这个标准像一本老黄历——刚入行的人觉得它过时老手却把它当字典翻。但现实是不管你用的是哪家的PLC只要打开编程软件那些LD、FBD、ST、SFC的选项全都是从这个标准里长出来的。你可以不背标准号但你绕不开它定义的这套语言体系。IEC 61131是国际电工委员会给可编程控制器定的通用语法书一共分了十个部分从概述、硬件要求、编程语言、用户指南到通信、模糊控制、安全基本把PLC从里到外管了个遍。其中跟我们日常写程序关系最紧的是第三部分——编程语言。它规定了五种语言梯形图LD、功能块图FBD、顺序功能图SFC、指令表IL和结构化文本ST。前四种偏图形化ST偏高级语言IL现在基本被淘汰了新标准里已经把它边缘化。这套标准解决的核心问题就一个让不同品牌的PLC程序能互相看懂、互相移植。以前A家的梯形图和B家的梯形图符号不一样工程师换个品牌就得重新学一遍项目交接更是灾难。标准统一之后你只要懂LD的扫描逻辑换到另一家平台无非是快捷键和界面不同底层思维是通的。这篇文章适合谁看如果你是刚转行做PLC的电气工程师或者从单片机、嵌入式转过来的开发者又或者是自动化专业的学生那这篇内容能帮你把会用软件和懂原理之间的那道墙拆掉。我不打算照本宣科讲标准条文而是把标准里的关键点拆开结合我实际做项目踩过的坑告诉你哪些地方必须较真哪些地方可以灵活处理。2. 五种编程语言到底怎么选别再用梯形图硬写所有逻辑2.1 梯形图LD不是画电路图是在描述扫描周期很多人第一次接触梯形图以为就是把继电器电路搬到屏幕上。这个理解对了一半但漏掉了最关键的一点PLC是循环扫描的梯形图的能流不是同时流动的而是从左到右、从上到下逐行计算的。我见过太多新手写出这样的逻辑一个按钮同时触发两个输出结果第二个输出偶尔不动作。原因就是他把梯形图当成了并行电路实际上PLC在每个扫描周期里先算第一行更新了内部状态再算第二行。如果第二行依赖的状态在第一行被改变了结果就跟预期不一样。梯形图的优势在于布尔逻辑直观处理开关量、互锁、联锁这类逻辑特别顺手。但它不适合做复杂运算、循环、字符串处理。我个人的经验是纯开关量逻辑用LD超过三层的条件嵌套就考虑换ST。2.2 功能块图FBD搞过程控制的人更爱它FBD用方框和连线表示逻辑看起来像数字电路图。它在欧洲和过程控制领域用得比较多尤其是模拟量处理、PID控制、滤波算法这些场景。一个PID功能块输入输出引脚一接参数一填比用LD搭一堆加减乘除清爽得多。但FBD的坑在于连线容易乱。项目一大功能块之间的连线像蜘蛛网排查问题的时候得顺着线一根根找。我的做法是按功能分区每个区不超过两屏跨区信号用标签变量中转别让线直接飞过去。2.3 顺序功能图SFC设备动作流程的剧本SFC是五种语言里最被低估的。它把设备动作拆成步和转换条件特别适合描述有明确先后顺序的流程比如一台包装机的上料、压合、保压、开模、取件。我做过一个多工位转盘设备一开始用LD写几百行逻辑缠在一起改一个动作要翻半天。后来改用SFC重写每个工位一个步序转换条件写在步与步之间逻辑一目了然。调试的时候直接看当前停在哪个步问题定位快了一倍。注意SFC不是所有PLC都完整支持选型前要确认目标平台对SFC的支持程度。有些小型PLC只支持LD和STSFC是阉割版。2.4 结构化文本ST复杂运算和算法的唯一出路ST长得像Pascal有IF、CASE、FOR、WHILE这些结构。凡是涉及数组操作、配方管理、通信协议解析、复杂数学运算的我都用ST写。用LD写一个冒泡排序试试能写但维护的人会想打人。ST的难点不在语法而在扫描周期意识。新手容易写出一个FOR循环跑几千次结果扫描周期从5ms飙到200ms设备直接报警。我的原则是ST里不做耗时操作大循环拆成状态机每个周期只处理一小部分。2.5 指令表IL知道它存在就行IL是低级语言类似汇编可读性差新标准已经不再主推。除非你维护的是十几年前的老设备否则没必要专门学。看到老程序里的IL能看懂大概意思就够了。语言最适合场景学习难度我的使用频率LD开关量逻辑、互锁低高FBD模拟量、PID、滤波中中SFC流程控制、步序中中ST运算、算法、通信中高高IL老设备维护高极低3. 变量、数据类型与任务标准里最容易被跳过的硬骨头3.1 变量命名不是小事它决定了程序能不能交接IEC 61131把变量分成了几类全局变量、局部变量、输入输出变量、临时变量。标准里对命名没有强制规定但实际项目里命名混乱是维护成本的最大来源。我接手过一个项目变量名叫M1、M2、M3一直到M200多没有任何注释。花了整整两天才理清楚哪个M对应哪个气缸。后来我给自己定了规矩变量名必须包含设备位号功能类型比如CV01_Cylinder_Extend_Cmd一看就知道是1号气缸伸出命令。标准里还定义了变量的作用域。全局变量在整个程序里都能读写方便但危险局部变量只在当前POU程序组织单元里有效安全但需要传递。我的经验是能用局部就不用全局必须共享的状态才放全局并且集中管理。3.2 数据类型选错精度和性能都遭殃IEC 61131定义了一套标准数据类型BOOL、BYTE、WORD、DWORD、INT、DINT、REAL、TIME、STRING等等。看起来简单但选型有讲究。举个实际例子一个温度值范围是0到200摄氏度保留一位小数。如果你用INT存只能存整数小数丢了用REAL存精度够了但占4个字节运算慢更好的做法是用INT存放大10倍的值比如205代表20.5度显示的时候再除10。这样既保精度又省资源。再比如计数器很多人不管三七二十一就用INT。但如果计数可能超过32767INT就溢出了得用DINT。我踩过一次坑一个包装计数用INT跑到三万多次的时候突然变成负数查了半天才发现是溢出。数据类型位数范围典型用途BOOL10/1开关量、标志位INT16-32768~32767中小计数、模拟量原始值DINT32±21亿大计数、累计量REAL32浮点温度、压力、PIDTIME32时间延时、超时判断STRING可变字符串配方名、通信报文3.3 任务配置程序不是从头跑到尾的这是很多新手完全忽略的部分。IEC 61131里程序不是一条直线跑到底而是按任务来调度的。任务分周期任务和事件任务。周期任务每隔固定时间执行一次事件任务由特定条件触发。为什么这个重要因为不同逻辑对执行频率的要求不一样。急停逻辑要求最快响应可能1ms跑一次温度PID控制10ms跑一次就够了数据记录1s跑一次都嫌快。如果全塞在一个任务里要么快的被拖慢要么慢的白占CPU。我通常这样分配高速任务1~5ms放安全逻辑和位置控制中速任务10~20ms放PID和逻辑联锁低速任务100ms~1s放数据记录和通信。这样CPU负载均衡响应也及时。4. 从零写一个电机星三角启动程序五种语言实战对比4.1 需求拆解与IO分配拿一个最经典的案例三相异步电机星三角降压启动。控制要求是按下启动按钮主接触器和星接触器先吸合延时5秒后星接触器断开、角接触器吸合电机进入正常运行。按下停止按钮所有接触器断开。热继电器动作时立即停机并报警。IO分配如下输入启动按钮I0.0、停止按钮I0.1、热继电器I0.2输出主接触器Q0.0、星接触器Q0.1、角接触器Q0.2、报警Q0.3内部变量启动延时T1、星角切换互锁标志4.2 梯形图实现与扫描逻辑分析梯形图写法大家都会但我要强调的是互锁。星接触器和角接触器绝对不能同时吸合否则电源短路。所以Q0.1和Q0.2的线圈前面必须互相串对方的常闭触点。另外星角切换的延时用TON功能块。TON的输入IN从0变1开始计时计时到设定值后Q输出1。注意TON在IN保持为1时Q一直为1IN变0后Q立即变0当前时间清零。这个特性决定了你不能用TON的Q去直接驱动角接触器得用它的Q去复位星接触器、置位角接触器。我见过有人用TON的Q直接接角接触器线圈结果星接触器不断开两个同时吸合砰一声。这就是没理解TON输出特性的后果。4.3 用ST重写核心逻辑同样的逻辑用ST写代码更紧凑IF I0.2 THEN Q0.0 : FALSE; Q0.1 : FALSE; Q0.2 : FALSE; Q0.3 : TRUE; ELSIF I0.0 AND NOT I0.1 THEN Q0.0 : TRUE; IF NOT T1.Q THEN Q0.1 : TRUE; Q0.2 : FALSE; ELSE Q0.1 : FALSE; Q0.2 : TRUE; END_IF; ELSIF I0.1 THEN Q0.0 : FALSE; Q0.1 : FALSE; Q0.2 : FALSE; Q0.3 : FALSE; END_IF; T1(IN : Q0.0 AND Q0.1, PT : T#5S);这段ST里T1的调用放在最后保证每个周期都更新。注意T#5S是IEC标准的时间字面量写法比某些平台用5000毫秒更规范。4.4 SFC描述步序更清晰如果用SFC整个流程就是初始步→按启动→星启动步→延时5秒→角运行步→按停止→回初始步。每个步里写该步的输出转换条件写在步之间。调试的时候直接看当前激活的是哪个步比翻梯形图快得多。4.5 三种写法的取舍这个案例简单三种写法都能实现。但我的建议是逻辑简单用LD流程清晰用SFC运算复杂用ST。不要为了炫技硬用某一种工具是拿来解决问题的不是拿来表演的。5. 调试与排错那些标准不会告诉你的实战经验5.1 扫描周期引起的幽灵故障有个项目设备偶尔会漏动作一天出现一两次怎么查都查不出来。后来用示波器抓PLC的扫描周期发现偶尔会从8ms跳到50ms。原因是程序里有个ST的FOR循环循环次数取决于一个外部变量外部变量偶尔会变成很大的值循环跑了几万次。排查思路先看扫描周期是否稳定再看有没有条件循环、大数组操作、通信阻塞。标准里不会告诉你这些但实际项目里这是最常见的性能陷阱。5.2 变量未初始化导致的随机行为IEC 61131规定变量有初始值BOOL默认FALSEINT默认0。但有些平台的临时变量不初始化值是不确定的。我遇到过一次一个临时变量没赋值就参与运算结果每次上电行为都不一样。避坑方法所有变量声明时显式赋初值临时变量在使用前必须赋值。别依赖平台的默认行为。5.3 浮点数比较的坑REAL类型比较不能用因为浮点运算有精度误差。0.10.2不等于0.3这在PLC里同样成立。正确做法是判断差值绝对值小于一个很小的数比如ABS(A-B) 0.001。5.4 常见问题速查表现象可能原因排查方向输出偶尔不动作扫描周期波动检查循环、通信阻塞上电行为不一致变量未初始化检查临时变量和保持变量模拟量跳动大滤波不足或干扰加滤波、检查屏蔽接地通信断断续续任务优先级冲突调整通信任务周期计数器突然变负数据类型溢出换DINT或加溢出判断6. 标准之外的工程习惯让程序能被人看懂IEC 61131管的是语法和结构但管不了你的程序好不好维护。我做了这么多年总结了几条标准里不写但必须遵守的规矩。第一每个POU只做一件事。一个功能块里又做逻辑又做运算又做通信出了问题根本没法定位。拆开每个块职责单一。第二注释写为什么不写是什么。Q0.0 : TRUE; // 启动主接触器这种注释没意义代码本身就说明了。要写的是// 这里延时5秒是因为星角切换需要等电机转速降下来解释设计意图。第三版本管理。PLC程序也要进版本库每次修改记录改了什么、为什么改。我见过太多项目程序改了十几版最后不知道哪版是现场在用的。第四仿真先行。现在主流平台都支持仿真逻辑先在电脑上跑通再去现场调试。现场调试时间宝贵别把仿真能解决的问题带到现场。第五留调试接口。程序里预留一些强制变量、模拟量手动输入、步序跳转的接口调试的时候能省大量时间。正式运行时把这些接口屏蔽掉就行。这些习惯跟IEC 61131标准本身没关系但它们决定了你的程序是能跑还是好用。标准给你语法工程习惯给你质量。两样都有才算是真正入了PLC这行的门。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑