跳到主要内容

运动控制教程

适用对象: PLC 工程师、自动化工程师、运动控制初学者 前置知识: 了解 SCL 基本语法、了解伺服/步进电机基本概念 学习目标: 掌握 Darra PLC 运动控制体系的全部核心概念,能独立完成单轴定位、多轴插补、电子齿轮/凸轮等常见运动控制任务


1. 运动控制概述

1.1 运动控制在工业自动化中的角色

运动控制是工业自动化的"肌肉系统"——PLC 是大脑,IO 是感官,运动控制让机器真正动起来。从最简单的传送带到精密的五轴加工中心,运动控制无处不在。

常见应用场景:

应用轴数控制要求典型设备
传送带定位1~2 轴点到点,精度 ±0.5mm食品包装、物流分拣
XY 工作台2 轴直线/圆弧插补,精度 ±0.02mm点胶机、激光打标、AOI 检测
飞剪/追剪1~2 轴同步电子凸轮,相位同步印刷机、包装机、造纸
龙门同步2 轴双驱防扭,跟随误差 < 1 脉冲大型雕刻机、3D 打印机
6 轴机器人6 轴多轴协调,正逆运动学搬运、焊接、喷涂
CNC 加工3~5 轴插补 + 前瞻,微秒级数控铣床、车床

1.2 Darra 运动控制架构

Darra 运动控制严格遵循 PLCopen Motion Control 标准(IEC 61131-3 扩展部分),并兼容 CiA 402(CANopen/EtherCAT 驱动配置文件)标准。

┌─────────────────────────────────────────────────────┐
│ IDE (工程师电脑) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ 轴配置向导 │ │ 电子凸轮编辑器│ │ 示波器/调试 ││
│ └──────────────┘ └──────────────┘ └──────────────┘│
└──────────────────────┬──────────────────────────────┘
│ DarraLink 18821
┌──────────────────────▼──────────────────────────────┐
│ Darra.PLC.Service (现场永驻) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ PLCopen MC │ │ 轨迹规划器 │ │ 电子凸轮引擎 ││
│ │ 功能块运行时 │ │ (T/S 曲线) │ │ (CAM 表) ││
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘│
└──────────┼─────────────────┼─────────────────┼───────┘
│ GlobalIO Section (零拷贝)
┌──────────▼─────────────────▼─────────────────▼───────┐
│ DarraRT_PLC.sys (1ms 实时周期) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ 位置环 │ │ 插补器 │ │ 同步管理器 ││
│ │ (PID + 前馈) │ │ (直线/圆弧) │ │ (齿轮/凸轮) ││
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘│
└──────────┼─────────────────┼─────────────────┼───────┘
│ EtherCAT
┌──────────▼─────────────────▼─────────────────▼───────┐
│ 伺服驱动器 / 步进驱动器 │
│ 松下 MINAS A6B │ 台达 ASDA-A3 │ 汇川 IS620N │
└───────────────────────────────────────────────────────┘

三层分工:

组件职责实时性
策略层PLC 程序(SCL)调用 MC_* 功能块,编排运动逻辑非实时 (PLC 周期)
规划层Service 轨迹规划器生成位置/速度/力矩曲线,CAM 查表1ms 周期
执行层RT 内核 + 驱动器位置环闭环,电流环控制,编码器反馈50μs~250μs

1.3 轴类型

Darra 支持三种轴类型:

轴类型驱动方式定位精度典型应用成本
虚拟轴 (Virtual Axis)纯软件计算,无物理电机无限主轴同步、CAM 主编码器、仿真免费
伺服轴 (Servo Axis)伺服驱动器 + 编码器闭环±0.01mm精密定位、插补、力矩控制
步进轴 (Stepper Axis)步进驱动器 + 脉冲方向±0.05mm低成本定位、点胶、小型平台

选型口诀: 要精度选伺服,要成本选步进,做同步用虚拟轴。

// 轴类型在轴配置中定义,程序中通过轴引用变量使用
VAR
// 伺服轴
ServoX : AXIS_REF;
// 步进轴
StepperY : AXIS_REF;
// 虚拟轴(作为主轴)
MasterEncoder : AXIS_REF;
END_VAR

1.4 轴组

轴组 (Group) 将多个轴组合成一个逻辑单元,用于多轴协调运动:

轴组类型包含轴数用途运动学
单轴组1 轴独立轴控制
多轴插补组2~6 轴XY 工作台、XYZ 平台直线/圆弧插补
机器人组4~6 轴关节机器人正/逆运动学
CNC 通道3~5 轴数控加工G 代码解析 + 前瞻

1.5 坐标系

Darra 运动控制涉及三种坐标系:

   工件坐标系 (WCS)             笛卡尔坐标系 (MCS)           轴坐标系
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 相对于工件 │ │ 相对于机器 │ │ 各轴独立角度 │
│ 的编程坐标 │ │ 基座标系 │ │ 或位置 │
│ │ │ │ │ │
│ 工件原点偏移 │ ───→ │ 机器原点 │ ───→ │ J1=30° │
│ 工件旋转 │ 变换 │ X=100,Y=200 │ 逆运动学 │ J2=-15° │
│ │ │ Z=50 │ │ J3=120° │
└──────────────┘ └──────────────┘ └──────────────┘
坐标系说明编程方式
轴坐标系 (Axis)各轴独立的位置/角度值MC_MoveAbsolute 直接设 Position
笛卡尔坐标系 (MCS)机器基座中心的 X/Y/Z 直角坐标MC_MoveLinear 走直线
工件坐标系 (WCS)相对工件原点的编程坐标MC_SetCartesianTransform 偏移

2. 轴配置

2.1 轴参数

在 Darra IDE 中配置轴参数,每个轴有一组统一的参数表:

┌─ 轴配置 ───────────────────────────────────────────────┐
│ 轴名称: Axis_X │
│ 轴类型: [伺服] 步进 虚拟 │
│ │
│ ── 基本参数 ── │
│ 驱动器品牌: [松下 MINAS A6B] 台达 汇川 自定义 │
│ 驱动器站号: 3 (EtherCAT 从站号) │
│ 编码器类型: [增量式] 绝对值 SSI BiSS Endat │
│ 编码器分辨率: 8388608 (23 位绝对值) │
│ │
│ ── 运动参数 ── │
│ 最大速度: 500.0 mm/s │
│ 最大加速度: 5000.0 mm/s² │
│ 最大减速度: 5000.0 mm/s² │
│ 最大跃度: 50000.0 mm/s³ │
│ 软限位正: 500.0 mm │
│ 软限位负: -500.0 mm │
│ 急停减速度: 10000.0 mm/s² │
│ │
│ ── 回零参数 ── │
│ 回零方式: [7: 限位开关 + Z 脉冲] │
│ 回零速度: 50.0 mm/s │
│ 回零逼近速度: 10.0 mm/s │
│ 回零偏移: 0.5 mm │
│ │
│ ── 单位换算 ── │
│ 每转脉冲数: 8388608 │
│ 丝杠螺距: 10.0 mm │
│ 减速比: 1:1 │
│ 显示单位: [mm] 度 脉冲 │
└─────────────────────────────────────────────────────────┘

关键参数说明:

参数说明设置建议
最大速度轴允许的最高运行速度不超过驱动器额定转速的 80%
最大加速度轴允许的最大加速度由负载惯量决定,过大导致机械振动
最大跃度 (Jerk)加速度变化率限制启停冲击,通常为加速度的 5~10 倍
软限位软件位置限制,比硬限位早触发硬限位向内 1~5mm
急停减速度紧急停止时的减速度通常是最大加速度的 2~3 倍

2.2 编码器类型

编码器类型分辨率特点适用场景
增量式1000~5000 PPR断电丢失位置,需回零步进电机、低端伺服
绝对值单圈12~17 位单圈内可知位置旋转台、分度盘
绝对值多圈16/23 位 + 4096 圈断电保留位置,无需回零精密伺服,推荐
SSI12~25 位同步串行接口,抗干扰强远距离编码器
BiSS12~26 位开放协议,高速实时高端伺服、机器人
Endat12~29 位Heidenhain 专有,高精度数控机床、光栅尺

推荐配置: 新项目统一使用绝对值多圈编码器(23 位 + 4096 圈),断电不丢位置,生产时无需每次回零。

2.3 驱动器配置

Darra 已预置主流伺服驱动器的参数模板,无需手动配置每个参数:

