社区活动 技术论坛 [应用和编程技巧讲台]即将开通了!
[应用和编程技巧讲台]即将开通了!
2004-11-14 21:21 141 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)
版主,您好。通过第二步程序的分析,我的疑问更多了。可能是由于我们软件版本的问题,我始终不太明 白您说的采样深度是什么意思,是指的所测孔的半径的变化范围吗?如果是的话,测量机怎么知道在0-100mm 这么大的范围内究竟在哪采点呢?我用的是TUTOR FOR WINDOWS 3.14,它的DIST_APPROCH指令后面只能加 一个参数,就是接近距离。而且我觉得想测得一个点坐标时,如果实际点和你预设点的坐标相差很多的话 肯定会报警的。所以在测量一个孔时,必须要知道两个必要的参数,就是中心坐标和孔的半径。在您的程序 中心坐标可以通过GET_POSITION(XYZ)获得,但是半径呢,您在54和55行用的0.5应该不是吧。下面我把我 第二步的想法说一下。 一:关于孔增加轴向键槽的问题,我同意上海那位朋友的看法,但具体的程序还要视槽具体的位置而定。 二:当点数任选时所加和要修改的程序代码如下 1、将第6行改为 real c1,c2,r,angle 增加两个变量分别用于存放半径和相邻点之间的圆心角。 在第6行后加integer num用来存想要测的点数 2、在第19行后加入 dy("请输入半径") read(r) dy("请输入点数") read(num) 3、在第51行后加入 angle=360/num num=num-1 最后将52-55改为 for K=0 to num by 1 move (X=XC,Y=YC,Z=ZC) C1=r*cos (K*angle) C2=r*sin (K*angle) 这样应该就可以了吧。 三:至于您说的采样深度大于100mm我想在输入半径时输入适当的半径值就可以了。
2004-11-18 11:42
回复
取消
提交
DIST_APPROCH指令两个参数的详细说明请你看版主参与编辑的资料。该书中对很多编程中的问题都有解答,还有很多编程技巧及应用。 另外,版主的NCH04程序是一个傻瓜测孔程序,如果人机对话太多了就违背了当初的编程目的。 如果被测的孔阵中键槽孔太多了,就必须修改程序。考虑到测量孔的点均布,可以编几个不同角度偏转测点的子程序,使能在零件程序中调用,就解决问题了。
2004-11-18 17:29
回复
取消
提交
祝贺[TUTOR应用和编程技巧讲台]的开通,虽然我没用过该软件, 但据我所知,使用此软件的单位很多,我单位民品公司的两台半自动坐标机,用的就是TUTOR,我们旁边的几个单位用的坐标机都是从前哨公司买的,也是用TUTOR软件.通过和他们的技术交流,发现QUINDOS和TUTOR有很多相似之处,希望和大家多讨论,特别是测量原理,方法,共同提高.
2004-11-18 17:53
回复
取消
提交
有个题外话。谁有TUTOR FOR WINDOWS3.3.3软件啊?呵呵,前哨卖的太贵了。 Edited by - houjinpu on 2004/11/18 18:01:52
2004-11-18 18:01
回复
取消
提交
1、谢谢刘彬版主的支持!QUINDOS软件系统的独道功能我早有所闻,遗憾的是我没有亲自操作过。我厂PMM-C测量机待明年上半年才能安装,到那时有些问题还得向您请教; 2、houjinpu关于第二步讨论的思路很好,程序理解的比较透; 3、ftzhangyanli关于第二步讨论的思路没错,是一个很好的开端。V3.14版本没问题,因WTUTOR所有版本我都用过。我之所以开办这个栏目,就是要在应用技巧上让更多的用户再上一个台阶。 NCHOLE程序虽小,但里面包含了若干技巧,你提到的dist_approach指令就是其中之一,按“手册” 介绍只能在后面加一个参数,我根据自己有机会读过DEA老测量系统的源文件和亲自进行过系统程序的修改及编译过程,比较熟悉内部的思路。加之,DEA在TUTOR系统的应用及研究上都给予了很大帮助,使我在此能比较深入的研究,并从实际中发现其中的“秘密” ,可以说这些在手册中都是没有的,今后我将引导大家共同讨论。 4、至于为什么没有任何参数询问并且当实际点和预设点相差很多,也不报警,我研究的小接近距离大采样深度就是其中奥妙。 5、关于锁定两轴移动的问题,该程序就有答案,过后我再介绍。 6、采样深度:就是采样运动的最大允许移动范围.
2004-11-18 21:54
回复
取消
提交
版主晚上好! 听到很多PC-dims测量员反映圆锥测量的问题。也请您讲讲测量基本元素中应该注意的问题好吗? 还有测量基本元素时的一些技巧。
2004-11-18 22:20
回复
取消
提交
引用“DIST_APPROCH指令两个参数的详细说明请你看版主参与编辑的资料。该书中对很多编程中的问题都有解答,还有很多编程技巧及应用。”请问版主,这是什么书呀?在哪里可以买到?对于单轴移动的问题我还是没能看得太明白,希望您能多多指教。
2004-11-19 11:56
回复
取消
提交
你到前哨朗普去买吧。
2004-11-19 15:30
回复
取消
提交
测规则圆的小程序,可以测平面圆和圆柱型的圆. 优点:外圆内圆都行,不会因圆的倾斜测成椭圆,可选测量点数,测量结束后可以查看所测圆的图形. 缺点:手要动动,必须先大概测量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
回复
取消
提交
下面是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
回复
取消
提交
在线咨询
关注我们

海克斯康制造智能

电话咨询
400-6580-400

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

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

海克斯康制造智能