跳到主要内容

步进电机定位控制

1. 设备简介

步进电机定位平台是 3C 电子、医疗实验室、小型自动化行业最常见的通用工装, 涵盖点胶机、锁螺丝机、丝印机、激光打标台、在线检测治具、桌面 SCARA 等应用, 负载 ≤ 5 kg、行程 300×300×200 mm 范围内的单台设备几乎都用步进方案 (成本仅为伺服的 1/3)。本案例以三轴点胶机为对象, X/Y 行程 300 mm、Z 行程 150 mm, 采用两相步进电机 1/32 细分 (6400 脉冲/转), 最大脉冲频率 200 kHz, 理论定位精度 ±1 脉冲 / 含机械误差 ±0.05 mm。HMI 支持 16 组示教点位手动记录与自动顺序执行, 配合点胶阀在线开关, 可直接投产小批量点胶作业, 节拍目标 ≤ 2 秒/点。

2. 项目模块组成

  • 机械部分: X/Y/Z 丝杠模组 + 点胶阀 + 工件夹具 + 9 路 (6 限位 + 3 零点) 传感器
  • 电气部分: 研华工控机 + 汇川 4PTO 脉冲模块 + IO 模块 + 雷赛 DM556 驱动器 × 3 + 57 系列步进电机 × 3
  • 软件部分: OB30 运动周期 + OB1 主循环 + FB_AxisManager + FB_TeachPointSeq + FB_GlueControl + DB_Teach

3. 机械装配架构

工件由操作员放入工装夹具, PLC 发起回零流程 (先 X, 再 Y, 再 Z) 后进入自动模式。点胶阀安装在 Z 轴下端, X/Y 移动到目标点位 → Z 下降到点胶高度 → 阀开启保持 Tdwell → 阀关闭 → Z 抬升 → 下一点, 循环至 16 点完成, 操作员取出工件进入下一循环。

4. 程序架构

OB30 以 2 ms 运动周期执行 PLCopen MC 指令 (Home/MoveAbsolute/Stop), OB1 处理示教点顺序执行状态机, FB_GlueControl 根据步进位置控制点胶阀开关。所有 16 组点位 Retain 持久化于 DB_Teach。

5. 硬件选型 BOM

品牌型号数量单价 (¥)用途
研华MIO-5272 工控机13,000主控
汇川AM600-4PTO 4 路高速脉冲11,200X/Y/Z 脉冲发生
汇川AM600-1616END1850DI/DO
雷赛DM556 两相驱动器3350步进驱动
国产通用57 步进电机3180电机
欧姆龙 (国产替代)E3F-DS30C4 光电限位635±限位 × 3 轴
国产通用LJ12A3-4-Z/BX 接近开关345零点
威纶通TK6071iP 7"11,100本地 HMI
明纬LRS-150-24118024V 电源
机械丝杠 + 直线导轨 3 套14,500机械结构

6. IO 模块配置

6.1 选择 IO 模块

IDE 项目树 > IO 设备 > 右键 > 添加 IO 设备:

  • 从站 1: 汇川 AM600-4PTO — X/Y/Z 脉冲+方向输出
  • 从站 2: 汇川 AM600-1616END — 限位/零点/按钮采集与点胶阀控制

4PTO 在 从站属性 > PDO 配置 中设置脉冲频率上限 200 kHz, 脉冲模式 = 脉冲 + 方向。

6.2 IO 地址分配

地址模块信号用途
%IX0.0从站 2X_PosLimX 正限位
%IX0.1从站 2X_NegLimX 负限位
%IX0.2从站 2X_HomeX 零点
%IX0.3从站 2Y_PosLimY 正限位
%IX0.4从站 2Y_NegLimY 负限位
%IX0.5从站 2Y_HomeY 零点
%IX0.6从站 2Z_PosLimZ 正限位
%IX0.7从站 2Z_NegLimZ 负限位
%IX1.0从站 2Z_HomeZ 零点
%IX1.1从站 2SB_Start启动
%IX1.2从站 2SB_EStop急停 (常闭)
%QX0.0从站 2Valve_Glue点胶阀
%QX0.1从站 2HL_Run运行灯
%QX0.2从站 2HL_Fault故障灯