品牌型号通讯协议支持模式推荐场景
松下MINAS A6BEtherCATpp, pv, pt, hm, csp, csv, cst通用,性价比高
松下MINAS A6NEtherCATpp, pv, hm, csp标准定位
台达ASDA-A3EtherCATpp, pv, pt, hm, csp, csv, cst高性能
台达ASDA-B3EtherCATpp, pv, hm, csp经济型
汇川IS620NEtherCATpp, pv, pt, hm, csp, csv, cst国产高性能
汇川SV660NEtherCATpp, pv, hm, csp标准伺服
西门子V90PROFINETpp, pv, hm, csp西门子生态
三菱MR-J4/JECC-Link IEpp, pv, hm, csp三菱生态
// 在 IDE 中配置好驱动器后,程序中直接使用轴引用
// 无需再写驱动器初始化代码
// 轴参数自动通过 EtherCAT CoE 下装到驱动器

2.4 回零方式

回零(Homing)是让轴找到机械原点的过程。Darra 支持 10 种 PLCopen 标准回零模式

模式编号描述传感器适用场景
不回零0当前位置设为原点绝对值编码器
负限位+Z1找负限位→反向找 Z 脉冲负限位+Z 脉冲常用
正限位+Z2找正限位→反向找 Z 脉冲正限位+Z 脉冲常用
原点开关+Z3找原点开关→继续找 Z 脉冲原点开关+Z 脉冲推荐
正限位+原点+Z4正限位→原点开关→Z 脉冲正限位+原点+Z闭环
负限位+原点+Z5负限位→原点开关→Z 脉冲负限位+原点+Z闭环
限位-挡块6碰限位挡块回弹限位挡块低成本
限位+Z-挡块7碰挡块+找 Z 脉冲挡块+Z 脉冲常用
直接设原点8当前位置直接设为 0调试阶段
距离测量9从触发点移动固定距离原点开关特殊

推荐配置:

// 推荐方式 3: 原点开关 + Z 脉冲(最准确)
// 适用于大多数伺服轴
HomeCmd(
Axis := Axis1,
Execute := TRUE,
HomeMode := 3, // 模式 3: 原点开关 + Z 脉冲
Position := 0.0, // 原点位置
Velocity := 50.0, // 快速寻找速度
Acceleration := 500.0, // 加速度
HomeSwitchVelocity := 10.0 // 逼近速度(碰到开关后减速)
);

回零过程图解(模式 3: 原点开关 + Z 脉冲):

速度 ↑

│ 快速正向 (50mm/s) 减速
│ ┌────────────────→ ←──────┐
│ 逼近 (10mm/s)
│ ──────→┐
│ │ 找 Z 脉冲
│ │ → │
│ │ Z│──→ 停止
│ ←────┘
│ │
└────────────────────────────────────┴──────→ 位置
原点偏移 0.5mm

原点位置

常见错误:

错误现象原因解决
回零超时限位开关/原点开关故障检查传感器接线和 IO 状态
回零方向反回零方向参数设置错检查 HomeDirection 参数
Z 脉冲找不到编码器信号弱或干扰检查编码器线缆和屏蔽接地
回零位置不准回零偏移参数错误重新测量并设置偏移量

2.5 单位换算

Darra 自动处理单位换算,但理解原理有助于排查问题:

    脉冲数         电机旋转圈数          直线位移
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 8388608 │ → │ 1 圈 │ → │ 10 mm │
│ 脉冲 │ │ 编码器 │ │ 丝杠螺距 │
└───────────┘ └───────────┘ └───────────┘

位置 [mm] = 脉冲数 ÷ 编码器分辨率 × 螺距 ÷ 减速比

示例:
脉冲数 = 5000000
编码器分辨率 = 8388608 (23 位)
螺距 = 10 mm
减速比 = 1:1

位置 = 5000000 / 8388608 × 10 / 1 = 5.96 mm

配置示例:

机械结构编码器分辨率螺距/转减速比单位换算
丝杠直连838860810 mm1:11.19 脉冲/μm
丝杠+减速器838860810 mm3:13.58 脉冲/μm
旋转台8388608360°10:10.00043°/脉冲
同步带8388608100 mm/圈2:10.024 μm/脉冲

3. 单轴运动

单轴运动是运动控制的基础。Darra 提供完整的 PLCopen 单轴功能块集。

3.1 MC_Power — 伺服使能/断电

功能: 控制伺服驱动器的使能状态。使用轴之前必须先使能。

参数表:

参数类型说明
AxisAXIS_REF轴引用
EnableBOOLTRUE=使能,FALSE=断电
StatusBOOL使能状态
BusyBOOL正在执行
ErrorBOOL错误标志
ErrorIDUINT错误码

时序图:

Enable  ──┐  ┌─────────────────────────
│ │
└──┘
Status ┌─────────────────────────
────┘
↑ ↑
使能中 使能完成
(约 50ms)

SCL 示例:

PROGRAM AxisPowerCtrl
VAR
// 功能块实例
PowerX : MC_Power;
PowerY : MC_Power;

// 控制信号
bEnable : BOOL := TRUE;
bAllReady : BOOL;
END_VAR

// 使能 X 轴
PowerX(
Axis := Axis_X,
Enable := bEnable
);

// 使能 Y 轴
PowerY(
Axis := Axis_Y,
Enable := bEnable
);

// 两个轴都使能完成才返回 Ready
IF PowerX.Status AND PowerY.Status THEN
bAllReady := TRUE;
ELSE
bAllReady := FALSE;
END_IF;

注意事项:

  • 使能需要时间(约 50~200ms),不要立即发运动指令
  • 使能失败检查:急停回路、安全门、驱动器报警
  • 断电前必须先 MC_Stop 停止运动

3.2 MC_Home — 回原点

功能: 执行回零操作,建立坐标系的参考点。

参数表:

参数类型说明
AxisAXIS_REF轴引用
ExecuteBOOL上升沿触发
PositionREAL回零后设置的位置值
ModeINT回零模式 (0~9)
VelocityREAL高速寻找速度
AccelerationREAL加速度
HomeSwitchVelocityREAL逼近速度(碰到开关后)
DoneBOOL完成标志
BusyBOOL正在执行
CommandAbortedBOOL被中止
ErrorBOOL错误标志
ErrorIDUINT错误码

SCL 示例:

PROGRAM HomeSequence
VAR
HomeX : MC_Home;
bHomeCmd : BOOL;
bHomed : BOOL;
step : INT := 0;
END_VAR

// 边沿触发
IF bHomeCmd AND NOT bHomeCmd_Old THEN
bHomeCmd := TRUE;
END_IF;
bHomeCmd_Old := bHomeCmd;

CASE step OF
0: // 等待回零指令
IF bHomeCmd THEN
step := 1;
END_IF;

1: // 执行回零
HomeX(
Axis := Axis_X,
Execute := TRUE,
Mode := 3, // 模式 3: 原点开关 + Z 脉冲
Position := 0.0, // 原点位置设为 0
Velocity := 50.0, // 50 mm/s
Acceleration := 500.0,
HomeSwitchVelocity := 10.0 // 10 mm/s 逼近
);

IF HomeX.Done THEN
HomeX(Execute := FALSE);
bHomed := TRUE;
step := 0;
END_IF;

IF HomeX.Error THEN
// 处理错误
bHomed := FALSE;
step := 0;
END_IF;
END_CASE;

回零轨迹图(模式 3):

          原点开关
───┐───

────────┘──────── 位置



50mm/s ──→│ 10mm/s ──→
│ │
│ │→ Z 脉冲 → 原点偏移 0.5mm

3.3 MC_MoveAbsolute — 绝对定位

功能: 将轴移动到指定的绝对位置。不管当前位置在哪,都是相对于坐标系原点的位置。

参数表:

参数类型说明
AxisAXIS_REF轴引用
ExecuteBOOL上升沿触发
PositionREAL目标位置(单位: mm, 度, 脉冲)
VelocityREAL最大速度
AccelerationREAL加速度
DecelerationREAL减速度(默认为 Acceleration)
JerkREAL跃度(默认为 0=不使用)
DirectionINT方向(0=最短路径, 1=正, 2=负)
BufferModeINT运动衔接模式
DoneBOOL到达目标位置
BusyBOOL正在执行
ActiveBOOL已被调度器接收
CommandAbortedBOOL被中止
ErrorBOOL错误标志
ErrorIDUINT错误码

运动轨迹图:

位置 ↑
│ ╱╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ 当前位置 ╱ ╲ 目标位置 100mm
│ 0mm ╱ ╲
└─────────┴──────────────────┴──────→ 时间
↑ ↑
加速段 减速段
(T 曲线) (S 曲线)

SCL 示例:

PROGRAM SingleAxisMove
VAR
MoveAbs : MC_MoveAbsolute;
bMoveCmd : BOOL;
bArrived : BOOL;
END_VAR

// 绝对定位到 100mm 位置
MoveAbs(
Axis := Axis_X,
Execute := bMoveCmd,
Position := 100.0, // 目标位置 100mm
Velocity := 100.0, // 最大速度 100mm/s
Acceleration := 1000.0, // 加速度 1000mm/s²
Deceleration := 1000.0, // 减速度 1000mm/s²
Jerk := 5000.0 // 跃度 5000mm/s³
);

