Extends the Test Datasheet Pipeline on AD2:C:\Shares\testdatadb to
generate web-published datasheets for the SCMVAS-Mxxx (obsolete) and
SCMHVAS-Mxxxx (replacement) High Voltage Input Module product lines.
Both are tested either with the existing TESTHV3 software (production
VASLOG .DAT logs) or in Engineering with plain .txt output.
Key changes on AD2 (all deployed 2026-04-12 with dated backups):
- parsers/spec-reader.js: getSpecs() returns a `{_family:'SCMVAS',
_noSpecs:true}` sentinel for SCMVAS/SCMHVAS/VAS-M/HVAS-M model prefixes
so the export pipeline does not silently skip them for missing specs.
- templates/datasheet-exact.js: new Accuracy-only template branch
(generateSCMVASDatasheet + helpers) that mirrors the existing shipped
format byte-for-byte. Extraction regex covers both QuickBASIC STR$()
output formats: scientific-with-trailing-status-digit (98.4% of
records) and plain-decimal (1.6% of records above QB's threshold).
- parsers/vaslog-engtxt.js (new): parses the Engineering-Tested .txt
files in TS-3R\LOGS\VASLOG\VASLOG - Engineering Tested\. Filename SN
regex strips optional trailing 14-digit timestamp; in-file "SN:"
header is the authoritative source when the filename is malformed.
- database/import.js: LOG_TYPES grows a VASLOG_ENG entry with
subfolder + recursive flags. Pre-existing 7 log types keep their
implicit recursive=true behaviour (config.recursive !== false).
importFiles() routes VASLOG_ENG paths before the generic loop so a
VASLOG - Engineering Tested/*.txt path does not mis-dispatch to the
multiline parser.
- database/export-datasheets.js: VASLOG_ENG records are written
verbatim via fs.copyFileSync(source_file, For_Web/<SN>.TXT) for true
byte-level pass-through, with a graceful raw_data fallback when the
source file is no longer on disk.
Deploy outcome:
- 27,503 SCMVAS/SCMHVAS datasheets rendered (27,065 from scientific +
438 from plain-decimal PASS lines, post-patch rerun)
- 434 Engineering-Tested .txt files pass-through-copied to For_Web
- 0 errors across both batches
Repo layout added here:
- scmvas-hvas-research/: discovery artifacts (source .BAS, hvin.dat,
sample .DAT + .txt, binary-format notes, IMPLEMENTATION_PLAN.md)
- implementation/: staged final code + deploy helpers + local test
harness + per-step verification scripts
- backups/pre-deploy-20260412/: independent local snapshot of the 4
AD2 files replaced, pulled byte-for-byte before deploy
All helper scripts fetch the AD2 password at runtime from the SOPS
vault (clients/dataforth/ad2.sops.yaml). None of the committed files
contain the plaintext credential. Known vault-entry hygiene issue
(stale shell-escape backslash before the `!`) is documented in the
fetcher comments and stripped at read-time; flagged separately for
cleanup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2819 lines
105 KiB
QBasic
2819 lines
105 KiB
QBasic
'**************************** TESTHV3 ***********************************
|
|
' NAME: TESTHV4.BAS
|
|
' PURPOSE: AUTOMATED TEST SOFTWARE FOR HIGH-VOLTAGE
|
|
' VOLTAGE-INPUT PRODUCT TESTING
|
|
' COMPILER: Quick Basic 4.5
|
|
' AUTHOR: John Lehman
|
|
' DATE: 06/18/99
|
|
'************************* REVISION RECORD *******************************
|
|
'DATE REV APPR DESCRIPTION
|
|
'---- --- ---- -----------
|
|
'06/18/99 1.00 JL Initial Release
|
|
' ...
|
|
' ... See "Revs.txt" file for program update comments within this time interval.
|
|
' ...
|
|
'2014/06/25 B.1 PWR See TESTHV3.BAS for update notes.
|
|
'
|
|
'******** Declare some useful constants *******
|
|
CONST MAXSTATUSINDEX = 17 'Maximum index of the Status array
|
|
|
|
'***************** DEVICE COMMUNICATIONS ROUTINES *************************
|
|
'Kepco DPS 125-0.5M control routines via RS-232C
|
|
DECLARE SUB INIT488 (DEVADDR%)
|
|
DECLARE SUB INITPS (DPSADDR%, OVERI!, OVERV!) 'Initializes supply
|
|
DECLARE SUB SETDPS (DPSADDR%, VSUPPLY!) 'Sets Kepco DPS power supply
|
|
DECLARE FUNCTION POWERIO$ (DPSADDR%, CMD$) 'Actual I/O commands
|
|
DECLARE FUNCTION SETSCM5BPWR! (VSUPPLY!) 'Sets SCM5B supply voltage
|
|
|
|
'HP33120A (function generator) control routines via GPIB
|
|
DECLARE SUB CONFDUTIN (ONOFF%) 'Configure test head for inverted or non-inverted DUT input power supply conn.
|
|
DECLARE SUB IO488 (DDATA$, DEVADDR%, SEL%)
|
|
|
|
'HP34970A (data acquisition/switch unit) control routines via GPIB
|
|
DECLARE SUB DVMCONF (CH%, FUNC$, RANGETXT$, RANGENUM!, RESOLTXT$, RESOLNUM!) 'Configure DVM
|
|
DECLARE SUB DVMSENS (CH%, FUNC1$, FUNC2$, SETTXT$, SETNUM!) 'Configure DVM
|
|
DECLARE SUB HVRELAY (RELAY%, ONOFF%)
|
|
DECLARE SUB SETDAC3 (DACNUM%, VOLTAGE!) 'Set 34907 DACs
|
|
DECLARE SUB SETSWITCH (CH%, STATE%) 'Set switch on 34903A 20-ch actuator
|
|
DECLARE FUNCTION GETREADING! () '** Send trigger & read DVM
|
|
DECLARE FUNCTION READDVM! (CH%, FUNC$, RANGETXT$, RANGENUM!, RESOLTXT$, RESOLNUM!)
|
|
|
|
'Fluke 760A (meter calibrator) routines
|
|
DECLARE SUB FLUKE760APANEL (VALUE!, UNITS%) 'Display front panel settings
|
|
|
|
'********************* TOP LEVEL TEST ROUTINES ****************************
|
|
DECLARE SUB COMPTEST (STATUS$(), ITERATION%, CAL%, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), NUMDUT%, TTYPE%, TSPEC$(), SERNO$()) 'Complete set of tests
|
|
'DECLARE SUB FUNCTEST (CAL%, STATUS$(), NUMDUT%, TSPEC$()) 'Routines for functional test
|
|
DECLARE SUB FUNCTEST (STATUS$(), CAL%, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), NUMDUT%, TTYPE%, TSPEC$(), SERNO$()) 'Routines for functional test
|
|
DECLARE SUB INDIVID (SEL%, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), STATUS$(), NUMDUT%) 'Performs the tests individually
|
|
|
|
'********* USER INTERFACE, REPORTING, AND LOGGING ROUTINES ****************
|
|
DECLARE FUNCTION MENU1% () 'Gets the Test Group selection
|
|
DECLARE FUNCTION MENU2% () 'Gets the individual test #
|
|
DECLARE FUNCTION MENU3% () 'Gets the module family
|
|
DECLARE FUNCTION SNMENU$ (SLOTNO%, SERNO$, SNFLAG%) 'Selection menu to change the SN information of unit in slots 2 or higher
|
|
DECLARE SUB CHANGEDN (SN$) 'Allow user to change dash number
|
|
DECLARE SUB FOOTER (STATUS$(), L%) 'Sends footer to printer if all tests passed
|
|
DECLARE SUB GETNEXTSN (TIME2!, SERNO$(), NUMDUT%) 'Allows user the change the SN info for a new group of modules
|
|
DECLARE SUB GETSN (SN$) 'Gets DUT serial number from user
|
|
DECLARE SUB HEADERA (SN$) 'Prints test sheet header
|
|
DECLARE SUB HEADERB (TESTTITLE$, L%) 'Prints test screen header
|
|
DECLARE SUB INPUTSN (SN$, SERNO$(), NUMDUT%) 'Gathers the SN information for the unit in channel 1
|
|
DECLARE SUB LOGIT (STATUS$(), SN$, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), L%) 'Logs test results to disk
|
|
DECLARE SUB MODOUTLINE () 'Draw module bottom view.
|
|
DECLARE SUB NOTES () 'Notes on ATE operation
|
|
DECLARE SUB REPORT (STATUS$(), SN$, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), NUMDUT%, TTYPE%) 'Prints test data on screen
|
|
DECLARE SUB SORTDB (ENDFLAG%) 'Sort model database
|
|
DECLARE FUNCTION GETWO$ () 'Gets and returns the work order number
|
|
DECLARE FUNCTION GETDS$ (ISNEWDS%, SN$) 'Gets and returns the dash number
|
|
|
|
'*********************** DATABASE OPERATIONS ******************************
|
|
DECLARE SUB GETADD () 'Get system component addresses
|
|
DECLARE SUB GETSPECS (NUMDUT%) 'Gets module type and specifications
|
|
DECLARE SUB TSPECS (TSPEC$()) 'Creates a string array of test specifications
|
|
|
|
'**************** TEST DECISIONING / CALCULATION ROUTINES ******************
|
|
DECLARE FUNCTION BESTFIT! (SLOPE!, OFFSET1!, INSIM!(), NUMPTS%, ERROROUT!(), L%)
|
|
DECLARE FUNCTION FAILS% (STATUS$(), NUMDUT%) 'Tests for failed tests
|
|
DECLARE FUNCTION REPEAT$ (MN$, ELAP2!, TIME2!) 'Ask if you would like to repeat test
|
|
DECLARE FUNCTION MEASRES! (OHM!, RESNUM%, L%) 'Measure specified sense resistor
|
|
DECLARE FUNCTION MODULEOUT! (SENOUT!) 'calculates DUT output based on input
|
|
DECLARE SUB INSTALLDUT (NUMDUT%) 'Direct installation of DUTs and return #
|
|
DECLARE SUB SETOUTLOAD (LOAD!, NUMDUT%) 'Set output load for current output
|
|
|
|
'*********************** CALIBRATION ROUTINES ******************************
|
|
DECLARE SUB CALSEQ (NUMDUT%, STATUS$()) 'Determine & perform calibration sequence
|
|
DECLARE SUB GAINCAL (CAL%, AMPL!, INTERACT!, OSERR2!(), NUMDUT%, STATUS$()) 'Performs Gain Calibration
|
|
DECLARE SUB OFFSETCAL (CAL%, NUMDUT%, STATUS$()) 'Performs Offset Calibration
|
|
DECLARE FUNCTION SETDUTIN! (DUTIN!) 'Set high level RMS input to D.U.T.
|
|
|
|
'************************* ACCURACY ROUTINES *******************************
|
|
DECLARE SUB LINTEST (INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), NUMDUT%, STATUS$()) 'Performs Accuracy and Linearity Tests
|
|
|
|
'************************* OTHER DUT TESTS *********************************
|
|
DECLARE SUB ENABLE (DUT%, ONOFF%) 'Sets the state of the SCM5B output switch
|
|
DECLARE SUB IOUTMAXL (NUMDUT%, STATUS$()) 'Test current source compliance
|
|
DECLARE SUB OUTPUTNOISE (NUMDUT%, STATUS$()) 'Test module output noise
|
|
DECLARE SUB OUTSWITCH (NUMDUT%, STATUS$()) 'Test SCM5B output switch operation
|
|
DECLARE SUB SUPPLYI (NUMDUT%, STATUS$()) 'Measure module supply current
|
|
DECLARE SUB SUPPLYSEN (NUMDUT%, STATUS$()) 'Measure module supply sensitivity
|
|
|
|
'***************** MISCELLANEOUS HOUSEKEEPING ROUTINES *********************
|
|
DECLARE SUB CONTINUE () 'Waits for a key press
|
|
DECLARE SUB PAUSE (TIME!) 'Delays program for TIME!
|
|
DECLARE FUNCTION KEYBDIN$ () 'Gets input from keyboard
|
|
DECLARE FUNCTION UPSN$ (OLDSN$) '** Increments dash# of serial#
|
|
|
|
'******* Added Functions and Subs for Work Order Status File (etc.) version **********
|
|
DECLARE FUNCTION LIBVERVAL$ () 'Function to return the library source file version
|
|
DECLARE FUNCTION PROGVERVAL$ () 'Function to return the program source file version
|
|
DECLARE FUNCTION PROGNAMEVAL$ () 'Function to return the program executable file name
|
|
DECLARE SUB CHECKRESOURCES (CHECKFILES%) 'Checks whether the datasheet and work order status files can be written.
|
|
DECLARE FUNCTION CHECKFILECREATE% (FOLDERNAME$, FILENAME$, KEYTOPRESS$) 'Checks whether the file can be written to the folder.
|
|
DECLARE FUNCTION CHECKPRINTER% (PrinterMessage$) 'Checks to see of the printer can print.
|
|
DECLARE SUB FAILSTATUS (TSITE%, TESTVALUE$, YLOC%, XLOC%, TEXTVALUE$, SPACES%)
|
|
DECLARE SUB INTERLUDE () ' WAIT FOR USER
|
|
DECLARE SUB WORKORDERLINE (FAILSTATE%, SN$)
|
|
DECLARE SUB WORKORDERPRINT (SN$)
|
|
DECLARE SUB WORKORDERHEADER (SN$)
|
|
DECLARE SUB GETDSFNAME (SN$, DSSNAME$, DSFNAME$) 'Gets datasheet search and file names from serial number
|
|
DECLARE SUB HARDCOPY ()
|
|
DECLARE SUB SNPARSE (SN$, WO$, DS$)
|
|
DECLARE FUNCTION WAITFORKEY$ (KEY$, TABPOS%, FORECOL%, BACKCOL%)
|
|
DECLARE FUNCTION GETWOSFNAME$ (SN$) 'Returns work order status file name from serial number
|
|
DECLARE SUB STARTCFG () 'Performs module-input configuration before testing
|
|
DECLARE SUB ENDCFG () 'Performs module-input configuration after testing
|
|
DECLARE SUB CLEARUNITSMSG () 'Displays message to clear modules from testhead
|
|
DECLARE FUNCTION GETWO$ () 'Gets and returns the work order number
|
|
DECLARE FUNCTION GETDS$ (ISNEWDS%, SN$) 'Gets and returns the dash number
|
|
DECLARE FUNCTION ISDUPLICATESN% (SERNO$, NUMDUT%) 'Check for duplicate serial numbers
|
|
DECLARE SUB CHECKFORPAPERMSG () 'Displays message to check for paper in the printer
|
|
DECLARE FUNCTION INSTRERROR$ (INSTRADDR%) 'Reads error status from the Agilent 33120A or 33970A
|
|
DECLARE SUB INSTRERRORS (INSTRADDR%, DISPLAYERRS%) 'Clears the Agilent 33120A or 34970A error queue by reading all errors
|
|
DECLARE SUB SHOWDIO (DIODATA%, WORNO%, DEBUGVAL%) 'Displays stored value for DIO word.
|
|
DECLARE SUB FINISHSUB () 'Subroutine to run at "FINISH" label (after F10 keypress).
|
|
|
|
'Database Record definition for the specifications
|
|
TYPE DBASE
|
|
MODNAME AS STRING * 13 'DSCA-XXXX or SCM5B-XXXX
|
|
INTYPE AS STRING * 3 ''V' OR 'A'
|
|
MININ AS SINGLE 'Minus F.S. input (V or I)
|
|
MAXIN AS SINGLE 'Plus F.S. input (V or I)
|
|
OUTSIGTYPE AS STRING * 7 ''VOLTAGE' or 'CURRENT'
|
|
MINOUT AS SINGLE 'Minus F.S. output (V or I)
|
|
MAXOUT AS SINGLE 'Plus F.S. output (V or I)
|
|
WAVESHPCAL AS STRING * 8 ''SINE', 'SQUARE', 'TRIANGLE', 'RAMP'
|
|
FINCAL AS SINGLE 'Calibration Frequency input (Hz)
|
|
FINMIN AS SINGLE 'Minimum Std. Frequency input (Hz)
|
|
FINMAX AS SINGLE 'Highest Std. Frequency input (Hz)
|
|
FINEXTMIN AS SINGLE 'Minimum Extd. Frequency input (Hz)
|
|
FINEXTMAX AS SINGLE 'Highest Extd. Frequency input (Hz)
|
|
INPROTECT AS SINGLE 'Rated input Protection (V or I)
|
|
IOUTLIM AS SINGLE 'Current output limit (mA)
|
|
VOUTLIM AS SINGLE 'Voltage output limit (V)
|
|
OUTRES AS SINGLE 'Output resistance
|
|
OUTNOISE AS SINGLE 'Output noise/ripple 100kHz BW (RMS)
|
|
OSCALIN AS SINGLE 'Module input for offset calibration
|
|
GNCALIN AS SINGLE 'Module input for gain calibration
|
|
OSCALPT AS SINGLE 'Offset cal point (%span)
|
|
GNCALPT AS SINGLE 'Gain cal point (%span)
|
|
CALTOL AS SINGLE 'Calibration tolerance (%span)
|
|
ADJ AS SINGLE 'User Adjustability Range (%span)
|
|
LINEAR AS SINGLE 'Linearity (% span) at sine input and FINCAL
|
|
ACCSINCAL AS SINGLE 'Sine accuracy (%span) at CALFIN
|
|
ACCSINSTD AS SINGLE 'Sine accuracy (%span) from FINMIN to FIMMAX
|
|
ACCSINEXT AS SINGLE 'Sine accuracy (%span) from FINEXTMIN to FINEXTMAX
|
|
ACCCF12 AS SINGLE 'C.F. = 1 TO 2 accuracy (%span) at FINCAL
|
|
ACCCF23 AS SINGLE 'C.F. = 2 TO 3 accuracy (%span) at FINCAL
|
|
ACCCF34 AS SINGLE 'C.F. = 3 TO 4 accuracy (%span) at FINCAL
|
|
ACCCF45 AS SINGLE 'C.F. = 4 TO 5 accuracy (%span) at FINCAL
|
|
CMR AS SINGLE 'Common Mode Rejection (dB)
|
|
STEPTIME AS SINGLE 'Test time for step response
|
|
STEPPERC AS SINGLE '% F.S. @ STEPTIME
|
|
STEPTOL AS SINGLE 'STEPPERC measurement tolerance
|
|
LOOPVMIN AS SINGLE 'Output Loop Voltage min (V)
|
|
LOOPVNOM AS SINGLE 'Output Loop Voltage nom (V)
|
|
LOOPVMAX AS SINGLE 'Output Loop Voltage max (V)
|
|
MAXLOADR AS SINGLE 'Maximum load resistance (ohms)
|
|
MINVS AS SINGLE 'Lowest supply voltage (V)
|
|
NOMVS AS SINGLE 'Nominal supply voltage (V)
|
|
MAXVS AS SINGLE 'Highest supply voltage (V)
|
|
ISMIN AS SINGLE 'Minimum supply current (mA)
|
|
ISMAX AS SINGLE 'Supply current, full load (mA)
|
|
PSS AS SINGLE 'Power supply sensitivity (ppm/% or %/% Delta Vs)
|
|
END TYPE
|
|
|
|
TYPE DBASE2
|
|
RECNUM AS INTEGER
|
|
MODNAME AS STRING * 13
|
|
END TYPE
|
|
|
|
'$INCLUDE: 'QB.BI2'
|
|
|
|
'define common variables
|
|
COMMON SHARED /SAMPLE/ SPECS AS DBASE
|
|
COMMON SHARED /SAMPLE/ SORTDATA1 AS DBASE2
|
|
COMMON SHARED /SAMPLE/ SORTDATA2 AS DBASE2
|
|
|
|
COMMON SHARED IINSEN1.MEAS!
|
|
COMMON SHARED IOUTSEN1.MEAS!()
|
|
COMMON SHARED IOUTSEN2.MEAS!()
|
|
COMMON SHARED IOUTSEN11.MEAS!()
|
|
COMMON SHARED SERNO$()
|
|
COMMON SHARED SN$ ' unit serial number
|
|
COMMON SHARED PSCOM$
|
|
COMMON SHARED PSPORT%
|
|
COMMON SHARED GENOUTMAX!
|
|
COMMON SHARED PCBNO$
|
|
COMMON SHARED BADDRS%
|
|
COMMON SHARED DPSADDR%
|
|
COMMON SHARED DASADDR%
|
|
COMMON SHARED GENADDR%
|
|
COMMON SHARED DIOCH01DATA%
|
|
COMMON SHARED DIOCH02DATA%
|
|
COMMON SHARED /PRTSCR/ inreg AS RegType
|
|
COMMON SHARED /PRTSCR/ outreg AS RegType
|
|
COMMON SHARED PON%, TX%, TESTPAUSE%, LOGDAT%
|
|
COMMON SHARED DPSVINADDR%, DPSVINADDR2%
|
|
COMMON SHARED DEBUGFLAG%, CAL%, TTYPE%
|
|
|
|
DIM SHARED SERNO$(1 TO 4)
|
|
|
|
'********************************************************************
|
|
'Assign constants to Kepco DPS power supply commands:
|
|
CONST PSVOLT$ = "STV=" 'Set terminal voltage
|
|
CONST SUPPLYON$ = "SOP=ON" 'Set output to ON
|
|
CONST SUPPLYOFF$ = "SOP=OFF" 'Set output to OFF
|
|
CONST ISTAT$ = "RCS" 'Read Current protection status
|
|
CONST SETIMAX$ = "SOC=" 'Set overcurrent limit...4mA resolution
|
|
CONST CURRENT$ = "RTC" 'Read output current
|
|
CONST OVERV.DSCA! = 35 'Module power supply over voltage limit, DSCA
|
|
CONST OVERV.SCM5B! = 48 'Current loop power supply over voltage limit, SCM5B
|
|
CONST PSILIMIT! = 1.4 'Module power supply over current limit
|
|
'(max spec multiplier), DSCA
|
|
CONST PSID$ = "ID" 'Power supply ID
|
|
'********************************************************************
|
|
'Assign constants to HP freq. gen. commands
|
|
CONST FREQ$ = "FREQ", VOLT$ = "VOLT", OFFS$ = "VOLT:OFFS"
|
|
CONST VUNIT$ = "VOLT:UNIT"
|
|
CONST SINE$ = "FUNC:SHAP SIN", SQUARE.CF1$ = "FUNC:SHAP SQU", TRIANGLE$ = "FUNC:SHAP TRI"
|
|
CONST SQUARE.CF2$ = "FUNC:USER ARB1", SQUARE.CF3$ = "FUNC:USER ARB2"
|
|
CONST SQUARE.CF4$ = "FUNC:USER ARB3", SQUARE.CF5$ = "FUNC:USER ARB4"
|
|
CONST BURSTON$ = "BM:STAT ON", BURSTOFF$ = "BM:STAT OFF"
|
|
CONST BURSTCNT$ = "BM:NCYC", BURSTSRCINT$ = "BM:SOUR INT"
|
|
CONST SETOUTP$ = "OUTP:LOAD INF" 'Generator output load is infinity
|
|
CONST INITWAVE$ = "APPL:SIN 60, .1, 0" 'Sine wave, .1Vrms, 60Hz, 0V offset
|
|
|
|
'********************************************************************
|
|
'Assign constants to HP DAS commands
|
|
CONST VDC$ = "VOLT:DC", VAC$ = "VOLT:AC", RES2W$ = "RES", RES4W$ = "FRES"
|
|
CONST ADC$ = "CURR:DC", AUTO$ = "AUTO"
|
|
CONST INTTIME$ = "NPLC", BW$ = "BAND", RANGE$ = "RANG"
|
|
CONST OSCOMP$ = "OCOM"
|
|
CONST DIGOUT$ = "SOUR:DIG:DATA", SETDAC$ = "SOUR:VOLT"
|
|
CONST GENOUTMIN! = .1 'HP33120A minimum output amplitude
|
|
CONST GENOUTMAXHF! = 7.07 '7.07Vrms max output, sine, any freq.,
|
|
'HP33120A direct to D.U.T.
|
|
'
|
|
'********************************************************************
|
|
'Assign constants to HP DAS configuration
|
|
CONST IINSEN2SOUR.CH% = 101 'Input current sense resistor, 100 ohm, source lines
|
|
CONST VOUTDUT1.CH% = 102 'DUT#1 output
|
|
CONST VOUTDUT2.CH% = 103 'DUT#2 output
|
|
CONST VOUTDUT3.CH% = 104 'DUT#3 output
|
|
CONST VOUTDUT4.CH% = 105 'DUT#4 output
|
|
CONST IOUTSENDUT1SOUR.CH% = 106 'Output current sense resistor DUT#1, source lines
|
|
CONST IOUTSENDUT1SEN.CH% = 116 'Output current sense resistor DUT#1, sense lines
|
|
CONST IOUTSENDUT2SOUR.CH% = 107 'Output current sense resistor DUT#2, source lines
|
|
CONST IOUTSENDUT2SEN.CH% = 117 'Output current sense resistor DUT#2, sense lines
|
|
CONST IOUTSENDUT3SOUR.CH% = 108 'Output current sense resistor DUT#3, source lines
|
|
CONST IOUTSENDUT3SEN.CH% = 118 'Output current sense resistor DUT#3, sense lines
|
|
CONST IOUTSENDUT4SOUR.CH% = 109 'Output current sense resistor DUT#4, source lines
|
|
CONST IOUTSENDUT4SEN.CH% = 119 'Output current sense resistor DUT#4, sense lines
|
|
'CH 10 NOT USED
|
|
CONST IINSEN2SEN.CH% = 111 'Input current sense resistor, 100 ohm, sense lines
|
|
CONST SCM5BVS.CH% = 112 'Supply voltage, SCM5B
|
|
CONST VIN.CH% = 113 'DUT input
|
|
'CH 14 NOT USED
|
|
CONST IINSEN1.CH% = 115 'Input current sense resistor, 0.15 ohm
|
|
CONST MEASISUPPLY1.CH% = 121 'Supply current, DUT#1 & DUT#2
|
|
CONST MEASISUPPLY2.CH% = 122 'Supply current, DUT#3 & DUT#4
|
|
'CH 20 NOT USED
|
|
|
|
CONST SWITCHISDUT1.CH% = 201 'DUT #1 supply current routing
|
|
CONST SWITCHISDUT2.CH% = 202 'DUT #2 supply current routing
|
|
CONST SWITCHISDUT3.CH% = 203 'DUT #3 supply current routing
|
|
CONST SWITCHISDUT4.CH% = 204 'DUT #4 supply current routing
|
|
CONST VLOOPDUT1.CH% = 205 'Connect Vloop to Vout, DUT#1 (SCM5B current out only)
|
|
CONST VLOOPDUT2.CH% = 206 'Connect Vloop to Vout, DUT#2 (SCM5B current out only)
|
|
CONST VLOOPDUT3.CH% = 207 'Connect Vloop to Vout, DUT#3 (SCM5B current out only)
|
|
CONST VLOOPDUT4.CH% = 208 'Connect Vloop to Vout, DUT#4 (SCM5B current out only)
|
|
CONST IOUTLOAD1DUT1.CH% = 209 'Current output main load, DUT#1, 250 ohm
|
|
CONST IOUTLOAD2DUT1.CH% = 210 'Current output max load, DUT#1, 600 ohm typ.
|
|
CONST IOUTLOAD1DUT2.CH% = 211 'Current output main load, DUT#2, 250 ohm
|
|
CONST IOUTLOAD2DUT2.CH% = 212 'Current output max load, DUT#2, 600 ohm typ.
|
|
CONST IOUTLOAD1DUT3.CH% = 213 'Current output main load, DUT#3, 250 ohm
|
|
CONST IOUTLOAD2DUT3.CH% = 214 'Current output max load, DUT#3, 600 ohm typ.
|
|
CONST IOUTLOAD1DUT4.CH% = 215 'Current output main load, DUT#4, 250 ohm
|
|
CONST IOUTLOAD2DUT4.CH% = 216 'Current output max load, DUT#4, 600 ohm typ.
|
|
CONST DUT3INPUT.CH% = 217 'DUT #1 input, V or A
|
|
CONST DUT2INPUT.CH% = 218 'DUT #2 input, V or A
|
|
CONST DUT1INPUT.CH% = 219 'DUT #3 input, V or A
|
|
CONST VSSOURCE.CH% = 220 'D.U.T. Supply Voltage
|
|
|
|
CONST HVRELAY.CH% = 301 'DIO LSB, Test head high voltage relay control
|
|
CONST RDEN.CH% = 302 'DIO MSB, RD EN/, DUT 1-4
|
|
CONST DAC1.CH% = 304 'DAC #1
|
|
CONST DAC2.CH% = 305 'DAC #2
|
|
|
|
'********************************************************************
|
|
|
|
'assign specifications which are constant for all modules
|
|
CONST IINSEN1! = .1 'Input current source sense resistor, 0.1 ohm
|
|
CONST IINSEN2! = 100 'Input current source sense resistor, 100 ohm
|
|
CONST IOUTSEN1! = 250 'Output current sense resistor, 250 ohm.
|
|
CONST IOUTSEN2! = 600 'Output current sense resistor, 600 ohm.
|
|
CONST DELTALOADTOL! = 1 'Max change in output with load (%)
|
|
'Allows for 5.4 ohm lead resistance
|
|
'and 0.1% output change
|
|
CONST NOISEFILTERR! = 160 'RC located @ meter input. 160 ohm series, 0.01uF shunt
|
|
CONST IOUTSEN3! = 10001
|
|
|
|
|
|
'CONST WORD2INIT = 255 'Initial value of DIOCH02DATA%
|
|
CONST WORD2INIT = 15 'Initial value of DIOCH02DATA%
|
|
|
|
KEY(10) ON 'Activates F10 key
|
|
ON KEY(10) GOSUB FINISH 'Traps for F10 key Exits if pressed
|
|
|
|
FINISH:
|
|
CALL FINISHSUB
|
|
END 'End of program
|
|
|
|
'******************* Test Titles and Units *****************************************
|
|
LINES: DATA "Supply Current","mA","Output Switch",""
|
|
DATA "See REPORT SUB","%","See REPORT SUB","%"
|
|
DATA "See REPORT SUB","%","See REPORT SUB","%"
|
|
DATA "See REPORT SUB","%","See REPORT SUB","%"
|
|
DATA "See REPORT SUB","%","See REPORT SUB","%"
|
|
DATA "See REPORT SUB","%","Power Supply Sensitivity",""
|
|
DATA "Offset Error","%","Gain Error","%"
|
|
DATA "Step Response @ 120ms","%"
|
|
DATA "Output Noise","%","Change in Iout with Max Load","%"
|
|
|
|
FUNCTION CHECKFILECREATE% (FOLDERNAME$, FILENAME$, KEYTOPRESS$)
|
|
'Function to check for the existence of the folder passed by
|
|
'FOLDERNAME$ by creating the file passed by FILENAME$. At the
|
|
'end, the function deletes the test file and waits for the
|
|
'operator to press the key specified by KEYTOPRESS$ to ensure
|
|
'that the messages about whether the file could be created (or
|
|
'that the folder exists and can be written to) are acknowledged.
|
|
'Since the addition of an error handler tends to cause the program
|
|
'to run out of memory to compile, this function depends on messages
|
|
'to the test operator about which files and folders are being
|
|
'checked, so if the program crashes out (which it will if there is
|
|
'an error without an error handler), the previously-displayed
|
|
'message can point to the problem file or folder.
|
|
'
|
|
CHECKFILECREATE% = 1 'Initialize to "error" return for function
|
|
PRINT TAB(10); "Attempting to open a temporary";
|
|
PRINT TAB(10); "file in the following folder...";
|
|
PRINT SPC(50);
|
|
COLOR 15, 0 'Text color to bright white on black
|
|
PRINT TAB(10); "Folder name: "; FOLDERNAME$
|
|
PRINT SPC(50);
|
|
COLOR 14, 0 'Text color to bright yellow on black
|
|
PRINT TAB(10); "Record the folder name and notify engineering";
|
|
PRINT TAB(10); "if the program crashes after this message!";
|
|
PRINT SPC(50);
|
|
COLOR 11, 0 'Text color back to light cyan (blue) on black
|
|
OPEN FOLDERNAME$ + FILENAME$ FOR OUTPUT AS #9
|
|
CLOSE #9
|
|
'Delete the file
|
|
KILL FOLDERNAME$ + FILENAME$
|
|
'CLS
|
|
'PRINT TAB(10); "Press any key to continue."
|
|
'a$ = KEYBDIN$
|
|
'DUMKEY$ = WAITFORKEY(KEYTOPRESS$, 10, 14, 0) 'Waits for specified key press (display bright yellow on black)
|
|
|
|
CHECKFILECREATE% = 0 'Return of "no error" for function (if processing gets this far)
|
|
|
|
END FUNCTION
|
|
|
|
FUNCTION CHECKPRINTER% (PrinterMessage$)
|
|
'Function to check that the printer can be written to for automatic
|
|
'printing of the work order status file at the end of testing or
|
|
'when a work order number is changed. Since the addition of an
|
|
'error handler tends to cause the program to run out of memory to
|
|
'compile, this function depends on messages to the test operator
|
|
'about the printer and the message that should be printed, so if
|
|
'the program crashes out (which it will if there is an error without
|
|
' an error handler), the previously-displayed message can point to
|
|
'the problem.
|
|
'
|
|
CHECKPRINTER% = 1 'Initialize to "error" return for function
|
|
CLS
|
|
'LOCATE 10
|
|
LOCATE 5
|
|
COLOR 14, 0, 0 'Yellow on black
|
|
PRINT TAB(10); "-----------------------------------------------------------------"
|
|
COLOR 28, 0, 0 'Flashing light red
|
|
PRINT TAB(10); "Verify that there is plenty of paper in the printer!"
|
|
COLOR 14, 0, 0 'Yellow on black
|
|
PRINT TAB(10); "-----------------------------------------------------------------"
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
PRINT SPC(50);
|
|
PRINT TAB(10); "Enough paper should be loaded in the printer to print"
|
|
PRINT TAB(10); "the W.O. Status Report in addition to any hardcopy or"
|
|
PRINT TAB(10); "datasheet printouts that may be selected."
|
|
PRINT SPC(50);
|
|
COLOR 14, 0 'Text color to bright yellow on black
|
|
PRINT TAB(10); "Notify engineering if the printer does not print the";
|
|
PRINT TAB(10); "message listed below or if the program crashes ";
|
|
PRINT TAB(10); "before the question can be answered.... ";
|
|
PRINT SPC(50);
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
PRINT TAB(10); "Now attempting to verify that the printer can print."
|
|
PRINT SPC(50);
|
|
COLOR 14, 0 'Text color to bright yellow on black
|
|
PRINT TAB(10); "Did the printer eject a sheet of paper with "
|
|
PRINT TAB(10); "the following message printed on it? "
|
|
PRINT SPC(50);
|
|
COLOR 15, 0 'Text color to bright white on black
|
|
PRINT TAB(10); PrinterMessage$
|
|
PRINT SPC(50);
|
|
'Print to printer.
|
|
OPEN "LPT1:" FOR RANDOM AS #14
|
|
PRINT #14, PrinterMessage$
|
|
PRINT #14, CHR$(12) 'Form feed
|
|
CLOSE #14
|
|
COLOR 14, 0 'Text color to bright yellow on black
|
|
PRINT TAB(10); "Enter Y or y for YES, N or n for NO"
|
|
DO
|
|
KEYRTN$ = INKEY$
|
|
KEYRTN$ = UCASE$(KEYRTN$)
|
|
LOOP WHILE (KEYRTN$ <> "N") AND (KEYRTN$ <> "Y")
|
|
IF (KEYRTN$ = "Y") THEN
|
|
CHECKPRINTER% = 0 'Return of "no error" for function (if processing gets this far)
|
|
ELSE
|
|
CHECKPRINTER% = 1 'Return of "is error" for function (if processing gets this far)
|
|
END IF
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
|
|
END FUNCTION
|
|
|
|
SUB CHECKRESOURCES (CHECKFILES%)
|
|
'Sub to check for the presence of a printer attached to the test station
|
|
'and for enough properly-loaded paper, and if CHECKFILES% is "1", to
|
|
'check for the datasheet and work order status file directories and
|
|
'the ability to create a file in those directories. Error messages will be
|
|
'displayed if there is a problem with these, and then the program will
|
|
'exit. This sub should not normally be run with CHECKFILES% = 1 unless
|
|
'the test type is one that normally produces datasheet and work order
|
|
'status report files (post-encap or sealed module testing).
|
|
'
|
|
ISERROR% = 0 'Initialize to "no error"
|
|
|
|
'---------------------------------------------------
|
|
'Selectively check for the ability to create a file
|
|
'in the STAGE directory (datasheet file directory).
|
|
'---------------------------------------------------
|
|
IF (CHECKFILES% = 1) THEN
|
|
CLS
|
|
LOCATE 10
|
|
PRINT TAB(10); "Checking for the ability to create a datasheet file."
|
|
PRINT TAB(10); "----------------------------------------------------"
|
|
PRINT SPC(50);
|
|
IF (CHECKFILECREATE%("C:\STAGE\", "temp.fil", "S") = 1) THEN
|
|
ISERROR% = 1 'Error flag set
|
|
END IF
|
|
END IF
|
|
|
|
'---------------------------------------------------
|
|
'Selectively check for the ability to create a file
|
|
'in the REPORT directory (work order status report
|
|
'file directory).
|
|
'---------------------------------------------------
|
|
IF (CHECKFILES% = 1) THEN
|
|
CLS
|
|
LOCATE 10
|
|
PRINT TAB(10); "Checking for the ability to create a work order status file."
|
|
PRINT TAB(10); "------------------------------------------------------------"
|
|
PRINT SPC(50);
|
|
IF (CHECKFILECREATE%("C:\REPORTS\", "temp.fil", "R") = 1) THEN
|
|
ISERROR% = 1 'Error flag set
|
|
END IF
|
|
END IF
|
|
|
|
'------------------------------------------------
|
|
'Check for ability to write to the printer (and
|
|
'display message to check for properly loaded
|
|
'and sufficient paper).
|
|
'------------------------------------------------
|
|
PrinterMessage$ = "Printer OK" 'Message to be printed by the printer
|
|
CLS
|
|
LOCATE 10
|
|
PRINT TAB(10); "Checking for the ability to write to the printer."
|
|
PRINT TAB(10); "-------------------------------------------------"
|
|
PRINT SPC(50);
|
|
IF (CHECKPRINTER%(PrinterMessage$) = 1) THEN
|
|
'Error when printing
|
|
ISERROR% = 1 'Error flag set
|
|
ELSE
|
|
CLS
|
|
END IF
|
|
|
|
'Exit program if there is an error
|
|
IF (ISERROR% = 1) THEN
|
|
CLS
|
|
COLOR 12, 0 'Red on black background for fails
|
|
LOCATE 10
|
|
PRINT TAB(10); "Error encountered! Notify engineering!";
|
|
COLOR 11, 0 'Back to light cyan (blue) on black background
|
|
PRINT SPC(50);
|
|
PRINT TAB(10); "Program will end now. Press any key.";
|
|
'a$ = KEYBDIN$
|
|
PRINT TAB(10); "Program will end now. Press the specified key.";
|
|
a$ = WAITFORKEY("A", 10, 14, 0) 'Waits for "A" key press (display bright yellow on black)
|
|
END 'End program
|
|
END IF
|
|
END SUB
|
|
|
|
SUB FAILSTATUS (TSITE%, TESTVALUE$, YLOC%, XLOC%, TEXTVALUE$, SPACES%)
|
|
'Sub to format and print the test value to the screen. The TSITE%
|
|
'parameter lists the test channel ("Module #" in the text), while
|
|
'TESTVALUE$ is the "PASS" or "FAIL" status. TEXTVALUE$ is the
|
|
'text before the test value (usually "Status: "), while XLOC%
|
|
'and YLOC% locate the displayed message on the screen. In the
|
|
'special case of "XLOC%" = "-1", "YLOC%" contains the number of
|
|
'spaces to tab over before displaying the message. SPACES%
|
|
'then pads out the displayed line with the specified number of
|
|
'spaces, in case messages written earlier need to be blanked
|
|
'out. The "TESTVALUE$" string also sets the formatting: if the
|
|
'leftmost 4 characters are "FAIL", the display is formatted to
|
|
'red. Otherwise, it is formatted to green.
|
|
'
|
|
IF (LEFT$(TESTVALUE$, 4) = "FAIL") THEN
|
|
COLOR 12, 0 'Test value text color to light red on black
|
|
ELSE
|
|
COLOR 10, 0 'Test value text color to light green on black
|
|
END IF
|
|
|
|
IF (XLOC% = -1) THEN
|
|
'Tab over and print status text
|
|
'PRINT TAB(YLOC%); TEXTVALUE$; TESTVALUE$; SPC(SPACES%);
|
|
PRINT TAB(YLOC%); "MODULE #"; TSITE%; TEXTVALUE$; TESTVALUE$; SPC(SPACES%);
|
|
ELSE
|
|
'Locate and print status text
|
|
'LOCATE YLOC%, XLOC%: PRINT TEXTVALUE$; TESTVALUE$; SPC(SPACES%)
|
|
LOCATE YLOC%, XLOC%: PRINT "MODULE #"; TSITE%; TEXTVALUE$; TESTVALUE$; SPC(SPACES%);
|
|
END IF
|
|
|
|
IF (LEFT$(TESTVALUE$, 4) = "FAIL") THEN
|
|
CALL CONTINUE
|
|
ELSE
|
|
IF (TESTPAUSE% = 1) THEN
|
|
EATTHIS$ = INKEY$
|
|
CALL CONTINUE
|
|
'"Eat" the unnecessary yet possible "any" keystroke
|
|
'press (likely the spacebar) after the status display.
|
|
ELSE
|
|
'If the test passed, "eat" the unnecessary yet possible "any" keystroke
|
|
'press (likely the spacebar) after the status display.
|
|
EATTHIS$ = INKEY$
|
|
CALL PAUSE(1!) 'Wait 1 sec to view results
|
|
END IF
|
|
END IF
|
|
|
|
'Text color back to light cyan (blue)
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
|
|
END SUB
|
|
|
|
SUB HARDCOPY
|
|
'Sub to ask if hardcopy printout is desired
|
|
'
|
|
COLOR 15, 0, 0 'Bright white on black
|
|
CLS
|
|
COLOR 20, 0, 0
|
|
LOCATE 8, 15: PRINT " -- NOTE -- "
|
|
COLOR 8, 0, 0 'Grey on black
|
|
LOCATE 9, 15: PRINT "**************************************************"
|
|
COLOR 14, 0, 0 'Yellow text on black
|
|
LOCATE 11, 15: PRINT " DO YOU WANT A HARD COPY PAPER PRINTOUT? "
|
|
LOCATE 12, 15: PRINT " Y or y for YES, N or n for NO"
|
|
COLOR 8, 0, 0 'Grey on black
|
|
LOCATE 14, 15: PRINT "**************************************************"
|
|
SOUND 400, 1
|
|
PON% = 0
|
|
COLOR 14, 0, 0 'Yellow on black
|
|
DO
|
|
HRDCPY$ = INKEY$
|
|
HRDCPY$ = UCASE$(HRDCPY$)
|
|
LOOP WHILE (HRDCPY$ <> "N") AND (HRDCPY$ <> "Y")
|
|
|
|
IF HRDCPY$ = "Y" THEN
|
|
PON% = 1
|
|
CLS
|
|
COLOR 15, 0, 0 'White text on black
|
|
LOCATE 8, 15: PRINT "**************************************************"
|
|
COLOR 14, 0, 0 'Yellow text on black
|
|
LOCATE 10, 15: PRINT "ENSURE THAT THE PRINTER PAPER IS ALIGNED CORRECTLY"
|
|
COLOR 15, 0, 0
|
|
LOCATE 12, 15: PRINT "**************************************************"
|
|
CALL CONTINUE
|
|
END IF
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
CLS
|
|
END SUB
|
|
|
|
FUNCTION INSTRERROR$ (INSTRADDR%)
|
|
'Function to read an error from the Agilent 34970A Data Acquisition System (DAS)
|
|
'or 33120A Function Generator, depending on which instrument address is called
|
|
'by the "INSTRADDR%" parameter. An error message is displayed if an invalid
|
|
'instrument address is passed.
|
|
'
|
|
'The instrument error is cleared once it is read. The errors are stored FIFO
|
|
'in the 34970A or 33120A, and the error indicator on the instrument is not
|
|
'cleared until all errors are read. The instrument error string read is
|
|
'passed as the return value of the function.
|
|
'
|
|
'Determine if a valid instrument address is passed.
|
|
IF NOT ((INSTRADDR% = GENADDR%) OR (INSTRADDR% = DASADDR%)) THEN
|
|
CLS
|
|
LOCATE 10, 10: PRINT " "
|
|
LOCATE 11, 10: PRINT "Invalid address in call to "; "INSTRERROR$"; " function!"
|
|
LOCATE 12, 10: PRINT "Instrument address = "; INSTRADDR%
|
|
CALL CONTINUE
|
|
CLS
|
|
INSTRERROR$ = "Invalid Error" 'Set function return to error string.
|
|
EXIT FUNCTION 'Exit the function.
|
|
END IF
|
|
|
|
DDATA$ = "SYST:ERR?" 'Command to retrieve an error
|
|
CALL IO488(DDATA$, INSTRADDR%, 1) 'Write command to instrument address.
|
|
CALL IO488(DDATA$, INSTRADDR%, 2) 'Read string from instrument address (to DDATA$).
|
|
'PRINT TAB(10); "Error string = "; DDATA$
|
|
INSTRERROR$ = DDATA$ 'Set function return to string received from the instrument.
|
|
END FUNCTION
|
|
|
|
SUB INSTRERRORS (INSTRADDR%, DISPLAYERRS%)
|
|
'Sub that clears the Agilent 34970A or 33120A error queue
|
|
'(depending on which address is called by the "INSTRADDR%"
|
|
'parameter). An error message is displayed if an invalid
|
|
'instrument address is passed. If the "DISPLAYERRS%"
|
|
'parameter is "1", the errors are also displayed to the
|
|
'screen.
|
|
'
|
|
'The selected instrument error queue is cleared by
|
|
'reading (and displaying) all of the stored errors.
|
|
'
|
|
'Determine if a valid instrument address is passed.
|
|
IF NOT ((INSTRADDR% = GENADDR%) OR (INSTRADDR% = DASADDR%)) THEN
|
|
CLS
|
|
LOCATE 10, 10: PRINT " "
|
|
LOCATE 11, 10: PRINT "Invalid address in call to "; "INSTRERRORS"; " sub!"
|
|
LOCATE 12, 10: PRINT "Instrument address = "; INSTRADDR%
|
|
CALL CONTINUE
|
|
CLS
|
|
EXIT SUB 'Exit the subroutine.
|
|
END IF
|
|
|
|
'Initialize error count
|
|
ERRCOUNT% = 0
|
|
DO ' Error-read loop.
|
|
ERRCOUNT% = ERRCOUNT% + 1 'Increment pass through error loop (error count)
|
|
ERRVAL$ = INSTRERROR$(INSTRADDR%) 'Get error string from instrument using function.
|
|
IF (VAL(ERRVAL$) <> 0) THEN 'If the error code is not zero (i.e., an actual error)
|
|
IF (ERRCOUNT% = 1) THEN
|
|
IF (DISPLAYERRS% = 1) THEN
|
|
'Display messages (only) if flag is "1".
|
|
'CLS
|
|
'LOCATE 5
|
|
PRINT
|
|
PRINT "=========================================="
|
|
IF (INSTRADDR% = GENADDR%) THEN
|
|
PRINT "ERROR(S) WERE DETECTED IN AGILENT 33120A!"
|
|
ELSE
|
|
PRINT "ERROR(S) WERE DETECTED IN AGILENT 34970A!"
|
|
END IF
|
|
PRINT "ERROR CODES ARE SHOWN BELOW:"
|
|
END IF
|
|
END IF
|
|
IF (DISPLAYERRS% = 1) THEN
|
|
'Display messages (only) if flag is "1".
|
|
PRINT "ERROR STRING = "; ERRVAL$
|
|
END IF
|
|
END IF
|
|
LOOP WHILE VAL(ERRVAL$) <> 0 ' Exit loop when the error code is zero.
|
|
IF (ERRCOUNT% > 1) THEN
|
|
IF (DISPLAYERRS% = 1) THEN
|
|
'Display messages (only) if flag is "1".
|
|
PRINT "=========================================="
|
|
PRINT
|
|
CALL CONTINUE
|
|
END IF
|
|
END IF
|
|
END SUB
|
|
|
|
SUB INTERLUDE
|
|
'Wait for user input. Prints message based on current cursor row, unlike
|
|
'the library "CONTINUE" which prints on a fixed row
|
|
COLOR 15, 0 'Bright white, black background
|
|
'Y% = CSRLIN + 1
|
|
'LOCATE Y%, 10: Print "Press any key to continue"
|
|
PRINT ""
|
|
PRINT TAB(10); "Press any key to continue"
|
|
DO
|
|
KB$ = INKEY$
|
|
LOOP WHILE KB$ = ""
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
END SUB
|
|
|
|
'***********************************
|
|
SUB LOGIT (STATUS$(), SN$, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), L%)
|
|
'Sub to log test data to a ".DAT" file.
|
|
'
|
|
'NOTE: Unlike most other legacy code, this version of LOGIT logs test data for
|
|
' both passing and failing modules.
|
|
'
|
|
'Open appropriate .DAT file.
|
|
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN OPEN "C:\ATE\5BLOG\" + RTRIM$(MID$(SPECS.MODNAME, 6, 8)) + ".DAT" FOR APPEND AS #4
|
|
IF LEFT$(SPECS.MODNAME, 2) = "8B" THEN OPEN "C:\ATE\8BLOG\" + RTRIM$(MID$(SPECS.MODNAME, 3, 8)) + ".DAT" FOR APPEND AS #4
|
|
IF LEFT$(SPECS.MODNAME, 4) = "DSCA" THEN OPEN "C:\ATE\DSCLOG\" + RTRIM$(MID$(SPECS.MODNAME, 5, 8)) + ".DAT" FOR APPEND AS #4
|
|
|
|
NUMPTS% = 5 'Number of points for accuracy/linearity data
|
|
|
|
'Build the sequential test-data (.DAT) file. Seventeen (17) records (not
|
|
'counting the accuracy/linearity data) is required for 1 module.
|
|
WRITE #4, SPECS.MODNAME
|
|
|
|
'Store accuracy/linearity data
|
|
FOR INC% = 1 TO NUMPTS%
|
|
WRITE #4, INSIM!(L%, INC%), OUTCALC!(L%, INC%), OUTMEAS!(L%, INC%), ERROROUT!(L%, INC%), ACCSTAT$(L%, INC%)
|
|
NEXT
|
|
|
|
'Store complete test data
|
|
FOR INC% = 0 TO 14 STEP 5
|
|
WRITE #4, STATUS$(INC% + 1, L%), STATUS$(INC% + 2, L%), STATUS$(INC% + 3, L%), STATUS$(INC% + 4, L%), STATUS$(INC% + 5, L%)
|
|
NEXT
|
|
WRITE #4, STATUS$(16, L%), STATUS$(17, L%)
|
|
|
|
WRITE #4, SN$, DATE$
|
|
|
|
CLOSE #4
|
|
|
|
END SUB
|
|
|
|
'*********************************************
|
|
FUNCTION MEASRES! (OHM!, RESNUM%, L%)
|
|
|
|
'Measure specified resistance
|
|
'Inputs; OHM! Nominal value of resistor to be measured
|
|
' RESNUM% Resistor to be measured
|
|
' 1 Input current source sense resistor, 100 ohm
|
|
' 2 Output current sense resistor, 250 ohm
|
|
' 3 Output current sense resistor, 600 ohm
|
|
' L% Channel where resistor is located (output sense only)
|
|
|
|
SELECT CASE RESNUM% 'Branches to the specific measurement
|
|
|
|
CASE 1
|
|
INITTOL! = .05 '5% initial tolerance
|
|
CALL DVMCONF(IINSEN2SOUR.CH%, RES4W$, "", OHM! * 1.2, "", 0)
|
|
CALL DVMSENS(IINSEN2SOUR.CH%, RES4W$, INTTIME$, "", 20) '6 1/2 digits, 25 bit resolution
|
|
CALL DVMSENS(IINSEN2SOUR.CH%, RES4W$, OSCOMP$, "ON", 0) 'offset compensation ON
|
|
RTEMP! = GETREADING!
|
|
CALL DVMSENS(IINSEN2SOUR.CH%, RES4W$, OSCOMP$, "OFF", 0) 'offset compensation ON
|
|
CASE 2
|
|
INITTOL! = .05 '1% initial tolerance
|
|
CALL DVMCONF(IOUTSENDUT1SOUR.CH% + L% - 1, RES4W$, "", OHM! * 1.2, "", 0)
|
|
CALL DVMSENS(IOUTSENDUT1SOUR.CH% + L% - 1, RES4W$, INTTIME$, "", 20) '6 1/2 digits, 25 bit resolution
|
|
CALL DVMSENS(IOUTSENDUT1SOUR.CH% + L% - 1, RES4W$, OSCOMP$, "ON", 0) 'offset compensation ON
|
|
RTEMP! = GETREADING!
|
|
CALL DVMSENS(IOUTSENDUT1SOUR.CH% + L% - 1, RES4W$, OSCOMP$, "OFF", 0) 'offset compensation ON
|
|
CALL DVMCONF(IOUTSENDUT1SOUR.CH%, VDC$, "AUTO", 0, "", 0)
|
|
CASE 3
|
|
INITTOL! = .05 '5% initial tolerance
|
|
CALL DVMCONF(IOUTSENDUT1SOUR.CH% + L% - 1, RES2W$, "", OHM! * 1.2, "", 0)
|
|
CALL DVMSENS(IOUTSENDUT1SOUR.CH% + L% - 1, RES2W$, INTTIME$, "", .02) '4 1/2 digits, 15 bit resolution
|
|
RTEMP! = GETREADING!
|
|
END SELECT
|
|
|
|
IF ABS(RTEMP! - OHM!) > (OHM! * INITTOL!) THEN 'Test for 15% deviation
|
|
CLS
|
|
LOCATE 10, 10
|
|
PRINT "Channel number "; L%
|
|
PRINT TAB(10); "Resistor number "; RESNUM%
|
|
PRINT TAB(10); "Measured resistance = "; RTEMP!; " 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."
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
SP1! = SETSCM5BPWR!(.01) 'Set Vsupply to zero
|
|
SP2$ = POWERIO$(DPSADDR%, SUPPLYOFF$) 'Turn off loop power
|
|
SP2$ = POWERIO$(DPSADDR%, "LOC") 'Return to local mode
|
|
END
|
|
END IF
|
|
|
|
MEASRES! = RTEMP! 'Passes resistor value back
|
|
|
|
END FUNCTION
|
|
|
|
'*********************************
|
|
FUNCTION MENU1%
|
|
KEY(10) ON 'Reactivates F10 key
|
|
' ***** PROGRAM CONTROL MENU 1 *****
|
|
CLS
|
|
LOCATE 5, 20
|
|
COLOR 14, 0, 0
|
|
PRINT "SCM5Bxx, 8Bxx & DSCAxx AUTOMATED TEST EQUIPMENT"
|
|
PRINT TAB(20); "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
COLOR 11, 0, 0
|
|
LOCATE 8
|
|
PRINT TAB(24); "1.) Functional Test"
|
|
'PRINT TAB(24); "2.) Complete Test (No Printout)"
|
|
PRINT TAB(24); "2.) Pre-Encap Complete Test"
|
|
PRINT TAB(24); " (No Print)"
|
|
'PRINT TAB(24); "3.) Complete Test (Print Results)"
|
|
PRINT TAB(24); "3.) Post-Encap Complete Test"
|
|
PRINT TAB(24); " (Optional Print)"
|
|
PRINT TAB(24); "4.) Sealed Module Retest"
|
|
'PRINT TAB(28); "(Print Results, No Adjustments)"
|
|
PRINT TAB(24); " (Optional Print, No Adjustments)"
|
|
PRINT TAB(24); "5.) Individual Test Menu"
|
|
PRINT TAB(24); "6.) Return to the FAMILY TYPE menu"
|
|
PRINT
|
|
PRINT TAB(16); "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%
|
|
'Show Individual Test menu selections, and return number
|
|
'for CASE statement of selected test.
|
|
'
|
|
CLS
|
|
COLOR 14, 0, 0
|
|
LOCATE , 20: PRINT "SCM5B & DSCA AUTOMATED TEST EQUIPMENT"
|
|
LOCATE , 20: PRINT "-----------------------------------------"
|
|
COLOR 11, 0, 0
|
|
PRINT TAB(20); "1.) Supply Current Test"
|
|
PRINT TAB(20); "2.) Output Switch Test"
|
|
PRINT TAB(20); "3.) Offset & Gain Calibration"
|
|
PRINT TAB(20); "4.) Linearity / Accuracy Test"
|
|
'PRINT TAB(20); "5.) Accuracy Test, Std. Frequency Squarewave Input, C.F. = 1"
|
|
'PRINT TAB(20); "6.) Accuracy Test, Std. Frequency Squarewave Input, C.F. = 2"
|
|
'PRINT TAB(20); "7.) Accuracy Test, Std. Frequency Squarewave Input, C.F. = 3"
|
|
'PRINT TAB(20); "8.) Accuracy Test, Std. Frequency Squarewave Input, C.F. = 4"
|
|
'PRINT TAB(20); "9.) Accuracy Test, Std. Frequency Squarewave Input, C.F. = 5"
|
|
'PRINT TAB(20); "A.) Accuracy Test, Min. Extended Frequency Sinewave Input"
|
|
'PRINT TAB(20); "B.) Accuracy Test, Max. Extended Frequency Sinewave Input"
|
|
PRINT TAB(20); "5.) Power Supply Sensitivity Test" 'Was C.
|
|
'PRINT TAB(20); "D.) Step Response Test"
|
|
PRINT TAB(20); "6.) Output Noise Test" 'Was E.
|
|
PRINT TAB(20); "7.) Output Current @ Max. Load Test" 'Was F.
|
|
PRINT TAB(20); " (SCM5B\DSCAxx-xxC,E ONLY)"
|
|
PRINT TAB(20); "8.) Notes On ATE Operation" 'Was G.
|
|
PRINT TAB(20); "9.) Printer Output = "; 'Was H.
|
|
IF PON% = 1 THEN
|
|
PRINT "ON"
|
|
ELSE
|
|
PRINT "OFF"
|
|
END IF
|
|
'PRINT TAB(20); "I.) Log Linearity Test Data = ";
|
|
''IF LOGDAT% > 0 THEN
|
|
'IF LOGDAT% = 1 THEN
|
|
' PRINT "ON"
|
|
'ELSE
|
|
' PRINT "OFF"
|
|
'END IF
|
|
PRINT TAB(20); "A.) Pause after each test = "; 'Was J.
|
|
IF TESTPAUSE% = 1 THEN
|
|
PRINT "ON"
|
|
ELSE
|
|
PRINT "OFF"
|
|
END IF
|
|
PRINT TAB(20); "B.) Debug message flag = "; 'Added.
|
|
IF DEBUGFLAG% = 1 THEN
|
|
PRINT "ON"
|
|
ELSE
|
|
PRINT "OFF"
|
|
END IF
|
|
PRINT TAB(20); "C.) Eject paper from printer";
|
|
PRINT TAB(20); "D.) Exit to Main Menu" 'Was K, was C.
|
|
PRINT
|
|
PRINT TAB(20); "Enter your selection. "
|
|
'Get key.
|
|
DO
|
|
DO
|
|
I$ = UCASE$(INKEY$)
|
|
LOOP WHILE I$ = ""
|
|
C% = ASC(I$)
|
|
'Loop while screen entry is 1 to 9 (codes 49 to 57) or
|
|
'A through Z (codes 65 to 90).
|
|
LOOP WHILE (C% < 49 OR C% > 57) AND (C% < 65 OR C% > 90)
|
|
'Change key value to case value.
|
|
IF C% > 57 THEN
|
|
'Really, this should be ">= 65" since the values between 57 ("9") and
|
|
'64 ("@") are not valid.
|
|
'
|
|
'Translate character values of A to Z (65 to 90) to integer values of 10 through 35
|
|
MENU2% = C% - 55
|
|
ELSE
|
|
'Translate character values of 1 to 9 to integer values of 1 through 9
|
|
MENU2% = C% - 48
|
|
END IF
|
|
|
|
END FUNCTION
|
|
|
|
'********************************8
|
|
FUNCTION MENU3%
|
|
|
|
CLS
|
|
COLOR 14, 0, 0
|
|
LOCATE 3, 26: PRINT "Module Family Selection Menu"
|
|
PRINT TAB(26); "----------------------------"
|
|
PRINT
|
|
COLOR 11, 0, 0
|
|
PRINT TAB(26); "1.) SCM5Bxx-xxxx"
|
|
PRINT TAB(26); "2.) DSCAxx-xxxx"
|
|
PRINT TAB(26); "3.) 8Bxx-xxxx"
|
|
PRINT TAB(26); "4.) Return to the FAMILY TYPE menu"
|
|
|
|
DO
|
|
I$ = INKEY$
|
|
LOOP WHILE VAL(I$) < 1 OR VAL(I$) > 4
|
|
|
|
MENU3% = VAL(I$)
|
|
|
|
END FUNCTION
|
|
|
|
'*********************************
|
|
SUB MODOUTLINE
|
|
|
|
'print a bottom view of the module showing potentiometer location
|
|
|
|
IF SPECS.NOMVS = 5 THEN '8B and SCM5B
|
|
|
|
'print module pins and potentiometers
|
|
LOCATE 4
|
|
PRINT TAB(25); " x x x x x x x"
|
|
PRINT TAB(25); "x x x x x x x"
|
|
LOCATE 5, 40
|
|
PRINT CHR$(233)
|
|
LOCATE 5, 54
|
|
PRINT CHR$(233)
|
|
LOCATE 3, 23
|
|
PRINT CHR$(201)
|
|
|
|
FOR a = 4 TO 5 'print left vertical line
|
|
LOCATE a, 23
|
|
PRINT CHR$(186)
|
|
NEXT a
|
|
|
|
LOCATE 6, 23
|
|
PRINT CHR$(200)
|
|
FOR a = 24 TO 55 'print top horizontal line
|
|
LOCATE 3, a
|
|
PRINT CHR$(205)
|
|
NEXT a
|
|
|
|
LOCATE 3, 56
|
|
PRINT CHR$(187)
|
|
FOR a = 4 TO 5 'print right vertical line
|
|
LOCATE a, 56
|
|
PRINT CHR$(186)
|
|
NEXT a
|
|
|
|
LOCATE 6, 56
|
|
PRINT CHR$(188)
|
|
FOR a = 24 TO 55 'print bottom horizontal line
|
|
LOCATE 6, a
|
|
PRINT CHR$(205)
|
|
NEXT a
|
|
|
|
ELSE 'DSCA
|
|
|
|
LOCATE 4, 36 'print potentiometer locations
|
|
PRINT CHR$(233)
|
|
LOCATE 4, 44
|
|
PRINT CHR$(233)
|
|
LOCATE 5, 40
|
|
PRINT CHR$(15) 'print LED
|
|
|
|
LOCATE 3, 25 'print top left corner
|
|
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
|
|
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
'***********************************
|
|
FUNCTION MODULEOUT! (SENOUT!)
|
|
|
|
'Calculates the module output for a given input (sensor output)
|
|
|
|
MINOUT! = SPECS.MINOUT 'V or A
|
|
MAXOUT! = SPECS.MAXOUT
|
|
MININ! = SPECS.MININ
|
|
MAXIN! = SPECS.MAXIN
|
|
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
|
|
INRANGE! = MAXIN! - MININ! 'Input range
|
|
|
|
XFERFN! = ORANGE! / INRANGE!
|
|
YINT! = MINOUT! - MININ! * XFERFN! 'Y-intercept
|
|
MODULEOUT! = XFERFN! * SENOUT! + YINT! 'Output voltage (V or mA)
|
|
|
|
END FUNCTION
|
|
|
|
'******************************
|
|
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(10); "2.) Press (F10) at any time to break out of the program and"
|
|
PRINT TAB(14); "return to DOS."
|
|
CALL CONTINUE
|
|
|
|
END SUB
|
|
|
|
'*********************************
|
|
SUB OFFSETCAL (CAL%, NUMDUT%, STATUS$())
|
|
'Calibrate module offset
|
|
'Inputs; calibration flag
|
|
' CAL% 0 = calibrate module; high accuracy input, loop until calibrated,
|
|
' narrow error tolerance, AMPL! = 0, use SPECS.GNCALIN for DUT input
|
|
' 1 = measure once and exit, high accuracy input,
|
|
' narrow error tolerance, use AMPL! for DUT input.
|
|
' 2 = functional test; coarse input setting, wide error tolerance,
|
|
' measure once and exit, AMPL! = 0, use SPECS.GNCALIN for DUT input
|
|
' 3 = Use HP33120A direct to DUT, bypassing Fluke 760A
|
|
' Use AMPL! for DUT input, measure once and exit
|
|
' NUMDUT% = number of Devices Under Test
|
|
'
|
|
'Outputs STATUS$(13, n) array of results
|
|
'
|
|
MINOUT! = SPECS.MINOUT 'V or A
|
|
MAXOUT! = SPECS.MAXOUT
|
|
CALOS! = SPECS.OSCALPT / 100! 'Convert from %
|
|
INITTOL! = 8 'Uncalibrated offset tolerance (%)
|
|
CALTOL! = SPECS.CALTOL 'Calibration tolerance (%)
|
|
OSCALIN! = SPECS.OSCALIN 'Module input for offset calibration
|
|
FINCAL! = SPECS.FINCAL 'Input waveshape frequency (Hz)
|
|
ADJ! = SPECS.ADJ! / 100! 'Adjustment range, %
|
|
NOMVS! = SPECS.NOMVS!
|
|
OUTSIGTYPE$ = SPECS.OUTSIGTYPE$
|
|
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V or A)
|
|
CALSPAN! = ORANGE!
|
|
|
|
CLS
|
|
TESTTITLE$ = "Offset Calibration"
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
|
|
'IF CAL% = 2 THEN
|
|
IF (CAL% = 2) OR (TTYPE% = 1) THEN
|
|
ZERROR! = INITTOL! 'Offset tolerance for func. test (%)
|
|
TOL! = .0001 * ORANGE! 'Measurement tolerance, 1 pass test
|
|
ELSE
|
|
IF CAL% = 0 THEN
|
|
CALL MODOUTLINE
|
|
LOCATE 7
|
|
TB1% = 26
|
|
TB2% = 29
|
|
PRINT TAB(TB1%); "Refer to label on board for";
|
|
PRINT TAB(TB2%); "offset potentiometer";
|
|
END IF
|
|
ZERROR! = CALTOL! 'Offset calibration tolerance (%)
|
|
TOL! = 0! 'Measurement tolerance, continuous test
|
|
END IF
|
|
|
|
LOCATE 12, 10
|
|
PRINT TAB(10); "Measuring input. Please wait... "
|
|
|
|
FOR L% = 1 TO NUMDUT%
|
|
CONREADS% = 0
|
|
LOCATE 1
|
|
IF L% <> 1 THEN
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
END IF
|
|
|
|
'Check if module previously failed supply current
|
|
'(removed from test head), offset cal or gain cal.
|
|
IF LEFT$(STATUS$(1, L%), 4) <> "FAIL" AND LEFT$(STATUS$(13, L%), 4) <> "FAIL" AND LEFT$(STATUS$(14, L%), 4) <> "FAIL" THEN
|
|
|
|
LOCATE 10, 25: PRINT "TESTING DEVICE IN CHANNEL #"; L%
|
|
|
|
MININMEAS! = SETDUTIN!(OSCALIN!)
|
|
OUTCALC! = MODULEOUT!(MININMEAS!) + CALOS! * ORANGE!
|
|
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN
|
|
CH% = IOUTSENDUT1SEN.CH%
|
|
ELSE
|
|
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
|
|
CH% = VOUTDUT1.CH%
|
|
ELSE
|
|
CH% = IOUTSENDUT1SOUR.CH%
|
|
END IF
|
|
END IF
|
|
CALL DVMCONF(CH% + L% - 1, VDC$, "AUTO", 0, "", 0)
|
|
CALL DVMSENS(CH% + L% - 1, VDC$, INTTIME$, "", 2) '6 1/2 digits, 21 bit resolution
|
|
CALL PAUSE(.1)
|
|
|
|
LOCATE 12, 10
|
|
PRINT "Offset Error =";
|
|
PRINT SPC(30);
|
|
|
|
DO
|
|
ERROROUT! = (GETREADING! / IOUTSEN1.MEAS!(L%) - OUTCALC!) / CALSPAN! * 100!'Error in %
|
|
LOCATE 12, 24
|
|
PRINT USING "+###.### %"; ERROROUT!
|
|
|
|
LOCATE 15, 10
|
|
IF CAL% > 0 THEN 'Non-calibration mode
|
|
CONREADS% = 5
|
|
ELSEIF ABS(ERROROUT!) > INITTOL! * 1.5 THEN 'Circuit error, exit
|
|
CONREADS% = 5
|
|
ELSEIF ABS(ERROROUT!) < ZERROR! THEN
|
|
SOUND 200, .5
|
|
PRINT "Stop turning offset potentiometer "
|
|
CONREADS% = CONREADS% + 1
|
|
ELSEIF ERROROUT! < 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$) = "C" THEN
|
|
CONREADS% = 5
|
|
END IF
|
|
CALL PAUSE(.3) 'Slow down loop
|
|
LOOP WHILE CONREADS% < 5
|
|
|
|
IF CAL% = 0 OR CAL% = 2 THEN
|
|
'DIG$ = "5" 'Flag. Don't print result
|
|
IF (TTYPE% = 1) THEN
|
|
'Functional test.
|
|
DIG$ = "3" 'Display/print result to # of decimal places.
|
|
ELSE
|
|
'Not functional test.
|
|
DIG$ = "5" 'Flag: do not display/print result.
|
|
END IF
|
|
|
|
IF ABS(ERROROUT!) <= ZERROR! THEN
|
|
OFF$ = "PASS"
|
|
ELSE
|
|
OFF$ = "FAIL"
|
|
SOUND 1000, .5
|
|
'Display results if test failed.
|
|
DIG$ = "3" 'Display/print result to # of decimal places.
|
|
END IF
|
|
|
|
'Set DUT input voltage power supply to 0V (PWR 2014-10-08)
|
|
CALL SETDPS(DPSVINADDR%, 0!)
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
'LOCATE 15, 10: PRINT "MODULE #"; L%; " Status: "; OFF$;
|
|
LOCATE 16, 10 'Added
|
|
PRINT SPC(31);
|
|
PRINT TAB(10); "Offset calibration error is";
|
|
PRINT TAB(50); USING " +###.### %"; ERROROUT!
|
|
PRINT TAB(10); "Max. offset calibration error is";
|
|
PRINT TAB(50); USING "+/-##.### %"; ZERROR!
|
|
CALL FAILSTATUS(L%, OFF$, 15, 10, "Status: ", 20) 'Print test status to screen
|
|
ELSE
|
|
OFF$ = "PASS"
|
|
DIG$ = "5" 'Flag. Don't print result
|
|
END IF
|
|
|
|
STATUS$(13, L%) = OFF$ + STR$(ERROROUT!) + DIG$
|
|
|
|
END IF
|
|
IF L% < NUMDUT% THEN 'Prevent to assign a not valid serial number
|
|
SN$ = SERNO$(L% + 1) 'Use the next serial number on the array
|
|
END IF
|
|
CALL PAUSE(1!)
|
|
LOCATE 15, 10
|
|
PRINT SPC(55);
|
|
LOCATE 16, 10
|
|
PRINT SPC(55);
|
|
LOCATE 17, 10
|
|
PRINT SPC(55);
|
|
PRINT
|
|
CLS
|
|
NEXT
|
|
|
|
SN$ = SERNO$(1)
|
|
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
END SUB
|
|
|
|
'*****************************
|
|
SUB OUTPUTNOISE (NUMDUT%, STATUS$())
|
|
'Measure module output noise (Vrms or mArms)
|
|
'Inputs; NUMDUT% = number of Devices Under Test
|
|
'Outputs; STATUS$(16, n) array of results
|
|
'
|
|
MAXIN! = SPECS.MAXIN
|
|
MINOUT! = SPECS.MINOUT
|
|
MAXOUT! = SPECS.MAXOUT
|
|
FINCAL! = SPECS.FINCAL
|
|
SPEC! = SPECS.OUTNOISE '% span, RMS
|
|
MEASTOL! = .04 '4%
|
|
OUTSIGTYPE$ = SPECS.OUTSIGTYPE
|
|
NOMVS! = SPECS.NOMVS
|
|
|
|
ORANGE! = MAXOUT! - MINOUT!
|
|
|
|
IF OUTSIGTYPE$ <> "CURRENT" THEN
|
|
CALL SETOUTLOAD(IOUTSEN3!, 4)
|
|
END IF
|
|
|
|
CLS
|
|
TESTTITLE$ = "Output Noise Test"
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
|
|
MAXINMEAS! = SETDUTIN!(MAXIN!)
|
|
|
|
FOR L% = 1 TO NUMDUT%
|
|
LOCATE 1
|
|
IF L% <> 1 THEN CALL HEADERB(TESTTITLE$, 0)
|
|
'Check if module previously failed supply current
|
|
'(removed from test head), offset cal or gain cal
|
|
IF LEFT$(STATUS$(1, L%), 4) <> "FAIL" AND LEFT$(STATUS$(2, L%), 4) <> "FAIL" AND LEFT$(STATUS$(13, L%), 4) <> "FAIL" AND LEFT$(STATUS$(14, L%), 4) <> "FAIL" THEN
|
|
|
|
LOCATE 10, 25: PRINT "TESTING DEVICE IN CHANNEL #"; L%
|
|
|
|
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN
|
|
CALL SETOUTLOAD(IOUTSEN2!, NUMDUT%) 'Set max load resistor
|
|
RL! = IOUTSEN2!
|
|
ELSE
|
|
RL! = 1
|
|
END IF
|
|
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN
|
|
CH% = IOUTSENDUT1SEN.CH%
|
|
ELSE
|
|
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
|
|
'IF NOMVS! = 5 THEN 'SCM5B
|
|
'CH% = IOUTSENDUT1SOUR.CH%
|
|
CH% = VOUTDUT1.CH%
|
|
ELSE 'DSCA
|
|
CH% = IOUTSENDUT1SOUR.CH%
|
|
END IF
|
|
END IF
|
|
CALL DVMCONF(CH% + L% - 1, VAC$, AUTO$, 0, "", 0)
|
|
CALL DVMSENS(CH% + L% - 1, VAC$, BW$, "", 20) 'Set bandwidth for fastest reading.
|
|
I = 0
|
|
DO 'Make sure noise reading is stable
|
|
|
|
OUTRMS! = GETREADING! / RL! / ORANGE! * 100 'Dummy reading, first reading
|
|
'can be high.
|
|
'OUTRMS! = GETREADING! / RL! / ORANGE! * 100
|
|
I = I + 1
|
|
LOOP WHILE (OUTRMS! > SPEC! AND I < 3)
|
|
|
|
IF OUTRMS! <= SPEC! THEN
|
|
NOISE$ = "PASS"
|
|
ELSE
|
|
NOISE$ = "FAIL"
|
|
SOUND 1000, .5
|
|
END IF
|
|
|
|
'Set DUT input voltage power supply to 0V (PWR 2014-10-08)
|
|
CALL SETDPS(DPSVINADDR%, 0!)
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
'LOCATE 15, 10: PRINT TAB(10); "MODULE #"; L%; " Status: "; NOISE$;
|
|
LOCATE 16, 10 'Added
|
|
PRINT SPC(20);
|
|
PRINT TAB(10); "Measured output noise is";
|
|
PRINT TAB(50); USING "#.### % span "; OUTRMS!
|
|
PRINT TAB(10); "Maximum output noise is";
|
|
PRINT TAB(50); USING "#.### % span "; SPEC!
|
|
|
|
CALL FAILSTATUS(L%, NOISE$, 15, 10, "Status: ", 20) 'Print test status to screen
|
|
|
|
STATUS$(16, L%) = NOISE$ + STR$(OUTRMS!) + "3"
|
|
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN
|
|
CALL SETOUTLOAD(IOUTSEN1!, NUMDUT%) 'Set current output sense resistor
|
|
END IF
|
|
|
|
END IF
|
|
|
|
IF L% < NUMDUT% THEN 'Prevent to assign a not valid serial number
|
|
SN$ = SERNO$(L% + 1) 'Use the next serial number on the array
|
|
END IF
|
|
CALL PAUSE(1!)
|
|
IF L% <> NUMDUT% THEN
|
|
FOR M% = 15 TO 17
|
|
LOCATE M%, 10
|
|
PRINT SPC(65);
|
|
NEXT
|
|
PRINT
|
|
END IF
|
|
CLS
|
|
NEXT
|
|
|
|
SN$ = SERNO$(1)
|
|
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
END SUB
|
|
|
|
SUB OUTSWITCH (NUMDUT%, STATUS$())
|
|
'This routine tests the operation of the SCM5B module output switch
|
|
'Inputs; NUMDUT% = number of Devices Under Test
|
|
'Outputs; STATUS$(2,n) array of results
|
|
'
|
|
MAXIN! = SPECS.MAXIN
|
|
MAXOUT! = SPECS.MAXOUT
|
|
FINCAL! = SPECS.FINCAL 'Input wave frequency (Hz)
|
|
NOMVS! = SPECS.NOMVS
|
|
OUTSIGTYPE$ = SPECS.OUTSIGTYPE
|
|
TOL! = .15 '15% reading tolerance allows for offset & gain not calibrated.
|
|
|
|
CLS
|
|
TESTTITLE$ = "Output Switch Test"
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
|
|
IF (LEFT$(SPECS.MODNAME, 4) = "DSCA") OR (LEFT$(SPECS.MODNAME, 2) = "8B") THEN '8B or DSCA
|
|
LOCATE 10, 10: PRINT "This test is not performed on model "; SPECS.MODNAME
|
|
EXIT SUB
|
|
END IF
|
|
|
|
MAXINMEAS! = SETDUTIN!(MAXIN!)
|
|
OUTCALC! = MODULEOUT!(MAXINMEAS!)
|
|
|
|
FOR L% = 1 TO NUMDUT%
|
|
LOCATE 1
|
|
IF L% <> 1 THEN
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
END IF
|
|
|
|
MAXINMEAS! = SETDUTIN!(MAXIN!)
|
|
OUTCALC! = MODULEOUT!(MAXINMEAS!)
|
|
|
|
'Check if module previously failed supply current
|
|
'(removed from test head), offset cal or gain cal
|
|
'(not functional).
|
|
IF LEFT$(STATUS$(1, L%), 4) <> "FAIL" AND LEFT$(STATUS$(13, L%), 4) <> "FAIL" AND LEFT$(STATUS$(14, L%), 4) <> "FAIL" THEN
|
|
|
|
LOCATE 10, 25: PRINT "TESTING DEVICE IN CHANNEL #"; L%
|
|
CH% = ERRORVALUE ' dummy value
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN
|
|
CH% = IOUTSENDUT1SEN.CH%
|
|
ELSE 'IF OUTSIGTYPE$ = "VOLTAGE" THEN
|
|
'IF NOMVS! = 5 THEN
|
|
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
|
|
CH% = VOUTDUT1.CH%
|
|
ELSE
|
|
'DSCA or 8B
|
|
CH% = IOUTSENDUT1SOUR.CH%
|
|
END IF
|
|
END IF
|
|
CALL DVMCONF(CH% + L% - 1, VDC$, "", OUTCALC! * IOUTSEN1.MEAS!(1), "", 0)
|
|
CALL DVMSENS(CH% + L% - 1, VDC$, INTTIME$, "", .02)'4 1/2 digits, 15 bit resolution
|
|
|
|
'Measure output (enabled "no load").
|
|
OUTNL! = GETREADING! / IOUTSEN1.MEAS!(L%)
|
|
OUTREQ! = MAXOUT!
|
|
|
|
OUTMEAS! = OUTNL!
|
|
OUTSW$ = "PASS" 'Initialize to passing status.
|
|
|
|
IF ABS(OUTNL! - MAXOUT!) > MAXOUT! * TOL! THEN
|
|
'Enabled "no load" output test failed.
|
|
OUTSW$ = "FAIL"
|
|
'PRINT "FAIL - ON"
|
|
'PRINT "OUTNL = "; OUTNL!
|
|
'PRINT "MAXOUT = "; MAXOUT!
|
|
'CALL CONTINUE
|
|
ELSE
|
|
'If the "no load" measurement passes, set up and measure the "disabled" output.
|
|
CALL ENABLE(L%, 1) 'Disable output switch.
|
|
CALL PAUSE(.5) '1Mohm load takes time to pull output down.
|
|
OUTDIS! = GETREADING! / IOUTSEN1.MEAS!(L%) 'Measure output.
|
|
IF ABS(OUTDIS!) > MAXOUT! * TOL! THEN
|
|
'Disabled output test failed.
|
|
OUTSW$ = "FAIL"
|
|
OUTREQ! = 0!
|
|
OUTMEAS! = OUTDIS!
|
|
'PRINT "FAIL - OFF"
|
|
'PRINT "OUTDIS = "; OUTDIS!
|
|
'PRINT "MAXOUT = "; MAXOUT!
|
|
'CALL CONTINUE
|
|
END IF
|
|
END IF
|
|
|
|
'Set DUT input voltage power supply to 0V (PWR 2014-10-08)
|
|
CALL SETDPS(DPSVINADDR%, 0!)
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
'LOCATE 15, 10: PRINT "MODULE #"; L%; " Status: "; OUTSW$;
|
|
LOCATE 16, 10 'Added
|
|
UNIT$ = ""
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN UNIT$ = "mA"
|
|
IF OUTSIGTYPE$ = "VOLTAGE" THEN UNIT$ = "V"
|
|
PRINT TAB(10); "Measured "; "no load"; " output is";
|
|
'PRINT TAB(50); USING "+##.## &"; OUTMEAS!; UNIT$
|
|
PRINT TAB(50); USING "+##.## &"; OUTNL!; UNIT$
|
|
PRINT TAB(10); "Required output is";
|
|
PRINT TAB(50); USING "+##.## & to ##.## &"; OUTREQ! - (MAXOUT! * TOL!); UNIT$; OUTREQ! + (MAXOUT! * TOL!); UNIT$
|
|
'Added.
|
|
PRINT TAB(10); "Measured "; "disabled"; " output is";
|
|
PRINT TAB(50); USING "+##.## &"; OUTDIS!; UNIT$
|
|
PRINT TAB(10); "Required output is";
|
|
PRINT TAB(50); USING "+##.## & to ##.## &"; -(MAXOUT! * TOL!); UNIT$; (MAXOUT! * TOL!); UNIT$
|
|
|
|
CALL FAILSTATUS(L%, OUTSW$, 15, 10, "Status: ", 20) 'Print test status to screen
|
|
|
|
IF OUTSW$ = "FAIL" THEN
|
|
SOUND 1000, .5
|
|
LOCATE 21, 10 'Added
|
|
PRINT TAB(10); "Check for correct signals on output switch."
|
|
CALL CONTINUE
|
|
END IF
|
|
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
|
|
CALL ENABLE(L%, 0) 'Enable output switch
|
|
END IF
|
|
'Append # decimal places: 6 = don't print numerical data
|
|
STATUS$(2, L%) = OUTSW$ + "6"
|
|
END IF
|
|
|
|
IF L% < NUMDUT% THEN 'Prevent to assign a not valid serial number
|
|
SN$ = SERNO$(L% + 1) 'Use the next serial number on the array
|
|
END IF
|
|
CALL PAUSE(1)
|
|
IF L% <> NUMDUT% THEN
|
|
FOR M% = 15 TO 17
|
|
LOCATE M%, 10: PRINT SPC(65);
|
|
NEXT
|
|
PRINT
|
|
END IF
|
|
CLS
|
|
NEXT
|
|
|
|
SN$ = SERNO$(1)
|
|
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
END SUB
|
|
|
|
'****************************
|
|
SUB REPORT (STATUS$(), SN$, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), NUMDUT%, TTYPE%) 'Prints test data on screen
|
|
'Sub to print or display the test results. The data be sent to two
|
|
'three places (screen, printer, and datasheet file), so when updating,
|
|
'remember to make any changes to both the "PRINT" and "LPRINT" sections
|
|
'in the initial part of the sub, and to the datasheet file write section
|
|
'at the end of the sub.
|
|
'
|
|
OUTSIGTYPE$ = SPECS.OUTSIGTYPE 'Used to set output display units
|
|
FINCAL! = SPECS.FINCAL
|
|
FINMAX! = SPECS.FINMAX
|
|
FINEXTMAX! = SPECS.FINEXTMAX
|
|
NUMPTS% = 5 'Number of points (steps) in accuracy/linearity test
|
|
MAXIN! = SPECS.MAXIN 'Use to set input display units
|
|
INPUTTYPE$ = "ERROR" 'Used to set input display units (initialize to dummy value)
|
|
|
|
'Initialize input type and output units and scaling
|
|
INPUTTYPE$ = "ERROR"
|
|
UNIT$ = ""
|
|
IF OUTSIGTYPE$ = "VOLTAGE" THEN
|
|
UNIT$ = "V"
|
|
OUTSCALE! = 1!
|
|
END IF
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN
|
|
UNIT$ = "mA"
|
|
OUTSCALE! = 1000!
|
|
END IF
|
|
IF MAXIN! >= 1 THEN
|
|
INPUTTYPE$ = " Vin (VDC)"
|
|
ELSE
|
|
INPUTTYPE$ = "Vin (mVDC)"
|
|
END IF
|
|
|
|
FOR L% = 1 TO NUMDUT%
|
|
RESTORE LINES 'Get test names and units
|
|
CLS
|
|
LOCATE 5, 5: PRINT "THE FOLLOWING DATA IS FOR THE DEVICE IN CHANNEL #"; L%
|
|
PRINT
|
|
PRINT
|
|
'CALL PAUSE(1)
|
|
|
|
LOCALSN$ = SERNO$(L%) 'Get current serial number (serial number for channel being tested)
|
|
CALL HEADERA(LOCALSN$) 'Prints data sheet header on printer using the current serial number
|
|
|
|
'Accuracy/linearity test results
|
|
IF LEFT$(STATUS$(1, L%), 4) <> "FAIL" AND LEFT$(STATUS$(13, L%), 4) <> "FAIL" AND LEFT$(STATUS$(14, L%), 4) <> "FAIL" THEN
|
|
'If the module did not fail Supply Current, Offset or Gain tests
|
|
'
|
|
|
|
IF (TTYPE% <> 1) THEN 'If not functional test.
|
|
'****************** screen display ********************
|
|
PRINT TAB(34); "ACCURACY TEST"
|
|
PRINT
|
|
PRINT TAB(20); "Calculated"; TAB(38); "Measured"
|
|
|
|
PRINT TAB(5); INPUTTYPE$;
|
|
|
|
PRINT TAB(19); "Output ("; UNIT$; "DC)"; TAB(36); "Output ("; UNIT$; "DC)*";
|
|
PRINT TAB(54); "Error (%)"; TAB(68); "Status"
|
|
PRINT TAB(5); "----------"; TAB(19); "------------"; TAB(36); "-------------";
|
|
PRINT TAB(53); "----------"; TAB(67); "--------"
|
|
FOR INC% = 1 TO NUMPTS%
|
|
PRINT TAB(6); USING "+###.### +###.### +###.### +###.###"; INSIM!(L%, INC%); (OUTCALC!(L%, INC%)) * OUTSCALE!; OUTMEAS!(L%, INC%); ERROROUT!(L%, INC%); _
|
|
' 02/15/06 1.15 MR
|
|
'PRINT TAB(69); ACCSTAT$(L%, INC%)
|
|
IF (LEFT$(ACCSTAT$(L%, INC%), 4) = "FAIL") THEN
|
|
COLOR 12, 0 'Test value text color to light red on black
|
|
ELSE
|
|
COLOR 10, 0 'Test value text color to light green
|
|
END IF
|
|
PRINT TAB(69); ACCSTAT$(L%, INC%)
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
NEXT
|
|
'DUMKEY$ = WAITFORKEY("F", 10, 14, 0) 'Waits for "F" key press (display bright yellow on black)
|
|
'*********************************
|
|
|
|
'****************** paper print ********************
|
|
IF PON% = 1 THEN
|
|
LPRINT TAB(34); "ACCURACY TEST"
|
|
LPRINT
|
|
LPRINT TAB(20); "Calculated"; TAB(38); "Measured"
|
|
|
|
LPRINT TAB(5); INPUTTYPE$;
|
|
|
|
LPRINT TAB(19); "Output ("; UNIT$; "DC)"; TAB(36); "Output ("; UNIT$; "DC)*";
|
|
LPRINT TAB(54); "Error (%)"; TAB(68); "Status"
|
|
LPRINT TAB(5); "----------"; TAB(19); "------------"; TAB(36); "-------------";
|
|
LPRINT TAB(53); "----------"; TAB(67); "--------"
|
|
FOR INC% = 1 TO NUMPTS%
|
|
LPRINT TAB(6); USING "+###.### +###.### +###.### +###.###"; INSIM!(L%, INC%); (OUTCALC!(L%, INC%)) * OUTSCALE!; OUTMEAS!(L%, INC%); ERROROUT!(L%, INC%);
|
|
LPRINT TAB(69); ACCSTAT$(L%, INC%)
|
|
NEXT
|
|
END IF
|
|
'*********************************
|
|
END IF
|
|
END IF
|
|
|
|
'Main test results
|
|
'
|
|
'Output format
|
|
'1 10 20 30 40 50 60 70 80
|
|
' | | | | | | | |
|
|
' Parameter Measured Value* Specification Status
|
|
' ========================= =============== =================== ======
|
|
' ###### uVrms ## to ### uVrms PASS
|
|
' ohm/ohm
|
|
'******************** screen display ********************************
|
|
'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); "======"
|
|
'*********************************
|
|
|
|
'******************** Paper Print ********************************
|
|
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 17
|
|
FOR x% = 1 TO MAXSTATUSINDEX
|
|
READ a$, B$ 'Read test names and units from LINES data.
|
|
'Locally set the test names and units for selected tests
|
|
SELECT CASE x%
|
|
CASE 3
|
|
'A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz Sine"
|
|
a$ = "Accuracy"
|
|
CASE 4
|
|
'A$ = "Linearity, " + LTRIM$(STR$(FINCAL!)) + "Hz Sine"
|
|
a$ = "Linearity"
|
|
'The following lines were inherited from the RMS test program.
|
|
'These tests are not run for the high-voltage voltage-input
|
|
'modules, so the lines are commented out.
|
|
'CASE 5
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz Square"
|
|
'CASE 6
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 2"
|
|
'CASE 7
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 3"
|
|
'CASE 8
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 4"
|
|
'CASE 9
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 5"
|
|
'CASE 10
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINMAX!)) + "Hz Sine"
|
|
'CASE 11
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINEXTMAX!)) + "Hz Sine"
|
|
END SELECT
|
|
|
|
|
|
IF RIGHT$(STATUS$(x%, L%), 1) <> "5" AND LEN(STATUS$(x%, L%)) > 0 THEN
|
|
'-------------------------------------------------------------------------------
|
|
'Parse the STATUS (test results) data if the number of characters
|
|
'is more than zero and the rightmost character (the # of decimal
|
|
'places to be displayed) is not "5". The general format of the
|
|
'STATUS data is shown below:
|
|
'
|
|
'STATUS$(X%, L%) format = <pass/fail> + <measured data> + <# decimal places>
|
|
' 4 char. ? char 1 char.
|
|
'
|
|
'The number of decimal places character is used to control the
|
|
'display/print format of the test results, and usually specifies
|
|
'the number of decimal places to show. The special value of "5"
|
|
'for # of decimal places is used by the OFFSET and GAIN (and
|
|
'perhaps other) tests as a flag to prevent the display or printing
|
|
'of the results of that test.
|
|
'-------------------------------------------------------------------------------
|
|
|
|
'Display (and print) test name
|
|
PRINT TAB(5); a$;
|
|
IF PON% = 1 THEN LPRINT TAB(5); a$;
|
|
|
|
DATALEN% = LEN(STATUS$(x%, L%))
|
|
NUMDATA! = VAL(MID$(STATUS$(x%, L%), 5, DATALEN% - 5))
|
|
|
|
'Set test units for Supply Sensitivity test depending on module supply voltage
|
|
IF x% = 12 THEN
|
|
IF SPECS.NOMVS = 5 THEN 'SCM5B or 8B
|
|
B$ = "ppm/%"
|
|
ELSE 'DSCA
|
|
B$ = "%/%"
|
|
END IF
|
|
END IF
|
|
|
|
'Display or print using requested # of decimal places
|
|
IF RIGHT$(STATUS$(x%, L%), 1) = "0" THEN
|
|
PRINT TAB(34); USING "###### &"; NUMDATA!; B$;
|
|
IF PON% = 1 THEN LPRINT TAB(34); USING "###### &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "1" THEN
|
|
PRINT TAB(34); USING "####.# &"; NUMDATA!; B$;
|
|
IF PON% = 1 THEN LPRINT TAB(34); USING "###### &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "2" THEN
|
|
PRINT TAB(34); USING "###.## &"; NUMDATA!; B$;
|
|
IF PON% = 1 THEN LPRINT TAB(34); USING "###.## &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "3" THEN
|
|
PRINT TAB(34); USING "##.### &"; NUMDATA!; B$;
|
|
IF PON% = 1 THEN LPRINT TAB(34); USING "##.### &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "4" THEN
|
|
PRINT TAB(34); USING "#.#### &"; NUMDATA!; B$;
|
|
IF PON% = 1 THEN LPRINT TAB(34); USING "#.#### &"; NUMDATA!; B$;
|
|
END IF
|
|
'DP = 5: don't display or print spec. in final report.
|
|
'DP = 6: don't display or print numerical data
|
|
|
|
SPECLEN% = LEN(TSPEC$(x%))
|
|
IF (TTYPE% = 1) THEN
|
|
'Functional test. Set different limits for
|
|
'offset and gain measurements.
|
|
IF (x% = 13) OR (x% = 14) THEN
|
|
'Offset or measurement. Hardcoded value (check
|
|
'against the INITTOL! value hardcoded in OFFSETCAL
|
|
'or GAINCAL).
|
|
PRINT TAB(60 - SPECLEN%); 8!;
|
|
IF PON% = 1 THEN
|
|
LPRINT TAB(60 - SPECLEN%); 8!;
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
'Not a functional test. Get limits from TSPEC$ array.
|
|
PRINT TAB(60 - SPECLEN%); TSPEC$(x%);
|
|
IF PON% = 1 THEN
|
|
LPRINT TAB(60 - SPECLEN%); TSPEC$(x%);
|
|
END IF
|
|
END IF
|
|
PRINT TAB(61); B$;
|
|
IF PON% = 1 THEN
|
|
LPRINT TAB(61); B$;
|
|
END IF
|
|
|
|
'PRINT TAB(71); LEFT$(STATUS$(X%, L%), 4)
|
|
IF (LEFT$(STATUS$(x%, L%), 4) = "FAIL") THEN
|
|
COLOR 12, 0 'Test value text color to light red
|
|
ELSE
|
|
COLOR 10, 0 'Test value text color to light green
|
|
END IF
|
|
PRINT TAB(71); LEFT$(STATUS$(x%, L%), 4)
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
|
|
IF PON% = 1 THEN LPRINT TAB(71); LEFT$(STATUS$(x%, L%), 4)
|
|
|
|
END IF
|
|
NEXT
|
|
|
|
IF (TTYPE% <> 1) AND (TTYPE% <> 2) THEN
|
|
'Call FOOTER routine if not Functional or Pre-Encap test.
|
|
CALL FOOTER(STATUS$(), L%) 'Prints footer if no fails
|
|
ELSE
|
|
IF PON% = 1 THEN LPRINT CHR$(12) 'Send form feed to printer (regardless of module test status)
|
|
END IF
|
|
|
|
'NOTE: if the printer is slow, may need to ask if the sheet has
|
|
' printed for each page (within the DO/NEXT loop, above)
|
|
' or the printer buffer may overrun and cause the program
|
|
' to crash.
|
|
PRINT
|
|
IF (PON% = 1) THEN
|
|
PRINT TAB(10); "Has the hardcopy finished printing for channel "; L%; " ?"
|
|
END IF
|
|
DUMKEY$ = WAITFORKEY("F", 10, 14, 0) 'Waits for "F" key press (display bright yellow on black)
|
|
|
|
'-------------------------------------------------------------------------
|
|
'BELOW: Code to write to datasheet file(s) if the module has passed
|
|
' all tests and the text file flag is "on", to write a status
|
|
' line to the work order status file if the text file
|
|
' flag is "on" (regardless of the pass/fail status of the
|
|
' tested module), and to log the test data.
|
|
'-------------------------------------------------------------------------
|
|
IF (TX% = 1) AND (FAILS%(STATUS$(), L%) = 0) THEN
|
|
'No failures and text file flag is "on"
|
|
|
|
KEY(10) OFF 'Deactivates F10 key to keep datasheet file process from being interrupted
|
|
|
|
LOCALSN$ = SERNO$(L%) 'Get current serial number (serial number for channel being tested)
|
|
CALL GETDSFNAME(LOCALSN$, DSSNAME$, DSFNAME$) 'Get datasheet search and file names from serial number
|
|
CLS
|
|
LOCATE 10
|
|
PRINT "" 'Blank line
|
|
PRINT TAB(10); "Writing data for module in channel #: "; L%
|
|
|
|
CALL GETDSFNAME(LOCALSN$, DSSNAME$, DSFNAME$)
|
|
PRINT TAB(10); "Writing datasheet file: "; DSFNAME$
|
|
'Get datasheet search and file names from serial number
|
|
|
|
'Open datasheet file
|
|
OPEN "C:\STAGE\" + DSFNAME$ FOR OUTPUT AS #9 'Open datasheet file
|
|
|
|
'------------
|
|
'Write header
|
|
'------------
|
|
PRINT #9, TAB(5);
|
|
FOR x = 5 TO 75
|
|
PRINT #9, "=";
|
|
NEXT
|
|
|
|
PRINT #9, TAB(5); "DATAFORTH CORPORATION"; TAB(51); "Phone: (520) 741-1404"
|
|
PRINT #9, TAB(5); "3331 E. Hemisphere Loop"; TAB(51); "Fax: (520) 741-0762"
|
|
PRINT #9, TAB(5); "Tucson, AZ 85706 USA"; TAB(51); "email: info@dataforth.com"
|
|
PRINT #9,
|
|
PRINT #9, TAB(33); "TEST DATA SHEET"
|
|
PRINT #9, TAB(5);
|
|
FOR x = 5 TO 75
|
|
PRINT #9, "~";
|
|
NEXT
|
|
PRINT #9, TAB(5); "Date: "; DATE$
|
|
PRINT #9, TAB(5); "Model: "; SPECS.MODNAME
|
|
PRINT #9, TAB(5); "SN: "; TAB(12); LOCALSN$
|
|
PRINT #9,
|
|
|
|
'NOTE: Most values, calculations, and input type,
|
|
' scaling and units have already been
|
|
' calculated or selected above.
|
|
|
|
'-----------------------
|
|
'Write accuracy results
|
|
'-----------------------
|
|
'Write accuracy header
|
|
PRINT #9, TAB(34); "ACCURACY TEST"
|
|
PRINT #9,
|
|
PRINT #9, TAB(20); "Calculated"; TAB(38); "Measured"
|
|
|
|
PRINT #9, TAB(5); INPUTTYPE$;
|
|
|
|
PRINT #9, TAB(19); "Output ("; UNIT$; "DC)"; TAB(36); "Output ("; UNIT$; "DC)*";
|
|
PRINT #9, TAB(54); "Error (%)"; TAB(68); "Status"
|
|
PRINT #9, TAB(5); "----------"; TAB(19); "------------"; TAB(36); "-------------";
|
|
PRINT #9, TAB(53); "----------"; TAB(67); "--------"
|
|
|
|
'Write accuracy results
|
|
FOR INC% = 1 TO NUMPTS% STEP 1
|
|
PRINT #9, TAB(6); USING "+###.### +###.### +###.### +###.###"; INSIM!(L%, INC%); (OUTCALC!(L%, INC%)) * OUTSCALE!; OUTMEAS!(L%, INC%); ERROROUT!(L%, INC%);
|
|
PRINT #9, TAB(69); ACCSTAT$(L%, INC%)
|
|
NEXT
|
|
|
|
'-------------------------------------------
|
|
'Write test results (except accuracy steps)
|
|
'-------------------------------------------
|
|
'Output format
|
|
'1 10 20 30 40 50 60 70 80
|
|
' | | | | | | | |
|
|
' Parameter Measured Value* Specification Status
|
|
' ========================= =============== =================== ======
|
|
' ###### uVrms ## to ### uVrms PASS
|
|
' ohm/ohm
|
|
'
|
|
'Write all-tests header
|
|
PRINT #9,
|
|
PRINT #9, TAB(31); "FINAL TEST RESULTS"
|
|
PRINT #9,
|
|
PRINT #9, TAB(13); "Parameter"; TAB(32); "Measured Value*"; TAB(52); "Specification ";
|
|
PRINT #9, TAB(70); "Status"
|
|
PRINT #9, TAB(5); "========================="; TAB(32); "===============";
|
|
PRINT #9, TAB(49); "==================="; TAB(70); "======"
|
|
|
|
'Write all-tests results
|
|
RESTORE LINES 'Get test names and units from data listing
|
|
FOR x% = 1 TO MAXSTATUSINDEX
|
|
READ a$, B$ 'Read test names and units from LINES data
|
|
'Locally set the test names and units for selected tests
|
|
SELECT CASE x%
|
|
CASE 3
|
|
'A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz Sine"
|
|
a$ = "Accuracy"
|
|
CASE 4
|
|
'A$ = "Linearity, " + LTRIM$(STR$(FINCAL!)) + "Hz Sine"
|
|
a$ = "Linearity"
|
|
'The following lines were inherited from the RMS test program.
|
|
'These tests are not run for the high-voltage voltage-input
|
|
'modules, so the lines are commented out.
|
|
'CASE 5
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz Square"
|
|
'CASE 6
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 2"
|
|
'CASE 7
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 3"
|
|
'CASE 8
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 4"
|
|
'CASE 9
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINCAL!)) + "Hz, C.F.= 5"
|
|
'CASE 10
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINMAX!)) + "Hz Sine"
|
|
'CASE 11
|
|
' A$ = "Accuracy, " + LTRIM$(STR$(FINEXTMAX!)) + "Hz Sine"
|
|
END SELECT
|
|
|
|
IF RIGHT$(STATUS$(x%, L%), 1) <> "5" AND LEN(STATUS$(x%, L%)) > 0 THEN
|
|
'-------------------------------------------------------------------------------
|
|
'Parse the STATUS (test results) data if the number of characters
|
|
'is more than zero and the rightmost character (the # of decimal
|
|
'places to be displayed) is not "5". The general format of the
|
|
'STATUS data is shown below:
|
|
'
|
|
'STATUS$(X%, L%) format = <pass/fail> + <measured data> + <# decimal places>
|
|
' 4 char. ? char 1 char.
|
|
'
|
|
'The number of decimal places character is used to control the
|
|
'display/print format of the test results, and usually specifies
|
|
'the number of decimal places to show. The special value of "5"
|
|
'for # of decimal places is used by the OFFSET and GAIN (and
|
|
'perhaps other) tests as a flag to prevent the display or printing
|
|
'of the results of that test.
|
|
'-------------------------------------------------------------------------------
|
|
|
|
'Write test name to file.
|
|
PRINT #9, TAB(5); a$;
|
|
DATALEN% = LEN(STATUS$(x%, L%))
|
|
NUMDATA! = VAL(MID$(STATUS$(x%, L%), 5, DATALEN% - 5))
|
|
'Set test units for Supply Sensitivity test depending on module supply voltage
|
|
IF x% = 12 THEN
|
|
IF SPECS.NOMVS = 5 THEN 'SCM5B or 8B
|
|
B$ = "ppm/%"
|
|
ELSE 'DSCA
|
|
B$ = "%/%"
|
|
END IF
|
|
END IF
|
|
|
|
'Display or print using requested # of decimal places
|
|
IF RIGHT$(STATUS$(x%, L%), 1) = "0" THEN
|
|
PRINT #9, TAB(34); USING "###### &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "1" THEN
|
|
PRINT #9, TAB(34); USING "####.# &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "2" THEN
|
|
PRINT #9, TAB(34); USING "###.## &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "3" THEN
|
|
PRINT #9, TAB(34); USING "##.### &"; NUMDATA!; B$;
|
|
ELSEIF RIGHT$(STATUS$(x%, L%), 1) = "4" THEN
|
|
PRINT #9, TAB(34); USING "#.#### &"; NUMDATA!; B$;
|
|
END IF
|
|
'DP = 5: don't display or print spec. in final report.
|
|
'DP = 6: don't display or print numerical data
|
|
SPECLEN% = LEN(TSPEC$(x%))
|
|
PRINT #9, TAB(60 - SPECLEN%); TSPEC$(x%);
|
|
PRINT #9, TAB(61); B$;
|
|
PRINT #9, TAB(71); LEFT$(STATUS$(x%, L%), 4)
|
|
END IF
|
|
NEXT
|
|
|
|
'------------
|
|
'Write footer
|
|
'------------
|
|
PRINT #9, TAB(5); "240 VAC Withstand"; TAB(71); "PASS"
|
|
PRINT #9, TAB(5); "Hi-Pot "; TAB(71); "PASS"
|
|
PRINT #9, TAB(5);
|
|
FOR x = 5 TO 75
|
|
PRINT #9, "_";
|
|
NEXT x
|
|
PRINT #9, TAB(35); "Check List"
|
|
PRINT #9,
|
|
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" OR LEFT$(SPECS.MODNAME, 2) = "8B" THEN
|
|
'PRINT #9, TAB(5); "Module Appearance: _____"; TAB(45); "Mounting Screw: _____"
|
|
PRINT #9, TAB(5); "Module Appearance: __X__"; TAB(45); "Mounting Screw: __X__"
|
|
PRINT #9,
|
|
'PRINT #9, TAB(5); "Pins Straight: _____"; TAB(45); "Module Header: _____"
|
|
PRINT #9, TAB(5); "Pins Straight: __X__"; TAB(45); "Module Header: __X__"
|
|
PRINT #9,
|
|
END IF
|
|
|
|
'PRINT #9, TAB(5); "Tested by: _____________"; TAB(45); "QC: _______________"
|
|
PRINT #9,
|
|
PRINT #9, TAB(5); "It is hereby certified that the above product is in conformance with"
|
|
PRINT #9, TAB(5); "all requirements to the extent specified. This product is not"
|
|
PRINT #9, TAB(5); "authorized or warranted for use in life support devices and/or systems."
|
|
PRINT #9,
|
|
PRINT #9, TAB(5); "* NIST traceable calibration certificates support Measured Value data."
|
|
PRINT #9, TAB(5); " Calibration services are available through ANSI/NCSL Z540-1 and"
|
|
PRINT #9, TAB(5); " ISO Guide 25 Certified Metrology Labs."
|
|
|
|
'--------------------
|
|
'Close datasheet file
|
|
'--------------------
|
|
CLOSE #9
|
|
|
|
PRINT TAB(10); "Finished writing datasheet file: "; DSFNAME$
|
|
|
|
KEY(10) ON 'Reactivates F10 key
|
|
|
|
ELSE
|
|
'Set up display in lieu of missing datasheet file print statements
|
|
CLS
|
|
LOCATE 10
|
|
PRINT "" 'Blank line
|
|
PRINT "" 'Blank line
|
|
PRINT "" 'Blank line
|
|
PRINT "" 'Blank line
|
|
END IF 'End if text file flag is "on" and there are no test failures
|
|
|
|
'-------------------------------------------
|
|
'Write status line to work order status file
|
|
'and log the test data
|
|
'-------------------------------------------
|
|
IF TX% = 1 THEN
|
|
KEY(10) OFF 'Deactivates F10 key
|
|
'CLS
|
|
'Write line to work order status file
|
|
'LOCATE 5
|
|
PRINT
|
|
PRINT TAB(10); "About to write to work order status file."
|
|
CALL WORKORDERLINE(FAILS%(STATUS$(), L%), LOCALSN$)
|
|
PRINT TAB(10); "Finished writing work order status to file."
|
|
PRINT "" 'Blank line
|
|
'Log test data
|
|
PRINT
|
|
PRINT TAB(10); "Logging test data...."
|
|
CALL LOGIT(STATUS$(), LOCALSN$, INSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), L%)
|
|
PRINT TAB(10); "Finished logging test data...."
|
|
KEY(10) ON 'Reactivates F10 key
|
|
CALL CONTINUE
|
|
END IF
|
|
|
|
'-------------------------------------------------------------------------
|
|
'ABOVE: Code to write to datasheet file(s) if the module has passed
|
|
' all tests and the text file flag is "on", to write a status
|
|
' line to the work order status file if the text file
|
|
' flag is "on" (regardless of the pass/fail status of the
|
|
' tested module), and to log the test data.
|
|
'-------------------------------------------------------------------------
|
|
|
|
NEXT
|
|
|
|
END SUB
|
|
|
|
'*********************************
|
|
FUNCTION SETDUTIN! (DUTIN!)
|
|
'In the HV test configuration with the HV cable from the HV power supply,
|
|
'this function sets the voltage of the HV power supply and the connection
|
|
'of the supply through either the 760A "pigtail" connector (inverted input
|
|
'from the supply) or the 33120A BNC (non-inverted input from the supply),
|
|
'depending on whether the "DUTIN!" parameter is negative or not (inverted
|
|
'if negative). See comments in the "CONFDUTIN" sub. This function then
|
|
'measures the DUT input voltage and returns the measured voltage.
|
|
'
|
|
'NOTE: The DUT input voltage is set in one write to the HV power supply,
|
|
' not successively measured/adjusted (similar functions that set the
|
|
' DUT input in other test programs often loop through set/measure
|
|
' loops until the measured input matches the expected within a certain
|
|
' tolerance. This function does not do that, but simply sets once,
|
|
' then measures.
|
|
'
|
|
'Set HV supply connection and voltage
|
|
IF (DUTIN! < 0!) THEN
|
|
'Inverted input
|
|
CALL CONFDUTIN(0) 'Connect HV supply to DUT inputs through the 760A "pigtail" conn.
|
|
ELSE
|
|
'Non-inverted input
|
|
CALL CONFDUTIN(1) 'Connect HV supply to DUT inputs through the 33120A BNC
|
|
END IF
|
|
CALL SETDPS(DPSVINADDR%, ABS(DUTIN! / 2)) 'Set supply voltage (absolute value of passed voltage)
|
|
CALL SETDPS(DPSVINADDR2%, ABS(DUTIN! / 2))
|
|
'Measure DUT input voltage
|
|
CH% = VIN.CH%
|
|
CALL DVMCONF(CH%, VDC$, "AUTO", 0, "", 0)
|
|
CALL DVMSENS(CH%, VDC$, INTTIME$, "", 2) '6 1/2 digits, 21 bit resolution
|
|
|
|
CALL SETSWITCH(DUT3INPUT.CH%, 1) 'All 4 D.U.T. inputs in parallel
|
|
CALL SETSWITCH(DUT2INPUT.CH%, 1)
|
|
CALL SETSWITCH(DUT1INPUT.CH%, 1)
|
|
|
|
CALL PAUSE(1) 'WAIT 1 SEC
|
|
|
|
SETERROR! = GETREADING! / IINSEN1.MEAS! - DUTIN! 'Error in Vrms
|
|
|
|
SETDUTIN! = DUTIN! + SETERROR!
|
|
|
|
END FUNCTION
|
|
|
|
'**********************************
|
|
SUB SETOUTLOAD (LOAD!, NUMDUT%)
|
|
|
|
'Set the specified output load.
|
|
'Inputs;
|
|
' LOAD! specified load resistor to set
|
|
' NUMDUT% = number of Devices Under Test
|
|
'
|
|
'Outputs; None
|
|
|
|
NOMVS! = SPECS.NOMVS
|
|
|
|
IF LOAD! >= 10000 THEN 'load = open
|
|
FOR L% = 1 TO NUMDUT%
|
|
CALL SETSWITCH(IOUTLOAD1DUT1.CH% + L% * 2 - 2, 0) 'disconnect 250 ohm
|
|
CALL SETSWITCH(IOUTLOAD2DUT1.CH% + L% * 2 - 2, 0) 'disconnect 600 ohm
|
|
CALL SETSWITCH(VLOOPDUT1.CH% + L% - 1, 0) 'disconnect Vloop
|
|
NEXT
|
|
ELSEIF LOAD! > 599 THEN 'load = 600 ohm
|
|
FOR L% = 1 TO NUMDUT%
|
|
CALL SETSWITCH(IOUTLOAD2DUT1.CH% + L% * 2 - 2, 1) 'connect 600 ohm
|
|
CALL SETSWITCH(IOUTLOAD1DUT1.CH% + L% * 2 - 2, 0) 'disconnect 250 ohm
|
|
IF NOMVS! = 5 THEN 'SCM5B, connect loop excitation
|
|
CALL SETSWITCH(VLOOPDUT1.CH% + L% - 1, 1)
|
|
END IF
|
|
NEXT
|
|
ELSE 'load = 250 ohm
|
|
FOR L% = 1 TO NUMDUT%
|
|
CALL SETSWITCH(IOUTLOAD1DUT1.CH% + L% * 2 - 2, 1) 'connect 250 ohm
|
|
CALL SETSWITCH(IOUTLOAD2DUT1.CH% + L% * 2 - 2, 0) 'disconnect 600 ohm
|
|
IF NOMVS! = 5 THEN 'SCM5B, connect loop excitation
|
|
CALL SETSWITCH(VLOOPDUT1.CH% + L% - 1, 1)
|
|
END IF
|
|
NEXT
|
|
END IF
|
|
|
|
END SUB
|
|
|
|
'************************************
|
|
FUNCTION SETSCM5BPWR (VSUPPLY!)
|
|
|
|
'Set the voltage controlled voltage source used for SCM5B power
|
|
'Inputs; VSUPPLY!, Required supply voltage
|
|
'Output; VSUPPLY!, Measured supply voltage
|
|
|
|
VSNOM! = 5 'Define as constant. SPECS.VSNOM not known
|
|
'upon program start.
|
|
|
|
CALL SETSWITCH(VSSOURCE.CH%, 0) 'D.U.T. Power is test head VCVS
|
|
CALL DVMCONF(SCM5BVS.CH%, VDC$, "", VSNOM!, "", 0)
|
|
CALL DVMSENS(SCM5BVS.CH%, VDC$, INTTIME$, "", .02) '4 1/2 digits, 15 bit resolution
|
|
|
|
IF VSUPPLY! <= .1 THEN
|
|
VSTOL! = .1 'Set error (V)
|
|
ELSE
|
|
VSTOL! = .005
|
|
END IF
|
|
|
|
VSERROR! = 0
|
|
VOLTAGE! = VSUPPLY!
|
|
ITER% = 0
|
|
|
|
DO
|
|
ITER% = ITER% + 1
|
|
VOLTAGE! = VOLTAGE! - VSERROR!
|
|
|
|
|
|
|
|
IF (VOLTAGE! < 0) THEN 'SETS LIMITS
|
|
|
|
VOLTAGE! = 0
|
|
|
|
ELSEIF (VOLTAGE! > 6) THEN
|
|
|
|
VOLTAGE! = 6
|
|
END IF
|
|
|
|
|
|
CALL SETDAC3(1, VOLTAGE!)
|
|
'PRINT VOLTAGE!: CALL CONTINUE
|
|
VSERROR! = GETREADING! - VSUPPLY! 'error (V)
|
|
LOOP WHILE ABS(VSERROR!) > VSTOL! AND ITER% < 40
|
|
|
|
IF VSUPPLY! > 1 AND ITER% = 40 THEN
|
|
PRINT "Error! 5V power supply not operational. Contact engineering."
|
|
PRINT "VSUPPLY! = "; VSUPPLY!, "VSERROR! = "; VSERROR!
|
|
PRINT
|
|
'PRINT TAB(10); "High supply current! Remove module from test fixture."
|
|
'PRINT
|
|
CALL SETDAC3(1, 0!)
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
CALL CONTINUE
|
|
VSUPPLY! = -1
|
|
'STOP
|
|
END IF
|
|
|
|
IF VSUPPLY! = 5! THEN CALL PAUSE(1!) 'Allow module output to settle.
|
|
'Usually power was previously off.
|
|
SETSCM5BPWR! = VSUPPLY! + VSERROR! 'Pass actual Vs back
|
|
|
|
END FUNCTION
|
|
|
|
SUB SHOWDIO (DIODATA%, WORNO%, DEBUGVAL%)
|
|
'Sub to display the value of the word storing the DIO state in the
|
|
'Agilent DAS (Data Acquisition System). Parameters include the word
|
|
'value, the word number (1 or 2) and the debug flag ("1" to enable
|
|
'the display of the values).
|
|
'
|
|
IF (DEBUGVAL% = 1) THEN
|
|
PRINT "==========================="
|
|
IF (WORNO% = 1) THEN
|
|
PRINT "PRINTING DATA FOR WORD 1"
|
|
ELSEIF (WORNO% = 2) THEN
|
|
PRINT "PRINTING DATA FOR WORD 2"
|
|
ELSE
|
|
PRINT "INVALID WORD!"
|
|
END IF
|
|
PRINT "DIODATA% = "; DIODATA%
|
|
PRINT "......................"
|
|
PRINT "==========================="
|
|
PRINT
|
|
CALL CONTINUE
|
|
END IF
|
|
END SUB
|
|
|
|
'******************************************
|
|
FUNCTION SNMENU$ (SLOTNO%, SERNOOLD$, SNFLAG%)
|
|
'Function that returns the serial number of the next module. If SNFLAG% is "1",
|
|
'the serial number (work order and dash (sequential) number) to start a new set
|
|
'units is obtained, but if SNFLAG% is "0", the serial number of the next installed
|
|
'module (the module in the next test channel) is entered.
|
|
'
|
|
PREVSLOT% = SLOTNO% - 1 'Set previous channel number
|
|
CLS
|
|
LOCATE 5
|
|
COLOR 14, 0, 0 'Yellow on black
|
|
PRINT TAB(6); "-----------------------------------------------------------------"
|
|
PRINT TAB(6); " Serial Number Selection Menu "
|
|
PRINT TAB(6); "-----------------------------------------------------------------"
|
|
PRINT
|
|
PRINT TAB(6); " Setting dash number for the unit in test channel #:"; SLOTNO%; ""
|
|
COLOR 15, 0, 0 'Bright white on black
|
|
PRINT TAB(6); " CHANNEL: "; SLOTNO%; " "
|
|
COLOR 14, 0, 0 'Yellow on black
|
|
PRINT TAB(6); "-----------------------------------------------------------------"
|
|
PRINT
|
|
'Display lines below depend on the state of SNFLAG%
|
|
COLOR 15, 0, 0 'Bright white on black
|
|
IF SNFLAG% <> 0 THEN
|
|
PREVSLOT% = SLOTNO% - 1
|
|
PRINT TAB(8); "The serial number of the DUT in test channel#"; PREVSLOT%; " is: "; SERNOOLD$
|
|
ELSE
|
|
PRINT TAB(8); "The serial number of the last unit tested is: "; SERNOOLD$
|
|
END IF
|
|
'Display selection menu
|
|
PRINT
|
|
COLOR 15, 0, 0 'Bright white on black
|
|
PRINT TAB(8); "Choose from the following options:"
|
|
PRINT
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
PRINT TAB(8); "1.) Next sequential number from previous DUT"
|
|
PRINT TAB(8); "2.) Non-sequential serial number (but same"
|
|
PRINT TAB(8); " work-order number) as previous DUT "
|
|
PRINT
|
|
'Loop to get valid keyboard entry
|
|
LOOPSTAY% = 1 'Initialize flag to stay in loop
|
|
DO
|
|
I$ = INKEY$
|
|
IF SNFLAG% = 1 THEN
|
|
'Starting serial number for a new set of modules
|
|
IF (VAL(I$) < 1 OR VAL(I$) > 2) THEN
|
|
'A "1" or "2" was not entered
|
|
LOOPSTAY% = 1
|
|
ELSE
|
|
'A "1" or "2" was entered
|
|
LOOPSTAY% = 0
|
|
END IF
|
|
ELSE
|
|
'Serial number for a module within a set of modules
|
|
'IF (VAL(I$) < 1 OR VAL(I$) > 3) THEN
|
|
'A "1", "2" or "3" was not entered
|
|
IF (VAL(I$) <> 1 AND VAL(I$) <> 2) THEN
|
|
'A "1" or "2" was not entered
|
|
LOOPSTAY% = 1
|
|
ELSE
|
|
'A "1", "2" or "3" was entered
|
|
LOOPSTAY% = 0
|
|
END IF
|
|
END IF
|
|
LOOP WHILE (LOOPSTAY% = 1)
|
|
SEL4% = VAL(I$)
|
|
|
|
'Increment, change dash (sequential) number, or get new (entire) serial number,
|
|
'depending on menu selection (and SNFLAG%).
|
|
SELECT CASE SEL4% 'Changes S/N information as selected
|
|
CASE 1
|
|
SERNONEW$ = UPSN$(SERNOOLD$) 'Increments the Dash# of the serial #
|
|
CASE 2
|
|
SERNONEW$ = SERNOOLD$
|
|
CALL CHANGEDN(SERNONEW$) 'Changes dash number only
|
|
END SELECT
|
|
|
|
'Set function return to new serial number
|
|
SNMENU$ = SERNONEW$
|
|
|
|
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\HVDATA\HVSORT.DAT" FOR RANDOM AS #2 LEN = LEN(SORTDATA1)
|
|
OPEN "C:\ATE\HVDATA\HVIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
|
|
NUMRECORD% = LOF(1) / LEN(SPECS)
|
|
|
|
SELFAM% = MENU3%
|
|
IF SELFAM% = 4 THEN
|
|
ENDFLAG% = 1
|
|
CLOSE #1
|
|
CLOSE #2
|
|
CLOSE #3
|
|
EXIT SUB 'exit selected from MENU3%
|
|
END IF
|
|
|
|
n% = 0
|
|
|
|
FOR I% = 1 TO NUMRECORD%
|
|
GET #1, I%, SPECS
|
|
MN$ = SPECS.MODNAME
|
|
SORTDATA1.MODNAME = MN$
|
|
SORTDATA1.RECNUM = I%
|
|
|
|
SELECT CASE SELFAM% 'Pick models in selected family
|
|
|
|
CASE 1
|
|
'SPECS.MODNAME = "SCM5B-xxxx "
|
|
IF LEFT$(MN$, 5) = "SCM5B" THEN
|
|
PUT #2, , SORTDATA1 'write record # and model number
|
|
n% = n% + 1 'found a record
|
|
END IF
|
|
|
|
CASE 2
|
|
'SPECS.MODNAME = "DSCA-xxxx "
|
|
IF LEFT$(MN$, 4) = "DSCA" THEN
|
|
PUT #2, , SORTDATA1 'write record # and model number
|
|
n% = n% + 1 'found a record
|
|
END IF
|
|
|
|
|
|
CASE 3
|
|
'SPECS.MODNAME = "8B-xxxx "
|
|
IF LEFT$(MN$, 2) = "8B" THEN
|
|
PUT #2, , SORTDATA1 'write record # and model number
|
|
n% = n% + 1 'found a record
|
|
END IF
|
|
END SELECT
|
|
NEXT
|
|
|
|
SORTDATA1.MODNAME = "99999999-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
|
|
CLOSE #3
|
|
END SUB
|
|
|
|
'******************************
|
|
SUB SUPPLYI (NUMDUT%, STATUS$())
|
|
'Measure DUT quiescent supply current at +f.s. output
|
|
'Inputs; NUMDUT% = number of Devices Under Test
|
|
'Outputs; STATUS$(1,n) array of results
|
|
'
|
|
MAXIN! = SPECS.MAXIN
|
|
MAXOUT! = SPECS.MAXOUT 'V or A
|
|
FINCAL! = SPECS.FINCAL 'Input waveshape frequency (Hz)
|
|
ISMIN! = SPECS.ISMIN
|
|
|
|
|
|
'IF LEFT$(SPECS.MODNAME, 9) = "DSCA41-03" THEN
|
|
' ISMIN! = 10! 'Hardcode for DSCA debug.
|
|
'END IF
|
|
|
|
ISMAX! = SPECS.ISMAX 'Isupply with max current out if applicable.
|
|
NOMVS! = SPECS.NOMVS
|
|
|
|
MAXINMEAS! = SETDUTIN!(MAXIN!)
|
|
|
|
LOCATE 8, 10
|
|
PRINT SPC(45);
|
|
|
|
CLS
|
|
TESTTITLE$ = "Supply Current Test"
|
|
|
|
FOR L% = 1 TO NUMDUT%
|
|
CLS
|
|
LOCATE 1
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
|
|
LOCATE 8, 25: PRINT "TESTING DEVICE IN CHANNEL #"; L%
|
|
|
|
IF L% < 3 THEN
|
|
IF L% = 1 THEN
|
|
SWITCHSTATE% = 0
|
|
ELSE
|
|
SWITCHSTATE% = 1
|
|
END IF
|
|
|
|
CALL SETSWITCH(SWITCHISDUT1.CH%, SWITCHSTATE%)
|
|
CALL SETSWITCH(SWITCHISDUT2.CH%, SWITCHSTATE%)
|
|
IS.CH% = MEASISUPPLY1.CH%
|
|
ELSE
|
|
IF L% = 3 THEN
|
|
SWITCHSTATE% = 0
|
|
ELSE
|
|
SWITCHSTATE% = 1
|
|
END IF
|
|
|
|
CALL SETSWITCH(SWITCHISDUT3.CH%, SWITCHSTATE%)
|
|
CALL SETSWITCH(SWITCHISDUT4.CH%, SWITCHSTATE%)
|
|
IS.CH% = MEASISUPPLY2.CH%
|
|
END IF
|
|
|
|
CALL DVMCONF(IS.CH%, ADC$, "", ISMAX! * 2 / 1000, "", 0)
|
|
CALL DVMSENS(IS.CH%, ADC$, INTTIME$, "MIN", 0) '4 1/2 digits, 15 bit resolution
|
|
ISUP! = GETREADING! * 1000
|
|
CALL PAUSE(1)
|
|
ISUP! = GETREADING! * 1000
|
|
|
|
|
|
ST$ = " "
|
|
IF ISUP! < 1 AND VSNOM! <> 5 THEN 'DSCA
|
|
IF POWERIO$(DPSADDR%, ISTAT$) = "RCS=01" THEN 'Check for over-current
|
|
LOCATE 10
|
|
PRINT TAB(10); "One or more of the modules has high supply current."
|
|
PRINT TAB(10); "Remove all of the modules and test them one at at time"
|
|
PRINT TAB(10); "to find the faulty modules."
|
|
FOR M% = 1 TO NUMDUT%
|
|
STATUS$(1, M%) = "FAIL5"
|
|
NEXT
|
|
EXIT SUB 'High supply current
|
|
END IF
|
|
END IF
|
|
|
|
IF ISUP! < ISMAX! AND ISUP! > ISMIN! THEN
|
|
SUPI$ = "PASS"
|
|
ELSE
|
|
SUPI$ = "FAIL"
|
|
SOUND 1000, .5
|
|
END IF
|
|
|
|
'Set DUT input voltage power supply to 0V (PWR 2014-10-08)
|
|
CALL SETDPS(DPSVINADDR%, 0!)
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
'LOCATE 10, 10: PRINT "MODULE #"; L%; " Status: "; SUPI$;
|
|
LOCATE 11, 10 'Added
|
|
PRINT TAB(10); "Measured supply current is";
|
|
PRINT TAB(50); USING "&###.# mA"; ST$; ISUP!
|
|
PRINT TAB(10); "Required supply current is";
|
|
PRINT TAB(50); USING " ###.# mA to ###.# mA"; ISMIN!; ISMAX!
|
|
|
|
CALL FAILSTATUS(L%, SUPI$, 10, 10, "Status: ", 20) 'Print test status to screen
|
|
|
|
IF SUPI$ = "FAIL" THEN
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
IF NOMVS! <> 5 THEN 'DSCA
|
|
SP$ = POWERIO$(DPSADDR%, SUPPLYOFF$) 'Disable power supply
|
|
ELSE 'SCM5B
|
|
SP! = SETSCM5BPWR!(.01) 'Set Vsupply to zero
|
|
END IF
|
|
CLS
|
|
LOCATE 10
|
|
'PRINT
|
|
COLOR 28, 0, 0 'Flashing light red
|
|
PRINT TAB(10); "Remove unit #"; L%; " from the test head."
|
|
COLOR 11, 0, 0 'Cyan on black background 'from test head, input current can't be set.
|
|
BEEP
|
|
CALL CONTINUE
|
|
'MAXINMEAS! = SETDUTIN!(MAXIN!) 'Reset input to +f.s.
|
|
CLS
|
|
IF NOMVS! <> 5 THEN 'DSCA
|
|
CALL SETDPS(DPSADDR%, NOMVS!) 'Set Vsupply to nominal value
|
|
IF POWERIO$(DPSADDR%, ISTAT$) = "RCS=01" THEN 'Check for over-current
|
|
MOREFAIL% = 1
|
|
END IF
|
|
ELSE 'SCM5B and 8B
|
|
SP! = SETSCM5BPWR!(NOMVS!) 'Set Vsupply to nominal value
|
|
IF SP! = -1 THEN
|
|
MOREFAIL% = 1
|
|
END IF
|
|
END IF
|
|
IF MOREFAIL% = 1 THEN
|
|
CLS
|
|
LOCATE 10
|
|
PRINT TAB(10); "One or more of the remaining modules has high supply current."
|
|
PRINT TAB(10); "Remove all of the modules and test them one at at time to find"
|
|
PRINT TAB(10); "the faulty modules."
|
|
CALL CONTINUE
|
|
CLS
|
|
FOR M% = L% TO NUMDUT%
|
|
STATUS$(1, M%) = "FAIL5"
|
|
NEXT
|
|
EXIT SUB 'High supply current
|
|
END IF
|
|
END IF
|
|
|
|
STATUS$(1, L%) = SUPI$ + STR$(ISUP!) + "1" 'append # decimal places
|
|
|
|
IF L% < NUMDUT% THEN 'Prevent to assign a not valid serial number
|
|
SN$ = SERNO$(L% + 1) 'Use the next serial number on the array
|
|
END IF
|
|
CALL PAUSE(1!)
|
|
CLS
|
|
NEXT
|
|
|
|
SN$ = SERNO$(1)
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
END SUB
|
|
|
|
'**********************************
|
|
SUB SUPPLYSEN (NUMDUT%, STATUS$())
|
|
'Measure module power supply sensitivity
|
|
'Inputs; NUMDUT% = number of Devices Under Test
|
|
'Outputs; STATUS$(2,n) array of results,
|
|
' Supply sensitivity in ppm / % (5B) or % / % (DSCA)
|
|
'
|
|
MAXIN! = SPECS.MAXIN 'Module input (V or A)
|
|
FINCAL! = SPECS.FINCAL 'Input waveshape frequency (Hz)
|
|
MINOUT! = SPECS.MINOUT 'Module output (V or A)
|
|
MAXOUT! = SPECS.MAXOUT
|
|
PSS! = SPECS.PSS 'Spec, ppm / % (5B) or % / % (DSCA)
|
|
MINVS! = SPECS.MINVS
|
|
MAXVS! = SPECS.MAXVS
|
|
NOMVS! = SPECS.NOMVS
|
|
ORANGE! = MAXOUT! - MINOUT!
|
|
OUTSIGTYPE$ = SPECS.OUTSIGTYPE$
|
|
|
|
IF NOMVS! = 5 THEN 'SCM5B
|
|
CONV! = 10000
|
|
' what about the 8B ?
|
|
ELSE 'DSCA
|
|
CONV! = 1 'Conversion factor, % / %
|
|
END IF
|
|
|
|
CLS
|
|
TESTTITLE$ = "Power Supply Sensitivity Test"
|
|
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
|
|
MAXINMEAS! = SETDUTIN!(MAXIN!)
|
|
OUTCALC! = MODULEOUT!(MAXINMEAS!)
|
|
|
|
FOR L% = 1 TO NUMDUT%
|
|
LOCATE 1
|
|
IF L% <> 1 THEN
|
|
CALL HEADERB(TESTTITLE$, 0)
|
|
END IF
|
|
|
|
'Check if module previously failed supply current
|
|
'(removed from test head), offset cal or gain cal
|
|
'(not functional) or output switch test (not functional)
|
|
IF LEFT$(STATUS$(1, L%), 4) <> "FAIL" AND LEFT$(STATUS$(2, L%), 4) <> "FAIL" AND LEFT$(STATUS$(13, L%), 4) <> "FAIL" AND LEFT$(STATUS$(14, L%), 4) <> "FAIL" THEN
|
|
|
|
LOCATE 10, 25: PRINT "TESTING DEVICE IN CHANNEL #"; L%
|
|
|
|
IF NOMVS! = 5 THEN 'SCM5B
|
|
MINVS.MEAS! = SETSCM5BPWR!(MINVS!) 'Set Vsupply to minimum value
|
|
ELSE
|
|
CALL SETDPS(DPSADDR%, MINVS!) 'Set Vsupply to minimum value
|
|
MINVS.MEAS! = MINVS!
|
|
END IF
|
|
|
|
CALL PAUSE(.5)
|
|
'Dummy value
|
|
IF OUTSIGTYPE$ = "CURRENT" THEN
|
|
CH% = IOUTSENDUT1SEN.CH%
|
|
ELSE 'OUTSIGTYPE$ = "VOLTAGE"
|
|
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
|
|
CH% = VOUTDUT1.CH% 'SCM5B module output.
|
|
ELSE
|
|
CH% = IOUTSENDUT1SOUR.CH% 'DSCA and 8B module outputs.
|
|
END IF
|
|
END IF
|
|
|
|
CALL DVMCONF(CH% + L% - 1, VDC$, "", OUTCALC! * IOUTSEN1.MEAS!(1), "", 0)
|
|
CALL DVMSENS(CH% + L% - 1, VDC$, INTTIME$, "", 2) '6 1/2 digits, 21 bit resolution
|
|
|
|
CALL PAUSE(1)
|
|
OUT1! = GETREADING! / IOUTSEN1.MEAS!(L%) 'Output @ MINVS
|
|
|
|
IF NOMVS! = 5 THEN 'SCM5B
|
|
MAXVS.MEAS! = SETSCM5BPWR!(MAXVS!) 'Set Vsupply to maximum value
|
|
CALL DVMCONF(CH% + L% - 1, VDC$, "", OUTCALC! * IOUTSEN1.MEAS!(1), "", 0)
|
|
CALL DVMSENS(CH% + L% - 1, VDC$, INTTIME$, "", 2) '6 1/2 digits, 21 bit resolution
|
|
|
|
ELSE 'IF NOMVS! = 24 THEN
|
|
CALL SETDPS(DPSADDR%, MAXVS!) 'Set Vsupply to maximum value
|
|
MAXVS.MEAS! = MAXVS!
|
|
END IF
|
|
|
|
CALL PAUSE(1)
|
|
|
|
OUT2! = GETREADING! / IOUTSEN1.MEAS!(L%) 'Output @ MAXVS
|
|
DELTAOUT! = ((OUT2! - OUT1!) / ORANGE! * CONV!) / ((MAXVS.MEAS! - MINVS.MEAS!) / NOMVS!) 'Change in output (ppm/% or %/%)
|
|
|
|
IF ABS(DELTAOUT!) <= PSS! THEN
|
|
PSSSTAT$ = "PASS"
|
|
ELSE
|
|
PSSSTAT$ = "FAIL"
|
|
SOUND 1000, .5
|
|
END IF
|
|
|
|
'Set DUT input voltage power supply to 0V (PWR 2014-10-08)
|
|
CALL SETDPS(DPSVINADDR%, 0!)
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
'LOCATE 15, 10: PRINT "MODULE #"; L%; " Status: "; PSSSTAT$;
|
|
LOCATE 16, 10 'Added
|
|
PRINT SPC(20);
|
|
IF NOMVS! = 5 THEN 'SCM5B
|
|
PRINT TAB(10); "Measured change in output voltage is";
|
|
PRINT TAB(47); USING " ##### ppm / %"; DELTAOUT!
|
|
PRINT TAB(10); "Required change in output voltage is";
|
|
PRINT TAB(47); USING " < #### ppm / %"; PSS!
|
|
STATUS$(12, L%) = PSSSTAT$ + STR$(DELTAOUT!) + "0"
|
|
ELSE 'DSCA
|
|
PRINT TAB(10); "Measured change in output voltage is";
|
|
PRINT TAB(47); USING " #.#### % / %"; DELTAOUT!
|
|
PRINT TAB(10); "Required change in output voltage is";
|
|
PRINT TAB(47); USING " < #.#### % / %"; PSS!
|
|
STATUS$(12, L%) = PSSSTAT$ + STR$(DELTAOUT!) + "4"
|
|
END IF
|
|
|
|
CALL FAILSTATUS(L%, PSSSTAT$, 15, 10, "Status: ", 20) 'Print test status to screen
|
|
|
|
END IF
|
|
|
|
IF L% < NUMDUT% THEN 'Prevent to assign a not valid serial number
|
|
SN$ = SERNO$(L% + 1) 'Use the next serial number on the array
|
|
END IF
|
|
CALL PAUSE(1!)
|
|
IF L% <> NUMDUT% THEN
|
|
FOR M% = 15 TO 17
|
|
LOCATE M%, 10
|
|
PRINT SPC(65);
|
|
NEXT
|
|
PRINT
|
|
END IF
|
|
CLS
|
|
NEXT
|
|
|
|
SN$ = SERNO$(1)
|
|
|
|
IF NOMVS! = 5 THEN 'SCM5B
|
|
SP! = SETSCM5BPWR!(NOMVS!) 'Set Vsupply to nominal value
|
|
ELSE
|
|
CALL SETDPS(DPSADDR%, NOMVS!) 'Set Vsupply to nominal value
|
|
END IF
|
|
CALL SETDPS(DPSVINADDR%, 0) 'Set input voltage (at ext. supply) to 0V
|
|
CALL SETDPS(DPSVINADDR2%, 0)
|
|
END SUB
|
|
|
|
'**********************************
|
|
SUB TSPECS (TSPEC$())
|
|
' STEPPERC! = 90 '% span @ 120ms
|
|
' STEPTOL! = 5 '+/-5% tolerance
|
|
TSPEC$(1) = " < " + STR$(SPECS.ISMAX) 'Isupply spec, max load
|
|
TSPEC$(2) = "" 'Output switch
|
|
TSPEC$(3) = "+/-" + STR$(SPECS.ACCSINCAL) 'Accuracy spec
|
|
TSPEC$(4) = "+/-" + STR$(SPECS.LINEAR) 'Linearity/conformity spec
|
|
TSPEC$(5) = "+/-" + STR$(SPECS.ACCSINCAL) 'Accuracy, CF = 1
|
|
TSPEC$(6) = "+/-" + STR$(SPECS.ACCSINCAL + SPECS.ACCCF12) 'Accuracy, CF = 2
|
|
TSPEC$(7) = "+/-" + STR$(SPECS.ACCSINCAL + SPECS.ACCCF23) 'Accuracy, CF = 3
|
|
TSPEC$(8) = "+/-" + STR$(SPECS.ACCSINCAL + SPECS.ACCCF34) 'Accuracy, CF = 4
|
|
TSPEC$(9) = "+/-" + STR$(SPECS.ACCSINCAL + SPECS.ACCCF45) 'Accuracy, CF = 5
|
|
TSPEC$(10) = "+/-" + STR$(SPECS.ACCSINCAL + SPECS.ACCSINSTD) 'Fin = FINMAX
|
|
TSPEC$(11) = "+/-" + STR$(SPECS.ACCSINCAL + SPECS.ACCSINEXT) 'Fin = FINEXTMAX
|
|
TSPEC$(12) = "+/-" + STR$(SPECS.PSS) 'Power supply sensitivity
|
|
TSPEC$(13) = "+/-" + STR$(SPECS.ACCSINCAL) 'Offset calibration spec
|
|
TSPEC$(14) = "+/-" + STR$(SPECS.ACCSINCAL) 'Gain calibration spec
|
|
TSPEC$(15) = STR$(SPECS.STEPPERC) + " +/-" + STR$(SPECS.STEPTOL) 'Response time
|
|
TSPEC$(16) = " <=" + STR$(SPECS.OUTNOISE) 'Output noise
|
|
TSPEC$(17) = "+/-" + STR$(DELTALOADTOL!) 'Output change with max load
|
|
|
|
END SUB
|
|
|
|
FUNCTION WAITFORKEY$ (KEY$, TABPOS%, FORECOL%, BACKCOL%)
|
|
'Wait for the user to press the key specified by the "KEY$" parameter (upper or lower case).
|
|
'A message is displayed on row after the current row of the screen cursor row, tabbed over
|
|
'the number of spaces specified by the "TABPOS%" parameter. This sub is used in situations
|
|
'where a specific key should be pressed, rather than "any" key, such as after the final test
|
|
'status is displayed on the screen (so that the operator is sure to see the "PASS" or "FAIL"
|
|
'status) or in any situation when previous keystrokes need to be ignored. For distinction,
|
|
'the message is displayed in the passed foreground and background colors.
|
|
COLOR FORECOL%, BACKCOL% 'Set to passed foreground and background colors
|
|
EATTHIS$ = INKEY$ '"Eat" any keystrokes in the buffer.
|
|
KEYUC$ = UCASE$(KEY$)
|
|
KEYLC$ = LCASE$(KEY$)
|
|
PRINT ""
|
|
'PRINT TAB(10); "Press the '"; KEY$ ;"'key to continue..."
|
|
PRINT TAB(TABPOS%); "Either '"; KEYUC$; "' or '"; KEYLC$; "' must be pressed."
|
|
DO
|
|
KB$ = INKEY$
|
|
KB$ = UCASE$(KB$)
|
|
LOOP WHILE (KB$ <> KEY$)
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
|
|
WAITFORKEY$ = KB$ 'Set function return.
|
|
|
|
END FUNCTION
|
|
|
|
SUB WORKORDERHEADER (SN$)
|
|
'Sub to print the header for the work order status file.
|
|
'
|
|
'Column numbers (for reference) below:
|
|
' 1 2 2 3 3 4 4 5 6 7 8
|
|
'1 0 0 5 0 4 0 8 0 0 0 0
|
|
'
|
|
'Example header format (example not necessarily for this test program):
|
|
'
|
|
'
|
|
'===================================================================
|
|
'WO#: 103456
|
|
'
|
|
'Date: 06-03-2014
|
|
'
|
|
'Work order status file for work order #: 103456
|
|
|
|
'Program: RMSMN6-2.EXE
|
|
'Version: B.1 2014.05.14 PWR
|
|
'Lib. Ver.: B.1 2014.05.14 PWR
|
|
'
|
|
'-------------------------------------------------------------------
|
|
'Status Serial# DS File Name Model Date Time
|
|
'-------- --------- ------------ ------------- ---------- --------
|
|
'
|
|
KEY(10) OFF 'Deactivates F10 key
|
|
|
|
'CLS
|
|
PRINT TAB(10); "Writing header to work order status file."
|
|
|
|
WOSFNAME$ = GETWOSFNAME$(SN$) 'Get work order status file name
|
|
CALL SNPARSE(SN$, WO$, DS$) 'Get current work order and dash numbers from module serial number
|
|
OPEN "C:\REPORTS\" + WOSFNAME$ FOR APPEND AS #10
|
|
'OPEN "C:\REPORTS\" + WOSFNAME$ FOR OUTPUT AS #10
|
|
'PRINT #10, 'Blank line
|
|
PRINT #10, 'Blank line
|
|
PRINT #10, "==================================================================="
|
|
PRINT #10, "WO#: "; WO$
|
|
PRINT #10, 'Blank line
|
|
PRINT #10, "Date: "; DATE$
|
|
PRINT #10, 'Blank line
|
|
PRINT #10, "Work order status file for work order #: "; WO$
|
|
PRINT #10, 'Blank line
|
|
'Program name and version and library version.
|
|
PRINT #10, "Program: "; PROGNAMEVAL$
|
|
PRINT #10, "Version: "; PROGVERVAL$
|
|
PRINT #10, "Lib. Ver.: "; LIBVERVAL$
|
|
PRINT #10, 'Blank line
|
|
PRINT #10, "-------------------------------------------------------------------"
|
|
PRINT #10, "Status"; TAB(10); "Serial#"; TAB(20); "DS File Name"; TAB(34); "Model"; TAB(48); "Date"; TAB(60); "Time"
|
|
PRINT #10, "--------"; TAB(10); "---------"; TAB(20); "------------"; TAB(34); "-------------"; TAB(48); "----------"; TAB(60); "--------"
|
|
CLOSE #10
|
|
|
|
KEY(10) ON 'Reactivates F10 key
|
|
|
|
END SUB
|
|
|
|
SUB WORKORDERLINE (FAILSTATE%, SN$)
|
|
'Sub to write status lines for tested module in work order status file.
|
|
'
|
|
'Example line formats (below column numbers):
|
|
' 1 2 2 3 3 4 4 5 6 7 8
|
|
'1 0 0 5 0 4 0 8 0 0 0 0
|
|
'FAIL<<<< 103456-49 A3456-49.TXT SCM5B48-01 02-19-2014 17:23:04
|
|
'PASS 103456-50 A3456-50.TXT SCM5B48-01 02-19-2014 22:28:31
|
|
'
|
|
'KEY(10) OFF 'Deactivates F10 key
|
|
|
|
'PRINT TAB(10); "Writing status to work order status file."
|
|
|
|
CALL GETDSFNAME(SN$, DSSNAME$, DSFNAME$) 'Gets datasheet search and file names from serial number
|
|
|
|
IF FAILSTATE% = 1 THEN
|
|
STATE$ = "FAIL<<<<"
|
|
DSFNAME$ = "" 'Set datasheet file name blank for failing modules (since file is not generated)
|
|
ELSE
|
|
STATE$ = "PASS"
|
|
END IF
|
|
WOSFNAME$ = GETWOSFNAME$(SN$) 'Get work order status file name
|
|
|
|
PRINT TAB(10); "Writing work order status to file: "; WOSFNAME$
|
|
|
|
OPEN "C:\REPORTS\" + WOSFNAME$ FOR APPEND AS #10
|
|
'PRINT #10, STATE$; TAB(10); RTRIM$(SN$); TAB(25); RTRIM$(SPECS.MODNAME$); TAB(45); DATE$; TAB(65); TIME$
|
|
PRINT #10, STATE$; TAB(10); RTRIM$(SN$); TAB(20); RTRIM$(DSFNAME$); TAB(34); RTRIM$(SPECS.MODNAME$); TAB(48); DATE$; TAB(60); TIME$
|
|
|
|
CLOSE #10
|
|
|
|
'KEY(10) ON 'Reactivates F10 key
|
|
|
|
END SUB
|
|
|
|
SUB WORKORDERPRINT (SN$)
|
|
'Sub to print work order status file
|
|
|
|
KEY(10) OFF 'Deactivates F10 key
|
|
|
|
COLOR 15, 0, 0 'Clear screen to bright white on black background
|
|
CLS
|
|
LOCATE 5, 5: PRINT "PLEASE WAIT WHILE PRINTER PRINTS YOUR TEST RESULTS"
|
|
|
|
WOSFNAME$ = GETWOSFNAME$(SN$) 'Get work order status file name
|
|
CALL GETDSFNAME(SN$, DSSNAME$, DSFNAME$) 'Gets datasheet search and file names from serial number
|
|
|
|
'Append list of related datasheet files
|
|
OPEN "C:\REPORTS\" + WOSFNAME$ FOR APPEND AS #10
|
|
PRINT #10, "--------------------------------------------------------"
|
|
'PRINT #10, "List of datasheet files created:"
|
|
PRINT #10, "Below is a list of the datasheet files actually created."
|
|
PRINT #10, "This list must correspond one for one with the list in"
|
|
PRINT #10, "the 'DS File Name' column above. If it does not, there"
|
|
PRINT #10, "is a problem with one (or more) of the datasheet files!"
|
|
|
|
PRINT #10, "------------"
|
|
CLOSE #10
|
|
'Append list of text files to work order status file
|
|
SHELL "DIR C:\STAGE\" + DSSNAME$ + "*.TXT /B >> C:\REPORTS\" + WOSFNAME$
|
|
|
|
'Print file
|
|
SHELL "COPY C:\REPORTS\" + WOSFNAME$ + " LPT1 > NUL"'Print work order status file
|
|
LPRINT CHR$(12) 'Form feed
|
|
|
|
'PRINT
|
|
'PRINT TAB(10); "Has the: " + WOSFNAME$ + " file finished printing?"
|
|
'DUMKEY$ = WAITFORKEY("F", 10, 14, 0) 'Waits for "F" key press (display bright yellow on black)
|
|
|
|
COLOR 11, 0, 0 'Cyan on black background
|
|
CLS
|
|
|
|
KEY(10) ON 'Reactivates F10 key
|
|
|
|
END SUB
|
|
|