社区活动 技术论坛 [应用和编程技巧讲台]即将开通了!
[应用和编程技巧讲台]即将开通了!
2004-11-14 21:21 138 0 25
该栏目11月15日决定正式开通,欢迎大家积极参与。我先发表一个“傻瓜”式小程序段【NCHOLE】,作为开张吧!该程序用于半自动测孔,是对TUTOR功能的一种补充。为了考虑新手的学习,我将它编成即是一个独立的测量程序,又是一个子程序,会哪种应用方式都行。大家可以试一下。首次运行要注意安全! 程序没有任何参数询问,但程序运行之前要在测量页面上选择好投影平面“XY/YZ/ZX”,然后,将测头移动到孔的大致中心位置即可执行CNC方式了。里面有哪些编程技巧,请大家分析一下。源程序附后: program NSD[WM1,WM2] element_array MEMO[300] NCHO4 endstat procedure NCHO4 real C1,C2 real XC,YC,ZC,SA=0,EA=360 coord XYZ integer PLXYZ,HEAD,TIP,BL ! dy icon "c:\wtutor\dq\k00.bmp" dy ("") dy ("") dy ("") dy ("") dy ("") dy ("") dy ("") dy ("NC / HOLE<4> PROGRAM") dy ("") fly (off) mspeed 100 no_approach HEAD=info_func (2) TIP=info_func (3) probe (HEAD,TIP) dy ("") dy ("PROBE( ",HEAD,", ",TIP,")") dy ("") BL=info_func (7) PLXYZ=info_func (8) 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 ("") delay (40) for I=1 to 100 by 1 dist_approach 6.,12. manmove ncmove dist_approach 1.,100. get_position (XYZ) XC=XYZ|x YC=XYZ|y ZC=XYZ|z mcir (MEMO[BL+I],4) savepts for K=0 to 3 by 1 move (X=XC,Y=YC,Z=ZC) C1=0.5*cos (K*90) C2=0.5*sin (K*90) if PLXYZ eq 3 then movetf (X=XC+C1,Y=YC+C2,Z=ZC) end_if if PLXYZ eq 1 then movetf (X=XC,Y=YC+C1,Z=ZC+C2) end_if if PLXYZ eq 2 then movetf (X=XC+C2,Y=YC,Z=ZC+C1) end_if end_for move (X=XC,Y=YC,Z=ZC) end_for end_procedure end_program
我要回复

登陆后才能评论

