步进电机定位控制
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 工控机 | 1 | 3,000 | 主控 |
| 汇川 | AM600-4PTO 4 路高速脉冲 | 1 | 1,200 | X/Y/Z 脉冲发生 |
| 汇川 | AM600-1616END | 1 | 850 | DI/DO |
| 雷赛 | DM556 两相驱动器 | 3 | 350 | 步进驱动 |
| 国产通用 | 57 步进电机 | 3 | 180 | 电机 |
| 欧姆龙 (国产替代) | E3F-DS30C4 光电限位 | 6 | 35 | ±限位 × 3 轴 |
| 国产通用 | LJ12A3-4-Z/BX 接近开关 | 3 | 45 | 零点 |
| 威纶通 | TK6071iP 7" | 1 | 1,100 | 本地 HMI |
| 明纬 | LRS-150-24 | 1 | 180 | 24V 电源 |
| 机械 | 丝杠 + 直线导轨 3 套 | 1 | 4,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 | 从站 2 | X_PosLim | X 正限位 |
| %IX0.1 | 从站 2 | X_NegLim | X 负限位 |
| %IX0.2 | 从站 2 | X_Home | X 零点 |
| %IX0.3 | 从站 2 | Y_PosLim | Y 正限位 |
| %IX0.4 | 从站 2 | Y_NegLim | Y 负限位 |
| %IX0.5 | 从站 2 | Y_Home | Y 零点 |
| %IX0.6 | 从站 2 | Z_PosLim | Z 正限位 |
| %IX0.7 | 从站 2 | Z_NegLim | Z 负限位 |
| %IX1.0 | 从站 2 | Z_Home | Z 零点 |
| %IX1.1 | 从站 2 | SB_Start | 启动 |
| %IX1.2 | 从站 2 | SB_EStop | 急停 (常闭) |
| %QX0.0 | 从站 2 | Valve_Glue | 点胶阀 |
| %QX0.1 | 从站 2 | HL_Run | 运行灯 |
| %QX0.2 | 从站 2 | HL_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. 运行与调试
- 仿真 Runtime 验证: IDE 仿真模式空载执行回零 → 16 点循环, 观察轨迹是否闭合
- 下载到 Runtime: IDE "部署" → 选 Runtime IP → 下载
- 在线监控: 打开 DB_Teach 实时观察
nCurrentIdx递增,rCurX/Y/Z是否到达目标 - 强制测试: 在线强制
X_PosLim := TRUE, 验证 MC_Stop 是否立即生效 + eState=3 - 示教流程: 手动模式 → 点动到目标 → 按 "记录当前点" → 点号 +1, 重复 16 次保存
- 常见排查:
- 电机丢步 → 检查加减速曲线, 减小 Acceleration
- 回零不停 → 检查零点信号接线极性 + 方向设置
- 定位偏差 → 检查丝杠导程参数 + 减速比参数
10. 用到的 Darra 功能
| 功能模块 | 本案例用到的 | 说明 |
|---|---|---|
| PLC 编程 | SCL + OB30 运动周期 + 状态机 + UDT | IEC 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 循环无丢步
- 扩展方向:
- 升级到伺服 (汇川 SV660N × 3), 负载提升到 20 kg, 速度 × 2
- 增加视觉定位 (相机补偿), 工件位置不固定也能精确点胶
- 增加四轴版本 (追加旋转工位), 适合异形工件多角度点胶