PLCopen 运动控制块
PLCopen MC_* 功能块用于单轴运动控制,适合传送带、升降台、旋转台等场景。如果您做机器人多轴协调运动,请使用 MOVJ/MOVL 指令。
常用功能块
MC_Power — 使能轴
使用轴之前必须先使能。
VAR
PowerOn : MC_Power;
END_VAR
PowerOn(Axis := Axis1, Enable := TRUE);
// PowerOn.Status = TRUE 表示使能成功
MC_Home — 回原点
VAR
HomeCmd : MC_Home;
END_VAR
HomeCmd(Axis := Axis1, Execute := TRUE);
// HomeCmd.Done = TRUE 表示原点完成
MC_MoveAbsolute — 绝对定位
移动到指定位置。
VAR
MoveAbs : MC_MoveAbsolute;
END_VAR
MoveAbs(
Axis := Axis1,
Execute := TRUE,
Position := 100.0, // 目标位置 (mm 或 度)
Velocity := 50.0, // 速度 (mm/s)
Acceleration := 200.0 // 加速度
);
// MoveAbs.Done = TRUE 表示到达
MC_MoveRelative — 相对定位
从当前位置移动指定距离。
VAR
MoveRel : MC_MoveRelative;
END_VAR
MoveRel(
Axis := Axis1,
Execute := TRUE,
Distance := 50.0, // 移动距离
Velocity := 30.0
);
MC_Jog — 点动
按住运行,松开停止。
VAR
JogCmd : MC_Jog;
END_VAR
JogCmd(
Axis := Axis1,
JogForward := DI[1], // 正向按钮
JogBackward := DI[2], // 反向按钮
Velocity := 10.0
);
MC_Stop — 停止
立即减速停止。
VAR
StopCmd : MC_Stop;
END_VAR
StopCmd(Axis := Axis1, Execute := EmergencyStop);
使用示例:传送带定位
PROGRAM ConveyorControl
VAR
Power : MC_Power;
Home : MC_Home;
MoveTo : MC_MoveAbsolute;
State : INT := 0;
END_VAR
// 始终使能
Power(Axis := ConveyorAxis, Enable := TRUE);
CASE State OF
0: // 回原点
Home(Axis := ConveyorAxis, Execute := TRUE);
IF Home.Done THEN
Home(Execute := FALSE);
State := 1;
END_IF;
1: // 等待工件到位
IF DI[10] = TRUE THEN // 传感器检测到工件
State := 2;
END_IF;
2: // 传送到工位1
MoveTo(Axis := ConveyorAxis, Execute := TRUE,
Position := 500.0, Velocity := 100.0);
IF MoveTo.Done THEN
MoveTo(Execute := FALSE);
State := 3;
END_IF;
3: // 等待加工完成
IF DI[11] = TRUE THEN
State := 4;
END_IF;
4: // 传送到出料位
MoveTo(Axis := ConveyorAxis, Execute := TRUE,
Position := 1000.0, Velocity := 100.0);
IF MoveTo.Done THEN
MoveTo(Execute := FALSE);
State := 1; // 回到等待
END_IF;
END_CASE;
END_PROGRAM
MC_* vs MOVJ/MOVL
| MC_* 功能块 | MOVJ/MOVL | |
|---|---|---|
| 控制对象 | 单个轴 | 整台机器人 (多轴协调) |
| 编程方式 | 功能块调用 + 状态判断 | 顺序指令 |
| 适用场景 | 传送带、升降台、旋转台 | 取放、焊接、码垛 |
PLCopen MC 规范层次
Darra 严格遵循 PLCopen Motion Control:
| 规范分册 | 内容 | Darra 覆盖 |
|---|---|---|
| Part 1 - Basic | MC_Power, MC_Stop, MC_Home, MC_MoveAbsolute, MC_MoveRelative 等单轴基础 | 完整 |
| Part 2 - Extensions | 凸轮, 电子齿轮 (MC_CamIn, MC_GearIn), 多轴同步 | 完整 |
| Part 3 - User Guidelines | 用户最佳实践 | 参考 |
| Part 4 - Coordinated Motion | MC_GroupEnable, MC_MoveLinearAbsolute (机器人多轴协调) | 完整 |
| Part 5 - Homing | 各种回零模式 | 完整 |
| Part 6 - Fluid Power | 液压轴 | 预留 |
| Part 7 - Safety | 安全功能块 (SF_*) | 配合安全 PLC |
功能块分类详表
Administrative (管理)
| 功能块 | 功能 |
|---|---|
| MC_Power | 使能 / 去使能轴 |
| MC_Home | 回原点 |
| MC_Stop | 减速停止 |
| MC_Halt | 中断当前运动 (可恢复) |
| MC_Reset | 清除错误 |
| MC_ReadStatus | 读轴状态 |
| MC_ReadAxisError | 读错误码 |
| MC_ReadParameter / MC_WriteParameter | 读写参数 |
Single Axis Motion (单轴运动)
| 功能块 | 功能 |
|---|---|
| MC_MoveAbsolute | 绝对定位 |
| MC_MoveRelative | 相对运动 |
| MC_MoveAdditive | 在现有运动上追加 |
| MC_MoveSuperimposed | 叠加运动 (调整偏置) |
| MC_MoveVelocity | 速度模式 |
| MC_Jog | 点动 |
| MC_TorqueControl | 力矩控制 |
| MC_PositionProfile | 按时间 - 位置曲线 |
| MC_VelocityProfile | 按时间 - 速度曲线 |
Multi-axis Coordinated (多轴协调)
| 功能块 | 功能 |
|---|---|
| MC_GroupEnable | 使能轴组 (机器人) |
| MC_GroupDisable | 去使能 |
| MC_GroupHome | 组回零 |
| MC_GroupStop | 组停止 |
| MC_GroupReset | 组复位 |
| MC_MoveLinearAbsolute | 直线绝对 (= MOVL 功能块形式) |
| MC_MoveLinearRelative | 直线相对 |
| MC_MoveCircularAbsolute | 圆弧绝对 (= MOVC) |
| MC_MoveSplineAbsolute | 样条 |
| MC_MoveDirectAbsolute | 关节绝对 (= MOVJ) |
| MC_SetCartesianTransform | 设坐标系变换 |
| MC_SetKinTransform | 设工具 / 工件 |
Synchronization (同步)
| 功能块 | 功能 |
|---|---|
| MC_CamIn / MC_CamOut | 电子凸轮 |
| MC_CamTableSelect | 选凸轮表 |
| MC_GearIn / MC_GearOut | 电子齿轮 |
| MC_Phasing | 相位偏移 |
| MC_CombineAxes | 轴合成 |
状态机 (PLCopen 标准状态)
每个轴 / 组有统一的状态机:
Disabled ──Power──→ Standstill
│
Move* │ Stop
↓
Moving
│
└──→ ErrorStop
│
Reset
↓
Standstill
| 状态 | 说明 |
|---|---|
| Disabled | 伺服未使能 |
| Standstill | 使能且静止, 可接收运动指令 |
| Moving | 正在运动 |
| Stopping | 减速中 |
| ErrorStop | 错误, 需 Reset |
| Homing | 回零中 |
| SynchronizedMotion | 凸轮 / 齿轮同步中 |
机器人使能完整示例
PROGRAM RobotSetup
VAR
Power : MC_GroupEnable;
Home : MC_GroupHome;
ReadState : MC_GroupReadStatus;
step : INT := 0;
END_VAR
Power(
Robot := Robot1,
Enable := TRUE
);
ReadState(Robot := Robot1);
CASE step OF
0: // 等待使能
IF Power.Status THEN step := 10; END_IF;
10: // 回零
Home(Robot := Robot1, Execute := TRUE, HomeMode := HOME_SET_REF);
IF Home.Done THEN
Home(Execute := FALSE);
step := 20;
END_IF;
20: // 就绪
IF ReadState.State = MC_GROUP_STANDSTILL THEN
// 可以开始运动
END_IF;
END_CASE;
BufferMode — 运动衔接
相邻运动指令如何衔接由 BufferMode 决定:
| 模式 | 行为 |
|---|---|
| mcAborting | 立即中断当前运动, 执行新的 (不推荐) |
| mcBuffered | 等当前完成再开始新的 (默认) |
| mcBlendingLow / Med / High / Previous / Next | 按 Zone 平滑过渡 |
mcL1(..., BufferMode := mcBlendingHigh); // 高速过渡, Zone 自动
mcL2(..., BufferMode := mcBlendingHigh);
错误码体系
MC_GroupReadAxisError / MC_ReadAxisError 返回标准错误码:
| 范围 | 类别 |
|---|---|
| 0x1000..0x1FFF | 参数错误 |
| 0x2000..0x2FFF | 状态错误 (状态机不允许) |
| 0x3000..0x3FFF | 运动错误 (超限 / 奇异) |
| 0x4000..0x4FFF | 通讯错误 (EtherCAT) |
| 0x5000..0x5FFF | 安全错误 (急停) |
详细列表见 机器人诊断.
PLCopen vs 简化语法对照
| PLCopen | 简化语法 |
|---|---|
| MC_MoveJointAbsolute | MOVJ |
| MC_MoveLinearAbsolute | MOVL |
| MC_MoveCircularAbsolute | MOVC |
| MC_MoveSplineAbsolute | MOVS |
| MC_GroupHome | HOME |
| WaitTime 功能块 | DELAY |
简化语法背后是编译器自动生成功能块调用, 两者性能等价。
参数表 (通用)
| 参数 | 类型 | 说明 |
|---|---|---|
| Axis / Robot | 轴 / 机器人引用 | 目标 |
| Execute | BOOL | 上升沿触发 |
| Done | BOOL | 完成标志 |
| Busy | BOOL | 正在执行 |
| Active | BOOL | 已被接收执行 |
| CommandAborted | BOOL | 被中止 |
| Error | BOOL | 错误标志 |
| ErrorID | UINT | 错误码 |
所有 MC 功能块都遵循 PLCopen 统一接口, 有 Execute 上升沿触发 + Done / Busy / Error 反馈。
排错清单
| 现象 | 原因 | 解决 |
|---|---|---|
| Power.Status 一直 FALSE | 急停 / 安全门 | 检查安全回路 |
| MoveAbsolute 不动 | 轴在 ErrorStop 态 | 先 MC_Reset |
| Execute 保持 TRUE 不释放 | 按 PLCopen 规范必须下降沿 | 显式 Execute := FALSE |
| 组运动期间单轴运动 | 状态机不允许 | 先停组再单轴 |
| 凸轮同步后无法切回独立 | 没调 MC_CamOut | 先 CamOut |
| Done 脉冲丢失 | 没在同周期检测 | 用保持型变量存 Done |
最佳实践
- 每功能块独立变量: 不要复用同一个 MC_MoveAbsolute 实例
- Execute 边沿触发: 每次启动先 FALSE → TRUE
- 状态机编程: 用 CASE OF 一个 step 变量串接多个运动
- 错误集中处理: 一个 MC_Reset 统一清, 避免到处 Reset
- 参数预配置: 机器人参数 (速度 / 加速度 / 跃度) 在全局常量表定义, 不散落在各处
- BufferMode 显式: 默认 mcBuffered 最稳妥, 连续过渡用 mcBlending
- 读文档不猜语义: PLCopen 规范 250 页, 有疑问查规范