在程序中,可用GOTO语句和IF语句改变程序的流向,和其在C语言语句中的作用类似。转移和循环有下列3种。

1.无条件转移语句(GOTO语句)
无条件转移到顺序号为n的语句。当顺序号在1~99999范围以外时,就会有PS1128报警发出。另外,顺序号也可用表达式来指定。
格式:GOTO n; n为顺序号(1~99999)
例如:GOTO 5; 程序转移至N5程序段。
GOTO#10 ;程序转移至N#10程序段。
警告:不可在一个程序中指定多个附带有相同顺序号的程序段。利用GOTO语句转移时,转移目的地不定会十分危险。
说明:
①反向转移比正向转移需要更长的时间。
②在以GOTO n指令转移的、顺序号n的程序段中,顺序号必须在程序段的开头。顺序号不在程序段的开头时不可转移。如果编写了类似“G00 X20.6 Y90.5 N3”这样的程序,GOTO3语句无法找到不在程序开头的N3。
2.顺序号存储型GOTO语句
在执行用户宏程序控制指令GOTO语句时,对于以前执行并存储的顺序号高速地进行顺序号检索。
“以前执行并存储的顺序号”,指所执行的顺序号在相同程序内没有重复的顺序号以及子程序调用的顺序号,CNC对此进行存储。
存储类型因下面的参数而不同。
(1)参数No.6000#1=1时 固定类型……从开始运行起执行并存储的最多20个顺序号。
(2)参数No.6000#4=1时
①可变类型……在执行GOTO语句前就执行并存储的最多30个顺序号。
②履历类型……以前曾利用GOTO语句进行顺序号检索并存储的最多10个顺序号。
存储的顺序号在下列情形下将会被取消:
①刚刚接通电源后。
②进行复位时。
③在进行程序的登录和编辑(含后台编辑以及MDI程序的编辑)运行程序时。
警告:请勿在一个程序中指定多个带有相同顺序号的程序段。
如果在GOTO语句的前后指定与转移目的地顺序号相同的顺序号并执行GOTO语句时,转移目的地会因参数而发生变化,此种情形将十分危险!所以请不要编写如下这样的程序。
N5…;
……
GOTO 5;
……
N5…;
因为GOTO 5语句会随着相关参数设置的不同,可能会转移到GOTO 5前面的N5,也可能转移到后面的N5。
3.条件转移语句(IF语句)
在IF后指定<条件表达式>。
(1)IF[<条件表达式>]GOTO n 如果指定的<条件表达式>(真)满足,则转移到顺序号为n的语句;如果条件表达式不满足,程序执行下一程序段。如果变量#1的值≥53.2,则转移到N20。

(2)IF[<条件表达式>]THEN 如果<条件表达式>成立(真),则执行指定在THEN之后的宏语句。但只执行一个宏语句。该语句在加工中心G73、G83钻孔循环指令中有应用。
①当#1和#2一致时,将0代入#3。
IF[#1 EQ#2]THEN#3=0;
②当#1和#2一致,且#3和#4一致时,将0代入#5。
IF[[#1 EQ#2]AND[#3 EQ#4]]THEN#5=0;
③当#1和#2一致,或#3和#4一致时,将0代入#5。
IF[[#1 EQ#2]OR[#3 EQ#4]]THEN#5=0;
说明:
①<条件表达式>。<条件表达式>有两种:<简单条件表达式>和<复合条件表达式>。<简单条件表达式>即在相比较的2个变量或变量和常量之间描述表5-5所示的比较算符的条件表达式。代之以变量,也可以描述<表达式>。<复合条件表达式>即将多个<简单条件表达式>的真假结果以AND(逻辑积)、OR(逻辑和)、XOR(按位加)进行运算的结果。条件表达式必须包括算符。算符插在两个变量中间或变量和常数中间,并且用方括号“[]”封闭。表达式可以替代变量。
②比较算符。每个算符由两个字母组成,用来比较两个值,决定它们是否相等,或一个值比另一个值小或大。需要注意的是,不能使用不等符号NE作为比较算符。(https://www.xing528.com)
表5-5 比较算符

典型程序:
下面的程序计算数值1~20的总和。
O1010;
#1=0; 存储和数变量的初值
#2=1; 被加数变量的初值
N8 IF[#2 GT 20]GOTO30; 当被加数大于20时转移到N30
#1=#1+#2; 计算和数
#2=#2+1; 下一个被加数(是“1”不是“#1”)
GOTO 8; 转到N8
N30 M30; 程序结束
4.循环语句(WHILE语句)
在WHILE后指定一个条件表达式。当指定条件满足时,执行从DO到END之间的程序;当指定的条件表达式不满足时,进入END后面的程序段。

说明:
①当指定的条件表达式满足时,执行紧跟WHILE后的从DO到END之间的程序。
②当指定的条件表达式不满足时,执行与DO对应的END后面的程序段。
③条件表达式和算符与IF语句相同。
④DO和END后面的数值是指定执行范围的识别号,可用1、2、3作为识别号。
⑤如果用1、2、3以外的数字作为识别号,则会有PS0126报警发出。
5.嵌套
识别号(1~3)在DO~END之间可多次使用。但是,当重复的循环相互交叉时,会有PS0124报警发出。
1)识别号(1~3)可根据需要多次使用。

2)DO的范围不能重叠。

3)DO循环可以嵌套,最大可嵌套三层。

4)控制可转移到循环体外面。

5)不能转移到循环体中。

限制:
①无限循环。当指定DO m而省略WHILE语句时,程序则在DO到END之间无限循环。
②处理时间。当要转移到GOTO语句中指定的顺序号时,程序先检索顺序号。为此,反向处理数据比正向要用较长的时间。因此,反向处理数据时,为了缩短处理时间,作为重复指令,可使用WHILE语句。
③未定义变量。在使用EQ、NE的条件表达式中,<空值>和0(零)有不同的效果,在别的条件表达式中,<空值>被看成0。
6.关于循环语句和转移语句的其他说明
1)DO m和END m必须成对使用,而且DO m一定要在END m指令之前,用识别号m来识别。
2)无限循环:当指定DO m而没有指定WHILE语句时,将产生从DO m到END m之间的无限循环。
3)未定义的变量:在使用EQ或NE的条件表达式中,值为空和值为零将会有不同的效果。而在其他形式的条件表达式中,空即被当作零。
4)循环语句(WHILE…DO语句)和条件转移语句(IF…GOTO语句)的关系:许多情况下,两者是从正反两方面去描述同一件事,因此,两者具有相当程度的可互换性。
5)处理时间:当在GOTO语句(无论是无条件转移的GOTO语句还是有条件转移的IF…GOTO语句)中有顺序号转移的语句时,系统将会进行顺序号检索。为此,反向处理数据比正向要用较长的时间。因此,反向处理数据时,为了缩短处理时间,作为重复指令,可使用WHILE语句。
实际上,WHILE…DO语句和IF…GOTO语句的正向/反向检索的时间差确实有,但这个时间差有多大,FANUC各个版本的说明书里没有标明。相对于系统的运算能力和处理数据的速度,这个时间差对于处理两者所需的时间来说必然很小。所以不必拘泥于用哪种语句来表述,而应优先考虑数学表达是否正确,逻辑是否严密,变量表达的先后顺序是否无误等。显然,从多样性来看,IF…GOTO语句的应用形式比WHILE…DO语句灵活多变。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
