西门子PLC程序模板:电机控制功能块 FB_Motor 实战拆解

西门子PLC程序模板:电机控制功能块 FB_Motor 实战拆解

西门子PLC程序模板:电机控制功能块 FB_Motor 实战拆解

邓工 · 2026-07-04 · #西门子PLC #S7-1500 #FB_Motor #电机控制 #TIA Portal

电机统一调用FB_Motor(FB6051,归属 05Motor 功能段)。与气缸块、真空块共用同一套 CM 层模板,手自动分离 + 正反转互锁 + 输出延时封装在块内部。

层级划分:UNIT(工站)EM(设备模块)CM(控制模块)。FB_Motor 属于 CM 层,ST_Motor结构体传 Cmd。


一、接口一览

方向变量说明
InputManual_Auto手自动切换
OutputStart电机运行总启动
Start_CW电机正转启动
Start_CCW电机反转启动
InOutMotorST_Motor 结构体

二、ST_Motor 结构体

Cmd 集中管理,HMI 写 Cmd,程序读 Output。

成员说明
xCmdManualCW手动正转命令
xCmdManualCCW手动反转命令
xCmdAutoCW自动正转命令
xCmdAutoCCW自动反转命令
xCmdToStop停止命令

三、5 个关键设计

  1. 手自动分离:Manual_Auto 选择命令源,手动指令和自动指令独立接收
  2. 正反转互锁:CW 和 CCW 命令互斥,脉冲触发复位反向命令
  3. 停止命令优先:xCmdToStop 复位所有方向命令
  4. 输出 50ms 延时滤波:Start / Start_CW / Start_CCW 经过 TON 延时,避免接触器抖动
  5. IO 只出现在块调用:FB 内部不引用 IO 地址,所有输出通过接口传递

四、多重背景 DB + 块调用

所有电机实例集中放DB_电机 [DB3060],多重背景 DB,按工站工艺命名:

D001_托盘进料电机 D001_前载具升降平台电机 D001_段1上层输送电机 D001_段1下层输送电机 D002_按键振动盘电机 D002_按键输送电机 D003_段2上层输送电机 D003_段2下层输送电机 ...

IO 只出现在块调用,FB 内部不引用 IO 地址。

块调用参数

FB: FB_Motor Instance: D001_托盘进料电机 Manual_Auto := %I0.2 // 手自动切换 Start := Q_托盘进料电机_运行 // 电机运行总启动 Start_CW := Q_托盘进料电机_正转 // 电机正转 Start_CCW := Q_托盘进料电机_反转 // 电机反转 Motor := DB_电机.D001_托盘进料电机

五、HMI 映射

结构体统一,HMI 不需要为每个电机单独建变量:

按钮置位: DB_电机.电机名_xCmdManualCW / _xCmdManualCCW DB_电机.电机名_xCmdToStop

HMI 工程师记住一个 DB 命名规则,所有电机画面复制改实例名即可。


六、并行开发流程

IO 表定了 → 硬件接线 + 写程序同步进行:

  1. 电气出 IO 地址分配表
  2. 程序员按 FB 接口对 IO 地址
  3. 联调时两边基本同步

**前提:**FB 接口定好就不改。新需求加新 FB,不加老接口。


七、要点总结

电机块与气缸块、真空块共用同一套 CM 层设计框架。结构体 + Cmd + 手自动分离是模板基础,正反转互锁和输出延时封装在块内部,上层只需发命令,不用管电机怎么转。


设计分析

亮点

  1. 正反转互锁封装:CW/CCW 命令互斥逻辑在块内完成,上层程序不会同时输出正转和反转,避免接触器短路或变频器报警。
  2. 与气缸/真空块框架一致:ST_Motor 命名规则、命令结构、手自动分离与现有模板对齐,HMI 复制改实例名即可。
  3. 输出延时滤波:50ms TON 延时避免接触器/变频器启动抖动,对输送带、振动盘这类频繁启停的电机尤其有用。

优化方向

  1. ST_Motor 缺少状态位:只有 Cmd 没有 Sts,HMI 想做"运行中/故障中"状态需要额外组态输出点,建议增加 xStsRunning、xStsError。
  2. 50ms 延时一刀切:不同功率电机启动特性不同,建议把延时时间做成接口参数,而不是写死在程序里。
  3. 停止命令时序依赖:xCmdToStop 直接复位方向命令,如果外部命令持续置位,停止后可能立即重新启动,建议增加停止优先锁存。

完整 SCL 源码()

(* ========================= 功能描述:电机控制 ========================= *) // 停止命令优先,复位所有方向命令 IF #Motor.xCmdToStop THEN #Motor.xCmdManualCW := FALSE; #Motor.xCmdManualCCW := FALSE; #Motor.xCmdAutoCW := FALSE; #Motor.xCmdAutoCCW := FALSE; END_IF; // 手动/自动正反转互锁 #P[0](CLK := #Motor.xCmdManualCW); #P[1](CLK := #Motor.xCmdManualCCW); #P[2](CLK := #Motor.xCmdAutoCW); #P[3](CLK := #Motor.xCmdAutoCCW); IF #P[0].Q THEN #Motor.xCmdManualCCW := FALSE; END_IF; IF #P[1].Q THEN #Motor.xCmdManualCW := FALSE; END_IF; IF #P[2].Q THEN #Motor.xCmdAutoCCW := FALSE; END_IF; IF #P[3].Q THEN #Motor.xCmdAutoCW := FALSE; END_IF; // 电机运行总启动(50ms 延时滤波) #Time[0](IN := ((NOT #Manual_Auto AND (#Motor.xCmdManualCW OR #Motor.xCmdManualCCW)) OR (#Manual_Auto AND (#Motor.xCmdAutoCW OR #Motor.xCmdAutoCCW))), PT := T#50MS); #Start := #Time[0].Q; // 电机正转启动(50ms 延时滤波) #Time[1](IN := ((NOT #Manual_Auto AND #Motor.xCmdManualCW) OR (#Manual_Auto AND #Motor.xCmdAutoCW)), PT := T#50MS); #Start_CW := #Time[1].Q; // 电机反转启动(50ms 延时滤波) #Time[2](IN := ((NOT #Manual_Auto AND #Motor.xCmdManualCCW) OR (#Manual_Auto AND #Motor.xCmdAutoCCW)), PT := T#50MS); #Start_CCW := #Time[2].Q; // 停止命令自复位 IF #Motor.xCmdToStop AND NOT #Motor.xCmdManualCW AND NOT #Motor.xCmdManualCCW AND NOT #Motor.xCmdAutoCW AND NOT #Motor.xCmdAutoCCW THEN #Motor.xCmdToStop := FALSE; END_IF;

完整梯形图程序




作者:邓工
项目:多工站自动装配线
控制平台:西门子 S7-1514SP-2 PN + TIA Portal