跳到主要内容

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 - BasicMC_Power, MC_Stop, MC_Home, MC_MoveAbsolute, MC_MoveRelative 等单轴基础完整
Part 2 - Extensions凸轮, 电子齿轮 (MC_CamIn, MC_GearIn), 多轴同步完整
Part 3 - User Guidelines用户最佳实践参考
Part 4 - Coordinated MotionMC_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_MoveJointAbsoluteMOVJ
MC_MoveLinearAbsoluteMOVL
MC_MoveCircularAbsoluteMOVC
MC_MoveSplineAbsoluteMOVS
MC_GroupHomeHOME
WaitTime 功能块DELAY

简化语法背后是编译器自动生成功能块调用, 两者性能等价。

参数表 (通用)

参数类型说明
Axis / Robot轴 / 机器人引用目标
ExecuteBOOL上升沿触发
DoneBOOL完成标志
BusyBOOL正在执行
ActiveBOOL已被接收执行
CommandAbortedBOOL被中止
ErrorBOOL错误标志
ErrorIDUINT错误码

所有 MC 功能块都遵循 PLCopen 统一接口, 有 Execute 上升沿触发 + Done / Busy / Error 反馈。

排错清单

现象原因解决
Power.Status 一直 FALSE急停 / 安全门检查安全回路
MoveAbsolute 不动轴在 ErrorStop 态先 MC_Reset
Execute 保持 TRUE 不释放按 PLCopen 规范必须下降沿显式 Execute := FALSE
组运动期间单轴运动状态机不允许先停组再单轴
凸轮同步后无法切回独立没调 MC_CamOut先 CamOut
Done 脉冲丢失没在同周期检测用保持型变量存 Done

最佳实践

  1. 每功能块独立变量: 不要复用同一个 MC_MoveAbsolute 实例
  2. Execute 边沿触发: 每次启动先 FALSE → TRUE
  3. 状态机编程: 用 CASE OF 一个 step 变量串接多个运动
  4. 错误集中处理: 一个 MC_Reset 统一清, 避免到处 Reset
  5. 参数预配置: 机器人参数 (速度 / 加速度 / 跃度) 在全局常量表定义, 不散落在各处
  6. BufferMode 显式: 默认 mcBuffered 最稳妥, 连续过渡用 mcBlending
  7. 读文档不猜语义: PLCopen 规范 250 页, 有疑问查规范

相关文档