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

2381 lines
77 KiB
QBasic

'Automated Test Software for DSCAxx-xx Voltage,
'Current, TC and RTD input models.
'AUTHOR: John Lehman
'DATE: 1/18/99
'USES LIBRARY = NLIBATED.BAS
' REVISION RECORD
'DATE APPR DESCRIPTION
'---- ---- -----------
'1/18/99 JL Initial Release. Modified version of TST2DIN1.BAS w/ basis
' from SCM5B program TEST49.BAS.
' ... See "Revs.txt" file.
'11/15/13 PWR Version for lot-status and extended serial numbers release. Added "LOGMODFILES"
' sub to combine logging and file operations common to post-encap and sealed-module
' tests. Added "DATASHEETWRITE", "DATASHEETPRINT", "WORKORDERHEADER", "WORKORDERLINE"
' and "WORKORDERPRINT" subs in the "TSTDIN2C.BAS" file for datasheet and work order
' status file generation and print. Datasheet file creation and data logging is
' consolidated at the end of testing to prevent partial file generation if F10 is used
' to abort testing. F10 abort is disabled in the file functions to prevent the
' creation of defective datasheet or work order status files. The "FOOTER" sub was
' also updated to not print to the screen.
'
CONST VERSION$ = "B.1 2013.11.15 PWR KDSCOUT1.EXE" 'Version (Revision Date) and initials of engr.
CONST SOURCEFILES$ = "KDSCOUT1.BAS KDSCOUT2.BAS NLIBATE.BAS" 'Source file names
'******** Declare some useful constants *******
CONST MAXSTATUSINDEX = 18 'Maximum index of the Status array
'****************** Declare Subs *****************
DECLARE SUB CALDAC (TE$)
'
DECLARE SUB CHANGEDN (SN$) 'Allow user to change dash number
DECLARE SUB COMPTEST (STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), 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 module type and specifications
DECLARE SUB HEADERA (SN$) 'Prints test sheet header
DECLARE SUB HEADERB (TESTTITLE$) 'Prints test screen header
'
DECLARE SUB INDIVID (SEL%, ITERATION%) '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!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), 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 SETDAC2 (VOLTAGE!, CH%, VSENATTEN!) 'Sets DAC, output module test heads
DECLARE SUB SETDACFAST (VOLTAGE!)
DECLARE SUB SETOUTLOAD (LOAD!) 'Set output load
'
DECLARE SUB SETTEST (TEST%)
DECLARE SUB SETTH (DOUT%, CB%)
DECLARE SUB SETTHFAST (DOUT%, CB%)
DECLARE SUB SORTDB (ENDFLAG%)
'
'
'
'
'
DECLARE SUB TSPECS (TSPEC$(), TOTLRESPEC!) 'Creates a string array of test specifications
DECLARE SUB WRITEDVM (FUNC$, VALUE!)
'
'
DECLARE SUB INTERLUDE () ' WAIT FOR USER
DECLARE SUB WORKORDERLINE(FAILSTATE%, SN$)
DECLARE SUB WORKORDERPRINT (SN$)
DECLARE SUB WORKORDERHEADER (SN$)
DECLARE SUB HARDCOPY () ' cjt ' cjt
DECLARE SUB SNPARSE (SN$, WO$, DS$) 'Parses serial number into work order and dash numbers
DECLARE SUB DATASHEETWRITE (SN$, STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TX%, OUTLOAD! )
DECLARE SUB DATASHEETPRINT (SN$, STATUS$())
'Sub below writes data log, datasheet and work order status files
DECLARE SUB LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
'DECLARE FUNCTION GETDSFNAME$ (SN$) 'Returns datasheet file name from serial number
DECLARE FUNCTION GETWOSFNAME$ (SN$) 'Returns work order status file name from serial number
'************** Declare Functions ****************
DECLARE FUNCTION BESTFIT! (SLOPE!, OFFSETS!, TSIM!(), NUMPTS%, ERRO!())
'Library fn. Calculates besfit line and max error
'
'
'
'
'
'
DECLARE FUNCTION FAILS% (STATUS$()) 'Tests for failed tests
DECLARE FUNCTION FREQRESP$ (GENAMPL!) 'Performs Frequency response Test
DECLARE FUNCTION GAINCAL$ (CAL%) 'Performs Gain Calibration
'
DECLARE FUNCTION GETTHID% () 'Library fn. Get test head id #
DECLARE FUNCTION GETPSID% ()
'
DECLARE FUNCTION ILIMIT$ (POSI%) 'Test current limit
'
DECLARE FUNCTION INPUTR$ () 'Performs Input Resistance Test
DECLARE FUNCTION IOUTMAXL$ (MINMAX%) 'Test compliance
DECLARE FUNCTION KEYBDIN$ () 'Get keyboard input
'
DECLARE FUNCTION LINTEST$ (ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs Accuracy and Linearity Tests
DECLARE FUNCTION MEASRES! (OHM!, RESNUM%, TE$) 'Measure loop current sense resistor
DECLARE FUNCTION MENU1% () 'Gets the Test Group selection
DECLARE FUNCTION MENU2% () 'Gets the individual test #
DECLARE FUNCTION MENU3% () 'Gets the module family
'
'
DECLARE FUNCTION OFFSETCAL$ (CAL%) 'Performs Offset Calibration
'
'
DECLARE FUNCTION OUTNOISE$ () 'Performs Output Noise Test
'
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 REPEAT2$ (N$, SN$)
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 SENSORNUM% () 'Assign a number to each sensor type
'
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$) '** Controls Kepco DPS 125
DECLARE FUNCTION STEPRESP$ () 'Performs Step Response Test
DECLARE FUNCTION STRINGVAL% (A$) 'Library fn.
DECLARE FUNCTION SUPPLYI$ (MAXL%) 'Measure module supply current
DECLARE FUNCTION SUPPLYSEN$ () 'Performs Power Supply Sensitivity
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 UPSN$ (SN$) 'Increments dash# of serial#
'
DECLARE FUNCTION MODULEOUT! (SENOUT!) 'Calculates module output for a given input
'
'************** End of Functions ********************
'Database Record definition for the specifications
TYPE DBASE
MODNAME AS STRING * 13 'DSCA39-XXXXn
SENTYPE AS STRING * 7 'mV, V, mA
ISMAXNL AS SINGLE
ISMAXFL AS SINGLE
MININ AS SINGLE
MAXIN AS SINGLE
RCONV AS SINGLE
'
'
'
MINOUT AS SINGLE
MAXOUT AS SINGLE
OUTSIGTYPE AS STRING * 7 ''VOLTAGE' or 'CURRENT'
OSCALIN AS SINGLE 'input for offset calibration
GNCALIN AS SINGLE 'input for gain calibration
CALTOL AS SINGLE
LOAD1 AS SINGLE 'Vout min load (mA), Iout nom load (ohms)
LINEAR1 AS SINGLE 'Voltage or current output
ACCURACY1 AS SINGLE 'Voltage or current output
LOAD2 AS SINGLE 'Vout max load (mA), Iout min load (ohms)
LINEAR2 AS SINGLE 'Voltage output
ACCURACY2 AS SINGLE 'Voltage output
LOAD3 AS SINGLE 'Vout max load (mA), Iout not used
LINEAR3 AS SINGLE 'Voltage output
ACCURACY3 AS SINGLE 'Voltage output
BANDWIDTH AS SINGLE 'filter -3dB point
TESTFREQ AS SINGLE
ATTEN AS SINGLE
ATTENTOL AS SINGLE
STEPRMIN AS SINGLE
STEPRMAX AS SINGLE
PSS AS SINGLE
OUTNOISE AS SINGLE
INPUTRES AS SINGLE
COMPLIANCE AS SINGLE 'Current output, open loop voltage
MAXLOAD AS SINGLE 'Current output, max load resistance
ILIMIT AS SINGLE 'Voltage output, current limit
PERCOVER AS SINGLE 'Voltage output, percent overrange
'
'
'
MINVS AS SINGLE
MAXVS AS SINGLE
END TYPE
TYPE DBASE2
RECNUM AS INTEGER
MODNAME AS STRING * 13
END TYPE
'define common variables
COMMON SHARED /SAMPLE/ WO$, STATE$
COMMON SHARED /SAMPLE/ SPECS AS DBASE, SORTDATA1 AS DBASE2, SORTDATA2 AS DBASE2
COMMON SHARED /SAMPLE/ PON%, TX%, IINSEN.MEAS!, IOUTSEN.MEAS!, SN$, LOGDAT%
COMMON SHARED /SAMPLE/ TE$
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$
'VINMODEL$ will be used if 2 different KEPCOs are used.
'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'
'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 module power
'CONST VINADDR% = 2 'Power supply for high voltage signal input
CONST OVERV! = 35 'Power supply over voltage limit
CONST PSILIMIT! = 500 'Power supply over current limit
'(max spec multiplier).
CONST VINOVERV! = 125
CONST VINILIMIT! = 32 'High voltage input current limit
'assign specifications which are constant for all modules
CONST IINSEN! = 192 'Input current source sense resistor, 250ohm
CONST IOUTSEN! = 192 'Output current sense resistor.
'
CONST RSERIES! = 1E+07 '10M ohm, test head series input R
'
'
'
'
'
DIM STATUS(MAXSTATUSINDEX) AS STRING, TSPEC(MAXSTATUSINDEX) AS STRING
DIM TSIM!(105), OUTCALC!(105), OUTMEAS!(105), ERROROUT!(105), ACCSTAT$(105)
' Variable intialization
BADDRS% = &H250 'Base address of PC4311 '488 controller
CB0VAL% = &HFF 'Set all lines off
CB1VAL% = &HFF
CB2VAL% = &HFF
CB3VAL% = &HFF
'TE1055 (pcb1133 A)
'(all control lines are active low)
'Use Relay/Mux TE1037 (see below)
'
'Control Bank Line Assignment
'------------ ------ ----------
' 0 7 MSB 0 = Connect DUT output to S/H input
' 6 1 = Step input to DUT, start S/H timer
' 5 0 = Bypass series input R
' 4 Vsupply control MSB
' 3 Vsupply control LSB
' 2 0 = AC signal input to DUT
' 1 0 = Connect step input to DUT
' 0 LSB 0 = DC signal input to DUT
'
'
' 1 7 MSB NC
' 6 NC
' 5 NC
' 4 NC
' 3 NC
' 2 NC
' 1 NC
' 0 LSB 0 = Connect Iout to load
'
' 2 7 MSB 1 = Output filter & CH4 connected to ouput, 0 = CH2 connected to output
' 6 1 = Input buffer gain = 3, 0 = Input buffer gain = 1
' 5 0 = Disable charge offset timer
' 4 0 = Tie WR EN\ to +5V.
' 3 0 = Output load #4, 5 ohm
' 2 0 = Output load #3, 750 ohm
' 1 0 = Output load #2, 500 ohm
' 0 LSB 0 = Output load #1, 250 ohm
'
'
'
'
'
'
'
'
'
'
'
'TE1054 (pcb1133 A)
'(all control lines are active low)
'Use Relay/Mux TE1013 (see below)
'
'Control Bank Line Assignment
'------------ ------ ----------
' 0 7 MSB 0 = Connect DUT output to S/H input
' 6 Step input to DUT, start S/H timer
' 5 0 = Bypass series input R
' 4 Vsupply control MSB
' 3 Vsupply control LSB
' 2 0 = AC signal input to DUT
' 1 0 = Connect step input to DUT
' 0 LSB 0 = DC signal input to DUT
'
' 1 7 MSB NC
' 6 NC
' 5 NC
' 4 NC
' 3 NC
' 2 NC
' 1 NC
' 0 LSB NC
'
' 2 7 MSB 0 = Output filter & CH4 connected to ouput, 1 = CH2 connected to output
' 6 0 = Input buffer gain = 3, 1 = Input buffer gain = 1
' 5 0 = Enable charge offset timer
' 4 0 = Connect output to BNC
' 3 0 = Output load #4, 200 ohm
' 2 0 = Output load #3, 100 ohm
' 1 0 = Output load #2, 2K ohm
' 0 LSB 0 = Output load #1, 1K ohm
'
'TE1013 Relay/Mux channel assignments
'Mux Channel Assignment
'----------- ----------
' 1 DUT +/-IN terminals
' 2 Vout
' 3 Supply current sense resistor
' 4 Vout, post 10KHz filter
' 5 Sample/Hold output
' 6 NC
' 7 Supply voltage
' 8 NC
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'
'TE1037 Relay/Mux channel assignments
'Mux Channel Assignment
'----------- ----------
' 1 DUT +/-IN terminals
' 2 Iout * Rload
' 3 Input current sense resistor
' 4 Output Noise, post 10KHz filter
' 5 Sample/Hold output
' 6 Sense lines, output load #4 (4-wire ohms)
' 7 Sense lines, input current sense resistor
' 8 Sense lines, output load #1 (4-wire ohms)
'****************** MAIN PROGRAM************************************
KEY(10) ON 'Activates F10 key
ON KEY(10) GOSUB FINISH 'Traps for F10 key Exits if pressed
CLS
TX% = 0 ' cjt
FILENAME$ = "KDSCIOUT.ADR" 'Parallel port, mux & test head addresses
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
CLS
LOCATE 5, 20: PRINT "Initializing test system. Please wait."
LOCATE 6, 10: PRINT "VERSION: "; VERSION$
LOCATE 7, 10: PRINT "SOURCE FILES: "; SOURCEFILES$
CALL CONTINUE
CLS
CALL INIT488(DVMADDR%) 'Initialize the GPIB interface
'
'
'CALL CONTINUE
PSID% = GETPSID%
'
LOCATE 9, 20: PRINT "Initializing DVM..."
CALL WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
LOCATE , 20: PRINT "Initializing relay mux..."
CALL LOADMUX(0, CON%) 'Resets all mux's, independent of mux address
M% = MENU3%
SELECT CASE M%
CASE 1
TE$ = "TE1055" 'Assign test head #, defines channel
FILENAME$ = "KDSCIOUT.ADR" 'Parallel port, mux & test head addresses
'used for DAC input.
THIDSET% = 2
CASE 2
TE$ = "TE1054" 'Assign test head #, defines channel
FILENAME$ = "KDSCVOUT.ADR" 'Parallel port, mux & test head addresses
'used for DAC input.
THIDSET% = 3
CASE 3
GOTO MAINMENU
END SELECT
PRINT
PRINT TAB(20); "Initializing test head "; TE$; "..."
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
THID% = GETTHID% 'Get test head ID #
' PRINT THID%
IF THID% <> THIDSET% THEN
'BEEP
F% = F% + 1
PRINT
PRINT TAB(20); "SYSTEM STARTUP ERROR"
PRINT TAB(20); "Test head "; TE$; " is not connected."
PRINT TAB(20); "Check system setup."
PRINT TAB(20); "Press space bar to continue or ESC to exit."
DO
I$ = KEYBDIN$ ' user response
IF I$ = CHR$(27) THEN STOP
LOOP UNTIL I$ = CHR$(27) OR I$ = " "
ELSE
IF THID% = 2 THEN 'Don't know DUT input
PRINT 'conversion resistor
PRINT TAB(20); "Remove modules from test head."
BEEP
CALL CONTINUE
END IF
CB0VAL% = CB0VAL% AND &HDE '1 1 0 1 1 1 1 0
'Sets relays K00, K05
CALL SETTH(CB0VAL%, CB0%)
CB1VAL% = &HFF
CALL SETTH(CB1VAL%, CB1%)
CB2VAL% = &H1F '0 0 0 1 1 1 1 1 K27..K20
CALL SETTH(CB2VAL%, CB2%)
PRINT TAB(20); "Initializing DAC..."
CALL CALDAC(TE$) 'Calibrate DAC
IF TE$ = "ERROR" THEN
'BEEP
LOCATE , 20: PRINT " "
LOCATE , 20: PRINT "SYSTEM STARTUP ERROR"
LOCATE , 20: PRINT "DAC is not connected or is faulty."
LOCATE , 20: PRINT "Check system setup and restart program."
GOTO FINISH
END IF
CALL RESETTH
END IF
IF F% = 1 THEN STOP 'No test heads connected
PRINT TAB(20); "Initializing power supply..."
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
LOGDAT% = -1 'Log linearity test data OFF
'
PON% = 0
DO 'Main program loop
SN$ = "" 'Reset serial number
SEL% = MENU1% 'Gets the # of the sub program
SELECT CASE SEL% 'Branches to the specific Tests
'******************* Pre-Burn In Functional Test ***************************
CASE 1
TX% = 0 ' cjt no print to file
CAL% = 2 'Measure o.s and gain, don't calibrate
CALL GETSPECS 'Gets module test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL FUNCTEST(CAL%)
END IF
'*********************** Pre-Encap Complete Test ******************************
CASE 2
TX% = 0 ' cjt no print to file
CAL% = 0 'Calibrate o.s. & gain.
CALL GETSPECS 'Gets module test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL GENSET(GENAMPL!) 'Displays message to set signal gen.
DO 'Complete test loop start
ITERATION% = 1 'Sets # of times to repeat offset/gain cal
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
CALL TSPECS(TSPEC$(), TOTLRESPEC!) 'Sets up a string with the test specifications
WIDTH , 43 'Change screen lines to 43
CALL REPORT(STATUS$(), TSPEC$()) 'Prints data to screen
CALL INTERLUDE
WIDTH , 25 'Change screen lines to 25
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N" 'End of Complete Test loop
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
END IF
END IF
'**************** Post-Encap Complete Test ***********************************
CASE 3
CALL HARDCOPY 'Ask for harcopy printout (PWR)
TX% = 1 ' cjt print to file
CAL% = 0 'calibrate o.s & gain
CALL GETSPECS 'Gets module test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL GENSET(GENAMPL!) 'Displays message to set signal generator
CALL GETSN(SN$) 'Gets module serial #
CALL WORKORDERHEADER (SN$) 'Write header to work order status file
DO 'Start of Test loop
IF SPECS.OUTSIGTYPE$ = "CURRENT" AND SPECS.MINOUT < .001 THEN
ITERATION% = 2 'o.s. calibrated at +2.5% span results in interactive adjustments
ELSE
ITERATION% = 1 'Sets # of times to repeat offset/gain cal non-interactive adjustments
END IF
CALL HEADERA(SN$) 'Prints data sheet header on printer
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
CALL TSPECS(TSPEC$(), TOTLRESPEC!) 'Creates a string of test parameters
WIDTH , 43 'Change screen lines to 43
CALL REPORT(STATUS$(), TSPEC$()) 'Displays test results
CALL FOOTER(STATUS$()) 'Prints footer if no fails
'CALL INTERRUPT(5, inreg, outreg) 'Prints test data
'Log test results to data log, datasheet and work order status files
CALL LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
'CALL INTERLUDE
WIDTH , 25 'Change screen lines to 25
LOOP WHILE REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
CLS
PRINT TAB(10); "Printing work order status file: "; WO$ + ".TXT
CALL WORKORDERPRINT (SN$) 'Print the work order status file after "N" (not testing more of same module type)
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
END IF
END IF
'**************** Sealed Module Re-Test ***********************************
CASE 4
CALL HARDCOPY 'Ask for hardcopy printout (PWR)
TX% = 1 ' cjt print to file
CAL% = 2 'Check o.s & gain
'CAL% = 4 'Check o.s & gain (4 or 2?: input modules used "4")
CALL GETSPECS 'Gets module test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL GENSET(GENAMPL!) 'Displays message to set signal generator
CALL GETSN(SN$) 'Gets module serial #
CALL WORKORDERHEADER (SN$) 'Write header to work order status file
DO 'Start of Test loop
ITERATION% = 0 'Sets # of times to repeat offset/gain cal
CALL HEADERA(SN$) 'Prints data sheet header on printer
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
CALL TSPECS(TSPEC$(), TOTLRESPEC!) 'Creates a string of test parameters
WIDTH , 43 'Change screen lines to 43
CALL REPORT(STATUS$(), TSPEC$()) 'Displays test results
CALL FOOTER(STATUS$()) 'Prints footer if no fails
'CALL INTERRUPT(5, inreg, outreg) 'Prints test data
'Log test results to data log, datasheet and work order status files
CALL LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
'CALL INTERLUDE
WIDTH , 25 'Change screen lines to 25
LOOP WHILE REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
CALL WORKORDERPRINT (SN$) 'Print the work order status file after "N" (not testing more of same module type)
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
END IF
END IF
'***********************Individual Test Routines******************************
CASE 5
TX% = 0 ' cjt no print to file
DO 'Start of loop
ITERATION% = 1 'Sets # of times to repeat offset/gain cal
SEL% = MENU2% 'Gets # of test
IF SEL% <> 16 THEN 'Checks for exit
IF SEL% = 14 THEN 'Checks for printer toggle
IF PON% = 1 THEN
PON% = 0
ELSE
PON% = 1 'Toggles printer status
END IF
ELSEIF SEL% = 13 THEN
CALL NOTES 'Print ATE notes
ELSEIF SEL% = 15 THEN
LOGDAT% = -LOGDAT%
ELSEIF SEL% = 17 THEN
CALL ONESHOTTEST
ELSE
CALL GETSPECS 'Gets module specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL INDIVID(SEL%, ITERATION%)'Performs individual test
END IF
END IF
END IF
LOOP UNTIL SEL% = 16 'End of loop
'*************************** End Program Selection *********************************
CASE 6
ENDPROG% = 1 'Sets end program flag
END SELECT
LOOP WHILE ENDPROG% <> 1 'Loops until end program flag set
FINISH:
'Exit program from F10 keypress (PWR)
CLS ' CJT
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Turn off loop power
SL$ = SETPOWER$(PSADDR%, 999!, "LOC") 'Return to local mode
SL$ = SETPOWER$(PSADDR%, 999!, "ZER") 'Clear the error queue
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Turn off loop power
SL$ = SETPOWER$(VINADDR%, 999!, "LOC") 'Return to local mode
SL$ = SETPOWER$(VINADDR%, 999!, "ZER") 'Clear the error queue
END IF
CHAIN "C:\ATE\MENUX"
END 'End of program
'*@*@*@*@*@*@*@*@*@*@*@**@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@*@**@*@*@*@*@*@
MAINMENU:
CHAIN "C:\ATE\MENUX"
END
'*******************************
'*******************************
SUB COMPTEST (STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!)
MINOUT! = SPECS.MINOUT
OUTTYPE$ = SPECS.OUTSIGTYPE
SNM% = SENSORNUM%
IF SNM% = 2 THEN 'Check if current input
CALL WRITEDVM("S0", 0) 'Slow reading rate
IINSEN.MEAS! = MEASRES!(IINSEN!, 2, TE$) 'Measure current source sense R
CALL WRITEDVM("S1", 0) 'Medium reading rate
ELSE
IINSEN.MEAS! = 1
END IF
FOR X = 1 TO 18 'Clear test result array
STATUS$(X) = ""
NEXT X
IF SPECS.ISMAXFL <> 0 THEN
MODILIM! = SPECS.ISMAXFL
ELSE
MODILIM! = SPECS.ISMAXNL
END IF
CALL INITPS(PSADDR%, MODILIM! * PSILIMIT!, OVERV!)
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
STATUS$(1) = SUPPLYI$(0) 'Supply current test
'No excitation load
'
'
'
'
'
IF LEFT$(STATUS$(1), 4) = "FAIL" THEN
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
EXIT SUB 'Exit on over current
END IF
IF OUTTYPE$ = "VOLTAGE" THEN 'Check if voltage out
STATUS$(2) = SUPPLYI$(1) 'Supply current test
ELSE 'Max output load
STATUS$(2) = "PASS"
END IF
IF LEFT$(STATUS$(2), 4) = "FAIL" THEN EXIT SUB 'Exit on over current
POSI% = 1 'Test positive current limit
IF OUTTYPE$ = "VOLTAGE" THEN
STATUS$(9) = ILIMIT$(POSI%)
ELSE
STATUS$(9) = "PASS"
END IF
IF OUTTYPE$ = "VOLTAGE" AND MINOUT! <> 0 THEN
POSI% = 0 'Test negative current limit
STATUS$(10) = ILIMIT$(POSI%)
ELSE
STATUS$(10) = "PASS"
END IF
STATUS$(11) = "PASS" 'OVERRANGE$ 'Test module overrange
STATUS$(12) = SUPPLYSEN$ 'Power supply sensitivity
STATUS$(13) = "PASS"
STATUS$(14) = FREQRESP$(GENAMPL!) 'Tests Frequency Response
STATUS$(15) = "PASS"
STATUS$(16) = OUTNOISE$ 'Test Output Noise
IF OUTTYPE$ = "CURRENT" THEN 'Max load resistance test
STATUS$(17) = IOUTMAXL$(1)
IF LEFT$(SPECS.MODNAME, 9) = "DSCA39-07" THEN
STATUS$(18) = IOUTMAXL$(0)
END IF
ELSE
STATUS$(17) = "PASS"
STATUS$(18) = "PASS"
END IF
WHILE ITERATION% > 0 'Offset/Gain calibration loop
A$ = OFFSETCAL$(CAL%) 'Offset calibration
A$ = GAINCAL$(CAL%) 'Gain calibration
ITERATION% = ITERATION% - 1
WEND 'Tests for Offset/Gain calibration end
FOR T% = 1 TO 3
SELECT CASE T%
CASE 1
OUTLOAD! = SPECS.LOAD3
STATUS$(3) = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
'accuracy tests
STATUS$(4) = ACC$ 'Assigns results of accuracy test
CASE 2
IF OUTTYPE$ = "VOLTAGE" THEN
OUTLOAD! = SPECS.LOAD2
STATUS$(5) = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
'accuracy tests
STATUS$(6) = ACC$ 'Assigns results of accuracy test
ELSE
STATUS$(5) = "PASS"
STATUS$(6) = "PASS"
END IF
CASE 3
IF OUTTYPE$ = "VOLTAGE" THEN
OUTLOAD! = SPECS.LOAD1
STATUS$(7) = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
'accuracy tests
STATUS$(8) = ACC$ 'Assigns results of accuracy test
ELSE
STATUS$(7) = "PASS"
STATUS$(8) = "PASS"
END IF
END SELECT
NEXT
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
CALL INTERLUDE
END SUB
'*******************************
FUNCTION FAILS% (STATUS$())
FAILS% = 0
'FOR X = 1 TO 18
FOR X = 1 TO MAXSTATUSINDEX
IF LEFT$(STATUS$(X), 1) = "F" THEN 'Tests for failed tests
FAILS% = 1
END IF
NEXT
END FUNCTION
'*******************************
SUB FOOTER (STATUS$())
'Sub to create footer (if there are no fails). Removed code to print footer to file
'since that is now accomplished by the "DATASHEETWRITE" sub. The datasheet can still
'be sent to two places (screen and printer), so when updating remember to make any
'changes to both the "PRINT" and "LPRINT" sections.
'
'NOTE: Currently, the footer is only printed to the printer, not the screen.
'
OUTTYPE$ = SPECS.OUTSIGTYPE
'When updating remember to make the changes to all sections.
IF FAILS%(STATUS$()) <> 1 THEN
' 'Send to screen.
' PRINT TAB(5); "240VAC Withstand"; TAB(71); "PASS"
' PRINT TAB(5); "Hi-Pot"; TAB(71); "PASS"
' IF OUTTYPE$ = "CURRENT" THEN
' PRINT
' PRINT TAB(5); "Standard output load for test is 250 ohms."
' END IF
'
' PRINT TAB(5);
' FOR X = 5 TO 75
' PRINT "_";
' NEXT
' PRINT
' PRINT TAB(35); "Check List"
' PRINT
' PRINT TAB(5); "Tested by: _______________"; TAB(45); "QC: _______________"
' PRINT
' PRINT TAB(5); "It is hereby certified that the above product is in conformance with"
' PRINT TAB(5); "all requirements to the extent specified. This product is not"
' PRINT TAB(5); "authorized or warranted for use in life support devices and/or systems."
' PRINT
' PRINT TAB(5); "* NIST traceable calibration certificates support Measured Value data."
' PRINT TAB(5); " Calibration services are available through ANSI/NCSL Z540-1 and"
' PRINT TAB(5); " ISO Guide 25 Certified Metrology Labs."
'Send to printer
IF PON% = 1 THEN
LPRINT TAB(5); "240VAC Withstand"; TAB(71); "PASS"
LPRINT TAB(5); "Hi-Pot"; TAB(71); "PASS"
IF OUTTYPE$ = "CURRENT" THEN
LPRINT
LPRINT TAB(5); "Standard output load for test is 250 ohms."
END IF
LPRINT TAB(5);
FOR X = 5 TO 75
LPRINT "_";
NEXT
LPRINT
LPRINT TAB(35); "Check List"
LPRINT
LPRINT TAB(5); "Tested by: _______________"; TAB(45); "QC: _______________"
LPRINT
LPRINT TAB(5); "It is hereby certified that the above product is in conformance with"
LPRINT TAB(5); "all requirements to the extent specified. This product is not"
LPRINT TAB(5); "authorized or warranted for use in life support devices and/or systems."
LPRINT
LPRINT TAB(5); "* NIST traceable calibration certificates support Measured Value data."
LPRINT TAB(5); " Calibration services are available through ANSI/NCSL Z540-1 and"
LPRINT TAB(5); " ISO Guide 25 Certified Metrology Labs."
END IF
END IF
IF PON% = 1 THEN LPRINT CHR$(12) 'Send form feed to printer (whether a passing or failing module)
END SUB
'*******************************
FUNCTION FREQRESP$ (GENAMPL!)
MININ! = SPECS.MININ 'Determine min in
MAXIN! = SPECS.MAXIN 'Determine max in
'
INRANGE! = MAXIN! - MININ!
ORANGE! = SPECS.MAXOUT - SPECS.MINOUT 'V or A
SPEC! = SPECS.ATTEN
SPECTOL! = SPECS.ATTENTOL
SNM% = SENSORNUM%
CLS
TESTTITLE$ = "Frequency Response Test"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10: PRINT "Testing, please wait."
IF SNM% = 2 THEN 'mA in
SCALE% = 1000
ELSE
SCALE% = 1
END IF
XFERFN! = ORANGE! / (INRANGE! / SCALE%) 'V/A or A/A
VAC! = SETAC!(CON%, GENAMPL!) 'Turns on AC input
CALL LOADMUX(2, CON%) 'Turns on mux
CALL WRITEDVM(VOAC$, (10 ^ (SPEC! / -20) * VAC! / IINSEN.MEAS! * XFERFN!) * IOUTSEN.MEAS! * 2)'Sets up Meter (Autorange)
OUTMEAS! = READDVM!(.0002 * ORANGE!) / IOUTSEN.MEAS! 'Reads Meter to +/-0.02% span
IF OUTMEAS! > .0002 THEN
OUTMEAS! = SQR(OUTMEAS! ^ 2 - .0002 ^ 2) 'Account for meter zero-input error
END IF 'See output noise test for details
CALL LOADMUX(2, COFF%) 'Turns off mux
'Calculate attenuation
'
'
'
ATTEN! = -20 * (LOG(OUTMEAS! / (VAC! / IINSEN.MEAS! * XFERFN!)) / LOG(10))
IF ABS(ATTEN! - SPEC!) <= SPECTOL! THEN
ATTEN$ = "PASS"
ELSE
ATTEN$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 10, 10: PRINT "Status: ";
IF LEFT$(ATTEN$, 4) = "FAIL" THEN COLOR 12, 0
PRINT ATTEN$;
COLOR 11, 0
PRINT SPC(20);
PRINT TAB(10); USING "Attenuation at ##### Hz is"; SPECS.TESTFREQ!;
PRINT TAB(50); USING "###.# dB"; ATTEN!
PRINT TAB(10); "Required attenuation is";
PRINT TAB(50); USING "###.# +/- ##.# dB"; SPEC!; SPECTOL!
'
FREQRESP$ = ATTEN$ + STR$(ATTEN!) + "1"
VAC! = SETAC(COFF%, GENAMPL!) 'Turns off AC input
CALL PAUSE(1!)
END FUNCTION
'*******************************
SUB FUNCTEST (CAL%)
'Sequence of tests to determine if main module circuits are functional
MAXOUT! = SPECS.MAXOUT 'V or A
SNM% = SENSORNUM%
IF SNM% = 2 THEN 'Check if current input
IINSEN.MEAS! = IINSEN!
ELSE
IINSEN.MEAS! = 1
END IF 'sensor type.
IF SPECS.ISMAXFL <> 0 THEN
MODILIM! = SPECS.ISMAXFL
ELSE
MODILIM! = SPECS.ISMAXNL
END IF
' CALL INITPS(PSADDR%, MODILIM! * PSILIMIT!, OVERV!)
DO
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
CONFLAG% = 0
FOR FTEST% = 1 TO 2
SELECT CASE FTEST%
CASE 1
IF LEFT$(SUPPLYI$(0), 4) = "FAIL" THEN 'Check supply current
CALL CONTINUE
CONFLAG% = 1 'Sets exit flag
END IF
CASE 2
IF LEFT$(OFFSETCAL$(CAL%), 4) = "FAIL" THEN
CALL CONTINUE 'Checks for offset error < 8% span
CONFLAG% = 1
END IF
IF LEFT$(GAINCAL$(CAL%), 4) = "FAIL" THEN
CALL CONTINUE 'Checks for Gain error < 8% span
CONFLAG% = 1
END IF
' CASE 3
END SELECT
IF CONFLAG% <> 0 THEN EXIT FOR
NEXT
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
'
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N" 'Repeat for another module
CALL RESETTH 'Reset the test head
END SUB
'*******************************
FUNCTION GAINCAL$ (CAL%) ' THIS SHOULD USE A UNIVERSAL FUNCTION GAINCAL$(FAMILY, CAL%, ETC OR PASS A PTR TO A STRUCT)
'Calibrate module gain
'Inputs; calibration flag
' measured contact resistance (used for resistance in only)
SENSOR$ = SPECS.SENTYPE
MAXIN! = SPECS.MAXIN
MININ! = SPECS.MININ
MINOUT! = SPECS.MINOUT 'V or A
MAXOUT! = SPECS.MAXOUT
INITTOL! = 8 'Uncalibrated gain tolerance (%)
CALTOL! = SPECS.CALTOL 'Calibration tolerance (%)
OSCALIN! = SPECS.OSCALIN 'Module input for offset calibration
GNCALIN! = SPECS.GNCALIN 'Module input for gain calibration
'
'
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
CALSPAN! = MODULEOUT!(GNCALIN!) - MODULEOUT!(OSCALIN!) 'Adjustment range is +/- x% of +f.s.
OUTTYPE$ = SPECS.OUTSIGTYPE
SNM% = SENSORNUM%
IF SNM% = 2 THEN
SCALE% = 1000
ELSE
SCALE% = 1
END IF
INRANGE! = (MAXIN! - MININ!) / SCALE% * IINSEN.MEAS!
IF OUTTYPE$ = "CURRENT" AND ABS(MINOUT!) = MAXOUT! THEN 'Bipolar current output
CALGN! = .00025 'Calibrate @ +0.025% span to correct for nonlinearity
'@ -f.s. output.
END IF
CLS
TESTTITLE$ = "Gain Calibration"
CALL HEADERB(TESTTITLE$)
CALL MODOUTLINE
LOCATE 7
PRINT TAB(44); CHR$(24);
PRINT TAB(35); "GAIN POTENTIOMETER";
IF CAL% = 2 THEN
GERROR! = INITTOL! 'Gain tolerance for func. test (%)
TOL! = .0001 * ORANGE! 'Measurement tolerance, 1 pass test
ELSE
GERROR! = CALTOL! 'Gain calibration tolerance (%)
TOL! = 0! 'Measurement tolerance, continuous test
END IF
LOCATE 10, 10: PRINT "Observe that the LED between the potentiometers is ON."
BEEP: BEEP: BEEP
LOCATE 20, 5: PRINT "After you have verified the LED is ON, you may hit any key to continue."
CALL CONTINUE
DO
TIME1! = TIMER 'Start timer
LOCATE 12, 10: PRINT TAB(10); "Measuring input. Please wait..."
MAXIN! = GNCALIN! 'Calc. maxin volts
IF SNM% = 2 THEN
MAXINMEAS! = SETCURRENTIN!(MAXIN!)
ELSE
CALL SETDAC2(MAXIN!, 1, 0) 'Sets DAC
IF CAL% = 0 OR MAXIN! > 10! THEN 'Always measure high voltage
'input to get exact setting
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CALL LOADMUX(1, CON%)
CALL WRITEDVM(VODC$, MAXIN!) 'Sets meter to read
CALL PAUSE(2!)
MAXINMEAS! = READDVM!(INRANGE! * MAXACCERR! / 10!) '10x better than accuracy
CALL LOADMUX(1, COFF%)
ELSE
MAXINMEAS! = MAXIN!
'
END IF
END IF
CALL WRITEDVM("S1", 0) 'Medium reading rate
OUTCALC! = MODULEOUT!(MAXINMEAS!) + CALGN! * CALSPAN!
CALL LOADMUX(2, CON%) 'Measure Vout
'
CALL WRITEDVM(VODC$, OUTCALC! * IOUTSEN.MEAS!)
LOCATE 12, 10: PRINT "Gain Error = ";
PRINT SPC(20);
L% = 0
DO
L% = L% + 1
ERROROUT! = (READDVM!(TOL!) / IOUTSEN.MEAS! - OUTCALC!) / CALSPAN! * 100! 'Error (%)
LOCATE 12, 24
PRINT USING "+###.### %"; ERROROUT!
LOCATE 15, 10
IF CAL% > 0 THEN
CONREADS% = 5
ELSEIF ABS(ERROROUT!) < GERROR! THEN
SOUND 400, .5
PRINT "Stop turning gain potentiometer "
CONREADS% = CONREADS% + 1
ELSEIF ERROROUT! < 0 THEN
PRINT "Turn gain potentiometer clockwise "
CONREADS% = 0
ELSE
PRINT "Turn gain 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("*", OUTCALC! * IOUTSEN.MEAS!)
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 AND L% < 400
CALL LOADMUX(2, COFF%)
LOOP WHILE CONREADS% < 5
IF ABS(ERROROUT!) <= GERROR! THEN
GN$ = "PASS"
ELSE
GN$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 15, 10
PRINT "Status: ";
IF LEFT$(GN$, 4) = "FAIL" THEN COLOR 12, 0
PRINT GN$;
COLOR 11, 0
PRINT SPC(30);
PRINT TAB(10); "Gain calibration error is";
PRINT TAB(50); USING " +###.### %"; ERROROUT!
PRINT TAB(10); "Max. gain calibration error is";
PRINT TAB(50); USING "+/-##.### %"; GERROR!
GAINCAL$ = GN$ + STR$(ERROROUT!)
CALL RESETTH 'Reset the test head
CALL PAUSE(1!)
END FUNCTION
SUB GENSET (GENAMPL!)
MININ! = SPECS.MININ
MAXIN! = SPECS.MAXIN 'Convert to A
RCONV! = SPECS.RCONV
ATTEN! = SPECS.ATTEN
SNM% = SENSORNUM%
IF SNM% = 2 THEN
SCALE% = 1000
ELSE
SCALE% = 1
END IF
INRANGE! = (MAXIN! - MININ!) / SCALE% * IINSEN!
ORANGE! = (SPECS.MAXOUT! - SPECS.MINOUT!) * IOUTSEN.MEAS! 'V
IF SNM% = 2 THEN
SCALE% = 1000
GENAMPL! = MAXIN! / SCALE% * (RCONV! + IINSEN!)
ELSE
SCALE% = 1
'Set amplitude for > 5mV p-p signal out
UNATTENOUT! = 10 ^ (ATTEN! / 20) * .005
GENAMPL! = UNATTENOUT! / ORANGE! * INRANGE! * .9
IF GENAMPL! < 5 THEN
GENAMPL! = 4
ELSE
GENAMPL! = 8 '10V and +5V offset can cause
'clipping on 0-20mA output modules.
'Leave some leeway in the setting.
END IF
END IF
'Convert to round numbers
'for ease of use
GATTEN! = INRANGE! / GENAMPL! 'Attenuator gain
GENOS! = (MININ! / SCALE% * IINSEN! + INRANGE! / 2!) / GATTEN!
IF GENAMPL! < .5 * ABS(GENOS!) THEN 'GENAMPL! cannot be less
GENAMPL! = .5 * ABS(GENOS!) 'than 1/2 the offset. Max
END IF 'offset is 2x amplitude.
IF GENAMPL! > 20 - 2 * ABS(GENOS!) THEN GENAMPL! = 20 - 2 * ABS(GENOS!)
CLS
LOCATE 5, 10: PRINT "Set the function generator as follows:"
LOCATE 10, 27: PRINT "Function Generator Settings"
LOCATE 11, 27: PRINT "---------------------------"
LOCATE 12, 31: PRINT USING "Frequency: ##### Hz"; SPECS.TESTFREQ!
LOCATE 13, 31: PRINT USING "Amplitude: ##.# V p-p"; GENAMPL!
LOCATE 14, 31: PRINT USING "DC Offset: +##.# V"; GENOS!
CALL CONTINUE
END SUB
'*******************************
SUB GETADD (FILENAME$)
'LPT$ = parallel printer port used to control ATE
'MUX$ = multiplexer box address
'TESTHEAD$ = test head address
'PS1ADDR$ = Power Supply #1 address (module power)
'PS2ADDR$ = Power Supply #2 address (high voltage input to dut)
'PSPORTADDR$ = Power Supply serial port address
'DVM$ = DVM address
OPEN "C:\ATE\ADDR\" + FILENAME$ FOR RANDOM AS #3 LEN = 19
FIELD #3, 3 AS LPT$, 2 AS MUX$, 2 AS TESTHEAD$, 2 AS DPSPSADDR$, 2 AS DPSVINADDR$, 2 AS PSPORTADDR$, 2 AS DVM$, 2 AS ABCPSADDR$, 2 AS ABCVINADDR$
GET #3
LPTADDR% = VAL(LPT$)
MUXADDR% = VAL(MUX$)
THADDR% = VAL(TESTHEAD$)
DPSPSADDR% = VAL(DPSPSADDR$)
DPSVINADDR% = VAL(DPSVINADDR$)
PSPORT% = VAL(PSPORTADDR$)
DVMADDR% = VAL(DVM$)
ABCPSADDR% = VAL(ABCPSADDR$)
ABCVINADDR% = VAL(ABCVINADDR$)
CLOSE #3
'PRINT LPTADDR%, MUXADDR%, THADDR%, DPSPSADDR%, DPSVINADDR%, PSPORT%, DVMADDR%, ABCPSADDR%, ABCVINADDR%
'CALL CONTINUE
END SUB
'*******************************
FUNCTION GETPSID%
CLS
LOCATE 3, 10: PRINT "Identifying power supplies connected to test system"
PRINT
'****** First, assume KEPCO DPS125 for PSMODEL$ string assignment.
PSMODEL$ = "DPS125"
'****** KEPCO DPS VIN supply address for serial interface.
' PSADDR% = 2
'****** Obtain Identification string from KEPCO DPS 125.
LOCATE 5, 20: PRINT "KEPCO DPS125 Power Supply: ";
DPSPS$ = POWERIO$(DPSPSADDR%, "ID")
'****** Assign corresponding address obtained from address file dependent
'****** on if the Power supply is DPS125 or ABC125.
IF DPSPS$ = "KEPCO DPS 125-0.5M" THEN
PSADDR% = DPSPSADDR% 'this value should = 2
LOCATE 5, 53: PRINT "Yes!"
PSMODEL$ = "DPS125"
CALL INITPS(DPSPSADDR%, PSILIMIT!, OVERV!)
DPSPSFLAG! = 1!
ELSE
LOCATE 5, 53: PRINT "Not present"
DPSPSFLAG! = 0!
PSADDR% = 0!
END IF
'****** Check for High Voltage Power Supply
LOCATE 6, 20: PRINT "KEPCO DPS125 High-Voltage Input: ";
DPSVIN$ = POWERIO$(DPSVINADDR%, "ID")
IF DPSVIN$ = "KEPCO DPS 125-0.5M" THEN
VINADDR% = DPSVINADDR%
LOCATE 6, 53: PRINT "Yes!"
PRINT
CALL INITPS(DPSVINADDR%, VINILIMIT!, VINOVERV!)
DPSVINFLAG! = 1!
ELSE
LOCATE 6, 53: PRINT "Not present"
DPSVINFLAG! = 0!
VINADDR% = 0!
END IF
IF DPSPSFLAG! = 0! AND DPSVINFLAG! = 0! THEN
PSMODEL$ = "ABC125"
PRINT TAB(20); "KEPCO ABC-125 Power Supply: ";
ABCPS$ = READGPIB$(ABCPSADDR%, "*IDN?")
IF LEFT$(ABCPS$, 14) = "KEPCO,ABC-1251" THEN
PSADDR% = ABCPSADDR%
CALL INITPS(ABCPSADDR%, PSILIMIT!, OVERV!)
PRINT TAB(55); "Yes!"
ELSE
PRINT TAB(55); "Not present"
END IF
PRINT TAB(20); "KEPCO ABC-125 High-Voltage Input: ";
ABCVIN$ = READGPIB$(ABCVINADDR%, "*IDN?")
IF LEFT$(ABCVIN$, 14) = "KEPCO,ABC-1251" THEN
VINADDR% = ABCVINADDR%
CALL INITPS(ABCVINADDR%, VINILIMIT!, VINOVERV!)
PRINT TAB(55); "Yes!"
PRINT
ELSE
PRINT TAB(55); "Not present"
PRINT
END IF
END IF
IF PSADDR% = 0! AND VINADDR% = 0! THEN
PRINT TAB(15); ">>>>>>>> No Power Supplies are connected <<<<<<<<"
CALL CONTINUE
END IF
GETPSID% = 99 'This has yet to be utilized. At this time there is
'no requirement to pass anthing back to function call
CALL PAUSE(1)
END FUNCTION
'*****************************************
SUB GETSPECS ' THIS ONE SHOULD BE CHANGED TO SUB GETSPECS CALL GETSPECS(TE$=FAMILY) END SUB
DIM POINTER%(1000)
CALL SORTDB(ENDFLAG%)
IF ENDFLAG% = 1 THEN
SPECS.MODNAME = "EXIT"
EXIT SUB
END IF
CLS
LOCATE 3, 30: PRINT " Model Selection Menu "
LOCATE 4, 30: PRINT " -------------------- "
LOCATE 5, 30: PRINT " "
YINIT% = CSRLIN 'Initialize starting rows
OPEN "C:\ATE\DSCDATA\DBSORT2.DAT" FOR RANDOM AS #2 LEN = LEN(SORTDATA1)
DO
I% = I% + 1
GET #2, I%, SORTDATA1
IF SORTDATA1.RECNUM <> -1 THEN NUMRECORD! = NUMRECORD! + 1
LOOP WHILE SORTDATA1.RECNUM <> -1
SCRNCTR% = 40 'display center
NUMCHAR% = 19 '13 char + 4 char for # + 2 spaces
NUMLINES! = 16 '# of lines for model display below header
NUMCOLUMNS! = 1 + INT(NUMRECORD! / NUMLINES!)
'Model # length = 20 characters max
'-> 3 columns max per screen
'3 columns x 26 char = 78 spaces
I% = 1
FOR C% = 0 TO NUMCOLUMNS! - 1
Y% = YINIT%
TB% = SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + NUMCHAR% * C%
DO
GET #2, I%, SORTDATA1
IF SORTDATA1.RECNUM <> -1 THEN
POINTER%(I%) = SORTDATA1.RECNUM
LOCATE Y%, TB%
PRINT USING "##.) &"; I%; SORTDATA1.MODNAME
I% = I% + 1
Y% = Y% + 1
END IF
LOOP WHILE SORTDATA1.RECNUM <> -1 AND Y% - YINIT% < NUMLINES!
NEXT C%
LOCATE Y%, TB%
PRINT USING "##.) Exit"; I%
CLOSE #2
DO
LOCATE 23, SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS!
PRINT "Enter Selection ";
INPUT SEL%
LOOP WHILE SEL% < 1 OR SEL% > I%
IF SEL% = I% THEN
SPECS.MODNAME = "EXIT"
ELSE
OPEN "C:\ATE\DSCDATA\DSCOUT.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
GET #1, POINTER%(SEL%), SPECS
CLOSE #1
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
CLS
LOCATE 10, 5
BEEP
PRINT "This module requires high voltage input."
PRINT
PRINT TAB(5); "Turn on the high voltage power supply and connect it to the test head."
PRINT
PRINT TAB(5); "DO NOT PROBE THE CIRCUITRY DURING TEST"
PRINT
PRINT TAB(5); "Remove the yellow connector from the meter +/-SENSE terminals."
CALL CONTINUE
END IF
IF SPECS.OUTSIGTYPE = "CURRENT" THEN
CALL SETOUTLOAD(IOUTSEN!) 'Set current output sense resistor
'Connect CH2 to output
'Measure current output sense resistor
CALL WRITEDVM("S0", 0) 'Slow reading rate
IOUTSEN.MEAS! = MEASRES!(IOUTSEN!, 3, TE$)
CALL WRITEDVM("S1", 0)
ELSE
CALL SETOUTLOAD(1E+10) 'Connect CH2 to output
IOUTSEN.MEAS! = 1
END IF
END IF
SEL% = POINTER%(SEL%) 'pass back to main code for use in SAVEDATA
END SUB
'*******************************
SUB HEADERA (SN$)
IF PON% = 1 THEN
LPRINT TAB(5); "DATAFORTH CORPORATION"; TAB(51); "Phone: (520) 741-1404"
LPRINT TAB(5); "3331 E. Hemisphere Loop"; TAB(51); "Fax: (520) 741-0762"
LPRINT TAB(5); "Tucson, AZ 85706 USA"; TAB(51); "email: info@dataforth.com"
LPRINT
LPRINT TAB(33); "TEST DATA SHEET"
LPRINT TAB(5);
FOR X = 5 TO 75
LPRINT "~";
NEXT
LOCATE 8
LPRINT TAB(5); "Date: "; DATE$
LPRINT TAB(5); "Model: "; SPECS.MODNAME
LPRINT TAB(5); "SN: "; TAB(12); SN$
LPRINT
END IF
END SUB
'*******************************
SUB HEADERB (TESTTITLE$)
'print test title, model under test, and sn at top of screen
TITLEN = LEN(TESTTITLE$) + LEN(SPECS.MODNAME)
PRINT TAB(40 - TITLEN / 2); SPECS.MODNAME; " "; TESTTITLE$;
IF SN$ <> "" THEN
PRINT TAB(66); "SN: "; SN$ 'print sn if available
ELSE
PRINT
END IF
LOCATE , 40 - TITLEN / 2
FOR L = 1 TO TITLEN + 1 'underline test title
PRINT "-";
NEXT
PRINT
END SUB
'*******************************
FUNCTION ILIMIT$ (POSI%)
' Test the output current limit
' Inputs: POSI%, indicates positive or negative current limit
MAXOUT! = SPECS.MAXOUT
MODLOAD! = SPECS.LOAD3 * 2 'Set load value (mA)
IOUTLIM! = SPECS.ILIMIT
OUTTYPE$ = SPECS.OUTSIGTYPE
IF POSI% = 1 THEN
MODIN! = SPECS.MAXIN
MODOUT! = SPECS.MAXOUT 'V or A
IF OUTTYPE$ = "VOLTAGE" THEN
BIDIR$ = "Positive"
END IF
POL% = 1
ELSE
MODIN! = SPECS.MININ
MODOUT! = SPECS.MINOUT 'V or A
BIDIR$ = "Negative"
POL% = -1
END IF
IMAXOUT! = SPECS.ILIMIT * POL%
CLS
TESTTITLE$ = BIDIR$ + " Current Limit Test"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
IF OUTTYPE$ = "CURRENT" THEN
PRINT "This test is not performed on model "; SPECS.MODNAME
EXIT FUNCTION
ELSE
PRINT "Testing, please wait."
END IF
IF OUTTYPE$ = "CURRENT" THEN
RL! = IOUTSEN.MEAS!
ELSE 'Voltage output modules
RL! = 1 / (1 / 2000 + 1 / 1000 + 1 / 200 + 1 / 100)'MEASRES!(MODLOAD!, 5, TE$)
CALL SETOUTLOAD(RL!) 'Sets load to 61 ohms
CALL SETDAC2(MODIN!, 1, 0) 'Sets DAC for + or - f.s. in
END IF
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
CALL LOADMUX(2, CON%)
MEASILIM! = READDVM!(.0005) / RL! * 1000! 'measured current limit (mA)
IF ABS(MEASILIM!) > ABS(IOUTLIM!) THEN
IL$ = "FAIL"
SOUND 1000, .5
ELSE
IL$ = "PASS"
END IF
LOCATE 10, 10: PRINT "Status: ";
IF LEFT$(IL$, 4) = "FAIL" THEN COLOR 12, 0
PRINT IL$;
COLOR 11, 0
PRINT SPC(20);
PRINT TAB(10); USING "Measured & current limit = ####.# mA"; BIDIR$; MEASILIM!
PRINT TAB(10); USING "Maximum & current limit = ###.# mA"; BIDIR$; IOUTLIM! * POL%
ILIMIT$ = IL$ + STR$(MEASILIM!) + "1" 'append # decimal places
IF OUTTYPE$ = "VOLTAGE" THEN 'Remove output load, DSCA49
CALL SETOUTLOAD(5000!)
END IF
CALL RESETTH 'Reset the test head
CALL PAUSE(1!)
END FUNCTION
'*******************************
SUB INDIVID (SEL%, ITERATION%)
DIM TSIM!(105), OUTCALC!(105), OUTMEAS!(105), ERROROUT!(105), ACCSTAT$(105)
SNM% = SENSORNUM%
MINOUT! = SPECS.MINOUT
OUTTYPE$ = SPECS.OUTSIGTYPE
IF SNM% = 2 THEN 'Check if current input
CALL WRITEDVM("S0", 0) 'Slow reading rate
IINSEN.MEAS! = MEASRES!(IINSEN!, 2, TE$) 'Measure current source sense R
CALL WRITEDVM("S1", 0) 'Medium reading rate
ELSE
IINSEN.MEAS! = 1
END IF
IF SPECS.ISMAXFL <> 0 THEN
MODILIM! = SPECS.ISMAXFL
ELSE
MODILIM! = SPECS.ISMAXNL
END IF
DO
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
SELECT CASE SEL%
CASE 1
IF SETPOWER$(PSADDR%, 999!, ISTAT$) = "RCS=01" THEN 'Check for over-current
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
END IF
A$ = SUPPLYI$(0)
CASE 2
IF SETPOWER$(PSADDR%, 999!, ISTAT$) = "RCS=01" THEN 'Check for over-current
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
END IF
A$ = SUPPLYI$(1)
CASE 3
ITER2% = ITERATION%
WHILE ITER2% > 0 'Offset/Gain calibration loop
A$ = OFFSETCAL$(CAL%) 'Offset calibration
A$ = GAINCAL$(CAL%) 'Gain calibration
ITER2% = ITER2% - 1
WEND 'Tests for Offset/Gain calibration end
CASE 4
FOR T% = 1 TO 3
SELECT CASE T%
CASE 1
OUTLOAD! = SPECS.LOAD3
A$ = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
'accuracy tests
A$ = ACC$ 'Assigns results of accuracy test
CASE 2
IF OUTTYPE$ = "VOLTAGE" THEN
OUTLOAD! = SPECS.LOAD2
A$ = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
'accuracy tests
A$ = ACC$ 'Assigns results of accuracy test
END IF
CASE 3
IF OUTTYPE$ = "VOLTAGE" THEN
OUTLOAD! = SPECS.LOAD1
A$ = LINTEST$(ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
'accuracy tests
A$ = ACC$ 'Assigns results of accuracy test
END IF
END SELECT
NEXT
CALL INTERLUDE
CASE 5
POSI% = 1 'Test positive current limit
A$ = ILIMIT$(POSI%)
IF OUTTYPE$ = "VOLTAGE" AND MINOUT! <> 0 THEN
POSI% = 0 'Test negative current limit
A$ = ILIMIT$(POSI%)
END IF
CASE 6
A$ = OVERRANGE$ 'Test module overrange
CASE 7
A$ = SUPPLYSEN$
CASE 8
A$ = INPUTR$
CASE 9
CALL GENSET(GENAMPL!)
A$ = FREQRESP$(GENAMPL!)
CASE 10
A$ = STEPRESP$
CASE 11
A$ = OUTNOISE$
CASE 12
A$ = IOUTMAXL$(1)
IF LEFT$(SPECS.MODNAME, 9) = "DSCA39-07" THEN
CALL CONTINUE
B$ = IOUTMAXL$(0)
END IF
END SELECT
CALL CONTINUE
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N"
IF SNM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
END IF
END SUB
'*******************************
FUNCTION INPUTR$
MAXIN! = SPECS.MAXIN '+f.s. input voltage (V)
MININ! = SPECS.MININ '-f.s. input voltage (V)
MINOUT! = SPECS.MINOUT 'V or A
MAXOUT! = SPECS.MAXOUT
SPEC! = SPECS.INPUTRES 'Meg ohms
INRANGE! = MAXIN! - MININ!
ORANGE! = MAXOUT! - MINOUT!
CLS
TESTTITLE$ = "Input Resistance & Bias Current Test"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
SNM% = SENSORNUM%
IF SNM% = 2 THEN 'Check for V in only
PRINT "This test is not performed on model "; SPECS.MODNAME
EXIT FUNCTION
ELSE
PRINT "Testing, please wait."
END IF
CALL SETDAC2(MAXIN!, 1, 0)
' CALL LOADMUX(2, CON%) 'Measure output
' CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
' OUT1! = READDVM!(.001)
CB0VAL% = CB0VAL% OR &H20 'Insert large resistor in series
CALL SETTH(CB0VAL%, CB0%) 'with input.
CALL LOADMUX(2, CON%) 'Turns on mux, reset w/ resistor insert
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
OUT2! = READDVM!(.001) 'Measure output
CALL LOADMUX(2, COFF%)
' DELTAOUT! = (OUT2! - OUT1!) * 1000! 'Output change
' MAXDELTA! = (MAXOUT! - MODULEOUT!((SPEC! / (SPEC! + RSERIES!)) * MAXIN!)) / ORANGE! * 100 'max change (%)
PEDOS! = MODULEOUT!(0!)
XFERFN! = ORANGE! / INRANGE!
RINMEAS! = ABS((OUT2! - PEDOS!) * RSERIES! / (MAXIN! * XFERFN! - OUT2!) / 1000000!)
IF RINMEAS! > 1000 THEN RINMEAS! = 1000
IF RINMEAS! >= SPEC! THEN
INR$ = "PASS"
ELSE
INR$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 10, 10
PRINT "Status: ";
IF LEFT$(INR$, 4) = "FAIL" THEN COLOR 12, 0
PRINT INR$;
COLOR 11, 0
PRINT SPC(20);
PRINT TAB(10); "Measured input resistance is";
PRINT TAB(50); USING " #### Mohms"; RINMEAS!
PRINT TAB(10); "Required input resistance is";
PRINT TAB(50); USING ">= #### Mohms"; SPEC!
INPUTR$ = INR$ + STR$(RINMEAS!) + "0"
CALL RESETTH 'Reset the test head
CALL PAUSE(1!)
END FUNCTION
'*******************************
FUNCTION IOUTMAXL$ (MINMAX%)
'test operation of current output modules with max load resistance.
SENSOR$ = SPECS.SENTYPE
PLUSFSIN! = SPECS.MAXIN
MINUSFSIN! = SPECS.MININ
MINOUT! = SPECS.MINOUT 'V or A
MAXOUT! = SPECS.MAXOUT
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
SNM% = SENSORNUM%
OUTTYPE$ = SPECS.OUTSIGTYPE
MAXLOAD! = SPECS.MAXLOAD
MINLOAD! = 5 '5 ohms, used to test DSCA39-07
MAXACCERR! = SPECS.ACCURACY1 * 2 '%
COMPLIANCE! = SPECS.COMPLIANCE 'Max change in output w/ load (%)
'Allows for 5 ohm lead resistance
'and 0.1% output change
CLS
IF MINMAX% = 1 THEN
TESTTITLE$ = "Maximum Output Load Test"
ELSE
TESTTITLE$ = "Minimum Output Load Test"
END IF
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
IF OUTTYPE$ = "VOLTAGE" THEN
PRINT "This test is not performed on model "; SPECS.MODNAME
EXIT FUNCTION
ELSE
PRINT "Testing, please wait."
END IF
MAXIN! = PLUSFSIN! 'Calc. maxin volts
IF SNM% = 2 THEN
MAXINMEAS! = SETCURRENTIN!(MAXIN!)
ELSE
CALL SETDAC2(MAXIN!, 1, 0) 'Sets DAC
END IF
CALL LOADMUX(2, CON%) 'Measure output
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN.MEAS!)
OUTNOMLOAD! = READDVM!(.0001 * ORANGE!) / IOUTSEN.MEAS! '.01% tolerance
CALL LOADMUX(2, COFF%)
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
IF MINMAX% = 1 THEN
CALL SETOUTLOAD(MAXLOAD!) 'Set max load resistor
IOUTSEN2.MEAS! = MEASRES!(MAXLOAD!, 5, TE$)
TESTLIM! = COMPLIANCE!
ELSE
CALL SETOUTLOAD(MINLOAD!) 'Set min load resistor
IOUTSEN2.MEAS! = MEASRES!(MINLOAD!, 4, TE$)
TESTLIM! = MAXACCERR!
END IF
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
CALL WRITEDVM(VODC$, MAXOUT! * IOUTSEN2.MEAS!)
CALL LOADMUX(2, CON%) 'Measure output
CALL LOADMUX(2, CON%) 'Doesn't always set first time.
OUTMAXLOAD! = READDVM!(.0001 * ORANGE!) / IOUTSEN2.MEAS! '.01% tolerance
PERCOUTCHG! = (OUTMAXLOAD! - OUTNOMLOAD!) / ORANGE! * 100!
IF ABS(PERCOUTCHG!) <= TESTLIM! THEN
ML$ = "PASS"
ELSE
ML$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 15, 10
PRINT "Status: ";
IF LEFT$(ML$, 4) = "FAIL" THEN COLOR 12, 0
PRINT ML$;
COLOR 11, 0
PRINT SPC(30);
PRINT TAB(10); "Change in output current at max load is";
PRINT TAB(50); USING " +###.### %"; PERCOUTCHG!
PRINT TAB(10); "Max. change in output current is";
PRINT TAB(50); USING "+/-##.### %"; TESTLIM!
IOUTMAXL$ = ML$ + STR$(PERCOUTCHG!) + "2"
CALL RESETTH 'Reset the test head
CALL SETOUTLOAD(IOUTSEN!) 'Set current output sense resistor
CALL PAUSE(1!)
END FUNCTION
FUNCTION LINTEST$ (ACC$, OUTLOAD!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
'Sub to perform the accuracy/linearity tests and create the accuracy test results section of
'the datasheet. Removed code to print to file since that is now accomplished by the
'"DATASHEETWRITE" sub. The datasheet data can still be sent to two places (screen and
'printer), so when updating remember to make any changes to both the "PRINT" and "LPRINT"
'sections (PWR: 2013-11-12).
'
SENSOR$ = SPECS.SENTYPE
MININ! = SPECS.MININ
MAXIN! = SPECS.MAXIN
MINOUT! = SPECS.MINOUT 'V or A
MAXOUT! = SPECS.MAXOUT
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
LOAD1! = SPECS.LOAD1
LOAD2! = SPECS.LOAD2
LOAD3! = SPECS.LOAD3
CLS
IF SPECS.OUTSIGTYPE = "VOLTAGE" THEN
UNIT$ = "V"
SCALE! = 1!
IF OUTLOAD! > 1 THEN 'Output load in mA
CALL SETOUTLOAD(MAXOUT! / OUTLOAD! * 1000)
END IF
IF OUTLOAD! = LOAD1! THEN
MAXACCERR! = SPECS.ACCURACY1 '%
MAXLINERR! = SPECS.LINEAR1
ELSEIF OUTLOAD! = LOAD2! THEN
MAXACCERR! = SPECS.ACCURACY2
MAXLINERR! = SPECS.LINEAR2
ELSE
MAXACCERR! = SPECS.ACCURACY3
MAXLINERR! = SPECS.LINEAR3
END IF
CLS
TESTTITLE$ = "Accuracy, Load Current = " + STR$(OUTLOAD!) + " mA"
ELSE
UNIT$ = "mA"
SCALE! = 1000!
TESTTITLE$ = "Accuracy Test"
OUTLOAD! = 0 'Flag for header printing
MAXACCERR! = SPECS.ACCURACY1 '%
MAXLINERR! = SPECS.LINEAR1
END IF
CALL HEADERB(TESTTITLE$)
SNM% = SENSORNUM%
IF SNM% = 2 THEN 'Current input modules
INPUTTYPE$ = "Iin (mA)"
SCALE% = 1000
ELSE
INPUTTYPE$ = " Vin (V)" 'Voltage input modules
SCALE% = 1
END IF
INRANGE! = (MAXIN! - MININ!) / SCALE% * IINSEN.MEAS!
'
PRINT
PRINT TAB(23); "Calculated"; TAB(38); "Measured"
PRINT TAB( 9); INPUTTYPE$;
PRINT TAB(22); "Output ("; UNIT$; ")"; TAB(37); "Output ("; UNIT$; ")*";
PRINT TAB(53); "Error (%)"; TAB(67); "Status"
PRINT TAB(8); "----------"; TAB(22); "-----------"; TAB(37); "-----------";
PRINT TAB(52); "----------"; TAB(66); "--------"
'8 22 37 52 66
' Iin (mA)
' Vin (V) Output (mA) Output (mA) Error (%) Status
'---------- ----------- ----------- ---------- --------
' #####.##
' +####.##
'+###.### +##.### +##.### +###.### &&&&
IF PON% = 1 AND OUTLOAD! <= 1 THEN
LPRINT TAB(34); "ACCURACY TEST"
LPRINT
LPRINT TAB(23); "Calculated"; TAB(38); "Measured"
IF SNM% = 2 THEN 'Current input modules
LPRINT TAB(9); "Iin (mA)";
'
ELSE 'Voltage input modules
LPRINT TAB(10); "Vin (V)";
'
END IF
LPRINT TAB(22); "Output ("; UNIT$; ")"; TAB(37); "Output ("; UNIT$; ")*";
LPRINT TAB(53); "Error (%)"; TAB(67); "Status"
LPRINT TAB(8); "----------"; TAB(22); "-----------"; TAB(37); "-----------";
LPRINT TAB(52); "----------"; TAB(66); "--------"
END IF
INC% = 0 'Array element
NUMPTS% = 5 'Number of points in test
IF LOGDAT% > 0 THEN
INPUT "Enter the number of points to be tested "; NUMPTS%
INPUT "Enter file name "; F$
F$ = "C:\QB45\JJM\" + F$
OPEN F$ FOR OUTPUT AS #3
WRITE #3, (MAXIN! - MININ!)
WRITE #3, MININ!
WRITE #3, NUMPTS%
END IF
FAILED% = 0
LINSTEP! = (MAXIN! - MININ!) / (NUMPTS% - 1)
'LINSTEP!/2 ensures NUMPTS% test point
FOR MODIN! = MININ! TO MAXIN! + LINSTEP! / 2 STEP LINSTEP!
INC% = INC% + 1
IF INC% = 1 THEN
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
END IF
IF SNM% = 2 THEN
MEASIN! = SETCURRENTIN!(MODIN!)
ELSE
CALL SETDAC2(MODIN!, 1, 0) 'Sets input voltage
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CALL LOADMUX(1, CON%)
CALL WRITEDVM(VODC$, MODIN!) 'Sets meter to read
MEASIN! = READDVM!(INRANGE! * MAXACCERR! / 100! / 10!)'10x better than accuracy
IF ABS(MODIN!) > 10.1 AND ABS(MODIN!) - ABS(MEASIN!) > 1 THEN
'Power supply current limit tripped
PRINT "Multiple MUX channels are ON"
PRINT "Notify engineering about problem"
CONTINUE
' SL$ = SETPOWER$(VINADDR%, ABS(MODIN!), FUNC$) 'Set Vin
' CALL pause(2!)
' MEASIN! = READDVM!(INRANGE! * MAXACCERR! / 100! / 10!)'10x better than accuracy
END IF
CALL LOADMUX(1, COFF%)
END IF
CALL WRITEDVM("S1", 0) 'Medium reading rate
TSIM!(INC%) = MEASIN!
OUTCALC!(INC%) = MODULEOUT!(TSIM!(INC%))
CALL LOADMUX(2, CON%)
CALL WRITEDVM(VODC$, OUTCALC!(INC%) * IOUTSEN.MEAS!) 'Sets meter to read output
OUTMEAS!(INC%) = READDVM!(.00005 * ORANGE!) / IOUTSEN.MEAS!'.005% tolerance
ERROROUT!(INC%) = (OUTMEAS!(INC%) - OUTCALC!(INC%)) / ORANGE! * 100! 'Error (%)
IF LOGDAT% > 0 THEN WRITE #3, ERROROUT!(INC%)
CALL LOADMUX(2, COFF%)
IF SNM% <> 2 AND ABS(MODIN!) > 10.1 THEN '10.1V limit matches that of SETDAC2
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Disable power supply
END IF
IF ABS(ERROROUT!(INC%)) <= MAXACCERR! THEN
ACCSTAT$(INC%) = "PASS"
ELSE
ACCSTAT$(INC%) = "FAIL"
FAILED% = FAILED% + 1
SOUND 800, .5
END IF
'Voltage or current input modules
PRINT TAB(8); USING "+###.### +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%) * SCALE!; OUTMEAS!(INC%) * SCALE!; ERROROUT!(INC%);
IF LEFT$(ACCSTAT$(INC%), 4) = "FAIL" THEN COLOR 12, 0
PRINT TAB(68); ACCSTAT$(INC%)
COLOR 11, 0
IF PON% = 1 AND OUTLOAD! <= 1 THEN
'Voltage or current input modules
LPRINT TAB(8); USING "+###.### +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%) * SCALE!; OUTMEAS!(INC%) * SCALE!; ERROROUT!(INC%);
LPRINT TAB(68); ACCSTAT$(INC%)
END IF
IF ABS(ERROROUT!(INC%)) > ABS(ACCERR!) THEN
ACCERR! = ERROROUT!(INC%)
END IF
'Variables used to calculate the best fit line using linear regression.
SMODIN! = SMODIN! + TSIM!(INC%)
SSMODIN! = SSMODIN! + TSIM!(INC%) ^ 2
SERR! = SERR! + ERROROUT!(INC%)
SPROD! = SPROD! + TSIM!(INC%) * ERROROUT!(INC%)
'If DAC limitation was exceeded, reset MODIN!
IF INC% = 1 AND ABS(MODIN! - MININ!) > VERNMIN! THEN MODIN! = MININ!
NEXT
IF LOGDAT% > 0 THEN CLOSE #3
IF FAILED% = 0 THEN
ACC$ = "PASS"
ELSE
ACC$ = "FAIL"
SOUND 800, .5
END IF
SLOPE! = ((NUMPTS% * SPROD!) - (SMODIN! * SERR!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
OFFSET1! = ((SERR! * SSMODIN!) - (SMODIN! * SPROD!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
BFERR! = ABS(BESTFIT!(SLOPE!, OFFSET1!, TSIM!(), NUMPTS%, ERROROUT!()))
IF ABS(BFERR!) <= MAXLINERR! THEN
BF$ = "PASS"
ELSE
SOUND 600, .5
BF$ = "FAIL"
END IF
PRINT
PRINT TAB(10); "Accuracy status: ";
IF LEFT$(ACC$, 4) = "FAIL" THEN COLOR 12, 0
PRINT ACC$
COLOR 11, 0
PRINT TAB(10); "Measured accuracy error is";
PRINT TAB(50); USING " +###.### %"; ACCERR!
PRINT TAB(10); "Maximum accuracy error is";
PRINT TAB(50); USING "+/-##.### %"; MAXACCERR!
PRINT
PRINT TAB(10); "Linearity status: ";
IF BF$ = "FAIL" THEN COLOR 12, 0
PRINT BF$
COLOR 11, 0
PRINT TAB(10); "Measured best-fit linearity error is";
PRINT TAB(50); USING "+/-###.### %"; BFERR!
PRINT TAB(10); "Maximum best-fit linearity error is";
PRINT TAB(50); USING "+/- ##.### %"; MAXLINERR!
ACC$ = ACC$ + STR$(ACCERR!) + "3" '% span
LINTEST$ = BF$ + STR$(BFERR!) + "3" 'append # decimal places
IF SPECS.OUTSIGTYPE = "VOLTAGE" THEN 'Remove output load, DSCA49
CALL SETOUTLOAD(5000!)
END IF
CALL RESETTH 'Reset the test head
CALL PAUSE(1!)
END FUNCTION
'*******************************
SUB LOGIT (STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!)
IF FAILS%(STATUS$()) = 0 OR LEFT$(SN$, 6) = "1000HR" THEN
OPEN "C:\ATE\DSCLOG\" + RTRIM$(MID$(SPECS.MODNAME, 5, 8)) + ".DAT" FOR APPEND AS #4
OPEN "C:\ATE\LOGPATH.ADR" FOR INPUT AS #7
INPUT #7, LOGPATH$
CLOSE #7
OPEN LOGPATH$ + "\DSCLOG\" + RTRIM$(MID$(SPECS.MODNAME, 5, 8)) + ".DAT" FOR APPEND AS #8
NUMPTS% = 5
'builds a sequential file. 20 records required for 1 module
WRITE #4, SPECS.MODNAME
WRITE #8, SPECS.MODNAME
FOR INC% = 1 TO NUMPTS%
WRITE #4, TSIM!(INC%), OUTCALC!(INC%), OUTMEAS!(INC%), ERROROUT!(INC%), ACCSTAT$(INC%)
WRITE #8, TSIM!(INC%), OUTCALC!(INC%), OUTMEAS!(INC%), ERROROUT!(INC%), ACCSTAT$(INC%)
NEXT
FOR INC% = 0 TO 14 STEP 5
WRITE #4, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4), STATUS$(INC% + 5)
WRITE #8, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4), STATUS$(INC% + 5)
NEXT
WRITE #4, STATUS$(16), STATUS$(17), STATUS$(18)
WRITE #8, STATUS$(16), STATUS$(17), STATUS$(18)
WRITE #4, SN$, DATE$
WRITE #8, SN$, DATE$
CLOSE #4
CLOSE #8
END IF
END SUB
'*******************************
FUNCTION MEASRES! (OHM!, RESNUM%, TE$)
'Measure specified resistance
'Legend:
'RESNUM% Resistor
'------- --------
' 1 On board supply current sense resistor, not used.
' 2 Input current source sense resistor, 192 ohm
' 3 Output current sense resistor, 192 ohm
' 4 Output current sense resistor, 5 ohm
' 5 Output current sense or load resistor
' TE1055; 500 or 750 ohm
' TE1054; 100, 200, 1000 or 2000 ohm
'
'* TE$ not used in this program.
SELECT CASE RESNUM% 'Branches to the specific measurement
CASE 1
CALL WRITEDVM(OHM2$, OHM! / 1000) 'Sets meter
CALL LOADMUX(3, CON%) 'Sets mux channel
MEASTOL! = .001 '0.1% measurement tolerance
INITTOL! = .2 '20% initial tolerance
CASE 2
'Update commands below for Vout and Iout test heads
CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter
CALL LOADMUX(3, CON%) 'Sets mux channel
CALL LOADMUX(3, CON%) 'Sets mux channel
CALL LOADMUX(7, CON%) 'set sense channel
MEASTOL! = .00001 '0.001% measurement tolerance
INITTOL! = .05 '5% initial tolerance
CLS
LOCATE 10, 10: PRINT "Measuring Input Sense Resistor. Please Wait..."
CASE 3
CB1VAL% = CB1VAL% OR &H1 '0 0 0 0 0 0 0 1
CALL SETTH(CB1VAL%, CB1%) 'Disconnect +OUT from load
'for accurate 4-wire ohms meas.
CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter
CALL LOADMUX(2, CON%) 'Sets mux channel
CALL LOADMUX(8, CON%) 'set sense channel
MEASTOL! = .00001 '0.001% measurement tolerance
INITTOL! = .05 '5% initial tolerance
CLS
LOCATE 10, 10: PRINT "Measuring Load Resistor. Please Wait..."
CASE 4
CB1VAL% = CB1VAL% OR &H1 '0 0 0 0 0 0 0 1
CALL SETTH(CB1VAL%, CB1%) 'Disconnect +OUT from load
'for accurate 4-wire ohms meas.
CALL WRITEDVM(OHM4$, OHM! / 1000) 'Sets meter
CALL LOADMUX(2, CON%) 'Sets mux channel
CALL LOADMUX(6, CON%) 'set sense channel
MEASTOL! = .00001 '0.001% measurement tolerance
INITTOL! = .05 '5% initial tolerance
CASE 5
CB1VAL% = CB1VAL% OR &H1 '0 0 0 0 0 0 0 1
CALL SETTH(CB1VAL%, CB1%) 'Disconnect +OUT from load
CALL WRITEDVM(OHM2$, OHM! / 1000) 'Sets meter
CALL LOADMUX(2, CON%) 'Sets mux channel
'
MEASTOL! = .001 '0.1% measurement tolerance
INITTOL! = .05 '5% initial tolerance
' CASE 6 NOT USED
' CASE 7 NOT USED
' CASE 8 NOT USED
END SELECT
TEMP! = READDVM!(OHM! * MEASTOL!) 'Measure resistor value to +/-0.01%
IF OHM! > 1! AND ABS(TEMP! - OHM!) > (OHM! * INITTOL!) THEN 'Test for 15% deviation
CLS
LOCATE 10, 10
PRINT "Measured resistance = "; TEMP!; " ohms."
PRINT TAB(10); "Required resistance = "; OHM!; "ohms."
PRINT TAB(10); "Check system setup and restart program."
PRINT TAB(10); "If the failure continues, notify engineering."
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Turn off loop power
END
END IF
IF RESNUM% = 3 OR RESNUM% = 4 OR RESNUM% = 5 THEN
CB1VAL% = CB1VAL% AND &HFE '1 1 1 1 1 1 1 0
CALL SETTH(CB1VAL%, CB1%) 'Connect Iout to load
END IF
CALL WRITEDVM(VODC$, 1!) 'Resets meter
CALL LOADMUX(0, CON%) 'Clears mux
MEASRES! = TEMP! 'Passes resistor value back
END FUNCTION
'*******************************
FUNCTION MENU1%
' ***** PROGRAM CONTROL MENU 1 *****
COLOR 15, 0, 0 ' cjt these 2 lines get rid of screen artifacts
CLS
COLOR 14, 0, 0
LOCATE 5, 23: PRINT "DSCA39,49-xx AUTOMATED TEST EQUIPMENT"
LOCATE 6, 23: PRINT "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
COLOR 11, 0, 0
LOCATE 8, 24: PRINT "1.) Functional Test"
LOCATE 9, 24: PRINT "2.) Pre-Burn-In Complete Test"
LOCATE 10, 24: PRINT " (No Printout)"
LOCATE 11, 24: PRINT "3.) Post-Burn-In Complete Test"
LOCATE 12, 24: PRINT " (Optional Printout)"
LOCATE 13, 24: PRINT "4.) Sealed Module Retest"
LOCATE 14, 24: PRINT " (No Adjustments, Optional Printout)"
LOCATE 15, 24: PRINT "5.) Individual Test Menu"
LOCATE 17, 24: PRINT "6.) Return to the FAMILY TYPE menu"
LOCATE 20, 16: PRINT ""
LOCATE 22, 16: PRINT "Press the F10 key at any time to exit the program."
DO
I$ = INKEY$
LOOP WHILE VAL(I$) < 1 OR VAL(I$) > 6
MENU1% = VAL(I$)
END FUNCTION
'*******************************
FUNCTION MENU2%
CLS
COLOR 14, 0, 0
LOCATE 2, 23: PRINT "DSCA39,49-xx AUTOMATED TEST EQUIPMENT"
LOCATE 3, 22: PRINT "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
COLOR 11, 0, 0
LOCATE 5, 9: PRINT "1.) Supply Current Test, Min. Output Load"
LOCATE 6, 9: PRINT "2.) Supply Current Test, Max. Output Load"
LOCATE 7, 9: PRINT "3.) Offset & Gain Calibration"
LOCATE 8, 9: PRINT "4.) Linearity / Accuracy Test"
LOCATE 9, 9: PRINT "5.) Current Limit Test"
LOCATE 10, 9: PRINT "6.) Over-Range Test"
LOCATE 11, 9: PRINT "7.) Power Supply Sensitivity Test"
LOCATE 12, 9: PRINT "8.) Input Resistance & Bias Current Test"
LOCATE 13, 9: PRINT "9.) Frequency Response Test"
LOCATE 14, 9: PRINT "A.) Step Response Test"
LOCATE 15, 9: PRINT "B.) Output Noise Test"
LOCATE 16, 9: PRINT "C.) Output Current @ Min./Max. Load Test (DSCA39 ONLY)"
LOCATE 17, 9: PRINT "D.) Notes On ATE Operation"
LOCATE 18, 9: PRINT "E.) Printer Output = ";
IF PON% > 0 THEN
LOCATE 18, 31: PRINT "ON"
ELSE
LOCATE 18, 31: PRINT "OFF"
END IF
LOCATE 19, 9: PRINT "F.) Log Linearity Test Data = ";
IF LOGDAT% > 0 THEN
LOCATE 19, 31: PRINT "ON"
ELSE
LOCATE 19, 31: PRINT "OFF"
END IF
LOCATE 20, 9: PRINT "G.) Exit to the DSCA Main Menu"
LOCATE 21, 9: PRINT "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% > 72)
IF C% > 57 THEN
MENU2% = C% - 55
ELSE
MENU2% = C% - 48
END IF
END FUNCTION
'*******************************
FUNCTION MENU3%
CLS
COLOR 14, 0, 0
LOCATE 3, 26: PRINT "Module Family Selection Menu"
LOCATE 4, 26: PRINT "---------------------------"
COLOR 11, 0, 0
LOCATE 6, 34: PRINT "1.) DSCA39-xx"
LOCATE 7, 34: PRINT "2.) DSCA49-xx"
LOCATE 8, 34: PRINT "3.) Return to the FAMILY TYPE menu"
DO
I$ = INKEY$
LOOP WHILE VAL(I$) < 1 OR VAL(I$) > 3
M3% = VAL(I$)
IF M3% = 1 THEN 'Parallel port, mux & test head addresses
TE$ = "TE1055" 'Current output test head
FILENAME$ = "KDSCIOUT.ADR"
ELSE
TE$ = "TE1054" 'Voltage output test head
FILENAME$ = "KDSCVOUT.ADR"
END IF
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
MENU3% = M3%
END FUNCTION
SUB NOTES
'Notes on ATE operation
CLS
LOCATE 5, 25: PRINT "AUTOMATED TEST EQUIPMENT NOTES"
LOCATE 7, 10: PRINT "1.) During the calibration subroutines the following keystrokes"
LOCATE 8, 14: PRINT "can be used:"
LOCATE 10, 14: PRINT "(C)alibrate will exit the routine and continue"
LOCATE 11, 14: PRINT "program execution."
LOCATE 13, 14: PRINT "(T)roubleshoot will pause the program. The DVM will continuously"
LOCATE 14, 14: PRINT "display the calibration reading."
LOCATE 16, 10: PRINT "2.) Press (F10) at any time to break out of the program and"
LOCATE 17, 14: PRINT "return to DOS."
CALL CONTINUE
END SUB
'*******************************
SUB LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
'Sub to write the data log, datasheet, and work order status files (and inform the
'operator of these operations)
KEY(10) OFF 'Deactivates F10 key
CALL INTERLUDE
'CLS
PRINT "" 'Blank line
PRINT TAB(10); "Logging test results."
CALL LOGIT(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Logs test data to disk
PRINT TAB(10); "Writing datasheet file."
CALL DATASHEETWRITE (SN$, STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TX%, OUTLOAD!)
PRINT TAB(10); "Writing status to work order status file."
CALL WORKORDERLINE(FAILS%(STATUS$()), SN$)
CALL DATASHEETPRINT (SN$, STATUS$())
'CALL INTERLUDE
COLOR 11, 0, 0 'Cyan on black background
KEY(10) ON 'Reactivates F10 key
END SUB