☰
PLC编程语言深度解析:梯形图、ST、SFC与实战调试
2026/9/30 23:47:57 网站建设 项目流程

在PLC这个圈子里,最容易被忽略却又最绕不开的话题,就是编程语言本身。你随便打开一台设备的控制程序,不管是用西门子博途、三菱GX Works、汇川AutoShop,还是Codesys系的软件,默认铺在眼前的几乎都是梯形图。你问十个老工程师为什么,一半人会告诉你“因为电气原理图就是这么画的”,另一半人会告诉你“因为厂里维修电工只会看梯形图”。这两句话背后,是整个工控行业几十年形成的一种默契:PLC编程语言不只有梯形图一种,但梯形图始终是那个所有人绕不开的入口。这篇内容不打算讲什么高深理论,就想把梯形图和其他几种PLC编程语言摊开揉碎,聊清楚它们各自擅长干什么、怎么选、怎么写,顺便把新手最容易踩的符号、扫描周期、品牌差异和调试坑一次说透。

1. 梯形图为什么这么能打

1.1 从继电器柜到梯形图:一次“抄作业”式的革命

要理解梯形图为什么至今还是绝对主流,得先回到PLC诞生的年代。早年的工业控制靠的是满墙的中间继电器、时间继电器、接触器,用一个控制柜实现一套启停逻辑。那一堆线圈、触点、接线端子密密麻麻,查起故障来让人头皮发麻。后来PLC出现了,编程器的交互界面不可能太花哨,于是有人想到一个聪明的办法:把继电器控制电路图那一套表达方式直接搬进来。左右两条母线代表电源,中间是一堆触点和线圈的串并联组合,一眼看过去,和柜子里那张电气原理图长得几乎一模一样。

这就是梯形图最狠的地方——它让PLC的“程序”对电气工程师来说完全不需要学习成本。懂电路图的人,看梯形图就像看老朋友。当年很多电工师傅第一次接触PLC编程,就是照着继电器电路改梯形图,一个下午就能上手。这种“抄作业”式的设计直接决定了后面半个世纪工控圈的编程习惯。

1.2 不只是直观:在线监控和维修友好才叫真功夫

梯形图能活到今天,绝不只是因为长得像电路图。它有两个极其硬核的优势是其他PLC语言很难替代的:

一是逻辑可视化。一段梯形图程序,左母线到右母线,触点串并联关系一目了然。你写一个复杂的联锁回路,草稿纸上画的和屏幕里的几乎一致。做非标设备调试的时候,脑子里想“启动按钮按下、前门关闭、急停复位三个条件同时满足才能转”,梯形图上就是三个触点串联一个线圈,清晰得不能再清晰。

二是在线监控能力。笔记本连上PLC之后,梯形图的每一条通断路径都会变成高亮绿色。哪一路通了、哪一路断了,维修电工拿着螺丝刀在现场按按钮,屏幕上的触点跟着变化,故障点10分钟内就能定位出来。这个体验是结构化文本、指令表完全比不上的。工厂里老师傅最喜欢梯形图,不是因为不会别的,是因为出了故障它真的能救命。

另外还有一层很现实的原因:存量市场太大。工厂里大量老旧设备跑的还是十几年前写的梯形图程序,新来的工程师无论学历多高、在学校学的ST多强,到了现场也得先学会读梯形图。这就是行业惯性,它比任何标准都更有力量。

1.3 但梯形图不是万能的

说句公道话,梯形图在逻辑控制领域是王者,可一旦涉及复杂运算,它就开始吃力了。比如你要做一堆浮点运算、坐标变换、数组寻址、PID参数自整定,用梯形图写不仅麻烦,而且程序会变得非常臃肿难查。想象一下,你想写一个“温度误差乘以比例系数再积分,最后加上前馈量”的语句,用ST语言三行解决,用梯形图你得一格一格地放置乘法、加法功能块,连线连到眼花。

梯形图还有一个隐性问题:程序行数一旦超过几百行,逻辑查找就很费劲。你很难像看文本代码一样快速扫描某个变量在哪些地方用过。所以业内的普遍做法是:主逻辑用梯形图搭框架,复杂算法用ST写独立块,两者互相配合。

2. IEC 61131-3语言家族:五种武器怎么选

