4. PLCopen标准概述
PLCopen 是由多家自动化厂商与用户共同发起的中立性国际组织,其核心使命是为可编程逻辑控制器(PLC)及其周边应用定义独立于硬件平台的软件接口标准。在工业机械臂伺服运动控制领域,PLCopen 运动控制规范(Motion Control Specification)是连接 IEC 61131-3 编程语言与具体伺服驱动器、电机硬件之间的桥梁。本章将系统梳理 PLCopen 运动控制规范的体系结构,重点解析 Part 1(通用运动控制)与 Part 2(扩展功能)的定位、核心功能块及适用场景,并阐明其与 IEC 61131-3 标准之间的层次关系。理解这些内容,是后续章节中设计机械臂运动控制程序、进行轴组协调与轨迹规划的前提。
上图清晰地展示了 PLCopen 运动控制规范在自动化软件体系中的位置:它位于 IEC 61131-3 编程语言之上,向下依赖标准定义的数据类型与程序组织单元,向上为机械臂等复杂运动控制应用提供统一的功能块接口。Part 1 与 Part 2 分别覆盖单轴基础运动与多轴协调扩展,两者共同构成完整的运动控制库。下面我们将逐一深入解析。
4.1 PLCopen 运动控制规范的核心原理与设计哲学
PLCopen 运动控制规范的核心设计思想是“接口标准化、实现独立化”。它不规定伺服驱动器内部如何调节电流环、速度环,也不限定使用脉冲、模拟量还是总线通信(如 EtherCAT、PROFINET、SERCOS III)连接驱动器,而是定义了一套统一的功能块(Function Block)接口和轴状态机(Axis State Machine)。这样,无论底层硬件来自哪家厂商,只要其运动控制库符合 PLCopen 规范,上层应用程序就可以用几乎相同的代码实现运动控制逻辑。
该规范基于 IEC 61131-3 的 ST(结构化文本)和 FBD(功能块图)语言构建。每个运动控制功能块都继承自 IEC 61131-3 的 Function Block 模型,拥有输入变量(如 Execute、Position、Velocity)、输出变量(如 Done、Busy、Error)以及内部状态。这种设计使得程序员的代码具有极高的可移植性——从一台 PLC 迁移到另一台 PLC,只需更换底层驱动库,而无需重写运动控制逻辑。
4.2 Part 1(通用运动控制)详解
Part 1 是 PLCopen 运动控制规范的基础部分,发布于 2001 年,主要针对单轴运动控制场景。它定义了机械臂中每个独立关节轴(如 J1、J2、J3)所需的基本运动功能。Part 1 的核心内容包括轴状态机、轴数据结构以及一组标准功能块。
4.2.1 轴状态机(Axis State Machine)
每个运动轴在 PLCopen 中都被抽象为一个状态机,包含以下主要状态:Disabled(禁用)、Standstill(停止)、Running(运行)、ErrorStop(错误停止)。轴必须通过 MC_Power 功能块使能后,才能从 Disabled 切换到 Standstill。在 Standstill 状态下,可以执行定位(MC_MoveAbsolute)或相对定位(MC_MoveRelative);在 Running 状态下,可以执行速度控制(MC_MoveVelocity)或位置叠加。任何错误都会将轴置入 ErrorStop 状态,必须通过 MC_Reset 清除错误并重新使能。
| 状态 | 描述 | 允许的后续操作 |
|---|---|---|
| Disabled | 轴未使能,驱动器无使能信号 | MC_Power(Enable:=TRUE) |
| Standstill | 轴已使能,当前位置保持,速度为零 | MC_MoveAbsolute, MC_MoveRelative, MC_Home |
| Running | 轴正在运动,速度非零 | MC_MoveVelocity, MC_Stop, MC_Halt |
| ErrorStop | 发生错误,轴停止输出 | MC_Reset, MC_Power(Enable:=FALSE) |
4.2.2 关键功能块与机械臂应用
Part 1 定义了约 15 个标准功能块,机械臂关节控制中最常用的包括:
- MC_Power:控制伺服使能。输入 Enable 为 TRUE 时,轴被使能并进入 Standstill;FALSE 时轴禁用。机械臂上电顺序必须严格遵循此功能块。
- MC_Home:执行回零操作。机械臂每次开机后必须回零,以建立位置基准。支持多种回零方式(如限位开关、编码器索引信号)。
- MC_MoveAbsolute:定位。在机械臂中,通常用于点到点(PTP)运动,例如从当前位置移动到关节角度 45° 的位置。
- MC_MoveVelocity:连续速度运动。在机械臂手动示教模式中,操作员通过摇杆控制各关节以指定速度连续旋转。
- MC_Stop:紧急停止。立即停止轴运动,停止模式可配置(如快速停止、急停)。
4.3 Part 2(扩展功能)详解
Part 2 于 2005 年发布,是对 Part 1 的扩展,重点解决多轴协调与轴组(Axis Group)运动问题。对于工业机械臂而言,Part 2 才是真正体现机械臂控制价值的部分,因为它支持笛卡尔空间直线、圆弧插补以及电子齿轮/凸轮同步。
4.3.1 轴组(Axis Group)抽象
Part 2 引入了 AXIS_GROUP_REF 数据类型,用于表示一组协同工作的轴(例如机械臂的 6 个关节轴)。轴组必须通过 MC_GroupEnable 使能,然后才能执行多轴协调运动。轴组中的每个轴仍然拥有独立的 Part 1 状态机,但轴组本身也有自己的状态(如 GroupStandstill、GroupMoving、GroupErrorStop)。
4.3.2 核心扩展功能块
| 功能块 | 功能描述 | 机械臂应用场景 |
|---|---|---|
| MC_GroupEnable / MC_GroupDisable | 使能/禁用轴组 | 机械臂上电后,先使能各关节轴,再使能轴组 |
| MC_MoveLinearAbsolute | 笛卡尔空间直线插补(位置) | 机械臂 TCP 从 A 点直线移动到 B 点 |
| MC_MoveCircularAbsolute | 笛卡尔空间圆弧插补 | 弧焊、涂胶等需要圆弧轨迹的工艺 |
| MC_GearIn | 电子齿轮同步 | 机械臂与传送带同步跟踪(动态抓取) |
| MC_CamIn | 电子凸轮同步 | 机械臂与旋转主轴同步完成固定轨迹 |
| MC_AdditiveMove | 叠加运动 | 在已有轨迹上叠加小幅修正(如视觉引导偏移) |
4.3.3 坐标变换与工具补偿
Part 2 还定义了 MC_SetPosition、MC_SetDynamics 等功能块,用于设置轴组位置参考和动态特性。在机械臂应用中,MC_SetPosition 常用于在回零后设置工具中心点(TCP)的初始坐标。此外,Part 2 允许通过 MC_Transform 功能块实现用户自定义坐标变换,但实际项目中更多依赖机器人厂商提供的专用运动学库(如 KUKA、ABB 的专有函数),PLCopen 仅提供通用框架。
4.4 与 IEC 61131-3 的关系
IEC 61131-3 是 PLC 编程语言的标准,定义了五种编程语言(IL、ST、LD、FBD、SFC)以及公共元素(数据类型、变量、POU、任务)。PLCopen 运动控制规范完全构建在 IEC 61131-3 之上,具体体现在以下三个层面:
- 语言基础:PLCopen 功能块使用 ST 或 FBD 语言编写,遵循 IEC 61131-3 的 POU(程序组织单元)语法。运动控制程序与逻辑控制程序(如气缸、夹具)可以无缝集成在同一个 PLC 程序中。
- 数据类型扩展:PLCopen 定义了 AXIS_REF、AXIS_GROUP_REF 等特殊数据类型,这些类型是对 IEC 61131-3 基本数据类型(如 INT、REAL、BOOL)的扩展,但遵循其类型系统规则。
- 任务调度:运动控制功能块必须在 IEC 61131-3 的任务(Task)中周期执行。通常,运动控制任务被配置为固定周期(如 1ms)的高优先级任务,而逻辑控制任务可以是事件触发或较慢周期(如 10ms)。
这种层次关系意味着:IEC 61131-3 提供了“语言和运行环境”,PLCopen 提供了“运动控制领域的专用库”。没有 IEC 61131-3,PLCopen 功能块无法执行;没有 PLCopen,IEC 61131-3 只能处理逻辑控制,无法高效实现复杂的多轴协调。
4.5 案例拆解:基于 PLCopen 的六轴机械臂 PTP 运动实现
下面通过一个具体案例,展示如何综合运用 Part 1 和 Part 2 实现机械臂的点到点运动。
背景与约束:某 3C 电子装配线需要一台六轴关节机械臂完成 PCB 板元件的插装任务。机械臂控制器采用支持 PLCopen 的 PLC(如 Beckhoff CX5140),伺服驱动器通过 EtherCAT 总线连接。要求:机械臂从待机位(各关节角度均为 0°)运动到目标位(J1=30°, J2=-45°, J3=90°, J4=0°, J5=45°, J6=0°),运动过程中 TCP 轨迹无严格要求,但要求总时间小于 2 秒,且运动平稳无冲击。
初始现象与目标:初始状态机械臂处于 Disabled 状态。目标是通过 PLCopen 功能块实现关节空间 PTP 运动,并监控运动完成状态。
关键输入数据:目标关节角度数组 TargetPos[1..6] = [30, -45, 90, 0, 45, 0](单位:度);最大关节速度 Vel[1..6] = [60, 60, 60, 90, 90, 120](单位:度/秒);加速度 Acc = 200 度/秒²。
操作步骤:
- 轴使能:对每个关节轴调用 MC_Power,Enable:=TRUE。等待所有轴进入 Standstill 状态。
- 轴组使能:调用 MC_GroupEnable,将 6 个轴绑定为轴组。等待 GroupStandstill。
- 回零操作:调用 MC_Home 对每个轴执行回零(假设使用值编码器,回零仅需设置当前位置为 0)。
- 执行 PTP 运动:调用 MC_MoveAbsolute 分别对每个轴设置目标位置和速度。由于是关节空间 PTP,各轴独立运动,但 PLCopen 允许同时触发多个 MC_MoveAbsolute 指令。
- 等待完成:轮询所有轴的 Done 输出,当全部为 TRUE 时,运动完成。
代码示意(ST 语言):
// 轴使能
FOR i := 1 TO 6 DO
MC_Power_Axis[i](Enable := TRUE, Axis := AxisRef[i]);
END_FOR;
// 轴组使能
MC_GroupEnable_0(Enable := TRUE, Group := GroupRef);
// 回零
FOR i := 1 TO 6 DO
MC_Home_Axis[i](Execute := TRUE, Axis := AxisRef[i], Position := 0);
END_FOR;
// PTP 运动
MC_MoveAbsolute_J1(Execute := TRUE, Axis := AxisRef[1], Position := 30, Velocity := 60, Acceleration := 200);
MC_MoveAbsolute_J2(Execute := TRUE, Axis := AxisRef[2], Position := -45, Velocity := 60, Acceleration := 200);
// ... 其余轴类似
// 等待完成
WHILE NOT (MC_MoveAbsolute_J1.Done AND MC_MoveAbsolute_J2.Done AND ... ) DO
// 循环等待
END_WHILE;
结果对比与复盘:实际运行中,各轴同时启动,但由于各轴目标位置不同,运动时间由行程最长的轴决定(J3 轴行程 90°,耗时约 1.2 秒),满足 2 秒要求。若使用 Part 2 的 MC_MoveLinearAbsolute 进行笛卡尔直线插补,则需进行逆运动学计算,PLCopen 本身不提供逆解,需用户自行实现或调用厂商库。因此,在不需要严格轨迹的场合,关节空间 PTP 更简单高效。
4.6 常见误区与总结
在实际工程中,工程师对 PLCopen 的理解常存在以下误区:
- 误区一:认为 PLCopen 是硬件驱动库。实际上,PLCopen 是软件接口规范,硬件驱动由厂商实现。用户只需调用标准功能块,无需关心寄存器级操作。
- 误区二:混淆 Part 1 和 Part 2 的适用场景。Part 1 的 MC_MoveAbsolute 是单轴运动,不能实现多轴直线插补。若在机械臂中直接对 6 个轴同时调用 MC_MoveAbsolute,TCP 轨迹是曲线而非直线。
- 误区三:忽略轴组状态管理。轴组使能后,各轴仍可独立运动,但轴组运动指令(如 MC_MoveLinearAbsolute)会覆盖轴的运动状态。若在轴组运动过程中对单个轴执行 MC_Stop,可能导致轴组报错。
- 误区四:认为 PLCopen 包含运动学变换。PLCopen 不提供正/逆运动学算法,这些需要用户基于机械臂 DH 参数自行编写或使用厂商库。