讨论

发那科机器人TP程序里这种数组变量怎么跨程序调用啊

老林
老林
2026/03/26 13:38

手上有个发那科R-30iB的案子,TP里写了几个子程序做不同工位,主程序里用CALL调用。现在想在主程序里定义一个数组变量(比如R[10]那种),然后各个子程序里都能读写这个数组里的元素,这种跨程序共享变量在TP里到底怎么搞?

我试过直接在子程序里用同一个R寄存器,数值好像能传过去,但又怕程序多了搞混。有没有比较规范的写法?是不是得用全局变量那一套?另外KAREL那边要不要也写一段?

发那科手册翻了半天,变量作用域这块讲得有点绕,没看太明白。各位项目上一般怎么处理的,给个思路。

19 3

全部回复 (3)

日进斗金
日进斗金#1

TP本身就没有真正意义上的全局变量,R[i]寄存器是永久存在的,相当于掉电不丢的全局存储。你直接在子程序里读写R[10]~R[19]完全没问题,这就是发那科的标准做法,跨程序共享数据用的就是这个机制。

但你要注意几点:第一,R寄存器命名一定要规范,注释写清楚哪个区段是干什么用的,不然程序一多真的会乱;第二,DI/DO、GI/GO那些虽然也是全局的,但一般留给IO映射用,别拿来当普通变量使;第三,如果数据量大或者结构复杂(字符串、位置数据),用R寄存器就不太合适了,那得上KAREL写一个全局数据块。

我这边项目上R寄存器用得最多,备个Excel表格专门记录哪段R地址被哪个功能占用,集成商交付的时候一起给客户,省得后期维护扯皮。

2026/03/27 04:22
龙哥
龙哥#2

你这个需求直接用R寄存器就行,但有个坑我得提醒一下:TP程序里如果用SELECT分支或者条件跳转对R寄存器赋值,一定要考虑扫描周期的问题。R寄存器是实时更新的,子程序里读到的值永远是当前最新的,不存在数据同步问题,这点和某些PLC的局部变量不一样。

另外真要做复杂的数据结构,比如把位置寄存器PR[i]和数值混在一起传递,TP就有点吃力了,这时候用KAREL定义一个全局的RECORD或者数组结构更靠谱,TP里通过调用KAREL程序来读写。这种混合编程在汽车焊装线上特别常见,纯TP很难撑住大型项目。

2026/03/28 21:08
杨龙
杨龙#3

看了下你的描述,你这个用法有点危险。R寄存器是全局没错,但TP程序里你直接读R[10]~R[19],如果某个子程序因为异常中断或者跳转没执行完,R里的数据可能是个中间状态,下个子程序再读就出问题了。这种bug现场调起来很恶心,机器人不动了或者动作错乱,查半天查不出来。

建议关键工位之间的数据交互走握手信号,或者用F[标志位]+具体数值的组合方式传递,不要只靠R寄存器裸传。血泪教训,之前一个点焊项目就是这么坑的,调试了两天。

2026/03/30 21:28