Files
sysadmin 505bc12355 AD2 session 2026-03-27/28/29: Test datasheet pipeline rebuild
- Built exact-match TXT formatter from QuickBASIC source (SCM5B, 8B, DSCA, DSCT, SCM7B)
- Spec parser for 10 binary DAT files (1470+ models)
- Work order report importer (33K WOs, 63K test lines)
- On-demand PDF generation, styled HTML view
- Archived 500K pre-2026 For_Web files into year subfolders
- Created domain service account (INTRANET\svc_testdatadb)
- Generated 73/73 Quatronix customer datasheets
- Added STAGE + Reports auto-import to sync script

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 17:48:37 -07:00

2053 lines
75 KiB
QBasic

'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 = <pass/fail>+<measured data>+<# 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