2.1 标准从哪来,为什么需要它

PLC编程语言之所以有五种而不是一种,得感谢国际电工委员会推出的IEC 61131-3标准。这个标准把PLC编程语言统一成了两种图形语言和两种文本语言,外加一个用于顺序控制的结构。它出现的背景很简单:当年各大厂家各自为政,三菱的指令、西门子的指令、AB的指令互不通用,工程师跳槽换品牌等于重学一门武功。有了这个标准之后,虽然各家软件的实现细节仍有区别,但核心思想已经统一:梯形图(LD)、指令表(IL)、结构化文本(ST)、功能块图(FBD)、顺序功能图(SFC)。

为什么要同时保留五种而不是只留一种?因为不同的控制任务,思维模型完全不一样。逻辑联锁适合图形化表达,数学运算适合文本化表达,多步骤流程适合顺序化表达。强求用一种语言塞进所有场景,最后写出来的程序一定是四不像,现场维护的人会骂娘。

2.2 五种语言逐个看:各打各的擅长位

我在实际项目里五种语言都用过,说下最真实的感受。

梯形图(LD)不用再多讲,逻辑控制、按钮指示灯、接触器控制、安全联锁这些传统强项全部交给它。指令表(IL)现在除了老设备的维护基本没人主动去写了,但老一代三菱程序大量用指令表写的,你修老设备看不懂IL会非常被动,所以至少得能读。功能块图(FBD)在过程控制领域表现很好,模拟量回路、PID调节、信号处理这些功能以块为单位连线,比梯形图舒服,汇川、西门子、Codesys系里面都有大量FBD库。

结构化文本(ST)是这几年的香饽饽,特别是运动控制和数据处理场景。ST长得像Pascal或C语言,能写IF、FOR、CASE,能做数组、结构体,算力表达能力远超图形语言。很多做伺服控制、视觉配合的项目,核心算法全是ST写的。再配合CODESYS这类支持面向对象编程的平台,ST甚至能干传统高级语言的活。

顺序功能图(SFC)则专门为“按部就班”的控制流程设计。一条流水线分上料、定位、加工、下料四个工步,每个工步之间有切换条件,用SFC画出来就是一个个步骤块加转移条件线,逻辑非常清晰。SFC特别适合调试时让人一眼看出设备当前卡在哪一步。

语言核心思维模型最擅长场景我的使用频率
LD梯形图触点-线圈串联/并联逻辑控制、联锁、按钮指示灯主力
IL指令表助记符操作老设备维护、简单逻辑偶尔读
ST结构化文本算法/流程语法运动控制、数据处理、复杂算法频繁
FBD功能块图输入输出块连线过程控制、PID回路、模拟量根据项目
SFC顺序功能图步骤+转移条件多工步流程、自动流水线项目需要时

2.3 混合编程才是常态

很多刚学PLC的朋友会有一种误解:认为一个项目从头到尾只能选一种语言。其实IEC 61131-3标准从一开始就允许混合使用。主流编程软件里,你完全可以在一段主程序里调用一个ST写的子程序,节能模式用梯形图写,PID模块用FBD拖,整个程序的不同部分用最适合的语言。

我个人的习惯是:主流程和联锁逻辑用梯形图,因为现场维护方便;数值计算、坐标变换、数据处理用ST,写起来干净利落;运动控制里多轴同步的轴组配置用FBD图标配;按流程步骤走的设备段用SFC搭骨架。这样写出来的程序,既有梯形图的直观,又有ST的表达力,调试和后期维护都很舒服。

3. 梯形图符号和扫描周期,读懂这两样就入门了

3.1 梯形图符号大全:先看懂再动手

我看过太多新手卡在梯形图符号上,其实符号系统就那么十几个,用熟比背熟重要。常开触点(| |)是梯形图最核心的元件,它对应物理世界里一个普通按钮或继电器的常开触点,程序扫描时如果对应地址为1就导通。常闭触点(|/|)正好相反,对应地址为0时导通,这在急停、停止按钮上极其常用,因为断线时设备会处于安全状态。线圈(( ))是输出动作,只要左端逻辑为真就吸合。