// 到达后复位命令
IF MoveAbs.Done THEN
bArrived := TRUE;
bMoveCmd := FALSE; // 注意: Execute 必须下降沿
END_IF;

常见错误:

错误原因纠正
目标位置超出软限位Position 在软限位外检查 Position 范围
轴不动轴未使能先调 MC_Power
运动被中止新指令中断了当前运动检查 BufferMode
到达后过冲减速度不够增大减速度或减小负载惯量

3.4 MC_MoveRelative — 相对定位

功能: 从当前位置移动指定的距离。正数正向,负数反向。

运动轨迹图:

位置 ↑
│ ╱╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ 当前位置 ╱ ╲ Distance=50mm
│ ────────╱ ╲───────
└──────────────────────────────────→ 时间
←── Distance=50mm ──→

SCL 示例:

PROGRAM RelativeMove
VAR
MoveRel : MC_MoveRelative;
iCount : INT := 0;
END_VAR

// 每次触发正向移动 10mm
IF bTrigger THEN
MoveRel(
Axis := Axis_X,
Execute := TRUE,
Distance := 10.0, // 每次移动 10mm
Velocity := 50.0,
Acceleration := 500.0
);
END_IF;

// 如果已经移动了 100mm,改为反向
IF MoveRel.Done THEN
iCount := iCount + 1;
IF iCount >= 10 THEN
// 反向移动
MoveRel(
Axis := Axis_X,
Execute := TRUE,
Distance := -10.0, // 负值表示反向
Velocity := 50.0,
Acceleration := 500.0
);
iCount := 0;
END_IF;
END_IF;

3.5 MC_MoveVelocity — 速度模式

功能: 控制轴以指定速度持续运行,直到被其他指令停止。

运动轨迹图:

速度 ↑
│ ╱────────────────────
│ ╱
│ ╱
│ ╱
│ ╱
└────┴─────────────────────────→ 时间

加速到目标速度

SCL 示例:

PROGRAM VelocityCtrl
VAR
MoveVel : MC_MoveVelocity;
bForward : BOOL;
bBackward : BOOL;
END_VAR

// 正向运行
IF bForward THEN
MoveVel(
Axis := Axis_X,
Execute := TRUE,
Velocity := 100.0, // 100 mm/s 正向
Acceleration := 500.0,
Direction := 1 // 正向
);
END_IF;

// 停止速度模式(用 Halt)
IF bStop THEN
// 停止速度模式运行
END_IF;

// 读取当前速度
// 实际速度 = MoveVel.ActualVelocity

3.6 MC_Halt — 暂停

功能: 让轴减速停止,停下来后处于 Standstill 状态,可接收后续运动指令。

与 MC_Stop 的区别:

特性MC_HaltMC_Stop
停止后状态Standstill(可继续运动)ErrorStop(需 Reset)
减速度使用正常减速度使用急停减速度
适用场景正常暂停、换料紧急停止、安全门打开
恢复方式直接发新指令先 Reset 再发指令

SCL 示例:

PROGRAM HaltExample
VAR
HaltCmd : MC_Halt;
StopCmd : MC_Stop;
ResetCmd : MC_Reset;
bEStop : BOOL;
END_VAR

// 正常暂停
IF bPause THEN
HaltCmd(
Axis := Axis_X,
Execute := TRUE,
Deceleration := 1000.0 // 正常减速度
);
END_IF;

// 急停
IF bEStop THEN
StopCmd(
Axis := Axis_X,
Execute := TRUE
);
END_IF;

// 急停后必须复位
IF StopCmd.Done AND NOT bEStop THEN
ResetCmd(
Axis := Axis_X,
Execute := TRUE
);
END_IF;

3.7 MC_Stop — 急停

功能: 立即减速停止,轴进入 ErrorStop 状态,需要 MC_Reset 清除后才能继续运动。

SCL 示例:

PROGRAM EmergencyStop
VAR
StopCmd : MC_Stop;
ResetCmd : MC_Reset;
bEStop : BOOL; // 外部急停信号
bResetReq : BOOL; // 复位请求
END_VAR

// 急停
StopCmd(
Axis := Axis_X,
Execute := bEStop OR bEStop_Group,
Deceleration := 5000.0 // 急停减速度,大加速度
);

// 急停后必须复位
IF StopCmd.Done AND bResetReq THEN
ResetCmd(
Axis := Axis_X,
Execute := TRUE
);
END_IF;

3.8 MC_ReadStatus — 轴状态读取

功能: 读取轴的当前状态(状态机)。

参数表:

参数类型说明
AxisAXIS_REF轴引用
ValidBOOL数据有效
BusyBOOL正在执行
ErrorBOOL错误标志
ErrorIDUINT错误码
DisabledBOOL轴未使能
StoppingBOOL正在停止
StandStillBOOL轴静止就绪
MovingBOOL正在运动
AcceleratingBOOL正在加速
DeceleratingBOOL正在减速
ConstantVelocityBOOL匀速
ErrorStopBOOL错误停止

SCL 示例:

PROGRAM ReadAxisStatus
VAR
ReadStatus : MC_ReadStatus;
sAxisState : STRING;
END_VAR

// 读取轴状态
ReadStatus(Axis := Axis_X);

// 根据状态显示文字
IF ReadStatus.Disabled THEN
sAxisState := '未使能';
ELSIF ReadStatus.ErrorStop THEN
sAxisState := '错误停止';
ELSIF ReadStatus.Stopping THEN
sAxisState := '减速中';
ELSIF ReadStatus.Moving THEN
sAxisState := '运动中';
ELSIF ReadStatus.StandStill THEN
sAxisState := '就绪';
ELSE
sAxisState := '未知';
END_IF;

// 输出到 HMI 显示
// HMI_State := sAxisState;

3.9 MC_ReadAxisError — 轴错误读取

功能: 读取轴的详细错误信息。

SCL 示例:

PROGRAM ReadAxisError
VAR
ReadErr : MC_ReadAxisError;
sErrorMsg : STRING;
END_VAR

// 读取错误
ReadErr(Axis := Axis_X);

IF ReadErr.Error THEN
// 根据 ErrorID 显示错误描述
CASE ReadErr.ErrorID OF
16#1001: sErrorMsg := '参数无效';
16#2001: sErrorMsg := '状态机不允许';
16#3001: sErrorMsg := '位置超限';
16#4001: sErrorMsg := 'EtherCAT 通讯中断';
16#5001: sErrorMsg := '安全门打开';
16#6001: sErrorMsg := '驱动器报警';
16#6002: sErrorMsg := '过流';
16#6003: sErrorMsg := '过压';
16#6004: sErrorMsg := '编码器故障';
ELSE
sErrorMsg := '未知错误: ' + UINT_TO_STRING(ReadErr.ErrorID);
END_CASE;
END_IF;

3.10 MC_Reset — 轴故障复位

功能: 清除轴的错误状态,使轴从 ErrorStop 回到 Standstill。

SCL 示例:

PROGRAM AxisReset
VAR
ResetCmd : MC_Reset;
bResetBtn : BOOL;
END_VAR

// 故障复位
ResetCmd(
Axis := Axis_X,
Execute := bResetBtn
);

// 复位成功
IF ResetCmd.Done THEN
// 可以继续运动
END_IF;

// 复位失败(可能驱动器还有报警)
IF ResetCmd.Error THEN
// 需要先清除驱动器报警
END_IF;

单轴运动完整示例:传送带定位

PROGRAM ConveyorAxisCtrl
VAR
// 功能块实例
Power : MC_Power;
Home : MC_Home;
MoveAbs : MC_MoveAbsolute;
MoveRel : MC_MoveRelative;
HaltCmd : MC_Halt;
ReadStat : MC_ReadStatus;
ResetCmd : MC_Reset;

// 状态机
State : INT := 0;
bHomed : BOOL := FALSE;
CycleCnt : INT := 0;

// 位置参数(从全局 DB 读取)
PosPick : REAL := 100.0; // 取料位置
PosPlace : REAL := 500.0; // 放料位置
Speed : REAL := 200.0; // 运行速度
Accel : REAL := 2000.0; // 加速度
END_VAR

// ====== 主程序 ======

// 1. 始终使能
Power(Axis := ConveyorAxis, Enable := TRUE);

// 2. 读取状态
ReadStat(Axis := ConveyorAxis);

// 3. 错误处理
IF ReadStat.ErrorStop THEN
// 显示错误到 HMI
// HMI_Error := ReadStat.ErrorID;

// 如果复位按钮按下
IF bResetBtn THEN
ResetCmd(Axis := ConveyorAxis, Execute := TRUE);
IF ResetCmd.Done THEN
State := 0;
END_IF;
END_IF;
RETURN; // 错误状态不执行后续逻辑
END_IF;

