'Program test0.BAS to test communication with the Eurotherm 2416 temperature 'programmer ' Milos Steinhart IMC Prague/ BU; Last Big Change 13. 08. 04 OPEN "com1:9600,e,7,1,bin,cd,cs,ds,rs" FOR RANDOM AS #1 ' conf=0 normal mode, conf=1 configuration (the address changes) conf = 0 ' change to instrument mode 'dev$ = "IM0": GOSUB vdest: GOTO pend ' change to config mode 'dev$ = "IM2": GOSUB vdest: GOTO pend ' jumps to block read and write ' GOTO pread ' GOTO bread ' GOTO bwrite ' GOTO swpttc ' GOTO swtheat ' GOTO swtpelt ' GOTO gpid ' this will READ a parameter given by a mnemonics des$ = "PV": GOSUB reas: GOTO pend ' process value ' des$ = "OP": GOSUB reas: GOTO pend ' output power ' des$ = "QC": GOSUB reas: GOTO pend ' absolute low limit 'des$ = "QB": GOSUB reas: GOTO pend ' absolute high limit 'des$ = "BP": GOSUB reas: GOTO pend ' power when the sensor disconnected 'des$ = "cg": GOSUB reas: GOTO pend ' max monitor voltage 'des$ = "ag": GOSUB reas: GOTO pend ' max output voltage 'des$ = "ah": GOSUB reas: GOTO pend ' min output voltage 'des$ = "d2": GOSUB reas: GOTO pend ' 'des$ = "EP": GOSUB reas: GOTO pend ' 'des$ = "mA": GOSUB reas: GOTO pend ' 'des$ = "FR": GOSUB reas: GOTO pend ' 'des$ = "PC": GOSUB reas: GOTO pend ' 'des$ = "$6": GOSUB reas: GOTO pend 'des$ = "s1": GOSUB reas: GOTO pend 'des$ = "AT": GOSUB reas: GOTO pend 'des$ = "AA": GOSUB reas: GOTO pend 'des$ = "p0": GOSUB reas: GOTO pend 'des$ = "p5": GOSUB reas: GOTO pend ' this will write mnemonics and data 'dev$ = "OP50": GOSUB vdest: GOTO pend 'dev$ = "CA0": GOSUB vdest: GOTO pend 'dev$ = "PC1": GOSUB vdest: GOTO pend 'dev$ = "EP4": GOSUB vdest: GOTO pend 'des$ = "s170": GOSUB vdest: GOTO pend 'dev$ = "AT0": GOSUB vdest: GOTO pend dev$ = "SL25": GOSUB vdest: 'dev$ = "SL60": GOSUB vdest: GOTO pend 'dev$ = "mA0": GOSUB vdest: GOTO pend 'dev$ = "OP30": GOSUB vdest: GOTO pend dev$ = "AT1": GOSUB vdest: GOTO pend 'dev$ = "AT0": GOSUB vdest: GOTO pend 'dev$ = "$91": GOSUB vdest: GOTO pend 'dev$ = "PN2": GOSUB vdest: GOTO pend 'dev$ = "EP2": GOSUB vdest: GOTO pend 'dev$ = "ah1": GOSUB vdest: GOTO pend 'dev$ = "ah5": GOSUB vdest: GOTO pend 'dev$ = "ag10": GOSUB vdest: GOTO pend 'dev$ = "BP50": GOSUB vdest: GOTO pend 'dev$ = "S1-5.3": GOSUB vdest: GOTO pend 'dev$ = "HO99": GOSUB vdest: GOTO pend ' this will load a short temperature program ' or a set of commands bwrite: dev$ = "EP4": GOSUB vdest 'dev$ = "PN1": GOSUB vdest dev$ = "$11": GOSUB vdest dev$ = "$23": GOSUB vdest dev$ = "$31": GOSUB vdest dev$ = "$43": GOSUB vdest dev$ = "$51": GOSUB vdest dev$ = "$63": GOSUB vdest dev$ = "$70": GOSUB vdest GOTO pend dev$ = "d01": GOSUB vdest dev$ = "p01": GOSUB vdest dev$ = "$11": GOSUB vdest dev$ = "d12": GOSUB vdest dev$ = "s140": GOSUB vdest dev$ = "$23": GOSUB vdest dev$ = "d22": GOSUB vdest dev$ = "$31": GOSUB vdest dev$ = "d30.5": GOSUB vdest dev$ = "s360": GOSUB vdest dev$ = "$43": GOSUB vdest dev$ = "d45": GOSUB vdest dev$ = "$51": GOSUB vdest dev$ = "d52": GOSUB vdest dev$ = "s560": GOSUB vdest dev$ = "$63": GOSUB vdest dev$ = "d62": GOSUB vdest dev$ = "$70": GOSUB vdest dev$ = "p71": GOSUB vdest 'dev$ = "s360": GOSUB vdest 'dev$ = "$43": GOSUB vdest 'dev$ = "p45": GOSUB vdest GOTO pend ' this will read a program pread: 'des$ = "ah": GOSUB reas 'des$ = "ag": GOSUB reas des$ = "EP": GOSUB reas des$ = "PN": GOSUB reas des$ = "$1": GOSUB reas des$ = "d1": GOSUB reas des$ = "s1": GOSUB reas des$ = "$2": GOSUB reas des$ = "d2": GOSUB reas des$ = "$3": GOSUB reas des$ = "d3": GOSUB reas des$ = "s3": GOSUB reas des$ = "$4": GOSUB reas des$ = "d4": GOSUB reas des$ = "$5": GOSUB reas des$ = "d5": GOSUB reas des$ = "s5": GOSUB reas des$ = "$6": GOSUB reas des$ = "d6": GOSUB reas des$ = "$7": GOSUB reas des$ = "p7": GOSUB reas GOTO pend ' this will read a set of parameters bread: 'des$ = "ah": GOSUB reas 'des$ = "ag": GOSUB reas des$ = "EP": GOSUB reas des$ = "PN": GOSUB reas des$ = "$1": GOSUB reas des$ = "$2": GOSUB reas des$ = "$3": GOSUB reas des$ = "$4": GOSUB reas des$ = "$5": GOSUB reas des$ = "$6": GOSUB reas des$ = "$7": GOSUB reas GOTO pend des$ = "SN": GOSUB reas des$ = "CS": GOSUB reas des$ = "PM": GOSUB reas des$ = "TS": GOSUB reas 'des$ = "SL": GOSUB reas 'des$ = "OP": GOSUB reas des$ = "PV": GOSUB reas GOTO pend gpid: ' PID parameters des$ = "XP": GOSUB reas des$ = "TI": GOSUB reas des$ = "TD": GOSUB reas GOTO pend 'des$ = "MR": GOSUB reas 'des$ = "HB": GOSUB reas 'des$ = "LB": GOSUB reas 'des$ = "RG": GOSUB reas GOTO pend ' switch between Pt or TC K swpttc: dev$ = "IM2": GOSUB vdest: conf = 1 ' thermocouple K 'dev$ = "Q21": GOSUB vdest ' Pt 100 dev$ = "Q210": GOSUB vdest dev$ = "IM0": GOSUB vdest: conf = 0 GOTO pend swtheat: dev$ = "IM2": GOSUB vdest: conf = 1 dev$ = "ah5.2": GOSUB vdest dev$ = "ag10": GOSUB vdest dev$ = "BP50": GOSUB vdest dev$ = "QC20": GOSUB vdest dev$ = "QB300": GOSUB vdest dev$ = "HS300": GOSUB vdest dev$ = "ce300": GOSUB vdest dev$ = "cg5": GOSUB vdest dev$ = "IM0": GOSUB vdest: conf = 0 GOTO pend swtpelt: dev$ = "IM2": GOSUB vdest: conf = 1 ' low and high voltage limits dev$ = "ah3": GOSUB vdest dev$ = "ag9.0": GOSUB vdest 'dev$ = "ah0": GOSUB vdest 'dev$ = "ag10.0": GOSUB vdest dev$ = "a317": GOSUB vdest ' sensor break-out power dev$ = "BP54": GOSUB vdest ' low and high setpoint limits dev$ = "QC-10": GOSUB vdest dev$ = "QB202": GOSUB vdest ' high value in C dev$ = "ce200": GOSUB vdest ' high value in V dev$ = "cg5": GOSUB vdest dev$ = "IM0": GOSUB vdest: conf = 0 GOTO pend ' this will set temperature 'dest = 81.1: GOSUB sdest: GOTO pend 'ifile$ = "stemp.dat" 'OPEN ifile$ FOR INPUT AS #2 'INPUT #2, dest: GOSUB sdest 'CLOSE #2 'SLEEP 2 'SYSTEM 'END reas: IF conf = 0 THEN PRINT #1, CHR$(4); "0011"; des$; CHR$(5); : GOSUB uread: PRINT a$ ELSE PRINT #1, CHR$(4); "0000"; des$; CHR$(5); : GOSUB uread: PRINT a$ END IF RETURN pend: END sdest: ' "dest" is coded into a string and its nasty checksum calculated c$ = LTRIM$(STR$(dest)) a$ = "SL" + c$ + CHR$(3) GOSUB chsum ' sends the command and reads the one char response [6 ACK, 21 NAK] PRINT #1, CHR$(4); "0011"; CHR$(2); a$; CHR$(ff); GOSUB uread PRINT a$ RETURN vdest: a$ = dev$ + CHR$(3) GOSUB chsum ' sends the command 11 in normal 00 in config mode IF conf = 0 THEN PRINT #1, CHR$(4); "0011"; CHR$(2); a$; CHR$(ff); ELSE PRINT #1, CHR$(4); "0000"; CHR$(2); a$; CHR$(ff); END IF GOSUB uread PRINT a$ RETURN uread: x$ = INPUT$(1, #1) xs = ASC(x$) IF xs = 6 THEN a$ = "ack": GOTO ureade IF xs = 21 THEN a$ = "nak": GOTO ureade IF xs = 4 THEN a$ = "oops": GOTO ureade IF xs <> 2 THEN a$ = "?" + STR$(xs): GOTO ureade a$ = "" WHILE xs <> 3 x$ = INPUT$(1, #1) xs = ASC(x$) IF xs <> 3 THEN a$ = a$ + x$ WEND x$ = INPUT$(1, #1) ureade: RETURN chsum: aa = LEN(a$): ff = ASC(LEFT$(a$, 1)) FOR i = 2 TO aa ff = ff XOR ASC(MID$(a$, i, 1)) NEXT i RETURN