3. MOTOMAN编程基础与协同任务表达

MOTOMAN 控制柜使用的编程语言是 INFORM(早期版本为 INFORM II,当前主流为 INFORM III)。它是一门面向机器人作业的专用语言,语法接近 BASIC,但所有数据类型、指令和变量都围绕“轴运动、位置、工具、I/O 与作业流程”组织。理解 INFORM 的关键,不是把它当成通用编程语言来学,而是把它看成“描述机器人动作序列与作业逻辑的载体”。本节围绕三个层次展开:语言基本构成、JOB 与位置变量的组织方式,以及多机器人协同作业时的程序结构设计。

一、INFORM 语言的基本构成

一个 INFORM 程序(JOB)由若干行指令组成,每行通常包含指令名、操作数、标签或注释。核心指令可分为几类:运动指令(MOVJ、MOVL、MOVC)、I/O 指令(DOUT、WAIT、PULSE)、控制指令(IF、JUMP、CALL、RET、END)、运算与赋值指令(SET、ADD、MUL)以及系统指令(如速度倍率、工具号切换)。运动指令决定机器人如何到达目标位置,控制指令决定程序如何分支与循环,I/O 指令负责与外部设备、其他机器人交换信号。

INFORM 中一个非常重要的概念是“位置变量”。位置变量不是简单的坐标三元组,而是包含机器人姿态、工具号、插补方式等信息的复合数据。常见的位置变量类型有:

  • P 变量:直角坐标位置,记录 X、Y、Z、Rx、Ry、Rz 以及工具号、形态标志。
  • J 变量:关节坐标位置,记录各轴角度或脉冲值,常用于回原点或避障路径。
  • BP 变量:基座位置,用于多机器人或外部轴基准定义。
  • EX 变量:外部轴位置,用于变位机、滑台等协同轴。

位置变量可以在示教时直接记录,也可以在程序中通过 SET、ADD 等指令计算生成。例如,SET P010 P000 表示把 P000 的值复制给 P010;ADD P010 P020 表示把 P020 的坐标分量加到 P010 上。这种“位置变量可运算”的特性,是协同作业中实现偏移、镜像、同步的关键。

二、JOB 的组织与调用关系

MOTOMAN 把每个可执行程序称为一个 JOB。JOB 有主程序与子程序之分,主程序通常以 END 结束,子程序以 RET 返回。一个控制柜可以同时管理多个 JOB,但同一时刻只有一个 JOB 处于“主控”状态。多机器人协同作业时,通常由一台机器人(或 PLC)作为主控,其他机器人作为从属,通过 CALL 指令或外部启动信号触发各自的 JOB。