// 4. 状态机
IF NOT Power.Status THEN
State := 0;
RETURN;
END_IF;

CASE State OF
0: // 回零
IF NOT bHomed THEN
Home(Axis := ConveyorAxis, Execute := TRUE,
Mode := 3, Position := 0.0,
Velocity := 50.0, Acceleration := Accel);
IF Home.Done THEN
Home(Execute := FALSE);
bHomed := TRUE;
State := 10;
END_IF;
ELSE
State := 10;
END_IF;

10: // 等待取料信号
IF DI[1] = TRUE THEN // 工件到位传感器
State := 20;
END_IF;

20: // 移动到取料位置
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := PosPick, Velocity := Speed,
Acceleration := Accel, Deceleration := Accel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
State := 30;
END_IF;

30: // 等待取料完成
WAIT DI[2] = TRUE, Timeout := 2.0; // 等待夹爪到位
DELAY 0.5; // 等待夹紧
State := 40;

40: // 移动到放料位置
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := PosPlace, Velocity := Speed,
Acceleration := Accel, Deceleration := Accel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
State := 50;
END_IF;

50: // 等待放料完成
DELAY 0.3;
CycleCnt := CycleCnt + 1;
State := 10; // 回到等待
END_CASE;

4. 多轴插补

多轴插补让多个轴协调运动,实现复杂的轨迹。

4.1 MC_MoveLinear — 直线插补 (2D/3D)

功能: 多个轴同时运动,使工具中心点(TCP)沿直线从起点到终点。

参数表:

参数类型说明
AxisGroupAXIS_GROUP_REF轴组引用
ExecuteBOOL上升沿触发
EndPointARRAY[1..n] OF REAL终点坐标(各轴分量)
VelocityREAL轨迹速度 (mm/s 或 deg/s)
AccelerationREAL轨迹加速度
DecelerationREAL轨迹减速度
JerkREAL轨迹跃度
CoordSystemINT坐标系 (0=轴系, 1=笛卡尔)
BufferModeINT运动衔接模式
DoneBOOL完成标志
BusyBOOL正在执行
ActiveBOOL已被接收
CommandAbortedBOOL被中止
ErrorBOOL错误标志
ErrorIDUINT错误码

2D 直线插补轨迹图:

Y ↑
│ ╱ 终点 (100, 80)
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ 起点 ╱
│ (0,0) ╱
└────────┴──────────────────────→ X

3D 直线插补轨迹图:

Z ↑
│ ╱ 终点 (80, 60, 50)
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│╱ 起点 (0,0,0)
└───────────────→ Y

╲ X

SCL 示例:

PROGRAM LinearInterpolation
VAR
// 轴组引用(在轴配置中定义的 2 轴组)
XY_Group : AXIS_GROUP_REF;

// 功能块
MoveLin : MC_MoveLinear;
MoveLin2 : MC_MoveLinear;

// 状态机
State : INT := 0;
END_VAR

CASE State OF
0: // 使能轴组
// 先使能组内所有轴
PowerX(Axis := Axis_X, Enable := TRUE);
PowerY(Axis := Axis_Y, Enable := TRUE);
IF PowerX.Status AND PowerY.Status THEN
State := 10;
END_IF;

10: // 回零
// 回零代码...
State := 20;

20: // 直线插补到点 (100, 80)
MoveLin(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [100.0, 80.0], // X=100, Y=80
Velocity := 100.0, // 轨迹速度 100mm/s
Acceleration := 1000.0,
Deceleration := 1000.0,
BufferMode := mcBlendingLow // 平滑过渡
);

IF MoveLin.Done THEN
MoveLin(Execute := FALSE);
State := 30;
END_IF;

30: // 继续直线插补到点 (200, 0)
MoveLin2(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [200.0, 0.0],
Velocity := 100.0,
Acceleration := 1000.0,
Deceleration := 1000.0,
BufferMode := mcBlendingLow
);

IF MoveLin2.Done THEN
MoveLin2(Execute := FALSE);
State := 20; // 循环
END_IF;
END_CASE;

4.2 MC_MoveCircular — 圆弧插补

功能: 多个轴沿圆弧运动。支持两种方式:中心点方式三点方式

圆弧插补轨迹图:

Y ↑

│ 起点 (100, 0)
│ ●───────────────○
│ ╲ ╱
│ ╲ 圆心 ╱
│ ╲ (0,0) ╱
│ ╲ ╱
│ ╲ ╱
│ ╲ ╱
│ ╲╱
│ ●
│ 终点 (0, -100)
└──────────────────────→ X

中心点方式:

// 圆弧插补 - 中心点方式
// 圆心: (0, 0), 起点: (100, 0), 终点: (0, -100)
MoveCirc_Center(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [0.0, -100.0], // 终点
AuxPoint := [0.0, 0.0], // 圆心 (CenterPoint)
PathChoice := 0, // 0=顺时针, 1=逆时针
Velocity := 100.0,
Acceleration := 1000.0,
Deceleration := 1000.0
);

三点方式:

// 圆弧插补 - 三点方式
// 起点: (100, 0), 中间点: (0, 100), 终点: (-100, 0)
MoveCirc_Point(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [-100.0, 0.0], // 终点
AuxPoint := [0.0, 100.0], // 圆弧上中间点
PathChoice := 0,
Velocity := 100.0,
Acceleration := 1000.0
);

4.3 MC_MoveDirectAbsolute — 多轴独立绝对定位

功能: 组内各轴独立运动到各自的目标位置,各轴不需要同步到达。

SCL 示例:

// 多轴独立绝对定位
// X 轴到 200mm,Y 轴到 150mm,各轴独立运动
MoveDirectAbs(
AxisGroup := XY_Group,
Execute := TRUE,
Position := [200.0, 150.0], // 各轴独立目标
Velocity := [100.0, 80.0], // 各轴独立速度
Acceleration := [1000.0, 1000.0],
Deceleration := [1000.0, 1000.0]
);

4.4 插补精度与速度控制

参数影响设置建议
插补周期精度越高,CPU 负载越高默认 1ms,高速时 0.5ms
速度波动大加速度导致速度波动使用 S 曲线,设 Jerk 参数
轮廓误差圆弧插补的弦高误差自动计算,最大 0.01mm
速度前瞻连续轨迹的平滑度默认 10 段,可调至 50 段

5. 电子齿轮与电子凸轮

5.1 MC_GearIn — 电子齿轮啮合

功能: 从轴跟随主轴运动,保持固定比例关系。

原理图:

主轴 (Master)  ──────┬────── 速度 Vm

│ GearIn (比例 = 2:1)


从轴 (Slave) ──────┬────── 速度 Vs = Vm × Ratio

参数表:

参数类型说明
MasterAXIS_REF主轴(通常为虚拟轴或编码器)
SlaveAXIS_REF从轴
ExecuteBOOL上升沿触发
RatioNumeratorDINT比例分子(从轴脉冲数)
RatioDenominatorDINT比例分母(主轴脉冲数)
AccelerationREAL啮合加速度
DecelerationREAL脱开减速度
InGearBOOL已啮合标志
BusyBOOL正在执行
ErrorBOOL错误标志

SCL 示例:

PROGRAM GearControl
VAR
GearIn : MC_GearIn;
GearOut : MC_GearOut;
bEngage : BOOL;
bDisengage : BOOL;
END_VAR

// 啮合: 从轴跟随主轴,比例 2:1
// 即主轴每转 1 圈,从轴转 2 圈
IF bEngage THEN
GearIn(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE,
RatioNumerator := 2, // 分子
RatioDenominator := 1, // 分母
Acceleration := 1000.0
);
END_IF;

// 脱开
IF bDisengage THEN
GearOut(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE
);
END_IF;

// 读取状态
IF GearIn.InGear THEN
// 已啮合,从轴同步跟随主轴
END_IF;

齿轮比计算示例:

场景主轴速度从轴速度比例RatioNumeratorRatioDenominator
相同速度1000 rpm1000 rpm1:111
减速1500 rpm500 rpm1:313
增速500 rpm2000 rpm4:141
精确比例2 圈5 圈5:252

5.2 MC_GearOut — 电子齿轮脱开

功能: 解除从轴与主轴之间的齿轮关系,从轴恢复独立运动。

SCL 示例:

GearOut(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE,
Deceleration := 1000.0 // 脱开时的减速度
);

5.3 MC_CamIn — 电子凸轮啮合

功能: 从轴跟随主轴运动,但不是简单的比例关系,而是按照 CAM 曲线定义的非线性关系运动。

原理图:

主轴位置 ↑
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│╱
└───────────────────────────→ 从轴位置

CAM 曲线示例——飞剪同步曲线:

从轴位置 ↑
│ ┌──────────────┐
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│╱ ╲
└──────────────────────────────────→ 主轴位置
↑ 同步区 ↑ 回程区
(剪切过程) (等待下一刀)

