1. FX5U PLC与伺服控制基础认知
第一次接触三菱FX5U系列PLC时,最让我惊讶的是其内置的ST语言编程能力。作为三菱电机MELSEC iQ-F系列的中端产品,FX5U在传统梯形图编程基础上,完整支持IEC 61131-3标准的结构化文本(ST)和功能块(FB)编程方式。这种特性使其在伺服控制领域展现出独特优势——我们不再需要依赖复杂的继电器逻辑来驱动伺服系统,而是可以用更接近计算机编程的方式实现精确运动控制。
伺服系统在工业自动化中的核心地位不言而喻。以最常见的场景为例:一台包装机械需要将产品精确输送到指定位置,传统的气缸方案可能因气压波动导致±1mm的定位误差,而采用伺服系统配合FX5U PLC控制,轻松可实现±0.02mm的重复定位精度。这种精度提升直接关系到产品质量和生产效率。
FX5U的硬件特性为伺服控制提供了坚实基础:
- 内置4轴100kHz高速脉冲输出(Y0-Y3)
- 支持SSCNETⅢ/H光纤网络通信(需扩展模块)
- 最大可扩展至16轴伺服控制
- 0.1ms的高速程序扫描周期
在软件层面,GX Works3开发环境提供了完整的伺服配置工具。新建工程时选择"结构化工程"模式,就能使用ST语言编写复杂的运动控制算法。与传统的梯形图相比,ST语言在处理数学运算、条件判断等复杂逻辑时更加直观。例如计算伺服移动的S曲线加减速,用ST可能只需要十几行清晰可读的代码,而用梯形图实现相同功能可能需要数十个功能指令的复杂组合。
关键提示:虽然FX5U支持多种编程语言混合使用,但建议伺服控制相关逻辑尽量集中用ST或FB实现。混合编程时变量管理容易混乱,特别是当多个轴需要协同运动时。
2. 伺服系统硬件配置实战
实际项目中,我常用FX5U-32MT/ES型号作为控制核心,搭配MR-JE-40A伺服驱动器和HG-KN43J-S100伺服电机组成基本控制单元。这种组合在中小型设备中性价比极高,下面详细说明硬件连接的关键细节。
2.1 电气接线要点
脉冲控制模式下,FX5U与伺服驱动器的接线需要特别注意:
- 脉冲输出:PLC的Y0(脉冲+)接到驱动器的PP,Y1(方向+)接到NP
- 信号地:PLC的COM0接到驱动器的SG
- 伺服准备好:驱动器的RDY+接到PLC的X0,RDY-接到COM
- 伺服报警:驱动器的ALM+接到PLC的X1,ALM-接到COM
我曾在一个贴标机项目中发现,当脉冲线超过3米时,偶尔会出现脉冲丢失导致定位偏差。解决方案是:
- 使用双绞屏蔽线(如BELDEN 8761)
- 屏蔽层单端接地(驱动器侧)
- 在PLC输出端加装100Ω终端电阻
2.2 伺服参数设置
伺服驱动器的参数设置直接影响控制效果,以下是基础参数组(以MR-JE系列为例):
plaintext复制PA01=0001 // 控制模式:位置控制
PA05=10000 // 电子齿轮分子
PA06=1 // 电子齿轮分母
PA07=3000 // 速度限制[r/min]
PA08=30000 // 加速度限制[r/min/s]
PA09=30000 // 减速度限制[r/min/s]
电子齿轮比的计算公式为:
code复制电子齿轮比 = (电机每转脉冲数 × 减速比) / (工作台移动量/转 × 指令单位)
例如,使用17位编码器电机(131072脉冲/转),减速比1:10,丝杠导程10mm,希望0.001mm/脉冲时:
code复制(131072 × 10) / (10 × 1000) = 131.072
此时设置PA05=131072,PA06=1000即可。
2.3 原点回归配置
工业设备中,可靠的零点定位至关重要。FX5U支持多种原点回归方式,我推荐使用DOG搜索模式:
- 设置近点信号(DOG)接入PLC的X2
- 在伺服参数中设置:
plaintext复制
PA13=1 // 原点回归方向:正转 PA14=1000 // 近点信号前速度[r/min] PA15=100 // 近点信号后速度[r/min] PA16=10 // 爬行速度[r/min] - PLC程序中调用DSZR指令实现原点回归
避坑指南:原点回归失败最常见的原因是DOG信号的机械位置与电气信号不同步。建议先用JOG模式手动将轴移动到DOG开关附近,观察X2输入指示灯状态,确保机械触发时电气信号可靠动作。
3. ST语言编程核心技巧
3.1 基本运动控制实现
下面是一个完整的ST语言位置控制功能块示例:
st复制FUNCTION_BLOCK FB_AxisControl
VAR_INPUT
Execute : BOOL; // 执行命令
Position : DINT; // 目标位置
Speed : UINT; // 运行速度
END_VAR
VAR_OUTPUT
Done : BOOL; // 完成标志
Busy : BOOL; // 运行中标志
Error : BOOL; // 错误标志
END_VAR
VAR
AxisStatus : WORD; // 轴状态字
END_VAR
// 主逻辑
IF Execute THEN
Busy := TRUE;
Done := FALSE;
// 设置目标位置
D8340 := Position; // 脉冲数写入特殊寄存器
// 设置运行速度
D8342 := Speed;
// 启动定位指令
M8348 := TRUE; // 脉冲输出使能
M8349 := TRUE; // 开始定位
// 监控完成状态
AxisStatus := W8344;
IF (AxisStatus AND 16#0002) <> 0 THEN
Done := TRUE;
Busy := FALSE;
M8349 := FALSE;
ELSIF (AxisStatus AND 16#0004) <> 0 THEN
Error := TRUE;
Busy := FALSE;
END_IF;
ELSE
M8349 := FALSE;
END_IF;
END_FUNCTION_BLOCK
这个功能块封装了基本的定位控制逻辑,使用时只需实例化并设置目标参数:
st复制PROGRAM MAIN
VAR
Axis1 : FB_AxisControl;
END_VAR
// 调用示例
Axis1(
Execute := X20, // 启动按钮
Position := 100000, // 10万脉冲
Speed := 50000 // 50kHz脉冲频率
);
3.2 多轴插补实现
FX5U虽然不支持硬件插补,但通过ST语言的数学运算能力,我们可以实现软件级的多轴协调控制。以下是一个两轴直线插补算法示例:
st复制FUNCTION_BLOCK FB_LinearInterpolation
VAR_INPUT
Start : BOOL;
X_Target : REAL; // X轴目标位置[mm]
Y_Target : REAL; // Y轴目标位置[mm]
FeedRate : REAL; // 进给速度[mm/s]
END_VAR
VAR_OUTPUT
X_Position : REAL;
Y_Position : REAL;
Moving : BOOL;
END_VAR
VAR
DeltaX, DeltaY : REAL;
Distance : REAL;
Steps : UINT;
CurrentStep : UINT;
Timer : TON;
END_VAR
// 初始化计算
IF Start AND NOT Moving THEN
DeltaX := X_Target - X_Position;
DeltaY := Y_Target - Y_Position;
Distance := SQRT(DeltaX*DeltaX + DeltaY*DeltaY);
Steps := UINT_TO_INT(Distance / (FeedRate * 0.001));
CurrentStep := 0;
Moving := TRUE;
Timer(IN:=TRUE, PT:=T#1MS);
END_IF;
// 插补执行
IF Moving THEN
IF Timer.Q THEN
CurrentStep := CurrentStep + 1;
IF CurrentStep >= Steps THEN
X_Position := X_Target;
Y_Position := Y_Target;
Moving := FALSE;
ELSE
X_Position := X_Position + (DeltaX/Steps);
Y_Position := Y_Position + (DeltaY/Steps);
END_IF;
Timer(IN:=TRUE, PT:=T#1MS);
END_IF;
END_IF;
END_FUNCTION_BLOCK
实际应用中,需要将计算出的位置值转换为脉冲数发送给各轴。这种方法的精度取决于PLC的扫描周期,对于要求不高的场合完全够用。
3.3 异常处理机制
可靠的伺服控制必须包含完善的错误处理。以下是我总结的常见故障处理框架:
st复制FUNCTION_BLOCK FB_ServoErrorHandler
VAR_INPUT
AxisStatus : WORD; // 来自W8344等状态寄存器
Reset : BOOL; // 复位信号
END_VAR
VAR_OUTPUT
ErrorCode : WORD; // 错误代码
ErrorMsg : STRING[50]; // 错误信息
END_VAR
VAR
LastStatus : WORD;
END_VAR
// 错误检测
IF NOT Reset THEN
CASE (AxisStatus AND 16#FF00) OF
16#1000:
ErrorCode := 1;
ErrorMsg := '过载报警';
16#2000:
ErrorCode := 2;
ErrorMsg := '过电压';
16#4000:
ErrorCode := 3;
ErrorMsg := '编码器异常';
16#8000:
ErrorCode := 4;
ErrorMsg := '主电源欠压';
ELSE
IF (AxisStatus AND 16#0004) <> 0 THEN
ErrorCode := 5;
ErrorMsg := '指令脉冲异常';
END_IF;
END_CASE;
LastStatus := AxisStatus;
ELSE
ErrorCode := 0;
ErrorMsg := '';
END_IF;
END_FUNCTION_BLOCK
4. 高级应用与调试技巧
4.1 扭矩控制实现
除了常见的位置控制,FX5U还能实现精密的扭矩控制。以下是扭矩模式下的关键设置:
-
伺服参数修改:
plaintext复制
PA01=0002 // 控制模式:速度/扭矩控制 PA0A=100 // 扭矩限制[%] -
ST语言扭矩控制示例:
st复制// 设置扭矩指令
D8346 := 500; // 50.0%额定扭矩
// 启动扭矩输出
M8348 := TRUE; // 使能信号
M8350 := TRUE; // 扭矩指令有效
在注塑机螺杆控制项目中,这种模式能精确控制熔胶背压。实际应用时要注意:
- 扭矩模式下位置不会自动保持,需要额外机械制动
- 建议配合位置限制开关使用,防止失控
4.2 振动抑制调整
高速定位时容易产生机械振动,通过调整伺服参数可有效改善:
-
首先设置基本参数:
plaintext复制
PB01=2 // 滤波器模式:自适应滤波器 PB02=150 // 刚性设置 -
进行自动调谐:
- 在GX Works3中打开"伺服调整"画面
- 选择"一键调谐"模式
- 让轴执行JOG运动完成调谐
-
手动微调:
- 观察实际位置波形
- 调整PB03(速度环增益)和PB04(速度环积分时间)
- 原则是:增益尽可能大但不产生振荡
4.3 网络化控制
对于多轴系统,建议采用SSCNETⅢ光纤网络控制。配置步骤如下:
-
硬件准备:
- FX5U-CNV-SSCNET模块
- MR-J4系列伺服驱动器
- SSCNETⅢ光纤电缆
-
网络配置:
- 在GX Works3的"网络参数"中设置站号
- 设置通信周期(通常0.888ms)
-
程序差异:
- 使用特殊寄存器SD20480~SD20483控制轴1
- 状态监控通过SW20480~SW20483读取
网络控制的最大优势是布线简单,抗干扰能力强。在汽车焊接生产线项目中,我曾用一根30米的光纤串联8台伺服,比脉冲控制节省了80%的布线工作量。
4.4 数据追踪功能
GX Works3的数据追踪功能是调试伺服系统的利器。设置方法:
-
创建追踪配置:
- 添加需要监控的变量(如D8340、D8342)
- 设置触发条件(如M8349上升沿)
- 定义采样周期(通常1ms)
-
执行追踪:
- 启动设备运行
- 触发后自动记录数据
- 停止后可查看波形
通过分析位置、速度波形,能准确发现加减速参数是否合理、是否存在机械共振等问题。我曾用这个功能发现一个设计缺陷:机械结构固有频率与伺服加速度设置重合导致的共振,通过调整PB02刚性参数后完美解决。
5. 典型应用案例解析
5.1 旋转分度台控制
某自动化装配线需要将工件以45°为间隔精确分度,采用FX5U-32MT控制MR-JE-100A驱动200W伺服电机,通过1:10减速机连接直径300mm转盘。
关键实现步骤:
-
计算角度与脉冲关系:
- 电机编码器131072脉冲/转
- 减速比10:1 → 每转1310720脉冲
- 45°对应脉冲数:1310720 × (45/360) = 163840
-
ST程序片段:
st复制// 分度控制功能块
IF Start THEN
D8340 := 163840 * CurrentIndex; // 目标位置
D8342 := 50000; // 速度50kHz
M8348 := TRUE;
M8349 := TRUE;
END_IF;
// 完成检测
IF (W8344 AND 16#0002) <> 0 THEN
Done := TRUE;
CurrentIndex := CurrentIndex + 1;
IF CurrentIndex > 7 THEN
CurrentIndex := 0;
END_IF;
END_IF;
- 关键参数:
- 加减速时间设置为200ms避免冲击
- 电子齿轮比保持1:1(PA05=1,PA06=1)
- 实际测试定位重复精度达到±0.01°
5.2 同步跟随系统
在印刷机械中,需要实现送料辊与印刷辊的精确同步。采用FX5U-64MT主站通过SSCNETⅢ控制两个MR-J4-70B伺服驱动器。
技术要点:
-
主从轴设置:
- 主轴(印刷辊):SD20480控制
- 从轴(送料辊):SD20483控制
-
电子凸轮曲线生成:
st复制// 凸轮表数据
CamData[0] := 0;
CamData[1] := 500;
...
CamData[359] := 0;
// 同步启动
IF Start THEN
// 主轴设置为速度模式
SD20480.4 := 1; // 控制模式选择
SD20480.5 := 1000; // 速度指令[r/min]
// 从轴设置为凸轮模式
SD20483.4 := 4; // 凸轮模式
SD20483.12 := 1; // 凸轮编号
SD20483.8 := 1; // 同步启动
END_IF;
- 调试技巧:
- 先单独调试各轴基本参数
- 低速测试同步效果
- 逐步提高速度并观察跟随误差
- 最终实现100m/min线速度下±0.1mm的同步精度
5.3 压力控制应用
在热板焊接机中,需要实现焊接压力的精确控制。使用FX5U-32MT的模拟量输出控制MR-JE-40A的扭矩模式。
实现方案:
-
硬件配置:
- FX5U-4DA模拟量输出模块
- 压力传感器信号接入FX5U-4AD
- 伺服设置为扭矩控制模式
-
压力控制PID算法:
st复制FUNCTION_BLOCK FB_PressureControl
VAR_INPUT
SetValue : REAL; // 目标压力[N]
ActualValue : REAL; // 实际压力[N]
Kp, Ki, Kd : REAL; // PID参数
END_VAR
VAR_OUTPUT
TorqueCmd : REAL; // 扭矩指令[%]
END_VAR
VAR
Error, LastError : REAL;
Integral, Derivative : REAL;
END_VAR
// PID计算
Error := SetValue - ActualValue;
Integral := Integral + Error * 0.001; // 采样时间1ms
Derivative := (Error - LastError) / 0.001;
TorqueCmd := Kp * Error + Ki * Integral + Kd * Derivative;
// 输出限幅
IF TorqueCmd > 100.0 THEN
TorqueCmd := 100.0;
ELSIF TorqueCmd < -100.0 THEN
TorqueCmd := -100.0;
END_IF;
LastError := Error;
END_FUNCTION_BLOCK
- 参数整定经验:
- 先设Ki=0,Kd=0,逐步增大Kp至系统开始振荡,然后取50%
- 保持Kp,增大Ki直到静差消除
- 最后加入Kd抑制超调
- 最终参数:Kp=2.5, Ki=0.1, Kd=0.05
6. 常见问题深度解析
6.1 脉冲丢失问题排查
现象:伺服电机偶尔会少走一段距离,误差随机出现。
排查步骤:
-
检查硬件:
- 用示波器观察PLC脉冲输出波形
- 确认脉冲频率未超过驱动器额定值
- 测量线路电阻(应小于10Ω)
-
软件检查:
- 确认未使用M8349的上升沿触发多次
- 检查D8340是否被其他程序段修改
- 监控W8344状态字的bit1(脉冲停止中标志)
-
终极解决方案:
- 改用差分脉冲输出(Y0+/Y0-)
- 或升级为SSCNETⅢ网络控制
6.2 原点回归异常处理
典型故障现象:原点回归有时会冲过限位开关。
根本原因分析:
- DOG信号触发时伺服惯性过大
- 近点信号后速度(PA15)设置过高
- 机械结构存在回程间隙
解决方案阶梯:
-
调整参数:
- 降低PA14(近点信号前速度)
- 减小PA15(近点信号后速度)
- 增加PA16(爬行速度)的持续时间
-
机械改进:
- 增加DOG开关的提前量
- 消除传动机构反向间隙
-
程序优化:
- 原点回归前先减速到安全速度
- 加入硬限位急停保护逻辑
6.3 伺服电机异常发热
问题表现:电机运行1小时后表面温度超过70℃。
可能原因及对策:
-
负载过大:
- 检查实际扭矩(监视伺服驱动器显示)
- 重新计算负载惯量比(应<30倍)
-
参数不当:
- 降低PB03(速度环增益)
- 增加PB04(速度环积分时间)
- 关闭不必要的滤波器(PB01=0)
-
机械问题:
- 检查联轴器是否对中
- 确认导轨润滑是否良好
- 测量运行时的振动值
-
电气问题:
- 测量电机三相电阻平衡度
- 检查编码器连接可靠性
6.4 网络通信故障处理
SSCNETⅢ网络常见问题排查:
-
光纤链路检查:
- 观察各节点RD指示灯(应绿色常亮)
- 使用光功率计测量光强(-15dBm~-25dBm)
- 检查光纤弯曲半径(>30mm)
-
站号冲突处理:
- 通过驱动器面板确认站号设置
- 检查GX Works3网络参数配置
- 重置网络配置后重新下载
-
实时监控技巧:
- 使用SW20480.15查看通信错误标志
- 监控SD20480.16获取详细错误代码
- 定期检查光纤连接器清洁度
7. 项目优化与进阶建议
7.1 性能提升方向
经过多个项目实践,我总结出FX5U伺服控制的优化路径:
-
扫描周期优化:
- 将运动控制逻辑放在高速任务中
- 使用ST语言替代梯形图
- 禁用不必要的通信服务
-
运动平滑性改进:
- 采用S曲线加减速算法
- 预计算运动轨迹
- 使用缓冲定位指令
-
多任务处理:
- 合理划分任务优先级
- 关键运动控制使用中断
- 共享变量加锁保护
7.2 安全功能实现
工业设备必须考虑安全功能,推荐方案:
-
硬件级保护:
- 配置MR-JE-B伺服驱动器的安全功能
- 使用FX5U-SF-SET安全模块
- 急停回路采用双通道设计
-
软件安全逻辑:
st复制// 安全互锁功能块
FUNCTION_BLOCK FB_SafetyMonitor
VAR_INPUT
EmergencyStop : BOOL;
GuardDoor : BOOL;
OverTravel : BOOL;
END_VAR
VAR_OUTPUT
SafeTorqueOff : BOOL;
END_VAR
SafeTorqueOff := EmergencyStop OR GuardDoor OR OverTravel;
// 安全状态恢复需手动确认
IF SafeTorqueOff THEN
M8348 := FALSE;
REQUIRES ManualReset;
END_IF;
END_FUNCTION_BLOCK
7.3 未来扩展考虑
随着工业4.0发展,建议提前规划:
-
数据采集接口:
- 配置FX5U-ENET模块
- 实现Modbus TCP数据上传
- 存储运行参数到SD卡
-
预测性维护:
- 监控伺服电流波形
- 记录电机温升曲线
- 建立振动特征库
-
云端集成:
- 通过MQTT协议上传数据
- 微信小程序远程监控
- 大数据分析故障模式
在最近的一个智能产线项目中,我们通过这种架构实现了:
- 设备OEE提升15%
- 故障预警准确率90%
- 维护成本降低30%
8. 开发环境配置指南
8.1 GX Works3最佳实践
-
工程模板创建:
- 新建"结构化工程"
- 设置全局变量前缀(如g_)
- 定义标准功能块库路径
-
编程规范建议:
- 变量命名规则:
- 局部变量:小驼峰(targetPosition)
- 全局变量:g_前缀(g_MachineState)
- 常量:全大写(MAX_SPEED)
- 注释标准:
st复制
// 单行注释 (* 多行注释 特别说明... *)
- 变量命名规则:
-
版本控制集成:
- 安装TortoiseSVN
- 设置工程文件夹为版本库
- 每日提交时添加变更说明
8.2 仿真调试技巧
-
离线测试方法:
- 使用GX Simulator3创建虚拟PLC
- 导入伺服参数文件
- 监控变量变化趋势
-
断点调试:
- 在ST编辑器中设置断点
- 单步执行观察变量
- 修改变量值测试边界条件
-
跟踪功能应用:
- 设置触发条件(如M8000)
- 捕获运动过程中的关键数据
- 导出CSV文件分析
8.3 文档管理策略
完善的文档能提升项目维护效率:
-
技术文档清单:
- 电气图纸(PDF+DWG)
- 参数设置表(Excel)
- 功能说明(Word)
- 操作手册(CHM)
-
版本管理规则:
- 文件名包含日期版本(如20230801_V2)
- 变更记录表记录修改内容
- 旧版本存档至少3个迭代
-
知识沉淀方法:
- 建立常见问题库
- 记录典型故障处理过程
- 编写标准功能块说明书