置位(S)和复位(R)是一对非常实用的指令,置位后线圈靠自身保持,直到复位指令执行,适合做“锁存”类逻辑。上升沿和下降沿指令(P/N)则是只在信号变化的瞬间导通一个扫描周期,按钮单击、计数器触发都靠它。

定时器和计数器更是躲不开。TON是接通延时定时器,输入接通后开始计时,时间到输出才置位,这是电机的星三角转换、顺序启动的常客。TOF是断开延时,输入断开后继续输出保持一段时间。CTU计数器在检测到指定数量的脉冲后动作。比较指令可以判断数值大于、小于或等于某个目标,是模拟量控制和数值判断的基础。

3.2 扫描周期怎么影响你的程序

梯形图看起来像电路图,但它的执行方式其实和电路完全不一样。PLC是循环扫描的:先读一遍输入端子的状态存到输入映像区,然后从上到下、从左到右把程序完整跑一遍,最后把输出映像区的状态统一写到输出端子。这个“读输入-执行程序-写输出”的循环过程就叫扫描周期,通常只有几毫秒到几十毫秒。

这意味着一个很反直觉的事实:同一个线圈在程序里出现两次,最后的赋值结果会覆盖前面的结果。比如你把Q0.0在程序前面置1,后面又置0,最终输出就是0。这也是老工程师反复强调“双线圈输出是大忌”的原因。另外,程序执行过程中触点的通断不会实时影响后面指令的输入状态,因为输入映像是在扫描开始前统一采集的。理解不了这两点,调试起来会非常痛苦。

3.3 以电机启停为例:三行梯形图藏着多少细节

拿最经典的电机启停自锁来讲。启动按钮接I0.0,停止按钮接I0.1,接触器输出Q0.0。梯形图逻辑是这样的:I0.0的常开触点与Q0.0的常开触点并联,然后串联I0.1的常闭触点,最后驱动Q0.0线圈。

这个电路的精妙之处在于自锁。按下启动按钮,I0.0导通,Q0.0得电;手指松开后I0.1常闭还通着,但I0.0断开了,此时并联在它旁边的Q0.0常开触点已经因为自己得电而闭合,电流继续流向线圈,电机保持运行。按下停止按钮,I0.1常闭触点断开,整个回路切断,Q0.0失电,自锁触点跟着断开。用ST语言来说,等价于:

IF I0_0 AND NOT I0_1 THEN Q0_0 := TRUE; ELSE Q0_0 := FALSE; END_IF

你看,两种语言表达的是同一个逻辑,但梯形图更贴近电气工程师看电路图的直觉,ST更像程序员的逻辑表达式。初学者把这两个例子对照着读几遍,对“PLC语言为什么存在差异”体感会深很多。

4. 品牌战场:西门子、三菱、汇川、Codesys怎么选

4.1 主流PLC编程环境横向对比

选PLC编程语言,绕不开选品牌和编程软件。不同品牌的PLC虽然都遵循IEC标准,但指令风格、变量定义方式、编程体验差异非常大。我列一个自己的实际使用感受对比表:

品牌平台代表PLC编程软件语言支持特点
西门子S7-1200/1500TIA Portal博途LD/FBD/ST/SFC生态完整,库强大,ST语法接近Pascal,适合大型设备
三菱FX5U/QGX Works3LD/ST/FBD/SFC指令简洁,国内资料最多,老电工熟悉,小设备性价比高
汇川H5U/AM系列AutoShop等LD/ST/FBD/SFC兼容三菱风格,Codesys核心,国产品牌中代码生成工具进步快
Codesys平台各种软PLC/CODESYS设备CODESYS Development SystemLD/FBD/ST/SFC/IL等开放性好,支持面向对象,运动控制和机器人用得非常多
台达DVP/AS系列ISPSoft/WPLSoftLD/ST/FBD/SFC小中型设备常见,学习成本低
ABCompactLogixStudio 5000LD/FBD/ST/SFC欧美汽车行业常见,问题少但软件贵

4.2 我的选型经验

先说结论:如果是在校学生或刚入行自学,首选西门子S7-200 SMART或者三菱FX3U/FX5U。坦白讲这两个方向资料最全,教程、视频、论文覆盖密度极高,不管你想学什么功能,网上基本都有人写过。而且这两家在自动化公司的保有量都大,学完直接能用在工作现场。

