资讯动态

IEC61131-3编程实战:五种语言选型、数据类型与POU封装指南

发布时间:2026/10/24 11:15:09 来源:尧图企业网站定制
1. 工控圈绕不开的IEC61131它到底在管什么刚入行做PLC编程那会儿我最怕听到的一句话就是“你这个程序不符合IEC61131规范”。当时心里想的是程序能跑不就行了管它什么规范不规范。后来踩的坑多了才明白这套标准不是拿来卡人的而是让不同品牌、不同型号的控制器之间有了一个共同的“语言基础”。你可以把它理解成工控领域的普通话——各家PLC厂商就像不同地方的方言区IEC61131就是那个让大家都听得懂的通用语。IEC61131是国际电工委员会专门为可编程控制器制定的一套标准总共分为八个部分从总览、硬件要求、编程语言、用户指南一直到通信规范都有覆盖。但真正跟咱们日常编程打交道最多的是它的第三部分——编程语言标准。这部分定义了五种编程语言分别是梯形图LD、功能块图FBD、顺序功能图SFC、指令表IL和结构化文本ST。很多刚接触PLC的朋友可能只用过梯形图觉得其他几种离自己很远但实际上越往后做越复杂的项目你会发现光靠梯形图真的不够用。这套标准解决的核心问题是什么说白了就是可移植性和可维护性。没有这套标准之前你在这个品牌的PLC上写的程序换到另一个品牌基本上等于重写。有了这套标准之后至少编程的思路、数据类型的定义、程序结构的组织方式有了统一的参考框架。当然现实中各家厂商还是会加自己的“私货”但大框架是趋同的。对于工程师个人来说掌握IEC61131的知识意味着你不会被某一个品牌绑死换一个平台也能快速上手。这篇文章适合谁看如果你是刚入行的PLC编程新手它能帮你建立一个完整的知识框架知道自己在学的东西处于整个体系的哪个位置。如果你已经做了几年项目但一直停留在梯形图阶段那这篇文章能帮你打开思路看看ST语言和SFC能怎么帮你解决复杂逻辑问题。如果你是从IT领域转过来的那更好你会发现IEC61131的很多设计理念跟你熟悉的编程范式有相通之处。2. 五种编程语言怎么选不是哪个高级就用哪个2.1 梯形图LD电气工程师的老朋友梯形图是从继电器控制电路图演变过来的它的最大优势是直观。对于做电气出身的工程师来说看梯形图几乎零门槛因为那些常开触点、常闭触点、线圈的符号跟继电器电路图几乎一模一样。我见过很多做了十几年的老师傅你让他写ST语言他浑身难受但给他一个梯形图他三下五除二就能把逻辑理清楚。梯形图适合什么场景离散逻辑控制是它最擅长的领域。比如一个简单的启保停电路、电机的正反转控制、气缸的伸缩顺序控制用梯形图写起来又快又清晰。调试的时候也方便在线监控能看到每个触点的通断状态哪一步没走通一眼就能看出来。但梯形图也有明显的短板。当逻辑变得复杂涉及大量数据处理、数学运算、字符串操作的时候梯形图就会变得非常臃肿。我见过一个项目用梯形图做PID参数的自整定计算整整写了三十多个网络段看着就头疼后来改成ST语言只用了不到二十行代码。所以梯形图不是万能的它有自己的舒适区。实操心得新手不要觉得梯形图“低级”恰恰相反能把梯形图写得规范、清晰、易维护本身就是一项硬功夫。我见过太多梯形图程序逻辑全堆在一起没有任何注释和分段换个人接手根本看不懂。2.2 结构化文本ST复杂运算的利器ST语言的语法跟Pascal和C比较接近如果你有高级语言的编程基础上手会非常快。它支持条件判断IF-THEN-ELSIF-ELSE、循环FOR、WHILE、REPEAT、数组操作、结构体定义基本上高级语言该有的它都有。ST最适合的场景是数学运算、数据处理、算法实现。比如你要做一个温度补偿算法需要根据多个传感器的读数进行加权计算用ST写起来就非常自然。再比如你要处理一个配方管理系统需要从数组里查找、排序、比较数据ST的效率比梯形图高出一个数量级。但ST也不是没有缺点。它的在线调试体验不如梯形图直观。梯形图你可以看到每个触点的实时状态ST语言虽然也能单步调试和变量监控但对于不熟悉编程的人来说理解起来门槛更高。另外ST的灵活性也意味着更容易写出“只有自己看得懂”的代码团队协作时需要更严格的编码规范。2.3 功能块图FBD信号流一目了然FBD用图形化的功能块来表示逻辑运算块与块之间用连线表示信号流向。它的思维方式跟数字电路非常像如果你学过数字逻辑电路看FBD会觉得特别亲切。FBD最擅长的场景是过程控制和信号处理。比如模拟量信号的滤波、标定、报警判断用FBD搭起来非常清晰。一个AI模块的信号进来经过几个功能块的处理最后输出到AO模块整个信号链路一目了然。在DCS系统中FBD是绝对的主力语言。FBD的局限性在于当逻辑分支特别多的时候连线会变得非常复杂像蜘蛛网一样。而且FBD不太适合表达顺序逻辑你要用它来做步进控制会觉得很别扭。2.4 顺序功能图SFC步进控制的标准化表达SFC是专门为顺序控制设计的语言。它把一个控制过程分解成若干个“步”Step每个步代表一个稳定的状态步与步之间通过“转换条件”Transition来切换。这种思维方式跟实际的生产流程非常吻合。举个例子一个自动灌装机的流程是等待瓶子到位→开始灌装→灌装完成→移走瓶子→等待下一个瓶子。用SFC来表达每个步骤就是一个步转换条件就是传感器信号。整个程序结构跟工艺流程图几乎一一对应操作工看了都能理解。SFC最大的价值在于结构清晰。当你的设备有十几个甚至几十个工位每个工位又有多个动作顺序的时候用SFC可以把整个流程拆解得非常清楚。而且SFC天然支持并行分支和选择分支可以处理复杂的流程逻辑。但SFC也有一个坑步的激活和去激活逻辑需要仔细设计。如果转换条件写得不好可能会出现两个步同时激活的情况导致输出混乱。我踩过这个坑后来养成了一个习惯每个转换条件都加上前一步的激活状态作为互锁确保任何时刻只有一个步是激活的。2.5 指令表IL正在被淘汰但值得了解IL是一种类似于汇编语言的文本编程方式每一行是一条指令操作码加操作数。现在新出的PLC编程软件里IL的支持越来越少了很多已经不再提供IL编辑器。但了解IL有助于理解PLC的底层执行逻辑而且一些老设备上还在用IL程序维护的时候需要能看懂。2.6 语言选择速查表语言最适合场景学习难度调试便利性可维护性LD梯形图离散逻辑、联锁控制低高中ST结构化文本运算、数据处理、算法中中高FBD功能块图过程控制、信号处理低高中SFC顺序功能图步进控制、流程控制中中高IL指令表底层逻辑、老设备维护高低低实际项目中很少只用一种语言。混合编程才是常态。我通常的做法是整体程序框架用SFC搭每个步里面具体的逻辑用LD或ST实现模拟量处理用FBD复杂运算用ST。这样各取所长程序结构清晰维护也方便。3. 数据类型与变量程序的地基3.1 IEC61131定义的标准数据类型IEC61131定义了一套标准的数据类型这是保证程序可移植性的基础。最常用的几类布尔型BOOL只有TRUE和FALSE两个值对应开关量信号。在梯形图里就是一个触点或线圈。整型包括SINT短整型8位、INT整型16位、DINT双整型32位、LINT长整型64位。选哪种取决于你的数值范围。比如一个计数器最大计到1000用INT就够了如果要计到10万以上就得用DINT。无符号整型USINT、UINT、UDINT、ULINT跟有符号整型的区别就是不能表示负数但正数范围更大。比如UINT的范围是0到65535而INT是-32768到32767。浮点型REAL32位和LREAL64位。REAL的精度大约是6到7位有效数字LREAL能到15到16位。做模拟量运算和PID控制的时候一般用REAL就够了除非对精度要求特别高。时间型TIME表示时间间隔TOD表示一天中的时刻DATE表示日期DT表示日期时间。这些类型在做定时控制和数据记录的时候非常有用。字符串型STRING和WSTRING。STRING是单字节字符WSTRING是宽字符支持中文等多字节字符。做HMI显示和配方管理的时候会用到。3.2 变量作用域全局变量和局部变量怎么选IEC61131把变量分为全局变量和局部变量。全局变量在整个程序中都能访问局部变量只在定义它的程序组织单元POU内部有效。新手最容易犯的错误就是滥用全局变量。觉得全局变量方便哪里都能用结果程序越写越乱改一个地方影响一大片。我的经验是能用局部变量就用局部变量全局变量只用来传递那些确实需要跨程序共享的数据比如设备状态、报警信息、配方参数。局部变量还有一个好处是可重入。如果你把一个功能块封装好里面的变量都是局部的那这个功能块可以在程序的不同地方同时调用互不干扰。这在做标准化程序库的时候特别重要。3.3 直接地址与符号地址直接地址就是直接写硬件的物理地址比如%IX0.0表示输入模块第0个字节的第0位%QW64表示输出模块的第64个字。符号地址就是给这个地址起个名字比如“StartButton”对应%IX0.0“MotorOutput”对应%QW64。我强烈建议全部使用符号地址。原因很简单可读性。你写%IX0.0过两个月自己都不记得这是什么信号。但你写StartButton一看就知道是启动按钮。而且如果硬件地址变了你只需要在变量表里改一处程序里所有引用这个变量的地方自动更新不用满程序去找。注意事项有些老旧的编程软件对符号地址的支持不好或者符号名长度有限制。这种情况下至少要在变量表里做好注释说明每个地址对应的物理信号。4. 程序组织单元POU把代码装进合适的盒子里4.1 功能FC、功能块FB和程序PRG的区别IEC61131定义了三种程序组织单元功能FunctionFC、功能块Function BlockFB和程序ProgramPRG。这三个概念新手很容易搞混我用一个生活化的类比来解释。功能FC就像一个纯数学函数。你给它输入参数它给你返回一个结果不保留任何内部状态。比如一个计算平均值的功能你传入五个数它返回平均值。下次再调用它不会记得上次算的是什么。FC适合做那些纯粹的运算和处理不需要记忆状态的场景。功能块FB就像一个带记忆的电子元件。你给它输入它给你输出但它会记住上一次的状态。比如一个定时器功能块你给它启动信号它开始计时时间到了输出一个信号。下次再调用同一个定时器它会从上次的状态继续。FB适合做那些需要保持状态的逻辑比如定时器、计数器、PID控制器、状态机。程序PRG是整个应用的顶层组织单元。一个项目里可以有多个PRG每个PRG对应一个任务。比如你可以有一个主程序PRG负责整体调度一个报警处理PRG负责报警逻辑一个通信PRG负责数据交换。4.2 功能块实例化为什么每个调用都要一个实例这是新手最容易踩的坑之一。功能块FB在使用之前必须先“实例化”也就是给它分配一块内存来保存它的内部状态。如果你在程序里调用了两次同一个FB但没有给它们分别分配实例那这两个调用会共享同一块内存互相干扰。我举个例子你写了一个电机控制FB里面有启动、停止、故障复位等逻辑内部有一个定时器用来做启动超时检测。如果你在程序里用这个FB控制两台电机但只实例化了一次那两台电机的定时器会互相影响一台电机启动的时候另一台电机的定时器也会被触发。这种bug非常隐蔽调试的时候很难发现。正确的做法是每调用一次FB就给它分配一个独立的实例。比如Motor1_FB和Motor2_FB分别对应两台电机的控制实例。这样它们各自有独立的内部状态互不干扰。4.3 封装自己的功能块库当你做了一段时间项目之后会发现很多逻辑是重复的。比如电机控制、阀门控制、PID控制、报警处理这些逻辑在每个项目里都会用到。这时候就应该把它们封装成标准的功能块形成一个自己的库。封装FB的好处是一次编写到处使用。而且因为经过了多个项目的验证可靠性比每次重新写要高得多。我自己的库里积累了二十多个常用的FB新项目开始的时候先把这些FB导入进去能省下大量的开发时间。封装FB的时候要注意几点接口要清晰输入输出变量的命名要规范让人一看就知道是什么意思内部逻辑要健壮要考虑各种异常情况比如输入超范围、传感器故障等要有注释和文档说明这个FB的功能、参数含义、使用注意事项。5. 任务与程序执行程序是怎么跑起来的5.1 周期扫描机制PLC的工作方式是周期扫描这一点跟普通计算机的程序执行方式完全不同。普通计算机的程序是事件驱动的你不点击按钮程序就不执行。PLC是循环执行的从上电开始它就一遍又一遍地扫描程序周而复始直到断电。一个完整的扫描周期包括几个阶段读取输入→执行程序→刷新输出→系统通信和处理。读取输入阶段PLC把所有输入模块的信号读进来存到输入映像区。执行程序阶段PLC按照程序逻辑逐条执行读写输入输出映像区和内部变量。刷新输出阶段PLC把输出映像区的值写到输出模块上。系统通信和处理阶段PLC处理通信请求、诊断等任务。这个机制有一个重要的含义程序执行期间输入信号的变化不会立即反映到程序中。因为输入映像区是在扫描周期开始时统一读取的程序执行期间用的是那一刻的快照。同样程序执行期间对输出映像区的修改也要等到扫描周期结束才会真正输出到硬件。理解这一点对编程非常重要。比如你写了一个逻辑如果按钮按下就立即输出一个信号。但实际上从按钮按下到输出信号真正发出中间可能隔了一个完整的扫描周期。对于大多数应用来说这个延迟通常几毫秒到几十毫秒是可以接受的但对于高速响应要求的场合就需要用中断来处理。5.2 任务配置与优先级稍微高级一点的PLC都支持多任务。你可以把程序分成几个任务每个任务有不同的执行周期和优先级。比如主任务周期10ms负责常规逻辑控制高速任务周期1ms负责高速计数和位置控制慢速任务周期100ms负责数据处理和通信任务优先级决定了当多个任务同时就绪时哪个先执行。高优先级的任务可以打断低优先级的任务这就是抢占式调度。配置任务的时候要小心高优先级任务不能执行太长时间否则会阻塞低优先级任务导致系统响应变慢。5.3 中断处理中断是处理突发事件的机制。当某个事件发生时比如一个高速输入信号到来PLC暂停当前的任务立即执行中断程序处理完后再回到原来的任务继续执行。中断程序要尽量短小只做最紧急的处理比如记录一个时间戳、设置一个标志位。复杂的处理逻辑应该放到主程序里根据标志位来判断执行。中断程序执行时间过长会影响其他任务的实时性。6. 常见问题与排查技巧实录6.1 程序能下载但运行不对怎么查这是最常见的问题。程序编译通过下载到PLC也没报错但设备就是不按预期动作。排查思路一般是从外到内从硬到软。先确认硬件接线是否正确。输入信号有没有真正到达PLC输出信号有没有从PLC发出用万用表量一下或者看PLC上的指示灯。这一步能排除掉至少一半的问题。硬件没问题的话就打开编程软件的在线监控功能看程序的执行状态。输入信号对应的变量有没有变化逻辑条件是否满足输出变量有没有被置位一步步往下追总能找到断点。我遇到过一个案例程序里用了一个定时器设定时间是5秒但实际动作要等十几秒才发生。查了半天发现是扫描周期的问题——那个定时器的使能条件在一个慢速任务里任务周期是100ms定时器的计时精度受到了影响。后来把定时器移到快速任务里就正常了。6.2 模拟量信号波动大怎么办模拟量信号波动是工控现场的老大难问题。原因可能有很多传感器本身精度不够、信号线受到干扰、接地不良、PLC的模拟量模块分辨率不够。处理办法分几步先排除硬件问题。检查信号线是否用了屏蔽线屏蔽层是否单端接地检查传感器供电是否稳定检查周围是否有变频器、大功率电机等干扰源。硬件没问题的话在程序里做软件滤波。最简单的是平均值滤波连续采样N次取平均。N越大滤波效果越好但响应也越慢。我一般用10到20次。如果波动还是有规律的高频噪声可以用一阶滞后滤波效果比简单平均更好。6.3 程序修改后下载设备动作异常这种情况通常是变量地址冲突或者程序逻辑遗漏导致的。修改程序的时候如果不小心把某个变量的地址改了或者删除了某个关键的逻辑段就可能出现异常。我的习惯是每次修改程序之前先备份当前版本。修改的时候用软件的“交叉引用”功能检查变量的使用情况确保没有遗漏。下载之前先在仿真环境里跑一遍确认逻辑正确再下载到实际设备。还有一个容易忽略的点掉电保持区。有些变量设置了掉电保持PLC重新上电后这些变量会恢复成上次断电前的值。如果你修改了程序逻辑但没有清除这些保持变量可能会出现意料之外的行为。下载新程序之前先清除保持区让所有变量回到初始值。6.4 常见问题速查表现象可能原因排查方法解决措施程序下载后无输出输出模块未供电检查输出模块电源接通电源输入信号不响应输入地址配错在线监控输入变量修正变量地址定时器不准任务周期设置不当检查任务配置调整任务周期模拟量波动干扰或滤波不足检查屏蔽和接地增加软件滤波通信中断站号或波特率不匹配检查通信参数统一通信配置FB行为异常实例未正确分配检查FB调用分配独立实例6.5 几个保命的编程习惯做了这么多年项目我总结了几个能帮你少加班的习惯。第一变量命名要规范。不要用a、b、c这种名字也不要用中文拼音缩写。用有意义的英文单词组合比如Conveyor1_Start、Tank2_Level_High。变量表里写清楚注释说明这个变量的物理含义。第二程序要分段。不管用梯形图还是ST都要按功能把程序分成若干段每段前面加注释说明这段是干什么的。不要把所有逻辑堆在一个网络里。第三关键逻辑要加互锁。特别是涉及安全的地方比如电机的正反转、阀门的开关一定要加互锁逻辑防止同时动作。第四定期备份。每次修改程序之前备份每个项目节点备份项目结束后归档备份。我吃过亏一个项目做了三个月硬盘坏了程序全没了只能从头再来。第五仿真先行。现在大多数PLC编程软件都带仿真功能程序写完后先在仿真里跑一遍确认逻辑正确再下载到实际设备。能省下大量在现场调试的时间。7. 从标准到实践我的学习路径建议如果你刚开始学PLC编程我的建议是先不要贪多。先把梯形图吃透能熟练地用梯形图写出常见的控制逻辑。然后学一个品牌的PLC编程软件把基本的指令、功能块、程序结构搞清楚。这个阶段大概需要一到两个月。有了基础之后开始学ST语言。ST是你从“会编程”到“会写好程序”的关键一步。很多用梯形图写起来很别扭的逻辑用ST写起来非常自然。学ST的时候重点掌握条件判断、循环、数组、结构体这几个概念。再往后学SFC和功能块封装。这两个技能能帮你把程序组织得更加清晰提高代码的复用率。到了这个阶段你基本上可以独立负责一个中等规模的项目了。最后多看看别人写的程序。每个工程师都有自己的编程风格和技巧看别人的程序能学到很多书本上没有的东西。我到现在还保持着看开源PLC程序和行业案例的习惯每次都能发现一些新的思路。IEC61131这套标准刚开始看的时候可能觉得枯燥但当你真正理解了它背后的设计思想你会发现它其实是在帮你把程序写得更好、更规范、更容易维护。它不是束缚而是工具。用好了受益的是你自己。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