1. 项目背景与核心需求
去年接手的一个自动化产线改造项目,需要用到西门子S7-1200 PLC同时控制5台伺服电机。这个案例的特殊之处在于:不仅要用到常规的脉冲定位控制,还需要在运行过程中动态切换速度模式和扭矩模式。这种多模式混合控制在实际产线上很常见——比如物料搬运时需要精确定位(脉冲模式),传送时需要恒定速度(速度模式),装配时需要恒定压力(扭矩模式)。
项目难点在于:
- 多轴协同控制时的时序配合问题
- 模式切换时的平滑过渡处理
- 异常情况下的安全保护机制
- 程序架构要便于后期维护扩展
2. 硬件配置方案
2.1 核心设备选型
经过比选最终确定的硬件配置:
- PLC:西门子S7-1215C DC/DC/DC
- 选型理由:4个高速脉冲输出口(最大100kHz)+1个扩展信号板SB1223提供第5路脉冲输出
- 伺服系统:台达ASDA-B3系列
- 支持脉冲/速度/扭矩三模式切换
- 20bit编码器分辨率
- HMI:威纶通MT8102IE
- 10.1寸屏,支持与S7-1200直接以太网通讯
2.2 电气接线要点
脉冲控制接线特别注意:
- 采用差分信号(PULSE+/PULSE-)传输,抗干扰能力更强
- 信号线必须使用双绞屏蔽线(如BELDEN 8761)
- 屏蔽层单端接地(PLC侧接地)
- 信号线长度不超过15米时可不加终端电阻
重要提示:伺服驱动器的电源端子(L1/L2/L3)必须加装噪声滤波器,我们选用schaffner FN2070系列,可有效抑制高频干扰导致的脉冲丢失问题。
3. 软件架构设计
3.1 程序结构规划
采用模块化设计思想,将系统分解为:
code复制Project
├── OB1(主循环)
├── OB35(100ms定时中断)
├── DB_Global(全局数据块)
├── FB_AxisCtrl(轴控制功能块)
├── FB_Cylinder(气缸控制功能块)
├── FC_Alarm(报警处理函数)
└── FC_HMI(人机交互函数)
3.2 轴控制功能块详解
以FB_AxisCtrl为例,关键接口参数:
pascal复制// 输入参数
VAR_INPUT
Enable : BOOL; // 使能信号
Mode : INT; // 1=脉冲 2=速度 3=扭矩
Position : REAL; // 目标位置(mm)
Velocity : REAL; // 运行速度(mm/s)
Torque : REAL; // 目标扭矩(%)
END_VAR
// 输出参数
VAR_OUTPUT
ActualPos : REAL; // 实际位置
Status : WORD; // 状态字
Alarm : WORD; // 报警代码
END_VAR
3.2.1 脉冲定位实现
关键代码段:
pascal复制IF Mode = 1 THEN // 脉冲模式
// 单位换算:1mm = 1000脉冲(根据机械参数调整)
TargetPulse := Position * 1000;
// 启动定位运动
"PTO_CTRL"(
ENABLE := Enable,
RUN := StartCmd,
POSITION := TargetPulse,
VELOCITY := Velocity * 1000, // mm/s转脉冲/s
ACCEL := 50000, // 加速度(pulse/s²)
DECEL := 50000); // 减速度
// 读取实际位置
ActualPos := "PTO_STATUS".ACT_POS / 1000;
END_IF
3.2.2 模式切换处理
模式切换时需要特别注意:
- 必须先停止当前运动
- 等待轴完全停止(检测速度=0)
- 延时10ms再切换模式
- 新模式下先低速启动
pascal复制// 模式切换处理
IF OldMode <> Mode THEN
// 停止当前运动
"PTO_CTRL".RUN := FALSE;
// 等待停止
IF "PTO_STATUS".SPEED = 0 THEN
// 延时处理
IF DelayTimer.Q = FALSE THEN
DelayTimer(IN := TRUE, PT := T#10MS);
ELSE
// 执行模式切换
CASE Mode OF
2: // 切换到速度模式
"MC_MoveVelocity"(
ENABLE := TRUE,
VELOCITY := Velocity * 0.1); // 初始低速
3: // 切换到扭矩模式
"MC_TorqueControl"(
ENABLE := TRUE,
TORQUE := Torque * 0.5); // 初始半扭矩
END_CASE;
OldMode := Mode;
DelayTimer(IN := FALSE);
END_IF;
END_IF;
END_IF;
4. 关键功能实现
4.1 断电位置保持方案
采用两种方式确保断电不丢位置:
- PLC数据保持:在DB块属性中勾选"Retain"
- 伺服驱动器备份:通过伺服EEPROM保存当前位置
具体实现:
pascal复制// 在OB35中周期保存位置
IF "PTO_STATUS".BUSY = FALSE THEN
RetainDB.ActualPos[AxisNo] := ActualPos;
END_IF;
// 上电初始化时恢复位置
IF FirstScan THEN
ActualPos := RetainDB.ActualPos[AxisNo];
"MC_SetPosition"(POSITION := ActualPos * 1000);
END_IF;
4.2 报警分级处理
将报警分为三级:
- 轻微报警(代码1-99):仅提示,不影响运行
- 一般报警(代码100-199):暂停当前轴
- 严重报警(代码200-255):急停所有轴
报警处理逻辑:
pascal复制CASE AlarmCode OF
101: // 超限位报警
AxisStop(AxisNo);
HMI_AlarmMsg := 'Axis '+INT_TO_STRING(AxisNo)+' limit switch triggered';
201: // 编码器故障
EmergencyStop;
HMI_AlarmMsg := 'Axis '+INT_TO_STRING(AxisNo)+' encoder error';
END_CASE;
5. 调试经验分享
5.1 脉冲丢失问题排查
现象:偶尔出现定位不准
排查步骤:
- 用示波器检查脉冲信号质量
- 发现干扰脉冲(幅值不足)
- 解决方案:
- 缩短脉冲线长度(从20m改为10m)
- 增加终端电阻(120Ω)
- 调整PLC输出脉冲宽度从1μs改为2μs
5.2 模式切换抖动优化
现象:速度/扭矩模式切换时出现机械振动
优化方案:
- 在切换前加入50ms的零速过渡
- 修改伺服参数Pn302(速度环增益)从100调整为80
- 增加加速度滤波时间Pn306从0ms改为5ms
实测效果:振动幅度减少70%
6. 程序优化技巧
6.1 功能块复用设计
将通用功能封装成可调用的块:
pascal复制// 轴回零功能块
FB_HomeSearch : FB_MC_Home;
// 调用示例
FB_HomeSearch(
Execute := HomeCmd,
Position := 0.0,
Velocity := 10.0);
6.2 库文件管理建议
-
按功能分类建库:
- MotionControl_Lib(运动控制)
- IO_Lib(IO处理)
- Safety_Lib(安全功能)
-
版本控制:
- 在库属性中添加版本注释
- 如:V1.0.0_20240520_AddTorqueControl
7. 上位机交互设计
7.1 威纶通画面规划
主要画面:
- 主监控画面:显示5轴实时位置/速度曲线
- 参数设置画面:可修改各轴运动参数
- 手动操作画面:提供点动/回零等功能键
- 报警历史画面:记录最近100条报警
7.2 关键通讯设置
-
在博图中配置连接参数:
- IP地址:192.168.1.100
- 机架号:0
- 插槽号:1
-
威纶通侧设置:
- 添加S7-1200驱动
- 设置相同的IP和PLC参数
- 测试通讯字节:DB1.DBW0
8. 项目总结
这个案例成功实现了:
- 5轴伺服的高精度同步控制(定位误差<0.1mm)
- 三种运行模式的动态切换
- 完善的故障保护机制
- 可扩展的程序架构
特别提醒:在多轴控制时,一定要做好接地和屏蔽,我们曾经因为接地不良导致编码器反馈异常,花了三天时间才排查出来。建议:
- 所有设备共地
- 信号线与动力线分开走线槽
- 关键信号用示波器实测验证
程序已在GitHub开源(搜索"S7-1200-5Axis-Servo-Control"),包含完整的博图项目文件和威纶通画面程序。在实际应用中,需要根据具体机械参数调整脉冲当量和运动曲线参数。