社区活动 技术论坛 [应用和编程技巧讲台]即将开通了!
[应用和编程技巧讲台]即将开通了!
2004-11-14 21:21 137 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)
该栏目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
2004-11-14 21:21
回复
取消
提交
好! 认真看看、分析分析
2004-11-15 15:10
回复
取消
提交
HEAD=info_func (2) TIP=info_func (3) probe (HEAD,TIP) 指令读去当前测头,使该程序可以在零件测量程序中的任何地方方便的调用。 用dy ("PROBE( ",HEAD,", ",TIP,")") 指令进行人机对话. 用dist_approach 1.,100.指令 使直径大于1+测头半径的圆都可以测量。 100的运用最巧,是程序灵活运用的体现。 get_position (XYZ) XC=XYZ|x YC=XYZ|y ZC=XYZ|z 指令--读取测量机当前的位置。是使程序内参数的的运用更灵活。 以上是我的一点拙见。不足之处望版主指正。
2004-11-16 13:15
回复
取消
提交
能不能翻译一下,有点在看天书啊!:) 小菜上路,需要帮助 你我同行,旅途不苦
2004-11-16 16:33
回复
取消
提交
1 program NSD[WM1,WM2] 2 element_array MEMO[300] 3 NCHO4 4 endstat 5 procedure NCHO4 6 real C1,C2 7 real XC,YC,ZC,SA=0,EA=360 8 coord XYZ 9 integer PLXYZ,HEAD,TIP,BL 10 ! dy icon "c:\wtutor\dq\k00.bmp" 11 dy ("") 12 dy ("") 13 dy ("") 14 dy ("") 15 dy ("") 16 dy ("") 17 dy ("") 18 dy ("NC / HOLE<4> PROGRAM") 19 dy ("") 20 fly (off) 21 mspeed 100 22 no_approach 23 HEAD=info_func (2) 24 TIP=info_func (3) 25 probe (HEAD,TIP) 26 dy ("") 27 dy ("PROBE( ",HEAD,", ",TIP,")") 28 dy ("") 29 BL=info_func (7) 30 PLXYZ=info_func (8) 31 if PLXYZ eq 3 then 32 dy ("=== XY ===") 33 end_if 34 if PLXYZ eq 1 then 35 dy ("=== YZ ===") 36 end_if 37 if PLXYZ eq 2 then 38 dy ("=== ZX ===") 39 end_if 40 dy ("") 41 delay (40) 42 for I=1 to 100 by 1 43 dist_approach 6.,12. 44 manmove 45 ncmove 46 dist_approach 1.,100. 47 get_position (XYZ) 48 XC=XYZ|x 49 YC=XYZ|y 50 ZC=XYZ|z 51 mcir (MEMO[BL+I],4) savepts 52 for K=0 to 3 by 1 53 move (X=XC,Y=YC,Z=ZC) 54 C1=0.5*cos (K*90) 55 C2=0.5*sin (K*90) 56 if PLXYZ eq 3 then 57 movetf (X=XC+C1,Y=YC+C2,Z=ZC) 58 end_if 59 if PLXYZ eq 1 then 60 movetf (X=XC,Y=YC+C1,Z=ZC+C2) 61 end_if 62 if PLXYZ eq 2 then 63 movetf (X=XC+C2,Y=YC,Z=ZC+C1) 64 end_if 65 end_for 66 move (X=XC,Y=YC,Z=ZC) 67 end_for 68 end_procedure 69 end_program 版主,您好。以上的程序我以经看过了,其实我没太明白您让我们分析程序的目的。 您是想让我们指出程序中的错误还是指出程序中的优点。以下是我分析程序的一些心得, 和一些不太明白的地方,希望您能多多指教。为了说明的方便我给程序加上了行号。   首先是23-25行,23行取得当前测头号,24行取得当前测尖号,但25行您又重新调用了一 次当前的测头和测尖,即然想要的就是当前测头及测尖为什么要重新调用一次呢?   还有就是在29行取了一下当前的块号,所以在51行想把测量元素存入下一存储单元, 以免洗掉以前测得的元素。但有时当前的块号和当前的最大的存储单元号并不一样 (比如手动建立了一个理论元素后)。   另外,43和46行在定义接近距离的时候为什么后面要跟两个参数值呢?   最后,我觉得程序中最经典的设计就是52-65的FOR语句。其中K的值即决定的循环的次数 又可以根据它的值算出测量点距当前点的偏置量,一举两得。   42行中FOR的循环控制变量值设为100应该是孔的数量吧,其实这个数可以让用户从键盘 输入,这样更符合测量时的实际情况。   由于我们所用的软件版本的问题,可能我们所理解的语句有些不一样,如果我有说错的 地方请您不要见怪。
2004-11-17 11:55
回复
取消
提交
23-25行,23行取得当前测头号,24行取得当前测尖号, 但并没有调用测头,仅仅是HEAD,TIP变量赋值。 25行调用测头。 29行 ,和51行的编程目的并不是为了避免块号冲突,只是变量在编程中的应用演示。 接近距离是第一个参数。第二个参数是探测距离。不是一个概念。 Edited by - houjinpu on 2004/11/18 09:52:22
2004-11-17 15:14
回复
取消
提交
ftzhangyanli 你好:很欣赏你的认真钻研的精神。 望能多交流。
2004-11-17 15:30
回复
取消
提交
我认为这个拦目很好,可以提高大家的编程水平。
2004-11-17 20:54
回复
取消
提交
1、我让大家分析一下程序,是想通过水平较高同志的分析,给新接触语言的用户以讲解,充分显示出其讲台的效果,并逐步深入。 2、Houjinpu已解释了23、24、25,很对。 3、存储单元是当前块号加1。至于块号与存储单元号不统一的情况,在调用程序前应先定义一下块号;关于100,是测孔数。之所以不采用人机对话,一是体现“傻瓜”程序的特征;二是采用人机对话的缺点是,若中间有一孔需要重测,原定义的孔数就不够了,现在就可随时中断,自由些。 4、dist_approach 后面跟两个数字,前面是接近距离,后面是采样深度. 5.下面要讨论的第二步问题: 当孔沿轴向(过中心)有一个键槽,现程序不能用了;当采点数任选;当孔的直径特别大,超出采样深度最大100mm,该怎么修改?
2004-11-17 21:40
回复
取消
提交
版主:您的第二个问题是不是说一圆孔的轴向上铣了一个键槽?如果是的话。可以把程序中的 C1=0.5*cos (K*90) C2=0.5*sin (K*90) 改成 C1=0.5*cos (K*90+45) C2=0.5*sin (K*90+45) 条件是键槽宽度小于圆的半径。 当圆的直径大于100时,可以把 C1=0.5*cos (K*90+45) C2=0.5*sin (K*90+45) 中的0.5增大到适合的值。 不知我对版主的题目理解的是否正确?不足之处请版主指正。 Edited by - houjinpu on 2004/11/18 09:46:17 Edited by - houjinpu on 2004/11/18 10:55:04
2004-11-18 09:41
回复
取消
提交
在线咨询
关注我们

海克斯康制造智能

电话咨询
400-6580-400

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

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

海克斯康制造智能