媒介
一个法式合用N种产品,该若何进行编程?
在丈量利用中,对于类似产品,如:环规,想要提高丈量效能,并且削减产品法式的数量,丈量员能够对产品的一样点进行肯定分析,发显熹中部门数据可实现参数化,通过RationalDMIS软件的高级说话职能实现产品的急剧丈量,并合用于多种规格的产品。
1、产品分析
对于有着多多规格的环规而言,若是每一个规格的大幼都进行编程,是一个极度繁琐且不便的工程,对于丈量员使用对应法式也是极其不便的,影响丈量效能。我们对环规这类产品进行分析,特点如下图:

环规的类型内表为TYPE,总高度界说为H,顶部向下偏移量界说为UP,底部向上偏移量界说为DP,环规直径界说为DM,丈量截面数量m,每个截面丈量点数为n。
2、法式的设计
2.1 法式运行后,通过报答输入,能够实现分歧规格产品的自动丈量
2.2 流程图

2.3 RationalDMIS 法式编写
(1)通过DMIS提醒,设置一个运行时输入参数的提醒窗口

代码如下:

(2) 对参数进行判断,如判断环规类型、输入内容为字母、0 等情况

(3)手动成立坐标系

(4)设置安全平面宏
(请将安全平面宏法式按以下内容批改)

(5)自动精建坐标系

(6)评价与分析
通过前面输入的层数与点数参数,进行圆柱丈量,并进行评价

(7)出产检测汇报

