导图社区 编程与调试
超详细的编程与调试思维导图来啦!下图包括常用指令、程序的语法、程序的调试、程序的编辑、数据、程序模块与Rapld程序等内容。每天持续更新,如果你对编程感兴趣的话,可以多多关注我呀!
编辑于2019-06-01 13:32:27编程与调试
程序模块与Rapid程序
ABB机器人编程所用的语言叫Rapid语言,它是一种高级语言,语法与结构和c语言很类似,都是采用将复杂问题拆分成单个简单问题,对每个简单问题假体解决的编程思想
程序框架
任务与程序>模块>例行程序 机器人程序储存器是由程序模块与系统模块组成 机器人程序储存器中,只允许存在一个主程序
程序/任务
包含很多模块
模块
系统模块
所有ABB机器人都自带两个系统模块,USER模块与BASE模块,可以修改,但是建议不要对任何自动生成的系统模块进行修改
系统数据
robtarget
tooldata
wobjdata
......
例行程序(1 / 2 / ...)
指令(MoveL / MoveJ / ...)
程序模块
主模块
主程序main(特殊的例行程序,是全部例行程序运行的一个环境,所以只有一个)
程序数据
robtarget
tooldata
wobjdata
......
例行程序(1 / 2 / ...)
指令(MoveL / MoveJ / ...)
程序模块(1 / 2 / ...)
程序数据
robtarget
tooldata
wobjdata
......
例行程序(1 / 2 / ...)
指令(MoveL / MoveJ / ...)
例行程序(PROC)
模块之间的例行程序都可以调用
所有例行程序与数据除特殊定义外,名称必须是唯一的,不可以重复
隐藏声明(同一个模块中的例行程序隐藏,只显示PP指定的例行程序),显示声明(同一个模块中的所有例行程序都显示出来)
所有例行程序与数据无论存在于哪个模块,全部被系统共享。
程序模块是用于对程序进行分类的
新建程序模块:程序编辑器>提示“不存在程序”>取消>出现2个系统模块,不可删除(BASE、user)>文件>新建模块>提示“丢失指针”,点击“是”>为模块起名>类型为“program”>确定>点击该模块>显示模块
数据(Data)
需要删除点位数据,则在程序数据中选择正确的数据类型,会出现在该数据类型下的所有数据名称,点击编辑删除即可
数据类型
基本数据类型
num(数字量,基本数据类型)
bool(布尔量,开关量,基本数据类型)
string(字符串,基本数据类型)
组合数据类型
robtarget(目标点数据)
tooldata(工具数据)
speeddata(速度数据)
zonedata(转弯数据)
“转弯数据z”表示机器人离目标点多远的时候开始转弯。一段路径的最后一条运动指令,z必须设置为fine,fine表示机器人运动到目标点后速度降为0,稍作停顿后走下一个运动轨迹,没有拐弯半径。z为0,拐弯半径为0,速度不为0。
注意:转弯数据越大,机器人的运动轨迹越圆滑。 z为数值则可以指针预读,指针提前读取指令。 z为fine则是指针和指令同步,无预读。 一般在抓取物品之前应该采用Fine,在抓取之后为了减少节拍采用z。
注意干涉碰撞
Loaddata(载荷数据)
Jointaget(轴位置数据)
MoveAbsj 中的点位数据类型
......
化名数据类型
命名规则
只能使用字母,数字与下划线
名字最长使用16个字符
必须以字母开头
不能使用RAPID语言专用词,如:NUM,MoveL,BASE等
机器人不区分大小写,如football与 FoOtBall 等同
数据性质
常量(CONST)
静态值,在定义时,所有常量必须被赋予一个相应的初始值。在程序中不能赋予新值,想修改只能通过修改初始值来更改。
变量(VAR)
在程序中,遇到新的赋值语句,当前值改变,但初始值不变,遇到指针重置,又恢复到初始值
机器人指针被重置(Reset),是指指针被人为从一个Routine(例行程序)移动到 另一个Routine,或者 PP to main
★可变量(PERS)
最常用的数据性质
在程序中,遇到新的赋值语句,当前值改变,初始值也跟着改变,初始值在反复的被修改 (多用于生产计数)
在程序中,可变量可以被赋值。
机器人被重置,可变量数据值会自动记忆数据当前值,并更改数据初始值。
在定义时,所有可变量必须被赋予一个相应的初始值。
程序的编辑
选择多行程序(一定范围内的全部程序):点击起始行程序,点击“编辑”,再次点击编辑菜单里的“编辑”,点击结尾行程序,即可以选择多行程序
剪切:点击一行程序,点击剪切,程序行删除,点击另一行程序,点击粘贴,前面被删除的程序粘贴在该程序下端
复制:复制一行程序,粘贴到另一行程序下端
粘贴:在下端粘贴
在上面粘贴:在上端粘贴
撤销:返回上一步
重做:返回下一步
备注行:该行程序不参与调试和运行
去备注行:与“备注行”相反
ABC...:更改数据,若是改到未定义过的数,则会报错,最好不要用
程序的调试
PP箭头:标识将要执行的语句
PP移至Main:PP移至主程序
调试程序:示教器 > 程序编辑器 > 调试 > PP移至例行程序 > 选择需要调试的程序 > 确定 > 选择某行程序 > PP移至光标 > 按下实体运行按钮
小机器人:表示当前机器人的位置
快捷窗口:单周(整个程序运行一周)、连续(整个程序连续运行)
正确的停止操作:调试过程中,如果机器人处于自动运行状态,需要停止机器人的运动,则按下实体停止按钮即可,切勿松开使能键,否则机器人会紧急刹车,对机器人寿命是一个很大的影响
调用例行程序:示教器 > 程序编辑器 > 调试 > 调用例行程序
Bat_Shutdown
Commutation
LoadIdentify【自动测量工具数据】(常用)
ServiceInfo
CalPendelum
Linked_m
ManLoadIdentify
SkipTaskExec
查看值:查看该行程序中各个变量的相关数据
检查程序:相当于程序编译,检查程序有没有出现语法错误
常见问题:
1、编程时点击“修改位置”时出现如下提示:“无法修改位置,错误的活动工件”。解决方法:将手动操作中工件坐标设置为当前指令的工件坐标即可解决。
2、程序运行的时候,按下启动按钮后,出现如下提示:“启动失败,控制器安全访问限制机制拒绝此操作”。原因:主要是因为工具位置不正确。解决方法:将TCP(尤其时第5轴往下转)移动的接近工件一点即可。
程序的语法
运算符与表达式
算术运算符:ABB的算术运算符的含义与数学中相同,优先级:()、*、/、+、-, 在一个等式中,如果出现两个相同的运算符,则从左到右算
关系运算符:实际上就是比较运算符。优先级:>、<、>=、<=、=、<>(不等于)
表达式的真假:
对于算术运算符,表达式的值为0,则称该表达式为假,非0则为真(一般用1来表示)
对于关系运算符,两边的表达式符合该关系运算符,则整个表达式为真(逻辑值为1),不符合为假(逻辑值为0)
逻辑运算符
AND(与):两边的表达式都为真,则整个表达式为真。简称:全真得真
A=1,B=0,C=1;A AND B = 0;A AND C = 1
OR(或):有一个表达式为真,则整个表达式为真。简称:1真全真
A=1,B=0,C=1;A OR B = 1;B OR B = 0
注意:对于AND运算,只有左边的值为真(非0)时,才继续进行右边的运算。对于OR运算,只有左边的值为假(0)时,才继续进行右边的运算。
a=1,b=2,c=3,d=4,m=1,n=1; 运行表达式:(m:=a>b)AND(n:=c>d) 由于a>b的值为0,所以m为0;n:=c>d不被执行,所以n保持原值1
XOR(异或):如果A、B两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。简称:相异得1,相同得0
A=1,B=0,C=1;A XOR B = 1;A XOR C = 0
MOD(求余,也叫求模):其运算对象必须是整形数据,运算结果为整除后的余数,正负与被除数相同
-7 MOD 3 = -1 ;7 MOD -3 = 1
DIV(除):应用于结构化文本(ST)
程序的3种结构:顺序结构、选择结构(先判断再选择)、循环结构
常用指令
运动类指令
Moveabsj(绝对位置运动)
直接指定6个轴的角度控制机器人运动
各轴均以恒定速率运动,且所有轴均同时达到目的位置,其行成一条非线性路径。
常用于将机器人6轴回归原点,或检查零点。 例:Moveabsj *\NoEOffs,v1000,z50,tool0;
*\NoEOffs中的“*”:目标位置点数据,可重命名
单击“*”>调试>查看值>将rax1-6全部设为0
绝对点位,工件坐标对其无任何影响,更改不同的工件坐标,运行该行程序,还是会回到以 Wobj0(基坐标)为参考的机械原点,该点可以修改位置
v1000:速度为1000mm/s
z50:转弯半径50mm
Movej(关节运动)
由机器人自己规划一个尽量接近直线的最适合的路线,不一定是直线,因此不容易走到极限位置
常用于精度要求不高的情况,适合于大范围的运动,例:Movej *,v1000,z50,tool0;
“*”:目标位置点,需要先将TCP移动到目标位置后再点击“修改位置”
MoveL(直线运动)
机器人按照严格的直线进行运动
常用于对轨迹精度要求较高的情况,注意:直线运动的长度不能太长,否则机器人容易走到死点位置(极限位置)。如果走到死点位置,可以在两个点之间插入一个中间点,把路径分为2部分。
MoveC(圆弧运动)
通过起点、中间点、终点来确定的一个圆弧轨迹运动
例:MoveC *,*,v1000,z50,tool0;
起点:上一条指令的目标点
中间点:该指令第一个“*”
终点:该指令第二个“*”
不确定的圆
三点离太近
三点离圆心近
三点夹角>240°
出现这个报错,则需要先将小机器人去掉
两种操作
PP移至Main
PP移至光标
赋值指令
“:=”,格式:变量:=表达式
赋值指令左边必须是单个变量,右边的表达式可以是常量、变量或普通表达式
只有相同数据类型才能赋值
作用:将赋值指令右边的表达式赋值给左边的变量,例如:
reg1:=2
reg1:=reg2
reg1:=reg2+5
reg1:=reg1+1
功能指令
偏移:单击该点位>功能>点击offs
offs(p1,100,-100,0):偏移点位置以p1为原点,X轴偏移100,Y轴偏移-100,Z轴偏移0
画同心圆
画同心方
同心方1
同心方2
TX20.trans.x的意思是TX20这个点位的X轴上的数值
角度偏移:单击该点位>功能>RelTool
RelTool同样为偏移功能,而且可以设置角度偏移,但其参考的坐标系为工具坐标
取绝对值:单击该点位>功能>点击Abs
例子:reg1:=Abs(reg2)
调用指令
Proccall(调用子程序指令)
调用例行(子)程序
return(返回程序指令)
若某个子程序中含有该指令,执行此指令时,马上结束当前程序,返回到调用此程序的位置,进行下一行的程序。
stop(停止运行程序指令)
流程控制指令
IF语句
IF语句用于实现选择结构,也可以理解为一种判断结构,其用法和C语言,只是在格式上略有不同
Compact IF
格式: IF 表达式 THEN 语句 ENDIF
含义:如果表达式的值为真,则进行下面语句,否则结束
例:IF DI1=1 MOVEL P60
IF语句嵌套
IF...ELSE...
格式: IF 表达式 THEN 语句1 ELSE 语句2 ENDIF
含义:如果表达式为真,则执行语句1;为假,则执行语句2
例:IF DI1=1 MOVEL P60 ELSE MOVEL P70
IF...ELSEIF...ELSE(条件选择判断)
优先级(从上到下) 排斥性(上一个条件满足,则不进行下一个判断)
格式: IF 表达式1 THEN 语句1 ELSEIF 表达式2 THEN 语句2 ...... ELSEIF 表达式n-1 THEN 语句n-1 ELSE 语句n ENDIF
例:IF geshu=3 MOVEL P60 ELSEIF geshu=4 MOVEL P70 ...... ELSE MOVEL P80
含义:多层判断
TEST语句
检测指令
添加指令>Prog.Flow>TEST
reg1由PLC给信号,PickA、PickB、PickC、PickD分别时4个例行程序,当reg1=1时,执行例行程序PickA,以此类推
WHILE语句
循环指令WHILE运行时,机器人循环至不满足判断条件后,才跳出循环指令,执行ENDWHILE以后的运行指令。当循环指令 WHILE 运行时,存在死循环,在编写相应机器人程序时必须注意。
循环指令,不会终止,除非在循环里遇到不满足的条件才会跳出循环 (添加指令>Prog.Flow>TEST)
循环3次,当reg1>=3时,跳出循环
一直在循环里,无法跳出循环, 所以无法执行reg1:=reg1+1
死循环:为了防止人为干扰,可以将程序放在“WHILE TURE DO”中
就算由人为单周运动,该指令也会在执行到不满足条件是才跳出
“WHILE TURE DO”:死循环时,程序对CPU的要求很高,运算速度很快,符合很大,需要在ENDWhile前面添加一个延时指令“WaitTime 0.3”,防止CPU过负荷
FOR语句
循环指令FOR <ID> FROM A TO B DO
循环嵌套
用FOR循环写的码垛
GOTO语句
Lable 标签 goto 跳转到标签位置
金字塔同心方和金字塔同心圆
写屏/清屏指令
TPWrite(写评) TPErase(清屏)
案例"Welcome_to_zhinanche"
案例“画方和画圆的计数”
应用到字符串和可选变量,写字符串一定要用双引号“”
I/0类指令
Set(置位指令)
作用:将信号置1
格式:Set 信号名 (例如:Set do2)
Reset(复位指令)
作用:将信号置0
格式:Reset 信号名 (例如:Reset do2)
SetDO(配置DO指令)
作用:配置do信号的值
格式:SetDO 信号名,信号值
例如:SetDO do2,1 等价于 Set do2
例如:SetDO do2,0 等价于 Reset do2
可以设置延迟时间,如:SetDO\SDelay:=3,do2,1 表示延迟3秒后将do2设为1。 “可选变量”的意思,就是该指令还有一些其他的,可以选择性打开或关闭的功能参数
GirpLoad(搬运时有效载荷指令)
如果IO信号用于控制搬运时夹爪的抓紧松开,则需要用GirpLoad指令指定有效载荷。
例 :Set do2; (夹爪夹紧) GirpLoad loadhezi; (搬起盒子,机器人有承重,承重量为盒子有效载荷) MoveL p60,v1000,tool0; (移动到p60点) Reset do2; (夹爪松开) GirpLoad load0; (松开盒子,机器人无承重,为默认的load0)
WaitDI(等待di指令)
等待DI信号为设定的信号值,才会执行下面的语句。超过最大等待时间MaxTime (默认300ms)则报警或出现出错提示。最大等待时间可自由设定
格式:WaitDI 信号名,信号值 (例如:WaitDI di1,1)
WaitDO(等待do指令)
等待DO信号为设定的信号值,才会执行下面的语句。
格式:WaitDO 信号名,信号值 (例如:WaitDO do1,1)
WaitUntil(等待数据指令)
这是一个综合的等待数据指令,等待的数据可以是IO信号,也可以是数字量、布尔量等其他程序数据(可以理解为判断指令)
格式:WaitUntil 数据名 关系运算符(>=<) 数据值
di信号:WaitUntil di1=1
do信号:WaitUntil do2=1
布尔量:WaitUntil tlag1=TRUE
数字量:WaitUntil num1>2
PS:WaitUntil di1=1 等价于 WaitDI di1,1 WaitUntil do2=1 等价于 WaitDO do2,1
PulseDO(脉冲输出指令)
PulseDO do1
输出一个脉冲信号,脉冲长度为 0.2 s。
[\PLength]-参变量 ( num );脉冲长度,0.001s-2000s。
总结
1、等待类指令可以看做一种判断指令
2、超过最大等待时间MaxTime(默认300ms)则报警或出现出错提示。最大等待时间可自由设定
3、如果I/O类指令前有运动指令,其最后一条的转弯数据z必须设置为fine,否则置位 (复位)会提前
速度控制指令