西门子PLC程序模板:气缸功能块 FB_AirCylinder 实战拆解
📅 2026/7/6 13:35:48
👁️ 阅读次数
📝 编程学习
西门子PLC程序模板:气缸功能块 FB_AirCylinder 实战拆解
邓工 · 2026-07-04 · #西门子PLC #S7-1500 #FB_AirCylinder #气缸功能块 #TIA Portal
所有气缸统一调用FB_AirCylinder(FB6020,归属 03Valve 功能段)。标准化封装优点:接口固定、逻辑复用、维护集中、跨项目拷贝。
层级划分:UNIT(工站)→EM(设备模块)→CM(控制模块)。FB_AirCylinder 属于 CM 层,ST_AirCylinder结构体传 Cmd/Sts,上层只管调。
一、接口一览
| 方向 | 变量 | 说明 |
|---|---|---|
| Input | Manual_Auto | 手自动切换 |
Switch_Initial | 缩回传感器 | |
Switch_Target | 伸出传感器 | |
Switch_Initial_Disable | 缩回传感器屏蔽 | |
Switch_Target_Disable | 伸出传感器屏蔽 | |
超时报警时间 | 动作最大允许时间 | |
信号消抖时间 | 传感器消抖时长 | |
原位动作时间 | 缩回定时(屏蔽时用) | |
限位动作时间 | 伸出定时(屏蔽时用) | |
调试模式 | 启用后手动直接映射IO | |
| Output | Solenoid_Target | 伸出电磁阀 |
Solenoid_Initial | 缩回电磁阀 | |
| InOut | AirCylinder | ST_AirCylinder 结构体 |
二、ST_AirCylinder 结构体
Cmd 和 Sts 严格分开,HMI 写 Cmd,程序读 Sts,不混。
| 成员 | 说明 |
|---|---|
xCmdSafety / xCmdReset | 安全信号 / 复位 |
xCmdAutoInitial / xCmdAutoTarget | 自动模式:缩回 / 伸出 |
xCmdManualInitial / xCmdManualTarget | 手动模式:缩回 / 伸出 |
xStsInitialDone / xStsTargetDone | 缩回完成 / 伸出完成 |
xStsErrorInitial / xStsErrorTarget | 缩回报警 / 伸出报警 |
三、6 个关键设计
- 手自动分离:Manual_Auto 选择命令源,自动只响应 xCmdAuto,手动只响应 xCmdManual,互不干扰
- 命令自复位:检测上升沿 → 驱动电磁阀 → 到位或超时后自动关输出,电磁阀不长期带电
- 到位消抖:传感器稳定到位超过设定时间才置位完成信号,机械振动误信号不触发
- 传感器屏蔽:Switch_Disable 使能时按动作时间定时控制,不等传感器反馈。部分工站无传感器时屏蔽位常真,调用接口不变
- 超时报警:命令发出超设定时间未到位 → 置位 xStsError + 自动关闭电磁阀
- 调试模式直接映射 IO:调试打开后手动命令直接走电磁阀,绕过消抖和互锁
四、多重背景 DB + 块调用
所有气缸实例集中放DB_AirCylinder(DB3040),多重背景 DB,按工艺命名:
D001_取托盘升降气缸 D001_取托盘横移气缸 D001_托盘进料阻挡气缸 D002_取料吸盘·旋转气缸 ...IO 只出现在块调用,FB 内部不引用 IO 地址。IO 变化无需改 FB 源码,跨项目接口兼容直接复用。
块调用参数
FB: FB_AirCylinder Instance: 取托盘升降气缸-1 Manual_Auto := %I0.2 // 手自动切换 Switch_Initial := %I0.7 // 缩回传感器 Switch_Target := %I1.0 // 伸出传感器 Switch_Initial_Disable := FALSE // 缩回传感器屏蔽 Switch_Target_Disable := FALSE // 伸出传感器屏蔽 超时报警时间 := T#6000ms // 动作最大允许时间 信号消抖时间 := T#10ms // 传感器消抖时长 原位动作时间 := T#6000ms // 缩回定时(屏蔽时用) 限位动作时间 := T#6000ms // 伸出定时(屏蔽时用) 调试模式 := FALSE // 启用后手动直接映射IO Solenoid_Target := Q_升降气缸_伸出 // 伸出电磁阀 Solenoid_Initial := Q_升降气缸_缩回 // 缩回电磁阀 AirCylinder := DB_AirCylinder.取托盘升降气缸五、HMI 映射
结构体统一,HMI 不需要为每个气缸单独建变量:
指示灯动画绑定:DB_AirCylinder.气缸名_xStsTargetDone 按钮按下事件: DB_AirCylinder.气缸名_xCmdManualTargetHMI 工程师记住一个 DB 命名规则,所有气缸画面复制改实例名即可。
六、并行开发流程
IO 表定了 → 硬件接线 + 写程序同步进行:
- 电气出 IO 地址分配表
- 程序员按 FB 接口对 IO 地址
- 联调时两边基本同步
**前提:**FB 接口必须提前定好,定好就别改。新需求加新 FB,不加老接口。
七、要点总结
FB 接口完善冗余是首要的。参数宁可多不可少,接口定好就不改。内部逻辑可以逐步完善,接口变了影响全局。
完整 SCL 源码
(* ================================================================= FB 名称:FB_AirCylinder 功能描述:双作用气缸通用控制块 - 手动/自动双模式,原位/限位双方向 - 到位信号消抖 + 动作超时报警 - 调试模式跳过定时器,直接读传感器 - 命令自复位 + 默认安全值 作者:邓工 适用平台:西门子 S7-1200/1500(TIA Portal) ================================================================= *) //========================== 1. 手动模式 ========================== IF #AirCylinder.xCmdManualInitial AND NOT #AirCylinder.xCmdManualTarget AND #AirCylinder.xCmdSafety AND NOT #Manual_Auto THEN #Solenoid_Initial := TRUE; #Solenoid_Target := FALSE; END_IF; IF #AirCylinder.xCmdManualTarget AND NOT #AirCylinder.xCmdManualInitial AND #AirCylinder.xCmdSafety AND NOT #Manual_Auto THEN #Solenoid_Initial := FALSE; #Solenoid_Target := TRUE; END_IF; //========================== 2. 自动模式 ========================== IF #AirCylinder.xCmdAutoInitial AND NOT #AirCylinder.xCmdAutoTarget AND #AirCylinder.xCmdSafety AND #Manual_Auto THEN #Solenoid_Initial := TRUE; #Solenoid_Target := FALSE; #AirCylinder.xCmdAutoInitial := FALSE; END_IF; IF #AirCylinder.xCmdAutoTarget AND NOT #AirCylinder.xCmdAutoInitial AND #AirCylinder.xCmdSafety AND #Manual_Auto THEN #Solenoid_Initial := FALSE; #Solenoid_Target := TRUE; #AirCylinder.xCmdAutoTarget := FALSE; END_IF; //========================== 3. 到位检测 ========================== IF #调试模式 = FALSE THEN #Time[0](IN := #Solenoid_Initial AND ((#Switch_Target_Disable = FALSE AND NOT #Switch_Target) OR #Switch_Target_Disable = TRUE), PT := #原位动作时间); #Time[1](IN := (#Switch_Initial_Disable = FALSE AND #Switch_Initial) OR (#Switch_Initial_Disable = TRUE AND #Time[0].Q), PT := #信号消抖时间); #AirCylinder.xStsInitialDone := #Time[1].Q; #Time[2](IN := #Solenoid_Target AND ((#Switch_Initial_Disable = FALSE AND NOT #Switch_Initial) OR #Switch_Initial_Disable = TRUE), PT := #限位动作时间); #Time[3](IN := (#Switch_Target_Disable = FALSE AND #Switch_Target) OR (#Switch_Target_Disable = TRUE AND #Time[2].Q), PT := #信号消抖时间); #AirCylinder.xStsTargetDone := #Time[3].Q; END_IF; IF #调试模式 = TRUE THEN #AirCylinder.xStsInitialDone := #Switch_Initial; #AirCylinder.xStsTargetDone := #Switch_Target; END_IF; //========================== 4. 超时报警 ========================== IF #调试模式 = FALSE THEN #Time[4](IN := #Solenoid_Initial AND #AirCylinder.xStsInitialDone = FALSE, PT := #超时报警时间); #AirCylinder."xStsErrorInitial(缩回报警)" := #Time[4].Q; #Time[5](IN := #Solenoid_Target AND #AirCylinder.xStsTargetDone = FALSE, PT := #超时报警时间); #AirCylinder."xStsErrorTarget(伸出报警)" := #Time[5].Q; END_IF; //========================== 5. 命令自复位 ========================== #Time[10](IN := #AirCylinder.xCmdAutoInitial OR #AirCylinder.xCmdAutoTarget OR #AirCylinder.xCmdManualInitial OR #AirCylinder.xCmdManualTarget, PT := T#10ms); IF #Time[10].Q THEN #AirCylinder.xCmdAutoInitial := FALSE; #AirCylinder.xCmdAutoTarget := FALSE; #AirCylinder.xCmdManualInitial := FALSE; #AirCylinder.xCmdManualTarget := FALSE; END_IF; //========================== 6. 默认安全值 ========================== #AirCylinder.xCmdSafety := TRUE;作者:邓工
项目:多工站自动装配线
控制平台:西门子 S7-1514SP-2 PN + TIA Portal
编程学习
技术分享
实战经验