1. 项目背景与核心需求
去年接手了一个自动化产线改造项目,需要用到西门子S7-1200 PLC同时控制5台伺服电机。这个项目最让我头疼的是需要实现三种控制模式:脉冲定位、速度模式和扭矩模式的无缝切换。更麻烦的是,产线要求设备断电后能记住各轴位置,恢复供电后能继续运行——这对伺服控制程序的稳定性提出了很高要求。
整个系统架构是这样的:S7-1200 PLC通过PTO脉冲控制伺服驱动器,同时通过维纶MT8071IE触摸屏实现人机交互。在软件层面,我采用TIA Portal V15.1进行PLC编程,用EasyBuilder Pro设计HMI界面。这种组合在中小型自动化项目中很常见,性价比高且稳定可靠。
2. 硬件配置与接线要点
2.1 PLC选型与伺服配置
我选用的是S7-1214C DC/DC/DC型号,主要考虑:
- 需要5个高速脉冲输出(PTO),该型号有6个100kHz高速输出点
- 14点数字量输入/10点输出满足基础IO需求
- 2个模拟量输入用于扭矩反馈监测
伺服驱动器选用的是台达ASD-A2系列,支持脉冲/模拟量双输入。这里有个关键细节:脉冲控制模式下,PLC的PTO输出需要接入驱动器的PULSE+和PULSE-端子,方向信号接SIGN+和SIGN-。如果接线反了,电机会朝相反方向运行。
重要提示:务必在驱动器端设置正确的电子齿轮比。我遇到过因为齿轮比计算错误导致实际移动距离与设定值偏差的问题。计算公式为:
电子齿轮比 = (电机每转脉冲数 × 机械减速比) / (期望的每转脉冲数)
2.2 断电保持方案设计
要实现断电位置记忆,我采用了三重保障:
- PLC的保持存储器设置:在DB块属性中勾选"Non-retain"选项
- 伺服驱动器的绝对值编码器功能(需选用支持ABS的伺服电机)
- 外加UPS电源确保突发断电时有足够时间保存数据
实际测试发现,仅靠PLC的保持存储器在长时间断电后可能丢失数据。后来增加了每天定时将关键数据写入PLC的SIMATIC存储卡的功能,彻底解决了这个问题。
3. 软件架构设计
3.1 程序模块化分解
整个程序采用"洋葱式"分层架构:
- 最底层是硬件抽象层(HAL):包含PTO控制、IO映射等基础功能
- 中间是运动控制层:实现定位、速度、扭矩三种模式
- 上层是工艺逻辑层:处理自动流程、报警管理等
每个伺服轴对应一个FB功能块实例,通过背景数据区实现数据隔离。例如轴1的定位控制这样调用:
st复制// 轴1定位控制
"Axis1_Positioning"(
Execute := "Start_Cmd",
Position := 1000.0, // 目标位置1000mm
Velocity := 500, // 速度500mm/s
Done => "Axis1_Done",
Busy => "Axis1_Busy");
3.2 三种控制模式实现
3.2.1 脉冲定位模式
使用S7-1200内置的PTO功能块"CTRL_PTO",关键参数配置:
st复制// PTO初始化
"PTO_Config"(
Axis := "Axis1",
HardwareInterface := "Pulse1",
DirectionInterface := "Dir1",
EnableInterface := "Enable1",
Error => "PTO_Error");
定位过程采用S曲线加减速算法,避免机械冲击。通过修改加减速时间参数可以调整运动平滑度:
st复制"MC_MoveAbsolute"(
Axis := "Axis1",
Position := 1000.0,
Velocity := 500.0,
Acceleration := 1000.0, // 加速度
Deceleration := 1000.0, // 减速度
Jerk := 5000.0); // 加加速度
3.2.2 速度模式
通过模拟量输出控制转速,需要做以下处理:
- 在PLC中配置模拟量输出通道(0-10V对应0-3000rpm)
- 驱动器侧设置速度控制模式(参数P1-01=2)
- 增加速度限制和斜坡功能
st复制// 速度模式控制
IF "Speed_Mode_Active" THEN
"Analog_Output" := INT_TO_REAL("Target_Speed") / 3000.0 * 27648.0;
END_IF;
3.2.3 扭矩模式
扭矩控制最复杂的是单位转换:
- PLC侧:0-27648对应0-10V
- 驱动器侧:0-10V对应0-额定扭矩(如20Nm)
- 需要根据机械传动比换算实际扭矩值
st复制// 扭矩控制计算
"Torque_Output" := "Target_Torque" / 20.0 * 27648.0;
4. 触摸屏界面开发
4.1 画面布局设计
维纶触摸屏使用EasyBuilder Pro开发,主要界面包括:
- 主监控画面:显示5个轴的实时位置、速度、状态
- 参数设置画面:可修改各轴的运动参数
- 手动操作画面:用于调试和维修
- 报警历史画面:记录最近100条报警信息
关键技巧:在画面切换时添加0.5秒延时,避免快速切换导致通信堵塞。同时设置重要参数(如原点位置)需要二级密码确认。
4.2 PLC与HMI数据交互
建立了一个专门的DB块"HMI_Data"用于通信:
- 输入区(HMI→PLC):控制命令、参数设置
- 输出区(PLC→HMI):状态反馈、实时数据
- 报警区:32位报警代码
例如手动控制按钮的地址映射:
st复制// HMI按钮地址
"Manual_Mode_Btn" := "HMI_Data".Inputs.Byte0.0;
5. 调试经验与问题排查
5.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不动作 | 1. 使能信号未接通 2. 驱动器报警 3. 脉冲方向信号接反 |
1. 检查PLC输出点 2. 查看驱动器报警代码 3. 用万用表测量脉冲信号 |
| 位置偏差大 | 1. 电子齿轮比错误 2. 机械传动松动 3. 负载过大导致丢步 |
1. 重新计算齿轮比 2. 检查联轴器和导轨 3. 适当增大伺服增益 |
| 切换模式时抖动 | 1. 模式切换时序不当 2. 参数突变 |
1. 增加50ms延时 2. 添加参数渐变功能 |
5.2 关键调试技巧
-
示波器法:用示波器同时捕捉脉冲信号和方向信号,可以直观看到脉冲数量和频率是否符合预期。我常用这个方法来验证电子齿轮比设置是否正确。
-
分段调试法:先单独测试每个轴的基本功能,再逐步增加联动逻辑。特别是多轴同步运动时,一定要先验证单轴性能。
-
安全保护:在手动调试时,我习惯在程序中添加软件限位和速度限制。曾经因为忘记加限位,导致调试时电机超程撞到机械挡块。
这个项目最终稳定运行后,我把核心功能块做成了标准化库,后续又用在了3个类似项目上。特别是断电保持方案,经过多次优化现在已经成为我的标准配置。对于需要同时控制多个伺服轴的项目,模块化设计和分层架构确实能大幅提高开发效率和可靠性。