1. 气缸与电磁阀控制的底层逻辑拆解1.1 为什么先搞懂气动执行机构再碰PLC很多刚入行的朋友一上来就急着写梯形图结果程序跑通了气缸却撞得咣咣响要么就是电磁阀线圈烧了。问题不在程序本身在于没把气动执行机构的工作特性吃透。气缸不是电机它没有中间停止的概念——给气就跑断气就停换气就反向。这个“非黑即白”的特性决定了PLC控制逻辑必须是开关量为主、时序配合为辅的架构。气缸按动作方式分两大类单作用缸和双作用缸。单作用缸只有一端进气靠弹簧复位PLC只需要控制一个电磁阀线圈双作用缸两端都能进气需要两个线圈分别控制伸出和缩回或者用一个双电控电磁阀加脉冲信号控制。实际项目里双作用缸占八成以上因为推力大、行程可控、重复精度好。电磁阀这边常见的是两位五通和三位五通两种。两位五通只有两个工作位置——要么伸出要么缩回断电后靠弹簧复位到默认位。三位五通多了一个中间位可以实现中封、中泄、中压三种功能。中封就是两边都断气气缸锁在中间位置中泄是两边都排气气缸可以自由推动中压是两边都通气气缸也锁住但推力更大。选哪种取决于你的工艺需求——比如垂直安装的气缸断电时不能掉下来那就必须用中封或中压。注意电磁阀的“位”和“通”是两个概念。“位”是阀芯的工作位置数量“通”是接口数量。两位五通就是两个位置、五个气口一个进气、两个出气、两个排气。别搞混了。1.2 PLC输出类型与电磁阀的匹配关系PLC的数字量输出分三种继电器输出、晶体管输出、晶闸管输出。控制电磁阀一般用继电器输出或晶体管输出。继电器输出能直接驱动交流220V的电磁阀但寿命有限频繁动作的场合容易坏触点。晶体管输出响应快、寿命长但只能驱动直流24V的负载而且有漏电流问题——即使输出为OFF仍可能有微小电流流过导致某些灵敏的电磁阀无法完全关闭。我个人的经验是动作频率低于每分钟10次的场合用继电器输出没问题高频动作的场合必须用晶体管输出配直流24V电磁阀。如果电磁阀是交流220V的中间加一个继电器过渡PLC只管驱动继电器线圈继电器触点去控制电磁阀。这样既保护了PLC输出点又方便更换。还有一个容易被忽略的点电磁阀的启动电流。电磁阀线圈在吸合瞬间的电流是额定电流的3到5倍如果PLC输出点同时驱动多个电磁阀总电流可能超过输出模块的额定值。比如一个8点输出模块每点额定0.5A同时驱动4个电磁阀每个启动电流2A总电流就是8A远超模块承受能力。解决办法是分组错开启动程序里加50到100毫秒的延时让电磁阀依次得电。1.3 从气动原理图到PLC I/O分配表的转化方法拿到一个项目第一步不是写程序是画I/O分配表。这张表是程序和硬件之间的桥梁画错了后面全乱。我习惯用Excel做列清楚每个点的地址、功能、信号类型、备注。地址功能信号类型备注I0.0启动按钮输入常开按下为1I0.1停止按钮输入常闭按下为0I0.2气缸A伸出到位输入磁性开关到位为1I0.3气缸A缩回到位输入磁性开关到位为1Q0.0气缸A伸出电磁阀输出得电伸出Q0.1气缸A缩回电磁阀输出得电缩回这张表看着简单但有几个坑磁性开关的极性——有的气缸原装磁性开关是NPN常开有的是PNP常闭接错了PLC读到的信号就是反的。按钮的常开常闭——急停按钮必须用常闭触点这样断线时PLC也能检测到故障。输出点的分组——如果输出模块有公共端分组同一组的输出点必须接同一电压等级的负载。2. 梯形图编程的核心思路与实战框架2.1 气缸控制的三种基本程序结构气缸控制程序说到底就三种结构单步控制、顺序控制、互锁控制。单步控制最简单一个按钮控制一个电磁阀按一下伸再按一下缩。顺序控制是多个气缸按固定顺序动作A伸→B伸→A缩→B缩这种在自动化装配线上最常见。互锁控制是防止两个冲突动作同时发生比如一个气缸伸出时另一个绝对不能伸否则撞机。单步控制的梯形图长这样|--[ I0.0 ]--[ /Q0.1 ]--( Q0.0 )--| |--[ I0.1 ]--[ /Q0.0 ]--( Q0.1 )--|第一行启动按钮按下且缩回输出没得电时伸出输出得电。第二行停止按钮按下且伸出输出没得电时缩回输出得电。两个输出互相锁住对方保证不会同时得电。这个互锁逻辑是气缸控制的铁律——任何时候都不能让两个方向的电磁阀同时得电否则轻则电磁阀烧毁重则气缸爆裂。顺序控制我推荐用步进梯形图SFC转梯形图来写比纯梯形图清晰十倍。三菱的SFC、西门子的GRAPH、汇川的Codesys都支持这种写法。核心思路是把每个动作定义为一个“步”步与步之间的转换条件就是到位信号。比如步0初始状态等待启动步1气缸A伸出转换条件为A伸出到位步2气缸B伸出转换条件为B伸出到位步3气缸A缩回转换条件为A缩回到位步4气缸B缩回转换条件为B缩回到位步5回到步0这种写法最大的好处是调试时能一眼看出卡在哪一步。如果气缸A伸出后一直不切换到步2那肯定是A的到位信号没回来直接去查磁性开关或者气管压力就行。2.2 用中间继电器搭建清晰的程序骨架新手写程序最容易犯的错是把所有逻辑都塞在一行里一个网络几十个触点自己过两天都看不懂。我的习惯是大量使用中间继电器M点来分层。第一层处理输入信号把物理输入转换成逻辑条件第二层处理动作逻辑用中间继电器搭建状态机第三层处理输出把逻辑结果映射到物理输出点。举个例子一个气缸需要“手动伸出”“手动缩回”“自动循环”三种模式。我不会在输出行里写一堆模式判断而是先定义三个中间继电器|--[ 手动模式 ]--[ 伸出按钮 ]--( M10 手动伸出请求 )--| |--[ 手动模式 ]--[ 缩回按钮 ]--( M11 手动缩回请求 )--| |--[ 自动模式 ]--[ 循环启动 ]--( M12 自动循环请求 )--|然后在输出行里统一处理|--[ M10 ]--[ /M11 ]--[ /Q0.1 ]--( Q0.0 )--| |--[ M11 ]--[ /M10 ]--[ /Q0.0 ]--( Q0.1 )--|这样程序结构清晰改起来也方便。要加一个“点动模式”只需要在输入层加一行输出层完全不用动。2.3 定时器与计数器的配合使用技巧气缸控制里定时器用得特别多但很多人用不对。最常见的场景是气缸动作超时报警——给气缸伸出加一个定时器如果5秒内没收到伸出到位信号就报警停机。这个逻辑本身简单但坑在于定时器的复位时机。如果气缸缩回时定时器没复位下次伸出时定时器直接从上次的值继续计时报警就会提前触发。正确的写法是用动作的启动条件来复位定时器|--[ Q0.0 ]--[ /I0.2 ]--( T0 K50 )--| |--[ T0 ]--( M20 伸出超时报警 )--|第一行伸出输出得电且到位信号没来时定时器T0开始计时设定值505秒。第二行定时器到了就置位报警。关键是T0的使能条件里包含了Q0.0当Q0.0断开时T0自动复位下次伸出重新计时。计数器一般用在循环次数控制上。比如一个气缸要往复运动10次后停止用计数器C0记录缩回到位的次数到10次后复位整个循环。注意计数器的复位要用循环启动的上升沿不能用常开触点否则计数器会反复复位。3. 完整实战案例双气缸顺序控制程序3.1 项目需求与硬件配置清单假设一个简单的装配工位气缸A负责将工件从料道推到装配位气缸B负责将压头压下完成压装。动作顺序是A伸出→A到位→B伸出→B到位→保压2秒→B缩回→B到位→A缩回→A到位→完成。硬件配置如下部件型号数量备注PLC汇川H5U1台晶体管输出气缸ASMC CDQ2B32-50DZ1个双作用磁性开关2个气缸BSMC CDQ2B40-30DZ1个双作用磁性开关2个电磁阀SMC SY5120-5LZD-012个两位五通24VDC磁性开关SMC D-M9B4个两线制常开按钮施耐德XB42个启动/停止急停施耐德XB41个常闭I/O分配地址功能类型I0.0启动按钮输入I0.1停止按钮输入I0.2急停按钮输入I0.3气缸A伸出到位输入I0.4气缸A缩回到位输入I0.5气缸B伸出到位输入I0.6气缸B缩回到位输入Q0.0气缸A伸出电磁阀输出Q0.1气缸A缩回电磁阀输出Q0.2气缸B伸出电磁阀输出Q0.3气缸B缩回电磁阀输出3.2 步进梯形图的编写与转换用汇川的AutoShop写步进梯形图先定义步继电器S0到S10。S0是初始步S1到S8对应八个动作步S9是完成步。|--[ M8002 ]--( S0 )--| // 上电初始化进入S0 |--[ S0 ]--[ I0.0 ]--( S1 )--| // 启动按钮按下进入S1 |--[ S1 ]--( Q0.0 )--| // S1步气缸A伸出 |--[ S1 ]--[ I0.3 ]--( S2 )--| // A伸出到位进入S2 |--[ S2 ]--( Q0.2 )--| // S2步气缸B伸出 |--[ S2 ]--[ I0.5 ]--( S3 )--| // B伸出到位进入S3 |--[ S3 ]--( T0 K20 )--| // S3步保压2秒 |--[ S3 ]--[ T0 ]--( S4 )--| // 保压完成进入S4 |--[ S4 ]--( Q0.3 )--| // S4步气缸B缩回 |--[ S4 ]--[ I0.6 ]--( S5 )--| // B缩回到位进入S5 |--[ S5 ]--( Q0.1 )--| // S5步气缸A缩回 |--[ S5 ]--[ I0.4 ]--( S6 )--| // A缩回到位进入S6 |--[ S6 ]--( S0 )--| // 回到初始步这个程序里有个关键点每个步的输出用SET指令还是OUT指令。如果用OUT当步切换时上一步的输出自动断开这符合我们的需求。但如果用SET就必须在下一步用RST复位否则输出会一直保持。我推荐用OUT简单可靠。还有一个细节急停的处理。急停按下时所有输出必须立即断开所有步必须复位到S0。这个逻辑要写在程序最前面优先级最高|--[ /I0.2 ]--[ M8000 ]--( RST S0 S10 )--| // 急停按下复位所有步 |--[ /I0.2 ]--[ M8000 ]--( RST Q0.0 Q0.3 )--| // 急停按下复位所有输出注意急停按钮用的是常闭触点所以程序里用常开符号/I0.2表示“急停未按下”。当急停按下时I0.2变为0/I0.2变为1复位逻辑生效。3.3 程序调试与动作验证的实操记录程序写完后不要直接上气缸先空跑。把电磁阀的插头拔掉只留PLC输出指示灯按启动按钮看指示灯顺序对不对。这一步能发现80%的逻辑错误。空跑没问题后接上电磁阀但不接气缸听电磁阀的换气声。正常应该是“咔嗒”一声气流切换干脆利落。如果声音沉闷或者有持续漏气声说明电磁阀有问题或者气压不够。最后接上气缸先用手动模式单步测试。把每个步的转换条件强制置位看气缸动作是否到位。我遇到过好几次气缸伸出后磁性开关不亮的情况原因是磁性开关的位置没调好。气缸活塞上有个磁环磁性开关要装在磁环的感应范围内一般是在气缸行程的两端各留5到10毫米的余量。调的时候松开磁性开关的螺丝前后滑动直到指示灯亮起再锁紧。实操心得调试气缸时一定要先调气压。气压太高气缸撞得响气压太低推不动。一般双作用缸的工作气压在0.4到0.6MPa之间具体看气缸的规格书。调压的时候慢慢来每次加0.05MPa观察动作是否平顺。4. 常见故障排查与程序优化经验4.1 气缸不动作或动作异常的排查流程气缸不动作先别急着改程序按这个顺序查气源→电磁阀→PLC输出→程序逻辑。气源检查压力表有没有读数如果压力为零查空压机是否启动、气管是否被压住、过滤器是否堵塞。压力正常但气缸没力查气管是否接反——双作用缸的两个气口一个进气时另一个必须排气如果两个都接成进气气缸会卡死。电磁阀检查用手动按钮电磁阀上一般有个小孔用螺丝刀按下去测试电磁阀能否换气。如果能换气但PLC控制不行问题在电气侧。用万用表量电磁阀线圈的电压正常应该是24VDC。如果没有电压查PLC输出点是否得电如果有电压但电磁阀不动作线圈可能烧了量一下线圈电阻正常在几十欧姆到几百欧姆之间无穷大就是断路。PLC输出检查输出指示灯亮但电磁阀不动作可能是输出点损坏。晶体管输出点损坏一般是击穿短路表现为输出一直为ON不受程序控制。继电器输出点损坏一般是触点氧化表现为接触不良。换一个备用点改一下程序地址就行。程序逻辑检查如果以上都正常那就是程序问题。最常见的是互锁条件写反了比如伸出和缩回互相锁住结果两个都动不了。还有一种情况是步进程序的转换条件用了常闭触点导致步永远切换不了。4.2 电磁阀频繁烧毁的原因分析与对策电磁阀烧毁是现场最常见的故障之一我统计过原因主要有四个第一个是电压不匹配。24VDC的电磁阀接了220VAC瞬间就烧。这个低级错误在新手身上发生得最多。接线前一定要看电磁阀铭牌DC和AC别搞混。第二个是持续通电。两位五通电磁阀的设计是短时工作制如果长时间通电线圈温度会升到100度以上绝缘层老化加速。有些工况需要电磁阀保持得电几个小时这种场合必须选长期工作制的电磁阀或者改用双电控电磁阀加脉冲控制——给一个脉冲就切换断电后靠机械记忆保持位置。第三个是浪涌电压。电磁阀断电瞬间线圈会产生反向电动势电压可能高达几百伏击穿PLC输出点或者电磁阀自身的驱动电路。解决办法是在电磁阀线圈两端并联续流二极管注意二极管的方向阴极接正极阳极接负极。如果是交流电磁阀并联RC吸收电路。第四个是环境温度过高。电磁阀装在密闭的电柜里夏天柜内温度能到60度以上线圈散热困难。对策是加装散热风扇或者把电磁阀移到柜外。我见过一个项目电磁阀装在铸造车间环境温度50度一个月烧了8个后来加了风扇就再没坏过。4.3 程序扫描周期对气缸动作的影响PLC的扫描周期一般在10到50毫秒之间对于气缸控制来说通常够用但在高速动作的场合会出问题。比如气缸的到位信号只持续20毫秒而PLC扫描周期是30毫秒那这个信号就可能被漏掉。解决办法有两个用中断程序或者用高速计数器。中断程序可以在信号到来的瞬间立即响应不受扫描周期限制。高速计数器可以捕捉极窄的脉冲信号。不过对于大多数气缸控制来说磁性开关的信号持续时间都在100毫秒以上普通扫描完全够用。真正需要注意的是输出刷新时机。PLC的输出是在扫描周期的末尾统一刷新的如果程序里同一个输出点被多次赋值只有最后一次有效。我见过一个程序气缸伸出和缩回都用了同一个输出点Q0.0结果气缸只会往一个方向动。这种错误编译时不会报错但运行时就是不对。避坑技巧写程序时一个输出点只在一个地方赋值。如果确实需要多个条件控制同一个输出用中间继电器汇总最后统一输出。这样程序清晰也不会出现双线圈问题。4.4 常见问题速查表现象可能原因排查方法解决措施气缸不伸出电磁阀未得电量电磁阀线圈电压检查PLC输出点及程序气缸伸出后不缩回缩回电磁阀故障手动按钮测试电磁阀更换电磁阀气缸动作缓慢气压不足查压力表读数调高气压至0.5MPa到位信号不亮磁性开关位置偏滑动磁性开关找感应点重新固定磁性开关电磁阀发热严重持续通电时间过长摸线圈温度改用双电控或加散热PLC输出点常ON晶体管击穿断开负载量输出更换输出点并加续流二极管程序卡在某一步转换条件不满足监控步继电器状态检查到位信号和逻辑气缸撞缸缓冲器失效听撞击声更换缓冲器或调缓冲阀5. 从单机控制到多轴协同的进阶思路5.1 多气缸协同的互锁与优先级设计单气缸控制简单多气缸协同就复杂了。核心问题是互锁和优先级。互锁是防止两个气缸同时动作导致干涉优先级是当多个气缸同时请求动作时谁先谁后。互锁的设计原则是硬件互锁优先于软件互锁。比如两个气缸的伸出路径有交叉除了程序里写互锁最好在气路上加一个梭阀或者双压阀从物理上保证两个气缸不会同时伸出。软件互锁可能因为程序bug失效硬件互锁是最后一道防线。优先级的设计要看工艺要求。如果是装配线一般是上游优先——上游气缸没到位下游气缸不能动。如果是加工中心一般是安全优先——防护门没关主轴不能转。优先级用程序实现很简单在步进程序里把高优先级的步放在前面低优先级的步加一个“高优先级步未激活”的条件。5.2 用功能块封装重复逻辑如果项目里有10个气缸每个气缸的控制逻辑都一样那就不要复制粘贴10遍。用功能块FB封装起来每个气缸调用一次传入不同的I/O地址和参数。这样程序简洁改一处就全改了。以汇川Codesys为例定义一个功能块CylinderControl输入参数包括伸出按钮、缩回按钮、伸出到位、缩回到位、超时时间输出参数包括伸出输出、缩回输出、报警输出。功能块内部实现互锁、超时检测、手动/自动切换。主程序里实例化10次每个气缸一个实例。这种写法在汇川PLC气缸封装程序实例里很常见也是Codesys平台相比传统梯形图的一大优势。传统三菱FX系列不支持功能块只能用子程序调用参数传递麻烦一些。但三菱的SFC步进梯形图在顺序控制上又比Codesys直观。选型的时候要权衡。5.3 从气缸控制延伸到变频器与Modbus通讯气缸控制是PLC入门的基本功练熟了之后自然会接触到更复杂的控制对象比如变频器。变频器的控制和气缸有本质区别气缸是开关量变频器是模拟量或通讯量。用PLC控制变频器要么用模拟量输出0到10V调频率要么用Modbus RTU通讯读写参数。Modbus RTU通讯是现在的主流一根RS485线能挂32台变频器。西门子PLC与32台变频器Modbus通讯这种需求在大型生产线上很常见。核心是轮询——PLC依次读取每台变频器的状态写入控制字。轮询周期取决于波特率和数据量9600波特率下32台变频器轮一遍大概需要2到3秒。如果对实时性要求高就得提高波特率或者减少轮询的数据量。三菱FX3U加485ADP模块做Modbus通讯也很经典用ADPRW指令读写从站寄存器。ADPRW指令的格式是从站地址、功能码、起始地址、数据长度、数据存储地址。比如读取从站1的40001寄存器指令就是ADPRW K1 K3 K0 K1 D100。K1是从站地址K3是读保持寄存器功能码K0是起始地址K1是读1个寄存器D100是存储地址。经验之谈Modbus通讯调试时先用串口调试助手确认从站能正常响应再写PLC程序。很多通讯问题不是程序错是接线错——A接A、B接B终端电阻120欧姆屏蔽线单端接地。这些细节不注意程序写得再好也通讯不上。5.4 程序资源占用与优化建议PLC的资源是有限的程序写大了会报“程序容量超限”或者“扫描周期过长”。博途里可以查看PLC的资源使用情况包括程序块大小、数据块大小、扫描周期最大值和当前值。一般来说扫描周期超过50毫秒就要注意了超过100毫秒就可能影响气缸控制的实时性。优化程序资源有几个方向减少不必要的中间变量能用临时变量就不用全局变量合并重复逻辑用功能块或子程序优化数据结构用数组代替多个独立变量删除未使用的变量和程序块。我见过一个项目程序里定义了200个中间继电器实际只用了30个剩下的全是调试时留下的垃圾。还有一个容易被忽略的点是注释和符号名。博途和Codesys都支持中文符号名但中文符号名会占用更多内存。如果PLC内存紧张把符号名改成英文缩写能省不少空间。当然可读性会下降自己权衡。6. 个人实操体会与后续扩展方向6.1 新手最容易踩的五个坑干了这么多年带过不少新人发现大家踩的坑高度相似。第一个坑是急停按钮接常开。急停必须接常闭这样断线时PLC能检测到故障。接常开的话线断了PLC还以为一切正常急停按下去也没反应。第二个坑是气缸到位信号用普通接近开关。气缸的到位检测必须用磁性开关因为气缸活塞上只有磁环普通接近开关感应不到。而且磁性开关要选两线制的三线制的接线麻烦还容易受干扰。第三个坑是电磁阀不加减速阀。气缸伸出时如果速度太快撞击力很大气缸和工件都受不了。必须在电磁阀的排气口加单向节流阀调节排气速度来控制气缸动作速度。进气口不加排气口加这样气缸伸出时有力缩回时平稳。第四个坑是程序里不写超时报警。气缸卡住是常事没有超时报警程序就一直等设备停在那里没人知道。每个气缸动作都要加超时检测超时了就报警停机操作工才知道出问题了。第五个坑是调试时不挂警示牌。调试气缸时设备随时可能动作如果旁边有人经过很容易夹伤。调试前必须挂“正在调试禁止操作”的牌子最好安排一个人在旁边监护。6.2 从梯形图到结构化文本的过渡建议梯形图适合逻辑控制但遇到复杂的数学运算和数据处理就力不从心了。这时候需要过渡到结构化文本ST。ST的语法类似Pascal写循环、条件判断、数组操作都很方便。比如计算气缸的动作次数用梯形图的计数器要占一个计数器资源用ST就是一行代码IF 到位信号 THEN 计数 : 计数 1; END_IF;。再比如处理Modbus通讯的数据用ST写解析函数比梯形图清晰得多。过渡的时候不要一下子全改成ST混合使用最好。逻辑控制用梯形图数据处理用ST两者在同一个程序里可以互相调用。汇川和Codesys都支持这种混合编程博途也支持。三菱的FX系列只支持梯形图和指令表GX Works3开始支持ST了但功能有限。6.3 后续可以深入的方向气缸控制练熟之后可以往这几个方向深入伺服控制——气缸只能到位伺服可以任意位置定位精度高但成本也高视觉引导——用摄像头定位工件PLC控制气缸去抓取适合柔性生产线安全PLC——普通PLC加安全继电器做急停安全PLC直接处理安全信号可靠性更高远程IO——用Profinet或EtherCAT把IO模块分散到设备各处减少接线。还有一个方向是AI辅助编程。现在有些工具能根据自然语言描述生成PLC代码比如输入“气缸A伸出后延时2秒气缸B伸出”自动生成梯形图。我试过几个简单逻辑还行复杂逻辑还是得自己写。但作为辅助工具能省不少打字时间。未来这个方向应该会越来越成熟但短期内替代不了工程师。最后分享一个我个人的习惯每个项目做完后整理一份调试记录把遇到的问题、解决方法、参数设置都记下来。下次遇到类似项目直接翻记录能省一半时间。这份记录也是自己经验积累的最好方式比看任何教程都管用。