SCL 示例:

PROGRAM CamControl
VAR
CamIn : MC_CamIn;
CamOut : MC_CamOut;
CamTable : MC_CamTableSelect;
bEngage : BOOL;
bDisengage : BOOL;
END_VAR

// 1. 选择凸轮表
CamTable(
CamTable := 1, // 凸轮表编号(在 IDE 中编辑)
Execute := TRUE
);

// 2. 啮合凸轮
IF bEngage THEN
CamIn(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE,
CamTable := 1,
MasterStartPos := 0.0, // 主轴起始位置
MasterEndPos := 360.0, // 主轴结束位置
SlaveStartPos := 0.0, // 从轴起始位置
SlaveEndPos := 100.0, // 从轴结束位置
MasterScaling := 1, // 主轴缩放
SlaveScaling := 1, // 从轴缩放
StartMode := 0 // 0=当前位置开始
);
END_IF;

// 3. 脱开凸轮
IF bDisengage THEN
CamOut(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE
);
END_IF;

5.4 CAM 曲线定义

在 Darra IDE 的凸轮编辑器中,可以直观地编辑 CAM 曲线:

┌─ 凸轮编辑器 ─────────────────────────────────────────┐
│ │
│ 从轴位置 ↑ │
│ 100 │ ┌──────────┐ │
│ │ ╱ ╲ │
│ 80 │╱ ╲ │
│ │ ╲ │
│ 60 │ ╲ │
│ │ ╲ │
│ 40 │ ╲ │
│ │ ╲ │
│ 20 │ ╲ │
│ │ ╲ │
│ 0 └──────────────────────┴──────────────────→ │
│ 0 72 144 216 288 360 │
│ 主轴位置 (度) │
│ │
│ 曲线类型: [多项式 5 次] 同步区间: 60°~180° │
│ 最大速度: 150 mm/s 最大加速度: 5000 mm/s² │
│ │
│ 插入点: 修改点: 删除点: │
│ │
│ ┌─ 曲线参数 ─────────────────────────────────┐ │
│ │ 点 1: (0, 0) | 点 2: (60, 20) | 点 3: ... │ │
│ │ 多项式: 5 次 | 插值: 样条 | 速度: 0 │ │
│ └─────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────┘

CAM 曲线类型:

曲线类型特点适用场景
多项式 3 次速度连续,加速度有跳变低速凸轮
多项式 5 次速度和加速度都连续,平滑通用推荐
多项式 7 次速度和加速度二阶导数连续高速凸轮,振动敏感
样条 (Spline)通过所有控制点,完全平滑复杂曲线
修正正弦修正正弦加速度曲线飞剪、追剪
自定义自由绘制特殊运动需求

飞剪凸轮曲线示例 (5 次多项式):

// 飞剪凸轮曲线参数
// 主轴周期: 360° (一圈)
// 从轴行程: 0~100mm (剪切行程)
// 同步区: 60°~180° (与材料速度同步)
// 回程区: 180°~360° (快速返回,准备下一刀)

CamTableParams := [[0, 0], [60, 20], [180, 100], [200, 95], [360, 0]];

5.5 实际应用:飞剪

飞剪是电子凸轮最经典的应用——旋转刀在材料运动时同步跟随,切断后快速返回:

材料运动方向 ────────────────→
┌───────────────┐
│ 旋转刀 │
│ ┌─────────┐ │
════════════ │ │ 刀片 │ │ ════════════
│ └─────────┘ │
└───────────────┘
↑ 同步区剪切

从轴位置/速度

│ ┌──────────┐
│ ╱ ╲ 速度曲线
│╱ ╲
│ ╲
│ ╲
└──────────────────┴──────────→

↑ 同步 (剪切) ↑ 回程 (快速返回)

SCL 完整示例:

PROGRAM FlyingShear
VAR
// 轴
MaterialAxis : AXIS_REF; // 材料主轴(虚拟轴,跟随编码器)
CutterAxis : AXIS_REF; // 刀具从轴

// 功能块
PowerCutter : MC_Power;
CamIn : MC_CamIn;
CamOut : MC_CamOut;
CutCmd : BOOL;
bInSync : BOOL;
nCutCount : INT := 0;
END_VAR

// 使能刀具轴
PowerCutter(Axis := CutterAxis, Enable := TRUE);

// 主循环
IF PowerCutter.Status AND NOT CamIn.InGear THEN
// 啮合凸轮
CamIn(
Master := MaterialAxis,
Slave := CutterAxis,
Execute := TRUE,
CamTable := 1,
MasterStartPos := 0.0,
MasterEndPos := 360.0,
SlaveStartPos := 0.0,
SlaveEndPos := 100.0
);
END_IF;

// 凸轮已啮合
bInSync := CamIn.InGear;

// 剪切完成计数(在同步区末端触发)
IF bInSync AND CamIn.SlavePosition >= 99.0 THEN
nCutCount := nCutCount + 1;
CutCmd := TRUE;
// 输出剪切信号
DO[1] := TRUE;
DELAY 0.05;
DO[1] := FALSE;
END_IF;

6. 位置控制模式

Darra 伺服驱动器支持 CiA 402 标准定义的所有控制模式:

6.1 模式总览

模式缩写代码描述适用场景
轮廓位置模式pp1驱动器内部完成位置曲线规划点到点定位
轮廓速度模式pv3驱动器内部完成速度曲线规划传送带恒速
轮廓力矩模式pt4驱动器内部完成力矩曲线规划压合、拧紧
回零模式hm6驱动器执行回零回原点
插补位置模式ip7上位机逐周期发位置指令多轴插补(推荐)
循环同步位置csp8上位机每周期发目标位置通用模式(推荐)
循环同步速度csv9上位机每周期发目标速度速度同步
循环同步力矩cst10上位机每周期发目标力矩力矩控制

6.2 模式选择指南

6.3 csp 模式(推荐)

csp 模式(Cyclic Synchronous Position)是 Darra 推荐的默认模式。上位机每个周期(1ms)发送目标位置,驱动器完成速度和电流环。

PLC 周期 (1ms)      驱动器周期 (62.5μs)
│ │
│ 目标位置 ────────→ 位置环
│ │
│ │ 速度环
│ │
│ │ 电流环
│ │
│ 编码器反馈 ←───────│
│ │
└────────────────────┘

配置方式:在轴配置页面选择"csp 模式",或通过 SDO 设置:

