西门子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。
一、接口一览
| 方向 | 变量 | 说明 |
|---|---|---|
| Input | Manual_Auto | 手自动切换 |
| Output | Start | 电机运行总启动 |
Start_CW | 电机正转启动 | |
Start_CCW | 电机反转启动 | |
| InOut | Motor | ST_Motor 结构体 |
二、ST_Motor 结构体
Cmd 集中管理,HMI 写 Cmd,程序读 Output。
| 成员 | 说明 |
|---|---|
xCmdManualCW | 手动正转命令 |
xCmdManualCCW | 手动反转命令 |
xCmdAutoCW | 自动正转命令 |
xCmdAutoCCW | 自动反转命令 |
xCmdToStop | 停止命令 |
三、5 个关键设计
- 手自动分离:Manual_Auto 选择命令源,手动指令和自动指令独立接收
- 正反转互锁:CW 和 CCW 命令互斥,脉冲触发复位反向命令
- 停止命令优先:xCmdToStop 复位所有方向命令
- 输出 50ms 延时滤波:Start / Start_CW / Start_CCW 经过 TON 延时,避免接触器抖动
- 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_电机.电机名_xCmdToStopHMI 工程师记住一个 DB 命名规则,所有电机画面复制改实例名即可。
六、并行开发流程
IO 表定了 → 硬件接线 + 写程序同步进行:
- 电气出 IO 地址分配表
- 程序员按 FB 接口对 IO 地址
- 联调时两边基本同步
**前提:**FB 接口定好就不改。新需求加新 FB,不加老接口。
七、要点总结
电机块与气缸块、真空块共用同一套 CM 层设计框架。结构体 + Cmd + 手自动分离是模板基础,正反转互锁和输出延时封装在块内部,上层只需发命令,不用管电机怎么转。
设计分析
亮点
- 正反转互锁封装:CW/CCW 命令互斥逻辑在块内完成,上层程序不会同时输出正转和反转,避免接触器短路或变频器报警。
- 与气缸/真空块框架一致:ST_Motor 命名规则、命令结构、手自动分离与现有模板对齐,HMI 复制改实例名即可。
- 输出延时滤波:50ms TON 延时避免接触器/变频器启动抖动,对输送带、振动盘这类频繁启停的电机尤其有用。
优化方向
- ST_Motor 缺少状态位:只有 Cmd 没有 Sts,HMI 想做"运行中/故障中"状态需要额外组态输出点,建议增加 xStsRunning、xStsError。
- 50ms 延时一刀切:不同功率电机启动特性不同,建议把延时时间做成接口参数,而不是写死在程序里。
- 停止命令时序依赖: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