1. 项目背景与核心价值
作为一名在工业自动化领域摸爬滚打多年的电气工程师,我深知伺服定位控制在产线设备中的重要性。三菱FX5U系列PLC凭借其出色的运动控制性能和友好的编程环境,已成为中小型自动化项目的首选控制器。这次分享的案例,是我在去年为某包装设备生产线开发的伺服控制程序,经过6个月的实际运行验证,已稳定控制32台伺服电机完成超过200万次定位动作。
这个案例的特殊之处在于完全采用ST(结构化文本)语言配合FB(功能块)的编程方式。相比传统的梯形图编程,这种写法在复杂运动控制场景中展现出三大优势:
- 程序结构更清晰,逻辑表达更接近高级语言
- 功能模块化程度高,复用性强
- 便于团队协作开发和后期维护
提示:对于刚接触ST语言的电工朋友,建议先掌握基本语法结构再尝试本案例,避免陷入"看得懂但不会写"的困境。
2. 硬件架构与信号配置
2.1 系统组成清单
本案例的硬件配置方案经过多次优化,最终确定的性价比方案如下表所示:
| 设备类型 | 型号 | 数量 | 备注 |
|---|---|---|---|
| PLC主机 | FX5U-32MT/ES | 1台 | 基本单元,晶体管输出 |
| 伺服驱动器 | MR-JE-40A | 4台 | 每台驱动1台伺服电机 |
| 伺服电机 | HG-KN43J-S100 | 4台 | 400W,22bit绝对值编码器 |
| 扩展模块 | FX5-16EX/ES | 1块 | 输入扩展 |
| HMI设备 | GS2107-WTBD | 1台 | 7寸触摸屏 |
2.2 关键信号分配
伺服控制的核心信号配置需要特别注意抗干扰处理,我们的实际接线方案如下:
-
脉冲输出通道:
- Y0/Y1:控制1号轴脉冲+方向
- Y2/Y3:控制2号轴脉冲+方向
- Y4/Y5:控制3号轴脉冲+方向
- Y6/Y7:控制4号轴脉冲+方向
-
伺服状态反馈:
- X0~X3:各轴伺服READY信号
- X4~X7:各轴定位完成信号
- X10~X13:各轴报警信号
-
急停与安全回路:
- X14:总急停信号
- X15:安全门信号
- X16:复位按钮输入
注意:脉冲线必须使用双绞屏蔽线(如MR-JCCBL3M),屏蔽层单端接地,避免信号干扰导致定位偏差。
3. 软件架构设计
3.1 程序结构树
整个项目的程序组织采用分层模块化设计,这是经过多个项目验证的高效结构:
code复制MAIN_PROGRAM(主程序)
├── INIT_FB(初始化功能块)
├── SERVO_CTRL_FB(伺服控制功能块)
├── POS_CALC_FB(位置计算功能块)
├── ALARM_FB(报警处理功能块)
└── HMI_COM_FB(HMI通信功能块)
3.2 核心功能块详解
3.2.1 SERVO_CTRL_FB功能块
这是最核心的功能模块,封装了伺服控制的所有基础操作:
st复制FUNCTION_BLOCK SERVO_CTRL_FB
VAR_INPUT
Axis_No : INT; // 轴号(1-4)
Cmd_Pos : DINT; // 目标位置
Velocity : UDINT; // 运行速度
Accel : UDINT; // 加速度
END_VAR
VAR_OUTPUT
CurrentPos : DINT; // 当前位置
Status : WORD; // 状态字
END_VAR
VAR
// 内部变量
bBusy : BOOL;
iErrorCode : INT;
END_VAR
实现的关键算法包括:
- S型速度曲线规划
- 电子齿轮比动态计算
- 软极限保护机制
3.2.2 POS_CALC_FB功能块
负责处理复杂的多轴联动位置计算:
st复制FUNCTION_BLOCK POS_CALC_FB
VAR_INPUT
Mode : INT; // 计算模式
Param1 : REAL; // 参数1
Param2 : REAL; // 参数2
END_VAR
VAR_OUTPUT
OutPos : ARRAY[1..4] OF DINT; // 各轴输出位置
END_VAR
支持的计算模式包括:
- 直线插补
- 圆弧插补
- 点位变换
4. 关键程序实现
4.1 伺服初始化流程
正确的初始化是稳定运行的前提,我们的标准流程如下:
-
硬件初始化:
st复制// 设置脉冲输出参数 SET_PULSE_CONFIG(Axis:=1, Mode:=0, Unit:=0); SET_PULSE_OUTPUT(Axis:=1, Pulse:=Y0, Dir:=Y1); -
伺服参数写入:
st复制// 设置伺服基本参数 SERVO_WRITE_PARAM(Axis:=1, Addr:=H0000, Data:=16#0001); SERVO_WRITE_PARAM(Axis:=1, Addr:=H0001, Data:=16#0000); -
原点回归操作:
st复制// 执行原点回归 HOME_RETURN(Axis:=1, Method:=3, Speed:=50000);
4.2 运动控制程序示例
以下是典型的点位运动控制代码片段:
st复制// 实例化功能块
Servo1 : SERVO_CTRL_FB;
PosCalc : POS_CALC_FB;
// 主程序调用
IF bStart THEN
PosCalc(
Mode := 1,
Param1 := 100.0,
Param2 := 50.0
);
Servo1(
Axis_No := 1,
Cmd_Pos := PosCalc.OutPos[1],
Velocity := 100000,
Accel := 5000
);
END_IF;
5. 调试技巧与问题排查
5.1 常见问题速查表
根据现场经验整理的典型问题解决方案:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 伺服不启动 | 1. 使能信号未接通 2. 驱动器报警 |
1. 检查Y输出信号 2. 查看驱动器错误代码 |
| 定位偏差大 | 1. 机械传动间隙 2. 电子齿轮比错误 |
1. 调整机械部件 2. 重新计算齿轮比 |
| 运行中抖动 | 1. 增益参数不合适 2. 负载惯量比过大 |
1. 调整伺服增益 2. 检查机械安装 |
5.2 调试心得分享
-
参数整定技巧:
- 先调速度环,再调位置环
- 从低增益开始逐步增加
- 实际测试时准备急停开关
-
信号监测方法:
st复制// 在程序中添加调试变量 MonitorVar := Servo1.CurrentPos; -
HMI调试界面设计:
- 添加实时位置显示
- 提供手动JOG功能
- 显示当前报警信息
6. 工程优化建议
经过多个项目的迭代,总结出以下优化方向:
-
性能优化:
- 使用DINT类型存储位置数据
- 关键循环添加定时器限频
- 优化FB调用顺序
-
安全增强:
st复制// 添加软件限位保护 IF (CurrentPos > Pos_UpperLimit) OR (CurrentPos < Pos_LowerLimit) THEN EmergencyStop(); END_IF; -
扩展性设计:
- 预留10%的位置余量
- 采用参数化编程
- 添加版本控制注释
这个案例最让我自豪的是,原本需要外包的伺服控制程序,现在团队里的年轻工程师都能基于这个模板进行二次开发了。建议初学者可以从单轴控制开始,逐步扩展到多轴联动,过程中务必做好每个功能的单元测试。