JOB 之间的数据交换主要依靠共享变量和 I/O 信号。共享变量(如 # 开头的全局变量)可以在不同 JOB 中读写,但要注意访问冲突;I/O 信号则通过 DOUT 输出、WAIT 等待、PULSE 脉冲等方式实现握手。协同作业中,最常用的同步手段就是“一方输出完成信号,另一方等待该信号”,从而保证两个机器人在空间和时间上不冲突。

三、协同作业中的程序结构设计

多机器人协同不是简单地把两个单机程序放在一起运行,而是要在程序结构上明确“谁主导、谁跟随、在哪里同步、如何避让”。常见的协同程序结构有三种:

  1. 主从结构:一台机器人作为主控,负责发出同步信号和协调节拍;另一台作为从属,等待信号后执行动作。适用于搬运、上下料等节拍明确的场景。
  2. 对等结构:两台机器人各自运行独立 JOB,通过共享变量和 I/O 互相等待,适合对称作业,如双机焊接、双机装配。
  3. 分层结构:上层由 PLC 或主控 JOB 统一调度,下层机器人各自执行子 JOB,适合三台以上机器人或包含变位机的复杂工作站。

无论采用哪种结构,协同程序都必须解决三个问题:空间干涉(机器人之间不能碰撞)、时间同步(动作顺序不能错乱)、异常处理(一方故障时另一方如何安全停止)。在 INFORM 中,空间干涉通常通过示教时预留安全区域、在程序中插入中间过渡点来规避;时间同步通过 WAIT 指令和互锁信号实现;异常处理则通过 WAIT 超时判断、IF 分支跳转到安全位置或报警处理。

协同程序设计中,建议把“同步点”集中定义为一组 I/O 信号,例如 #1001 表示机器人 A 到达取件点,#1002 表示机器人 B 允许进入。所有 JOB 都引用同一组信号,避免各自定义造成混乱。

四、一个协同搬运的示例结构

假设两台 MOTOMAN 机器人协同搬运一个长工件:机器人 A 负责抓取工件一端,机器人 B 负责抓取另一端,然后同步移动到放置台。程序结构可以这样设计:

' 机器人 A 主程序
CALL JOB:INIT_A
MOVJ P000 VJ=50.0
WAIT IN#(10)=ON          ' 等待 B 就绪
DOUT OT#(20) ON          ' 通知 B 可以抓取
MOVL P010 V=200.0        ' 到达抓取点
DOUT OT#(21) ON          ' 抓取完成
WAIT IN#(11)=ON          ' 等待 B 抓取完成
MOVL P020 V=150.0        ' 同步搬运
DOUT OT#(22) ON          ' 到达放置点
WAIT IN#(12)=ON          ' 等待 B 放置完成
MOVL P030 V=200.0        ' 退回安全位
END

' 机器人 B 从程序
CALL JOB:INIT_B
MOVJ P100 VJ=50.0
DOUT OT#(10) ON          ' 通知 A 就绪
WAIT IN#(20)=ON          ' 等待 A 抓取信号
MOVL P110 V=200.0
DOUT OT#(11) ON          ' 抓取完成
WAIT IN#(21)=ON          ' 等待 A 同步信号
MOVL P120 V=150.0
DOUT OT#(12) ON          ' 放置完成
MOVL P130 V=200.0
END

这个示例中,A 和 B 通过 OT#20、OT#21、OT#22 与 IN#10、IN#11、IN#12 形成握手链。每个 WAIT 都对应一个明确的同步条件,任何一个环节超时都可以通过 WAIT IN#(...)=ON TIMER=5.0 形式加入超时判断,跳转到报警或安全停止子程序。

双机器人协同搬运程序结构与信号握手 机器人 A(主控 JOB) MOVJ P000 回安全位 WAIT IN#10 = ON DOUT OT#20 ON MOVL P010 抓取点 DOUT OT#21 ON WAIT IN#11 = ON 机器人 B(从属 JOB) MOVJ P100 回安全位 DOUT OT#10 ON WAIT IN#20 = ON MOVL P110 抓取点 DOUT OT#11 ON WAIT IN#21 = ON OT#10 → IN#10 OT#20 → IN#20 OT#21 → IN#21 OT#11 → IN#11 输出信号 等待/运动 握手信号方向

从图中可以清楚看到,协同程序的核心不是“两个程序各自跑”,而是“两条指令流通过信号互相约束”。A 的 OT#20 触发 B 的 IN#20,B 的 OT#11 又反过来触发 A 的 IN#11,形成闭环。任何一个 WAIT 没有等到信号,程序就会停在原地,这既是同步机制,也是安全机制。

五、编写协同 JOB 时的几个实用要点

  • 位置变量命名要成组:例如 A 机器人用 P000~P099,B 机器人用 P100~P199,避免交叉引用导致误动作。
  • 同步信号集中分配:建议把协同用的 OT/IN 信号固定在一个区段(如 OT#20~OT#29、IN#10~IN#19),并在程序头注释中列出信号表。
  • 每个 WAIT 都考虑超时:WAIT IN#(10)=ON TIMER=5.0,超时后跳转到安全停止或报警处理,避免死等。
  • 先单机调试,再联机协同:单机 JOB 确认动作无误后,再接入握手信号进行双机联调,可以大幅减少排查工作量。
  • 保留手动干预入口:在协同 JOB 中设置暂停点或手动模式切换,便于现场调试和异常恢复。