三菱FX5U PLC ST语言实现伺服系统精准控制 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通过添加定位模块也能满足大多数应用需求性价比更高。