Variable declarations and data types
Declaration Character
DECL/CHAR, n, varname
Where:
n: The number of characters assigned to the variable.
Exmaple,
DECL/CHAR, 10, Feat_Label, Arr_Label[10]
Feat_Label = ‘MASTER_CR’
Arr_Label[0] = ‘X’
Arr_Label[1] = ‘Y’
..
Arr_Label[9] = ‘K’
Declaration Integer
DECL/INTGR, varname
Exmaple,
DECL/ INTGR, Feat_Num, Arr_Num[10]
Feat_Num = 5
Declaration Real
DECL/REAL, varname
Exmaple,
DECL/ REAL, XPos
XPos = 5.125
Arithmetic Operators
+ for addition
- for subtraction or negation
* for multiplication
/ for division
** for exponentiation
.EQ. for equal to
.NE. for not equal to
.LT. for less than
.LE. for less than or equal to
.GT. for greater than
.GE. for greater than or equal to
.AND. for and operator
.OR. for or operator
.NOT. for the not operator
Variables – Input/Output
DECL/CHAR, 10, Feat_Name
TEXT/QUERY, (Feat_Name), 10, AN, L, 'Feature Name?'
TEXT/OPER, Feat_Name
TEXT/OPER, ‘Finish the testing’
Intrinsic functions
ABS COS LN NINT SQRT INDX VAL
ACOS DBLE LOG RTOD TAN LEN SDATE
ASlN DTOR MX RL CHR ORD STIME
ATAN1 EXP MN SIGN CONCAT STR EOF
ATAN2 INT MOD SIN ELEMNT SUBSTR EOLN
decl/real, ang1, ang2, ang3, ang4, offset, result
decl/char, 10, Cir_n
decl/intgr, Num
ang1 = 0.0
ang2 = 45
ang3 = 90
ang4 = 135
offset = 10
result = MX(ang1,ang2,ang3,ang4)
output/real(result)
do/Num,1,10,1
Cir_n = STR(Num)
Cir_n = CONCAT(‘CR’, Cir_n)
f(Cir_n) = feat/circle,outer,cart, 10*Num,10,10,0,0,1,25.4
meas/circle, f(Cir_n), 4
ptmeas/cart, sin(dtor(ang1))+offset*Num, cos(dtor(ang1))-offset, 0, 1, 0, 0
ptmeas/cart, sin(dtor(ang2))+offset*Num, cos(dtor(ang2))-offset, 0, 0, 1, 0
ptmeas/cart, sin(dtor(ang3))+offset*Num, cos(dtor(ang3))-offset, 0, -1, 0, 0
ptmeas/cart, sin(dtor(ang4))+offset*Num, cos(dtor(ang4))-offset, 0, 0, -1, 0
endmes
output/fa(Cir_n)
enddo
Loop statement
DO/index, initial, limit, increment
Executable statements
ENDDO
DECL/INTGR, NUM, SUM
SUM = 0
DO/NUM,1,10,1
SUM = SUM + NUM
ENDDO
TEXT/OPER,SUM
$$ Exit LOOP when NUM=10 (Limit is not fixed, it can be 100, 200, …)
SUM = 0
DO/NUM,1,10000,1
SUM = SUM + NUM
IF/NUM.EQ.10
NUM = 10000
ENDIF
ENDDO
TEXT/OPER,SUM
$$ // Exit LOOP when NUM=10 using JUMPTO command
NUM=0
(LOOP)
NUM=NUM+1
IF/NUM.GT.10
TEXT/OPER,'FINISH PROGRAM'
JUMPTO/(END_LOOP)
ENDIF
TEXT/OPER,NUM
JUMPTO/(LOOP)
(END_LOOP)
IF statement
DECL/REAL, IVEC, JVEC, KVEC
F(PT1)=FEAT/POINT, CART, 400.010235, 400.016889, 300.014920, 0.000000, 0.000000, 1.000000
MEAS/POINT, F(PT1), 1
PTMEAS/CART, 400.010235, 400.016889, 300.014920, 0.000000, 0.000000, 1.000000
ENDMES
KVEC = OBTAIN/FA(PT1),8
IF/ KVEC .GT. 0.9
TEXT/OPER,’XY PLAN’
ELSE
JVEC = OBTAIN/FA(PT1),7
IF/ JVEC .GT. 0.9
TEXT/OPER,’YZ PLAN’
ELSE
TEXT/OPER,’XZ PLAN’
ENDIF
ENDIF
IF/ (IVEC.LT.0.1).OR.(IVEC.GT.0.9)
TEXT/OPER,’XY PLAN’
ENDIF
DECL/REAL, AA, AZ
AA=1
AZ=2
IF/(AA.EQ.1).OR.(AA.EQ.3)
TEXT/OPER,’OR Test: OK'
ENDIF
IF/(AA.EQ.1).AND.(AA.EQ.3)
TEXT/OPER,’AND Test: OK'
ENDIF
SELECT statement
SELECT/variable
CASE/var_1
Executable statement
ENDCAS
CASE/var_1
Executable statement
ENDCAS
ENDSEL
*** Note: variable is integer only.
DECL/INTGR, Num
DO/Num,1,5,1
SELECT/Num
CASE/1
TEXT/OPER, ‘Number 1’
ENDCAS
CASE/2
TEXT/OPER, ‘Number 2’
ENDCAS
CASE/3
TEXT/OPER, ‘Number 3’
ENDCAS
CASE/4
TEXT/OPER, ‘Number 4’
ENDCAS
CASE/5
TEXT/OPER, ‘Number 5’
ENDCAS
ENDSEL
ENDDO
Functions: OBTAIN, EVAL, VALUE
OBTAIN
DECL/REAL,XPOS, IVEC, DIA_ACT, DIA_NOM, DIA_DEV, ANG_B, XPOS_PT[5]
F(CR1) = FEAT/CIRCLE, OUTER, CART, 300.0024, 300.0017, 200.0000,0.00000,0.0000,1.0000,200.0000
XPOS = OBTAIN/FA(CR1),4
IVEC = OBTAIN/FA(CR1),7
DIA_ACT = OBTAIN/FA(CR1),10
DIA_NOM = OBTAIN/F(CR1),10
DIA_DEV = DIA_NOM – DIA_ACT
XPOS_PT[1] = OBTAIN/FA(CR1)[1],2
XPOS_PT[2] = OBTAIN/FA(CR1)[2],2
T(ABB1) = TOL/ANGLB, 45.0000, -0.0500, 0.0500
OUTPUT/FA(LN1), FA(LN2), TA(ABB1)
ANG_B = OBTAIN/TA(ABB1),2
EVAL
T(ABB1) = TOL/ANGLB, 45.0000, -0.0500, 0.0500
EVAL/FA(LN1), FA(LN2), T(ABB1)
ANG_B = OBTAIN/TA(ABB1),2
Note: Cannot use TA in EVAL.
VALUE
DECL/CHAR, 10, WhatMode, CWK
DECL/REAL, XPOS
DECL/INTGR, Num
WhatMode = VALUE/MODE
CWK = VALUE/WKPLAN
XPOS = VALUE/GOTO, XAXIS
Macro Definition and Call Macro
$$ MACRO STORING CURRENT STATUS (PCS,UNITS)
M(STORE_STS)=MACRO
DMIS/OFF
GET/D,CURRENTPCS
GET/UNITS,CURRENTUNIT
DMIS/ON
ENDMAC
$$ MACRO RESTORE CURRENT STATUS (PCS,UNITS,MODE)
M(RESTORE_STS)=MACRO
RECALL/D(CURRENTPCS)
IF/(CURRENTUNIT.EQ.'INCH')
UNITS/INCH,ANGDEC
ENDIF
IF/(CURRENTUNIT.EQ.'MM')
UNITS/MM,ANGDEC
ENDIF
ENDMAC
M(PICK_ACC2)=MACRO/PICK_PORT,EXT_LENG
DECL/LOCAL,INTGR,PORTN
PORTN = PICK_PORT
IF/ PORTN > 8
TEXT/OPER,'AUTORACK PORT NUMBER MUST BE 1 TO 8
ENDIF
CALL/M(STORE_STS)
GOTO/ACC_X[PORTN]+ACC_FACX,ACC_Y[PORTN]+ACC_FACY,ACC_Z[PORTN]+7+EXT_LENG
CALL/M(RESTORE_STS)
ENDMAC
CALL/ M(PICK_ACC2), 5, 25
Call external System Macro
XTERN
EXTFIL/DMIS, 'D:\Vms\Users\bjoh\Program\CastCurve.dms'
ENDXTN
CALL/EXTERN,DMIS,M(CASTCVI)
Direct Read/Write of a file
Direct write data to a file
DECL/CHAR, 10, HomeDir, CalibFile
DECL/REAL, PortX, PortY, PortZ
CALL/EXTERN,DME, 'V3DHOME',HomeDir
CalibFile = CONCAT(HomeDir,'\Users\Sensor\ACR3calib.data')
DID(PORTDATA) = DEVICE/STOR, CalibFile
OPEN/DID(PORTDATA),DIRECT,OUTPUT,OVERWR
PortX1 = 10.0
PortY1 = 20.0
PortZ1 = 30.0
PortX2 = 100.0
PortY2 = 200.0
PortZ2 = 300.0
WRITE/DID(PORTDATA),PortX1, ',' ,PortY1, ',' ,PortZ1
WRITE/DID(PORTDATA),PortX2, ',' ,PortY2, ',' ,PortZ2
CLOSE/DID(PORTDATA)
Direct read data from a file
DID(PORTDATA) = DEVICE/STOR, CalibFile
OPEN/DID(PORTDATA),DIRECT,INTPUT
READ/DID(PORTDATA),PortX1, PortY1, PortZ1
READ/DID(PORTDATA),PortX2, PortY2, PortZ2
CLOSE/DID(PORTDATA)
Useful DMIS code
Create a nominal curve from a data file
decl/char,80,UserDir
CALL/EXTERN,DME, 'V3DUSRDIR',UserDir
UserDir = concat(UserDir, '\report\profile.txt')
DID(PROF)=DEVICE/STOR,UserDir
OPEN/DID(PROF),DIRECT,INPUT
F(CV_1)=FEAT/GCURVE,CART, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0
DMIS/OFF
READ/F(CV_1),UserDir
DMIS/ON
CLOSE/DID(PROF),KEEP
ENDFIL
*** profile.txt
0.0000 , 9.2100 , -0.8
0.0718 , 9.2107 , -0.8
0.1436 , 9.2125 , -0.8
0.2153 , 9.2157 , -0.8
0.2867 , 9.2200 , -0.8
0.3580 , 9.2256 , -0.8
0.4289 , 9.2324 , -0.8
…
…
Incremental GOTO
GOTO/INCR, 10, 0, 0
Turn ON ‘Output Window’ box while run program
DISPLY/TERM, V(FORMAT1)
Useful DMIS code (continue)
Get Length
DECL/CHAR,10,StrTest
DECL/INTGR,StrLeng
StrTest = ‘START PROGRAM’
StrLeng = LEN(StrTest)
Result: StrLeng = 13
Sub-String
$$ SUBSTR(Str, First Pos, Finish Pos)
StrTest = ‘START PROGRAM’
StrTest = SUBSTR(StrTest,1,5)
Result : StrTest = ‘START’
CALL External program
$$ Use variale for path.
DECL/CHAR,80,OUTPATH
CALL/EXTERN,DME, 'V3DUSRDIR',OUTPATH
OUTPATH = CONCAT(OUTPATH,'\Report\test1.txt')
OUTPATH = CONCAT('''',OUTPATH)
OUTPATH = CONCAT(OUTPATH,'''')
CALL/EXTERN,SYS,'NOTEPAD.EXE',WAIT,OUTPATH
Handling of error code
$$ERROR/(JumpLabel), error code number
ERROR/(END_LOOP), 2014
…
…
(END_LOOP)
Get Vector from CAD Model – Ref. GetVectorFromCADModel.dms in Smaple folder
$$CALL/EXTERN,DME,'V3DGETVEC', XPOS, YPOS, ZPOS, IVEC, JVEC, KVE
READ/DID(DATA), XPOS, YPOS, ZPOS
CALL/EXTERN,DME,'V3DGETVEC', XPOS, YPOS, ZPOS, IVEC, JVEC, KVEC
PTNUM=STR(NUM)
PPNum=CONCAT('PFP',PTNUM)
PTNUM=CONCAT('PT',PTNUM)
F(PTNUM)=FEAT/POINT, CART, XPOS, YPOS, ZPOS, IVEC, JVEC, KVEC
MEAS/POINT, F(PTNUM), 1
GOTO/XPOS+(IVEC*5), YPOS+(JVEC*5), ZPOS+(KVEC*5)
PTMEAS/CART, XPOS, YPOS, ZPOS, IVEC, JVEC, KVEC
ENDMES