社区活动 技术论坛 [应用和编程技巧讲台]即将开通了!
[应用和编程技巧讲台]即将开通了!
2004-11-14 21:21 140 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)
zyj:你的程序刚刚看到,我就希望更多的用户能向你一样拿出自己的一些小成果,供大家鉴赏,只有这样才能相互都提高.谢谢你的支持! 程序我简单看了一下,提点修改意见可能更好. 1.手动先测一遍,可改成内孔为"傻瓜"式,不做任何测量;外孔仅测3点; 2.辅助测量的元素可存储在别的存储器中,只把孔或柱的测量结果存储在MEMORY存储器中,使人看起来不乱; 3.建议不要在该程序中用REF0指令,它清出已建的坐标系,不能因为一执行该程序,原找正就没有了.
2004-11-19 21:51
回复
取消
提交
我自己看了斑竹的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
回复
取消
提交
2004-11-24 21:19
回复
取消
提交
我上面的那个《MIRCLE》程序其实就是测圆直径和查看圆度图形的,没有其它的功能。 由于我们车间的200多台加工中心已经用了10几年了,丝杆磨损厉害,用球感仪检测很好,但是一有负载就原形必露,这样用加工中心铣个直径200的圆,从圆度图形就可以看出机床丝杆的磨损状况,当然《MIRCLE》也可以测量其它仪器不容易测量的极大极小圆或圆柱的内径和外径。 何必呢 何苦呢...
2004-11-24 23:25
回复
取消
提交
这么好的栏目怎么没人继续下去了,我来顶顶,希望各位朋友能继续讨论,使我们这些初学者能入门。
2005-11-15 08:36
回复
取消
提交
在线咨询
关注我们

海克斯康制造智能

电话咨询
400-6580-400

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

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

海克斯康制造智能