3. MotoPlus与控制器数据交互

MotoPlus 程序运行在控制器的应用层,它并不是“独立于机器人之外”的一段 C 语言程序,而是通过控制器提供的 API 与机器人控制系统共享同一份实时数据。理解这一点,是掌握数据交互的前提:MotoPlus 读到的位置、关节角度、IO 状态和系统变量,都来自控制器当前的真实运行状态;写入的数据,也会直接作用于机器人的运动、逻辑或系统配置。因此,读写操作必须建立在明确的坐标系、单位、数据范围和时序约束之上。

本节围绕四类最常用的数据对象展开:机器人位置(直角坐标)、关节角度、IO 状态和系统变量。它们分别对应不同的 API 函数族、不同的数据结构,也对应不同的读写权限与刷新时机。下面先建立整体数据流认识,再逐类说明读写方法与注意事项。

MotoPlus 与控制器四类数据交互关系 MotoPlus 应用 C 语言任务 / 周期处理 mpGetPose / mpPutPose mpGetAxis / mpPutAxis mpGetIO / mpPutIO mpGetVar / mpPutVar 读写请求经 API 进入控制器 返回状态码判断成败 控制器 API 数据访问层 坐标/单位 转换与校验 权限检查 控制器实时数据区 机器人位置 X Y Z Rx Ry Rz 关节角度 S L U R B T(度) IO 状态 通用/专用输入输出 系统变量 B/I/D/R 等类型 读写约束 位置/关节:需在伺服开启且非编辑态下读取 IO:注意输入只读、输出可写,避免与梯形图冲突 系统变量:部分只读,写入需确认变量号与类型 读/写 映射

一、机器人位置:直角坐标的读取与写入

机器人位置通常以直角坐标形式表示,包含 X、Y、Z 三个平移量和 Rx、Ry、Rz 三个姿态量,单位分别为毫米和度。MotoPlus 中读取当前位置一般使用 mpGetPose 类接口,写入目标位置使用 mpPutPose 类接口。读取时,控制器返回的是当前工具坐标系下的位姿,因此必须先确认当前使用的工具号(TOOL)和用户坐标系号(UF#),否则同一个物理点在不同坐标系下会得到完全不同的数值。

一个典型的读取流程是:先声明一个位姿结构体变量,调用读取函数,检查返回状态码是否为成功,再访问结构体中的各分量。例如:

MP_POSE pose;
int ret;
ret = mpGetPose(&pose, 0);   /* 0 表示当前工具/坐标系 */
if (ret == 0) {
    /* pose.x, pose.y, pose.z 单位 mm */
    /* pose.rx, pose.ry, pose.rz 单位 deg */
}

写入位置时要注意:写入的位姿是“目标位姿”,控制器不会立即让机器人运动,而是把它作为后续运动指令的输入。若在伺服关闭或示教模式下写入,可能返回错误码。写入前应确认目标点在工作空间内,且姿态表示方式(如 ZYX 欧拉角或固定角)与控制器约定一致。若姿态表示方式不一致,即使 X、Y、Z 正确,机器人也可能以错误姿态到达。

二、关节角度:脉冲与角度的对应

关节角度反映的是各轴的实际旋转位置,通常用 S、L、U、R、B、T 六个轴表示,单位为度。MotoPlus 读取关节角度使用 mpGetAxis 类接口,写入目标关节角使用 mpPutAxis 类接口。与直角坐标不同,关节角度是各轴独立的值,不受工具坐标系影响,但受脉冲当量和软限位约束。

读取关节角度时,返回的是当前编码器反馈值换算后的角度。若机器人正在运动,读到的值会随运动实时变化,因此若需要稳定值,应在机器人停止或伺服稳定后读取。写入关节角时,控制器会检查各轴是否超出软限位;若超出,写入失败并返回错误码。实际调试中,常把关节角写入与 mpGetAxis 读取配合使用,形成“读当前—改目标—写目标”的闭环。

三、IO 状态:输入只读、输出可写

IO 状态分为通用输入、通用输出、专用输入和专用输出。MotoPlus 读取 IO 使用 mpGetIO 类接口,写入输出使用 mpPutIO 类接口。关键区别在于:输入信号由外部设备或梯形图程序驱动,MotoPlus 只能读取,不能强制写入;输出信号可以由 MotoPlus 写入,但若同一输出同时被梯形图程序控制,会出现“谁最后写谁生效”的竞争问题。

读取 IO 时,需要指定 IO 编号和类型。例如读取通用输入 #1,返回 0 或 1。写入输出时,同样指定编号和值。建议在写入输出前先读取一次当前状态,确认没有其他逻辑正在控制该点,再执行写入。对于安全相关的专用 IO,不应由 MotoPlus 直接改写,而应通过控制器的安全逻辑处理。

四、系统变量:类型与权限

系统变量是控制器内部用于保存参数、状态和配置的变量,常见类型包括 B 型(字节)、I 型(整数)、D 型(双精度)、R 型(实数)等。MotoPlus 通过 mpGetVar 和 mpPutVar 类接口按变量号读写。读取时需指定变量号和目标缓冲区,写入时需保证数据类型与变量类型匹配。

系统变量中有一部分是只读的,例如某些状态监视变量;另一部分可写,例如用户参数区。写入前应查阅控制器变量表,确认变量号、类型和允许范围。若类型不匹配,例如把整数写入 D 型变量,可能返回类型错误或产生截断。实际工程中,建议把常用的系统变量读写封装成独立函数,统一处理错误码和类型转换,避免在业务逻辑中散落大量裸调用。

读写操作统一遵循“先确认坐标系与单位,再检查返回状态码,最后验证数据范围”的顺序。任何一步跳过,都可能让后续逻辑建立在错误数据之上。

五、读写时序与错误处理

MotoPlus 任务通常以固定周期运行,例如 4ms 或 8ms。在一个周期内完成多类数据读写时,应尽量把读取放在周期前段、写入放在后段,避免同一周期内“写后立即读”造成数据不一致。每次调用 API 后都应检查返回值:返回 0 表示成功,非 0 表示失败,常见错误包括参数越界、权限不足、伺服状态不允许等。

对于连续读写,建议设置超时或重试次数。例如读取位置连续失败 3 次,则记录错误并暂停后续写入,而不是继续用旧数据计算。这样可以把数据交互的异常限制在局部,避免错误扩散到运动控制。

数据对象典型读取接口典型写入接口关键注意点
机器人位置mpGetPosempPutPose确认工具号与用户坐标系
关节角度mpGetAxismpPutAxis检查软限位与脉冲当量
IO 状态mpGetIOmpPutIO输入只读,输出避免与梯形图冲突
系统变量mpGetVarmpPutVar类型匹配,部分变量只读

把四类数据的读写放在同一个任务框架下考虑,就能形成稳定的数据交互层:位置和关节角用于运动相关逻辑,IO 用于外部信号交互,系统变量用于参数与状态传递。每一类都遵循“确认对象—调用接口—检查返回—验证范围”的基本路径,区别只在于坐标系、类型和权限约束不同。掌握这些差异,才能在 MotoPlus 中安全、准确地与控制器交换数据。