1. 项目背景与核心价值
去年在给某包装产线做自动化改造时,第一次接触到三菱FX5U这款紧凑型PLC。当时产线上需要同步控制6台伺服电机完成物料分拣和传送,客户指定要用结构化文本(ST)和功能块(FB)来编写程序。这个案例让我对FX5U的伺服控制有了全新认识——原来用ST语言配合FB功能块,能实现比梯形图更高效的伺服轴组控制逻辑。
FX5U作为三菱电机MELSEC iQ-F系列的主力机型,内置了专门针对伺服控制的运动控制指令。通过ST语言编写程序,不仅能实现复杂的数学运算和条件判断,配合FB功能块还能将常用控制逻辑模块化。比如一个简单的点位运动控制功能,封装成FB后可以在不同工位重复调用,程序可读性和维护性大幅提升。
2. 硬件配置与软件环境
2.1 硬件连接方案
项目中使用的是FX5U-32MT/ES主机,通过内置的脉冲输出口(Y0-Y3)连接MR-JE-40A伺服驱动器。具体接线要注意:
- 脉冲信号(PULS+/-)采用差分输出连接,有效抑制干扰
- 方向信号(SIGN+/-)根据机械结构定义正负逻辑
- 伺服使能(SON)建议通过PLC输出点控制
- 伺服报警(ALM)信号接入PLC输入点
关键提示:伺服电机编码器电源(电池)务必单独供电,避免因主电源断电导致绝对位置丢失。曾有个项目因忽略这点,每次上电都需要重新原点复归。
2.2 软件平台搭建
编程环境使用GX Works3(版本1.050W以上),新建工程时注意:
- 选择FX5U系列CPU型号
- 编程语言勾选"结构化文本(ST)"和"功能块(FB)"
- 在参数设置中启用脉冲输出功能
- 添加伺服轴配置(单位换算、电子齿轮比等)
软件中需要安装的运动控制模块:
- 定位控制设置(设置各轴参数)
- 运动控制指令库(包含DSFRP等指令)
3. ST语言核心程序解析
3.1 伺服使能控制逻辑
st复制// 伺服使能功能块示例
FUNCTION_BLOCK FB_ServoEnable
VAR_INPUT
bEnable : BOOL; // 总使能信号
bReset : BOOL; // 报警复位信号
END_VAR
VAR_OUTPUT
qSON : BOOL; // 伺服使能输出
qReady : BOOL; // 伺服准备就绪
END_VAR
VAR
tTimer : TON; // 使能延时定时器
END_VAR
// 主逻辑
IF bEnable THEN
tTimer(IN:=TRUE, PT:=T#500MS);
IF tTimer.Q THEN
qSON := TRUE;
END_IF;
// 报警复位脉冲生成
IF bReset AND NOT qReady THEN
qSON := FALSE;
tTimer(IN:=FALSE);
END_IF;
qReady := qSON AND NOT bReset;
ELSE
qSON := FALSE;
tTimer(IN:=FALSE);
qReady := FALSE;
END_IF;
END_FUNCTION_BLOCK
这个功能块实现了带延时和复位逻辑的伺服使能控制,使用时只需实例化并连接输入输出:
st复制// 实例化调用
svEnable : FB_ServoEnable;
svEnable(bEnable:=xAutoMode, bReset:=xAlarmReset);
Y0 := svEnable.qSON; // 连接到输出点
3.2 点位运动控制实现
FX5U通过DSFRP指令实现绝对定位,典型ST程序如下:
st复制// 运动控制参数结构体
TYPE ST_MotionPara :
STRUCT
rTargetPos : REAL; // 目标位置(mm)
rSpeed : REAL; // 运行速度(mm/s)
rAccel : REAL; // 加速度(mm/s²)
rDecel : REAL; // 减速度(mm/s²)
END_STRUCT;
END_TYPE
// 运动控制功能块
FUNCTION_BLOCK FB_PositionMove
VAR_INPUT
stPara : ST_MotionPara; // 运动参数
bStart : BOOL; // 启动信号
END_VAR
VAR_OUTPUT
bBusy : BOOL; // 运行中状态
bDone : BOOL; // 定位完成
END_VAR
VAR
iAxis : INT := 1; // 轴号
bExecute : BOOL := FALSE;
END_VAR
// 运动指令触发
IF bStart AND NOT bExecute THEN
bExecute := TRUE;
DSFRP(
Axis:=iAxis,
Address:=DINT_TO_UDINT(REAL_TO_DINT(stPara.rTargetPos*1000)),
Speed:=REAL_TO_DINT(stPara.rSpeed*1000),
Acceleration:=REAL_TO_DINT(stPara.rAccel*1000),
Deceleration:=REAL_TO_DINT(stPara.rDecel*1000),
BufferMode:=0);
END_IF;
// 状态监控
bBusy := M2400 + (iAxis-1)*20; // 对应轴忙信号
bDone := M2401 + (iAxis-1)*20; // 对应轴完成信号
// 执行结束复位
IF bDone THEN
bExecute := FALSE;
END_IF;
END_FUNCTION_BLOCK
实测技巧:DSFRP指令的位置参数单位是脉冲数,需要根据机械参数将毫米转换为脉冲。建议在功能块内部做单位换算,对外接口保持工程单位(mm)。
4. 多轴同步控制方案
4.1 电子凸轮功能实现
在包装产线中,需要实现主从轴同步运动。FX5U通过CAM指令实现电子凸轮功能:
st复制// 凸轮表定义
VAR_GLOBAL CONSTANT
// 凸轮曲线数据(位置-位置映射)
aCamData : ARRAY[0..99] OF DINT := [
0, 500, 1000, 1500, ..., 5000 // 主轴位置(脉冲)
// 对应从轴位置数据...
];
END_VAR
// 凸轮启动功能块
FUNCTION_BLOCK FB_CamStart
VAR_INPUT
iMasterAxis : INT; // 主轴号
iSlaveAxis : INT; // 从轴号
bStart : BOOL; // 启动信号
END_VAR
VAR
bExecute : BOOL := FALSE;
END_VAR
IF bStart AND NOT bExecute THEN
CAM(
MasterAxis:=iMasterAxis,
SlaveAxis:=iSlaveAxis,
CamMode:=0, // 绝对模式
CamData:=ADR(aCamData),
CamDataNum:=100,
StartMode:=0);
bExecute := TRUE;
END_IF;
// 停止处理...
END_FUNCTION_BLOCK
4.2 多轴插补运动
对于需要直线插补的场合,使用ITP指令实现两轴联动:
st复制// 插补运动功能块
FUNCTION_BLOCK FB_LinearInterpolation
VAR_INPUT
rTargetX : REAL; // X轴目标(mm)
rTargetY : REAL; // Y轴目标(mm)
rSpeed : REAL; // 合成速度(mm/s)
bStart : BOOL;
END_VAR
VAR_OUTPUT
bBusy : BOOL;
bDone : BOOL;
END_VAR
VAR
bExecute : BOOL := FALSE;
END_VAR
IF bStart AND NOT bExecute THEN
ITP(
AxisX:=1,
AxisY:=2,
AddressX:=REAL_TO_DINT(rTargetX*1000),
AddressY:=REAL_TO_DINT(rTargetY*1000),
Speed:=REAL_TO_DINT(rSpeed*1000),
Acceleration:=5000,
Deceleration:=5000,
BufferMode:=0);
bExecute := TRUE;
END_IF;
// 状态监控
bBusy := M2400 OR M2420; // 两轴忙信号或
bDone := M2401 AND M2421; // 两轴完成信号与
IF bDone THEN
bExecute := FALSE;
END_IF;
END_FUNCTION_BLOCK
5. 调试技巧与问题排查
5.1 常见报警处理
| 报警代码 | 现象描述 | 排查步骤 |
|---|---|---|
| 37.0 | 跟随误差过大 | 1. 检查机械阻力 2. 调整伺服增益 3. 降低运行速度 |
| 37.1 | 超程报警 | 1. 检查限位开关接线 2. 确认软限位参数 |
| 37.2 | 脉冲丢失 | 1. 检查编码器连接 2. 确认屏蔽线接地 |
5.2 运动控制调试步骤
-
基本参数确认
- 电子齿轮比(PJ/PG)
- 单位换算(脉冲数/mm)
- 软限位设置
-
单轴测试
st复制// 测试程序示例 PROGRAM MAIN VAR fbMove : FB_PositionMove; stPara : ST_MotionPara := (rTargetPos:=100.0, rSpeed:=50.0, rAccel:=100.0, rDecel:=100.0); bTestStart : BOOL := FALSE; END_VAR // 手动触发测试 IF xTestButton THEN bTestStart := TRUE; ELSE bTestStart := FALSE; END_IF; fbMove(stPara:=stPara, bStart:=bTestStart); END_PROGRAM -
多轴同步验证
- 先单独测试各轴
- 再启用凸轮或插补功能
- 逐步提高速度观察同步性
5.3 性能优化建议
-
ST编程优化
- 将频繁调用的算法封装成FB
- 使用结构体组织相关参数
- 避免在高速任务中做浮点运算
-
运动参数调整
- 加速度/减速度设置为速度的1.5-2倍
- 高速运行时适当提高伺服刚性
- 使用S曲线加减速模式减少冲击
-
诊断功能应用
st复制// 读取当前轴位置 DGDR( Device:=D8340, // 轴1当前位置 Data:=diCurPos); rCurPos := DINT_TO_REAL(diCurPos)/1000.0;
6. 工程实践案例
6.1 物料分拣系统实现
某产线要求将传送带上的物料按类型分拣到不同位置,控制流程:
- 编码器检测物料位置
- 视觉系统识别物料类型
- 机械手根据类型执行不同运动轨迹
st复制// 分拣控制状态机
CASE iState OF
0: // 等待物料
IF xMaterialReady THEN
iTargetPos := GetTargetPosByType(iMaterialType);
iState := 10;
END_IF;
10: // 启动运动
fbMove(stPara:=stMovePara[iTargetPos], bStart:=TRUE);
IF fbMove.bBusy THEN
iState := 20;
END_IF;
20: // 运动监控
IF fbMove.bDone THEN
iState := 30;
ELSIF xEmergencyStop THEN
ESTP(Axis:=1); // 紧急停止
iState := 99;
END_IF;
// 其他状态...
END_CASE;
6.2 飞剪控制方案
在连续运动中对材料进行定长切割:
- 主轴(送料辊)持续运行
- 从轴(刀架)周期性同步剪切
- 通过CAMBOX指令实现相位同步
st复制// 飞剪凸轮控制
CAMBOX(
MasterAxis:=1,
SlaveAxis:=2,
CamData:=ADR(aCamData),
DataNum:=100,
StartPhase:=0, // 起始相位
Ratio:=1, // 速比
StartMode:=1); // 连续运行
实际调试中发现,当主轴速度超过一定值时,从轴会出现跟随误差。解决方案是:
- 提高伺服驱动器的速度环增益
- 在凸轮曲线中加入提前量补偿
- 降低最大运行速度10%
7. 进阶功能开发
7.1 参数配方功能
对于需要频繁更换产品的产线,可以将不同产品的运动参数存储在数据块中:
st复制// 配方数据结构
TYPE ST_Recipe :
STRUCT
rPos1 : REAL;
rSpeed1 : REAL;
rPos2 : REAL;
rSpeed2 : REAL;
// ...其他参数
END_STRUCT;
END_TYPE
// 配方选择逻辑
CASE iProductType OF
1: stCurrentPara := stRecipeA;
2: stCurrentPara := stRecipeB;
// ...
END_CASE;
// 保存配方到文件
WR_REC(
Device:=D1000,
FileName:='RECIPE01',
Size:=SIZEOF(stRecipeA));
7.2 与HMI数据交互
通过全局变量与触摸屏交换数据:
st复制// HMI控制参数
VAR_GLOBAL
g_rSetSpeed : REAL; // 速度设定
g_bStartCmd : BOOL; // 启动命令
g_iErrorCode : INT; // 错误代码
END_VAR
// 在ST程序中使用
fbMove(stPara.rSpeed := g_rSetSpeed, bStart:=g_bStartCmd);
g_iErrorCode := iLastError;
经验分享:HMI上显示的数值建议做缩放处理。例如程序内部使用mm为单位,HMI显示时可以除以1000显示为米,避免操作员输入过大数值。
8. 项目总结与扩展建议
经过多个项目的实践验证,FX5U的ST/FB编程方式在伺服控制中展现出明显优势:
- 程序结构化:将运动控制逻辑封装成功能块后,主程序变得非常简洁
- 参数集中管理:通过结构体组织运动参数,修改和维护更方便
- 代码复用率高:同一功能块可在不同轴甚至不同项目中重复使用
对于想进一步深造的工程师,建议尝试:
- 使用三菱的SSCNETⅢ总线控制更高性能的伺服系统
- 学习MC Works64平台下的更高级运动控制功能
- 结合三菱的机器人控制器实现更复杂的协同作业
最后分享一个调试小技巧:在GX Works3中可以使用"在线数据操作"功能实时修改运动参数,无需重新下载程序。这在调试阶段可以快速找到最优的运动曲线参数,大幅提高调试效率。