2. TP程序结构与执行机制

TP(Teach Pendant)程序是FANUC机器人最基础、也是现场使用最广泛的程序形态。理解TP程序的结构与执行机制,是后续编写运动指令、I/O逻辑、条件分支和子程序调用的前提。很多初学者写出的程序“能跑但不可靠”,根源往往不在指令本身,而在于对程序组成、标签跳转、调用层级和扫描周期的理解不到位。

一、TP程序的组成

一个TP程序由若干条“行”组成,每行是一条指令或一条标签。从功能上看,TP程序内部包含以下几类元素:

  • 程序头信息:程序名、程序注释、创建与修改信息等,属于程序属性,不参与逐行执行。
  • 运动指令:如 J P[1] 100% FINE、L P[2] 500mm/sec CNT50,控制机器人以关节或直线方式运动到示教点。
  • I/O指令:如 DO[1]=ON、RO[2]=ON、WAIT RI[3]=ON,用于与外围设备交互。
  • 寄存器与逻辑指令:如 R[1]=R[1]+1、IF R[1]>5,JMP LBL[2],用于计数、判断和分支。
  • 标签:如 LBL[1],是跳转的目标位置,本身不产生动作。
  • 调用指令:如 CALL SUB_PROG,用于调用子程序。
  • 结束指令:如 END,表示程序正常结束。

需要特别注意的是,TP程序中的“行号”是系统按顺序自动编号的,插入或删除行后行号会重新排列。因此,程序逻辑不应依赖行号,而应依赖标签和结构化指令。

二、标签与跳转

标签(Label)是TP程序中实现分支和循环的核心手段。FANUC TP支持 LBL[i] 形式的标签,i 通常为 1~99 的整数。跳转通过 JMP LBL[i] 实现,条件跳转则通过 IF 条件,JMP LBL[i] 实现。

例如,一个简单的循环等待逻辑可以写成:

LBL[1]
WAIT RI[1]=ON
IF R[1]<3,JMP LBL[1]
R[1]=0

这段程序的含义是:反复等待输入 RI[1] 为 ON,每满足一次计数加一,直到计数达到 3 次后清零。这里 LBL[1] 是跳转目标,JMP LBL[1] 是跳转动作,IF 提供条件判断。标签必须唯一,且跳转目标必须存在,否则程序在运行时可能报错或进入不可预期状态。

标签跳转适合实现简单的循环和分支,但过多使用 JMP 会使程序难以阅读和维护。对于复杂逻辑,建议优先使用 IF...THEN...ELSE、SELECT 等结构化指令。

三、调用层级与子程序

TP程序支持子程序调用,通过 CALL 指令实现。主程序调用子程序时,系统会保存当前执行位置,转入子程序执行,子程序执行到 END 或 RETURN 后返回主程序继续执行。

调用层级需要注意以下几点:

  • FANUC TP通常允许一定的嵌套调用深度,但过深的嵌套会增加调试难度,也容易触发调用栈限制。
  • 子程序应职责单一,例如“抓取子程序”“放置子程序”“报警处理子程序”,便于复用和排障。
  • 子程序中使用 RETURN 可以提前返回,但应确保返回前关键输出已恢复到安全状态。
  • 主程序与子程序之间通过寄存器、I/O 或参数传递数据,TP本身不提供复杂的参数传递机制,因此命名和注释尤为重要。

一个典型的结构是:主程序负责流程调度,子程序负责具体动作。例如主程序依次调用 CALL PICK、CALL PLACE,而 PICK 和 PLACE 内部各自完成运动、I/O 和等待逻辑。

四、运行扫描周期

TP程序的执行不是“一次性编译后运行”,而是由控制器按扫描方式逐行解释执行。可以把它理解为:控制器周期性地读取当前行、解释该行、执行该行,然后移动到下一行。这个周期称为扫描周期。

扫描周期对程序行为有几个重要影响:

  • 运动指令是“阻塞”的:执行一条运动指令时,程序会等待机器人到达目标点或满足终止条件(如 FINE 或 CNT),然后才继续下一行。
  • I/O 和逻辑指令执行很快:这类指令在一个扫描周期内完成,因此循环计数、条件判断的速度远高于运动。
  • WAIT 指令会占用扫描时间:WAIT 会反复检查条件,直到满足才继续,期间程序停在该行。
  • 扫描周期影响响应速度:如果程序中存在大量无意义的循环或过长的等待,会降低对外部信号的响应能力。

因此,在编写TP程序时,应避免在高速循环中放置不必要的指令,尽量用 WAIT 或条件跳转替代“空转”逻辑。同时,对于需要快速响应的安全信号,应优先使用硬件急停或安全回路,而不是依赖TP程序中的软件判断。

TP程序执行机制:结构、跳转、调用与扫描 主程序 MAIN 1: J P[1] 100% FINE 2: DO[1]=ON 3: LBL[1] 4: WAIT RI[1]=ON 5: CALL SUB_PICK 6: IF R[1]<3,JMP LBL[1] 7: END JMP 跳转 子程序 SUB_PICK 1: L P[10] 300mm/sec FINE 2: RO[1]=ON 3: RETURN CALL RETURN 扫描周期 读取当前行 → 解释 → 执行 运动指令:等待到位后继续 逻辑/I/O:单周期内完成 标签提供跳转目标,CALL/RETURN 管理调用层级,扫描周期决定执行节奏

五、结构设计建议

结合上述机制,编写TP程序时可以遵循以下实践原则:

  1. 主程序只做调度:主程序负责流程顺序和条件判断,具体动作交给子程序,避免主程序过长。
  2. 标签命名有规律:虽然TP标签只支持数字,但可以在程序注释中说明每个标签的用途,例如“LBL[1]:等待上料”。
  3. 控制调用深度:一般建议嵌套不超过3~4层,便于追踪执行路径。
  4. 避免死循环:使用 JMP 构成循环时,必须确保存在退出条件,否则程序会一直停在该循环内。
  5. 关注扫描节奏:对响应速度有要求的信号,尽量放在循环前部或使用中断/安全回路处理。
在调试带有跳转和子程序调用的TP程序时,建议先使用单步执行确认每一行的实际走向,再切换到连续运行。直接连续运行复杂跳转逻辑,一旦进入非预期分支,可能造成碰撞或设备损坏。

掌握TP程序的组成、标签跳转、调用层级和扫描周期,本质上是在建立“程序如何被控制器一步步执行”的心智模型。只有理解了这个模型,才能在后续编写复杂逻辑时,准确预判程序的执行顺序和响应行为,写出既正确又可靠的机器人程序。