2.4 子程序
从本质上说,主程序和子程序没有区别。子程序中包含了要多次运行的工作过程或者工作步骤。子程序单独在一个文件中进行编程,在需要时进行调用、运行。
为了方便地选择某一个子程序,必须为子程序取一个程序名。程序名可以自由选择,但是必须符合相关规定(与主程序相同),并且建议具有一定含义。
说明:
1.子程序名后缀必须为iso。
2.子程序结尾可以用RET返回到程序调用处,也可以编程M02或M30结束子程序返回到调用处。
2.4.1 子程序分类
子程序分类:
1.标准子程序:和主程序一样。可以被主程序和其它子程序调用。
2.参数子程序:子程序开头处必须有PROC,末尾处RET。调用参数子程序时,通过传递参数子程序来实现具体功能。
说明:
子程序不仅可以在主程序中调用,而且还可以在另一个子程序中调用,这个过程称为子程序嵌套。对于这样的嵌套调用,总共可以最多有12级嵌套,包括主程序级。
图2.2 子程序嵌套
2.4.2 子程序调用
在主程序中调用子程序时,直接使用子程序名。子程序调用要求占用一个独立的程序段。
1.标准子程序调用
带程序重复P:如果要求连续多次执行一个子程序,则可以在程序段中调用子程序时,在地址P下编程程序重复的次数。P值范围1~99。
举例:
例1:N40 PA P3 ;子程序PA应连续执行3次。
例2:标准子程序调用,后面“()”可以省略。
N20 WE() P3 ;调用子程序WE 3次
或N20 CALL WE() P3 ;调用子程序WE 3次
2.参数子程序调用
如果在主程序中带参数工作,则可以在子程序中使用相应计算的或者赋值的数值。在此主程序的实际参数的值在子程序调用时传递到子程序的形式参数,并且在子程序执行过程中处理。
子程序参数传递种类:
1)按值传递:按值传递的参数仅作为输入参数,在被调用子程序中参与计算,即使其值发生变化也不反馈回上层子程序中。
2)按地址传递:按地址传递的参数作为输入输出参数,在被调用子程序中参与计算后,其值将重新返回至上层子程序。为实现参数的按地址传递,只需在被调用子程序的对应参数前加上“VAR”关键字即可。
说明:
参数仅在程序调用时或者第一次执行时传送。对于其它的重复,这些参数保持不变。
举例:
例1:
N20 WE(10,50,R32,,R45) P5 ;假设WE有5个参数,调用子程序WE5次
或N20 CALL WE(10,50,R32,,R45) ;调用一次子程序WE
例2:
PROC CYC84 (……)
DEF REAL PP
DEF REAL MP
…… ……
STE (PP, MP)
…… ……
RET
PROC STE (VAR REAL PP, REAL MP)
…… ……
RET
在子程序“CYC84”中定义了两个参数“PP”和“MP”。在调用子程序“STE”时,“PP”为按地址传递,“MP”为按值传递。调用的目的是在“STE”中根据“MP”的值对“PP”进行相应修改,并把结果反馈给“CYC84”继续使用。即“STE”对“PP”的更改能够传递至“CYC84”。
2.4.3 模态调用子程序
在NC程序中能够以模态方式调用每个任意的子程序,也就是说自保持。该功能对于简化在重复使用钻削循环时的编程具有重要的意义。
指令格式:
MCALL SUBPROGRAM() ;模态调用一个子程序
......
MCALL ;取消模态调用
功能:
通过在子程序名称之前使用关键字MCALL,可以进行一个子程序的模态调用。使用该功能,可以在每个带轨迹运动的程序段之后自动调用该子程序并进行加工。
说明:
1.如果只编程MCALL,后面不带任何子程序名,则可以关闭该功能;或者通过重新模态调用一个其它的子程序,也可以改变该功能。
2.模态调用的嵌套是不可以的,也就是说模态调用的子程序中不可以在内部包含其它的模态子程序调用。
举例:
N10 M03 S1500
N20 G00 X0 Y0 Z10
N30 F100
N40 MCALL CYCLE81 (10, 0, 3, -20, 0) ;此处激活模态调用,但不钻孔
N50 Y0 ;钻第一个孔
N60 Y20 ;快移至该位置,并钻第二个孔
N70 Y40 ;快移至该位置,并钻第三个孔
N80 Y60 ;快移至该位置,并钻第四个孔
N90 MCALL ;取消模态调用
N100 M02
2.4.4 主、子程序同文件编辑
为方便用户对于子程序和主程序的同步编辑、修改,系统也支持主程序和子程序在同一程序下进行编辑的功能。
用法:
使用方法1——在普通程序中调用子程序:
CALL LABEL1:LABEL2 ;使用call指令调用子程序
…
LABEL1: ;起始标签
G0 X100
…
LABEL2: ;结束标签
使用方法2——在固定循环中调用轮廓子程序:
T1 D1
M3 S800
G95 F0.2
CYCLE95 ("LABEL1:LABEL2", 2, 0.02, 0.2, 0, 0.25, 0.1, 0.13, 1, 0, 0, 0 ;使用标签调用子程序
M02
LABEL1: ;起始标签
G0 X20 Z0
G1 X26 Z-3
Z-24
X35 Z-29
X40 Z-36.5
Z-40
X60
LABEL2: ;结束标签
注意事项:
1、编程时的标签不能使用段号N…,且起始段和结束段的标签后均需要加上“:”。
2、除CYCLE循环外,用户编程调用时需显示加上CALL调用,否则会报编程错误
3、MCALL不支持同文件调用方式。
4、该方式子程序仅支持调用普通子程序,由于需要标签起始和标签结束,不支持传参操作。
5、不能使用p参数进行多次调用,但可在不同位置重复调用程序段。