如果是做非标设备的工程师,建议多关注Codesys生态,因为现在很多国产PLC搞的就是Codesys内核,比如汇川的H5U。这类PLC有两大好处:一是编程环境统一,换个品牌不太影响编程习惯;二是ST语言能力很强,方便你做运动控制和复杂功能块。热词里提到的“AI PLC代码生成”,就是从Codesys系的平台开始成熟的——你甚至可以直接用AI生成ST功能块再导入工程。

西门子博途则是另一个极端,它好是真的好,集成度极高,PLC、触摸屏、伺服驱动全在一个环境里组态;但初学者也容易被它庞大的概念体系吓到,什么设备组态、网络视图、DB块、背景OB,一堆概念压过来,很容易劝退。我的建议是:小设备调试先从200 SMART这类轻量环境入手,等逻辑控制玩透了,再切换到博途学面向对象和大型项目架构。

5. 三个拿来就能改的实战案例

5.1 十字路口红绿灯:定时器组合的经典课

十字路口红绿灯程序是PLC入门的经典题目,因为它的核心就是一组定时器循环接力。东西方向红灯亮30秒,同时南北方向绿灯亮25秒、绿灯闪烁3秒、黄灯2秒;然后东西方向绿灯亮25秒闪烁3秒黄灯2秒,南北方向红灯亮30秒。代码实现思路是:用一个循环定时器(比如T0)作为总节拍,每隔30秒重新计时,再用一个顺序移位或者定时器比较的方式生成不同时间段内对应方向的灯亮灭。

我写这类程序习惯用“时序段”而不是堆一堆定时器。Timer0负责总周期,后面用T1、T2、T3记录相对时间点,然后每个灯的输出直接用时间段比较指令写出来。这样程序结构清楚,后期修改时间参数只需要改定时器预设值,不用重写逻辑。真到现场改红绿灯信号,这种写法最省心。

5.2 顺序启停:润滑电机和主轴的时序配合

另一种常见的实战场景,热词里也有体现:“润滑电动机开始运行,3秒后主轴电机运行;系统停止时主轴电机先停,4秒后润滑电机才停。”这种顺启逆停的逻辑在很多机床、非标设备上非常常见,目的是先用润滑油润滑主轴,再启动主轴;停的时候反过来,先停主轴,让润滑系统继续运转几秒,保证残余润滑。

实现思路用两个定时器就行。启动时,润滑电机Q0.0得电,同时启动T0计时,3秒后T0常开触点闭合,主轴电机Q0.1得电。停止时,主轴电机先断,同时启动T1计时,4秒后T1常开触点断开,润滑电机才断。关键技巧是停止信号不要直接断润滑电机的输出线圈,而是通过T1的延时去控制;同时T0和T1要有互锁逻辑,防止启动/停止乱按导致状态错乱。这个程序用梯形图写出来大概十几行,是所有设备调试的入门必修课。

5.3 PID温控温差大?先调比例,再谈其他

热词里有个很实在的问题:“PLC温度PID波动温差大如何调节”。我见过太多调试现场,PID一投自动,温度上下乱窜,温差十几度,工程师第一反应就是去调Kp和Ti,结果越调越乱。我的建议是按“先比例、后积分、再微分”的顺序来:

先把积分和微分关掉,只留纯比例,Kp从很小开始加大,看到温度开始出现等幅振荡,再把Kp往回调一点,大概留一半左右余量;然后加一点积分时间,用来消除静差,但积分时间别太小,否则会越整越震荡;微分能不用就不用,温度对象本身有大惯性,微分对噪声特别敏感,搞不好反而放大波动。

还有一个容易被忽略的坑:输出上下限没做限幅。如果PID运算结果直接把输出给到加热器,自动模式下输出很容易100%或者0%来回跳,温差当然大。我一般会给输出加一个10%到90%的限幅,同时把温度采样做一阶滤波,波动会平滑很多。做温控系统几年下来,我最深的体会是:PID参数调试七分靠现场观察、两分靠经验、一分靠公式,公式只是起点,不是终点。

6. 调试路上那些坑:从通讯到仿真的排查实录

6.1 死活搜不到CPU,十有八九是这三件事

很多朋友第一次把手持编程器换成笔记本连接PLC,第一关就栽在“搜索不到CPU”上。这个问题我排查过无数次,原因基本就三类:

第一类是网段不一致。电脑的IP地址和PLC的IP不在同一个子网。比如PLC默认是192.168.0.1,你的电脑却是192.168.1.10,那是肯定搜不到的。解决办法是先把电脑网卡的IP改到同一网段,或者直接在软件里设置搜索范围。第二类是软件里的PG/PC接口选错了。西门子Micro/WIN SMART有“连接”设置,必须选成实际使用的网卡,不能选成空接口或者虚拟网卡。第三类是防火墙拦了。Windows防火墙经常拦截PLC的广播包,搜不到设备时把防火墙临时关掉试试,或者干脆添加软件到防火墙白名单。

6.2 端口号、AMS Net ID和“密码保护”的坑

如果你接触的是Codesys系、倍福TwinCAT系统,就绕不开“AMS Net ID”和端口号的问题。AMS Net ID是一串六字节的网络标识符,和IP地址长得像,但功能不同,它用于广告通信路由。建立通信连接时,需要填目标PLC的AMS Net ID和端口号。笔者的经验是把AMS Net ID配成和IP地址完全相同的格式,尽可能避免混淆。端口号则要去系统的路由设置里查看,多数场景用默认端口即可。

另一个常见的坑是“在线检查PLC组态数据时密码错误”。程序文件设置了保护但又忘了密码,在线检查就卡壳。我的建议是做好密码台账,把PLC程序的密码、HMI工程的密码、扩展模块的出厂设置全部记在一个本子上。别笑话,这个土办法在工厂里比任何软件都管用。

6.3 博途和第三方模拟屏怎么总闹矛盾

热词里有“博途PLC与模拟屏不兼容”这个说法,我理解大概指的是西门子S7-1200/1500通过博途组态之后,连接第三方触摸屏时出现通讯不上或者驱动不匹配的情况。这类问题的根子通常不在PLC,而在驱动和协议。第三方HMI组态时,通讯驱动必须选对PLC型号和固件版本,有些老版本的HMI软件根本不支持新型号的S7-1200固件,这种情况下把PLC的网口协议改为兼容模式,或者升级HMI的驱动包,比改PLC程序更有效。

另外博途程序的保护等级也可能是元凶。我做过一个项目,博途里勾选了“检查PLC组态数据的密码”,结果第三方屏连上去直接报验证错误。排查到最后发现是保护设得太严,把访问级别改成“完全访问”就好了。记住一个原则:第三方设备连接SCADA或HMI之前,先确认访问级别是允许外部读写的。

6.4 在线监控与程序下载的保命习惯

最后这条经验,是我用事故换来的。在线修改和下载程序时,PLC的所有输出会按照程序重新初始化,现场设备很有可能瞬间动作。如果你在调试一台有气缸、有变频器、有伺服电机的设备,下载前一定要确认三个问题:设备是不是处于安全停止状态?急停回路是不是有效?有没有同事在现场伸手触碰运动部件?我现在的习惯是所有非标设备都加一个调试模式开关,程序里做个公共条件:调试模式下所有外部输出禁止动作,这样在线下载程序才不会出幺蛾子。

还有一个小习惯很值得分享:程序注释一定要写清楚。梯形图里一个变量叫M100,和叫“主轴允许启动”,维护的时候完全是两个效率。变量命名、段注释、程序块说明这些“看不见的性能”会在三个月后你重新打开这个项目时加倍回报你。


我个人做了这么多年设备调试,兜兜转转用过的PLC语言也算不少,最后留下的就是一套朴实的方法论:梯形图负责把逻辑讲清楚,让现场电工看得懂;ST负责把复杂算清楚,让设备控制得更细;SFC负责把流程理清楚,让多步骤自动运行不出错。语言本身没有高低贵贱,能解决现场问题、能让维护的人睡得着觉,就是好的编程方式。刚开始学的朋友也不用焦虑,先把梯形图老老实实玩明白,再往ST和软PLC方向走,你会发现自己已经超过了大多数只懂一种语言的同行。最后送一个我自己的小习惯:每个项目结束之后,把用过的定时器、计数器、特殊寄存器整理成一张对照表存档,下次同类设备开工直接复制改参数,比从头写程序省一半时间。

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

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

立即咨询