1. 项目背景与核心价值
去年在给一家包装机械厂做自动化改造时,遇到了一个典型的伺服定位控制需求。客户需要在3米长的传送带上实现±0.1mm的定位精度,这让我不得不重新审视PLC脉冲控制方案的细节实现。西门子S7-1200作为中型PLC的性价比之王,其内置的PTO(脉冲串输出)功能配合伺服驱动器,正好能满足这类中低端设备的定位需求。
这个案例完整展示了从硬件配置到软件实现的全部过程,包含梯形图(LAD)和SCL两种编程方式。特别适合刚接触运动控制的工程师参考,其中关于电子齿轮比的计算、原点回归的优化处理等细节,都是我在多个现场项目积累的实战经验。
2. 硬件配置与接线规范
2.1 系统组成清单
- PLC:S7-1214C DC/DC/DC(6ES7 214-1AG40-0XB0)
- 伺服系统:台达ASDA-B2系列750W伺服套装
- HMI:KTP700 Basic PN
- 编码器:17位绝对值型(配套伺服电机)
2.2 关键接线要点
PLC与伺服的脉冲接线必须采用双绞屏蔽线(推荐型号:Belden 8761),接线时注意:
- 脉冲信号(Q0.0/Q0.2)接伺服PULS+/PULS-
- 方向信号(Q0.1/Q0.3)接伺服SIGN+/SIGN-
- 屏蔽层单端接地(建议接伺服侧)
- 信号线与其他动力线保持至少10cm间距
重要提示:曾有个项目因屏蔽层处理不当导致脉冲丢失,表现为定位时偶尔出现±3mm的随机偏差。后来改用金属压接式屏蔽接头后问题彻底解决。
2.3 PLC硬件组态
在TIA Portal中需进行以下关键设置:
- 在设备视图里启用PTO1/PTO2
- 脉冲输出类型选择"PTO(脉冲A和方向B)"
- 基准频率设置为100kHz(对应5μs的脉冲周期)
- 勾选"启用硬件门"功能
3. 伺服参数核心配置
3.1 基本参数表
| 参数编号 | 参数名称 | 设定值 | 说明 |
|---|---|---|---|
| P1-01 | 控制模式 | 1 | 位置模式 |
| P1-44 | 电子齿轮比分子 | 10000 | 与PLC侧设置保持一致 |
| P1-45 | 电子齿轮比分母 | 1 | |
| P2-10 | 位置指令滤波 | 3 | 中等级滤波 |
| P2-15 | 伺服刚性 | 12 | 根据机械特性调整 |
3.2 电子齿轮比计算
假设:
- 伺服电机编码器分辨率:131072 pulse/rev
- 机械减速比:10:1
- 丝杠导程:10mm
则电子齿轮比 = (目标脉冲数/转) / 编码器分辨率
= (10000 pulse/rev) / 131072 ≈ 10000:131072
简化后设为10000:131072(分子分母可约分为15625:2048)
经验分享:实际项目中建议将分子设为10000的整数倍,方便后续计算。我曾遇到过分母质因数过大导致脉冲分配不均的情况,后来统一采用"万分之一毫米"作为位置单位基准。
4. 梯形图编程实现
4.1 运动控制指令块
scl复制// 轴配置
"轴_DB".Config.PTO := 1; // 使用PTO1
"轴_DB".Config.UnitPos := 1000; // 1脉冲=1μm
// 点动控制
"MC_MoveJog"(
Axis := "轴_DB",
JogForward := "正转按钮",
JogBackward := "反转按钮",
Velocity := 500.0, // 500mm/s
Acceleration := 1000.0,
Deceleration := 1000.0);
4.2 原点回归逻辑
梯形图中需要实现三级原点回归:
- 高速寻找Z相(10mm/s)
- 低速精确定位(1mm/s)
- 编码器Z脉冲捕获
关键技巧:在近点信号触发后,插入2ms的延时再启动低速搜索,可避免机械振动导致的误触发。这个细节在官方手册中从未提及,是我们通过示波器抓包发现的优化点。
5. SCL高级编程技巧
5.1 运动曲线生成算法
scl复制// S形速度曲线计算
FUNCTION "CalcScurveSpeed" : REAL
VAR_INPUT
CurrentPos : REAL;
TargetPos : REAL;
MaxSpeed : REAL;
Accel : REAL;
END_VAR
VAR_TEMP
Distance : REAL;
T_acc : REAL;
END_VAR
BEGIN
Distance := ABS(TargetPos - CurrentPos);
T_acc := MaxSpeed / Accel;
// 判断是否达到最大速度
IF Distance > (Accel * T_acc * T_acc) THEN
"CalcScurveSpeed" := MaxSpeed;
ELSE
"CalcScurveSpeed" := SQRT(2 * Accel * Distance);
END_IF;
END_FUNCTION
5.2 多轴插补实现
通过SCL的数组运算可实现简单的直线插补:
scl复制// 二维插补计算
FOR #i := 0 TO 99 DO
Axis1_Pos[#i] := StartPos1 + (TargetPos1 - StartPos1) * #i / 100;
Axis2_Pos[#i] := StartPos2 + (TargetPos2 - StartPos2) * #i / 100;
"MC_MoveAbsolute"(Axis := Axis1_DB, Position := Axis1_Pos[#i]);
"MC_MoveAbsolute"(Axis := Axis2_DB, Position := Axis2_Pos[#i]);
WAIT UNTIL "MC_ReadStatus"(Axis1_DB).InPosition AND
"MC_ReadStatus"(Axis2_DB).InPosition;
END_FOR;
6. 调试与故障排查
6.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机抖动不转 | 脉冲方向信号接反 | 交换PULS+/PULS-接线 |
| 定位偏差累积 | 电子齿轮比计算错误 | 重新核对机械传动比 |
| 高速时丢步 | 脉冲频率超过伺服接收能力 | 降低PLC输出频率或换差分输入 |
| 原点回归位置不一致 | 近点信号受干扰 | 加磁环滤波器 |
6.2 关键信号测量
使用示波器检查以下信号质量:
- 脉冲信号上升沿时间(应<500ns)
- 脉冲-方向信号时序(方向信号应提前脉冲至少1μs)
- 电源纹波(24V电源峰峰值应<200mV)
去年调试某项目时,发现伺服在300rpm以上就会出现随机位置偏移。最终发现是PLC的24V电源负载能力不足,导致脉冲信号幅值下降。更换为独立开关电源后问题解决。
7. 程序架构优化建议
7.1 模块化设计
建议将运动控制功能封装为以下FB块:
- FB_AxisBasic:基础点动/定位功能
- FB_AxisHoming:原点回归流程
- FB_AxisTeach:示教位置存储
- FB_AxisMonitor:实时状态监测
7.2 安全逻辑处理
急停电路必须采用独立硬线回路,同时在程序中实现:
scl复制IF "急停触发" THEN
"MC_Halt"(Axis := ALL_AXIS);
"MC_Reset"(Axis := ALL_AXIS);
"轴使能" := FALSE;
END_IF;
在多个汽车零部件项目中,我们额外增加了安全扭矩关闭(STO)功能。当光栅被触发时,不仅停止脉冲输出,还会通过安全继电器切断伺服驱动器的动力电源。