(8)总结
通过RationalDMIS软件,只需单一3步,即可实现:
1、前提判断,输入管控参数,判断规格类型;
2、利用赋值,将管控参数赋给变量;
3、通过变量,规划丈量轨迹,实现了分歧规格的产品的检测;
最终实现一个法式,实现N个分歧规格产品的自定、高效丈量。
(9)齐全代码如下
$$/* Header DMISMN/'Created by [海博论坛hibet丈量技术(丽江)有限公司(非销售版)-101522-10825] on 星期四, 五月 26, 2022', 4.0 UNITS/MM, ANGDEC, MMPS WKPLAN/XYPLAN PRCOMP/ON TECOMP/OFF FLY/1.000000 MODE/PROG, MAN SNSET/APPRCH, 1.000000 SNSET/RETRCT, 1.000000 SNSET/DEPTH, 0.000000 SNSET/SEARCH, 10.000000 SNSET/CLRSRF, 10.000000 RECALL/D(MCS) SNSLCT/S(ROOTSN2) GEOALG/BF, LSTSQR GEOALG/ANGLB, DEFALT GEOALG/CIRCLE, MAXINS GEOALG/ARC, LSTSQR GEOALG/PLANE, LSTSQR $$ $$ $$*/ MODE/MAN DECL/COMMON, INTGR, RINGconfig,TYPE,RINGH,RINGDM,RINGUP,RINGDP,RINGPOINTS,RINGCOUNTS RINGconfig = PROMPT/TEXT,'请选择环规类型:',LIST,TYPE,'内','表',TEXT,'高度 H:',EDIT,RINGH,TEXT,'直径 DM:',EDIT,RINGDM,TEXT,'上偏移量 UP:',EDIT,RINGUP,TEXT,'下偏移量 DP:',EDIT,RINGDP,TEXT,'每层测点数 N:',EDIT,RINGPOINTS,TEXT,'层数 M:',EDIT,RINGCOUNTS if/(TYPE.EQ.1) KNPTN1=ASSIGN/1 ELSE KNPTN1=ASSIGN/-1 ENDIF $$查抄参数 IF/(RINGH.EQ.0) RINGH = PROMPT/'请输入正确的环规高度 H', 100, 1 ENDIF IF/(RINGDM.EQ.0) RINGDM = PROMPT/'请输入正确的环规直径 DM', 9999, 1 ENDIF IF/(RINGUP.EQ.0) RINGUP = PROMPT/'请输入正确的偏移量 UP', RINGH, 1 ENDIF IF/(RINGDP.EQ.0) RINGDP = PROMPT/'请输入正确的偏移量 DP', RINGH, 1 ENDIF IF/(RINGPOINTS.EQ.0) RINGPOINTS = PROMPT/'请输入正确的每层测点数 N', 9999, 3 ENDIF IF/(RINGCOUNTS.EQ.0) RINGCOUNTS = PROMPT/'请输入正确的丈量层数 M', 9999, 2 ENDIF F(PLN1)=FEAT/PLANE,POL,0,0,0.000000,0.000000,0.000000,1.000000 FA(PLN1)=FEAT/PLANE,POL,0,0,0.000000,0.000000,0.000000,1.000000 $$Measurement points are created through nominal points MEAS/PLANE, F(PLN1), 3 PTMEAS/POL, 16.022606, 89.412167, 0.000000, 0.000000, 0.000000, 1.000000 PTMEAS/POL, 16.618454, 203.430682, 0.000000, 0.000000, 0.000000, 1.000000 PTMEAS/POL, 16.155284, 335.311794, 0.000000, 0.000000, 0.000000, 1.000000 ENDMES D(CRD1) = DATSET/FA(PLN1), ZDIR D(CRD1) = TRANS/ZORIG, FA(PLN1) F(CIR1)=FEAT/CIRCLE,INNER,CART,0.000000,0.000001,-2,0.000000,0.000000,1.000000, RINGDM FA(CIR1)=FEAT/CIRCLE,INNER,CART,0.000000,0.000001,-2,0.000000,0.000000,1.000000, RINGDM $$ Measurement points are created through nominal points MEAS/CIRCLE, F(CIR2), 4 PTMEAS/CART, 0, KNPTN1*RINGDM/2, -2 , 0, -1*KNPTN1, 0 PTMEAS/CART, KNPTN1*RINGDM/2, 0, -2, -1*KNPTN1, 0, 0 PTMEAS/CART, 0, -1*KNPTN1*RINGDM/2, -2, 0,1*KNPTN1, 0 PTMEAS/CART, -1*KNPTN1*RINGDM/2, 0, -2, 1*KNPTN1,0, 0 ENDMES D(CRD2) = DATSET/FA(PLN1), ZDIR, FA(CIR1), XORIG D(CRD2) = TRANS/ZORIG, FA(PLN1), YORIG, FA(CIR1), XORIG, -0 MODE/PROG,MAN $$ MACRO: EASI_CLEARPLN_GOTO $$ FUNCTION: CLEARANCE SURFACE IMPLEMENTATION $$ Move machine CLEAR SURFACE DIST above the current clear surface $$plane and then move machine parallel to the clear surface plane $$ ALL Macro parameters are in PCS and Current UNITS $$ Last update: 3-1-04 Add mode checking. only works in PROG MODE $$ Last update: 8-24-04 Clear position is based on the surface of $$ $$ This sample DMIS Macro is provided by External-Array Software, Inc. $$ It should be modified for your own use. There is no guarantee for $$ the quality of this Macro. November, 2003 $$ 挪用参数 ISOM 为安全平面参考元素类型理论0(OR现实1) $$ 挪用参数指标地位测点TRAX 、TRAY、 TRAZ,TRAI,TRAJ,TRAK坐标及矢量 M(EASI_CLEARPLN_GOTO) = MACRO/ISNOM, TARX, TARY, TARZ, TARI, TARJ, TARK DECL/LOCAL, REAL, CCX, CCY, CCZ, CCI, CCJ, CCK DECL/LOCAL, REAL, CURX, CURY, CURZ, TD, CLRDIST, SDIAM,BJDIST DECL/LOCAL, CHAR, 255, CLRLABEL, FLABEL, MMODE, SNAME $$获取当前运行模式及安全平面参考元素名Label MMODE = VALUE/MODE CLRLABEL = VALUE/SNSET, CLRSRF $$判断Label是否存在(关关情况为空,非关关则会获取到字符串,字符串长度大于0) 同时判断前提 当前模式是否为自动,不然跳过 IF/ ( (LEN(CLRLABEL) .GT. 0) .AND. (MMODE .EQ. 'PROG,MAN') ) $$获取安全距离 CLRDIST = VALUE/SNSET, CLRSRF, DIST BJDIST= VALUE/SNSET,APPRCH TARX=ASSIGN/TARX+BJDIST*TARI TARY=ASSIGN/TARY+BJDIST*TARJ TARZ=ASSIGN/TARZ+BJDIST*TARK $$给FLABEL赋值,默认FA FLABEL = ASSIGN/'FA' $$凭据ISOM情况来更改FA或F IF/ ISNOM .EQ. 0 FLABEL = ASSIGN/'F' ENDIF $$赋值CCX,CCY,CCZ,CCI,CCJ,CCK为安全平面参考元素中心坐标的XYZIJK CCX = OBTAIN/FLABEL(@CLRLABEL), 3 CCY = OBTAIN/FLABEL(@CLRLABEL), 4 CCZ = OBTAIN/FLABEL(@CLRLABEL), 5 CCI = OBTAIN/FLABEL(@CLRLABEL), 6 CCJ = OBTAIN/FLABEL(@CLRLABEL), 7 CCK = OBTAIN/FLABEL(@CLRLABEL), 8 $$获取探头名称 SNAME = VALUE/SNSLCT $$获取探头直径 SDIAM = OBTAIN/SS(SNAME), 8 $$延安全平面矢量增长一个探头半径 CCX = ASSIGN/CCX + CCI * SDIAM/2 CCY = ASSIGN/CCY + CCJ * SDIAM/2 CCZ = ASSIGN/CCZ + CCK * SDIAM/2 $$获取当前探针X,Y,Z坐标 CURX = VALUE/GOTOM, XAXIS CURY = VALUE/GOTOM, YAXIS CURZ = VALUE/GOTOM, ZAXIS $$推算当前坐标到安全平面的垂直距离 TD = ASSIGN/(CURX - CCX) * CCI + (CURY - CCY) * CCJ + (CURZ - CCZ) * CCK $$断根原有判断,肆意地位先垂直移动到安全高度 $$IF/ TD .LT. CLRDIST TD = ASSIGN/(CLRDIST - TD) GOTO/CURX+CCI*TD, CURY+CCJ*TD, CURZ+CCK*TD $$ENDIF $$推算指标坐标到安全平面的垂直距离 TD = ASSIGN/(TARX - CCX) * CCI + (TARY - CCY) * CCJ + (TARZ - CCZ) * CCK IF/ TD .LT. CLRDIST TD = ASSIGN/(CLRDIST - TD) GOTO/TARX+CCI*TD, TARY+CCJ*TD, TARZ+CCK*TD $$建议增长大于的情况 ENDIF ENDIF ENDMAC SNSET/APPRCH, 1.0000 SNSET/RETRCT, 1.0000 SNSET/DEPTH, 0.0000 SNSET/SEARCH, 10.0000 SNSET/CLRSRF, FA(PLN1), 10.0000 F(PLN2)=FEAT/PLANE,POL,0,0,0.000000,0.000000,0.000000,1.000000 $$ Measurement points are created through nominal points CALL/M(EASI_CLEARPLN_GOTO), 1,0, KNPTN1*RINGDM/2, 0 , 0, 0, 1 MEAS/PLANE, F(PLN2), 3 PTMEAS/POL, KNPTN1*1+RINGDM/2, 90, 0.000000, 0.000000, 0.000000, 1.000000 PTMEAS/POL, KNPTN1*1+RINGDM/2, 210, 0.000000, 0.000000, 0.000000, 1.000000 PTMEAS/POL, KNPTN1*1+RINGDM/2, 330, 0.000000, 0.000000, 0.000000, 1.000000 ENDMES D(CRD3) = DATSET/FA(PLN2), ZDIR D(CRD3) = TRANS/ZORIG, FA(PLN2) F(CIR2)=FEAT/CIRCLE,INNER,CART,0.000000,0.00000,-2,0.000000,0.000000,1.000000, RINGDM $$ Measurement points are created through nominal points CALL/M(EASI_CLEARPLN_GOTO), 1,0, RINGDM/2, -2 , 0, -1*KNPTN1, 0 MEAS/CIRCLE, F(CIR2), 4 PTMEAS/CART, 0, RINGDM/2, -2 , 0, -1*KNPTN1, 0 IF/(TYPE.EQ.2) CALL/M(EASI_CLEARPLN_GOTO), 1,RINGDM/2, 0, -2, -1*KNPTN1, 0, 0 ENDIF PTMEAS/CART, RINGDM/2, 0, -2, -1*KNPTN1, 0, 0 IF/(TYPE.EQ.2) CALL/M(EASI_CLEARPLN_GOTO), 1,0, -1*RINGDM/2, -2, 0,1*KNPTN1, 0 ENDIF PTMEAS/CART, 0, -1*RINGDM/2, -2, 0,1*KNPTN1, 0 IF/(TYPE.EQ.2) CALL/M(EASI_CLEARPLN_GOTO), 1,-1*RINGDM/2, 0, -2, 1*KNPTN1,0, 0 ENDIF PTMEAS/CART, -1*RINGDM/2, 0, -2, 1*KNPTN1,0, 0 ENDMES D(CRD4) = DATSET/FA(PLN2), ZDIR, FA(CIR2), XORIG D(CRD4) = TRANS/ZORIG, FA(PLN2), YORIG, FA(CIR2), XORIG, -0 $$ Set.Term.Delete IF/(TYPE.EQ.1) KNPTC1=ASSIGN/'内' ELSE KNPTC1=ASSIGN/'表' ENDIF TEXT/OUTFIL,CONCAT('环规类型:',KNPTC1) TEXT/OUTFIL,CONCAT('环规直径:',STR(RINGDM)) TEXT/OUTFIL,CONCAT('环规高度:',STR(RINGH)) TEXT/OUTFIL,CONCAT('丈量上偏移量:',STR(RINGUP)) TEXT/OUTFIL,CONCAT('丈量下偏移量:',STR(RINGDP)) TEXT/OUTFIL,CONCAT('丈量层数',STR(RINGCOUNTS)) TEXT/OUTFIL,CONCAT('每层丈量点数:',STR(RINGPOINTS)) DECL/COMMON,INTGR,ALLPOINTS ALLPOINTS=ASSIGN/RINGCOUNTS*RINGPOINTS DECL/REAL,PRR,PA,PH,PX,PY,PI,PJ,PDA,PDB IF/(TYPE.EQ.1) F(CYL1) = FEAT/CYLNDR,INNER,CART, 0,0,-1*RINGH/2, 0,0,1, RINGDM, RINGH CALL/M(EASI_CLEARPLN_GOTO),1,RINGDM/2,0,0, -1,0,0 MEAS/CYLNDR, F(CYL1),ALLPOINTS DO/PDA,1,RINGCOUNTS,1 DO/PDB,1,RINGPOINTS,1 PRR=ASSIGN/RINGDM/2 PA=ASSIGN/(360/RINGPOINTS)*(PDB-1) PH=ASSIGN/-1*RINGUP-(RINGH-RINGUP-RINGDP)/RINGCOUNTS*(PDA-1) PI=ASSIGN/COS(DTOR(PA))*KNPTN1*-1 PJ=ASSIGN/SIN(DTOR(PA))*KNPTN1*-1 PX=ASSIGN/RINGDM/2*PI PY=ASSIGN/RINGDM/2*PJ PTMEAS/POL,PRR,PA,PH,PI,PJ,0 ENDDO ENDDO ENDMES ELSE F(CYL1) = FEAT/CYLNDR,OUTER,CART, 0,0,-1*RINGH/2, 0,0,1, RINGDM, RINGH MEAS/CYLNDR, F(CYL1),ALLPOINTS DO/PDA,1,RINGCOUNTS,1 DO/PDB,1,RINGPOINTS,1 PRR=ASSIGN/RINGDM/2 PA=ASSIGN/(360/RINGPOINTS)*(PDB-1) PH=ASSIGN/-1*RINGUP-(RINGH-RINGUP-RINGDP)/RINGCOUNTS*(PDA-1) PI=ASSIGN/COS(DTOR(PA))*KNPTN1*-1 PJ=ASSIGN/SIN(DTOR(PA))*KNPTN1*-1 PX=ASSIGN/RINGDM/2*PI PY=ASSIGN/RINGDM/2*PJ CALL/M(EASI_CLEARPLN_GOTO),1,PX,PY,PH,PI,PJ,0 PTMEAS/POL,PRR,PA,PH,PI,PJ,0 ENDDO ENDDO ENDMES ENDIF T(TDM1)=TOL/DIAM,-0.500000,0.500000 OUTPUT/FA(CYL1),TA(TDM2) T(TCLD1)=TOL/CYLCTY,0.200000 OUTPUT/FA(CYL1),TA(TCLD1)
参考文件:《2015 PC-DMIS交锋大赛论文集》