HELLO 各位小伙伴,今天我们来聊聊基础概念,子程序和函数。kuka的编程语言和C很像,也能写出不少功能,所以子程序和函数是我们做机器人的工程师基础技能,所以我们今天来探讨一下子程序和函数,并聊聊它有没有什么高级的用法。
子程序
在KRL中有两种子程序,即全局子程序和局部子程序,而且主程序的概念其实并不强,主程序也并不是必须用“main”来命名,所以我们可以把任何一个程序当成主程序来用。
为什么一定要用子程序?
假如我们现在有这样的一个需要
机器人从A点抓取产品,搬运到B点放下,再到A点抓取产品,搬运到C点放下
这样我们的程序如下
;打开夹爪
$out[1]=true ; 打开电磁阀1
$out[2]=false ;关闭电磁阀2
waitfor $in[1] and not $out[2] 检查气缸是否到位
ptp a
;关闭夹爪
$out[1]=false; 关闭电磁阀1
$out[2]=true ; 打开电磁阀2
waitfor not $in[1] and $out[2] 检查气缸是否到位
ptp b
;打开夹爪
$out[1]=true ;打开电磁阀1
$out[2]=false ;关闭电磁阀2
waitfor $in[1] and not $out[2] 检查气缸是否到位
可以看到这里面有非常多的信号输出和信号等待,并且重复写了这部分内容
这叫做代码冗余,不仅需要写非常多的重复内容,还会增加机器人的内存占用量,和看起来不够简洁。
所以我们需要将重复的代码写到一个子程序中,通过调用来实现这部分功能。
将冗余部分写成一个子程序,通过switch进行分支
def grip(type:in)
int type
switch
case 1 ;open
;打开夹爪
$out[1]=true ;打开电磁阀1
$out[2]=false ;关闭电磁阀2
waitfor $in[1] and not $out[2] 检查气缸是否到位
case 2 ;close
;关闭夹爪
$out[1]=false;关闭电磁阀1
$out[2]=true ;打开电磁阀2
waitfor not $in[1] and $out[2] 检查气缸是否到位
endswitch
end
然后要完成前面提到的功能就变得简单了
grip(1)
ptp a
grip(2)
ptp b
grip(1)
...
所以子程序的根本目的就是用来解决代码冗余问题的,并没有多么的高大上,不过是因为子程序的各自用法把它变得有点高深。
全局子程序:
通过独立的src建立的程序模块,或者在src文件中建立的带<GLOBAL>关键字的程序模块。
全局子程序可以在R1下的任何程序模块的调用,比如我们将一部分功能写在一个全局子程序模块中,那么这部分程序就可以多次被使用。
局部子程序
在src文件中end后面建立的程序为局部子程序。SRC 文件中最多可由 255 个局部子程序组成,该程序仅允许局部调用。
局部子程序是多个程序贡献一个dat文件,因此在dat中声明的变量,该程序中所有的子程序都有效,运动点也有效
那么有人说如果我全都建立成全局子程序不行么?
嗯。。。好像也没啥问题,不过程序文件就多了,看着乱是其一,如今建立多套程序也不是很方便。还有就是假如你需要有一个子程序仅在局部有效的话那就只能是局部子程序了。
如此说来,到底什么时候用全局什么时候用局部呢?
我们来假设一个场景,一个相对复杂的项目,其中有多人共同进行程序编写,每个人都来完成不同的功能,那么这时候建议各自都只写一个src文件,需要子程序时自己建立局部的就好了。最后编写主程序的架构人员直接调用就可以了。
prog_xx_xxx()
...
end
My_prog1()
...
end
My_prog2()
...
end
prog_xx_xxx2()
end
prog_xx2_xxx1()
My_prog1()
...
end
My_prog2()
...
end
第二种情况,假如我想写一个公共程序库,比如把一些通用功能作为程序库,在编写项目时方便调用。那你可以写成一个src文件,但是子程序加global来实现全局
prog_class()
end
global function1()
...
end
global function2()
...
end
global function3()
...
end
第三种情况,如果我需要每个src&dat文件代表一种产品,这样如果新增一个产品我只需要复制一个src&dat文件即可,这样就直接在一个src文件中建立局部子程序来写,复制程序后还不会影响当前的程序。
prog_xx_xxx()
...
end
My_prog1()
...
end
My_prog2()
...
end
怎么感觉写来写去还没表达清楚呢,不过即使看不懂也关系不大,慢慢对程序有了规划就自然理解啦。