// 通过 SDO 设置控制模式为 csp (8)
// 在轴配置时自动完成,一般不需要手动写
// 如果需要切换:
SDO_Write( SlaveID := 3, Index := 16#6060, SubIndex := 0, Value := 8 );

6.4 pp 模式

轮廓位置模式:上机位只发目标位置,驱动器内部完成加减速规划(T 曲线或 S 曲线)。

上位机: 发目标位置 (100mm)


驱动器: 内部规划速度曲线
┌────────────────────────┐
│ 100mm ────────────────→│
│ 加速 → 匀速 → 减速 │
└────────────────────────┘


电机到达 100mm

优点: 减少上位机通讯负担 缺点: 驱动器之间的同步精度不如 csp


7. 轴组与坐标系

7.1 轴组定义

轴组 (Group) 将多个物理轴组合成一个逻辑单元,实现多轴协调运动。

轴组配置示例:

轴组: XY_Table
├── Axis_X: 伺服轴 (松下 MINAS A6B, 站号 3)
├── Axis_Y: 伺服轴 (松下 MINAS A6B, 站号 4)
└── Kinematics: 2D 直角坐标
├── 正解: (X, Y) = (J1, J2)
└── 逆解: (J1, J2) = (X, Y)

SCL 中引用轴组:

VAR
// 在轴配置中定义好的轴组
XY_Group : AXIS_GROUP_REF;

// 轴组功能块
GrpEnable : MC_GroupEnable;
GrpDisable : MC_GroupDisable;
GrpHome : MC_GroupHome;
GrpStop : MC_GroupStop;
GrpReset : MC_GroupReset;
GrpReadStatus : MC_GroupReadStatus;
END_VAR

// 使能轴组
GrpEnable(AxisGroup := XY_Group, Enable := TRUE);

7.2 正运动学 (FK): 关节→笛卡尔

正运动学:已知各关节角度,求 TCP 在笛卡尔空间的位置。

2 轴直角坐标:

正解: X = J1
Y = J2

6 轴关节机器人:

正解: 使用 DH 参数表
[X, Y, Z, Rx, Ry, Rz] = FK(J1, J2, J3, J4, J5, J6)

7.3 逆运动学 (IK): 笛卡尔→关节

逆运动学:已知 TCP 在笛卡尔空间的目标位置,求各关节角度。

2 轴直角坐标:

逆解: J1 = X
J2 = Y

2 轴平面关节:

             ┌──────────────────────────────┐
│ 逆解公式: │
│ J2 = arccos((X² + Y² - L1² - L2²) / (2 × L1 × L2)) │
│ J1 = arctan(Y/X) - arctan(L2 × sin(J2) / (L1 + L2 × cos(J2))) │
└──────────────────────────────┘

7.4 工具坐标系 (TCP)

工具坐标系 (TCP, Tool Center Point) 定义工具末端相对机器人法兰的位置和姿态。

配置:

TCP 位置:
X = 0.0 mm (相对法兰中心)
Y = 0.0 mm
Z = 150.0 mm (工具长度 150mm)

TCP 姿态:
Rx = 0.0° (绕 X 轴旋转)
Ry = 0.0° (绕 Y 轴旋转)
Rz = 0.0° (绕 Z 轴旋转)

标定方法:

1. 四点法: 移动机器人到同一参考点,变换 4 个不同姿态
2. 六点法: 更精确,变换 6 个姿态
3. 外部测量: 使用激光跟踪仪或 3D 测量

7.5 工件坐标系 (WCS)

工件坐标系相对机器基座坐标系偏移,编程时坐标直接以工件为参考:

机器基座坐标系 (MCS)        工件坐标系 (WCS)
┌─────┐ ┌─────┐
│ │ X=200,Y=100 │ │
│ │ Z=0,Rz=30° │ │
│ │ ───────────→ │ │
│ │ 平移 + 旋转 │ │
└─────┘ └─────┘

SCL 设置:

// 设置工件坐标系
MC_SetCartesianTransform(
AxisGroup := Robot1,
Execute := TRUE,
Coordinate := WCS, // 工件坐标系
Translation := [200.0, 100.0, 0.0], // 平移
Rotation := [0.0, 0.0, 30.0] // 旋转 (Z 轴 30°)
);

8. CNC 与 G 代码 (P5 预留)

当前状态: P5 预留,正在开发中,预计下一版本可用。

8.1 CNC 架构概述

G 代码文件 ──→ 解析器 ──→ 路径缓存 ──→ 前瞻模块 ──→ 速度规划 ──→ 插补器 ──→ 轴
│ │ │ │ │
│ G01 │ 10 段 │ 自动减速 │ S 曲线 │ 1ms
│ G02 │ │ 拐角处理 │ │
│ G03 │ │ │ │

8.2 G 代码示例

% 加工一个矩形
G21 ; 单位 mm
G90 ; 绝对坐标
G17 ; XY 平面
M03 S1000 ; 主轴 1000 rpm

G00 Z5.0 ; 快速移动到安全高度
G00 X0 Y0 ; 快速移动到起点

G01 Z-1.0 F100 ; 下刀 1mm, 进给 100mm/min
G01 X100 Y0 ; 直线到 (100,0)
G01 X100 Y100 ; 直线到 (100,100)
G01 X0 Y100 ; 直线到 (0,100)
G01 X0 Y0 ; 回到起点
G00 Z5.0 ; 抬刀

M05 ; 主轴停止
M30 ; 程序结束

8.3 当前可实现方案

虽然 CNC 功能模块在 P5 阶段,但您可以使用 MC_MoveLinear + MC_MoveCircular 组合实现基本的数控功能:

// 用 PLCopen 功能块实现 G 代码等效
// 加工矩形轮廓

// G00 Z5.0
MoveAbs(Axis := Z, Position := 5.0, Velocity := 500.0);
// G00 X0 Y0
MoveLin(Group := XY_Group, EndPoint := [0.0, 0.0], Velocity := 500.0);
// G01 Z-1.0 F100
MoveAbs(Axis := Z, Position := -1.0, Velocity := 10.0);
// G01 X100
MoveLin(Group := XY_Group, EndPoint := [100.0, 0.0], Velocity := 50.0);
// G01 X100 Y100
MoveLin(Group := XY_Group, EndPoint := [100.0, 100.0], Velocity := 50.0);
// G01 X0 Y100
MoveLin(Group := XY_Group, EndPoint := [0.0, 100.0], Velocity := 50.0);
// G01 X0 Y0
MoveLin(Group := XY_Group, EndPoint := [0.0, 0.0], Velocity := 50.0);
// G00 Z5.0
MoveAbs(Axis := Z, Position := 5.0, Velocity := 500.0);

9. 实际应用示例

9.1 单轴定位搬运(伺服电机控制)

场景: 传送带上的工件需要从取料位移动到放料位。

设备:

  • 1 台伺服电机(松下 MINAS A6B)
  • 丝杠模组,行程 500mm
  • 到位传感器 × 2

SCL 程序:

PROGRAM SingleAxisTransfer
VAR
// 功能块
Power : MC_Power;
Home : MC_Home;
MoveAbs : MC_MoveAbsolute;
ReadSt : MC_ReadStatus;
Reset : MC_Reset;

// 状态机
State : INT := 0;
bInitialized : BOOL := FALSE;
nCycle : INT := 0;

// 位置参数
cPickPos : REAL := 50.0; // 取料位 50mm
cPlacePos : REAL := 450.0; // 放料位 450mm
cSpeed : REAL := 300.0; // 速度 300mm/s
cAccel : REAL := 3000.0; // 加速度 3000mm/s²
END_VAR

// === 主循环 ===

// 1. 使能轴
Power(Axis := ConveyorAxis, Enable := TRUE);

// 2. 读状态
ReadSt(Axis := ConveyorAxis);

// 3. 错误处理
IF ReadSt.ErrorStop THEN
Reset(Axis := ConveyorAxis, Execute := TRUE);
IF Reset.Done THEN
Reset(Execute := FALSE);
State := 0;
END_IF;
RETURN;
END_IF;

// 4. 轴就绪才能运行
IF NOT Power.Status THEN
State := 0;
RETURN;
END_IF;

// 5. 状态机
CASE State OF
0: // 初始化 - 回零
IF NOT bInitialized THEN
Home(Axis := ConveyorAxis, Execute := TRUE,
Mode := 3, Position := 0.0,
Velocity := 50.0, Acceleration := cAccel);
IF Home.Done THEN
Home(Execute := FALSE);
bInitialized := TRUE;
State := 10;
END_IF;
ELSE
State := 10;
END_IF;

10: // 等待取料信号
IF DI[1] = TRUE THEN // 工件到位传感器
State := 20;
END_IF;

20: // 移动到取料位
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := cPickPos, Velocity := cSpeed,
Acceleration := cAccel, Deceleration := cAccel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
DO[1] := TRUE; // 夹爪闭合
DELAY 0.3;
State := 30;
END_IF;

30: // 移动到放料位
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := cPlacePos, Velocity := cSpeed,
Acceleration := cAccel, Deceleration := cAccel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
DO[1] := FALSE; // 夹爪打开
DELAY 0.3;
nCycle := nCycle + 1;
State := 10; // 回到等待
END_IF;
END_CASE;

9.2 两轴直线插补(XY 工作台)

场景: 点胶机 XY 工作台沿直线路径点胶。

SCL 程序:

PROGRAM XYGluePath
VAR
// 轴组
XY_Group : AXIS_GROUP_REF;

// 功能块
GrpEnable : MC_GroupEnable;
MoveLin1 : MC_MoveLinear;
MoveLin2 : MC_MoveLinear;
MoveLin3 : MC_MoveLinear;
MoveLin4 : MC_MoveLinear;

// 状态机
State : INT := 0;
bGlueOn : BOOL;
END_VAR

// 使能轴组
GrpEnable(AxisGroup := XY_Group, Enable := TRUE);

IF NOT GrpEnable.Status THEN
RETURN;
END_IF;

// 点胶路径: 矩形 + 对角线
CASE State OF
0: // 移动到起点上方
MoveLin1(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [10.0, 10.0], // X=10, Y=10
Velocity := 200.0, Acceleration := 2000.0,
BufferMode := mcAborting);
IF MoveLin1.Done THEN
MoveLin1(Execute := FALSE);
State := 10;
END_IF;

10: // 开始点胶
bGlueOn := TRUE; // 打开点胶阀
DELAY 0.1;
State := 20;

20: // 直线到 (90, 10)
MoveLin2(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [90.0, 10.0],
Velocity := 50.0, Acceleration := 1000.0,
BufferMode := mcBlendingLow);
IF MoveLin2.Done THEN
MoveLin2(Execute := FALSE);
State := 30;
END_IF;

30: // 直线到 (90, 90)
MoveLin3(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [90.0, 90.0],
Velocity := 50.0, Acceleration := 1000.0);
IF MoveLin3.Done THEN
MoveLin3(Execute := FALSE);
State := 40;
END_IF;

40: // 直线到 (10, 90)
MoveLin4(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [10.0, 90.0],
Velocity := 50.0, Acceleration := 1000.0);
IF MoveLin4.Done THEN
MoveLin4(Execute := FALSE);
bGlueOn := FALSE; // 关闭点胶阀
State := 50;
END_IF;

50: // 回到起点
MoveLin1(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [10.0, 10.0],
Velocity := 200.0, Acceleration := 2000.0);
IF MoveLin1.Done THEN
MoveLin1(Execute := FALSE);
State := 0; // 完成一个循环
END_IF;
END_CASE;

点胶路径图:

Y ↑
90│ ┌─────────────────┐
│ │ │
│ │ 点胶路径 │
│ │ (针头沿直线) │
│ │ │
│ │ │
10│ └─────────────────┘

└──┴─────────────────┴──→ X
10 90

9.3 电子齿轮同步(印刷机从轴跟随主轴)

场景: 印刷机中,印刷辊(从轴)必须跟随材料(主轴)同步运动。

SCL 程序:

PROGRAM PrintingPressSync
VAR
// 轴
MaterialAxis : AXIS_REF; // 材料主轴(虚拟轴,跟随编码器)
PrintRoller : AXIS_REF; // 印刷辊

// 功能块
PowerRoller : MC_Power;
GearIn : MC_GearIn;
GearOut : MC_GearOut;
bRunning : BOOL;
bError : BOOL;
END_VAR

// 使能印刷辊
PowerRoller(Axis := PrintRoller, Enable := bRunning);

// 控制逻辑
IF bRunning THEN
// 啮合齿轮: 印刷辊与材料同步
// 比例: 材料走 100mm,印刷辊转 1 圈
GearIn(
Master := MaterialAxis,
Slave := PrintRoller,
Execute := TRUE,
RatioNumerator := 1, // 从轴转 1 圈
RatioDenominator := 100, // 材料走 100mm
Acceleration := 500.0
);

// 监控同步状态
IF GearIn.InGear THEN
// 同步正常
bError := FALSE;
END_IF;

// 同步丢失处理
IF GearIn.Error THEN
bError := TRUE;
// 报警输出
END_IF;
ELSE
// 脱开齿轮
GearOut(
Master := MaterialAxis,
Slave := PrintRoller,
Execute := TRUE
);
END_IF;

9.4 电子凸轮飞剪(旋转刀剪切)

场景: 连续运动的材料上,旋转刀在材料运动过程中同步剪切,然后快速返回。

PROGRAM FlyingShearFull
VAR
// 轴
Material : AXIS_REF; // 材料主轴(编码器)
CutterMotor : AXIS_REF; // 旋转刀伺服

// 功能块
PowerCutter : MC_Power;
CamIn : MC_CamIn;
CamOut : MC_CamOut;
CamTableSel : MC_CamTableSelect;

// 控制
bCutCycle : BOOL := TRUE;
nCutCount : INT := 0;
bCutOutput : BOOL;
END_VAR

// 使能
PowerCutter(Axis := CutterMotor, Enable := TRUE);

// 选择凸轮表
CamTableSel(CamTable := 1, Execute := TRUE);

// 主循环
IF PowerCutter.Status AND bCutCycle THEN
// 凸轮啮合
IF NOT CamIn.InGear THEN
CamIn(
Master := Material,
Slave := CutterMotor,
Execute := TRUE,
CamTable := 1,
MasterStartPos := 0.0,
MasterEndPos := 360.0,
SlaveStartPos := 0.0,
SlaveEndPos := 360.0,
StartMode := 0
);
END_IF;

// 在同步区触发剪切(由 CAM 曲线保证刀具速度 = 材料速度)
// 检测刀具位置,在同步区末端输出剪切信号
IF CamIn.InGear AND CamIn.SlavePosition >= 180.0
AND CamIn.SlavePosition < 182.0 THEN
bCutOutput := TRUE;
nCutCount := nCutCount + 1;
ELSE
bCutOutput := FALSE;
END_IF;
END_IF;

9.5 3 轴点胶路径规划

场景: 3 轴点胶机,沿三维路径点胶。

PROGRAM ThreeAxisGlue
VAR
// 三轴组
XYZ_Group : AXIS_GROUP_REF;

// 功能块
GrpEnable : MC_GroupEnable;
MoveL1 : MC_MoveLinear;
MoveL2 : MC_MoveLinear;
MoveL3 : MC_MoveLinear;
MoveL4 : MC_MoveLinear;

State : INT := 0;
bGlue : BOOL;
bDone : BOOL;
END_VAR

// 使能
GrpEnable(AxisGroup := XYZ_Group, Enable := TRUE);
IF NOT GrpEnable.Status THEN RETURN; END_IF;

CASE State OF
0: // 快速移动到起点上方
MoveL1(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [10.0, 10.0, 10.0],
Velocity := 200.0, Acceleration := 2000.0);
IF MoveL1.Done THEN MoveL1(Execute := FALSE); State := 10; END_IF;

10: // 下刀到点胶高度
MoveL2(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [10.0, 10.0, 0.5],
Velocity := 20.0, Acceleration := 1000.0);
IF MoveL2.Done THEN MoveL2(Execute := FALSE); bGlue := TRUE; State := 20; END_IF;

20: // 沿 X 方向点胶
MoveL3(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [90.0, 10.0, 0.5],
Velocity := 30.0, Acceleration := 500.0);
IF MoveL3.Done THEN MoveL3(Execute := FALSE); bGlue := FALSE; State := 30; END_IF;

30: // 抬刀
MoveL4(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [90.0, 10.0, 10.0],
Velocity := 50.0, Acceleration := 1000.0);
IF MoveL4.Done THEN MoveL4(Execute := FALSE); bDone := TRUE; END_IF;
END_CASE;

9.6 龙门同步控制(双驱防扭)

场景: 大型龙门 XY 平台,X 轴由两个电机同步驱动,防止龙门扭转。

结构图:

           ┌──────────────────────────────────┐
│ 横梁 (Gantry) │
│ │
Motor_L ─────────────────────────────── Motor_R
│ │ │
│ │ │
│ 丝杠 L 丝杠 R
│ │ │
└─────┴────────────────────┴──────┘

控制策略:

1. 主从模式: Motor_L 是主,Motor_R 是从,跟随主位置
2. 跟随误差监控: 两个电机的位置差超过阈值 → 报警停止
3. 防扭控制: 实时检测位置差,微调补偿

SCL 程序:

PROGRAM GantrySync
VAR
// 轴
Gantry_Master : AXIS_REF; // 主电机
Gantry_Slave : AXIS_REF; // 从电机

// 功能块
PowerM : MC_Power;
PowerS : MC_Power;
GearIn : MC_GearIn;
MoveAbs : MC_MoveAbsolute;

// 防扭监控
ReadStatusM : MC_ReadStatus;
ReadStatusS : MC_ReadStatus;
fDiffLimit : REAL := 0.1; // 位置差阈值 (mm)
fPositionDiff : REAL;
bTorsionAlarm : BOOL;
END_VAR

// 使能两个电机
PowerM(Axis := Gantry_Master, Enable := TRUE);
PowerS(Axis := Gantry_Slave, Enable := TRUE);

// 从电机跟随主电机(齿轮比 1:1)
IF PowerM.Status AND PowerS.Status THEN
GearIn(
Master := Gantry_Master,
Slave := Gantry_Slave,
Execute := TRUE,
RatioNumerator := 1, // 1:1 同步
RatioDenominator := 1,
Acceleration := 2000.0
);
END_IF;

// 绝对定位(只需发指令给主电机,从电机自动跟随)
IF bMoveCmd THEN
MoveAbs(
Axis := Gantry_Master,
Execute := TRUE,
Position := 300.0,
Velocity := 100.0,
Acceleration := 1000.0
);
END_IF;

// 防扭监控:实时比较两个电机位置
ReadStatusM(Axis := Gantry_Master);
ReadStatusS(Axis := Gantry_Slave);
fPositionDiff := ABS(ReadStatusM.ActualPosition - ReadStatusS.ActualPosition);

IF fPositionDiff > fDiffLimit THEN
bTorsionAlarm := TRUE;
// 停止所有运动
// 输出报警
END_IF;

10. 调试与优化

10.1 轴调试工具

Darra IDE 提供以下运动控制调试工具:

工具位置功能
Jog 面板工具 → 轴调试 → Jog手动点动、回零、使能/断电
示波器工具 → 轴调试 → 示波器实时采集位置/速度/力矩曲线
参数整定工具 → 轴调试 → 参数整定自动/手动整定伺服增益
状态监控在线监控 → 轴状态实时显示轴状态和错误码
跟随误差在线监控 → 跟随误差实时显示位置偏差

10.2 伺服增益整定

伺服驱动器的三个闭环:

位置环 ──→ 速度环 ──→ 电流环 ──→ 电机
↑ │
└──────────────────────┘
编码器反馈

增益参数:

参数名称作用增大效果减小效果
Kp位置环比例增益位置跟随刚度跟随误差减小,可能振动跟随误差增大,更稳定
Kv速度环比例增益速度响应响应更快,可能超调响应变慢,更稳定
Ki速度环积分增益稳态误差消除消除稳态误差,可能振荡可能有稳态误差
Kvff速度前馈减小跟随误差跟随误差大幅减小跟随误差增大
Kaff加速度前馈补偿加速段误差加速段跟随误差减小加速段误差增大

整定步骤 (推荐顺序):

第 1 步: 调电流环(通常不动,驱动器默认已调好)
第 2 步: 调速度环 (Kv, Ki)
├── 低速时,增大 Kv 直到轻微振动,然后回调 80%
└── 用示波器观察阶跃响应,无超调为佳
第 3 步: 调位置环 (Kp)
├── 从低到高增加 Kp
└── 观察跟随误差,目标 < 1 脉冲
第 4 步: 加前馈 (Kvff, Kaff)
├── 逐步增加 Kvff 使跟随误差趋近 0
└── 注意: 前馈过大可能导致过冲

10.3 加减速优化

S 曲线 vs T 曲线:

速度 ↑              速度 ↑
│ ┌──┐ │ ╱╲
│ ╱ ╲ │ ╱ ╲
│ ╱ ╲ │ ╱ ╲
│ ╱ ╲ │╱ ╲
└────────────→ └────────────→
T 曲线 (有冲击) S 曲线 (平滑)
曲线特点适用场景
T 曲线加速度突变,有冲击低速、大惯性
S 曲线加速度连续,无冲击通用推荐
修正 S 曲线加速度和跃度都连续高速、精密定位

加速时间计算:

给定:
Vmax = 100 mm/s (最大速度)
Accel = 1000 mm/s² (加速度)
Jerk = 5000 mm/s³ (跃度)

S 曲线加速时间:
T_accel = Vmax/Accel + Accel/Jerk
= 100/1000 + 1000/5000
= 0.1 + 0.2
= 0.3 秒

加速段位移:
S_accel = 0.5 × Vmax × T_accel
= 0.5 × 100 × 0.3
= 15 mm

10.4 跟随误差分析

什么是跟随误差?

位置目标 ────→ 位置实际 ───→ 差值 = 跟随误差

└─ 编码器反馈

正常跟随误差范围:

控制模式典型跟随误差备注
pp 模式0驱动器内部闭环,误差为 0
csp 模式±0.01~0.1mm取决于通讯周期和增益
pv 模式±0.5~2mm速度模式下跟随误差较大
高速 (500mm/s+)±0.05~0.2mm需要前馈补偿

跟随误差过大:

原因现象解决
增益太低加速段误差大,匀速段误差小增大 Kp, Kv
前馈不够全程误差大增大 Kvff, Kaff
加速度太大高速运行误差大减小加速度或增加 Jerk
机械间隙方向切换时误差突变加背隙补偿或换机械
通讯延迟周期性误差波动检查 EtherCAT 周期

10.5 振动抑制

常见振动类型:

共振 ────╱╲────╱╲────    频率: 5~50 Hz
╱ ╲ ╱ ╲
╱ ╲╱ ╲

抖动 ────╱╲╱╲╱╲╱╲╱╲ 频率: 50~200 Hz
╱╲╱╲╱╲╱╲╱╲
╱╲╱╲╱╲╱╲╱╲

爬行 ────╱╲╱╲╱╲╱╲╱╲ 低速时的摩擦导致
╱╲╱╲╱╲╱╲╱╲
╱╲╱╲╱╲╱╲╱╲

振动抑制方法:

方法原理适用场景
陷波滤波器滤除共振频率机械共振
低通滤波器衰减高频噪声编码器噪声
增益降低降低系统响应顽固振动
阶跃变 S 曲线减小加速度冲击启停振动
加速度前馈补偿惯性力加减速段振动

10.6 常见问题排错

问题可能原因排查步骤解决方案
轴使能不上急停/安全门/驱动器报警1. 检查安全回路 2. 读驱动器报警码 3. 检查 EtherCAT 通讯按急停复位 → 清除驱动器报警 → 重新使能
轴运动抖动增益过高/机械共振1. 用示波器看速度曲线 2. 降低增益 3. 增加陷波滤波器降低 Kp 20% → 检查效果 → 逐步调整
定位不准背隙/编码器故障/丝杠磨损1. 测量往返误差 2. 检查编码器 3. 检查机械增加背隙补偿 → 更换磨损部件
回零失败传感器故障/参数错误1. 检查传感器 IO 状态 2. 核对回零参数 3. 手动试回零修复传感器 → 核对参数
跟随误差大增益低/前馈不够/负载重1. 读跟随误差值 2. 增大增益 3. 加前馈逐步增大 Kp, Kv, 加 Kvff
电子齿轮滑脱主轴丢失脉冲/通讯中断1. 检查主轴编码器 2. 检查 EtherCAT 通讯 3. 看 InGear 状态检查编码器接线 → 检查通讯线
紧急停止后轴动不了处于 ErrorStop 状态1. 读状态 2. 确认急停已复位 3. 执行 MC_Reset先 MC_Reset → 再重新运动
多轴插补轨迹偏离轴间同步误差/机械问题1. 看各轴跟随误差 2. 检查机械传动 3. 检查插补参数调整各轴增益一致 → 改善机械
凸轮运动异常CAM 曲线设计错误1. 检查 CAM 曲线 2. 检查主轴位置 3. 看 InGear 状态重新设计 CAM 曲线
驱动器过流报警电机堵转/短路/加减速过大1. 检查电机是否卡住 2. 降低加速度 3. 检查电机线排除机械卡死 → 降低加速度

附录

A. 运动控制功能块速查表

功能块类别功能是否常用
MC_Power管理使能/断电⭐⭐⭐
MC_Home管理回零⭐⭐⭐
MC_Stop管理急停⭐⭐⭐
MC_Halt管理暂停⭐⭐⭐
MC_Reset管理复位⭐⭐⭐
MC_ReadStatus管理读状态⭐⭐⭐
MC_ReadAxisError管理读错误⭐⭐
MC_MoveAbsolute单轴绝对定位⭐⭐⭐
MC_MoveRelative单轴相对定位⭐⭐⭐
MC_MoveVelocity单轴速度模式⭐⭐
MC_MoveAdditive单轴追加运动
MC_Jog单轴点动⭐⭐
MC_MoveLinear多轴直线插补⭐⭐⭐
MC_MoveCircular多轴圆弧插补⭐⭐
MC_MoveDirectAbsolute多轴独立绝对⭐⭐
MC_GearIn同步齿轮啮合⭐⭐
MC_GearOut同步齿轮脱开⭐⭐
MC_CamIn同步凸轮啮合⭐⭐
MC_CamOut同步凸轮脱开⭐⭐
MC_CamTableSelect同步选凸轮表⭐⭐
MC_GroupEnable轴组组使能⭐⭐⭐
MC_GroupDisable轴组组断电⭐⭐
MC_GroupHome轴组组回零⭐⭐
MC_GroupStop轴组组急停⭐⭐
MC_GroupReset轴组组复位⭐⭐
MC_GroupReadStatus轴组组状态⭐⭐
MC_SetCartesianTransform坐标系设坐标系变换⭐⭐

B. 轴状态机状态码

状态码名称说明
0Disabled轴未使能,不响应任何指令
1ErrorStop错误停止,需要 Reset
2Standstill已使能,静止,可接收指令
3DiscreteMotion点对点运动(MC_MoveAbsolute/Relative)
4ContinuousMotion连续运动(MC_MoveVelocity)
5Homing回零中
6SynchronizedMotion同步运动(齿轮/凸轮)

C. 关键参数推荐值

应用场景加速度跃度速度环增益位置环增益速度前馈
传送带定位2000 mm/s²10000 mm/s³20 Hz30 1/s80%
XY 工作台3000 mm/s²15000 mm/s³30 Hz50 1/s90%
点胶机1000 mm/s²5000 mm/s³15 Hz25 1/s70%
飞剪5000 mm/s²25000 mm/s³40 Hz60 1/s100%
龙门同步2000 mm/s²10000 mm/s³25 Hz40 1/s85%
机器人5000 mm/s²25000 mm/s³50 Hz80 1/s100%

D. 学习路径

第 1 步: 读完本节 → 理解概念
第 2 步: 跑单轴示例 → 实践 MC_Power, MC_MoveAbsolute, MC_Home
第 3 步: 跑双轴插补示例 → 实践 MC_MoveLinear
第 4 步: 跑电子齿轮示例 → 实践 MC_GearIn
第 5 步: 跑电子凸轮示例 → 实践 MC_CamIn
第 6 步: 独立设计一个完整项目

E. 相关文档