1. 项目背景与核心价值
在工业自动化领域,PLC(可编程逻辑控制器)与伺服系统的协同控制一直是产线设备开发的核心技术难点。三菱FX5U作为中小型PLC的典型代表,其ST(结构化文本)和FB(功能块)编程方式能够显著提升复杂运动控制的开发效率。这个案例将展示如何利用这些高级编程语言实现伺服系统的精准控制。
伺服系统在自动化设备中负责执行高精度位置、速度和力矩控制,常见于机械手、CNC机床、包装机械等场景。传统梯形图编程在面对多轴协调运动时往往显得力不从心,而ST语言的结构化特性和FB的模块化优势,可以让工程师用更接近计算机编程的方式实现复杂逻辑。
2. 硬件配置与软件环境准备
2.1 基础硬件配置清单
- 三菱FX5U-32MT/ES PLC(晶体管输出型)
- MR-JE-40A伺服驱动器 + HG-KN43J-S100伺服电机
- 24V开关电源(给PLC和伺服驱动器供电)
- 伺服电机与驱动器配套编码器线、动力线
- 紧急停止按钮和必要的安全电路
重要提示:伺服驱动器的动力电源必须与PLC控制电源隔离,避免电气干扰。实际接线时务必参照官方手册的端子定义,错误的接线可能损坏设备。
2.2 软件环境搭建
- 安装GX Works3编程软件(建议版本1.050W或更高)
- 安装伺服设置软件MR Configurator2
- 准备USB转RS422转换器(用于PLC与电脑通信)
- 在GX Works3中新建FX5U工程,选择"结构化工程"类型
软件安装完成后需要进行关键设置:
- 在导航窗口的"参数"→"PLC参数"中,设置正确的CPU型号和I/O分配
- 在"模块参数"中添加伺服驱动器的定位模块参数
- 配置通信参数确保PLC能与伺服驱动器正常通信
3. ST语言编程实现基础定位控制
3.1 伺服轴参数结构化定义
TYPE Axis_Param : STRUCT Axis_No : INT; // 轴号 PulsePerRev : DINT; // 每转脉冲数 GearRatio : REAL; // 减速比 MaxSpeed : REAL; // 最大转速(rpm) AccelTime : TIME; // 加速时间(ms) DecelTime : TIME; // 减速时间(ms) END_STRUCT; END_TYPE VAR_GLOBAL X_Axis : Axis_Param := ( Axis_No := 1, PulsePerRev := 10000, GearRatio := 5.0, MaxSpeed := 300.0, AccelTime := T#500ms, DecelTime := T#500ms ); END_VAR3.2 基本定位功能块实现
FUNCTION_BLOCK FB_AxisControl VAR_INPUT Execute : BOOL; // 执行触发 Position : DINT; // 目标位置(脉冲) Speed : REAL; // 运行速度(rpm) Param : Axis_Param; // 轴参数 END_VAR VAR_OUTPUT Done : BOOL; // 完成标志 Busy : BOOL; // 忙标志 Error : WORD; // 错误代码 END_VAR VAR InternalState : INT; // 内部状态机 StartEdge : BOOL; // 上升沿检测 END_VAR // 主逻辑实现 IF Execute AND NOT StartEdge THEN StartEdge := TRUE; InternalState := 1; END_IF CASE InternalState OF 1: // 启动伺服 IF NOT MC_Power(Param.Axis_No, TRUE, TRUE) THEN Error := 16#1001; InternalState := 99; ELSE InternalState := 2; END_IF; 2: // 设置运动参数 MC_SetOverride(Param.Axis_No, Speed/Param.MaxSpeed); MC_SetAccelDecel(Param.Axis_No, Param.AccelTime, Param.DecelTime); InternalState := 3; 3: // 执行绝对定位 MC_MoveAbsolute(Param.Axis_No, Position, Speed, TRUE); InternalState := 4; 4: // 等待完成 IF MC_ReadStatus(Param.Axis_No).InPosition THEN Done := TRUE; InternalState := 0; END_IF; 99: // 错误处理 MC_Reset(Param.Axis_No); InternalState := 0; END_CASE IF NOT Execute THEN StartEdge := FALSE; END_IF Busy := (InternalState > 0); END_FUNCTION_BLOCK4. 功能块的实际调用与参数配置
4.1 主程序调用示例
PROGRAM MAIN VAR Axis1_Ctrl : FB_AxisControl; ManualStart : BOOL; TargetPos : DINT := 50000; RunSpeed : REAL := 200.0; END_VAR // 轴控制功能块调用 Axis1_Ctrl( Execute := ManualStart, Position := TargetPos, Speed := RunSpeed, Param := X_Axis ); // 状态监控 IF Axis1_Ctrl.Done THEN // 定位完成处理逻辑 ELSIF Axis1_Ctrl.Error <> 0 THEN // 错误处理逻辑 END_IF; END_PROGRAM4.2 关键参数设置要点
电子齿轮比计算:
电子齿轮比 = (电机每转脉冲数 × 机械减速比) / (负载移动单位距离对应的脉冲数)例如:对于螺距5mm的滚珠丝杠,希望1mm对应1000个脉冲:
(10000 × 5) / (5 × 1000) = 10速度与加速度设置:
- 最大速度不应超过伺服电机额定转速
- 加速度时间建议从较大值(如1s)开始测试,逐步减小至设备不振动的最小值
- 急停减速时间应设置为加速度时间的1.5-2倍
原点回归参数:
- 接近速度:通常为运行速度的10-20%
- 爬行速度:通常为接近速度的10%
- 原点偏移量:根据机械结构确定
5. 高级功能实现技巧
5.1 多轴同步控制
FUNCTION_BLOCK FB_MultiAxisSync VAR_INPUT Start : BOOL; MasterPos : DINT; SlaveRatio : REAL; END_VAR VAR_OUTPUT SyncError : WORD; END_VAR VAR MasterAxis : FB_AxisControl; SlaveAxis : FB_AxisControl; SyncActive : BOOL; END_VAR // 主从轴同步逻辑 IF Start AND NOT SyncActive THEN MasterAxis(TRUE, MasterPos, 200.0, X_Axis); SyncActive := TRUE; END_IF IF SyncActive AND MasterAxis.Busy THEN SlaveAxis( TRUE, DINT_TO_REAL(MasterAxis.Position) * SlaveRatio), 200.0, Y_Axis ); IF MasterAxis.Error <> 0 OR SlaveAxis.Error <> 0 THEN SyncError := 16#2000 + MasterAxis.Error + SlaveAxis.Error; SyncActive := FALSE; END_IF; END_IF; END_FUNCTION_BLOCK5.2 位置比较与高速触发
位置比较功能:
MC_PositionCompare( Axis := 1, Position := 30000, OutputNo := 1, Mode := 0 // 0:到达位置时ON );高速捕捉触发:
VAR CapturePos : ARRAY[1..3] OF DINT; CaptureIndex : INT; END_VAR // 在中断程序中处理 IF MC_ReadEvent(1).CaptureTrigger THEN CapturePos[CaptureIndex] := MC_ReadActualPosition(1); CaptureIndex := CaptureIndex + 1; END_IF;
6. 调试技巧与常见问题排查
6.1 伺服调试步骤
基本测试流程:
- 先进行JOG点动测试,确认电机转向正确
- 测试原点回归功能,确认机械原点位置
- 进行单点定位测试,观察运行曲线
- 逐步提高速度,观察振动和噪音情况
关键监控参数:
- 实际位置与指令位置偏差
- 伺服驱动器的负载率
- 跟随误差(Following Error)
- 电机温度
6.2 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不转动 | 1. 伺服未上电 2. 使能信号未接通 3. 驱动器报警 | 1. 检查动力电源 2. 检查MC_Power指令 3. 查看驱动器报警代码 |
| 定位不准 | 1. 电子齿轮比错误 2. 机械背隙过大 3. 负载过重 | 1. 重新计算齿轮比 2. 调整机械或补偿背隙 3. 检查负载是否超限 |
| 运行中振动 | 1. 刚性设置不当 2. 加速度过大 3. 机械共振 | 1. 调整伺服增益 2. 降低加速度 3. 添加滤波器或改变机械结构 |
| 偶尔丢步 | 1. 干扰导致脉冲丢失 2. 电源电压不稳 3. 电缆接触不良 | 1. 检查屏蔽接地 2. 稳定电源 3. 更换高质量电缆 |
6.3 高级调试技巧
伺服增益调整:
- 先调整速度环增益,再调整位置环增益
- 使用MR Configurator2的自动调谐功能
- 对于高刚性机械,可适当提高刚性等级
振动抑制方法:
MC_SetFilter( Axis := 1, FilterType := 2, // 2:低通滤波器 CutOffFreq := 50 // 截止频率(Hz) );动态参数调整:
// 根据负载变化动态调整增益 IF HeavyLoad THEN MC_SetGain(1, 120, 80, 50); // P,I,D增益 ELSE MC_SetGain(1, 100, 60, 40); END_IF;
7. 工程实践中的经验总结
在实际项目中,ST语言编写的伺服控制程序相比传统梯形图有几个明显优势:首先是代码可读性更强,复杂的数学运算和逻辑判断用ST表达更加直观;其次是便于实现模块化设计,像我们案例中的FB_AxisControl功能块可以在不同项目中重复使用;最重要的是ST支持更复杂的数据结构和算法,适合实现高级控制策略。
几个特别值得注意的实践经验:
异常处理要全面:伺服控制中除了要检测定位完成信号,还要监控伺服准备好、报警状态、跟随误差等多个状态量。我们在FB中设计了完善的状态机来处理各种异常情况。
参数保存很重要:伺服参数应该保存在PLC的非易失性存储器中,可以使用以下指令:
MC_SaveParameters(1); // 保存轴1的参数到Flash实时监控不可少:建议在HMI上实时显示以下关键参数:
- 指令位置与实际位置
- 速度指令与实际速度
- 伺服驱动器的负载率
- 当前错误代码
安全回路要独立:急停、限位等安全信号必须通过硬件回路直接切断伺服使能,不能仅依赖PLC程序。
对于需要更高性能的应用,可以考虑使用三菱的SSCNETIII总线型伺服,其通信周期可达0.888ms,比脉冲控制方式更适合多轴高速同步场合。不过FX5U通过添加定位模块也能满足大多数应用需求,性价比更高。