0% found this document useful (0 votes)
0 views

Advanced DMIS

The document provides a comprehensive overview of variable declarations, data types, arithmetic operators, input/output operations, intrinsic functions, control structures (loops and conditionals), and macro definitions in a programming context. It includes examples for declaring character, integer, and real variables, as well as using arithmetic operations and intrinsic functions. Additionally, it covers file handling, error management, and interaction with external systems, demonstrating practical applications of the discussed concepts.

Uploaded by

krassi62
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
0 views

Advanced DMIS

The document provides a comprehensive overview of variable declarations, data types, arithmetic operators, input/output operations, intrinsic functions, control structures (loops and conditionals), and macro definitions in a programming context. It includes examples for declaring character, integer, and real variables, as well as using arithmetic operations and intrinsic functions. Additionally, it covers file handling, error management, and interaction with external systems, demonstrating practical applications of the discussed concepts.

Uploaded by

krassi62
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 12

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

You might also like