
西门子PLC程序模板真空功能块 FB_Vacuum 实战拆解邓工 · 2026-07-04 · #西门子PLC #S7-1500 #FB_Vacuum #真空控制 #TIA Portal真空吸嘴统一调用FB_VacuumFB6021归属 03Valve 功能段。与气缸块共用同一套手动/自动分离框架增加破真空自动关闭和真空到位检测。层级划分UNIT工站→EM设备模块→CM控制模块。FB_Vacuum 属于 CM 层ST_Vacuum结构体传 Cmd/Sts。一、接口一览方向变量说明InputManual_Auto手自动切换Vacuum_OK真空到位传感器吸真空屏蔽真空传感器屏蔽破真开启预留超时报警时间动作最大允许时间吸真空时间吸真空建立时间破真空时间破真空持续时间调试模式手动命令直接映射IOOutputSolenoid_吸真空吸真空电磁阀Solenoid_破真空破真空电磁阀InOutVacuumST_Vacuum 结构体二、ST_Vacuum 结构体Cmd 和 Sts 严格分开HMI 写 Cmd程序读 Sts。成员说明xCmdSafety安全信号xCmdManualOpen / xCmdManualClose手动吸真空 / 手动破真空xCmdAutoOpen / xCmdAutoClose自动吸真空 / 自动破真空xStsOpenDone / xStsCloseDone吸真空完成 / 破真空完成xStsErrorOpen / xStsErrorClose吸真空报警 / 破真空报警三、5 个关键设计手自动分离Manual_Auto 选择命令源手动指令和自动指令独立接收破真空自动关闭破真空电磁阀打开后按破真空时间定时自动关闭不需上层程序做关断吸真空屏蔽无真空传感器时屏蔽位使能按吸真空时间定时判定到位调用接口不变超时报警吸真空/破真空命令发出超设定时间未到位 → 置位相应 xStsError调试模式直接映射 IO调试模式打开后 xStsOpenDone/xStsCloseDone 直接读 Vacuum_OK四、多重背景 DB 块调用所有真空吸嘴实例集中放DB_真空 [DB3050]多重背景 DB按工站工艺命名D001_取托盘真空 D001_R1真空1 D001_R1真空2 D001_R1真空3 D001_R1真空4 D002_取料吸盘-1真空 ...IO 只出现在块调用FB 内部不引用 IO 地址。块调用参数FB: FB_Vacuum Instance: D001_取托盘真空 Manual_Auto : %I0.2 // 手自动切换 Vacuum_OK : %I2.0 // 真空到位传感器 吸真空屏蔽 : FALSE // 真空传感器屏蔽 破真开启 : FALSE // 预留 超时报警时间 : T#5000ms // 动作最大允许时间 吸真空时间 : T#2000ms // 吸真空建立时间 破真空时间 : T#800ms // 破真空持续时间 调试模式 : FALSE // 调试模式 Solenoid_吸真空 : Q_取托盘真空_吸 // 吸真空电磁阀 Solenoid_破真空 : Q_取托盘真空_破 // 破真空电磁阀 Vacuum : DB_真空.D001_取托盘真空五、HMI 映射结构体统一HMI 不需要为每个吸嘴单独建变量指示灯绑定DB_真空.吸盘名_xStsOpenDone / _xStsCloseDone 按钮置位 DB_真空.吸盘名_xCmdManualOpen / _xCmdManualCloseHMI 工程师记住一个 DB 命名规则所有吸盘画面复制改实例名即可。六、并行开发流程IO 表定了 → 硬件接线 写程序同步进行电气出 IO 地址分配表程序员按 FB 接口对 IO 地址联调时两边基本同步**前提**FB 接口定好就不改。新需求加新 FB不加老接口。七、要点总结真空块与气缸块共用同一套 CM 层设计框架。结构体 Cmd/Sts 手自动分离 命令自复位是模板基础真空特有的破真空自动关闭封装在块内部上层无需关心。设计分析亮点破真空自动关闭破真空电磁阀按设定时间自动关断上层不用额外写关断逻辑。这是跟气缸块最核心的差异现场容易漏掉。结构体复用命名体系与气缸块一致HMI 工程师无需学习第二套变量规则。传感器屏蔽通用化与气缸块一样的屏蔽机制无真空传感器的工站直接复用调用接口不变。优化方向到位检测逻辑偏复杂Time[2]/Time[3] 的条件可简化为单一时间继电器当前写法增加阅读成本。超时后未自动关阀超时只置位报警位没有自动关闭电磁阀输出。可参考气缸块的写法超时后强制关阀。xStsCloseDone 复位时序到位段中先置位 xStsCloseDone 后又被吸真空信号强制清除存在一个周期的窗口期。完整 SCL 源码(* 功能描述真空吸嘴控制 *) //安全条件 #Vacuum.xCmdSafety : TRUE; //手动吸真空 IF #Vacuum.xCmdManualOpen AND NOT #Vacuum.xCmdManualClose AND #Vacuum.xCmdSafety AND NOT #Manual_Auto THEN #Solenoid_吸真空 : TRUE; #Solenoid_破真空 : FALSE; END_IF; //手动破真空 IF #Vacuum.xCmdManualClose AND NOT #Vacuum.xCmdManualOpen AND #Vacuum.xCmdSafety AND NOT #Manual_Auto THEN #Solenoid_吸真空 : FALSE; #Solenoid_破真空 : TRUE; END_IF; //自动吸真空 IF #Vacuum.xCmdAutoOpen AND NOT #Vacuum.xCmdAutoClose AND #Vacuum.xCmdSafety AND #Manual_Auto THEN #Solenoid_吸真空 : TRUE; #Solenoid_破真空 : FALSE; END_IF; //自动破真空 IF #Vacuum.xCmdAutoClose AND NOT #Vacuum.xCmdAutoOpen AND #Vacuum.xCmdSafety AND #Manual_Auto THEN #Solenoid_吸真空 : FALSE; #Solenoid_破真空 : TRUE; END_IF; //破真空自动关闭 #Time[9](IN : #Solenoid_破真空 TRUE, PT : #破真空时间); IF #Time[9].Q THEN #Solenoid_破真空 : FALSE; END_IF; IF #调试模式 FALSE THEN //吸真空完成信号 #Time[0](IN : #Solenoid_吸真空, PT : #吸真空时间); #Time[1](IN : (#吸真空屏蔽 FALSE AND #Vacuum_OK) OR (#吸真空屏蔽 TRUE AND #Time[0].Q), PT : T#1ms); IF #Time[1].Q THEN #Vacuum.xStsOpenDone : TRUE; ELSE #Vacuum.xStsOpenDone : FALSE; END_IF; //破真空完成信号 #Time[2](IN : #Solenoid_破真空 FALSE AND #Solenoid_吸真空 FALSE, PT : #破真空时间); #Time[3](IN : ((#吸真空屏蔽 FALSE AND #Vacuum_OK FALSE AND #Time[2].Q) OR (#吸真空屏蔽 TRUE AND #Time[2].Q)), PT : T#1ms); IF #Time[3].Q THEN #Vacuum.xStsCloseDone : TRUE; END_IF; IF #Solenoid_吸真空 THEN #Vacuum.xStsCloseDone : FALSE; END_IF; END_IF; IF #调试模式 TRUE THEN #Vacuum.xStsOpenDone : #Vacuum_OK; #Vacuum.xStsCloseDone : NOT #Vacuum_OK; END_IF; /////////////////////////////////ERROR///////////////////////////////////////// IF #调试模式 FALSE THEN //吸真空报警 #Time[4](IN : #Solenoid_吸真空 AND #Vacuum.xStsOpenDone FALSE, PT : #超时报警时间); IF #Time[4].Q THEN #Vacuum.xStsErrorOpen(吸真空报警) : TRUE; ELSE #Vacuum.xStsErrorOpen(吸真空报警) : FALSE; END_IF; //破真空报警 #Time[5](IN : #Solenoid_破真空 AND #Vacuum.xStsCloseDone FALSE, PT : #超时报警时间); IF #Time[5].Q THEN #Vacuum.xStsErrorClose(破真空报警) : TRUE; ELSE #Vacuum.xStsErrorClose(破真空报警) : FALSE; END_IF; END_IF; //自复位 #Time[10](IN : (#Vacuum.xCmdAutoOpen TRUE OR #Vacuum.xCmdAutoClose TRUE OR #Vacuum.xCmdManualOpen TRUE OR #Vacuum.xCmdManualClose TRUE), PT : T#10ms); IF #Time[10].Q THEN #Vacuum.xCmdAutoOpen : FALSE; #Vacuum.xCmdAutoClose : FALSE; #Vacuum.xCmdManualOpen : FALSE; #Vacuum.xCmdManualClose : FALSE; END_IF;作者邓工项目多工站自动装配线控制平台西门子 S7-1514SP-2 PN TIA Portal