用户宏程序——FANUC(法那克)
随着软件不断发展,目前CAD/CAM软件普遍应用,手工编程的应用空间日趋减小。其实宏程序有着广泛的应用空间,并且能够方便工人编程。锻炼我们的编程能力,帮助我们更加深入的了解自动编程的本质。所以,在能应用手工编程的的地方尽量不要使用自动编程,比在必要时可以采用自动编程。
宏程序定义:宏程序是手工编程的高级形式。
宏程序的特点:
1、 将有规律的形状或尺寸用最简短的程序表达出来。
2、 具有极好的易读性和易修改性,编写出来的程序非常简洁,逻辑严密。
3、 宏程序的运用是手工编程中最大的亮点和最后的堡垒。
4、 宏程序具有灵活性、智能性、通用性。
宏程序与普通程序的比较
宏程序可以使用变量,并且给变量赋值、变量之间可以运算、程序运行可以跳转。
普通编程只能使用常量、常量之间不能运算、程序只能顺序执行,不能跳转。
宏程序分为两类:A类和B类。
A类宏程序是机床的标配。用G65H**来调用。
B类宏程序相比A类来说,容易简单,可以直接赋值运算,所以B类用的多。
(1)变量功能
1) 变量的形式:变量符号+变量号 法那克系统变量符号用 # ,变量号为1、2、3…
2) 变量的种类:空变量、局部变量、公共变量和系统变量四类。
空变量:#0。该变量永远是空的,没有值能赋它。
局部变量:#1—#33。只在本宏程序中有效,断电后数值清除,调用宏程序时赋值。
公共变量:#100—#199、#500—#999。在不同的宏程序中意义相同,#100—#199断电后清除,#500—#999断电后不被清除。
系统变量:#1000以上。系统变量用于读写CNC运行时的各种数据,比如刀具补偿等。
提示:局部变量和公共变量称为用户变量。
3) 赋值:赋值是指将一个数赋予一个变量。例#1=2 #1表示变量,# 是变量符号,数控系统不同,变量符号也不同,= 表示赋值符号,起语句定义作用。 2 就是给变量#1 赋的值。
4) 赋值的规律:
1、赋值号 = 两边内容不能随意互换,左边只能是变量,右边可以是表达式、数值或者变量。
2、一个赋值语句只能给一个变量赋值。
3、可以多次给一个变量赋值,新的变量将取代旧的变量,即最后一个有效。
4、赋值语句具有运算功能,形式:变量=表达式,在运算中,表达式可以是变量自身与其他数据的运算结果,如:#1=#1+2,则表示新的#1等于原来的#1+2,这点与数学等式是不同的。
5、赋值表达式的运算顺序与数学运算的顺序相同。
5) 变量的引用
1、当用表达式指定变量时。必须把表达式放在括号中。如 G01 X[#1+#2] F#3。
2、引用变量的值的符号,要把负号(–)在在#的前面。如 G01 X-#6 F1000。
(2)运算功能
1) 运算符号:加(+) 减(–) 乘(*) 除(/)
正切(TAN) 反正切(ATAN) 正弦(SIN) 余弦(COS)开平方根(SQRT)
绝对值(ABS) 增量值(INC) 四舍五入(ROUND)舍位去整(FIX) 进位取整(FUP)
2) 混合运算:
1、 运算顺序:函数——乘除——加减
2、 运算嵌套:最多五重,最里面的“[ ]”运算优先。
(3)转移功能
1) 无条件转移:格式 GOTO + 目标段号(不带N)。例如转到N50 GOTO50
2) 有条件转移:格式 IF + [ 条件表达式 ] + GOTO + 目标段号(不带N)
3) 转移条件:
|
等于 |
= |
EQ |
IF[#1EQ#2]GOTO10 |
|
不等于 |
≠ |
NE |
IF[#1NE#2]GOTO10 |
|
大于 |
> |
GT |
IF[#1GT#2]GOTO10 |
|
小于 |
< |
LT |
IF[#1LT#2]GOTO10 |
|
大于等于 |
≥ |
GE |
IF[#1GE#2]GOTO10 |
|
小于等于 |
≤ |
LE |
IF[#1LE#2]GOTO10 |
举例1:同心圆 刀具Φ8 所以步距取6mm
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X0 Y0; |
位置定位 |
|
Z2.; |
安全高度,二次验刀 |
|
G01 Z-__ F1000 |
下刀多深,根据零件需要 |
|
#1=6.; |
赋值 每次刀具移动量为6mm |
|
N10 G01 X#1 Y0 F1000; |
刀具移动到(6,0)的位置 |
|
G02 X#1 Y0 I-#1 J0 F2000; |
刀具在(6,0)的位置走一个顺时针整圆 |
|
#1=#1+6; |
每次往外移动6 mm |
|
IF[#1LE43]GOTO10; |
条件转换,假如#1比43,条件满足跳转到第N10这段,条件不满足往下走 |
|
G01Y-30.; |
切线出去,要是上面走G03,这里就要用Y10了 |
|
G00 Z50.; |
抬刀 |
|
G00 X100. Y100.; |
退刀 |
|
M05; |
主轴停止 |
|
M30; |
程序结束 |
练习:试着编半圆和3/4圆
举例2:类似阿基米德螺旋线 刀具Φ8 所以步距取3mm和6mm
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X0 Y0; |
位置定位 |
|
Z2.; |
安全高度,二次验刀 |
|
G01 Z-__ F1000 |
下刀多深,根据零件需要 |
|
#1=3 #2=6.; |
赋值 每次刀具移动量为3和6mm |
|
N10 G03 X-#2 Y0 R#1 F2000; |
刀具走半径为3的半圆到(-6,0)的位置 |
|
G03 X#2 Y0 R#2; |
刀具走半径为6的半圆到(6,0)的位置 上下两个半圆错开 |
|
#1=#1+6 #2=#2+6 |
每次往外移动6 mm,每次加#2的值,要是#1 #2 取4和8 这里就加8 |
|
IF[#1LE43]GOTO10; |
条件转换,假如#1比43,条件满足跳转到第N10这段,条件不满足往下走 |
|
G00 Z50.; |
抬刀 |
|
G00 X100. Y100.; |
退刀 |
|
M05; |
主轴停止 |
|
M30; |
程序结束 |
举例3:深度方向和平面2次跳转铣圆 刀具Φ8 所以步距取6mm 材料Φ80 铣深10mm
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X0 Y0; |
位置定位 |
|
Z2.; |
安全高度,二次验刀 |
|
#1=0; |
赋值 深度方向开始位置为Z0 |
|
N10 #1=#1+2; |
深度方向每次递增2mm |
|
G01 Z-#1 F1000; |
Z方向第一次切深到-2的位置 |
|
#2=6; |
赋值 平面内每次移动量为6mm |
|
N20 G01 X#2 Y0 F2000; |
刀具移动到(6,0)的位置 |
|
G02 X#2 Y0 I-#2 J0; |
在(6,0)的位置走一个半径为6的整园 |
|
#2=#2+6; |
刀具每次往外移动6mm |
|
IF[#2LE43]GOTO20; |
条件转换#2小于等于43,条件满足跳转到第N20这段,条件不满足往下走 |
|
G00 G91 Z1.; |
增量方式快速往上抬1mm |
|
G90 X0 Y0; |
绝对方式快速运动到(0,0) |
|
IF[#1LE10]GOTO10; |
条件转换#1小于等于10,条件满足跳转到第N10这段,条件不满足往下走 |
|
G00 Z50.; |
抬刀 |
|
M05; |
主轴停止 |
|
M30; |
程序结束 |
练习:试着变换思路,用2次跳转编一个整圆铣平面的宏程序。
举例4:深度方向和平面2次跳转铣矩形 刀具Φ8 所以步距取6mm 材料160 X 96 铣深10mm
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X0 Y0; |
位置定位 |
|
#4=2.; |
深度方向赋值 |
|
N10 #1=6.; |
长度方向移动量 |
|
#3=#1 |
此处赋值#3就等于#1 |
|
N20 #2=48/80*[#1] |
长度是80宽度是48 宽度与长度之比48/80 #1代表长度 那么#2就等于宽度 |
|
G01 Z-#4 F1000; |
Z方向第一次到-2的位置 |
|
X#1 Y#2; |
往矩形的右上角一个点进刀 |
|
X-#1; |
往左上角第二个点 |
|
Y-#2; |
往右下角第三个点 |
|
X#1; |
往右下角第四个点 |
|
Y#2; |
往右上角第四个点 |
|
#1=#1+#3; |
深度宽度方向每次移动6mm 宽度方向#2 会根据#1的变化会自动变化 |
|
IF[#1LE80]GOTO20; |
条件转换#1小于等于80,条件满足跳转到第N20这段,条件不满足往下走 |
|
G00 G91 Z1.; |
增量方式快速往上抬1mm |
|
G90 X0 Y0; |
绝对方式快速运动到(0,0) |
|
#4=#4+2; |
深度方向每次增量2mm |
|
IF[#4LE10]GOTO10; |
条件转换#4小于等于10,条件满足跳转到第N10这段,条件不满足往下走 |
|
G00 Z50.; |
抬刀到50 |
|
X100. Y100.; |
退刀 |
|
M05; |
主轴停止 |
|
M30; |
程序结束 |
练习:试着变换思路,用类似螺旋线原理走一个平面内的矩形宏程序
举例5:简单椭圆 长轴80 短轴48 刀具Φ8 mm
椭圆上任意一点的坐标(X,Y) 长半轴=a 短半轴=b 角度α
X = a * COS [ α ] Y= b * SIN [ α ]
常用三角函数 SIN 0。=0 SIN 90。=1 COS 0。=1 COS 90。=0 SIN 30。=0.5 COS 60。=0.5
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X-50 Y15; |
位置定位 |
|
G00 Z2.; |
安全高度,二次验刀 |
|
G01 Z-___F1000; |
根据零件需要 |
|
G42 G01 X40. Y-5. D01 F1500; |
往(40,-5)的位置加刀补 刀具半径补偿量为4.0mm |
|
G01 Y0; |
切入 |
|
#1=0; |
赋值 起始角度为0度 |
|
#2=40; |
赋值 #2等于长轴的一半 就是长半轴 |
|
#3=24; |
赋值 #3等于短轴的一半 就是短半轴 |
|
N10 #4=#2*COS[#1]; |
计算X坐标 因为#1初始为0 所以 #4=#2*1=40 |
|
#5=#3*SIN[#1]; |
计算Y坐标 因为#1初始为0 所以 #5=#3*0=0 |
|
G01 X#4 Y#5 F8000; |
刀具往(X,Y)直线逼近拟合 第一点就是(40,0) |
|
#1=#1+1; |
角度每次增量,因为椭圆是用直线拟合所以精度取决于角度增量。 |
|
IF[#1LE360]GOTO10; |
条件转换#1小于等于360,条件满足跳转到第N10这段,条件不满足往下走 |
|
G01 Y5. F1500; |
切出 |
|
G40 G01 X50. Y15.; |
取消角度 |
|
G00 Z20.; |
抬刀 |
|
M05; |
主轴停止 |
|
M30; |
程序停止 |
练习:1、试着改变思路,编一个长轴与X轴成30度的斜椭圆。
2、结合西门子SCALE比例系数,来编一个椭圆。
举例6:方变方 高度30 上表面正方形边长12 下表面正方形周长20 刀具Φ8 mm
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X45. Y45.; |
位置定位 |
|
G00 Z2.; |
安全高度,二次验刀 |
|
G01 Z0 F1000; |
切削进给到z0的位置 |
|
#1=0.15 #2=0.04 #3=12 #4=12 #5=0 |
赋值 #1是深度 #2是 x y方向的移动量 #3 #4 是x y初始值 |
|
N10 G01 Z-#5 F1000; |
切削进给到–#5的位置 就是z0的位置 |
|
G41 G01 X#3 Y#4+5 D01; |
加刀补到(12,17)的位置 此时的Y#4+5是随着#4的变化而变化 |
|
Y-#4; |
到正方形的右下角 |
|
X-#3; |
到正方形的左下角 |
|
Y#4; |
到正方形的左上角 |
|
X#3+5; |
切出 |
|
G40 G01 X45. Y45.; |
取消刀补 |
|
#5=#5+#1 |
运算 深度方向从0 每次增量0.15个 |
|
#3=#3+#2 #4=#4+#2 |
运算 x y方向每次往外移动0.04个 |
|
IF[#5LE30]GOTO10.; |
条件转换 要是深度小于30 条件满足往N10跳 不满足继续往下走 |
|
G00 Z100.; |
抬刀 |
|
G00 X100. Y100.; |
退刀 |
|
M05; |
主轴停止 |
|
M30; |
程序结束 |
举例7:圆环阵列打孔 R80的圆上隔30度打孔 起始角为0度,钻头Φ8 mm
解一 角度变化钻孔
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X100. Y20.; |
位置定位 |
|
#1=0 |
赋值 起始角度为0度 |
|
N10 #2=80*COS[#1]; |
计算孔的X坐标 |
|
#3=80*SIN[#1]; |
计算孔的Y坐标 |
|
G99 G81 X#2 Y#3 R5. Z-10.F50; |
G81点钻 返回到安全高度 钻深10mm |
|
#1=#1+30; |
运算 角度增量 每次增加30度 根据图纸来定 |
|
IF[#1LE331]GOTO10; |
假如#1小于等于331时返回N10 这里不能写361 最后一个孔在330 |
|
G00 Z100.; |
抬刀 |
|
M05; |
主轴停止 |
|
M30; |
程序停止 |
解二 孔数变化钻孔
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X100. Y20.; |
位置定位 |
|
#1=1 |
赋值 起始孔数为1 |
|
N10 #2=80*COS[[#1-1]*30]; |
计算孔的X坐标 |
|
#3=80*SIN[[#1-1]*30]; |
计算孔的Y坐标 |
|
G99 G81 X#2 Y#3 R5. Z-10.F50; |
G81点钻 返回到安全高度5mm 钻深10mm |
|
#1=#1+2; |
运算 孔数增加 这里不是加1 因为#2里面要用#1-1 所以用2递增 |
|
IF[#1LE12]GOTO10; |
假如#1小于等于12时返回N10 这里是孔数增加 直到钻满12个 |
|
G00 Z100.; |
抬刀 |
|
M05; |
主轴停止 |
|
M30; |
程序停止 |
例8:在R80的圆周上阵列钻空并且半径依次递减20再次阵列打孔,其他参数同举例7。
|
T0101 G54 G90 G17 G40; |
定义参数 |
|
M03 S1500; |
定义主轴 |
|
G00 Z20.; |
高度定位 |
|
G00 X100. Y20.; |
位置定位 |
|
#1=0 |
赋值 起始角度为0度 |
|
#2=80 |
起始半径为80 |
|
N10 #3=#2*COS[#1]; |
计算孔的X坐标 |
|
#4=#2*SIN[#1]; |
计算孔的Y坐标 |
|
G99 G81 X#3 Y#4 Z-10. R5. F50; |
G81点钻 钻深10 安全高度5mm |
|
#1=#1+30 |
运算 角度每次增量30度 |
|
IF[#1LE331]GOTO10; |
条件转移 #1小于等于331 条件满足返回N10 不满足继续往下走 |
|
#2=#2-20 |
半径以20递减 此时在60的地方 |
|
IF[#2EQ60]GOTO10; |
条件转移 #2等于60 条件满足返回N10 不满足继续往下走 |
|
G00 Z100.; |
抬刀 |
|
G00 X100.Y100.; |
退刀 |
|
M05; |
主轴停止 |
|
M30; |
程序停止 |
练习:试着用孔数的变化来编宏程序