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 脉冲等方式实现握手。协同作业中,最常用的同步手段就是“一方输出完成信号,另一方等待该信号”,从而保证两个机器人在空间和时间上不冲突。
三、协同作业中的程序结构设计
多机器人协同不是简单地把两个单机程序放在一起运行,而是要在程序结构上明确“谁主导、谁跟随、在哪里同步、如何避让”。常见的协同程序结构有三种:
- 主从结构:一台机器人作为主控,负责发出同步信号和协调节拍;另一台作为从属,等待信号后执行动作。适用于搬运、上下料等节拍明确的场景。
- 对等结构:两台机器人各自运行独立 JOB,通过共享变量和 I/O 互相等待,适合对称作业,如双机焊接、双机装配。
- 分层结构:上层由 PLC 或主控 JOB 统一调度,下层机器人各自执行子 JOB,适合三台以上机器人或包含变位机的复杂工作站。
无论采用哪种结构,协同程序都必须解决三个问题:空间干涉(机器人之间不能碰撞)、时间同步(动作顺序不能错乱)、异常处理(一方故障时另一方如何安全停止)。在 INFORM 中,空间干涉通常通过示教时预留安全区域、在程序中插入中间过渡点来规避;时间同步通过 WAIT 指令和互锁信号实现;异常处理则通过 WAIT 超时判断、IF 分支跳转到安全位置或报警处理。
四、一个协同搬运的示例结构
假设两台 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 的 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 中设置暂停点或手动模式切换,便于现场调试和异常恢复。