'Automated Test Software for SCT1Px-xx and DSCTx-xx Voltage, 'Current, TC and RTD input models. 'AUTHOR: John Lehman 'DATE: 4/9/98 'USES LIBRARY = LIBATE.BAS ' REVISION RECORD 'DATE APPR DESCRIPTION '---- ---- ----------- 'SEE TST4SCT1.BAS DECLARE SUB CALDAC (TE$) DECLARE SUB COMPTEST (STATUS$(), ITERATION%, cal%, GENAMPL!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ERRORA$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Complete set of tests DECLARE SUB CONTINUE () DECLARE SUB FOOTER (STATUS$()) 'Sends footer to printer if all tests passed DECLARE SUB FUNCTEST (cal%) 'Routines for functional test DECLARE SUB GENSET (GENAMPL!) 'Displays message to set signal generator DECLARE SUB GETADD (FILENAME$) 'Gets parallel port/Mux/Testhead address DECLARE SUB GETSN (SN$) 'Gets serial number DECLARE SUB GETSPECS () 'Gets transmitter type and specifications DECLARE SUB GETSPECS2 () 'Gets SCMVAS module data DECLARE SUB HEADERA (SN$) 'Prints test sheet header DECLARE SUB HEADERB (TESTTITLE$) 'Prints test screen header DECLARE SUB INDIVID (SEL%) 'Performs the tests individually DECLARE SUB INIT488 (DEVADDR%) DECLARE SUB INITPS (ADDR%, OVERI!, OVERV!) DECLARE SUB LOADMUX (CH%, CHON%) DECLARE SUB LOGIT (STATUS$(), SN$, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ERRORA$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Logs test results to disk DECLARE SUB MODOUTLINE () DECLARE SUB NOTES () 'Notes on ATE operation DECLARE SUB OHMSET (OHM!) DECLARE SUB ONESHOTTEST () 'Tests one-shot pulse width DECLARE SUB PAUSE (TIME!) DECLARE SUB REPORT (STATUS$(), TSPEC$()) 'Prints test data on screen DECLARE SUB RESETTH () 'Reset test head to known condition DECLARE SUB SETDAC (VOLTAGE!, CH%, VSENATTEN!) DECLARE SUB SETDACFAST (VOLTAGE!) DECLARE SUB SETTEST (TEST%) DECLARE SUB SETTH (DOUT%, CB%) DECLARE SUB SETTHFAST (DOUT%, CB%) DECLARE SUB SORTDB (ENDFLAG%) DECLARE SUB TSPECS (TSPEC$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Creates a string array of test specifications DECLARE SUB WRITEDVM (FUNC$, VALUE!) DECLARE SUB TCDUTCONNECT () DECLARE SUB TCDUTDISCONNECT () DECLARE FUNCTION BESTFIT! (SLOPE!, OFFSETS!, TSIM!(), NUMPTS%, ERRO!()) 'Library fn. Calculates besfit line and max error DECLARE FUNCTION CJCCAL$ () 'Calibrate ambient temp sensor DECLARE FUNCTION FAILS% (STATUS$()) 'Tests for failed tests DECLARE FUNCTION FREQRESP$ (GENAMPL!) 'Performs Frequency response Test DECLARE FUNCTION GAINCAL$ (cal%, CONTRES!, PFSMEAS!, INTERACT!, DELTAOS!) 'Performs Gain Calibration DECLARE FUNCTION GAINCALINT$ (cal%) DECLARE FUNCTION GAINERR! (cal%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!) DECLARE FUNCTION GENATTENR! () 'Calculate fn gen attenuator DECLARE FUNCTION GETTHID% () 'Library fn. Get test head id # DECLARE FUNCTION IEXC1$ (IEXCSENSE!) 'Measure excitation I source #1 DECLARE FUNCTION IEXC2$ (IEXCSENSE!) 'Measure excitation I source #2 DECLARE FUNCTION IMATCH$ (I1$, I2$) 'Check current source matching DECLARE FUNCTION INPUTR$ () 'Performs Input Resistance Test DECLARE FUNCTION Iout! (SENOUT!) 'Calculates transmitter output for a given input DECLARE FUNCTION KEYBDIN$ () 'Library fn. Get keyboard input DECLARE FUNCTION LEADREFF$ (TOTLRESPEC!) 'Measure lead resistance effects DECLARE FUNCTION LINTEST$ (ACC$, CONTRES!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ERRORA$()) 'Performs Accuracy and Linearity Tests DECLARE FUNCTION LOOPVSEN$ () 'Performs Power Supply Sensitivity DECLARE FUNCTION MEASRES! (OHM!, RESNUM%, TE$) 'Measure loop current sense resistor DECLARE FUNCTION MENU0% () 'Choose model family to test DECLARE FUNCTION MENU1% () 'Gets the Test Group selection DECLARE FUNCTION MENU2% () 'Gets the individual test # DECLARE FUNCTION MENU3% () 'Gets the transmitter family DECLARE FUNCTION MINLOOPV$ () 'check operation at min loop V DECLARE FUNCTION MAXLOOPV$ () 'check operation at max loop V DECLARE FUNCTION OFFSETCAL$ (cal%, CONTRES!) 'Performs Offset Calibration DECLARE FUNCTION OFFSETERR! (cal%, CONTRES!) DECLARE FUNCTION OPENTC$ () 'Measure open thermocouple response DECLARE FUNCTION OUTNOISE$ () 'Performs Output Noise Test DECLARE FUNCTION OVERRANGE$ () 'Measure over-range current DECLARE FUNCTION PARASITICTCV! (VCJC!) 'Measure VCJC and calculate PTC DECLARE FUNCTION POWERIO$ (ADDR%, CMD$) 'Library fn. Kepco DPS power supply I/O DECLARE FUNCTION READDVM! (TOL!) 'Library fn. Reads Fluke meter to TOL! DECLARE FUNCTION READGPIB$ (ADDR%, CMD$) DECLARE FUNCTION REPEAT$ (N$) 'Ask if you would like to repeat test DECLARE FUNCTION RTDOHMS! (TEMP!, SENTYPE$) 'Library fn. Convert RTD in temp to ohms DECLARE FUNCTION RTDTEMP! (OHMS!, SENTYPE$) 'Library fn. Convert RTD ohms to temp DECLARE FUNCTION SENSORIEXC$ (PERCFS%) 'Measures the resistor input exc. current DECLARE FUNCTION SENSORIN! (PVIN!, PTCV!) 'Calculates sensor input DECLARE FUNCTION SENSORNUM% () 'Assign a number to each sensor type DECLARE FUNCTION SENSOROUT! (PVIN!, PTCV!) 'Calculates transmitter input DECLARE FUNCTION SETAC! (ONOFF%, GENAMPL!) 'Sets AC in Off or On DECLARE FUNCTION SETATTEN% (VOLTAGE!) 'Library fn. Sets test head R/2R ladder DECLARE FUNCTION SETCURRENTIN! (MODIN!) 'Set input current source DECLARE FUNCTION SETPOWER$ (ADDR%, VSUPPLY!, FUNC$) 'Library fn. Sets supply voltage DECLARE FUNCTION STEPRESP$ () 'Performs Step Response Test DECLARE FUNCTION STRINGVAL% (A$) 'Library fn. DECLARE FUNCTION SUPPLYI$ (EXCL%) 'Measure transmitter supply current DECLARE FUNCTION TCTEMP! (TCV!, SENTYPE$) 'Library fn. Convert TC volts to deg. C DECLARE FUNCTION TCVOLTS! (TEMP!, TCTYPE$) 'Library fn. Convert TC in temp to V DECLARE FUNCTION UNDERRANGE$ () 'Measure under-range current DECLARE FUNCTION UPSN$ (SN$) 'Increments dash# of serial# 'Database Record defintion for the specifications TYPE DBASE MODNAME AS STRING * 14 'SCT1P47X-XXXX, DSCT47X-XXXX SENTYPE AS STRING * 7 'mV, V, mA, xTC, xxRTDxW MININ AS SINGLE MAXIN AS SINGLE IEXCMFS AS SINGLE IEXCPFS AS SINGLE RCONV AS SINGLE MINOUT AS SINGLE MAXOUT AS SINGLE OSCALPT AS SINGLE GNCALPT AS SINGLE LINEAR AS SINGLE ACCURACY AS SINGLE TESTFREQ AS INTEGER ATTEN AS INTEGER ATTENTOL AS INTEGER STEPRMIN AS SINGLE STEPRMAX AS SINGLE OUTNOISE AS SINGLE INPUTRES AS SINGLE IOPENTC AS SINGLE LEADRERR AS SINGLE LINEARIZED AS INTEGER '1 = linearized, 0 = non-linearized OSCALIN AS SINGLE 'input for offset calibration GNCALIN AS SINGLE 'input for gain calibration BANDWIDTH AS SINGLE 'filter -3dB point IMATCHTOL AS SINGLE 'current source matching tolerance CALTOL AS SINGLE 'Calibration tolerance VSEN AS SINGLE 'Loop voltage sensitivity END TYPE TYPE DBASE2 RECNUM AS INTEGER MODNAME AS STRING * 14 END TYPE '$INCLUDE: 'QB.BI2' 'define common variables COMMON SHARED /SAMPLE/ SPECS AS DBASE, SORTDATA1 AS DBASE2, SORTDATA2 AS DBASE2 COMMON SHARED /SAMPLE/ PON%, RSENSE!, SN$, LOGDAT%, IINSEN.MEAS! COMMON SHARED CB0VAL%, CB1VAL%, CB2VAL%, CB3VAL% COMMON SHARED MAINMAX!, MAINMIN!, VERNMAX!, VERNMIN! COMMON SHARED BADDRS%, LPTADDR%, MUXADDR%, THADDR%, PSADDR%, VINADDR% COMMON SHARED PSPORT%, DVMADDR%, GENADDR% COMMON SHARED DPSPSADDR%, DPSVINADDR%, ABCPSADDR%, ABCVINADDR% COMMON SHARED PSMODEL$, VINMODEL$ COMMON SHARED TH$ COMMON SHARED /PRTSCR/ inreg AS RegType, outreg AS RegType 'assign constants to Fluke meter commands CONST OHM4$ = "F4", OHM2$ = "F3", VODC$ = "F1", VOAC$ = "F2", MADC$ = "F5" 'assign constants to test head variables CONST CB0% = 0, CB1% = 1, CB2% = 2, CB3% = 3 'control bank addresses CONST CON% = 1, COFF% = 0 'channel 'on' defined as '1' 'off' defined as '0' 'CONST DVMADDR% = 1 'GPIB address of Fluke 8842A meter 'assign constants to Kepco DPS power 'supply commands CONST VOLT$ = "STV=", LOOPON$ = "SOP=ON", LOOPOFF$ = "SOP=OFF" CONST CURRENT$ = "RTC", ISTAT$ = "RCS" 'CONST PSADDR% = 1 'Power supply for transmitter power 'CONST VINADDR% = 2 'Power supply for high voltage signal input 'assign specifications which are constant for all transmitters CONST IINSEN! = 250 'Input current source sense resistor, 250ohm CONST ICL! = .036 'Max. loop current (over current limit) CONST LPSEN! = 250 'Loop current sense resistor, 250 ohm CONST IEXCSEN! = 2500 'Iexc sense resistor, 2.5Kohm CONST IUR1! = .0015 'Min under-range current (A) CONST IUR2! = .0038 'Max under-range current (A) CONST RSERIES! = 5100000! '5.1M ohm, test head series input R CONST RFNGN! = 6800 'Function generator attenuator series R, 6.8Kohm CONST ERRFACT! = 1'2 changed 7/10/12 TSO 'Max error in offset allowed (factor) '******************* Test Titles and Units ***************************************** LINES: DATA "Under-range Limit","mA","Over-range Limit","mA" DATA "Error @ Vloop = 10.8V","%","Error @ Vloop = 60V","%" DATA "Minus f.s. Exc. Current","uA","Plus f.s. Exc. Current","uA" DATA "Current Source Matching","%","Linearity / Conformity","%" DATA "Accuracy","%","Lead Resistance Effects","C/ohm" DATA "Loop Voltage Sensitivity","%/V","Input Resistance","Mohm" DATA "Open Thermocouple Response","mA","Frequency Response","dB" DATA "Step Response","%","Output Noise","uArms" FUNCTION MAXLOOPV$ 'Test transmitter operation at maximum loop voltage MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) MINOUT! = SPECS.MINOUT / 1000! 'Convert to A MAXOUT! = SPECS.MAXOUT / 1000! MAXLPVOLT! = 60! 'Max loop v spec is 60V ORANGE! = MAXOUT! - MINOUT! ACC! = 1 'SPECS.ACCURACY '.01 ' 1% OR SPECS.ACCURACY! / 100! CLS TESTTITLE$ = "Maximum Loop Voltage Test" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 PRINT "Testing, please wait." SNM% = SENSORNUM% IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL OHMSET(MAXIN!) 'Set Rin for +f.s input ELSE IF SNM% = 2 THEN A! = SETCURRENTIN!(MAXIN!) ELSE CALL SETDAC(MAXIN!, 1, 0) END IF END IF SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) 'Sets up Meter ILOOP1! = READDVM(.0001) / RSENSE! 'Loop current in A ' SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Turn off loop power for range switch ' CALL PAUSE(.5) SL$ = SETPOWER$(PSADDR%, MAXLPVOLT! + ILOOP1! * RSENSE!, FUNC$) 'Set tx voltage to 100V '0.5V resolution IF SETPOWER$(PSADDR%, 999!, ISTAT$) = "RCS=01" THEN 'Check for over-current SL$ = SETPOWER$(PSADDR%, MAXLPVOLT! + ILOOP1! * RSENSE!, FUNC$) 'Set tx voltage to 100V END IF ILOOP2! = READDVM(.0001) / RSENSE! 'Loop current in A CALL LOADMUX(2, COFF%) 'Clear mux lines SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V IF SETPOWER$(PSADDR%, 999!, ISTAT$) = "RCS=01" THEN 'Check for over-current SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set tx voltage to 24.0V END IF DELTAIO! = (ILOOP2! - ILOOP1!) / ORANGE! * 100 '% IF ABS(DELTAIO!) <= ACC! THEN LPSTAT$ = "PASS" ELSE LPSTAT$ = "FAIL" SOUND 1000, .5 END IF LOCATE 10, 10 PRINT "Status: "; LPSTAT$; PRINT SPC(20); PRINT TAB(10); USING "Measured change in Iout at Vloop = ### V is"; MAXLPVOLT!; PRINT TAB(55); USING " ###.### %"; DELTAIO! PRINT TAB(10); "Required change in current is"; PRINT TAB(55); USING "+/- #.### %"; ACC! MAXLOOPV$ = LPSTAT$ + STR$(DELTAIO!) + "3" '3 decimal places in display CALL RESETTH 'Reset test head CALL PAUSE(1!) END FUNCTION FUNCTION MEASRES! (OHM!, RESNUM%, TE$) 'Measure specified resistance 'Legend: 'RESNUM% Resistor '------- -------- ' 1 Loop current sense resistor, 250 ohm ' 2 Iexc sense resistor, RTD or pot input, 2.5Kohm ' 3 Simulated sensor input, RTD or pot, 8-20Mohm ' 4 Contact resistance, RTD or pot input, milli-ohm ' 5 Current source sense resistor, 250 ohm ' 6 Simulated sensor input, RDAC test SELECT CASE RESNUM% 'Branches to the specific measurement CASE 1 CB3VAL% = CB3VAL% AND &HF7 '1 1 1 1 0 1 1 1 CALL SETTH(CB3VAL%, CB3%) 'Disconnect Rsense from loop CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter CALL LOADMUX(2, CON%) 'Sets mux channel IF TE$ = "TE1088" THEN CALL LOADMUX(6, CON%) 'set sense channel for the voltage input test head ELSE CALL LOADMUX(7, CON%) 'set sense channel for the resistance input test head END IF MEASTOL! = .0001 '0.01% measurement tolerance INITTOL! = .05 '5% initial tolerance CASE 2 CALL WRITEDVM(OHM2$, OHM! / 1000) 'Sets meter CALL LOADMUX(4, CON%) 'Sets mux channel MEASTOL! = .001 '0.1% measurement tolerance INITTOL! = .05 '5% initial tolerance CASE 3 CALL SETTEST(7) 'Open series relay CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter CALL LOADMUX(1, CON%) 'Sets mux channel CALL LOADMUX(8, CON%) 'set sense channel MEASTOL! = .00005 '0.005% measurement tolerance INITTOL! = .15 '15% initial tolerance CASE 4 CALL OHMSET(1E+10) 'Open all relays CALL SETTEST(3) 'Measure contact resistance CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter CALL LOADMUX(1, CON%) 'Sets mux channel CALL LOADMUX(6, CON%) 'set sense channel MEASTOL! = .00005 '0.005% measurement tolerance INITTOL! = .15 '15% initial tolerance CASE 5 CALL SETTH((CB1VAL% OR &HC0), CB1%) 'Clear R/2R ladder CALL SETTH((CB2VAL% OR &HFF), CB2%) CALL SETTH((CB3VAL% OR &H20), CB3%) 'Disable input current source '0 0 1 0 0 0 0 0 CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter CALL LOADMUX(7, CON%) 'Sets mux channel CALL LOADMUX(8, CON%) 'set sense channel MEASTOL! = .00001 '0.001% measurement tolerance INITTOL! = .05 '5% initial tolerance CASE 6 CALL SETTEST(7) 'Open series relay IF OHM! < 1000 THEN CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter CALL LOADMUX(1, CON%) 'Sets mux channel CALL LOADMUX(8, CON%) 'set sense channel ELSE CALL WRITEDVM(OHM2$, OHM! / 1000) 'Sets meter CALL LOADMUX(1, CON%) 'Sets mux channel END IF INITTOL! = .05 '5% initial tolerance MEASTOL! = .0005 '0.05% measurement tolerance END SELECT TEMP! = READDVM!(OHM! * MEASTOL!) 'Measure resistor value IF OHM! > 1! AND ABS(TEMP! - OHM!) > (OHM! * INITTOL!) THEN 'Test for deviation CLS LOCATE 10, 10 PRINT "Measured resistance = "; TEMP!; " ohms." PRINT TAB(10); USING "Required resistance = #######.## ohms to #######.## ohms"; OHM! * (1 - INITTOL!); OHM! * (1 + INITTOL!) PRINT TAB(10); "Check system setup and restart program." PRINT TAB(10); "If the failure continues, notify engineering." END END IF IF RESNUM% = 1 THEN CB3VAL% = CB3VAL% OR &H8 '0 0 0 0 1 0 0 0 CALL SETTH(CB3VAL%, CB3%) 'Connect Rsense to loop ELSEIF RESNUM% = 3 THEN CALL SETTEST(2) 'Reset to standard operation ELSEIF RESNUM% = 4 THEN CALL LOADMUX(0, CON%) 'Clears mux CALL SETTEST(2) IF TEMP! > 1 THEN 'Contact res. out of spec PRINT PRINT TAB(10); "Contact resistance = "; TEMP!; "ohms." PRINT TAB(10); "This test head requires repair." PRINT TAB(10); "Please notify engineering." CALL CONTINUE END END IF END IF IF RESNUM% <> 6 THEN CALL WRITEDVM(VODC$, 1!) 'Resets meter CALL LOADMUX(0, CON%) 'Clears mux MEASRES! = TEMP! 'Passes resistor value back END FUNCTION FUNCTION MENU0% ' ***** PROGRAM CONTROL MENU 0 ***** CLS LOCATE 5, 16 COLOR 14, 0, 0 PRINT "DSCTxx-xx and SCMHVAS-Mxxx AUTOMATED TEST EQUIPMENT" PRINT TAB(15); "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" LOCATE 8 COLOR 15, 0, 0 PRINT TAB(20); "Please select the TYPE of module to test" PRINT COLOR 11, 0, 0 PRINT TAB(22); "1.) DSCT Testing" PRINT TAB(22); "2.) SCMHVAS Testing" PRINT TAB(22); "3.) Return to the FAMILY TYPE menu" LOCATE 22 PRINT TAB(16); "Press the F10 key at any time to exit the program." DO A$ = INKEY$ LOOP WHILE VAL(A$) < 1 OR VAL(A$) > 3 MENU0% = VAL(A$) END FUNCTION FUNCTION MENU1% ' ***** PROGRAM CONTROL MENU 1 ***** CLS LOCATE 5, 24 COLOR 14, 0, 0 PRINT "DSCTxx-xx AUTOMATED TEST EQUIPMENT" PRINT TAB(18); "----------------------------------------------" PRINT TAB(18); "*************** TEST TYPE MENU ***************" PRINT TAB(18); "==============================================" LOCATE 9 COLOR 11, 0, 0 PRINT TAB(22); "1.) Functional Test" PRINT TAB(22); "2.) Pre-Burn In Complete Test (NO printout)" PRINT TAB(22); "3.) Post-Burn In Complete Test (PRINT results)" PRINT TAB(22); "4.) Sealed Module Retest (Print Results, No Adjustments)" PRINT TAB(22); "5.) Individual Test Menu" PRINT TAB(22); "6.) Offset/Gain Calibration" PRINT TAB(22); "7.) Exit to the DSCT Main Menu" PRINT PRINT COLOR 15, 0, 0 PRINT TAB(16); "Press the F9 key at any time to return to this menu" PRINT TAB(16); "Press the F10 key at any time to exit the program" COLOR 11, 0, 0 DO I$ = INKEY$ LOOP WHILE VAL(I$) < 1 OR VAL(I$) > 7 MENU1% = VAL(I$) END FUNCTION FUNCTION MENU2% CLS LOCATE 2, 24 COLOR 14, 0, 0 PRINT "DSCTxx-xx AUTOMATED TEST EQUIPMENT" PRINT TAB(18); "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" LOCATE 4, 12 COLOR 11, 0, 0 PRINT "1.) Under-range Test" PRINT TAB(12); "2.) Over-range Test" PRINT TAB(12); "3.) Minimum Loop Voltage Test" PRINT TAB(12); "4.) Maximum Loop Voltage Test" PRINT TAB(12); "5.) Ambient Temp. Sensor Calibration (DSCT37, 47 ONLY)" PRINT TAB(12); "6.) Current Source Operation & Matching (DSCT34, 36 ONLY)" PRINT TAB(12); "7.) Offset & Gain Calibration" PRINT TAB(12); "8.) Linearity / Accuracy Test" PRINT TAB(12); "9.) Lead Resistance Effects Test (DSCT34, 36 ONLY)" PRINT TAB(12); "A.) Loop Voltage Sensitivity Test" PRINT TAB(12); "B.) Input Resistance & Bias Current (DSCT30, 31 ONLY)" PRINT TAB(12); "C.) Open Thermocouple Detect Test (DSCT37, 47 ONLY)" PRINT TAB(12); "D.) Frequency Response Test" PRINT TAB(12); "E.) Step Response Test" PRINT TAB(12); "F.) Output Noise Test" PRINT TAB(12); "G.) Notes On ATE Operation" PRINT TAB(12); "H.) Printer Output = "; IF PON% > 0 THEN PRINT "ON" ELSE PRINT "OFF" END IF PRINT TAB(12); "I.) Log Linearity Test Data = "; IF LOGDAT% > 0 THEN PRINT "ON" ELSE PRINT "OFF" END IF PRINT TAB(12); "J.) Exit to the DSCT Main Menu" PRINT PRINT TAB(12); "Enter your selection. " DO DO I$ = UCASE$(INKEY$) LOOP WHILE I$ = "" C% = ASC(I$) LOOP WHILE (C% < 49 OR C% > 57) AND (C% < 65 OR C% > 75) IF C% > 57 THEN MENU2% = C% - 55 ELSE MENU2% = C% - 48 END IF END FUNCTION FUNCTION MENU3% CLS LOCATE , 21 COLOR 14, 0, 0 PRINT "Module Family Selection Menu" PRINT TAB(21); "----------------------------" PRINT COLOR 11, 0, 0 PRINT TAB(32); "1.) DSCT30-xx" PRINT TAB(32); "2.) DSCT31-xx" PRINT TAB(32); "3.) DSCT32-xx" PRINT TAB(32); "4.) DSCT34-xx" PRINT TAB(32); "5.) DSCT36-xx" PRINT TAB(32); "6.) DSCT37-xx" PRINT TAB(32); "7.) DSCT47x-xx" PRINT TAB(32); "8.) Exit" DO A$ = INKEY$ M3% = VAL(A$) LOOP WHILE M3% < 1 OR M3% > 8 M3% = M3% + 1 IF M3% = 5 OR M3% = 6 THEN 'Parallel port, mux & test head addresses TE$ = "TE1089" 'Resistance input test head FILENAME$ = "KSCTRIN.ADR" ELSE TE$ = "TE1088" 'Voltage/current input test head FILENAME$ = "KSCTVIN.ADR" 'Parallel port, mux & test head addresses END IF CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address MENU3% = M3% END FUNCTION FUNCTION MINLOOPV$ 'Test transmitter operation at minimum loop voltage MININ! = SENSOROUT!(SPECS.MININ, 0) MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) MINOUT! = SPECS.MINOUT / 1000! 'Convert to A MAXOUT! = SPECS.MAXOUT / 1000! MINLPVOLT! = 10.8 'Minimum loop v spec is 10.8V INITTOL! = .32 '32% initial gain error allowed '16% o.s. & 16% gain error, non-calibrated unit IOUTTOL! = .01 '1% loop current tolerance, Vloop = 20V TESTTOL! = 2 '2% test tolerance ACCTOL! = 1 ' SPECS.ACCURACY INRANGE! = MAXIN! - MININ! ORANGE! = MAXOUT! - MINOUT! 'Output range in A XFERCHAR! = ORANGE! / INRANGE! 'Gain in A/V, or A/ohm CLS TESTTITLE$ = "Minimum Loop Voltage Test" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 PRINT "Testing, please wait." SNM% = SENSORNUM% IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL OHMSET(MAXIN!) 'Set Rin for +f.s input ELSE IF SNM% = 2 THEN A! = SETCURRENTIN!(MAXIN!) ELSE CALL SETDAC(MAXIN!, 1, 0) END IF END IF CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) 'Sets up Meter ILOOPMAX! = READDVM(.001) / RSENSE! 'Loop current in A CALL LOADMUX(2, COFF%) IF (ILOOPMAX! - MAXOUT!) > MAXOUT! * INITTOL! THEN PRINT TAB(10); USING "Loop current = ##.# mA"; ILOOPMAX! * 1000 PRINT TAB(10); "Transmitter is not working properly." CALL PAUSE(1!) EXIT FUNCTION END IF 'Adjust input voltage for 20mA +/-1% loop current. This adjustment 'allows the testing of uncalibrated transmitters N% = 0 WHILE ABS(ILOOPMAX! - MAXOUT!) > MAXOUT! * IOUTTOL! AND N% < 20 N% = N% + 1 IERR! = ILOOPMAX! - MAXOUT! INRANGE! = INRANGE! - IERR! / XFERCHAR! IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL OHMSET(MININ! + INRANGE!) 'Adjust input ELSE 'Fine adjustment not possible 'with high voltage power supply '0.5V resolution. IF MININ! + INRANGE! > 10 THEN MAXOUT! = ILOOPMAX! N% = 20 ELSE CALL SETDAC(MININ! + INRANGE!, 1, 0) 'Adjust input END IF END IF CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) 'Sets up Meter ILOOPMAX! = READDVM(.0001) / RSENSE! CALL LOADMUX(2, COFF%) WEND SL$ = SETPOWER$(PSADDR%, MINLPVOLT! + ILOOPMAX! * RSENSE! + .5, FUNC$) 'Set tx voltage to 10.8V '0.5V resolution CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) 'Sets up Meter ILOOP! = READDVM(.0001) / RSENSE! CALL LOADMUX(2, COFF%) 'Iout is +/-1%, allow another +/-1% variation 'DELTAIO! = (ILOOP! - MAXOUT!) / ORANGE! * 100! DELTAIO! = (ILOOP! - ILOOPMAX!) / ORANGE! * 100! 'IF ABS(DELTAIO!) <= TESTTOL! THEN IF ABS(DELTAIO!) <= ACCTOL! THEN LPSTAT$ = "PASS" ELSE LPSTAT$ = "FAIL" SOUND 1000, .5 END IF LOCATE 10, 10 PRINT "Status: "; LPSTAT$; PRINT SPC(20); PRINT TAB(10); USING "Measured change in Iout at Vloop = ## V is"; MINLPVOLT!; PRINT TAB(55); USING " ###.### %"; DELTAIO! PRINT TAB(10); "Required change in Iout is"; PRINT TAB(55); USING "+/- #.### %"; ACCTOL! MINLOOPV$ = LPSTAT$ + STR$(DELTAIO!) + "3" '3 decimal places in display CALL RESETTH 'Reset test head CALL PAUSE(1!) END FUNCTION SUB MODOUTLINE 'print a bottom view of the module showing potentiometer location LOCATE 3, 25 PRINT CHR$(201) FOR A = 4 TO 5 ' print left vertical line LOCATE A, 25 PRINT CHR$(186) NEXT A LOCATE 6, 25 PRINT CHR$(200) FOR A = 26 TO 54 ' print top horizontal line LOCATE 3, A PRINT CHR$(205) NEXT A LOCATE 3, 55 PRINT CHR$(187) FOR A = 4 TO 5 ' print right vertical line LOCATE A, 55 PRINT CHR$(186) NEXT A LOCATE 6, 55 PRINT CHR$(188) FOR A = 26 TO 54 ' print bottom horizontal line LOCATE 6, A PRINT CHR$(205) NEXT A LOCATE 5, 36 PRINT CHR$(233) LOCATE 5, 44 PRINT CHR$(233) LOCATE 4, 34 PRINT CHR$(233) END SUB SUB NOTES 'Notes on ATE operation CLS LOCATE 5, 25 PRINT "AUTOMATED TEST EQUIPMENT NOTES" PRINT PRINT TAB(10); "1.) During the calibration subroutines the following keystrokes" PRINT TAB(14); "can be used:" PRINT PRINT TAB(14); "(C)alibrate will exit the routine and continue" PRINT TAB(14); "program execution." PRINT PRINT TAB(14); "(T)roubleshoot will pause the program. The DVM will continuously" PRINT TAB(14); "display the calibration reading." PRINT PRINT TAB(10); "2.) Press (F10) at any time to break out of the program and" PRINT TAB(14); "return to DOS." CALL CONTINUE END SUB FUNCTION OFFSETCAL$ (cal%, CONTRES!) 'Calibrate transmitter offset 'Inputs; calibration flag ' measured contact resistance (used for resistance in only) SENSOR$ = SPECS.SENTYPE MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Used to check for high voltage input MINOUT! = SPECS.MINOUT / 1000! 'Convert to A MAXOUT! = SPECS.MAXOUT / 1000! 'Convert to A CALOS! = SPECS.OSCALPT / 100! 'Convert from % INITTOL! = 12 'Uncalibrated offset tolerance CALTOL! = SPECS.CALTOL 'Calibration tolerance (% span) OSCALIN! = SPECS.OSCALIN 'transmitter input for offset calibration GNCALIN! = SPECS.GNCALIN 'transmitter input for gain calibration BANDWIDTH! = SPECS.BANDWIDTH LIN% = SPECS.LINEARIZED SNM% = SENSORNUM% ORANGE! = MAXOUT! - MINOUT! 'Output range (V) IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN CALSPAN! = Iout!(SENSOROUT!(GNCALIN!, 0)) - Iout!(SENSOROUT!(OSCALIN!, 0)) 'Adjustment range is +/- x% of +f.s. 'Output not linear w/ input ELSE 'temperature. CALSPAN! = Iout!(GNCALIN!) - Iout!(OSCALIN!) 'Adjustment range is +/- x% of +f.s. END IF CLS TESTTITLE$ = "Offset Calibration" CALL HEADERB(TESTTITLE$) CALL MODOUTLINE LOCATE 7 PRINT TAB(36); CHR$(24); PRINT TAB(26); "OFFSET POTENTIOMETER"; IF cal% = 2 THEN ZERROR! = INITTOL! 'Offset tolerance for func. test (%) TOL! = .0001 'Measurement tolerance, 1 pass test ELSE ZERROR! = CALTOL! 'Offset calibration tolerance (%) TOL! = 0! END IF IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in MININ! = SENSOROUT!(OSCALIN!, 0) 'Calc. +f.s. ohms CALL OHMSET(MININ!) 'Set -f.s. input END IF DO TIME1! = TIMER 'Start timer LOCATE 10, 10 PRINT TAB(10); "Measuring input. Please wait..." IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in IF cal% = 0 THEN CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply MININMEAS! = MEASRES!(MININ!, 3, "") + CONTRES! 'Measure simulated resistor SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V PAUSE (1)'(2) ELSE SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V IF SNM% = 3 THEN PTCV! = PARASITICTCV!(VCJC!) IF VCJC! = 99! THEN EXIT FUNCTION END IF MININ! = SENSOROUT!(OSCALIN!, PTCV!) 'Calc. minin volts, meas. vcjc IF SNM% = 2 THEN MININMEAS! = SETCURRENTIN!(MININ!) ELSE CALL SETDAC(MININ!, 1, 0) 'Sets DAC IF cal% = 0 OR ABS(MININ!) > 10! THEN 'Always measure high voltage 'input to get exact reading CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy CALL LOADMUX(1, CON%) CALL WRITEDVM(VODC$, MININ!) 'Sets meter to read MININMEAS! = READDVM!(MININ! * .0002) '0.02% tolerance CALL LOADMUX(1, COFF%) ELSE MININMEAS! = MININ! END IF END IF END IF CALL WRITEDVM("S1", 0) 'Medium reading rate IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN IOUTCALC! = Iout!(MININMEAS! + PTCV!) + CALOS! * ORANGE! 'Output not linear w/ input ELSE 'temperature. IOUTCALC! = Iout!(SENSORIN!(MININMEAS!, PTCV!)) + CALOS! * ORANGE! END IF CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, (IOUTCALC! + CALSPAN! * INITTOL / 100!) * RSENSE!) 'Scale meter CALL PAUSE(1!)'(2!) 'Wait for output to settle. LOCATE 10, 10 PRINT "Offset Error ="; PRINT SPC(20); L% = 0 DO L% = L% + 1 ERRORPERC! = (READDVM!(TOL!) / RSENSE! - IOUTCALC!) / ORANGE! * 100! 'Error (%) LOCATE 10, 24 PRINT USING "+###.### %"; ERRORPERC! LOCATE 15, 10 IF cal% > 0 THEN CONREADS% = 5 ELSEIF ABS(ERRORPERC!) < ZERROR! THEN SOUND 200, .5 PRINT "Stop turning offset potentiometer " CONREADS% = CONREADS% + 1 ELSEIF ERRORPERC! < 0 THEN PRINT "Turn offset potentiometer clockwise " CONREADS% = 0 ELSE PRINT "Turn offset potentiometer counter-clockwise" CONREADS% = 0 END IF LOCATE 20, 10 A$ = INKEY$ IF UCASE$(A$) = "T" THEN PRINT TAB(10); "Trouble Shooting Mode" CALL WRITEDVM("*", IOUTCALC! * RSENSE!) CALL CONTINUE CALL WRITEDVM("*T2S1", 0) 'Initialize Fluke meter LOCATE 20, 10 PRINT SPC(22); ELSEIF UCASE$(A$) = "C" THEN CONREADS% = 5 END IF 're-measure input 'once every 40 cycles CALL PAUSE(.2) 'Slow down loop LOOP WHILE CONREADS% < 5 AND L% < 150 CALL LOADMUX(2, COFF%) ' IF CAL% = 0 OR MAXIN! > 10! THEN ' CALL WRITEDVM("S1", 0) 'Medium reading rate ' END IF LOOP WHILE CONREADS% < 5 IF ABS(ERRORPERC!) <= ZERROR! THEN OFF$ = "PASS" ELSE OFF$ = "FAIL" SOUND 1000, .5 END IF LOCATE 15, 10 PRINT "Status: "; OFF$; PRINT SPC(31); PRINT TAB(10); "Offset calibration error is"; PRINT TAB(50); USING " +###.### %"; ERRORPERC! PRINT TAB(10); "Max. offset calibration error is"; PRINT TAB(50); USING "+/-###.### %"; ZERROR! OFFSETCAL$ = OFF$ + STR$(ERRORMV!) CALL RESETTH 'Reset the test head CALL PAUSE(1) END FUNCTION FUNCTION OFFSETERR! (cal%, CONTRES!) 'Calibrate transmitter offset 'Inputs; calibration flag ' measured contact resistance (used for resistance in only) SENSOR$ = SPECS.SENTYPE MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Used to check for high voltage input MINOUT! = SPECS.MINOUT / 1000! 'Convert to A MAXOUT! = SPECS.MAXOUT / 1000! 'Convert to A CALOS! = SPECS.OSCALPT / 100! 'Convert from % INITTOL! = 12 'Uncalibrated offset tolerance CALTOL! = SPECS.CALTOL 'Calibration tolerance (% span) OSCALIN! = SPECS.OSCALIN 'transmitter input for offset calibration GNCALIN! = SPECS.GNCALIN 'transmitter input for gain calibration BANDWIDTH! = SPECS.BANDWIDTH LIN% = SPECS.LINEARIZED SNM% = SENSORNUM% ORANGE! = MAXOUT! - MINOUT! 'Output range (V) IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN CALSPAN! = Iout!(SENSOROUT!(GNCALIN!, 0)) - Iout!(SENSOROUT!(OSCALIN!, 0)) 'Adjustment range is +/- x% of +f.s. 'Output not linear w/ input ELSE 'temperature. CALSPAN! = Iout!(GNCALIN!) - Iout!(OSCALIN!) 'Adjustment range is +/- x% of +f.s. END IF CLS TESTTITLE$ = "Offset Calibration Verification" CALL HEADERB(TESTTITLE$) ZERROR! = CALTOL! * ERRFACT! 'Offset calibration tolerance (%) * factor TOL! = 0! IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in MININ! = SENSOROUT!(OSCALIN!, 0) 'Calc. +f.s. ohms CALL OHMSET(MININ!) 'Set -f.s. input END IF LOCATE 10, 10 PRINT TAB(10); "Measuring input. Please wait..." IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in IF cal% = 0 THEN CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply MININMEAS! = MEASRES!(MININ!, 3, "") + CONTRES! 'Measure simulated resistor SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V PAUSE (1)'(2) ELSE SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V IF SNM% = 3 THEN PTCV! = PARASITICTCV!(VCJC!) IF VCJC! = 99! THEN EXIT FUNCTION END IF MININ! = SENSOROUT!(OSCALIN!, PTCV!) 'Calc. minin volts, meas. vcjc IF SNM% = 2 THEN MININMEAS! = SETCURRENTIN!(MININ!) ELSE CALL SETDAC(MININ!, 1, 0) 'Sets DAC IF cal% = 0 OR ABS(MININ!) > 10! THEN 'Always measure high voltage 'input to get exact reading CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy CALL LOADMUX(1, CON%) CALL WRITEDVM(VODC$, MININ!) 'Sets meter to read MININMEAS! = READDVM!(MININ! * .0002) '0.02% tolerance CALL LOADMUX(1, COFF%) ELSE MININMEAS! = MININ! END IF END IF END IF CALL WRITEDVM("S1", 0) 'Medium reading rate IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN IOUTCALC! = Iout!(MININMEAS! + PTCV!) + CALOS! * ORANGE! 'Output not linear w/ input ELSE 'temperature. IOUTCALC! = Iout!(SENSORIN!(MININMEAS!, PTCV!)) + CALOS! * ORANGE! END IF CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, (IOUTCALC! + CALSPAN! * INITTOL / 100!) * RSENSE!) 'Scale meter CALL PAUSE(1!)'(2!) 'Wait for output to settle. LOCATE 10, 10 PRINT "Offset Error ="; PRINT SPC(20); DO ERRORPERC! = (READDVM!(TOL!) / RSENSE! - IOUTCALC!) / ORANGE! * 100! 'Error (%) LOCATE 10, 24 PRINT USING "+###.### %"; ERRORPERC! SOUND 200, .5 CONREADS% = CONREADS% + 1 LOCATE 20, 10 A$ = INKEY$ IF UCASE$(A$) = "T" THEN PRINT TAB(10); "Trouble Shooting Mode" CALL WRITEDVM("*", IOUTCALC! * RSENSE!) CALL CONTINUE LOCATE 20, 10 PRINT SPC(22); ELSEIF UCASE$(A$) = "C" THEN CONREADS% = 5 END IF 're-measure input 'once every 40 cycles CALL PAUSE(.2) 'Slow down loop LOOP WHILE CONREADS% < 5 IF ABS(ERRORPERC!) <= ZERROR! THEN OFF$ = "PASS" ELSE OFF$ = "FAIL" SOUND 1000, .5 END IF LOCATE 15, 10 PRINT "Status: "; OFF$; PRINT SPC(31); PRINT TAB(10); "Offset calibration error is"; PRINT TAB(50); USING " +###.### %"; ERRORPERC! PRINT TAB(10); "Max. offset calibration error is"; PRINT TAB(50); USING "+/-###.### %"; ZERROR! IF OFF$ = "FAIL" THEN ' PRINT TAB(10); "" ' PRINT TAB(10); "Offset error is bigger than allowed. Software will loop back for recalibration"; PAUSE (.2) END IF OFFSETERR! = ERRORPERC! CALL RESETTH 'Reset the test head CALL PAUSE(.2) '(1) END FUNCTION SUB ONESHOTTEST 'Provide a continuous strobe to test one-shot pulse width 'Trigger line (E07) is on '123 pin 1, S/H pulse is on pin 13 for TE1088. 'Trigger line (E06) is on '123 pin 1, S/H pulse is on pin 13 for TE1089. CALL GETSPECS CLS LOCATE 10, 10 IF TE$ = "TE1088" THEN PRINT TE$ PRINT "Trigger line (E07) is on '123 pin 1, S/H pulse is on pin 13." ELSE 'TE1089 PRINT TE$ PRINT "Trigger line (E06) is on '123 pin 1, S/H pulse is on pin 13." END IF PRINT PRINT "Press any key to exit test" SNM% = SENSORNUM% DO IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CB0VAL% = CB0VAL% AND &HBF '1 0 1 1 1 1 1 1 ELSE CB0VAL% = CB0VAL% AND &H7F '0 1 1 1 1 1 1 1 END IF CALL SETTH(CB0VAL%, CB0%) 'set step relay, k7 'start one-shot 185ms pulse CALL PAUSE(.5) 'wait for pulse IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CB0VAL% = CB0VAL% OR &H40 '0 1 0 0 0 0 0 0 ELSE CB0VAL% = CB0VAL% OR &H80 '1 0 0 0 0 0 0 0 END IF CALL SETTH(CB0VAL%, CB0%) 'reset test I$ = INKEY$ LOOP WHILE I$ = "" END SUB FUNCTION OPENTC$ MINOUT! = SPECS.MINOUT / 1000 'Convert to A MAXOUT! = SPECS.MAXOUT / 1000 MININ! = SENSOROUT!(SPECS.MININ!, 0) 'Approximate -f.s. in, not including 'parasitic TC SPEC! = SPECS.IOPENTC! / 1000 ORANGE! = MAXOUT! - MINOUT! CLS TESTTITLE$ = "Open Thermocouple Detect Test" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 SNM% = SENSORNUM% IF SNM% < 3 OR SNM% > 4 THEN 'Check for TC in PRINT "This test is not performed on model "; SPECS.MODNAME EXIT FUNCTION ELSE PRINT "Testing, please wait." END IF CALL SETDAC(MININ!, 1, 0) 'Set -f.s. input, zero 'input underranges some transmitters CALL PAUSE(.5) 'Remove short on inputs CALL SETTH(CB0VAL% OR &H8, CB0%) '0 0 0 0 1 0 0 0 CALL SETTH((CB1VAL% OR &HC0), CB1%) 'Clear R/2R ladder CALL SETTH((CB2VAL% OR &HFF), CB2%) CALL PAUSE(2.5) 'Wait 2.5s (spec is 10s) CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) ILOOP! = READDVM!(.001) / RSENSE! 'Loop current (A) 'Use 1mV tolerance in case 'output is still changing. CALL LOADMUX(2, COFF%) IF SPEC! > MAXOUT! THEN 'Check for upscale open TC detect COND$ = ">" IF ILOOP! >= SPEC! THEN OTC$ = "PASS" ELSE OTC$ = "FAIL" SOUND 1000, .5 END IF ELSE 'else downscale open TC detect COND$ = "<" IF ILOOP! <= SPEC! THEN OTC$ = "PASS" ELSE OTC$ = "FAIL" SOUND 1000, .5 END IF END IF LOCATE 10, 10 PRINT "Status: "; OTC$; PRINT SPC(20); PRINT TAB(10); "Open thermocouple response is"; PRINT TAB(50); USING " ##.# mA"; ILOOP! * 1000! PRINT TAB(10); "Required response is"; PRINT TAB(50); USING "& ##.# mA"; COND$; SPEC! * 1000! OPENTC$ = OTC$ + STR$(ILOOP! * 1000!) + "1" CALL RESETTH 'Reset test head CALL PAUSE(1!) END FUNCTION FUNCTION OUTNOISE$ '8842A displays a non-zero reading of < 300 digits in the 200mVAC range. 'This equates to 300uVrms. Typical readings are 150uVrms, but testing of 'several meters shows readings from 90uVrms to 900uVrms. Readings are not 'always consistent between the front panel and rear panel input terminals. 'As long as the voltage being measured is 1000 counts or more (>=1mVrms), the 'reading will be within rated accuracy. However, this is not the case for the 'narrow bandwidth signal conditioners and transmitters. 'The displayed reading is the sum of the squares of the signal, the rms converter 'error and the internally generated noise. 'i.e. Vn,rms = sqr(signal(mVrms)^2 + 0.300^2) 'or signal(mVrms) = SQR(Vn,rms^2 - 0.300^2) 'Assume the typical non-zero error is 200 digits 'This error should also be taken into account when using low value Vrms readings 'to determine filter performance (frequency response test). 'Some 8842A meters read 0 digits of noise on the 2VAC scale (80 digits max). 'In these cases, measured signal conditioner output noise matches that made 'with other test equipment. 'The -3dB bandwidth for AC measurements is 300KHz. Accuracy is specified for 'signals with frequency components up to 100KHz. 'A 100KHz pole has been added to the input leads at the 8842A to eliminate 'high frequency pickup and switching spike amplification from the computers 'and long signal lines. 'Crest factors beyond 3.0 can exceed the 8842A's dynamic range limitations and 'cause large errors. Large crest factors are typical of waveforms with spikes. 'Use caution when measuring waveforms with significant spikes in bandwidths 'less than 300KHz. MININ! = SENSOROUT!(SPECS.OSCALIN, 0) 'Calculate transmitter input SPEC! = SPECS.OUTNOISE / 1000000! 'convert to uA CLS TESTTITLE$ = "Output Noise Test" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 PRINT "Testing, please wait." SNM% = SENSORNUM% IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL OHMSET(MININ!) 'Set -f.s. input ELSE IF SNM% = 2 THEN A! = SETCURRENTIN!(MININ!) ELSE CALL SETDAC(MININ!, 1, 0) END IF END IF CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VOAC$, SPEC! * RSENSE!) 'Sets Fluke VRMS! = READDVM!(.04 * SPEC!) 'Output noise (A) IF VRMS! > .0002 THEN VRMS! = SQR(VRMS! ^ 2 - .0002 ^ 2) 'Account for meter zero-input error END IF IRMS! = VRMS! / RSENSE! 'Output noise (A) CALL LOADMUX(2, COFF%) IF IRMS! <= SPEC! THEN INOISE$ = "PASS" ELSE INOISE$ = "FAIL" SOUND 1000, .5 END IF LOCATE 10, 10 PRINT "Status: "; INOISE$; PRINT SPC(20); PRINT TAB(10); "Measured output noise is"; PRINT TAB(50); USING "###.# uA rms"; IRMS! * 1000000! PRINT TAB(10); "Maximum output noise is"; PRINT TAB(50); USING "###.# uA rms"; SPEC! * 1000000! OUTNOISE$ = INOISE$ + STR$(IRMS! * 1000000!) + "1" 'Convert to uV CALL RESETTH 'Reset test head CALL PAUSE(1!) END FUNCTION FUNCTION OVERRANGE$ 'Test the over-range limit of the transmitter MININ! = SENSOROUT!(SPECS.MININ, 0) MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) MAXOUT! = SPECS.MAXOUT / 1000! 'Convert to A INRANGE! = MAXIN! - MININ! CLS TESTTITLE$ = "Over-Range Test" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 SNM% = SENSORNUM% IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in PRINT "Testing, please wait." OVEROHM! = MAXIN! + .8 * (INRANGE!) 'Set Rin for 80% over-range CALL OHMSET(OVEROHM!) ELSE IF SNM% = 2 THEN OVERI! = MAXIN! + .8 * (INRANGE!) IF OVERI! > 31.5 THEN 'Highest limit current from the test head OVERI! = 31.5 END IF A! = SETCURRENTIN!(OVERI!) ELSE IF MAXIN! + .8 * INRANGE! > 9.75 THEN 'Test voltage is beyond DAC capability PRINT "This test is not performed on model "; SPECS.MODNAME OVERRANGE$ = "PASS" EXIT FUNCTION ELSE PRINT "Testing, please wait." OVERVOLT! = MAXIN! + .8 * INRANGE! 'Set Vin for 80% over-range CALL SETDAC(OVERVOLT!, 1, 0) END IF END IF END IF CALL LOADMUX(2, CON%) 'Measure Vsense 'CALL LOADMUX(1, COFF%) 'incidentally turned on CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) 'Sets up Meter OVERI! = READDVM(.001) / RSENSE! 'Loop current in A CALL LOADMUX(2, COFF%) 'Clear mux lines IF OVERI! < ICL! AND OVERI! > MAXOUT! THEN OISTAT$ = "PASS" ELSE OISTAT$ = "FAIL" SOUND 1000, .5 END IF LOCATE 10, 10 PRINT "Status: "; OISTAT$; PRINT SPC(20); PRINT TAB(10); "Measured over-range current is"; PRINT TAB(50); USING "##.## mA"; OVERI! * 1000 PRINT TAB(10); "Required over-range current is"; PRINT TAB(50); USING "##.## mA to ##.## mA "; MAXOUT! * 1000; ICL! * 1000 OVERRANGE$ = OISTAT$ + STR$(OVERI! * 1000!) + "1" '1 decimal place in display CALL RESETTH 'Reset test head CALL PAUSE(1!) END FUNCTION FUNCTION PARASITICTCV! (VCJC!) 'Measures CJC input to transmitter and calculates compensation voltage to 'be added to transmitter input. SENSOR$ = SPECS.SENTYPE TCTYPE$ = LEFT$(SENSOR$, 1) SEEBECK! = (TCVOLTS!(50!, TCTYPE$) - TCVOLTS!(0!, TCTYPE$)) / 50! VTC25C! = TCVOLTS!(25!, TCTYPE$) 'Calculate TC voltage @ 25C CALL LOADMUX(4, CON%) 'Measure test head CJC output CALL WRITEDVM(VODC$, .5) 'Vcjc(25C) = 0.5100V VCJC! = READDVM(.0001) CALL LOADMUX(4, COFF%) IF ABS(VCJC! - .51) > .05 THEN '+/- 25C error for malfunction SOUND 1000, .5 'This means 0C <= Ta <= 50C PRINT PRINT TAB(10); "TE10302 temperature sensor malfunction." PRINT TAB(10); USING "Vcjc = #.### V"; VCJC! CALL CONTINUE VCJC! = 99! EXIT FUNCTION END IF AMBTEMPDIFF! = (VCJC! - .51) / -.0025 'Temp. difference from 25C. 'PARASITICTCV! = TCVOLTS!(25 + AMBTEMPDIFF!, TCTYPE$) PARASITICTCV! = VTC25C! + AMBTEMPDIFF! * SEEBECK! 'Parasitic TC voltage END FUNCTION SUB REPORT (STATUS$(), TSPEC$()) 'Output format '1 10 20 30 40 50 60 70 80 ' | | | | | | | | ' Parameter Measured Value* Specification Status ' ========================= =============== =================== ====== ' ###### uVrms ## to ### uVrms PASS ' ohm/ohm RESTORE LINES CLS PRINT PRINT TAB(31); "FINAL TEST RESULTS" PRINT PRINT TAB(13); "Parameter"; TAB(32); "Measured Value*"; TAB(52); "Specification "; PRINT TAB(70); "Status" PRINT TAB(5); "========================="; TAB(32); "==============="; PRINT TAB(49); "==================="; TAB(70); "======" IF PON% = 1 THEN LPRINT LPRINT TAB(31); "FINAL TEST RESULTS" LPRINT LPRINT TAB(13); "Parameter"; TAB(32); "Measured Value*"; TAB(52); "Specification "; LPRINT TAB(70); "Status" LPRINT TAB(5); "========================="; TAB(32); "==============="; LPRINT TAB(49); "==================="; TAB(70); "======" END IF FOR X = 1 TO 16 READ A$, B$ IF LEN(STATUS$(X)) > 4 THEN 'Check for test data IF X = 5 AND (SENSORNUM% = 5 OR SENSORNUM% = 7) AND (LEFT$(SPECS.MODNAME, 4) <> "DSCT") THEN A$ = "Excitation Current #1" ELSEIF X = 7 AND (SENSORNUM% = 5 OR SENSORNUM% = 7) AND (LEFT$(SPECS.MODNAME, 4) <> "DSCT") THEN A$ = "Excitation Current #2" END IF PRINT TAB(5); A$; IF PON% = 1 THEN LPRINT TAB(5); A$; 'STATUS$(x) format = ++<# decimal places> ' 4 char. ? char 1 char. DATALEN% = LEN(STATUS$(X)) NUMDATA! = VAL(MID$(STATUS$(X), 5, DATALEN% - 5)) 'print using requested # of decimal places IF X = 10 AND SENSORNUM% = 7 THEN B$ = "ohm/ohm" 'Set proper units END IF IF RIGHT$(STATUS$(X), 1) = "0" THEN PRINT TAB(34); USING "###### &"; NUMDATA!; B$; IF PON% = 1 THEN LPRINT TAB(34); USING "###### &"; NUMDATA!; B$; ELSEIF RIGHT$(STATUS$(X), 1) = "1" THEN PRINT TAB(34); USING "####.# &"; NUMDATA!; B$; IF PON% = 1 THEN LPRINT TAB(34); USING "####.# &"; NUMDATA!; B$; ELSEIF RIGHT$(STATUS$(X), 1) = "2" THEN PRINT TAB(34); USING "###.## &"; NUMDATA!; B$; IF PON% = 1 THEN LPRINT TAB(34); USING "###.## &"; NUMDATA!; B$; ELSEIF RIGHT$(STATUS$(X), 1) = "3" THEN PRINT TAB(34); USING "##.### &"; NUMDATA!; B$; IF PON% = 1 THEN LPRINT TAB(34); USING "##.### &"; NUMDATA!; B$; ELSEIF RIGHT$(STATUS$(X), 1) = "4" THEN PRINT TAB(34); USING "#.#### &"; NUMDATA!; B$; IF PON% = 1 THEN LPRINT TAB(34); USING "#.#### &"; NUMDATA!; B$; END IF SPECLEN% = LEN(TSPEC$(X)) PRINT TAB(60 - SPECLEN%); TSPEC$(X); PRINT TAB(61); B$; PRINT TAB(71); LEFT$(STATUS$(X), 4) IF PON% = 1 THEN LPRINT TAB(60 - SPECLEN%); TSPEC$(X); LPRINT TAB(61); B$; LPRINT TAB(71); LEFT$(STATUS$(X), 4) END IF END IF NEXT END SUB SUB RESETTH 'reset the voltage or RTD test head to a known, desired condition. SNM% = SENSORNUM% IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL OHMSET(100!) 'Nominal resistance value CALL SETTEST(2) 'Standard operation ELSE IF SNM% <> 2 AND SNM% <> 9 AND SENSOROUT!(SPECS.MAXIN, 0) > 10! THEN SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Disable power supply 'Remove high voltage from +/-IN CB3VAL% = CB3VAL% OR &HC0 '1 1 0 0 0 0 0 0 CALL SETTH(CB3VAL%, CB3%) END IF CALL SETDAC(0!, 1, 0) 'Clear attenuator, short transmitter inputs END IF END SUB FUNCTION SENSORIEXC$ (PERCFS%) 'This routine tests the RTD or resistance excitation current source 'with plus or minus full scale input. IF PERCFS% = 0 THEN IEXC! = SPECS.IEXCMFS 'Nominal excitation current (uA) RIN! = SENSOROUT!(SPECS.MININ, 0) 'Test with -f.s. input INCOND$ = "Minus Full Scale" ELSE IEXC! = SPECS.IEXCPFS 'Nominal excitation current (uA) RIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Test with +f.s. input INCOND$ = "Plus Full Scale" END IF ITOL! = .05 'Exctiation current tolerance, +/-5% CLS TESTTITLE$ = "Excitation Current Source Test, " + INCOND$ + " Input" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 SNM% = SENSORNUM% IF SNM% < 5 OR SNM% > 7 THEN 'Check if resistance in PRINT "This test is not performed on model "; SPECS.MODNAME EXIT FUNCTION ELSE PRINT "Testing, please wait..." END IF SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply CALL OHMSET(RIN!) 'Set input R = high ohms RINPUT! = MEASRES!(RIN!, 3, "") CALL SETTEST(2) SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V PAUSE (1) VSENSE! = RINPUT! * IEXC! / .000001 CALL WRITEDVM(VODC$, VSENSE!) CALL LOADMUX(1, CON%) IEXCMEAS! = READDVM!(VSENSE! * .0001) / RINPUT! * 1000000! 'Measured excitation current (uA) 'Tolerance = .01% reading CALL LOADMUX(1, COFF%) IF ABS(IEXCMEAS! - IEXC!) < IEXC! * ITOL! THEN IXSTAT$ = "PASS" ELSE IXSTAT$ = "FAIL" SOUND 1000, .5 LOCATE 10, 10 PRINT "Excitation current source out of tolerance." END IF LOCATE 15, 10 PRINT "Status: "; IXSTAT$; PRINT TAB(10); "Measured excitation current is"; PRINT TAB(50); USING "####.# uA"; IEXCMEAS! PRINT TAB(10); "Required value of excitation current is"; PRINT TAB(50); USING "####.# uA to ####.# uA"; IEXC! * (1 - ITOL!); IEXC! * (1 + ITOL!) SENSORIEXC$ = IXSTAT$ + STR$(IEXCMEAS!) + "1" SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply CALL PAUSE(1!) END FUNCTION FUNCTION SENSORIN! (MEASIN!, PTCV!) 'Calculates simulated sensor input based on the measured ATE transmitter input 'Inputs; MEASIN! = process variable input to sensor, i.e. temperature, voltage, current ' PTCV! = measured value of parasitic TC voltage SENSOR$ = SPECS.SENTYPE SNM% = SENSORNUM% 'Voltage, Current or Potentiometer IF SNM% = 1 OR SNM% = 2 OR SNM% = 7 THEN SENSORIN! = MEASIN! ELSEIF SNM% = 3 OR SNM% = 4 THEN 'TC in TCTYPE$ = LEFT$(SENSOR$, 1) TCT! = TCTEMP!(MEASIN! + PTCV!, TCTYPE$) SENSORIN! = TCT! ELSEIF SNM% = 5 OR SNM% = 6 THEN 'RTD in RTDTYPE$ = LEFT$(SENSOR$, 2) RTDI! = RTDTEMP!(MEASIN!, RTDTYPE$) 'Calculate actual simulated temp. SENSORIN! = RTDI! ELSE UNKNOWN% = 1 END IF IF TCT! = 99! OR RTDI! = 99! OR UNKNOWN% = 1 THEN SOUND 1000, .5 PRINT PRINT TAB(10); "Sensor type unknown. Check database." SENSORIN! = 99! 'Value indicates error CALL CONTINUE ELSEIF TCT! = 98! OR RTDI! = 98! THEN SOUND 1000, .5 PRINT PRINT TAB(10); "Sensor polynomial limits have been exceeded." SENSORIN! = 99! 'Value indicates error CALL CONTINUE END IF END FUNCTION FUNCTION SENSORNUM% 'Assign a number to each sensor type for ease of handling 'Sensor types; '1 = millvolt, volt '2 = milliamp '3 = thermocouple, except type B '4 = type B thermocouple (no cjc) '5 = 3-wire RTD '6 = 4-wire RTD '7 = potentiometer SENSOR$ = SPECS.SENTYPE TCTYPE$ = LEFT$(SENSOR$, 1) IF UCASE$(LEFT$(SENSOR$, 1)) = "V" THEN SENSORNUM% = 1 ELSEIF UCASE$(LEFT$(SENSOR$, 2)) = "MA" THEN SENSORNUM% = 2 ELSEIF UCASE$(MID$(SENSOR$, 2, 2)) = "TC" THEN IF UCASE$(TCTYPE$) = "B" THEN SENSORNUM% = 4 ELSE SENSORNUM% = 3 END IF ELSEIF UCASE$(MID$(SENSOR$, 3, 5)) = "RTD3W" THEN SENSORNUM% = 5 ELSEIF UCASE$(MID$(SENSOR$, 3, 5)) = "RTD4W" THEN SENSORNUM% = 6 ELSEIF UCASE$(LEFT$(SENSOR$, 3)) = "POT" THEN SENSORNUM% = 7 END IF END FUNCTION FUNCTION SENSOROUT! (PVIN!, PTCV!) 'Calculates transmitter input voltage based on the sensor type and output 'Inputs; PVIN! = process variable input to sensor, i.e. temperature, voltage, current ' PTCV! = measured value of parasitic TC voltage SENSOR$ = SPECS.SENTYPE SNM% = SENSORNUM% 'Voltage, Current or Potentiometer in IF SNM% = 1 OR SNM% = 2 OR SNM% = 7 THEN SENSOROUT! = PVIN! ELSEIF SNM% = 3 OR SNM% = 4 THEN 'TC in TCTYPE$ = LEFT$(SENSOR$, 1) TCV! = TCVOLTS!(PVIN!, TCTYPE$) SENSOROUT! = TCV! - PTCV! ELSEIF SNM% = 5 OR SNM% = 6 THEN 'RTD in RTDTYPE$ = LEFT$(SENSOR$, 2) RTDO! = RTDOHMS!(PVIN!, RTDTYPE$) SENSOROUT! = RTDO! ELSE UNKNOWN% = 1 END IF IF TCV! = 99! OR RTDO! = 99! OR UNKNOWN% = 1 THEN SOUND 1000, .5 PRINT PRINT TAB(10); "Sensor type unknown. Check database." SENSOROUT! = 99! CALL CONTINUE ELSEIF TCV! = 98! OR RTDO! = 98! THEN SOUND 1000, .5 PRINT PRINT TAB(10); "Sensor polynomial limits have been exceeded." SENSOROUT! = 99! 'Value indicates error CALL CONTINUE END IF END FUNCTION FUNCTION SETAC! (ONOFF%, GENAMPL!) SNM% = SENSORNUM% IF ONOFF% = 1 THEN IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL SETTEST(6) 'Connect function generator ELSEIF SNM% = 2 THEN 'mA input transmitter CB3VAL% = (CB3VAL% OR &H10) AND &HDF'0 0 0 1 0 0 0 0 'D.U.T. input = current source '1 1 0 1 1 1 1 1 CALL SETTH(CB3VAL%, CB3%) 'Input current sourced from +15V CB0VAL% = (CB0VAL% AND &HE9) OR &H8 '1 1 1 0 1 0 0 1 CALL SETTH(CB0VAL%, CB0%) 'ground inputs, short series R 'remove short on inputs ELSE CB0VAL% = (CB0VAL% AND &HFD) OR (&H8) '1 1 1 1 1 1 0 1 '0 0 0 0 1 0 0 0 CALL SETTH(CB0VAL%, CB0%) 'Select function gen., input 'remove input short. END IF CALL WRITEDVM(VOAC$, GENAMPL!) 'set meter range IF SNM% = 2 THEN CH% = 7 'Current input ELSE CH% = 3 'Attenuator input, voltage 'and RTD input END IF CALL LOADMUX(CH%, CON%) DO VIN! = READDVM!(.005) IF VIN! < GENAMPL! / 2! / SQR(2) * .75 THEN 'Check for adequate amplitude LOCATE 20, 15 PRINT "WARNING! Increase function generator amplitude." END IF LOOP WHILE VIN! < GENAMPL! / 2! / SQR(2) * .75 LOCATE 20, 15 PRINT SPC(48); ELSE IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL RESETTH 'Reset the test head ELSE CB0VAL% = CB0VAL% OR &H2 '0 0 0 0 0 0 1 0 CALL SETTH(CB0VAL%, CB0%) 'De-select function gen., input CALL SETDAC(0!, 1, 0) 'Clear attenuator, short transmitter inputs 'DUT input = R/2R ladder END IF END IF CALL LOADMUX(CH%, COFF%) SETAC! = VIN! END FUNCTION FUNCTION SETCURRENTIN! (MODIN!) 'Sets the input current source to the D.U.T. 'Inputs; Desired input current in mA. 'Outputs; Measured input current in mA. ' 'Schematic; Current Input ' ------- ' Vdac-----| |----- +15V ' | | --> Iout = Vdac / (IINSEN.MEAS + RCONV) ' | |--- ' | | | ' ------- IINSEN.MEAS ' | ' RCONV ' | ' GND ' ' 'Schematic; Two-Wire Transmitter Input ' ------- ' Vdac-----| |----- +EXC ' | | --> Iout = Vdac / IINSEN.MEAS ' | |--- ' | | | ' ------- IINSEN.MEAS ' | ' | ' GND IF SENSORNUM% = 2 THEN 'mA input transmitter RCONV! = SPECS.RCONV 'transmitter current conversion resistor CB3VAL% = CB3VAL% OR &H10 '0 0 0 1 0 0 0 0 CALL SETTH(CB3VAL%, CB3%) 'Input current sourced from +15V ELSE '2W TX input transmitter w/ loop excitation RCONV! = 0 'transmitter current conversion resistor 'Not used to set input current CB3VAL% = CB3VAL% AND &HEF '1 1 1 0 1 1 1 1 CALL SETTH(CB3VAL%, CB3%) 'Input current sourced from +EXC END IF VSENSE! = MODIN! / 1000! * IINSEN.MEAS! 'Iin, desired * current source sense R VSENATTEN! = (IINSEN.MEAS! + RCONV!) / IINSEN.MEAS! CALL SETDAC(VSENSE!, 7, VSENATTEN!) 'Sets DAC SETCURRENTIN! = VSENSE! / IINSEN.MEAS! * 1000! 'Measured, Vsense passed back from SETDAC END FUNCTION SUB SORTDB (ENDFLAG%) 'This sub does a bubble sort of the model numbers in the database 'records FOR A SELECTED MODEL FAMILY CONST FALSE = 0, TRUE = NOT FALSE 'Create a file containing just the model numbers of all of the 'records in the database for the model family selected OPEN "C:\ATE\SCTDATA\DBSORT2.DAT" FOR RANDOM AS #2 LEN = LEN(SORTDATA1) OPEN "C:\ATE\SCTDATA\SCTMAIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS) NUMRECORD% = LOF(1) / LEN(SPECS) IF TH$ = "TE1164" THEN 'Display VAS modules SELFAM% = 1 ELSE 'Display DSCT modules SELFAM% = MENU3% IF SELFAM% = 9 THEN ENDFLAG% = 1 CLOSE #1 CLOSE #2 EXIT SUB 'exit selected from MENU3% END IF END IF N% = 0 FOR I% = 1 TO NUMRECORD% GET #1, I%, SPECS SORTDATA1.MODNAME = SPECS.MODNAME SORTDATA1.RECNUM = I% SELECT CASE SELFAM% 'Pick models in selected family CASE 1 'SPECS.MODNAME = "SCMVAS-MXXX IF LEFT$(SPECS.MODNAME, 7) = "SCMHVAS" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF CASE 2 'SPECS.MODNAME = "DSCT30-xxxx " IF LEFT$(SPECS.MODNAME, 6) = "DSCT30" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF CASE 3 'SPECS.MODNAME = "DSCT31-xxxx " IF LEFT$(SPECS.MODNAME, 6) = "DSCT31" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF CASE 4 'SPECS.MODNAME = "DSCT32-xxxx " IF LEFT$(SPECS.MODNAME, 6) = "DSCT32" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF CASE 5 'SPECS.MODNAME = "DSCT34-xxxx " IF LEFT$(SPECS.MODNAME, 6) = "DSCT34" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF CASE 6 'SPECS.MODNAME = "DSCT36-xxxx " IF LEFT$(SPECS.MODNAME, 6) = "DSCT36" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF CASE 7 'SPECS.MODNAME = "DSCT37x-xxxx" IF LEFT$(SPECS.MODNAME, 6) = "DSCT37" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF CASE 8 'SPECS.MODNAME = "DSCT47x-xxxx" IF LEFT$(SPECS.MODNAME, 6) = "DSCT47" THEN PUT #2, , SORTDATA1 'write record # and model number N% = N% + 1 'found a record END IF END SELECT NEXT SORTDATA1.MODNAME = "999999999-9999" 'always sorted to last value. SORTDATA1.RECNUM = -1 'flag indicating end of new data (over writes old) PUT #2, , SORTDATA1 CLOSE #1 CLOSE #2 END SUB FUNCTION STEPRESP$ STEPMAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Use for checking if test is run MININ! = SPECS.OSCALIN MINOUT! = SPECS.MINOUT / 1000! 'Convert to A MAXOUT! = SPECS.MAXOUT / 1000! LOWLIM! = SPECS.STEPRMIN '% HIGHLIM! = SPECS.STEPRMAX CLS TESTTITLE$ = "Step Response Test" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 SNM% = SENSORNUM% 'Output sample is at 0.2s IF LOWLIM! > 97 OR STEPMAXIN! > 25! OR SNM% = 2 THEN 'Current source not set up for SETTHFAST 'Check for b.w. > approx 10Hz 'or high voltage input 'Voltages < 25V will use 'MAINMAX! and have less than 'full output span transition PRINT "This test is not performed on model "; SPECS.MODNAME EXIT FUNCTION ELSE PRINT "Testing, please wait..." END IF IF SNM% = 3 THEN PTCV! = PARASITICTCV!(VCJC!) IF VCJC! = 99! THEN EXIT FUNCTION END IF STEPMININ! = SENSOROUT!(MININ!, PTCV!) 'Calculate transmitter input STEPMAXIN! = SENSOROUT!(SPECS.MAXIN, PTCV!) 'Re-calculate w/ known PTCV! IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in CALL OHMSET(STEPMININ!) ELSE THATTEN! = SETATTEN%(STEPMAXIN!) 'Set test head attenuator 'remove short on inputs 'This setting will be used 'for minin and maxin for speed. CB0VAL% = (CB0VAL% AND &HEB) OR &H8 '1 1 1 0 1 0 1 1 CALL SETTH(CB0VAL%, CB0%) 'ground inputs, short series R 'remove short on inputs CALL SETDACFAST(STEPMININ! * THATTEN!) 'Set -f.s. input END IF CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, Iout!(MINOUT!) * RSENSE!) 'CALL CONTINUE IOUTLO! = READDVM(.0001) / RSENSE! 'Read -f.s. output (A) CALL LOADMUX(2, COFF%) IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in 'TIME1! = TIMER CB0VAL% = CB0VAL% AND &HBF '1 0 1 1 1 1 1 1 CALL SETTHFAST(CB0VAL%, CB0%) 'Set step relay, K18 'Start one-shot timer 'PRINT TIMER - TIME1! '** elapsed time = 0 using SETTHFAST in OHMSET CALL OHMSET(STEPMAXIN!) 'PRINT TIMER - TIME1! '** elapsed time = 0 using SETTHFAST in OHMSET 'Measured delay between one-shot pulse start and input voltage step 'is 20ms, therefore, set timer pulse to 220ms. CALL PAUSE(.2) 'Wait for 165ms pulse CB0VAL% = CB0VAL% OR &H40 '0 1 0 0 0 0 0 0 CALL SETTH(CB0VAL%, CB0%) 'reset test ELSE 'TIME1! = TIMER CB0VAL% = CB0VAL% AND &H7F '0 1 1 1 1 1 1 1 CALL SETTHFAST(CB0VAL%, CB0%) 'Set step relay, k7 'Start one-shot timer 'PRINT TIMER - TIME1! '** elapsed time = 0 using SETTHFAST '** elapsed time = 50ms using SETTH, regardless ' of pause time in SETTH. Pause is required. CALL SETDACFAST(STEPMAXIN! * THATTEN!) 'Set +f.s input 'PRINT TIMER - TIME1! '** elapsed time = 0 using SETDACFAST '** elapsed time = 50ms using SETDAC 'Measured delay between one-shot pulse start and input voltage step 'is 1ms. CALL PAUSE(.2) 'Wait for 165ms pulse CB0VAL% = CB0VAL% OR &H80 '1 0 0 0 0 0 0 0 CALL SETTH(CB0VAL%, CB0%) 'reset test END IF IOUTFINAL! = READDVM(.0001) / RSENSE! 'Read final +f.s. output (A) CALL LOADMUX(2, COFF%) CALL LOADMUX(5, CON%) 'S/H Output CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) IOUTHI! = READDVM(.001) / RSENSE! 'Read sampled output (A) CALL LOADMUX(5, COFF%) CALL PAUSE(.5) 'Allow output to settle 'to final value CALL LOADMUX(2, CON%) 'Measure Vsense IOUTFINAL! = READDVM(.001) / RSENSE! 'Read final +f.s. output (A) CALL LOADMUX(2, COFF%) IOUTHIPERC! = (IOUTHI! - IOUTLO!) / (IOUTFINAL! - IOUTLO!) * 100! IF IOUTHIPERC! >= LOWLIM! AND IOUTHIPERC! <= HIGHLIM! THEN ST$ = "PASS" ELSE ST$ = "FAIL" SOUND 1000, .5 END IF LOCATE 10, 10 PRINT "Status: "; ST$; PRINT SPC(20); PRINT TAB(10); "Output after 165ms is"; PRINT TAB(61); USING "+###.# %"; IOUTHIPERC! PRINT TAB(10); "Required output after 165ms is"; PRINT TAB(50); USING "+##.# % to +###.# %"; LOWLIM!; HIGHLIM! STEPRESP$ = ST$ + STR$(IOUTHIPERC!) + "1" CALL RESETTH 'Reset test head CALL PAUSE(1!) END FUNCTION SUB TSPECS (TSPEC$(), LOWMA!, HIGHMA!, TOTLRESPEC!) ORANGE! = SPECS.MAXOUT - SPECS.MINOUT TSPEC$(1) = " < " + STR$(IUR2! * 1000!) 'Under-range spec TSPEC$(2) = " < " + STR$(ICL! * 1000!) 'Over-range spec TSPEC$(3) = " < " + STR$(1) 'SPECS.ACCURACY) 'Min. loop V spec TSPEC$(4) = " < " + STR$(1) 'SPECS.ACCURACY) 'Max. loop V spec IF LEFT$(SPECS.MODNAME, 4) = "DSCT" THEN CURRTOLM! = .05 * SPECS.IEXCMFS '5% tolerance CURRTOLP! = .05 * SPECS.IEXCPFS '5% tolerance ELSE CURRTOLM! = .02 * SPECS.IEXCMFS '2% tolterance CURRTOLP! = .02 * SPECS.IEXCPFS '2% tolerance END IF TSPEC$(5) = STR$(CINT(SPECS.IEXCMFS)) + "+/-" + STR$(CINT(CURRTOLM!)) 'Excitation current #1 TSPEC$(6) = STR$(CINT(SPECS.IEXCPFS)) + "+/-" + STR$(CINT(CURRTOLP!)) 'Excitation current #2 TSPEC$(7) = "+/-" + STR$(SPECS.IMATCHTOL!) 'Current source matching TSPEC$(8) = "+/-" + STR$(SPECS.LINEAR) 'Linearity/conformity spec TSPEC$(9) = "+/-" + STR$(SPECS.ACCURACY) 'Accuracy spec TSPEC$(10) = "+/-" + LEFT$(STR$(TOTLRESPEC!), 4) 'Lead resistance effects TSPEC$(11) = "+/-" + STR$(SPECS.VSEN!) 'Loop voltage sensitivity TSPEC$(12) = " >=" + STR$(SPECS.INPUTRES!) 'Input R, bias I effects IF SPECS.IOPENTC > SPECS.MAXOUT THEN COND$ = " > " ELSE COND$ = " < " END IF TSPEC$(13) = COND$ + STR$(SPECS.IOPENTC) 'Open tc detect TSPEC$(14) = RIGHT$(STR$(SPECS.ATTEN), 2) + "+/-" + RIGHT$(STR$(SPECS.ATTENTOL), 2) 'Frequency response TSPEC$(15) = LEFT$(STR$(SPECS.STEPRMIN), 3) + " to" + LEFT$(STR$(SPECS.STEPRMAX), 4) 'Step response TSPEC$(16) = " < " + STR$(SPECS.OUTNOISE) 'Output noise END SUB FUNCTION UNDERRANGE$ 'Test the under-range limit of the transmitter MININ! = SENSOROUT!(SPECS.MININ, 0) MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) MAXOUT! = SPECS.MAXOUT / 1000! 'Convert to A INRANGE! = MAXIN! - MININ! CLS TESTTITLE$ = "Under-Range Test" CALL HEADERB(TESTTITLE$) LOCATE 10, 10 SNM% = SENSORNUM% IF SNM% = 2 OR SNM% = 7 THEN PRINT "This test is not performed on this model." CALL CONTINUE 'Pot in & current in can't be under-ranged EXIT FUNCTION ELSEIF SNM% = 5 OR SNM% = 6 THEN 'Check if RTD in UNDEROHM! = 8 'Set Rin for the minimum possible (8ohms) CALL OHMSET(UNDEROHM!) PRINT "Testing, please wait." ELSE IF MININ! - .25 * (INRANGE!) < -9.75 THEN 'Test voltage is beyond DAC capability PRINT "This test is not performed on model "; SPECS.MODNAME UNDERRANGE$ = "PASS" EXIT FUNCTION ELSE UNDERVOLT! = MININ! - .5 * (INRANGE!) 'Set Vin for 50% underrange CALL SETDAC(UNDERVOLT!, 1, 0) PRINT "Testing, please wait." END IF END IF CALL LOADMUX(2, CON%) 'Measure Vsense CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) 'Sets up Meter UNDERI! = READDVM(.001) / RSENSE! 'Loop current in A CALL LOADMUX(2, COFF%) 'Clear mux lines IF UNDERI! > IUR1! AND UNDERI! < IUR2! THEN UISTAT$ = "PASS" ELSE UISTAT$ = "FAIL" SOUND 1000, .5 END IF LOCATE 10, 10 PRINT "Status: "; UISTAT$; PRINT SPC(20); PRINT TAB(10); "Measured under-range current is"; PRINT TAB(50); USING "##.## mA"; UNDERI! * 1000 PRINT TAB(10); "Required under-range current is"; PRINT TAB(50); USING "##.## mA to ##.## mA"; IUR1! * 1000; IUR2! * 1000 UNDERRANGE$ = UISTAT$ + STR$(UNDERI! * 1000!) + "1" '1 decimal place in display CALL RESETTH 'Reset test head CALL PAUSE(1!) END FUNCTION