6.3 IO 用途分工

  • PLC 主控: 全部运动控制 + 状态机 + 示教点管理, 均在 PLC 完成
  • 轴绑定: X/Y/Z 三个 PLCopen MC 轴对象分别绑定到 4PTO 的 Ch0/Ch1/Ch2
  • 限位硬联锁: 每轴 +/- 限位信号在 OB30 内实时检测, 触发立即 MC_Stop
  • 示教面板: 操作员按住点动按钮移到目标位置, 按 "记录当前点" 即存入 DB_Teach

7. 核心数据结构

TYPE UDT_Point:
STRUCT
rX, rY, rZ : REAL;
rSpeed : REAL;
tDwell : TIME;
bGlueOn : BOOL;
sName : STRING[20];
END_STRUCT
END_TYPE

TYPE UDT_GlueMachine:
STRUCT
aPoints : ARRAY[0..15] OF UDT_Point;
nCurrentIdx : INT;
bHomed : BOOL;
bAutoRun : BOOL;
eState : INT; // 0=idle 1=homing 2=running 3=fault
rCurX, rCurY, rCurZ : REAL;
nCycleCount : DINT; // 累计完成次数 (Retain)
END_STRUCT
END_TYPE

VAR_GLOBAL RETAIN
gMach : UDT_GlueMachine;
END_VAR

VAR_GLOBAL
axisX, axisY, axisZ : AXIS_REF;
END_VAR

8. 核心程序代码

FB_AxisManager — OB30 2 ms 运动周期:

FUNCTION_BLOCK FB_AxisManager
VAR
mcHome_X, mcHome_Y, mcHome_Z : MC_Home;
mcMoveAbs_X, mcMoveAbs_Y, mcMoveAbs_Z : MC_MoveAbsolute;
mcStop_X, mcStop_Y, mcStop_Z : MC_Stop;
END_VAR

// 轴状态读取
gMach.rCurX := axisX.ActPos;
gMach.rCurY := axisY.ActPos;
gMach.rCurZ := axisZ.ActPos;

// 急停 → 全轴 MC_Stop
IF NOT SB_EStop THEN
mcStop_X(Axis := axisX, Execute := TRUE);
mcStop_Y(Axis := axisY, Execute := TRUE);
mcStop_Z(Axis := axisZ, Execute := TRUE);
gMach.eState := 3;
END_IF;

// 限位硬联锁
IF X_PosLim OR X_NegLim THEN mcStop_X(Axis := axisX, Execute := TRUE); END_IF;
IF Y_PosLim OR Y_NegLim THEN mcStop_Y(Axis := axisY, Execute := TRUE); END_IF;
IF Z_PosLim OR Z_NegLim THEN mcStop_Z(Axis := axisZ, Execute := TRUE); END_IF;

FB_TeachPointSeq — 示教点顺序执行状态机:

FUNCTION_BLOCK FB_TeachPointSeq
VAR
tonDwell : TON;
stepState : INT;
END_VAR

CASE gMach.eState OF
0: // 空闲
IF SB_Start AND NOT gMach.bHomed THEN
gMach.eState := 1;
ELSIF SB_Start AND gMach.bHomed THEN
gMach.eState := 2;
gMach.nCurrentIdx := 0;
stepState := 0;
END_IF;

1: // 回零 (先 X, 再 Y, 再 Z, 二次精确寻零)
mcHome_X(Axis := axisX, Execute := TRUE, Position := 0.0);
IF mcHome_X.Done THEN
mcHome_Y(Axis := axisY, Execute := TRUE, Position := 0.0);
IF mcHome_Y.Done THEN
mcHome_Z(Axis := axisZ, Execute := TRUE, Position := 0.0);
IF mcHome_Z.Done THEN
gMach.bHomed := TRUE;
gMach.eState := 0;
END_IF;
END_IF;
END_IF;

2: // 自动执行示教点
CASE stepState OF
0: // X/Y 同步定位
mcMoveAbs_X(Axis := axisX, Execute := TRUE,
Position := gMach.aPoints[gMach.nCurrentIdx].rX,
Velocity := gMach.aPoints[gMach.nCurrentIdx].rSpeed);
mcMoveAbs_Y(Axis := axisY, Execute := TRUE,
Position := gMach.aPoints[gMach.nCurrentIdx].rY,
Velocity := gMach.aPoints[gMach.nCurrentIdx].rSpeed);
IF mcMoveAbs_X.Done AND mcMoveAbs_Y.Done THEN
stepState := 1;
END_IF;

