看了一下gcl用户提供的程序,谈点自己的看法:
1.该程序不是测螺纹中径的,是想通过移动螺距来提高测量螺纹孔位置精度的;
2.approach (cos (A*I),sin (A*I),0)语句是测量一个3维台肩的采样和补偿方向的.
Z的方向余弦为0,表示该补偿方向为2维.不过,对于孔测量时采点是不需要给定补偿方向的,也就是说该语句测孔时可以不要;
3.现将我为WTUTOR做的子功能库中的一个测螺纹孔的子程序打印如下,可参考一下编程格式.
procedure WALK (string YN[1];real TL;integer PTN,MM;real FF)
!%par1 dyicon c:\wtutor\dq\WALK.bmp
!%par1 dy 这是一个自由确定测量点数的CNC测螺纹孔坐标程序:
!%par1 prompt 右旋螺纹吗?《Y/N》
!%par2 dyicon c:\wtutor\dq\WALK.bmp
!%par2 dy 这是一个自由确定测量点数的CNC测螺纹孔坐标程序:
!%par2 prompt 请输入螺距<t>?
!%par3 dyicon c:\wtutor\dq\WALK.bmp
!%par3 dy 这是一个自由确定测量点数的CNC测螺纹孔坐标程序:
!%par3 prompt 请输入测量点数<PTN> ?
!%par4 dyicon c:\wtutor\dq\WALK.bmp
!%par4 dy 这是一个自由确定测量点数的CNC测螺纹孔坐标程序:
!%par4 prompt 请输入存储单元号?
!%par5 dyicon c:\wtutor\dq\WALK.bmp
!%par5 dy 这是一个自由确定测量点数的CNC测螺纹孔坐标程序:
!%par5 prompt 请输入测量精度(指圆度)控置范围<mm> ?
real XC,YC,ZC,C1,C2,TL1,PTN1,DM
coord XYZ,CW
element EW
integer PLXYZ,HEAD,TIP,BL,MODE=0,NN=0
dy icon "c:\wtutor\dq\WALK.bmp"
mspeed 100
no_approach
HEAD=info_func (2)
TIP=info_func (3)
probe (HEAD,TIP)
PLXYZ=info_func (8)
BL=info_func (7)
TL1=TL/PTN
PTN1=360/PTN
dy ("")
dy ("")
dy ("PROBE( ",HEAD,", ",TIP,")")
dy ("")
if PLXYZ eq 3 then
dy ("=== XY ===")
end_if
if PLXYZ eq 1 then
dy ("=== YZ ===")
end_if
if PLXYZ eq 2 then
dy ("=== ZX ===")
end_if
dy ("")
dy ("")
dy ("")
dy ("")
delay (40)
for I=0 to 99 by 1
dist_approach 6.,12.
manmove
ncmove
dist_approach 1.,100.
get_position (XYZ)
XC=XYZ|x
YC=XYZ|y
ZC=XYZ|z
nody
noprn
move (X=XC,Y=YC,Z=ZC)
cycle_circle (WM1,3,x=XC,y=YC,z=ZC,dm=0.5,.0,360.)
CW=WM1
EW=WM1
REP:
NN=NN+1
decrblk
mcir (MEMO[MM+I],PTN)
for K=0 to PTN-1 by 1
C1=0.5*cos (K*PTN1)
C2=0.5*sin (K*PTN1)
if PLXYZ eq 3 then
if (YN eq "Y") or (YN eq "y") then
move (X=CW|x,Y=CW|y,Z=ZC+TL1*K)
movetf (X=CW|x+C1,Y=CW|y+C2,Z=ZC+TL1*K)
move (X=CW|x,Y=CW|y,Z=ZC+TL1*K)
else
move (X=CW|x,Y=CW|y,Z=ZC-TL1*K)
movetf (X=CW|x+C1,Y=CW|y+C2,Z=ZC-TL1*K)
move (X=CW|x,Y=CW|y,Z=ZC-TL1*K)
end_if
end_if
if PLXYZ eq 1 then
if (YN eq "Y") or (YN eq "y") then
move (X=CW|x+TL1*K,Y=CW|y,Z=CW|z)
movetf (X=CW|x+TL1*K,Y=CW|y+C1,Z=CW|z+C2)
move (X=CW|x+TL1*K,Y=CW|y,Z=CW|z)
else
move (X=CW|x-TL1*K,Y=CW|y,Z=CW|z)
movetf (X=CW|x-TL1*K,Y=CW|y+C1,Z=CW|z+C2)
move (X=CW|x-TL1*K,Y=CW|y,Z=CW|z)
end_if
end_if
if PLXYZ eq 2 then
if (YN eq "Y") or (YN eq "y") then
move (X=CW|x,Y=CW|y+TL1*K,Z=CW|z)
movetf (X=CW|x+C2,Y=CW|y+TL1*K,Z=CW|z+C1)
move (X=CW|x,Y=CW|y+TL1*K,Z=CW|z)
else
move (X=CW|x,Y=CW|y-TL1*K,Z=CW|z)
movetf (X=CW|x+C2,Y=CW|y-TL1*K,Z=CW|z+C1)
move (X=CW|x,Y=CW|y-TL1*K,Z=CW|z)
end_if
end_if
end_for
CW=WM1
EW=WM1
if (EW|f le FF) or (NN eq 3) then
dy
prn
output MEMO[MM+I]
NN=0
else
jump REP
end_if
end_for
end_procedure