登录
所有回贴(25)
这么好的栏目怎么没人继续下去了,我来顶顶,希望各位朋友能继续讨论,使我们这些初学者能入门。
2005-11-15 08:36
回复
取消
提交
我上面的那个《MIRCLE》程序其实就是测圆直径和查看圆度图形的,没有其它的功能。 由于我们车间的200多台加工中心已经用了10几年了,丝杆磨损厉害,用球感仪检测很好,但是一有负载就原形必露,这样用加工中心铣个直径200的圆,从圆度图形就可以看出机床丝杆的磨损状况,当然《MIRCLE》也可以测量其它仪器不容易测量的极大极小圆或圆柱的内径和外径。 何必呢 何苦呢...
2004-11-24 23:25
回复
取消
提交
2004-11-24 21:19
回复
取消
提交
我自己看了斑竹的NCHOLE程序,确实构思巧妙,特别是它可以在多个坐标平面内进行测量的功能.其中"dist_approach 1.,100."指令我也是第一次看到,相信对我以后的编程有很大的帮助. 根据我们车间经常测量夹具体底板的实际情况,我也曾编过一个类似的小程序,发出来给大家斧正,不完善的地方有兴趣的朋友给修一下.夹具底板为平面非固定孔系,要求高,位置度多0.03以下,已经到了三坐标精度的极限,因此去除手动误差成了我的首要选择,但是又因为每个夹具体又不一样,所以也要考虑程序的通用性. 程序开始要输入所测量孔的个数,并且所有孔都要先手动量一下,我也曾试过"傻瓜"方式,当遇到大直径小厚度的(例:R=100,H=3)孔时,发现不容易将测头放到适当的高度. 优点:无手动测量误差,在XY平面内测量通用性强,当2个建坐标基准孔与图纸基准不重合时,能自动将实际与理论的长度误差按各基准孔到原点的距离成比例分配,不会将误差积累到一个基准孔上. 缺点:要先输入待测孔的个数,按比例分配部分程序没找到合适的方程来解决,只好用穷举法了,所以这部分程序多,造成程序可读性差. program PMZB[WM1,WM2] element_array MEMORY[100] coord ce,cx,cp,c1,c2 element ex,e1,e2 integer e,n,lx,st real xske,yske,xpre,ypre real dmx,xcor,ycor real xs1,xs2,ys1,ys2,xs,ys,czx,czy real ccx,ccy metric_mode dms_angle set_dim (dm=whole,a=full,arel=acute,amode=a360) dy ! DATI out_format (10,4) refsys 0 selpl x noprn manmove probe (1,1) format (plane,f) dy (" 请输入待测孔的个数 ") read (N) dy (" 请测量基准面 ") mpl (MEMORY[1],4) skew1 (MEMORY[1],1,0) format (circle,x,y,dm,f) E=1 loop E=E+1 if (E eq 2) then dy (" 请测量第一基准圆 !!! ") elsif (E eq 3) then dy (" 请测量第二基准圆 !!! ") else dy (" 请测量其它圆 !!! ") end_if mcir (MEMORY[E],4) exif (E eq (N+1)) end_loop ! 用手动测量的圆建立坐标系 REF ! loop dy (" 请选择基准圆分布类型 ") dy (" 第一基准圆在坐标原点,第二基准圆在轴线上. 请输入 [1] ") dy (" 第一基准圆在坐标原点,第二基准圆随机分布. 请输入 [2] ") dy (" 第一基准圆和第二基准圆都随机分布. 请输入 [3] ") read (LX) exif (LX eq 1) or (LX eq 2) or (LX eq 3) end_loop if (LX eq 2) then dy (" 请输入 (X) 旋转座标值 ") read (XSKE) dy (" 请输入 (Y) 旋转座标值 ") read (YSKE) iskew (ofs,XSKE,YSKE,z,2,1) elsif (LX eq 3) then dy (" 请输入 (X) 旋转座标矢量和 ") read (XSKE) dy (" 请输入 (Y) 旋转座标矢量和 ") read (YSKE) iskew (ofs,XSKE,YSKE,z,2,1) dy (" 请输入第一基准圆 (X) 座标值 ") read (XPRE) dy (" 请输入第一基准圆 (Y) 座标值 ") read (YPRE) preset (MEMORY[n+2],X=XPRE,Y=YPRE,2,2) end_if ! ncmove fly (on) mspeed 70 get_position (CE) move (X=0,Y=0,Z=CE|z) E=1 loop exif (E eq (N+1)) E=E+1 EX=MEMORY[E] CX=EX ST=E KONG if (E eq 3) then ! 用自动测量的圆建立坐标系 REF if (LX eq 2) then iskew (ofs,XSKE,YSKE,z,2,1) elsif (LX eq 3) then iskew (ofs,XSKE,YSKE,z,2,1) e1=memory[n+3] c1=e1 xs1=c1|x ys1=c1|y preset (MEMORY[n+2],X=XPRE,Y=YPRE,2,2) !将差值按各基准孔距理论中心大小成比例分配 !采集两个基准孔数据 e2=memory[n+3] c2=e2 xs2=c2|x ys2=c2|y !将数据进行分析并计算差值分配比例 czx=abs(xs1)-abs(xske) czy=abs(ys1)-abs(yske) xs=xpre*xs2 ys=ypre*ys2 if xs gt 0 then if xpre gt 0 then if czx gt 0 then ccx=abs(xpre/(xske+xpre)*czx) elsif czx lt 0 then ccx=-abs(xpre/(xske+xpre)*czx) end_if elsif xpre lt 0 then if czx gt 0 then ccx=-abs(xpre/(xske+xpre)*czx) elsif czx lt 0 then ccx=abs(xpre/(xske+xpre)*czx) end_if end_if elsif xs lt 0 then if xpre gt 0 then if czx gt 0 then ccx=abs(xpre/xske*czx) elsif czx lt 0 then ccx=-abs(xpre/xske*czx) end_if elsif xpre lt 0 then if czx gt 0 then ccx=-abs(xpre/xske*czx) elsif czx lt 0 then ccx=abs(xpre/xske*czx) end_if end_if end_if if ys gt 0 then if ypre gt 0 then if czy gt 0 then ccy=abs(ypre/(yske+ypre)*czy) elsif czy lt 0 then ccy=-abs(ypre/(yske+ypre)*czy) end_if elsif ypre lt 0 then if czy gt 0 then ccy=-abs(ypre/(yske+ypre)*czy) elsif czy lt 0 then ccy=abs(ypre/(yske+ypre)*czy) end_if end_if elsif ys lt 0 then if ypre gt 0 then if czy gt 0 then ccy=abs(ypre/yske*czy) elsif czy lt 0 then ccy=-abs(ypre/yske*czy) end_if elsif ypre lt 0 then if czy gt 0 then ccy=-abs(ypre/yske*czy) elsif czy lt 0 then ccy=abs(ypre/yske*czy) end_if end_if end_if preset (MEMORY[n+2],x=xpre+ccx,y=ypre+ccy,2,2) end_if end_if E=ST end_loop for I=1 to N+1 by 1 prn output MEMORY[I] end_for noprn refsys 0 move (Z=-50) endstat procedure REF proj (MEMORY[n+2],MEMORY[1],MEMORY[2]) proj (MEMORY[n+3],MEMORY[1],MEMORY[3]) iline (MEMORY[n+4],2,MEMORY[n+2]) skew1 (MEMORY[1],1,0) skew2 (MEMORY[n+4],1,1,z) preset (MEMORY[1],z=0,1,1) preset (MEMORY[n+2],x=0,y=0,1,1) end_procedure ! procedure KONG move (X=CX|x,Y=CX|y) move (Z=CX|z) format (circle,x,y,dm,f) mcir (MEMORY[E],6) for I=1 to 6 by 1 CP={CX|x+EX|dm/2*cos (60*I),CX|y+EX|dm/2*sin (60*I),CX|z} movetf (CP) end_for move (Z=CE|z) end_procedure ! procedure DATI integer TIH real TI,DA,TIM1,TIM,TIS1,TIS,TIH1 string ED[10],EM[10],ES[10] out_format (6,2) DA=date TI=time !时 TIH1=trunc (TI/100) TIH=round (TIH1) !分 TIM1=(TI/100) TIM=(TIM1-trunc (TIM1)) !秒 TIS1=trunc (TI) TIS=(TI-TIS1) out_format (4,2) if encode(ED,DA) and encode(EM,TIM) and encode(ES,TIS) then prn (" *************** Measure: ZHOU ********") prn ("Date = ","200",ED[1],"-",ED[2],ED[3],"-",ED[5],ED[6]) prn ("Time = ",TIH,":",EM[3],EM[4],":",ES[3],ES[4]) prn (" ") end_if noprn end_procedure end_program 何必呢 何苦呢...
2004-11-20 23:49
回复
取消
提交
zyj:你的程序刚刚看到,我就希望更多的用户能向你一样拿出自己的一些小成果,供大家鉴赏,只有这样才能相互都提高.谢谢你的支持! 程序我简单看了一下,提点修改意见可能更好. 1.手动先测一遍,可改成内孔为"傻瓜"式,不做任何测量;外孔仅测3点; 2.辅助测量的元素可存储在别的存储器中,只把孔或柱的测量结果存储在MEMORY存储器中,使人看起来不乱; 3.建议不要在该程序中用REF0指令,它清出已建的坐标系,不能因为一执行该程序,原找正就没有了.
2004-11-19 21:51
回复
取消
提交
下面是NCHOLE程序中的一段语句,这是读取测头当前坐标的应用,其原理可用于各种测量系统。在测量机操作和编程的培训中,我都做过讲解,并且在意大利DEA我也曾向其软件开发部门的工程师介绍过,他们认为这确实是一个编程技巧。语句不多,程序运行安全多了。比如,手动进行一个面两个孔找正后,测头忘了移出到孔外,便执行CNC测量了,这样也不会出现碰撞。等等情况…… 现在我将介绍如何实现锁定两轴,单轴运动: 该程序允许测头在测量空间任何点执行上述功能(只要不超程)。 其中: XYZ:系统读取的测头当前坐标 abc:移动轴选择变量(X轴/Y轴/Z轴); LL:移动轴移至到定位点的坐标分量。 ncmove get_position (XYZ) XC=XYZ|x YC=XYZ|y ZC=XYZ|z if (abc eq “X”) or (abc eq “x”) then move (X=LL,Y=YC,Z=ZC) elsif (abc eq “Y”) or (abc eq “y”) then move (X=XC,Y=LL,Z=ZC) elsif (abc eq “Z”) or (abc eq “z”) then move (X=XC,Y=YC,Z= LL ) end_if
2004-11-19 20:49
回复
取消
提交
测规则圆的小程序,可以测平面圆和圆柱型的圆. 优点:外圆内圆都行,不会因圆的倾斜测成椭圆,可选测量点数,测量结束后可以查看所测圆的图形. 缺点:手要动动,必须先大概测量1遍. program MCIRCL[WM1,WM2] element_array MEMORY[300] coord c1,c2,c3,c4,c5 string ask1[1],ASK2[1],type[10] element e1,e2,e3 integer num,spe real ddm,zzh,zzh1,zzh2 real dst dms_angle metric_mode set_dim (dm=whole,a=full,arel=acute,amode=a360) dy noprn ref0 probe(1,1) format(circle,dm,f) loop dy ("本程序用于测量规则圆的直径") dy ("请选择要测量圆的类型,平面圆(N)或圆柱(C)") read (ASK1) exif (ASK1 eq "N") or (ASK1 eq "n") or (ASK1 eq "C") or (ASK1 eq "c") end_loop !!! loop dy ("请选择要测量圆的类型,内径(I)或外径(O)") read (ASK2) exif (ASK2 eq "I") or (ASK2 eq "i") or (ASK2 eq "O") or (ASK2 eq "o") end_loop !!! aaa: dy ("请输入自动测量点数,(6.7.8.9...)") read (NUM) if num lt 6 then dy("测量点数必须大于或等于 <6> !!!") jump aaa end_if !!! dy ("请输入自动测量速度,(1.2.3...100)") dy ("建议自动测量速度为 <30> !") read (spe) !!! if (ask1 eq "N") or (ask1 eq "n") then type="circle" manmove dy(" ") dy("请测量基准面!!! ") dy(" ") dy(" ") mpl(memory[1],4) skew1 (MEMORY[1],1,0) refsys 1 dy("请测量待测孔") mcir(memory[2],4) proj (MEMORY[3],MEMORY[1],MEMORY[2]) skew1 (MEMORY[1],1,0) preset (MEMORY[3],X=0,Y=0,Z=0,1,1) ncmove dys fly(on) dist_approach 6. mspeed spe get_position (c1) e1=memory[2] c2=e1 zzh=c2|z ddm=e1|dm if (ask2 eq "i")or(ask2 eq "I") THEN !测量圆的类型,内径 move(x=0,y=0,z=50) dapp move(z=zzh) mcir(memory[5],num) for I=1 to num by 1 c5={ddm/2*cos(360/num*i),ddm/2*sin(360/num*i),zzh} movetf (c5) end_for elsif (ask2 eq "o")or(ask2 eq "O") then !测量圆的类型,外径 dapp move(x=0,y=0,z=50) dsta dist_approach dst c5={(ddm/2+dst)*cos(360/num),(ddm/2+dst)*sin(360/num),50} move(c5) move(z=zzh) mcir(memory[5],num) for I=1 to num by 1 c4={(ddm/2+dst)*cos(360/num*i),(ddm/2+dst)*sin(360/num*i),zzh} c5={ddm/2*cos(360/num*i),ddm/2*sin(360/num*i),zzh} move (c4) movetf (c5) end_for end_if move(z=50) !选择要测量圆的类型,圆柱 elsif (ask1 eq "c") or (ask1 eq "C") then type="cylinder" manmove dy("请测量待测圆(上下两个截面)") mcir(memory[1],4) mcir(memory[2],4) iline(memory[3],2,memory[1]) skew1 (MEMORY[3],1,0) refsys 1 preset (MEMORY[1],X=0,Y=0,Z=0,1,1) ncmove dys fly(on) dist_approach 6. mspeed spe get_position (c1) e1=memory[1] c1=e1 e2=memory[2] c2=e2 zzh1=c1|z zzh2=c2|z ddm=e1|dm format (cylind,cx=meas,cy=meas,cz=meas,dm=meas,f=meas) !选择要测量圆柱类型,内圆柱 if (ask2 eq "i")or(ask2 eq "I") THEN move(x=0,y=0,z=50) mcyl(memory[4],12) move(z=zzh1) for i=1 to 6 by 1 C2={ddm/2*cos (60*i),ddm/2*sin (60*i),zzh1} movetf (C2) end_for move(x=0,y=0,z=zzh2) for i=1 to 6 by 1 C3={ddm/2*cos (60*i),ddm/2*sin (60*i),zzh2} movetf (C3) end_for skew1 (MEMORY[4],2,1) refsys 2 dapp move(x=0,y=0) move(z=zzh1) mcir(memory[5],num) for I=1 to num by 1 c5={ddm/2*cos(360/num*i),ddm/2*sin(360/num*i),zzh1} movetf (c5) end_for !选择要测量圆柱类型,外圆柱 elsif (ask2 eq "o")or(ask2 eq "O") then dsta dist_approach dst dapp move(x=0,y=0,z=50) mcyl(memory[4],12) c5={(ddm/2+dst)*cos(60),(ddm/2+dst)*sin(60),50} move(c5) move(z=zzh1) for i=1 to 6 by 1 C1={(ddm/2+dst)*cos (60*i),(ddm/2+dst)*sin (60*i),zzh1} C2={ddm/2*cos (60*i),ddm/2*sin (60*i),zzh1} move (c1) movetf (C2) end_for move(z=zzh2) for i=1 to 6 by 1 C3={(ddm/2+dst)*cos (60*(i-1)),(ddm/2+dst)*sin (60*(i-1)),zzh2} C4={ddm/2*cos (60*(i-1)),ddm/2*sin (60*(i-1)),zzh2} move (c3) movetf (C4) end_for skew1 (MEMORY[4],2,1) move(z=50) refsys 2 c5={(ddm/2+dst)*cos(360/num),(ddm/2+dst)*sin(360/num),50} move(c5) move(z=zzh1) mcir(memory[5],num) for I=1 to num by 1 c4={(ddm/2+dst)*cos(360/num*i),(ddm/2+dst)*sin(360/num*i),zzh1} c5={ddm/2*cos(360/num*i),ddm/2*sin(360/num*i),zzh1} move (c4) movetf (c5) end_for end_if end_if ncmove refsys 0 move(z=0) refsys 1 dy(" ") dy(" ") dy("测量结束,如果需要查看圆度图形请回 界面!") dy(" ") dy(" ") dist_approach 6. prn prn(" ") prn("___________________Diameter measuring___________________") prn("Measuring type :",type) prn("Measuring speed :",spe) prn("Number of measurement :",num) dati output memory[5] prn("__________________________end___________________________") noprn endstat procedure dys dy(" ") dy(" ") dy(" 正在进行测量,请等待.... ") dy(" 正在进行测量,请等待.... ") dy(" 正在进行测量,请等待.... ") dy(" 正在进行测量,请等待.... ") dy(" ") dy(" ") dy(" ") end_procedure procedure dsta if ddm lt 10 then dst=6 elsif ddm lt 20 then dst=8 elsif ddm lt 40 then dst=10 elsif ddm lt 60 then dst=12 end_if dst=14 end_procedure ! procedure dapp if (ask2 eq "O")or (ask2 eq "o") THEN if num lt 9 then if ddm lt 20 then dist_approach 10. elsif ddm lt 50 then dist_approach 13. end_if dist_approach 16. ! elsif num lt 18 then if ddm lt 20 then dist_approach 6. elsif ddm lt 50 then dist_approach 10. end_if dist_approach 14. end_if end_if ! dist_approach 5. end_procedure ! procedure DATI integer TIH real TI,DA,TIM1,TIM,TIS1,TIS,TIH1 string ED[10],EM[10],ES[10] out_format (6,2) DA=date TI=time !时 TIH1=trunc (TI/100) TIH=round (TIH1) !分 TIM1=(TI/100) TIM=(TIM1-trunc (TIM1)) !秒 TIS1=trunc (TI) TIS=(TI-TIS1) out_format (4,2) if encode(ED,DA) and encode(EM,TIM) and encode(ES,TIS) then prn ("Date = ","200",ED[1],"-",ED[2],ED[3],"-",ED[5],ED[6]) prn (" Time = ",TIH,":",EM[3],EM[4],":",ES[3],ES[4]) end_if end_procedure end_program 何必呢 何苦呢...
2004-11-19 20:47
回复
取消
提交
你到前哨朗普去买吧。
2004-11-19 15:30
回复
取消
提交
引用“DIST_APPROCH指令两个参数的详细说明请你看版主参与编辑的资料。该书中对很多编程中的问题都有解答,还有很多编程技巧及应用。”请问版主,这是什么书呀?在哪里可以买到?对于单轴移动的问题我还是没能看得太明白,希望您能多多指教。
2004-11-19 11:56
回复
取消
提交
版主晚上好! 听到很多PC-dims测量员反映圆锥测量的问题。也请您讲讲测量基本元素中应该注意的问题好吗? 还有测量基本元素时的一些技巧。
2004-11-18 22:20
回复
取消
提交
在线咨询
关注我们

海克斯康制造智能

电话咨询
400-6580-400

热线电话(工作时间8:30-17:30)

关注我们 电话咨询 在线咨询

海克斯康制造智能