1: // Z 下降
mcMoveAbs_Z(Axis := axisZ, Execute := TRUE,
Position := gMach.aPoints[gMach.nCurrentIdx].rZ,
Velocity := 50.0);
IF mcMoveAbs_Z.Done THEN stepState := 2; END_IF;

2: // 点胶 + 停留
Valve_Glue := gMach.aPoints[gMach.nCurrentIdx].bGlueOn;
tonDwell(IN := TRUE, PT := gMach.aPoints[gMach.nCurrentIdx].tDwell);
IF tonDwell.Q THEN
Valve_Glue := FALSE;
tonDwell(IN := FALSE);
stepState := 3;
END_IF;

3: // Z 抬升
mcMoveAbs_Z(Axis := axisZ, Execute := TRUE,
Position := 0.0, Velocity := 100.0);
IF mcMoveAbs_Z.Done THEN stepState := 4; END_IF;

4: // 下一点 / 完成一循环
gMach.nCurrentIdx := gMach.nCurrentIdx + 1;
IF gMach.nCurrentIdx >= 16 THEN
gMach.nCycleCount := gMach.nCycleCount + 1;
gMach.eState := 0;
ELSE
stepState := 0;
END_IF;
END_CASE;

3: // 故障
IF SB_EStop THEN gMach.eState := 0; END_IF;
END_CASE;

HL_Run := gMach.eState = 2;
HL_Fault := gMach.eState = 3;

PLCopen MC 调用规范示例:

// 绝对定位
mcMoveAbs(Axis := axisX, Execute := TRUE,
Position := 100.0, Velocity := 200.0,
Acceleration := 1000.0, Deceleration := 1000.0);

// 点动
mcJog(Axis := axisX, JogForward := TRUE, Velocity := 50.0);

// 回零 (使用限位+零点信号)
mcHome(Axis := axisX, Execute := TRUE,
HomingMode := HOMING_DIRECT_LIMIT, Position := 0.0);

9. 运行与调试

  1. 仿真 Runtime 验证: IDE 仿真模式空载执行回零 → 16 点循环, 观察轨迹是否闭合
  2. 下载到 Runtime: IDE "部署" → 选 Runtime IP → 下载
  3. 在线监控: 打开 DB_Teach 实时观察 nCurrentIdx 递增, rCurX/Y/Z 是否到达目标
  4. 强制测试: 在线强制 X_PosLim := TRUE, 验证 MC_Stop 是否立即生效 + eState=3
  5. 示教流程: 手动模式 → 点动到目标 → 按 "记录当前点" → 点号 +1, 重复 16 次保存
  6. 常见排查:
    • 电机丢步 → 检查加减速曲线, 减小 Acceleration
    • 回零不停 → 检查零点信号接线极性 + 方向设置
    • 定位偏差 → 检查丝杠导程参数 + 减速比参数

10. 用到的 Darra 功能

功能模块本案例用到的说明
PLC 编程SCL + OB30 运动周期 + 状态机 + UDTIEC 61131-3
工艺对象PLCopen MC 定位轴 × 3 (MC_Home/MoveAbsolute/Jog/Stop)无需外购运动卡
HMI示教画面 + 手动点动 + 轨迹可视化 + 参数配方一体化开发
通讯EtherCAT (PTO 脉冲模块)高速脉冲 + 精确同步
数据记录16 组点位 + 累计次数 Retain断电恢复
服务终端授权 + 远程示教点查看OEM 按次收费

11. 项目总结

  • 实测指标: 单点节拍 1.8 秒, X/Y 定位重复精度 ±0.03 mm, 连续 200 循环无丢步
  • 扩展方向:
    1. 升级到伺服 (汇川 SV660N × 3), 负载提升到 20 kg, 速度 × 2
    2. 增加视觉定位 (相机补偿), 工件位置不固定也能精确点胶
    3. 增加四轴版本 (追加旋转工位), 适合异形工件多角度点胶