发那科机器人多任务间通信,工业现场最常用、最简单稳定的是:标志位 F []、数值寄存器 R []、组掩码隔离、后台逻辑;复杂一点可用Karel 共享内存 / 消息队列。下面按用法从易到难讲清楚,并给可直接用的示例。
一、多任务基础
发那科多任务用 RUN 指令 启动并行任务:
tp
RUN JOB1 ; 主程序启动JOB1,不等待,继续往下跑
限制:同一动作组(Group)不能同时运动;多任务程序组掩码设为
*(不占用运动组)。控制器:R-30iB 最多 16 个任务,R-30iB Plus (v9.1+) 最多 32 个。
二、最常用:全局寄存器通信(TP 程序直接用)
1. 标志位 F [](布尔,任务间启停 / 互锁)
所有任务直接读写同一段 F [],无需额外设置。
主程序(MAIN)
tp
F[100]=OFF ; 初始化:任务1未就绪 RUN TASK1 ; 启动任务1 WAIT F[100]=ON ; 等待任务1完成 ! 继续执行...
任务 1(TASK1)
tp
! 做后台任务(如IO监控、拍照) F[100]=ON ; 通知主程序:我完成了 END
2. 数值寄存器 R [](整数 / 小数,传数据)
跨任务共享数值,如坐标、计数、状态码。
主程序
tp
R[50]=100 ; 给任务1发数据 RUN TASK2
任务 2
tp
WAIT R[50]>0 ; 等待数据 TPWRITE "收到:",R[50] R[51]=R[50]*2 ; 回传结果 END
3. 位置寄存器 PR [](传点位)
多任务间传递目标位置,常用于视觉 / 搬运。
三、任务互锁
用 F [] 做互斥锁,同一时间只一个任务执行关键区。
tp
; 任务A WAIT F[200]=OFF ; 等待锁释放 F[200]=ON ; 上锁 ! 关键代码(如占用外部轴) F[200]=OFF ; 解锁
任务 B 同理,先等锁、再上锁、最后解锁。
四、后台逻辑(常驻任务通信)
后台程序(Background Logic)上电自启,长期运行,适合持续通信 / 监控。
设置:菜单 → 设置 → 系统 → 后台逻辑 → 添加程序(如 BG_COM)。
限制:不能用运动指令、码垛寄存器;可读写 F []/R []/IO。
后台程序 BG_COM
tp
WHILE TRUE TPWRITE "当前计数:",R[10] WAIT 0.5 END
五、高级:Karel 共享内存与消息队列(复杂数据)
如果需要字符串、数组、结构体,用 Karel(发那科高级语言)。
1. 共享变量(COMMON)
karel
! 所有Karel程序定义相同COMMON块 COMMON SHARED VAR_INT : INTEGER VAR_STR : STRING[32] END_COMMON
2. 消息队列(Message Queue)
任务间异步收发消息,避免轮询。
karel
CREATE_QUEUE(QUEUE_ID, 10) ! 创建队列 SEND_MSG(QUEUE_ID, DATA) ! 发消息 RECV_MSG(QUEUE_ID, DATA) ! 收消息
六、关键规则(避坑)
组掩码隔离:多任务程序组掩码设为
*,不可与主运动任务同组。只用全局寄存器:F []/R []/PR [] 是跨任务唯一通用共享区。
互锁必须解锁:死锁会导致程序卡死。
后台程序有限制:无运动、无码垛;适合逻辑 / 通信。
七、最简实用模板
主程序 MAIN
tp
F[1]=OFF RUN TASK_IO RUN TASK_COUNT WAIT F[1]=ON TPWRITE "所有任务完成" END
任务 1 TASK_IO(监控 IO)
tp
WHILE TRUEIF DI[10]=ON THEN R[10]=R[10]+1 WAIT 0.1 END
任务 2 TASK_COUNT(计数)
tp
WAIT R[10]>10 F[1]=ON END

