- Built exact-match TXT formatter from QuickBASIC source (SCM5B, 8B, DSCA, DSCT, SCM7B) - Spec parser for 10 binary DAT files (1470+ models) - Work order report importer (33K WOs, 63K test lines) - On-demand PDF generation, styled HTML view - Archived 500K pre-2026 For_Web files into year subfolders - Created domain service account (INTRANET\svc_testdatadb) - Generated 73/73 Quatronix customer datasheets - Added STAGE + Reports auto-import to sync script Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3507 lines
172 KiB
QBasic
3507 lines
172 KiB
QBasic
Attribute VB_Name = "Module1"
|
|
'Automated Test Software for SCM5Bxx-xx Voltage,
|
|
'Current, TC and RTD input models.
|
|
|
|
'AUTHOR: John Lehman
|
|
'DATE: 1/4/96
|
|
'USES LIBRARY = LIBATED.BAS
|
|
'USES SOURCE CODE = TEST5B1E.BAS, TEST5B2E.BAS
|
|
|
|
' REVISION RECORD
|
|
|
|
'DATE REV APPR DESCRIPTION
|
|
'---- --- ---- -----------
|
|
'1/4/96 n/a JL Initial Release.
|
|
' ...
|
|
' ... See "Revs.txt" file.
|
|
' ...
|
|
'2015/05/29 B.08 PWR Added CONTRES! = 0.1 line to OUTSWITCH$ function to hardcode a value
|
|
' for a Cu RTD input module (the allowed 0.3 Ohms measured during test
|
|
' head startup would be 13% of the span). Also subtracted CONTRES! from
|
|
' MAXIN! when calling OHMSET in OUTSWITCH$.
|
|
'2016/03/08 B.09 MR Updated PARACITICTCV for SCM5B47K-1820, -1781 and -1782
|
|
' to compensate for SCMX1508 custom CJC for 0 deg C
|
|
'2016/09/30 B.10 MF Added module SCM5B41-1811 to be tested on gang tester
|
|
'2018/02/20 B.11 MR Added conditions for SCM5B38-1851 similar to SCM5B38-1788
|
|
'2018/04/26 B.12 MR Added SCM5B38-1232 CAL Iteration = 3 in CALSEQ Subroutine
|
|
'2019/02/08 B.13 MR
|
|
'2020/10/07 B.14 JL Increased Contact Resistance max value from 0.3 ohms to 0.5 ohms.
|
|
|
|
Const PROGNAME$ = "TEST5B1E.EXE" 'Executable file name of the program.
|
|
Const VERSION$ = "B.14 2020.10.07 JL" 'Version (Revision Date) and initials of engr.
|
|
Const SOURCEFILES$ = "TEST5B1E.BAS TEST5B2E.BAS NLIBATED.BAS" 'Source file names
|
|
|
|
'******** Declare some useful constants *******
|
|
Const MAXSTATUSINDEX = 21 'Maximum index of the Status array
|
|
|
|
DECLARE SUB CALDAC (TE$)
|
|
DECLARE SUB CALSEQ (CAL%) 'Determine & perform calibration sequence
|
|
DECLARE SUB CALTEST (CAL%) 'Test sequence to calibrate modules
|
|
DECLARE SUB CASEINST () 'Tell user to install a case over the unit
|
|
DECLARE SUB CHANGEDN (SN$) 'Allows operator to change the dash number only when running finals
|
|
DECLARE SUB COMPTEST (STATUS$(), CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Complete set of tests
|
|
DECLARE SUB CONTINUE ()
|
|
DECLARE SUB ENABLE (ONOFF%) 'Module output switch control
|
|
DECLARE SUB FOOTER (STATUS$()) 'Sends footer to printer if all tests passed
|
|
DECLARE SUB FUNCTEST (CAL%) 'Routines for functional test
|
|
DECLARE SUB GENSET (GENAMPL!) 'Displays message to set signal generator
|
|
DECLARE SUB GETADD (FILENAME$) 'Gets parallel port/Mux/Testhead address
|
|
DECLARE SUB GETSN (SN$) 'Gets serial number
|
|
DECLARE SUB GETSPECS () 'Gets module type and specifications
|
|
DECLARE SUB HEADERA (SN$) 'Prints test sheet header
|
|
DECLARE SUB HEADERB (TESTTITLE$) 'Prints test screen header
|
|
DECLARE SUB INIT488 (DVMADDR%)
|
|
DECLARE SUB INITPS (ADDR%, OVERI!, OVERV!)
|
|
DECLARE SUB INDIVID (SEL%, CAL%) 'Performs the tests individually
|
|
DECLARE SUB LOADMUX (CH%, CHON%)
|
|
DECLARE SUB LOGIT (STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Logs test results to disk
|
|
DECLARE SUB MODULEOUTLINE ()
|
|
DECLARE SUB NOTES () 'Notes on ATE operation
|
|
DECLARE SUB OHMSET (OHM!)
|
|
DECLARE SUB ONESHOTTEST () 'Tests one-shot pulse width
|
|
DECLARE SUB PASSTHRUTEST (STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
|
|
DECLARE SUB PAUSE (TIME!)
|
|
DECLARE SUB POWERON (Voltage!) 'Sets module supply voltage
|
|
DECLARE SUB REPORT (STATUS$(), TSPEC$()) 'Prints test data on screen
|
|
DECLARE SUB RESETTH () 'Reset test head to known condition
|
|
DECLARE SUB REMEXCPIN (PINSTAT%)
|
|
DECLARE SUB RTDTHCAL () 'Check test head operation
|
|
'DECLARE SUB SETDAC (Voltage!, CH%, VSENATTEN!)
|
|
DECLARE SUB SETDAC (Voltage!, CH%, VRANGE!, VSENATTEN!)
|
|
DECLARE SUB SETDACFAST (Voltage!)
|
|
DECLARE SUB SETTEST (Test%)
|
|
DECLARE SUB SETTH (DOUT%, CB%)
|
|
DECLARE SUB SETTHFAST (DOUT%, CB%)
|
|
DECLARE SUB SETLOAD (LOAD!) 'Set excitation load
|
|
DECLARE SUB SORTDB (ENDFLAG%)
|
|
DECLARE SUB TSPECS (TSPEC$(), TOTLRESPEC!) 'Creates a string array of test specifications
|
|
DECLARE SUB WRITEDVM (CMD$, VALUE!)
|
|
DECLARE SUB WRITEPS (ADDR%, CMD$)
|
|
DECLARE SUB FAILSTATUS (TESTVALUE$, YLOC%, XLOC%, TEXTVALUE$, SPACES%)
|
|
DECLARE SUB LOGMODFILES (STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
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 DATASHEETWRITE (SN$, STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TX%)
|
|
DECLARE SUB DATASHEETPRINT (SN$, STATUS$())
|
|
DECLARE SUB HARDCOPY ()
|
|
DECLARE SUB SNPARSE (SN$, WO$, ds$)
|
|
|
|
DECLARE FUNCTION GETWOSFNAME$ (SN$) 'Returns work order status file name from serial number
|
|
|
|
DECLARE FUNCTION BESTFIT! (SLOPE!, OFFSETS!, TSIM!(), NUMPTS%, ERRO!())
|
|
'Library fn. Calculates bestfit line and max error
|
|
DECLARE FUNCTION CALMENU% () 'Option menu after offset/gain cal
|
|
DECLARE FUNCTION CJCGAIN$ () 'Measure module CJC gain
|
|
DECLARE FUNCTION EXCCAL$ (CAL%) 'Calibrate isolated excitation voltage
|
|
DECLARE FUNCTION EXCILIM$ () 'Test excitation current limit
|
|
DECLARE FUNCTION EXCREG$ () 'Tests excitation load regulation
|
|
DECLARE FUNCTION FAILS% (STATUS$()) 'Tests for failed tests
|
|
DECLARE FUNCTION FREQRESP$ (GENAMPL!) 'Performs Frequency response Test
|
|
DECLARE FUNCTION GAINCAL$ (CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!, DIRG%) 'Performs Gain Calibration
|
|
DECLARE FUNCTION GENATTENR! () 'Calculate fn gen attenuator
|
|
DECLARE FUNCTION GETTHID% () 'Get test head id #
|
|
DECLARE FUNCTION GETPSID% ()
|
|
DECLARE FUNCTION IEXC2$ (IEXCSENSE!) 'Measure excitation I source #2
|
|
DECLARE FUNCTION IEXC1$ (IEXCSENSE!) 'Measure excitation I source #1
|
|
DECLARE FUNCTION IMATCH$ (I1$, I2$) 'Check current source matching
|
|
DECLARE FUNCTION INPUTR$ () 'Performs Input Resistance Test
|
|
DECLARE FUNCTION KEYBDIN$ () 'Get keyboard input
|
|
DECLARE FUNCTION LEADREFF$ (TOTLRESPEC!) 'Measure lead resistance effects
|
|
DECLARE FUNCTION LINTEST$ (ACC$, CONTRES!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs Accuracy and Linearity Tests
|
|
DECLARE FUNCTION MEASRES! (OHM!, RESNUM%, TE$) 'Measure loop current sense resistor
|
|
DECLARE FUNCTION MENU1% () 'Gets the Test Group selection
|
|
DECLARE FUNCTION MENU2% () 'Gets the individual test #
|
|
DECLARE FUNCTION MENU3% () 'Gets the module family
|
|
DECLARE FUNCTION UTILMENU% () 'Utility menu for Individual Test menu.
|
|
DECLARE FUNCTION OFFSETCAL$ (CAL%, CONTRES!, DIRO%) 'Performs Offset Calibration
|
|
DECLARE FUNCTION OPENIN$ () 'Measure open input response
|
|
DECLARE FUNCTION OUTNOISE$ () 'Performs Output Noise Test
|
|
DECLARE FUNCTION OUTSWITCH$ () 'Test output switch operation
|
|
DECLARE FUNCTION PARASITICTCV! (VCJC!) 'Measure VCJC and calculate PTC
|
|
DECLARE FUNCTION POWERIO$ (ADDR%, CMD$) 'Library fn. Kepco DPS power supply I/O
|
|
DECLARE FUNCTION READDVM! (TOL!) 'Library fn. Reads Fluke meter to TOL!
|
|
DECLARE FUNCTION READDATA$ (ADDR%)
|
|
DECLARE FUNCTION READGPIB$ (ADDR%, CMD$)
|
|
DECLARE FUNCTION READPS$ (ADDR%, CMD$)
|
|
DECLARE FUNCTION REPEAT$ (N$) 'Library fn. Ask if you would like to repeat test
|
|
DECLARE FUNCTION REPEAT2$ (N$, SN$) 'Library fn. Same as REPEAT$ but with an additional menu for running finals
|
|
DECLARE FUNCTION RTDOHMS! (TEMP!, SENTYPE$) 'Library fn. Convert RTD in temp to ohms
|
|
DECLARE FUNCTION RTDTEMP! (OHMS!, SENTYPE$) 'Library fn. Convert RTD ohms to temp
|
|
DECLARE FUNCTION SENSORNUM% () 'Assign a number to each sensor type
|
|
DECLARE FUNCTION SENSORIN! (MEASVIN!, PTCV!) 'Calculates sensor input
|
|
DECLARE FUNCTION SENSOROUT! (PVIN!, PTCV!) 'Calculates module input
|
|
DECLARE FUNCTION SETAC! (ONOFF%, GENAMPL!) 'Sets AC in Off or On
|
|
DECLARE FUNCTION SETATTEN% (Voltage!) 'Library fn. Sets test head R/2R ladder
|
|
DECLARE FUNCTION SETPOWER$ (ADDR%, VSUPPLY!, FUNC$) 'Library fn. Set high voltage input power supply
|
|
DECLARE FUNCTION STEPRESP$ () 'Performs Step Response Test
|
|
DECLARE FUNCTION STRINGVAL% (A$) 'Library fn.
|
|
DECLARE FUNCTION SUPPLYI$ (EXCL%) 'Measure module supply current
|
|
DECLARE FUNCTION SUPPLYSEN$ () 'Performs Power Supply Sensitivity
|
|
DECLARE FUNCTION TCVOLTS! (TEMP!, TCTYPE$) 'Library fn. Convert TC in temp to V
|
|
DECLARE FUNCTION TCTEMP! (TCV!, TCTYPE$) 'Library fn. Convert TC in temp to V
|
|
DECLARE FUNCTION UPSN$ (SN$) 'Library fn. Increments dash# of serial#
|
|
DECLARE FUNCTION VOREG$ () 'Tests delta Vo with Exc. load
|
|
DECLARE FUNCTION VOUT! (SENOUT!) 'Calculates module output for a given input
|
|
DECLARE FUNCTION LIBVERVAL$ () 'Function to return the library source file version
|
|
DECLARE SUB WAITFORFINISH ()
|
|
DECLARE SUB FINISHSUB () 'Subroutine to run at "FINISH" label (after F10 keypress).
|
|
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 FUNCTION MENUCODE% () 'Function to return integer value of 0-35 for keypress of 0-9 or A-Z.
|
|
DECLARE SUB CHECKRESOURCES (SN$) '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 FUNCTION WAITFORKEY$ (KEY$, TABPOS%, FORECOL%, BACKCOL%)
|
|
|
|
'Variables to add to database
|
|
' PEDOS AS ? 'MAY NOT BE NEEDED, CALCULATE?
|
|
'
|
|
'Database Record definition for the specifications
|
|
Type DBASE
|
|
MODNAME As String * 15 'SCM5B47X-XXXXT
|
|
SENTYPE As String * 7 'mV, V, mA, xTC, xxRTDxW, FBRIDGE, 2WTX, HBRIDGE
|
|
ISMAXNEXCL As Single
|
|
ISMAXFEXCL As Single
|
|
OUTRES As Single
|
|
MININ As Single
|
|
MAXIN As Single
|
|
IEXC As Single
|
|
RCONV As Single
|
|
MINOUT As Single
|
|
MAXOUT As Single
|
|
OSCALPT As Single
|
|
GNCALPT As Single
|
|
CALTOL As Single
|
|
VEXC As Single
|
|
VEXCACC As Single
|
|
EXCLOAD As Single
|
|
EXCLOADREG As Single
|
|
EXCIMAX As Single
|
|
LINEAR As Single
|
|
ACCURACY As Single
|
|
TESTFREQ As Single
|
|
ATTEN As Single
|
|
ATTENTOL As Single
|
|
STEPRMIN As Single
|
|
STEPRMAX As Single
|
|
PSS As Single
|
|
OUTNOISE As Single
|
|
INPUTRES As Single
|
|
VOPENINMIN As Single
|
|
VOPENINMAX As Single
|
|
LEADRERR As Single
|
|
LINEARIZED As Integer '1 = linearized, 0 = non-linearized
|
|
OSCALIN As Single 'input for offset calibration
|
|
GNCALIN As Single 'input for gain calibration
|
|
BANDWIDTH As Single 'filter -3dB point
|
|
IMATCHTOL As Single 'current source matching tolerance
|
|
End Type
|
|
|
|
Type DBASE2
|
|
RECNUM As Integer
|
|
MODNAME As String * 15
|
|
End Type
|
|
|
|
'$INCLUDE: 'QB.BI2'
|
|
|
|
'define common variables
|
|
COMMON SHARED /SAMPLE/ SPECS AS DBASE, SORTDATA1 AS DBASE2, SORTDATA2 AS DBASE2
|
|
COMMON SHARED /SAMPLE/ PON%, TX%, SN$, LOGDAT%, TE$, PCBNO$
|
|
COMMON SHARED CB0VAL%, CB1VAL%, CB2VAL%, CB3VAL%
|
|
COMMON SHARED MAINMAX!, MAINMIN!, VERNMAX!, VERNMIN!
|
|
COMMON SHARED BADDRS%, LPTADDR%, MUXADDR%, THADDR%, PSADDR%, VINADDR%
|
|
COMMON SHARED PSPORT%, DVMADDR%, GENADDR%
|
|
COMMON SHARED DPSPSADDR%, DPSVINADDR%, ABCPSADDR%, ABCVINADDR%
|
|
COMMON SHARED PSMODEL$, VINMODEL$
|
|
COMMON SHARED /PRTSCR/ inreg AS RegType, outreg AS RegType
|
|
COMMON SHARED TTYPE%, MAXINVAR!
|
|
COMMON SHARED FORCEACCLINFAIL%, FORCEVCJCFAIL%, TESTPAUSE%
|
|
|
|
'assign constants to Fluke meter commands
|
|
|
|
|
|
Const OHM4$ = "F4", OHM2$ = "F3", VODC$ = "F1", VOAC$ = "F2", MADC$ = "F5"
|
|
'assign constants to test head variables
|
|
Const CB0% = 0, CB1% = 1, CB2% = 2, CB3% = 3 'control bank addresses
|
|
Const CON% = 1, COFF% = 0 'channel 'on' defined as '1'
|
|
'off' defined as '0'
|
|
'CONST DVMADDR% = 1 'GPIB address of Fluke 8842A meter
|
|
CONST LOOPOFF$ = "SOP=OFF", LOOPON$ = "SOP=ON", LOCAL$ = "LOC"
|
|
'OVERV!, PSILIMIT!, VINOVERV!, VINILIMIT!
|
|
Const OVERV! = 35 'Power supply over voltage limit
|
|
Const PSILIMIT! = 500 'Power supply over current limit
|
|
Const VINOVERV! = 125 'High voltage input voltage limit
|
|
Const VINILIMIT! = 32 'High voltage input current limit
|
|
|
|
'assign specifications which are constant for all modules
|
|
Const IEXCSEN! = 714 'Iexc sense resistor, 2.5Kohm
|
|
Const RSERIES! = 5100000! '5.1M ohm, test head series input R
|
|
Const RFNGN! = 6800 'Function generator attenuator series R, 6.8Kohm
|
|
|
|
'DIM STATUS(21) AS STRING, TSPEC(21) AS STRING
|
|
Dim STATUS(MAXSTATUSINDEX) As String, TSPEC(MAXSTATUSINDEX) As String
|
|
|
|
Dim TSIM!(5), OUTCALC!(5), OUTMEAS!(5), ERROROUT!(5), ACCSTAT$(5)
|
|
|
|
' Variable initialization
|
|
TX% = 0
|
|
PON% = 0 '1 = Print test results to printer
|
|
FORCEACCLINFAIL% = 0 'Flag set "1" to force acc/lin input measurements to fail.
|
|
FORCEVCJCFAIL% = 0 'Flag set "1" to force Vcjc errors for debug.
|
|
TESTPAUSE% = 0 '1 = Pause after the status display of each test
|
|
BADDRS% = &H250 'Base address of PC4311 '488 controller
|
|
CB0VAL% = &HFF 'Set all lines off
|
|
CB1VAL% = &HFF
|
|
CB2VAL% = &HFF
|
|
CB3VAL% = &HFF
|
|
|
|
'TE1005 (pcb1044 Rev A) configuration:
|
|
'(all control lines are active low)
|
|
'Use Relay/Mux TE1004 (see below)
|
|
'
|
|
'Control Bank Line Assignment
|
|
'------------ ------ ----------
|
|
' 0 7 MSB 0 = Connect Vo to S/H, Start timer
|
|
' 6 0 = Connect 2Kohm || 220pF load
|
|
' 5 1 = CJC 25C simulation, 0 = CJC 50C simulation
|
|
' 4 0 = Tie module inputs to analog ground
|
|
' 3 0 = Short module inputs
|
|
' 2 0 = Short out 5.1Mohm series input R
|
|
' 1 1 = DAC input to module, 0 = Freq. Gen. input
|
|
' 0 LSB 0 = Enable output switch
|
|
'
|
|
' 1 7 MSB 0 = R/2R ladder
|
|
' 6 0 = R/2R ladder LSB
|
|
' 5 0 = 1Kohm excitation load (0 = Loaded Vs for PSS on Rev A PCB)
|
|
' 4 0 = 330ohm excitation load
|
|
' 3 0 = 120ohm excitation load
|
|
' 2 0 = D.U.T CJC Sensor, 1 = Reference CJC Sensor (LED #2 on Rev A PCB)
|
|
' OR 0 = Enable shunt 0.5uF input cap, 1 = Disable
|
|
' 1 Vsupply control MSB (0 = 1Kohm excitation load on Rev A PCB)
|
|
' 0 LSB Vsupply control LSB (LED #1 on Rev A PCB)
|
|
'
|
|
' 2 7 MSB 0 = R/2R ladder MSB
|
|
' 6 0 = R/2R ladder
|
|
' 5 0 = R/2R ladder
|
|
' 4 0 = R/2R ladder
|
|
' 3 0 = R/2R ladder
|
|
' 2 0 = R/2R ladder
|
|
' 1 0 = R/2R ladder
|
|
' 0 LSB 0 = R/2R ladder
|
|
'
|
|
' (Control bank 3 not present on Rev A PCB)
|
|
' 3 7 MSB 0 = High voltage to +/-IN, inverted polarity
|
|
' 6 0 = High voltage to +/-IN, normal polarity
|
|
' 5 D.U.T. input; 0 = current source, 1 = R/2R ladder
|
|
' 4 Input current sourced from; 0 = +EXC, 1 = +15V
|
|
' 3 0 = LED4 ON and CH6+ --> -IN, 1 = CH6+ --> +EXC
|
|
' 2 0 = LED3
|
|
' 1 0 = LED2
|
|
' 0 LSB 0 = LED1
|
|
|
|
'TE1004 Relay/Mux channel assignments
|
|
|
|
'Mux Channel Assignment
|
|
'----------- ----------
|
|
' 1 Vin (R/2R ladder output)
|
|
' 2 Vout
|
|
' 3 Supply current sense resistor
|
|
' 4 Simulated CJC sensor output
|
|
' 5 Sample/Hold output
|
|
' 6 Isolated excitation
|
|
' 7 Supply voltage
|
|
' 8 DAC output
|
|
|
|
|
|
'TE1012 (pcb1128 Rev A + pcb1129 Rev A daughter card)
|
|
'(all control lines are active low)
|
|
'Use Relay/Mux TE1013 (see below)
|
|
'
|
|
'Control Bank Line Assignment
|
|
'------------ ------ ----------
|
|
' 0 7 MSB 0 = Connect 2Kohm || 220pF load
|
|
' 6 0 = Connect Vo to S/H, Start timer
|
|
' 5 0 = Enable output switch
|
|
' 4 Vsupply control MSB
|
|
' 3 Vsupply control LSB
|
|
' 2 Test Select MSB (See legend below)
|
|
' 1 Test Select
|
|
' 0 LSB Test Select LSB
|
|
'
|
|
' 1 7 MSB 0 = R DAC MSB, line 20 of 20
|
|
' 6 0 = R DAC, line 19
|
|
' 5 0 = R DAC, line 18
|
|
' 4 0 = R DAC, line 17
|
|
' 3 0 = LED4 on & CH1- to AC input, 1 = LED4 off & CH1- to -IN
|
|
' 2 0 = LED3 on & enable 10 ohm input R during RDAC measurement
|
|
' 1 0 = LED2 on & apply 10uF across +5V and GND to check for CD4047 oscillator
|
|
' 0 LSB 0 = LED1 on & K11 enable
|
|
'
|
|
' 2 7 MSB 0 = R DAC, line 16
|
|
' 6 0 = R DAC, line 15
|
|
' 5 0 = R DAC, line 14
|
|
' 4 0 = R DAC, line 13
|
|
' 3 0 = R DAC, line 12
|
|
' 2 0 = R DAC, line 11
|
|
' 1 0 = R DAC, line 10
|
|
' 0 LSB 0 = R DAC, line 9
|
|
'
|
|
' 3 7 MSB 0 = R DAC, line 8
|
|
' 6 0 = R DAC, line 7
|
|
' 5 0 = R DAC, line 6
|
|
' 4 0 = R DAC, line 5
|
|
' 3 0 = R DAC, line 4
|
|
' 2 0 = R DAC, line 3
|
|
' 1 0 = R DAC, line 2
|
|
' 0 LSB 0 = R DAC LSB, line 1
|
|
|
|
|
|
'TE1012 Test Select Menu
|
|
'Test Description
|
|
'---- -----------
|
|
' 0 Measure current source #1 (+IN lead)
|
|
' 1 Measure current source #2 (-IN lead)
|
|
' 2 Standard operation, any R input
|
|
' 3 Measure test head contact resistance in input circuit
|
|
' 4 Lead resistance effects, 3.3 ohm in each lead
|
|
' 5 Lead resistance effects, 0 ohm in each lead
|
|
' 6 Frequency generator input
|
|
' 7 Disconnect input R and measure
|
|
|
|
'TE1013 Relay/Mux channel assignments
|
|
|
|
'Mux Channel Assignment
|
|
'----------- ----------
|
|
' 1 DUT +/-IN terminals or Function Generator input
|
|
' 2 Vout
|
|
' 3 Supply current sense resistor
|
|
' 4 Iexc sense resistor
|
|
' 5 Sample/Hold output
|
|
' 6 Contact resistance sense lines, 4-wire ohms
|
|
' 7 Supply voltage
|
|
' 8 DUT Rin sense lines, 4-wire ohms
|
|
|
|
'****************** MAIN PROGRAM************************************
|
|
KEY(10) ON 'Activates F10 key
|
|
On Key(10) GoSub FINISH 'Traps for F10 key Exits if pressed
|
|
|
|
'MAXINVAR! = 10.0 'From SETDAC max. DAC voltage (later set in GETSPECS).
|
|
MAXINVAR! = 0! 'Set to zero to revert to using VOLTAGE! for DAC accuracy (PWR 2014-11-04).
|
|
TESTPAUSE% = 0 '1 = Pause after the status display of each test
|
|
|
|
Color 11, 0 'Cyan with a black background
|
|
Cls
|
|
TX% = 0
|
|
PON% = 0 '1 = Print test results to printer
|
|
LOCATE 5, 23: Print "SCM5Bxx-xx AUTOMATED TEST EQUIPMENT"
|
|
Print Tab(23); "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
|
|
'LOCATE 10, 20
|
|
'PRINT "Initializing test system. Please wait."
|
|
Cls
|
|
LOCATE 5, 20: Print "Initializing test system. Please wait."
|
|
LOCATE 7, 10: Print "EXECUTABLE: "; PROGNAMEVAL$ 'Executable file name
|
|
LOCATE 8, 10: Print "VERSION: "; PROGVERVAL$ 'Main source code version
|
|
LOCATE 9, 10: Print "LIB.VERSION: "; LIBVERVAL$ 'Library code version
|
|
LOCATE 10, 10: Print "SOURCE FILES: "; SOURCEFILES$ 'List of all code files for the program
|
|
Call CONTINUE
|
|
Cls
|
|
|
|
FILENAME$ = "ABC5BVIN.ADR" 'Parallel port, mux & test head addresses
|
|
Call GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
|
|
Call INIT488(DVMADDR%) 'Initialize the GPIB interface
|
|
|
|
PSID% = GETPSID% 'Determine and initiate communication with Power supply
|
|
Call CONTINUE
|
|
|
|
LOCATE 10, 10
|
|
Print Tab(20); "Initializing DVM..."
|
|
Call WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
|
|
|
|
Print Tab(20); "Initializing relay mux..."
|
|
Call LOADMUX(0, CON%) 'Resets MUX
|
|
|
|
TE$ = "TE1005" 'Assign test head #, defines channel
|
|
|
|
THID% = GETTHID% 'Get test head ID #
|
|
' PRINT "THID% = "; THID%
|
|
If THID% = 0 Then
|
|
Print Tab(20); "Initializing test head "; TE$; "..."
|
|
CBVAL% = &HFF
|
|
For BANK% = 0 To 3 'open all relays
|
|
Call SETTH(CBVAL%, BANK%)
|
|
Call PAUSE(0.05)
|
|
Next
|
|
Print Tab(20); "Initializing DAC..."
|
|
Call CALDAC(TE$) 'Calibrate DAC
|
|
If TE$ = "ERROR" Then
|
|
'BEEP
|
|
Print
|
|
Print Tab(20); "SYSTEM STARTUP ERROR"
|
|
Print Tab(20); "DAC is not connected or is faulty."
|
|
Print Tab(20); "Check system setup and restart program."
|
|
Stop
|
|
End If
|
|
Call SETDAC(0!, 1, MAXINVAR!, 0) 'Clear attenuator, short inputs
|
|
Print Tab(20); "Initializing power supply..."
|
|
Call POWERON(0!)
|
|
Else
|
|
F% = F% + 1
|
|
End If
|
|
|
|
TE$ = "TE1012" 'Assign test head #, defines channel
|
|
'PRINT "TE$ = TE1012" 'used for DAC input.
|
|
'CALL CONTINUE
|
|
FILENAME$ = "ABC5BRIN.ADR" 'Parallel port, mux & test head addresses
|
|
Call GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
|
|
Call LOADMUX(0, CON%) 'Resets MUX in the event that is wasn't reset above.
|
|
|
|
If THID% = 1 Then
|
|
Print Tab(20); "Initializing test head "; TE$; "..."
|
|
Open "C:\ATE\5BDATA\TE1012DT.DAT" For Input As #5
|
|
Input #5, DT$
|
|
Close #5
|
|
If DT$ <> Date$ Then
|
|
Call RTDTHCAL
|
|
Open "C:\ATE\5BDATA\TE1012DT.DAT" For Output As #5
|
|
Write #5, Date$
|
|
Close #5
|
|
End If
|
|
|
|
NOMRIN! = 100!
|
|
Call OHMSET(NOMRIN!) 'Nominal resistance input
|
|
RSIM! = MEASRES!(NOMRIN!, 3, "")
|
|
Call SETTEST(2) 'Initialize RTD test head for standard operation
|
|
|
|
Print Tab(20); "Initializing power supply..."
|
|
Call POWERON(0!)
|
|
Else
|
|
F% = F% + 1
|
|
End If
|
|
|
|
If F% = 2 Then
|
|
LOCATE 10, 10
|
|
Print "Test heads not connected or faulty connections."
|
|
Stop 'No test heads connected
|
|
End If
|
|
|
|
START:
|
|
KEY(9) ON 'Activates F9 key
|
|
On Key(9) GoSub START 'Traps for F9 key and returns to the main menu if pressed
|
|
|
|
If SENSORNUM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
SL$ = SETPOWER(VINADDR%, 999!, LOOPOFF$) 'Turn off loop power
|
|
SL$ = SETPOWER(VINADDR%, 999!, LOCAL$) 'Return to local mode
|
|
End If
|
|
|
|
LOGDAT% = -1 'Log linearity test data OFF
|
|
|
|
Do 'Main program loop
|
|
SN$ = "" 'Reset serial number
|
|
SEL% = MENU1% 'Gets the # of the sub program
|
|
Select Case SEL% 'Branches to the specific Tests
|
|
|
|
'*********************** Offset/Gain and Excitation Calibration ******************************
|
|
Case 1
|
|
TX% = 0 'No datasheet file
|
|
'PON% = 0 'Do not send results to printer
|
|
CAL% = 0 'Calibrate o.s. & gain.
|
|
Call GETSPECS 'Gets module test specs
|
|
If Left$(SPECS.MODNAME, 7) = "SCM5BPT" Or Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
Cls
|
|
LOCATE 10, 6: Print SPECS.MODNAME
|
|
Print Tab(6); "Return to the main menu and use menu selection 6 to test this product."
|
|
Call CONTINUE
|
|
ElseIf Left$(SPECS.MODNAME, 4) <> "EXIT" Then
|
|
Call CALTEST(CAL%)
|
|
If PON% = 1 Then LPRINT Chr$(12) 'Send form feed to printer if print flag is "on"
|
|
End If
|
|
|
|
'*********************** Pre-Encap Complete Test ******************************
|
|
Case 2
|
|
TX% = 0 'No datasheet file
|
|
'PON% = 0 'Do not send results to printer
|
|
CAL% = 0 'Calibrate o.s. & gain.
|
|
Call GETSPECS 'Gets module test specs
|
|
If Left$(SPECS.MODNAME, 7) = "SCM5BPT" Or Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
Cls
|
|
LOCATE 10, 6: Print SPECS.MODNAME
|
|
Print Tab(6); "Return to the main menu and use menu selection 6 to test this product."
|
|
Call CONTINUE
|
|
ElseIf Left$(SPECS.MODNAME, 4) <> "EXIT" Then
|
|
Call GENSET(GENAMPL!) 'Displays message to set signal gen.
|
|
Do 'Complete test loop start
|
|
Call COMPTEST(STATUS$(), CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
|
|
Call TSPECS(TSPEC$(), TOTLRESPEC!) 'Sets up a string with the test specifications
|
|
WIDTH , 43 'Change screen lines to 43
|
|
Call REPORT(STATUS$(), TSPEC$()) 'Prints data to screen
|
|
If PON% = 1 Then LPRINT Chr$(12) 'Send form feed to printer if print flag is "on"
|
|
'CALL INTERLUDE
|
|
Call WAITFORFINISH
|
|
WIDTH , 25 'Change screen lines (back) to 25
|
|
Loop While REPEAT$(SPECS.MODNAME) <> "N" 'End of Complete Test loop
|
|
Cls
|
|
If SENSORNUM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
Print
|
|
Print Tab(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
Call CONTINUE
|
|
End If
|
|
If Mid$(SPECS.MODNAME, 10, 4) = "1442" Or Mid$(SPECS.MODNAME, 10, 4) = "1443" Then 'units with +EXC and -IN shorted
|
|
Call REMEXCPIN(0) 'Reconnect +EXC from the test interface board
|
|
End If
|
|
End If
|
|
|
|
'**************** Post-Encap Complete Test ***********************************
|
|
Case 3
|
|
TX% = 1 'Print datasheet file
|
|
Call HARDCOPY 'Ask for hardcopy printout
|
|
CAL% = 0 'calibrate o.s & gain
|
|
Call GETSPECS 'Gets module test specs
|
|
If Left$(SPECS.MODNAME, 7) = "SCM5BPT" Or Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
Cls
|
|
LOCATE 10, 6: Print SPECS.MODNAME
|
|
Print Tab(6); "Return to the main menu and use menu selection 6 to test this product."
|
|
Call CONTINUE
|
|
ElseIf Left$(SPECS.MODNAME, 4) <> "EXIT" Then
|
|
Call GENSET(GENAMPL!) 'Displays message to set signal generator
|
|
Call GETSN(SN$) 'Gets module serial #
|
|
Call CHECKRESOURCES(SN$) 'Check for ability to write datasheet and status files.
|
|
Call WORKORDERHEADER(SN$) 'Write header to work order status file
|
|
Do 'Start of Test loop
|
|
Call HEADERA(SN$) 'Prints data sheet header on printer
|
|
Call COMPTEST(STATUS$(), CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
|
|
Call TSPECS(TSPEC$(), TOTLRESPEC!) 'Creates a string of test parameters
|
|
WIDTH , 43 'Change screen lines to 43
|
|
Call REPORT(STATUS$(), TSPEC$()) 'Displays test results
|
|
Call FOOTER(STATUS$()) 'Prints footer if no fails
|
|
'Log test results to data log, datasheet and work order status files
|
|
Call LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
'CALL INTERLUDE
|
|
WIDTH , 25 'Change screen lines (back) to 25
|
|
Loop While REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
|
|
Cls
|
|
Print Tab(10); "Printing work order status file: "; WO$ + ".TXT"
|
|
Call WORKORDERPRINT(SN$) 'Print the work order status file after "N" (not testing more of same module type)
|
|
Cls
|
|
If SENSORNUM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
Print
|
|
Print Tab(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
Call CONTINUE
|
|
End If
|
|
If Mid$(SPECS.MODNAME, 10, 4) = "1442" Or Mid$(SPECS.MODNAME, 10, 4) = "1443" Then 'units with +EXC and -IN shorted
|
|
Call REMEXCPIN(0) 'Reconnect +EXC from the test interface board
|
|
End If
|
|
End If
|
|
|
|
'**************** Sealed Module Re-Test ***********************************
|
|
Case 4
|
|
TX% = 1 'Print datasheet file
|
|
Call HARDCOPY 'Ask for hardcopy printout (PWR)
|
|
CAL% = 4 'Check o.s & gain
|
|
Call GETSPECS 'Gets module test specs
|
|
If Left$(SPECS.MODNAME, 7) = "SCM5BPT" Or Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
Cls
|
|
LOCATE 10, 6: Print SPECS.MODNAME
|
|
Print Tab(6); "Return to the main menu and use menu selection 6 to test this product."
|
|
Call CONTINUE
|
|
ElseIf Left$(SPECS.MODNAME, 4) <> "EXIT" Then
|
|
Call GENSET(GENAMPL!) 'Displays message to set signal generator
|
|
Call GETSN(SN$) 'Gets module serial #
|
|
Call CHECKRESOURCES(SN$) 'Check for ability to write datasheet and status files.
|
|
Call WORKORDERHEADER(SN$) 'Write header to work order status file
|
|
Do 'Start of Test loop
|
|
Call HEADERA(SN$) 'Prints data sheet header on printer
|
|
Call COMPTEST(STATUS$(), CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Performs complete set of tests
|
|
Call TSPECS(TSPEC$(), TOTLRESPEC!) 'Creates a string of test parameters
|
|
WIDTH , 43 'Change screen lines to 43
|
|
Call REPORT(STATUS$(), TSPEC$()) 'Displays test results
|
|
Call FOOTER(STATUS$()) 'Prints footer if no fails
|
|
'Log test results to data log, datasheet and work order status files
|
|
Call LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
'CALL INTERLUDE
|
|
WIDTH , 25 'Change screen lines (back) to 25
|
|
Loop While REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
|
|
Cls
|
|
Print Tab(10); "Printing work order status file: "; WO$ + ".TXT"
|
|
Call WORKORDERPRINT(SN$) 'Print the work order status file after "N" (not testing more of same module type)
|
|
Cls
|
|
If SENSORNUM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
Print
|
|
Print Tab(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
Call CONTINUE
|
|
End If
|
|
If Mid$(SPECS.MODNAME, 10, 4) = "1442" Or Mid$(SPECS.MODNAME, 10, 4) = "1443" Then 'units with +EXC and -IN shorted
|
|
Call REMEXCPIN(0) 'Reconnect +EXC from the test interface board
|
|
End If
|
|
End If
|
|
|
|
'***********************Individual Test Routines******************************
|
|
Case 5
|
|
TX% = 0 'No datasheet file
|
|
'PON% = 0 'Do not send results to printer
|
|
CAL% = 0 'calibrate o.s & gain
|
|
Do 'Start of loop
|
|
SEL% = MENU2% 'Gets # of test
|
|
If SEL% <> 21 Then 'Checks for exit (character L)
|
|
If SEL% = 18 Then 'Character I
|
|
Call NOTES 'Print ATE notes
|
|
ElseIf SEL% = 19 Then 'Character J
|
|
LPRINT Chr$(12) 'Form feed
|
|
ElseIf SEL% = 22 Then 'Character M
|
|
Call ONESHOTTEST
|
|
If PON% = 1 Then LPRINT Chr$(12) 'Send form feed to printer if print flag is "on"
|
|
ElseIf SEL% = 23 Then 'Character N
|
|
'Toggles "FORCEACCLINFAIL" debug flag
|
|
If FORCEACCLINFAIL% = 1 Then
|
|
Cls
|
|
FORCEACCLINFAIL% = 0
|
|
Else
|
|
'Turn on "force acc/lin input error" flag
|
|
'only if correct password is entered.
|
|
Cls
|
|
PWFOP$ = "" 'Clear password
|
|
LOCATE 10, 10: INPUT "Enter password "; PWFOP$
|
|
PWFOP$ = UCase$(PWFOP$)
|
|
If (PWFOP$ = "DATA4TH") Then
|
|
FORCEACCLINFAIL% = 1
|
|
Else
|
|
FORCEACCLINFAIL% = 0
|
|
End If
|
|
End If
|
|
LOCATE 20, 10: Print "Force acc/lin input fails (debug only) flag = "; FORCEACCLINFAIL%
|
|
Call CONTINUE
|
|
ElseIf SEL% = 24 Then 'Character O
|
|
'Toggles "FORCEVCJCFAIL" debug flag
|
|
If FORCEVCJCFAIL% = 1 Then
|
|
Cls
|
|
FORCEVCJCFAIL% = 0
|
|
Else
|
|
'Turn on "force acc/lin input error" flag
|
|
'only if correct password is entered.
|
|
Cls
|
|
PWFOP$ = "" 'Clear password
|
|
LOCATE 10, 10: INPUT "Enter password "; PWFOP$
|
|
PWFOP$ = UCase$(PWFOP$)
|
|
If (PWFOP$ = "DATA4TH") Then
|
|
FORCEVCJCFAIL% = 1
|
|
Else
|
|
FORCEVCJCFAIL% = 0
|
|
End If
|
|
End If
|
|
LOCATE 20, 10: Print "Force Vcjc fails (debug only) flag = "; FORCEVCJCFAIL%
|
|
Call CONTINUE
|
|
ElseIf SEL% = 20 Then 'Character K
|
|
'Utility Menu.
|
|
Do 'Start of Utility menu loop
|
|
SEL4% = UTILMENU% 'Gets # from Utility menu
|
|
If SEL4% <> 4 Then 'Checks for exit.
|
|
If SEL4% = 1 Then 'Checks for printer toggle.
|
|
'Toggles printer status
|
|
If PON% = 1 Then
|
|
PON% = 0
|
|
Else
|
|
PON% = 1
|
|
End If
|
|
ElseIf SEL4% = 2 Then
|
|
LOGDAT% = -LOGDAT%
|
|
ElseIf SEL4% = 3 Then 'Checks for pause on each test toggle.
|
|
'Toggles "pause on each test" flag
|
|
If TESTPAUSE% = 1 Then
|
|
TESTPAUSE% = 0
|
|
Else
|
|
TESTPAUSE% = 1
|
|
End If
|
|
End If
|
|
End If
|
|
Loop Until SEL4% = 4 'End of loop
|
|
Else
|
|
Call GETSPECS 'Gets module specs
|
|
If Left$(SPECS.MODNAME, 7) = "SCM5BPT" Or Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
Cls
|
|
LOCATE 10, 6: Print SPECS.MODNAME
|
|
Print Tab(6); "Return to the main menu and use menu selection 6 to test this product."
|
|
Call CONTINUE
|
|
ElseIf Left$(SPECS.MODNAME, 4) <> "EXIT" Then
|
|
Call INDIVID(SEL%, CAL%) 'Performs individual test
|
|
If PON% = 1 Then LPRINT Chr$(12) 'Send form feed to printer if print flag is "on"
|
|
End If
|
|
End If
|
|
End If
|
|
Loop Until SEL% = 21 'End of loop (character L)
|
|
|
|
'*************************** Pass-Thru Module Test *********************************
|
|
Case 6
|
|
TX% = 0 'No datasheet file
|
|
'PON% = 0 'Do not send results to printer
|
|
CAL% = 4 'Check o.s & gain (not actually used here)
|
|
Call GETSPECS 'Gets module test specs
|
|
If Left$(SPECS.MODNAME, 7) <> "SCM5BPT" And Left$(SPECS.MODNAME, 10) <> "SCM5B-1369" Then
|
|
Cls
|
|
LOCATE 10, 2: Print SPECS.MODNAME
|
|
Print Tab(2); "Return to the main menu and use another menu selection to test this product."
|
|
Call CONTINUE
|
|
ElseIf Left$(SPECS.MODNAME, 4) <> "EXIT" Then
|
|
Cls
|
|
TESTTITLE$ = "Test Selection"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 5
|
|
Print Tab(27); "1.) Pre-Encapsulation Test"
|
|
Print Tab(27); "2.) Post Encapsulation Test"
|
|
Do
|
|
I$ = INKEY$
|
|
Loop While Val(I$) < 1 Or Val(I$) > 2
|
|
MENU4% = Val(I$)
|
|
If MENU4% = 2 Then 'Post-encapsulation test
|
|
TX% = 1 'Print datasheet file
|
|
Call HARDCOPY 'Ask for hardcopy printout (PWR)
|
|
Call GETSN(SN$) 'Gets module serial #
|
|
Call CHECKRESOURCES(SN$) 'Check for ability to write datasheet and status files.
|
|
Call WORKORDERHEADER(SN$) 'Write header to work order status file
|
|
Else
|
|
TX% = 0 'No datasheet file
|
|
End If
|
|
Do 'Start of Test loop
|
|
If MENU4% = 2 Then
|
|
Call HEADERA(SN$) 'Prints data sheet header on printer
|
|
End If
|
|
Call PASSTHRUTEST(STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs complete set of tests
|
|
Call TSPECS(TSPEC$(), TOTLRESPEC!) 'Creates a string of test parameters
|
|
WIDTH , 43 'Change screen lines to 43
|
|
Call REPORT(STATUS$(), TSPEC$()) 'Displays test results
|
|
If MENU4% = 2 Then 'Post-encapsulation test
|
|
Call FOOTER(STATUS$()) 'Prints footer if no fails
|
|
'Log test results to data log, datasheet and work order status files
|
|
Call LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
'CALL INTERLUDE
|
|
WIDTH , 25 'Change screen lines (back) to 25
|
|
LP$ = REPEAT2$(SPECS.MODNAME, SN$)
|
|
Else
|
|
If PON% = 1 Then LPRINT Chr$(12) 'Send form feed to printer if print flag is "on"
|
|
Call CONTINUE 'Waits for key press
|
|
WIDTH , 25 'Change screen lines (back) to 25
|
|
LP$ = REPEAT$(SPECS.MODNAME)
|
|
End If
|
|
Loop While LP$ <> "N" 'End of test loop
|
|
If MENU4% = 2 Then 'Post-encapsulation test
|
|
Cls
|
|
Print Tab(10); "Printing work order status file: "; WO$ + ".TXT"
|
|
Call WORKORDERPRINT(SN$) 'Print the work order status file after "N" (not testing more of same module type)
|
|
Cls
|
|
End If
|
|
End If
|
|
|
|
'*************************** End Program Selection *********************************
|
|
Case 7
|
|
ENDPROG% = 1 'Sets end program flag
|
|
End Select
|
|
Loop While ENDPROG% <> 1 'Loops until end program flag set
|
|
|
|
FINISH:
|
|
'Exit program from F10 keypress
|
|
Call FINISHSUB
|
|
End 'End of program
|
|
|
|
Function CALMENU%()
|
|
|
|
TESTTITLE$ = "Post Calibration Test Options"
|
|
|
|
Cls
|
|
Color 14, 0, 0
|
|
LOCATE 2, 23:
|
|
TESTTITLE$ = "Post Calibration Test Options"
|
|
Call HEADERB(TESTTITLE$)
|
|
Color 15, 0, 0
|
|
LOCATE 6
|
|
Print Tab(14); "Please select the desired option for the next test:"
|
|
LOCATE 8
|
|
Color 11, 0, 0
|
|
Print Tab(22); "1.) Repeat OFFSET/GAIN calibration"
|
|
Print Tab(22); "2.) Perform LINEARITY/ACCURACY test"
|
|
Print Tab(22); "3.) EXIT to individual test menu"
|
|
Print
|
|
Print
|
|
|
|
Do
|
|
I$ = INKEY$
|
|
Loop While Val(I$) < 1 Or Val(I$) > 3
|
|
|
|
SEL2% = Val(I$)
|
|
|
|
CALMENU% = SEL2%
|
|
|
|
End Function
|
|
|
|
Sub CALSEQ(CAL%)
|
|
'Determine which calibration sequence is required for the module
|
|
'and perform the offset and gain calibration.
|
|
|
|
MININ! = SENSOROUT!(SPECS.MININ, 0) 'Determine min in
|
|
MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Determine max in
|
|
MINOUT! = SPECS.MINOUT
|
|
MAXOUT! = SPECS.MAXOUT
|
|
ACC! = SPECS.ACCURACY
|
|
|
|
INRANGE! = MAXIN! - MININ!
|
|
ORANGE! = MAXOUT! - MINOUT!
|
|
|
|
SNM% = SENSORNUM%
|
|
MN$ = SPECS.MODNAME
|
|
|
|
If Left$(MN$, 12) = "SCM5B41-1117" Then
|
|
DIRO% = 1 'O.S. pot clockwise = neg chg
|
|
DIRG% = 1 'Gain pot clockwise = pos chg
|
|
ElseIf Left$(MN$, 12) = "SCM5B41-1174" Then
|
|
DIRO% = 1 'O.S. pot clockwise = pos chg
|
|
DIRG% = 0 'Gain pot clockwise = neg chg
|
|
Else
|
|
INTERACT! = 1
|
|
DIRO% = 1 'O.S. pot clockwise = pos chg
|
|
DIRG% = 1 'Gain pot clockwise = pos chg
|
|
If Left$(MN$, 10) = "SCM5B36-01" Or Left$(MN$, 12) = "SCM5B38-1146" Or Left$(MN$, 12) = "SCM5B38-1232" Then
|
|
'0 to 100 ohm input. Offset is
|
|
'calibrated @ 8 ohms in, resulting
|
|
'in slight calibration interaction.
|
|
ITERATION% = 3
|
|
ElseIf Left$(MN$, 12) = "SCM5B35-1760" Then 'To ensure a tighter calibration
|
|
ITERATION% = 2
|
|
|
|
ElseIf SNM% = 3 And Abs(INRANGE!) <= 0.015 Then
|
|
ITERATION% = 2
|
|
Else
|
|
ITERATION% = 1
|
|
End If
|
|
End If
|
|
|
|
If SNM% = 1 Then
|
|
VF = 2 * (MINOUT! * MAXIN! - MININ! * MAXOUT!) / (MAXOUT! - MINOUT!)
|
|
|
|
INTERACT! = (SPECS.OSCALIN + VF) / (SPECS.GNCALIN + VF)
|
|
|
|
Do
|
|
If INTERACT <> 0 Then
|
|
'If INTERACT! is not equal to zero, then check offset, adjust gain, offset, gain, offset
|
|
CAL% = 3
|
|
A$ = OFFSETCAL$(CAL%, CONTRES!, DIRO%) 'Check offset
|
|
DATALEN% = Len(A$)
|
|
OSERR2! = Val(Mid$(A$, 5, DATALEN% - 5))
|
|
|
|
CAL% = 0
|
|
B$ = GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!, DIRG%) 'Calibrate gain
|
|
DATALEN% = Len(B$)
|
|
GNERR2! = Val(Right$(B$, DATALEN% - 4)) 'Measured gain error (%)
|
|
End If
|
|
|
|
'If there is NO interaction, just adjust OFFSET, then adjust GAIN
|
|
CAL% = 0
|
|
A$ = OFFSETCAL$(CAL%, CONTRES!, DIRO%) 'Calibrate offset
|
|
DATALEN% = Len(A$)
|
|
OSERR2! = Val(Right$(A$, DATALEN% - 4)) '%
|
|
|
|
B$ = GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!, DIRG%) 'Calibrate gain
|
|
DATALEN% = Len(B$)
|
|
GNERR2! = Val(Right$(B$, DATALEN% - 4)) 'Measured gain error (%)
|
|
|
|
If INTERACT <> 0 Then
|
|
CAL% = 3
|
|
A$ = OFFSETCAL$(CAL%, CONTRES!, DIRO%) 'Measures offset error
|
|
DATALEN% = Len(A$)
|
|
OSERR2! = Val(Right$(A$, DATALEN% - 4)) '%
|
|
GNERR2! = Val(Right$(B$, DATALEN% - 4)) 'Measured gain error (%)
|
|
End If
|
|
Loop Until 2 * Abs(OSERR2!) < ACC! And 2 * Abs(GNERR2!) < ACC!
|
|
End If
|
|
|
|
If INTERACT! = 1 Then 'Standard calibration sequence
|
|
Do
|
|
If SNM% >= 5 And SNM% <= 7 Then 'Check if resistance in
|
|
Call POWERON(0!)
|
|
Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
|
|
End If
|
|
A$ = OFFSETCAL$(0, CONTRES!, DIRO%)
|
|
Call POWERON(0!)
|
|
A$ = GAINCAL$(0, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!, DIRG%)
|
|
ITERATION% = ITERATION% - 1
|
|
Loop While ITERATION% > 0 'Tests for Offset/Gain calibration end
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Sub CALTEST(CAL%)
|
|
'Runs offset and gain calibration tests.
|
|
'
|
|
If SENSOROUT!(SPECS.MININ, 0) = 99! Then 'Check for valid sensor type.
|
|
Print Tab(10); "Exiting CALTEST for invalid sensor type!."
|
|
Call CONTINUE
|
|
Exit Sub
|
|
End If
|
|
|
|
Call ENABLE(CON%) 'Enable output switch.
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% = 11 Then
|
|
HALFBRIDGE% = 1 'Enable shunt input cap.
|
|
CB1VAL% = CB1VAL% And &HFB '1 1 1 1 1 0 1 1
|
|
Call SETTH(CB1VAL%, CB1%)
|
|
Else
|
|
HALFBRIDGE% = 0
|
|
End If
|
|
|
|
If Left$(SPECS.MODNAME, 12) = "SCM5B38-1146" Then
|
|
Call CASEINST 'Tell user to install a case over the unit
|
|
End If
|
|
|
|
Do
|
|
Call CALSEQ(CAL%) 'Run offset and gain calibration sequence.
|
|
|
|
If SNM% = 8 Or SNM% = 9 Or SNM% = 10 Or SNM% = 11 Then
|
|
A$ = EXCCAL$(0) 'Run excitation calibration test.
|
|
End If
|
|
|
|
Call CONTINUE
|
|
Call POWERON(0!) 'Turns off module power
|
|
|
|
Loop While REPEAT$(SPECS.MODNAME) <> "N"
|
|
|
|
If SNM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
Print
|
|
Print Tab(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
Call CONTINUE
|
|
End If
|
|
|
|
If HALFBRIDGE% = 1 Then 'Disable shunt input cap.
|
|
CB1VAL% = CB1VAL% Or &H4 '0 0 0 0 0 1 0 0
|
|
Call SETTH(CB1VAL%, CB1%)
|
|
End If
|
|
|
|
If Mid$(SPECS.MODNAME, 10, 4) = "1442" Or Mid$(SPECS.MODNAME, 10, 4) = "1443" Then 'units with +EXC and -IN shorted
|
|
Call REMEXCPIN(0) 'Reconnect +EXC from the test interface board
|
|
End If
|
|
End Sub
|
|
|
|
Function CJCGAIN$()
|
|
'Measure gain of the CJC input (Seebeck coefficient)
|
|
'Reference TC theory notes on 12/20/96 for details.
|
|
'Method is based on the measured module gain around
|
|
'delta Ta = 25C.
|
|
'
|
|
TCTYPE$ = Left$(SPECS.SENTYPE, 1) 'Determine TC type
|
|
MINTIN! = SPECS.MININ
|
|
MAXTIN! = SPECS.MAXIN
|
|
MINOUT! = SPECS.MINOUT
|
|
MAXOUT! = SPECS.MAXOUT
|
|
GCJCMAXERR! = 0.035 '3.5% error limit, 0.5C error over 25C Ta change
|
|
ORANGE! = MAXOUT! - MINOUT!
|
|
INRANGE! = MAXTIN! - MINTIN! 'Input range (deg. C)
|
|
|
|
Cls
|
|
TESTTITLE$ = "Cold Junction Compensation Gain"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% <> 3 Then
|
|
Print Tab(10); "This test is performed on thermocouple input modules only,"
|
|
Print Tab(10); "(except Type B)."
|
|
Call CONTINUE
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait..."
|
|
End If
|
|
|
|
PTCV! = PARASITICTCV!(VCJC!)
|
|
|
|
If VCJC! = 99! Then
|
|
Print Tab(10); "Error in CJCGAIN$ test:"
|
|
Print Tab(10); "Vcjc = 99 (error value)!"
|
|
CJC$ = "FAIL" 'Set FAIL status.
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
CJCGAIN$ = CJC$ + "V" 'Set function output to FAIL status with trailing "V" for special formatting.
|
|
Call FAILSTATUS(CJC$, 15, 10, "Status: ", 40) 'Print test status to screen
|
|
Exit Function
|
|
End If
|
|
|
|
MININ1! = SENSOROUT!(MINTIN, PTCV!) 'Calc. minin,
|
|
MININ2! = SENSOROUT!(MINTIN!, PTCV!) + PTCV! 'Calc. minin
|
|
' '2nd simulated CJC temp is 0C
|
|
'MININ2! = SENSOROUT!((MINTIN! + .1 * INRANGE!), PTCV!) 'Calc. minin
|
|
'JL 10/22/04. 25C change for input gain measurement too small for R, S.
|
|
'Most linearizers will have 1st breakpoint after 10%, therefore use
|
|
'delta Vin = 10%.
|
|
'CG 10/25/04. Change back to 25C change in order to match CJC change.
|
|
|
|
'2nd simulated CJC temp is 0C
|
|
Call SETDAC(MININ1!, 1, MAXINVAR!, 0) 'Set -f.s. input
|
|
|
|
'Medium reading rate for speed. Measure Vout with
|
|
'approx 0.5100V (25C) input to CJC port.
|
|
Call WRITEDVM("S1", 0)
|
|
|
|
Call WRITEDVM(VODC$, MINOUT!) 'Sets meter to read output
|
|
Call LOADMUX(2, CON%)
|
|
VOUT4! = READDVM!(0.0001)
|
|
Call LOADMUX(2, COFF%)
|
|
|
|
MININ1MEAS! = MININ1! 'Use ideal value
|
|
|
|
|
|
'Measure Vout with approx 0.5100V
|
|
'(25C) input to CJC port.
|
|
Call SETDAC(MININ2!, 1, MAXINVAR!, 0) 'Set -f.s. input
|
|
|
|
LOCATE 15, 10
|
|
Print "Measuring Vout @ Tin = -f.s and Ta = 25C..."
|
|
' CALL WRITEDVM(VODC$, VOUT(MINTIN! + 25!)) 'Sets meter to read output
|
|
Call WRITEDVM(VODC$, 999!) 'Sets up Meter (Autorange)
|
|
|
|
'CALL WRITEDVM(VODC$, VOUT(MINTIN! + .1 * INRANGE!)) 'Sets meter to read output
|
|
'JL 10-22-04. 25C change for input gain measurement too small for R, S.
|
|
'Most linearizers will have 1st breakpoint after 10%, therefore use
|
|
'delta Vin = 10%.
|
|
'CG 10/25/04. Change back to 25C change in order to match CJC change.
|
|
Call LOADMUX(2, CON%)
|
|
VOUT1! = READDVM!(0.0001)
|
|
Call LOADMUX(2, COFF%)
|
|
|
|
MININ2MEAS! = MININ2! 'Use ideal value
|
|
|
|
TAMB1! = 25! + (VCJC! - 0.51) / -0.0025
|
|
|
|
CB0VAL% = CB0VAL% And &HDF '1 1 0 1 1 1 1 1
|
|
Call SETTH(CB0VAL%, CB0%) 'CJC 0C simulation
|
|
Print Tab(10); "Measuring simulated Ta = 0C..."
|
|
Call WRITEDVM(VODC$, 0.5725) 'Sets meter to read output
|
|
Call LOADMUX(4, CON%)
|
|
VCJC2! = READDVM!(0.0001) 'Measured on SLOW reading rate
|
|
|
|
'Force error value for debug (PWR 2014-11-12).
|
|
If FORCEVCJCFAIL% = 1 Then
|
|
VCJC2! = 99!
|
|
End If
|
|
|
|
If VCJC2! > 0.5825 Then 'Check for > 0C simulated
|
|
SOUND 1000, 0.5
|
|
Print
|
|
Print Tab(10); "Error in CJCGAIN$ test:"
|
|
Print Tab(10); "Test head temperature sensor malfunction."
|
|
Print Tab(10); "Vcjc = "; VCJC2!; "V"
|
|
CJC$ = "FAIL" 'Set FAIL status.
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
CJCGAIN$ = CJC$ + "V" 'Set function output to FAIL status with trailing "V" for special formatting.
|
|
Call FAILSTATUS(CJC$, 15, 10, "Status: ", 35) 'Print test status to screen
|
|
Exit Function
|
|
End If
|
|
Call LOADMUX(4, COFF%)
|
|
|
|
TAMB2! = 25! + (VCJC2! - 0.51) / -0.0025
|
|
SEEBECK! = (TCVOLTS!(50!, TCTYPE$) - TCVOLTS!(0!, TCTYPE$)) / 50!
|
|
|
|
Print Tab(10); "Measuring Vout @ Tin = -f.s and Ta = 0C..."
|
|
Call WRITEDVM(VODC$, MINOUT! + 1) 'Sets meter to read output
|
|
Call LOADMUX(2, CON%)
|
|
VOUT2! = READDVM!(0.0001)
|
|
Call LOADMUX(2, COFF%)
|
|
Call WRITEDVM("S1", 0) 'Medium reading rate
|
|
CB0VAL% = CB0VAL% Or &H20 '0 0 1 0 0 0 0 0
|
|
Call SETTH(CB0VAL%, CB0%) 'CJC 25C simulation
|
|
|
|
GCJCMEAS! = (VOUT2! - VOUT1!) * (MININ2MEAS! - MININ1MEAS!) / (VOUT1! - VOUT4!) / (TAMB2! - TAMB1!)
|
|
|
|
If Abs((GCJCMEAS! - SEEBECK!) / SEEBECK!) <= GCJCMAXERR! Then
|
|
CJC$ = "PASS"
|
|
Else
|
|
CJC$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
End If
|
|
|
|
LOCATE 16, 10
|
|
Print Spc(25);
|
|
|
|
'LOCATE 15, 10
|
|
'PRINT "Status: "; CJC$;
|
|
'CALL FAILSTATUS (CJC$, 15, 10, "Status: ") 'Print test status to screen
|
|
|
|
Print Spc(31);
|
|
Print Tab(10); "Measured CJC gain is";
|
|
Print Tab(35); USING; "###.## uV/C"; GCJCMEAS! * 1000000!
|
|
Print Tab(10); "Required CJC gain is";
|
|
Print Tab(35); USING; "###.## uV/C to ###.## uV/C"; SEEBECK! * 1000000! * (1 - GCJCMAXERR!); SEEBECK! * 1000000! * (1 + GCJCMAXERR!)
|
|
Print Spc(75);
|
|
|
|
Call FAILSTATUS(CJC$, 15, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
CJCGAIN$ = CJC$ + Str$(GCJCMEAS! * 1000000!) + "2"
|
|
|
|
Call RESETTH 'Reset the test head
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Sub COMPTEST(STATUS$(), CAL%, GENAMPL!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!)
|
|
'Runs complete set of tests.
|
|
|
|
If SENSOROUT!(SPECS.MININ, 0) = 99! Then 'Check for valid sensor type
|
|
Print Tab(10); "Exiting COMPTEST for invalid sensor type!."
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
Call CONTINUE
|
|
Exit Sub
|
|
End If
|
|
|
|
For X = 1 To MAXSTATUSINDEX 'Clear test result array
|
|
STATUS$(X) = ""
|
|
Next X
|
|
|
|
SNM% = SENSORNUM%
|
|
Call ENABLE(CON%) 'Enable output switch
|
|
|
|
If SNM% = 11 Then
|
|
HALFBRIDGE% = 1 'Enable shunt input cap.
|
|
CB1VAL% = CB1VAL% And &HFB '1 1 1 1 1 0 1 1
|
|
Call SETTH(CB1VAL%, CB1%)
|
|
Else
|
|
HALFBRIDGE% = 0
|
|
End If
|
|
|
|
If Left$(SPECS.MODNAME, 12) = "SCM5B38-1146" Then
|
|
Call CASEINST 'Tell user to install a case over the unit
|
|
End If
|
|
|
|
STATUS$(1) = SUPPLYI$(0) 'Supply current test. Sets Vs to +5.0V, no excitation load.
|
|
If Left$(STATUS$(1), 4) = "FAIL" Then Exit Sub 'Exit on overcurrent. 'Power is shut off within SUPPLYI$.
|
|
|
|
If SNM% >= 8 And SNM% <= 11 Then
|
|
'Bridge, 2-wire transmitter or DCLVDT module.
|
|
Call POWERON(0) 'Set Vsupply to 0V
|
|
STATUS$(2) = SUPPLYI$(1) 'Supply current test with full excitation load.
|
|
Else
|
|
'Other modules: skip test and set a PASS status.
|
|
STATUS$(2) = "PASS"
|
|
End If
|
|
|
|
If Left$(STATUS$(2), 4) = "FAIL" Then Exit Sub 'Exit on overcurrent. Power is shut off within SUPPLYI$.
|
|
|
|
If SNM% >= 5 And SNM% <= 7 Then
|
|
'Resistance input module.
|
|
Call POWERON(0) 'Set Vsupply to 0V.
|
|
If SNM% = 5 Or SNM% = 7 Then
|
|
STATUS$(4) = IEXC2$(IEXCSENSE!)
|
|
STATUS$(3) = IEXC1$(IEXCSENSE!)
|
|
STATUS$(5) = IMATCH$(STATUS$(3), STATUS$(4))
|
|
Else
|
|
STATUS$(3) = IEXC1$(IEXCSENSE!)
|
|
STATUS$(4) = "PASS"
|
|
STATUS$(5) = "PASS"
|
|
End If
|
|
Call RESETTH 'Reset for testhead for standard operation.
|
|
Else
|
|
'Not a resistance-input module: skip tests and set PASS status for each test.
|
|
STATUS$(3) = "PASS"
|
|
STATUS$(4) = "PASS"
|
|
STATUS$(5) = "PASS"
|
|
End If
|
|
|
|
If (Left$(SPECS.MODNAME, 12) = "SCM5B41-1118") Or (Left$(SPECS.MODNAME, 10) = "SCM5B38SEV") Then
|
|
'Skip output switch test and set PASS status for specific modules.
|
|
STATUS$(6) = "PASS"
|
|
Else
|
|
'Run output switch test for other modules.
|
|
STATUS$(6) = OUTSWITCH$ 'Output switch test.
|
|
End If
|
|
|
|
If Left$(STATUS$(6), 4) = "FAIL" Then
|
|
'Module failed output switch test. Module not functional, so turn off
|
|
'module supply and exit the subroutine to skip remaining tests.
|
|
Call POWERON(0!) 'Set Vsupply to 0V
|
|
Exit Sub
|
|
End If
|
|
|
|
If CAL% <> 4 Then
|
|
Call CALSEQ(CAL%)
|
|
End If
|
|
|
|
If SNM% >= 8 And SNM% <= 11 Then
|
|
'Bridge, 2-wire transmitter or DCLVDT module, so
|
|
'perform excitation tests.
|
|
STATUS$(8) = EXCCAL$(CAL%) 'Excitation calibration
|
|
STATUS$(9) = EXCREG$ 'Excitation load regulation
|
|
STATUS$(10) = VOREG$ 'Vout regulation with exc. load
|
|
STATUS$(11) = EXCILIM$ 'Excitation current limit
|
|
Call RESETTH 'Reset the test head
|
|
Else
|
|
'Skip excitation tests and set PASS status for each test for other modules.
|
|
STATUS$(8) = "PASS"
|
|
STATUS$(9) = "PASS"
|
|
STATUS$(10) = "PASS"
|
|
STATUS$(11) = "PASS"
|
|
End If
|
|
|
|
If SNM% = 3 Then
|
|
STATUS$(7) = CJCGAIN$ 'Measure CJC gain
|
|
End If
|
|
|
|
If SNM% >= 5 And SNM% <= 7 Then
|
|
'Resistance input module. Turn off module power and measure contact resistance.
|
|
Call POWERON(0!) 'Turn off power
|
|
Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
|
|
End If
|
|
|
|
'Performs linearity and accuracy tests and assign results of linearity test.
|
|
STATUS$(12) = LINTEST$(ACC$, CONTRES!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
|
|
STATUS$(13) = ACC$ 'Assign results of accuracy test.
|
|
|
|
STATUS$(14) = "PASS" 'Skip test and assign PASS result.
|
|
|
|
STATUS$(15) = SUPPLYSEN$ 'Power supply sensitivity test.
|
|
|
|
STATUS$(16) = "PASS" 'Skip test and assign PASS result.
|
|
|
|
If SPECS.VOPENINMIN <> 0 Then
|
|
STATUS$(17) = OPENIN$ 'Open input response
|
|
Else
|
|
STATUS$(17) = "PASS"
|
|
End If
|
|
|
|
If HALFBRIDGE% = 1 Then
|
|
'Disable shunt input cap.
|
|
CB1VAL% = CB1VAL% Or &H4 '0 0 0 0 0 1 0 0
|
|
Call SETTH(CB1VAL%, CB1%)
|
|
End If
|
|
|
|
STATUS$(18) = FREQRESP$(GENAMPL!) 'Frequency response test/
|
|
|
|
If SPECS.STEPRMIN < 97 And SENSOROUT!(SPECS.MAXIN, 0) < 25! And (SNM% < 5 Or SNM% > 7) Then
|
|
STATUS$(19) = STEPRESP$ 'Step response test.
|
|
Else
|
|
STATUS$(19) = "PASS"
|
|
End If
|
|
|
|
STATUS$(20) = OUTNOISE$ 'Output noise test.
|
|
|
|
Call POWERON(0!) 'Turn off module power.
|
|
|
|
End Sub
|
|
|
|
Sub ENABLE(ONOFF%)
|
|
|
|
If ONOFF% = 0 Then 'Disable output switch
|
|
If TE$ = "TE1012" Then 'TE1012
|
|
CB0VAL% = CB0VAL% Or &H20 '0 0 1 0 0 0 0 0
|
|
Else 'TE1005
|
|
CB0VAL% = CB0VAL% Or &H1 '0 0 0 0 0 0 0 1
|
|
End If
|
|
Else 'Enable output switch
|
|
If TE$ = "TE1012" Then 'TE1012
|
|
CB0VAL% = CB0VAL% And &HDF '1 1 0 1 1 1 1 1
|
|
Else 'TE1005
|
|
CB0VAL% = CB0VAL% And &HFE '1 1 1 1 1 1 1 0
|
|
End If
|
|
End If
|
|
|
|
Call SETTH(CB0VAL%, CB0%) 'Writes bit pattern to test head
|
|
|
|
End Sub
|
|
|
|
Function EXCCAL$(CAL%)
|
|
|
|
'Measure and calibrate the isolated excitation voltage source on the
|
|
'SCM5B38, SCM5B42 and SCM5B43 modules
|
|
'
|
|
'SCM5B42-xx and some custom SCM5B43-xx modules do not have an
|
|
'adjustment potentiometer. Excitation voltage is 20.4V.
|
|
|
|
VEXC! = SPECS.VEXC 'Isolated excitation
|
|
|
|
ACC! = SPECS.VEXCACC / 100! 'Specified excitation accuracy (%)
|
|
|
|
CALTOL! = ACC! / 3! * VEXC! * 1000! 'Calibration tolerance (mV)
|
|
INITTOL! = 0.08 'Initial uncalibrated tol. (+/- 8%)
|
|
|
|
Cls
|
|
TESTTITLE$ = "Isolated Excitation Calibration"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% < 8 Or SNM% > 11 Then
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait."
|
|
End If
|
|
|
|
Call MODULEOUTLINE
|
|
POT1% = 34
|
|
POT2% = 40
|
|
POT3% = 53
|
|
ADJ% = 34
|
|
TXT% = ADJ% - 9
|
|
|
|
LOCATE 5, POT1%
|
|
Print Chr$(233)
|
|
LOCATE 5, POT2%
|
|
Print Chr$(233)
|
|
LOCATE 5, POT3%
|
|
Print Chr$(233)
|
|
LOCATE 7
|
|
Print Tab(ADJ%); Chr$(24);: Print Spc(20);
|
|
Print Tab(TXT%); "EXC. POTENTIOMETER";
|
|
|
|
LOCATE 12, 10
|
|
Print "Please wait..."
|
|
|
|
If CAL% = 2 Then
|
|
XERROR! = INITTOL! * VEXC! * 1000! 'Offset tol. for func. test (mV)
|
|
Else
|
|
XERROR! = ACC! * VEXC! * 1000! 'Exc. cal. tolerance (mV)
|
|
End If
|
|
|
|
Call LOADMUX(6, CON%) 'Measure Vexc
|
|
Call WRITEDVM(VODC$, VEXC!)
|
|
|
|
LOCATE 12, 10
|
|
Print "Excitation Error = "
|
|
|
|
Do
|
|
ERRORMV! = (READDVM!(0!) - VEXC!) * 1000! 'Error in mV
|
|
LOCATE 12, 29
|
|
' ERRORMV! = -64 '09/18/07 MR
|
|
Print USING; "+#####.# mV"; ERRORMV!
|
|
|
|
If VEXC! = 20.4 Then Exit Do 'No calibration for 2WTX input
|
|
LOCATE 15, 10
|
|
If CAL% > 1 Then
|
|
Exit Do
|
|
ElseIf Abs(ERRORMV!) < CALTOL! Then
|
|
SOUND 600, 0.5
|
|
Print "Stop turning excitation potentiometer "
|
|
CONREADS% = CONREADS% + 1
|
|
ElseIf ERRORMV! < 0 Then
|
|
Print "Turn excitation potentiometer clockwise "
|
|
CONREADS% = 0
|
|
Else
|
|
Print "Turn excitation potentiometer counter-clockwise"
|
|
CONREADS% = 0
|
|
End If
|
|
|
|
LOCATE 20, 10
|
|
A$ = INKEY$
|
|
If UCase$(A$) = "T" Then
|
|
Print Tab(10); "Trouble Shooting Mode"
|
|
Call WRITEDVM("*", VEXC!)
|
|
Call CONTINUE
|
|
LOCATE 20, 10
|
|
Print Spc(22);
|
|
ElseIf UCase$(A$) = "C" Then
|
|
CONREADS% = 5
|
|
End If
|
|
Call PAUSE(0.1) 'Slow loop down
|
|
Loop While CONREADS% < 5 'Exit loop if calibrated
|
|
|
|
Call LOADMUX(6, COFF%)
|
|
|
|
If Abs(ERRORMV!) <= XERROR! Then
|
|
EXC$ = "PASS"
|
|
Else
|
|
EXC$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
End If
|
|
|
|
If SNM% = 9 Or SNM% = 11 Then
|
|
CB0VAL% = (CB0VAL% And &HEB) Or &H8 '1 1 1 0 1 0 1 1
|
|
'ground inputs, short series R
|
|
'remove short on inputs
|
|
Call SETTH(CB0VAL%, CB0%)
|
|
'test for -IN to -EXC jumper on SCM5B42-xx
|
|
CB3VAL% = CB3VAL% And &HF7 '1 1 1 1 0 1 1 1
|
|
Call SETTH(CB3VAL%, CB3%) 'Connect CH6+ to -IN
|
|
If SNM% = 9 Then
|
|
If MEASRES!(1!, 5, "") > 10 Then
|
|
'CALL PAUSE(1)
|
|
Print
|
|
Print Tab(5); "The required jumper in the R68 location is not installed."
|
|
EXC$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
Call CONTINUE
|
|
End If
|
|
ElseIf SNM% = 11 Then 'test for inversion of the input terminals
|
|
'and for the installation of the internal resistors
|
|
'on half bridge models only
|
|
Call LOADMUX(6, CON%) 'Measure Volt of internal resistor
|
|
Call WRITEDVM(VODC$, VEXC! * 1.1)
|
|
VRINTEXP! = 0.5 * VEXC! 'Nominal voltage value
|
|
VRINTTOL! = VRINTEXP! * 0.01 'Tolerance in volts
|
|
VRINT! = READDVM!(0!)
|
|
|
|
If Abs(VRINT! - VRINTEXP!) > VRINTTOL Then
|
|
LOCATE 18, 1
|
|
Print Tab(5); "Bridge completion test failed. Check if R4, R5, R6 and R7 are"
|
|
Print Tab(5); "installed. Also verify that R63, R64, R73, R74 are installed"
|
|
Print Tab(5); "instead of R61, R62, R72, R75 (all PCB 1212 designators)."
|
|
EXC$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
Call CONTINUE
|
|
End If
|
|
Call LOADMUX(6, COFF%) 'Turn off measurement channel
|
|
End If
|
|
CB0VAL% = CB0VAL% And &HE3 '1 1 1 0 0 0 1 1
|
|
Call SETTH(CB0VAL%, CB0%) 'short inputs again
|
|
CB3VAL% = CB3VAL% Or &H8 '0 0 0 0 1 0 0 0
|
|
Call SETTH(CB3VAL%, CB3%) 'Connect CH6+ to +EXC
|
|
End If
|
|
|
|
'LOCATE 15, 10
|
|
'PRINT "Status: "; EXC$;
|
|
'CALL FAILSTATUS (EXC$, 15, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 15, 10
|
|
Print Spc(36);
|
|
Print Tab(10); "Excitation calibration error is";
|
|
Print Tab(50); USING; " +#####.# mV"; ERRORMV!
|
|
Print Tab(10); "Max. excitation calibration error is";
|
|
Print Tab(50); USING; "+/-####.# mV"; XERROR!
|
|
|
|
Call FAILSTATUS(EXC$, 15, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
EXCCAL$ = EXC$ + Str$(ERRORMV! / 1000! + VEXC!) + "3" 'Convert to absolute
|
|
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function EXCILIM$()
|
|
|
|
'Test the isolated excitation voltage source current limit
|
|
'on the SCM5B38 and SCM5B42 modules
|
|
|
|
VEXC! = SPECS.VEXC 'Excitation voltage
|
|
EXCIMAX! = SPECS.EXCIMAX 'Excitation current limit (mA)
|
|
|
|
Cls
|
|
TESTTITLE$ = "Excitation Current Limit Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% < 8 Or SNM% > 11 Then
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait."
|
|
End If
|
|
|
|
Call SETLOAD(80!) 'Set excitation load (ohms)
|
|
|
|
Call LOADMUX(6, CON%) 'Measure Vexc
|
|
Call WRITEDVM(VODC$, VEXC!)
|
|
ILIM! = READDVM(0.001) / 80! * 1000! 'Current limit (mA)
|
|
Call LOADMUX(6, COFF%) '80 ohms is max load.
|
|
|
|
If ILIM! <= EXCIMAX! Then
|
|
ELIM$ = "PASS"
|
|
Else
|
|
ELIM$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
'Trouble shooting notes
|
|
LOCATE 15, 10
|
|
Print "Check the excitation current sense resistor."
|
|
End If
|
|
|
|
'LOCATE 10, 10
|
|
'PRINT "Status: "; ELIM$;
|
|
'CALL FAILSTATUS (ELIM$, 10, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 11, 10
|
|
If Left$(SPECS.MODNAME, 12) = "SCM5B38-1788" Or Left$(SPECS.MODNAME, 12) = "SCM5B38-1851" Then
|
|
Print Spc(10);
|
|
Print Tab(10); "Excitation current limit is";
|
|
Print Tab(50); USING; "#.### mA"; ILIM!
|
|
Print Tab(10); "Max. allowable current is";
|
|
Print Tab(50); USING; "#.### mA"; EXCIMAX!
|
|
EXCILIM$ = ELIM$ + Str$(ILIM!) + "3"
|
|
Else
|
|
Print Spc(10);
|
|
Print Tab(10); "Excitation current limit is";
|
|
Print Tab(50); USING; "####.# mA"; ILIM!
|
|
Print Tab(10); "Max. allowable current is";
|
|
Print Tab(50); USING; "###.# mA"; EXCIMAX!
|
|
EXCILIM$ = ELIM$ + Str$(ILIM!) + "1"
|
|
End If
|
|
|
|
Call FAILSTATUS(ELIM$, 10, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
|
|
Call SETLOAD(10000!) 'Set excitation load to 10K ohms
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function EXCREG$()
|
|
|
|
'Test the isolated excitation voltage regulation with load on the
|
|
'SCM5B38 and SCM5B42 modules
|
|
|
|
MINOUT! = SPECS.MINOUT
|
|
MAXOUT! = SPECS.MAXOUT
|
|
REGSPEC! = SPECS.EXCLOADREG 'Load regulation (ppm/mA)
|
|
VEXC! = SPECS.VEXC 'Excitation voltage
|
|
EXCLOAD! = SPECS.EXCLOAD 'Max. exc. load (mA)
|
|
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V)
|
|
|
|
Cls
|
|
TESTTITLE$ = "Excitation Load Regulation Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% < 8 Or SNM% > 11 Or Left$(SPECS.MODNAME, 12) = "SCM5B38-1788" Or Left$(SPECS.MODNAME, 12) = "SCM5B38-1851" Then
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait."
|
|
End If
|
|
|
|
'Module inputs are shorted
|
|
Call LOADMUX(6, CON%) 'Measure Vexc
|
|
Call WRITEDVM(VODC$, VEXC!)
|
|
|
|
VEXCNL! = READDVM(0.001) 'Excitation V, no load
|
|
Call LOADMUX(6, COFF%)
|
|
|
|
Call SETLOAD(VEXC! / (EXCLOAD! / 1000!)) 'Set excitation load (ohms)
|
|
|
|
Call LOADMUX(6, CON%) 'Measure Vexc
|
|
VEXCL! = READDVM(0.001) 'Excitation V, full load
|
|
Call LOADMUX(6, COFF%)
|
|
|
|
MEASREG! = (VEXCL! - VEXCNL!) / VEXC! / EXCLOAD! * 1000000! 'Measured regulation (ppm/mA)
|
|
|
|
If Abs(MEASREG!) <= REGSPEC! Then
|
|
ER$ = "PASS"
|
|
Else
|
|
ER$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
'Trouble shooting notes
|
|
LOCATE 15, 10
|
|
Print "Check the signals on the excitation reference and amplifier."
|
|
Print Tab(10); "If failure still occurs, re-seat module firmly in sockets."
|
|
End If
|
|
|
|
'LOCATE 10, 10
|
|
'PRINT "Status: "; ER$;
|
|
'CALL FAILSTATUS (ER$, 15, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 15, 10
|
|
Print Spc(10);
|
|
Print Tab(10); "Excitation change with load is";
|
|
Print Tab(50); USING; " +##### ppm/mA"; MEASREG!
|
|
Print Tab(10); "Max. change with load is";
|
|
Print Tab(50); USING; "+/-##### ppm/mA"; REGSPEC!
|
|
|
|
Call FAILSTATUS(ER$, 15, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
EXCREG$ = ER$ + Str$(MEASREG!) + "0" 'ppm/mA
|
|
|
|
Call SETLOAD(10000!) 'Set excitation load to 10K ohms
|
|
Call RESETTH 'Reset the test head
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function FAILS%(STATUS$())
|
|
|
|
FAILS% = 0
|
|
|
|
'FOR X = 1 TO 21
|
|
For X = 1 To MAXSTATUSINDEX
|
|
If Left$(STATUS$(X), 1) = "F" Then 'Tests for failed tests
|
|
FAILS% = 1
|
|
End If
|
|
Next
|
|
|
|
End Function
|
|
|
|
Sub FINISHSUB()
|
|
'Sub to run code at "FINISH" label (usually after F10 key is pressed).
|
|
'
|
|
Cls
|
|
If SENSORNUM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Turn off loop power
|
|
SL$ = SETPOWER$(VINADDR%, 999!, LOCAL$) 'Return to local mode
|
|
SL$ = SETPOWER$(VINADDR%, 999!, "ZER") 'Clear the error queue
|
|
End If
|
|
|
|
CHAIN "C:\ATE\MENUX"
|
|
End Sub
|
|
|
|
Function FREQRESP$(GENAMPL!)
|
|
|
|
MININ! = SENSOROUT!(SPECS.MININ, 0) 'Determine min in
|
|
MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Determine max in
|
|
IEXC! = SPECS.IEXC / 1000000! 'Convert to A
|
|
|
|
INRANGE! = MAXIN! - MININ!
|
|
ORANGE! = SPECS.MAXOUT - SPECS.MINOUT
|
|
|
|
SPEC! = SPECS.ATTEN
|
|
SPECTOL! = SPECS.ATTENTOL
|
|
|
|
Cls
|
|
TESTTITLE$ = "Frequency Response Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
Print "Testing, please wait."
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% >= 5 And SNM% <= 7 Then 'Check if resistance in
|
|
'Simulated RTD input is the bottom leg in a voltage divider
|
|
'from the function generator. The series resistor is 6.8Kohms.
|
|
R! = GENATTENR! 'Find attenuator shunt R
|
|
Call OHMSET(R!)
|
|
THATTEN! = (6800! + R!) / R!
|
|
VGAIN! = ORANGE! / (INRANGE! * IEXC!) 'Gain in V/V
|
|
Else
|
|
If Abs(MAXIN!) > 10 Then MAXIN! = 10
|
|
THATTEN! = SETATTEN%(MAXIN!) 'Set test head attenuator
|
|
VGAIN! = ORANGE! / INRANGE! 'Gain in V/V
|
|
End If
|
|
|
|
VAC! = SETAC!(CON%, GENAMPL!) 'Turns on AC input
|
|
|
|
Call LOADMUX(2, CON%) 'Turns on mux
|
|
Call WRITEDVM(VOAC$, 999!) 'Sets up Meter (Autorange)
|
|
|
|
OUTMEAS! = READDVM!(0.001) 'Reads Meter
|
|
If OUTMEAS! > 0.0002 Then
|
|
OUTMEAS! = Sqr(OUTMEAS! ^ 2 - 0.0002 ^ 2) 'Account for meter zero-input error
|
|
End If 'See output noise test for details
|
|
|
|
Call LOADMUX(2, COFF%) 'Turns off mux
|
|
|
|
'Calculate attenuation
|
|
'max 2% error from R/2R ladder
|
|
'ideal assumption results in
|
|
'0.3% error in 60dB measurement.
|
|
If Mid$(SPECS.MODNAME, 6, 7) = "41-1794" Then
|
|
ATTEN! = 20 * (Log(OUTMEAS! / (VAC! / THATTEN! * VGAIN!)) / Log(10))
|
|
Else
|
|
ATTEN! = -20 * (Log(OUTMEAS! / (VAC! / THATTEN! * VGAIN!)) / Log(10))
|
|
End If
|
|
|
|
If Abs(ATTEN! - SPEC!) <= SPECTOL! Then
|
|
ATTEN$ = "PASS"
|
|
Else
|
|
ATTEN$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
End If
|
|
|
|
'LOCATE 10, 10
|
|
'PRINT "Status: "; ATTEN$;
|
|
'CALL FAILSTATUS (ATTEN$, 10, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 10, 10
|
|
Print Spc(20);
|
|
Print Tab(10); USING; "Attenuation at ##### Hz is"; SPECS.TESTFREQ!;
|
|
If Mid$(SPECS.MODNAME, 6, 7) = "41-1794" Then
|
|
Print Tab(50); USING; "###.### dB"; ATTEN!
|
|
Print Tab(10); "Required attenuation is";
|
|
Print Tab(50); USING; "#.## +/- #.### dB"; SPEC!; SPECTOL!
|
|
Else
|
|
Print Tab(50); USING; "###.# dB"; ATTEN!
|
|
Print Tab(10); "Required attenuation is";
|
|
Print Tab(50); USING; "###.# +/- ##.# dB"; SPEC!; SPECTOL!
|
|
End If
|
|
|
|
Call FAILSTATUS(ATTEN$, 10, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
If Mid$(SPECS.MODNAME, 6, 7) = "41-1794" Then
|
|
FREQRESP$ = ATTEN$ + Str$(ATTEN!) + "3"
|
|
Else
|
|
FREQRESP$ = ATTEN$ + Str$(ATTEN!) + "1"
|
|
End If
|
|
|
|
VAC! = SETAC(COFF%, GENAMPL!) 'Turns off AC input
|
|
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Sub FUNCTEST(CAL%)
|
|
'Sequence of tests to determine if main module circuits are functional
|
|
'
|
|
MAXOUT! = SPECS.MAXOUT
|
|
|
|
If SENSOROUT!(SPECS.MININ, 0) = 99! Then 'Check for valid sensor type
|
|
Print Tab(10); "Exiting FUNCTEST for invalid sensor type!."
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
Call CONTINUE
|
|
Exit Sub
|
|
End If
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
Call ENABLE(CON%) 'Enable output switch
|
|
|
|
Do
|
|
|
|
CONFLAG% = 0
|
|
For FTEST% = 1 To 3
|
|
|
|
If FTEST% = 2 Then Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
|
|
Select Case FTEST%
|
|
Case 1
|
|
If Left$(SUPPLYI$(0), 4) = "FAIL" Then 'Check supply current
|
|
Call CONTINUE
|
|
CONFLAG% = 1 'Sets exit flag
|
|
End If
|
|
Case 2
|
|
CONTRES! = 0
|
|
'Don't care about DIRO% status
|
|
If Left$(OFFSETCAL$(CAL%, CONTRES!, DIRO%), 4) = "FAIL" Then
|
|
Call CONTINUE 'Checks for offset error < 8% span
|
|
CONFLAG% = 1
|
|
End If
|
|
'Don't care about DIRG% status
|
|
If Left$(GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!, DIRG%), 4) = "FAIL" Then
|
|
Call CONTINUE 'Checks for Gain error < 8% span
|
|
CONFLAG% = 1
|
|
End If
|
|
Case 3
|
|
If SNM% >= 8 And SNM% <= 11 Then
|
|
If Left$(EXCCAL$(CAL%), 4) = "FAIL" Then
|
|
Call CONTINUE 'Checks for excitation error < 8% span
|
|
CONFLAG% = 1
|
|
End If
|
|
End If
|
|
End Select
|
|
If CONFLAG% <> 0 Then Exit For
|
|
Next
|
|
|
|
Call POWERON(0!) 'Turns off module power
|
|
|
|
Loop While REPEAT$(SPECS.MODNAME) <> "N" 'Repeat for another module
|
|
|
|
Call RESETTH 'Reset the test head
|
|
|
|
End Sub
|
|
|
|
Function GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!, DIRG%)
|
|
'Calibrate module gain
|
|
'Inputs; calibration flag
|
|
' measured contact resistance (used for resistance in only)
|
|
'
|
|
SENSOR$ = SPECS.SENTYPE
|
|
MAXIN! = SENSOROUT!(SPECS.MAXIN!, 0) 'Use to check for high voltage input
|
|
MINOUT! = SPECS.MINOUT
|
|
MAXOUT! = SPECS.MAXOUT
|
|
CALGN! = SPECS.GNCALPT / 100 '%
|
|
INITTOL! = 8 'Uncalibrated offset tolerance (%)
|
|
CALTOL! = SPECS.CALTOL 'Calibration tolerance (% span)
|
|
OSCALIN! = SPECS.OSCALIN 'Module input for offset calibration
|
|
GNCALIN! = SPECS.GNCALIN 'Module input for offset calibration
|
|
BANDWIDTH! = SPECS.BANDWIDTH
|
|
LIN% = SPECS.LINEARIZED
|
|
SNM% = SENSORNUM%
|
|
|
|
Cls
|
|
TESTTITLE$ = "Gain Calibration"
|
|
Call HEADERB(TESTTITLE$)
|
|
|
|
Call MODULEOUTLINE
|
|
|
|
If (SNM% >= 3 And SNM% <= 6) And LIN% = 0 Then
|
|
'Adjustment range is +/- x% of +full scale.Output not linear with input.
|
|
CALSPAN! = VOUT!(SENSOROUT!(GNCALIN!, 0)) - VOUT!(SENSOROUT!(OSCALIN!, 0))
|
|
ElseIf OSCALIN! = -2 * MAXIN! Or Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
CALSPAN! = MAXOUT! - MINOUT! 'For bipolar input, unipolar output modules
|
|
Else
|
|
CALSPAN! = VOUT!(GNCALIN!) - VOUT!(OSCALIN!) 'Adjustment range is +/- x% of +f.s.
|
|
End If
|
|
|
|
INRANGE! = MAXIN! - SENSOROUT!(SPECS.MININ!, 0)
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V)
|
|
|
|
MN$ = Mid$(SPECS.MODNAME, 6, 2)
|
|
|
|
If SPECS.BANDWIDTH <= 150 Or Mid$(SPECS.MODNAME, 6, 7) = "41-1794" Then
|
|
'Assume pcb1122, 1132, 1138, 1107, 1130, 1211, 1214.
|
|
If PCBNO$ = "1211.1212.1214" Then 'Assume pcb1211, 1214.
|
|
POT1% = 34
|
|
POT2% = 40
|
|
ADJ% = 40
|
|
TXT% = ADJ% - 9
|
|
Else
|
|
POT1% = 34
|
|
POT2% = 53
|
|
If MN$ = "40" Or MN$ = "41" Or SNM% = 8 Or SNM% = 9 Or SNM% = 11 And Mid$(SPECS.MODNAME, 6, 7) <> "41-1794" Then
|
|
If SNM% = 9 Or Mid$(SPECS.MODNAME, 6, 7) = "32-1476" Then POT1% = 0
|
|
POT3% = 40
|
|
End If
|
|
ADJ% = 53
|
|
TXT% = ADJ% - 9
|
|
End If
|
|
ElseIf PCBNO$ = "1211.1212.1214" Then 'Assume pcb1212
|
|
POT1% = 34
|
|
POT2% = 40
|
|
If Mid$(SPECS.MODNAME, 6, 7) = "41-1794" Then POT1% = 0
|
|
If MN$ = "40" Or MN$ = "41" Or SNM% = 8 Or SNM% = 9 Or SNM% = 11 Or Mid$(SPECS.MODNAME, 6, 7) = "32-1476" And Mid$(SPECS.MODNAME, 6, 7) <> "41-1794" Then
|
|
If MN$ = "40" Or MN$ = "41" Or Mid$(SPECS.MODNAME, 6, 7) = "32-1476" Then POT1% = 0
|
|
POT3% = 53
|
|
End If
|
|
ADJ% = 40
|
|
TXT% = ADJ% - 9
|
|
Else 'Assume pcb1121, pcb1173
|
|
POT1% = 34
|
|
POT2% = 53
|
|
If SNM% <> 2 Then
|
|
POT3% = 40
|
|
End If
|
|
ADJ% = 53
|
|
TXT% = ADJ% - 9
|
|
End If
|
|
|
|
If POT1% <> 0 Then
|
|
LOCATE 5, POT1%
|
|
Print Chr$(233)
|
|
End If
|
|
|
|
LOCATE 5, POT2%
|
|
Print Chr$(233)
|
|
If POT3% <> 0 Then
|
|
LOCATE 5, POT3%
|
|
Print Chr$(233)
|
|
End If
|
|
LOCATE 7
|
|
Print Tab(ADJ%); Chr$(24);: Print Spc(20);
|
|
Print Tab(TXT%); "GAIN POTENTIOMETER";
|
|
|
|
LOCATE 12, 10
|
|
Print "Please wait..."
|
|
|
|
If CAL% = 2 Then
|
|
GERROR! = INITTOL! 'Offset tolerance for func. test (%)
|
|
TOL! = 0.0001 * ORANGE! 'Measurement tolerance, 1 pass test
|
|
Else
|
|
GERROR! = CALTOL! 'Offset calibration tolerance (%)
|
|
TOL! = 0! 'Measurement tolerance, continuous test
|
|
End If
|
|
|
|
If SNM% >= 5 And SNM% <= 7 Then 'Check if RTD in
|
|
MAXIN! = SENSOROUT!(GNCALIN!, 0) 'Calc. +f.s. ohms
|
|
Call OHMSET(MAXIN! - CONTRES!) 'Set +f.s. input
|
|
End If
|
|
|
|
Do 'Start overall gain measure/calibration loop.
|
|
TIME1! = Timer 'Start timer
|
|
L% = 0
|
|
If CAL% = 3 Then
|
|
LOCATE 11, 10
|
|
Print "Measuring module gain error, no adjustment is required."
|
|
Else
|
|
LOCATE 12, 10
|
|
Print Tab(10); "Measuring input. Please wait..."
|
|
End If
|
|
If SNM% >= 5 And SNM% <= 7 Then
|
|
'RTD input module.
|
|
If CAL% = 0 Then Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
MAXINMEAS! = MEASRES!(MAXIN!, 3, "") + CONTRES! 'Measure simulated resistor
|
|
'PAUSE (.5)
|
|
Call POWERON(5)
|
|
Call PAUSE(2)
|
|
ElseIf Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
If L% = 0 Then Call POWERON(5)
|
|
Else
|
|
If L% = 0 Then Call POWERON(5)
|
|
If SNM% = 3 Then
|
|
PTCV! = PARASITICTCV!(VCJC!)
|
|
If VCJC! = 99! Then
|
|
Print Tab(10); "Error in GAINCAL$ test:"
|
|
Print Tab(10); "Vcjc = 99 (error value)!"
|
|
GN$ = "FAIL" 'Set FAIL status.
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
GAINCAL$ = GN$ + "V" 'Set function output to FAIL status with trailing "V" for special formatting.
|
|
Call FAILSTATUS(GN$, 15, 10, "Status: ", 30) 'Print test status to screen
|
|
Exit Function
|
|
End If
|
|
Else
|
|
PTCV! = 0
|
|
End If
|
|
|
|
MAXIN! = SENSOROUT!(GNCALIN!, PTCV!) 'Calc. maxin volts.
|
|
Call SETDAC(MAXIN!, 1, MAXINVAR!, 0) 'Set DAC.
|
|
|
|
If CAL% = 0 Or MAXIN! > 10! Then
|
|
'Always measure high voltage input to get exact setting.
|
|
Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
Call LOADMUX(1, CON%) 'Set to measure Vout.
|
|
|
|
'Turn off and re-set mux because the mux is occasionally erroneously set on
|
|
'some test hardware and/or test stations (sometimes CH4, sometimes CH8).
|
|
Call LOADMUX(0, CON%)
|
|
Call LOADMUX(1, CON%)
|
|
|
|
Call WRITEDVM(VODC$, MAXIN!) 'Sets meter to read
|
|
MAXINMEAS! = READDVM!(INRANGE! * 0.0001) '0.01% tolerance
|
|
While Abs(MAXIN!) > 10! And Abs(MAXIN!) - Abs(MAXINMEAS!) > 1
|
|
'Power supply current limit tripped
|
|
SL$ = SETPOWER(VINADDR%, Abs(MAXIN!), FUNC$) 'Set Vin
|
|
MAXINMEAS! = READDVM!(INRANGE! * 0.0001) '0.01% tolerance
|
|
Wend
|
|
Call LOADMUX(1, COFF%)
|
|
Else
|
|
MAXINMEAS! = MAXIN!
|
|
End If
|
|
End If
|
|
|
|
Call WRITEDVM("S1", 0) 'Medium reading rate
|
|
|
|
If (SNM% >= 3 And SNM% <= 6) And LIN% = 0 Then
|
|
'TC or RTD with linearity = 0 (output not linear with input).
|
|
OUTCALC! = VOUT!(MAXINMEAS! + PTCV!) + CALGN! * ORANGE!
|
|
ElseIf Left$(SPECS.MODNAME, 10) = "SCM5B-1369" Then
|
|
OUTCALC! = MAXOUT!
|
|
Else
|
|
'Other modules.
|
|
OUTCALC! = VOUT!(SENSORIN!(MAXINMEAS!, PTCV!)) + CALGN! * ORANGE!
|
|
End If
|
|
|
|
Call LOADMUX(2, CON%) 'Measure Vout
|
|
|
|
'Turn off and re-set mux because the mux is occasionally erroneously set on
|
|
'some test hardware and/or test stations (sometimes CH4, sometimes CH8).
|
|
Call LOADMUX(0, CON%)
|
|
Call LOADMUX(2, CON%)
|
|
|
|
Call WRITEDVM(VODC$, OUTCALC!)
|
|
|
|
If INTERACT! <> 1 Then
|
|
PFSMEAS! = READDVM!(0.0001)
|
|
'CALOS! is included in OSERR2! Convert OSERR2! to V.
|
|
OUTCALC! = PFSMEAS! - (1 / (1 - INTERACT!)) * (PFSMEAS! - OUTCALC! - ORANGE! * OSERR2! / 100!)
|
|
End If
|
|
|
|
If BANDWIDTH! < 1 Then
|
|
P! = 5
|
|
Else
|
|
P! = 0
|
|
End If
|
|
Call PAUSE(P!) 'Pause for filter settling
|
|
|
|
LOCATE 12, 10
|
|
Print "Gain Error = ";
|
|
Print Spc(20);
|
|
|
|
Do 'Start gain meas./adjust loop.
|
|
L% = L% + 1
|
|
ERROROUT! = (READDVM!(TOL!) - OUTCALC!) / CALSPAN! * 100! 'Error (%).
|
|
|
|
LOCATE 12, 24
|
|
Print USING; "+###.### %"; ERROROUT!
|
|
|
|
LOCATE 15, 10
|
|
If CAL% > 1 Then
|
|
CONREADS% = 5
|
|
ElseIf Abs(ERROROUT!) < GERROR! Then
|
|
SOUND 400, 0.5
|
|
Print "Stop turning gain potentiometer "
|
|
CONREADS% = CONREADS% + 1
|
|
ElseIf ERROROUT! < 0 Then
|
|
If DIRG% = 1 Then
|
|
DIREC$ = "CLOCKWISE "
|
|
Else
|
|
DIREC$ = "COUNTER-CLOCKWISE"
|
|
End If
|
|
Print "Turn gain potentiometer "; DIREC$
|
|
CONREADS% = 0
|
|
Else
|
|
If DIRG% = 1 Then
|
|
DIREC$ = "COUNTER-CLOCKWISE"
|
|
Else
|
|
DIREC$ = "CLOCKWISE "
|
|
End If
|
|
|
|
Print "Turn gain potentiometer "; DIREC$
|
|
CONREADS% = 0
|
|
End If
|
|
|
|
LOCATE 20, 10
|
|
A$ = INKEY$
|
|
If UCase$(A$) = "T" Then
|
|
Print Tab(10); "Trouble Shooting Mode"
|
|
Call WRITEDVM("*", OUTCALC!)
|
|
Call CONTINUE
|
|
Call WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
|
|
LOCATE 20, 10
|
|
Print Spc(22);
|
|
ElseIf UCase$(A$) = "C" Then
|
|
CONREADS% = 5
|
|
End If
|
|
Call PAUSE(0.1) 'Pause to slow down loop.
|
|
|
|
'Re-measure input once every 200 cycles. Exit if enough consecutive measurements match
|
|
'with their allow tolerance (CONREADS% is incremented when this happens).
|
|
Loop While CONREADS% < 5 And (L% < 200 Or CONREADS% < 5) 'End of gain meas./adjust loop.
|
|
Call LOADMUX(2, COFF%)
|
|
'Turn off module power if consecutive measurements within tolerance limit is
|
|
'not reached and it is a resistance-input module.
|
|
If SNM% >= 5 And SNM% <= 7 And CONREADS% < 5 Then Call POWERON(0)
|
|
Loop While CONREADS% < 5 'End of overall gain meas./cal. loop.
|
|
|
|
If CAL% <> 3 Then
|
|
If Abs(ERROROUT!) <= GERROR! Then
|
|
GN$ = "PASS"
|
|
Else
|
|
GN$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
End If
|
|
|
|
'LOCATE 15, 10
|
|
'PRINT "Status: "; GN$;
|
|
'CALL FAILSTATUS (GN$, 15, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 15, 10
|
|
Print Spc(30);
|
|
Print Tab(10); "Gain calibration error is";
|
|
Print Tab(50); USING; " +###.### %"; ERROROUT!
|
|
Print Tab(10); "Max. gain calibration error is";
|
|
Print Tab(50); USING; "+/-##.### %"; GERROR!
|
|
|
|
Call FAILSTATUS(GN$, 15, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
Else
|
|
GN$ = "PASS"
|
|
End If
|
|
|
|
GAINCAL$ = GN$ + Str$(ERROROUT!) + "2"
|
|
|
|
Call RESETTH 'Reset the test head
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function GENATTENR!()
|
|
|
|
'This routine is used for RTD or pot. input modules only.
|
|
'It determines the simulated RTD input to the module which
|
|
'serves as a voltage divider for the function generator.
|
|
'Series resistor from the function generator is 6.8Kohms.
|
|
'Design for function generator offset of -5V
|
|
|
|
IEXC! = SPECS.IEXC / 1000000! 'Convert to A
|
|
MININ! = SENSOROUT!(SPECS.MININ, 0) 'Determine min in
|
|
MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Determine max in
|
|
RMID! = (MAXIN! - MININ!) / 2 + MININ!
|
|
VOS! = -5
|
|
|
|
'Solve the quadratic equation ax^2 + bx + c = 0 where a,b,c are defined below.
|
|
|
|
A! = IEXC!
|
|
B! = IEXC! * (RFNGN! - RMID!) - VOS
|
|
C! = -1 * RFNGN! * IEXC! * RMID!
|
|
|
|
'determine the positive root
|
|
GENATTENR! = (-B + Sqr(B ^ 2 - 4 * A * C)) / (2 * A)
|
|
|
|
End Function
|
|
|
|
Sub GENSET(GENAMPL!)
|
|
|
|
MININ! = SENSOROUT!(SPECS.MININ, 0) 'Determine min in
|
|
MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Determine max in
|
|
INRANGE! = MAXIN! - MININ!
|
|
ATTEN! = SPECS.ATTEN
|
|
SNM% = SENSORNUM%
|
|
GENOS! = -5
|
|
|
|
If SNM% >= 5 And SNM% <= 7 Then 'Check if resistance in
|
|
IEXC! = SPECS.IEXC / 1000000! 'Convert to A
|
|
R! = GENATTENR! 'Find attenuator shunt R
|
|
GENOS! = -5
|
|
GENAMPL! = Int((IEXC! * INRANGE! * (RFNGN! + R!)) / R!)
|
|
' IF GENAMPL! < .5 * ABS(GENOS!) THEN GENAMPL! = 2.5 'HP33120A limit. Max offset
|
|
' IF GENAMPL! > 20 - 2 * ABS(GENOS!) THEN GENAMPL! = 20 - 2 * ABS(GENOS!)
|
|
|
|
ElseIf SNM% >= 1 And SNM% <= 3 Then 'Check if 5B392
|
|
ORANGE! = SPECS.MAXOUT! - SPECS.MINOUT!
|
|
'Set amplitude for > 5mV p-p signal out
|
|
UNATTENOUT! = 10 ^ (ATTEN! / 20) * 0.01
|
|
GENAMPL! = UNATTENOUT! / ORANGE! * INRANGE!
|
|
|
|
If GENAMPL! < 0.03 Then
|
|
GENAMPL! = 1
|
|
ElseIf GENAMPL! >= 0.03 And GENAMPL! < 5 Then
|
|
GENAMPL! = 5
|
|
Else
|
|
GENAMPL! = 10
|
|
End If
|
|
|
|
EXPNT% = 10 'first attenuator position
|
|
GATTEN! = INRANGE! / GENAMPL! 'Attenuator gain
|
|
GENOS! = (MININ! + INRANGE! / 2!) / GATTEN!
|
|
If GENAMPL! < 0.5 * Abs(GENOS!) Then
|
|
GENAMPL! = 0.5 * Abs(GENOS!)
|
|
End If
|
|
|
|
|
|
Else
|
|
ORANGE! = SPECS.MAXOUT! - SPECS.MINOUT!
|
|
'Set amplitude for > 5mV p-p signal out
|
|
UNATTENOUT! = 10 ^ (ATTEN! / 20) * 0.01
|
|
GENAMPL! = UNATTENOUT! / ORANGE! * INRANGE!
|
|
|
|
If GENAMPL! < 0.03 Then
|
|
GENAMPL! = 1
|
|
ElseIf GENAMPL! >= 0.03 And GENAMPL! < 5 Then
|
|
GENAMPL! = 5
|
|
Else
|
|
GENAMPL! = 10
|
|
End If
|
|
|
|
EXPNT% = 10 'first attenuator position
|
|
GATTEN! = INRANGE! / GENAMPL! * 2 'Attenuator gain
|
|
GENOS! = (MININ! + INRANGE! / 2!) / GATTEN!
|
|
If GENAMPL! < 0.5 * Abs(GENOS!) Then
|
|
GENAMPL! = 0.5 * Abs(GENOS!)
|
|
End If
|
|
End If
|
|
|
|
If GENAMPL! < 0.5 * Abs(GENOS!) Then GENAMPL! = 0.5 * Abs(GENOS!)
|
|
If GENAMPL! > 20 - 2 * Abs(GENOS!) Then GENAMPL! = 20 - 2 * Abs(GENOS!)
|
|
If Mid$(SPECS.MODNAME, 6, 7) = "41-1794" Then
|
|
GENAMPL! = 20
|
|
End If
|
|
|
|
Cls
|
|
LOCATE 5, 10
|
|
Print "Set the function generator as follows:"
|
|
LOCATE 10, 27
|
|
Print "Function Generator Settings"
|
|
Print Tab(27); "---------------------------"
|
|
Print Tab(31); USING; "Frequency: ##### Hz"; SPECS.TESTFREQ
|
|
Print Tab(31); USING; "Amplitude: ##.# V p-p"; GENAMPL!
|
|
Print Tab(31); USING; "DC Offset: +##.## V"; GENOS!
|
|
Call CONTINUE
|
|
|
|
End Sub
|
|
|
|
Sub GETADD(FILENAME$)
|
|
|
|
'LPT$ = parallel printer port used to control ATE
|
|
'MUX$ = multiplexer box address
|
|
'TESTHEAD$ = test head address
|
|
'PS2ADDR$ = Power Supply #2 address (high voltage input to DUT)
|
|
'PSPORTADDR$ = Power Supply serial port address
|
|
'DVM$ = DVM address
|
|
|
|
Open "C:\ATE\ADDR\" + FILENAME$ For Random As #3 Len = 15
|
|
FIELD #3, 3 AS LPT$, 2 AS MUX$, 2 AS TESTHEAD$, 2 AS DPSPS2ADDR$, 2 AS PSPORTADDR$, 2 AS DVM$, 2 AS ABCPS2ADDR$
|
|
GET #3
|
|
LPTADDR% = Val(LPT$)
|
|
MUXADDR% = Val(MUX$)
|
|
THADDR% = Val(TESTHEAD$)
|
|
DPSVINADDR% = Val(DPSPS2ADDR$) 'KEPCO DPS address
|
|
PSPORT% = Val(PSPORTADDR$)
|
|
DVMADDR% = Val(DVM$)
|
|
ABCVINADDR% = Val(ABCPS2ADDR$) 'KEPCO ABC address
|
|
Close #3
|
|
|
|
End Sub
|
|
|
|
Function GETPSID%()
|
|
Cls
|
|
LOCATE 3
|
|
Print Tab(10); "Identifying power supplies connected to test system"
|
|
Print
|
|
'****** First, assume KEPCO DPS125 for PSMODEL$ string assignment.
|
|
PSMODEL$ = "DPS125"
|
|
|
|
'****** KEPCO DPS VIN supply address for serial interface.
|
|
|
|
'****** Obtain Identification string from KEPCO DPS 125.
|
|
|
|
'****** Assign corresponding address obtained from address file dependent
|
|
'****** on if the Power supply is DPS125 or ABC125.
|
|
|
|
'****** Check for High Voltage Power Supply
|
|
|
|
Print Tab(20); "KEPCO DPS125 High-Voltage Input: ";
|
|
DPSVIN$ = POWERIO$(DPSVINADDR%, "ID")
|
|
|
|
If DPSVIN$ = "KEPCO DPS 125-0.5M" Then
|
|
VINADDR% = DPSVINADDR%
|
|
Print Tab(55); "Yes!"
|
|
Print
|
|
Call INITPS(DPSVINADDR%, VINILIMIT!, VINOVERV!)
|
|
DPSVINFLAG! = 1!
|
|
Else
|
|
Print Tab(55); "Not present"
|
|
DPSVINFLAG! = 0!
|
|
VINADDR% = 0!
|
|
End If
|
|
|
|
If DPSVINFLAG! = 0! Then
|
|
|
|
PSMODEL$ = "ABC125"
|
|
|
|
Print Tab(20); "KEPCO ABC-125 High-Voltage Input: ";
|
|
ABCVIN$ = READGPIB$(ABCVINADDR%, "*IDN?")
|
|
If Left$(ABCVIN$, 14) = "KEPCO,ABC-1251" Then
|
|
VINADDR% = ABCVINADDR%
|
|
Call INITPS(ABCVINADDR%, VINILIMIT!, VINOVERV!)
|
|
Print Tab(55); "Yes!"
|
|
Print
|
|
Else
|
|
Print Tab(55); "Not present"
|
|
Print
|
|
End If
|
|
End If
|
|
|
|
If VINADDR% = 0! Then
|
|
Print Tab(15); ">>>>>>>> No Power Supplies are connected <<<<<<<<"
|
|
'CALL CONTINUE
|
|
End If
|
|
|
|
GETPSID% = 99 'This has yet to be utilized. At this time there is
|
|
'no requirement to pass anything back to function call
|
|
End Function
|
|
|
|
Sub GETSPECS()
|
|
'Get module values from the database.
|
|
'
|
|
Dim POINTER%(1000)
|
|
|
|
Call SORTDB(ENDFLAG%)
|
|
|
|
If ENDFLAG% = 1 Then
|
|
SPECS.MODNAME = "EXIT"
|
|
Exit Sub
|
|
End If
|
|
|
|
Cls
|
|
'LOCATE , 30
|
|
Print "Model Selection Menu"
|
|
'PRINT TAB(30); "--------------------"
|
|
|
|
YINIT% = CSRLIN 'Initialize starting rows
|
|
|
|
Open "C:\ATE\5BDATA\DBSORT2.DAT" For Random As #2 Len = Len(SORTDATA1)
|
|
|
|
Do
|
|
I% = I% + 1
|
|
Get #2, I%, SORTDATA1
|
|
If SORTDATA1.RECNUM <> -1 Then NUMRECORD! = NUMRECORD! + 1
|
|
Loop While SORTDATA1.RECNUM <> -1
|
|
|
|
SCRNCTR% = 40 'display center
|
|
NUMCHAR% = 26 '20 char + 4 char for # + 2 spaces
|
|
NUMLINES! = 24 '# of lines for model display below header
|
|
NUMCOLUMNS! = 1 + Int(NUMRECORD! / NUMLINES!)
|
|
'Model # length = 20 characters max
|
|
'-> 3 columns max per screen
|
|
'3 columns x 26 char = 78 spaces
|
|
I% = 1
|
|
|
|
For C% = 0 To NUMCOLUMNS! - 1
|
|
Y% = YINIT%
|
|
TB% = SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + NUMCHAR% * C%
|
|
Do
|
|
Get #2, I%, SORTDATA1
|
|
If SORTDATA1.RECNUM <> -1 Then
|
|
POINTER%(I%) = SORTDATA1.RECNUM
|
|
LOCATE Y%, TB%
|
|
Print USING; "##.) &"; I%; SORTDATA1.MODNAME;
|
|
I% = I% + 1
|
|
Y% = Y% + 1
|
|
End If
|
|
Loop While SORTDATA1.RECNUM <> -1 And Y% - YINIT% < NUMLINES!
|
|
Next C%
|
|
|
|
LOCATE Y%, TB%
|
|
Print USING; "##.) Exit"; I%
|
|
|
|
Close #2
|
|
Close #1
|
|
Do
|
|
'LOCATE 25, SCRNCTR% - 18 / 2
|
|
LOCATE 1, SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + NUMCHAR% * (C% - 1)
|
|
Print "Enter Selection ";
|
|
INPUT SEL%
|
|
Loop While SEL% < 1 Or SEL% > I%
|
|
|
|
If SEL% = I% Then
|
|
SPECS.MODNAME = "EXIT"
|
|
Else
|
|
Open "C:\ATE\5BDATA\5BMAIN.DAT" For Random As #6 Len = Len(SPECS)
|
|
Get #6, POINTER%(SEL%), SPECS
|
|
Close #6
|
|
|
|
PCBNO$ = "1211.1212.1214" 'Set common PCB numbers.
|
|
|
|
|
|
'IF MID$(SPECS.MODNAME, 6, 7) = "41-1794" THEN
|
|
If Mid$(SPECS.MODNAME, 6, 7) = "41-1794" Or Mid$(SPECS.MODNAME, 6, 7) = "41-179X" Or Mid$(SPECS.MODNAME, 6, 7) = "41-1811" Then
|
|
Cls
|
|
LOCATE 10, 6
|
|
Print Tab(6); "*********************************************"
|
|
Print Tab(6); "*** TEST UNIT ON SCM5B GANG TESTER ONLY ****"
|
|
Print Tab(6); "*********************************************"
|
|
Call CONTINUE
|
|
SPECS.MODNAME = "EXIT-XXX"
|
|
ElseIf (SENSORNUM% = 1 And (SPECS.MAXIN >= 60 Or SPECS.MININ <= -60)) Then
|
|
Cls
|
|
LOCATE 10, 6
|
|
Print Tab(6); "*******************************************"
|
|
Print Tab(6); "***** TEST UNIT ON RMS STATION ONLY ******"
|
|
Print Tab(6); " ******* SELECT SCM5BHV FROM MENU ********"
|
|
Print Tab(6); "*******************************************"
|
|
Call CONTINUE
|
|
SPECS.MODNAME = "EXIT-XXX"
|
|
ElseIf SENSORNUM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
Cls
|
|
LOCATE 10, 5
|
|
Print "This module requires high voltage input."
|
|
Print
|
|
Print Tab(5); "Turn on the high voltage power supply and connect it to the test head."
|
|
Print
|
|
Print Tab(5); "DO NOT PROBE THE CIRCUITRY DURING TEST"
|
|
Print
|
|
Print Tab(5); "Remove the yellow connector from the meter +/-SENSE terminals."
|
|
Call CONTINUE
|
|
'****** Obtain communication with either DPS125 or ABC125 KEPCO power supply
|
|
'****** and assign appropriate PSMODEL$ and VINADDR%.
|
|
PSCOUNTER! = 0 '03/18/08 TSO
|
|
While PSFLAG! = 0 And PSCOUNTER! <> 3
|
|
PSID% = GETPSID% 'Determine and initiate communication with Power supply
|
|
If VINADDR% <> 2 And VINADDR% <> 6 Then
|
|
LOCATE 10, 12: Print "A High Voltage Power Supply must be connected"
|
|
LOCATE 12, 10: Print "Attach either a KEPCO DPS-125 Power Supply as address 2"
|
|
LOCATE 13, 25: Print "or"
|
|
LOCATE 14, 7: Print "If system is KEPCO ABC-125 Compliant, attach this supply"
|
|
LOCATE 15, 7: Print "and set to address 6"
|
|
PSCOUNTER! = PSCOUNTER! + 1
|
|
Call CONTINUE
|
|
Else
|
|
PSFLAG! = 1
|
|
End If
|
|
Wend
|
|
End If
|
|
|
|
If Mid$(SPECS.MODNAME, 10, 4) = "1442" Or Mid$(SPECS.MODNAME, 10, 4) = "1443" Then
|
|
Call REMEXCPIN(1) 'Disconnect +EXC from the test interface board
|
|
End If
|
|
End If
|
|
|
|
'MAXINVAR! = MAXINVAL! 'Set maximum module input value variable.
|
|
MAXINVAR! = 0! 'Set to zero to revert to using VOLTAGE! for DAC accuracy (PWR 2014-11-04).
|
|
|
|
SEL% = POINTER%(SEL%) 'pass back to main code for use in SAVEDATA
|
|
|
|
End Sub
|
|
|
|
Function IEXC1$(IEXCSENSE!)
|
|
'This routine tests current source I1 (-IN lead)
|
|
'4-wire input modules use this current source.
|
|
'
|
|
IEXC! = SPECS.IEXC 'Excitation current (uA)
|
|
IEXCTOL! = 0.016 'Initial tolerance = +/-1.6%
|
|
SNM% = SENSORNUM%
|
|
|
|
Cls
|
|
TESTTITLE$ = "Excitation Current Source #1 Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
If SNM% < 5 Or SNM% > 7 Then 'Check if resistance in
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Call CONTINUE
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait..."
|
|
End If
|
|
|
|
If SNM% = 5 Or SNM% = 7 Then 'Check for 3-wire input
|
|
'IEXCsense was measured in Iexc2
|
|
Call SETTEST(1) 'Route I1 through sense R
|
|
|
|
Call LOADMUX(4, CON%) 'check for initial value of
|
|
'I1 within spec
|
|
Call WRITEDVM(VODC$, IEXCSENSE! * IEXC! * 0.000001)
|
|
IMINUSIN! = READDVM(0.001) / IEXCSENSE! * 1000000! 'Excitation current (uA)
|
|
|
|
Else '4-wire input
|
|
'Above test for 3-wire modules will
|
|
'saturate 4-wire modules at the + rail
|
|
CONTRES! = 0 'Output is close enough without measuring
|
|
MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Calc. +f.s. ohms
|
|
Call OHMSET(MAXIN!) 'Set +f.s. input
|
|
MAXINMEAS! = MEASRES!(MAXIN!, 3, "") + CONTRES! 'Measure simulated resistor
|
|
'Test 2 set in MEASRES!
|
|
Call POWERON(5!) 'Set Vs = 5.0V
|
|
Call LOADMUX(1, CON%) 'Measure input voltage
|
|
Call WRITEDVM(VODC$, MAXIN! * IEXC!)
|
|
MEASVIN! = READDVM(MAXIN! * IEXC! * 0.0005) '.05% tolerance
|
|
IMINUSIN! = MEASVIN! / MAXINMEAS! * 1000000! '(uA)
|
|
End If
|
|
|
|
If IMINUSIN! < 25 Then 'Check if I1 is working
|
|
IEXC! = 99
|
|
I1STAT$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
LOCATE 10, 10
|
|
Print "Current source I1 (-IN terminal) is not working."
|
|
Call CONTINUE
|
|
ElseIf Abs(IMINUSIN! - IEXC!) > IEXC! * IEXCTOL! Then
|
|
I1STAT$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
LOCATE 10, 10
|
|
Print "Current source I1 is out of tolerance."
|
|
Print Tab(10); "Check tantalum capacitor for reverse leakage."
|
|
Print Tab(10); "Check current source resistor, diode, transistor and amplifier."
|
|
Call CONTINUE
|
|
Else
|
|
I1STAT$ = "PASS"
|
|
End If
|
|
|
|
'LOCATE 9, 10
|
|
'PRINT "Status: "; I1STAT$;
|
|
'CALL FAILSTATUS (I1STAT$, 9, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 10, 10
|
|
Print Tab(10); "Measured value of I1 (-IN terminal) is";
|
|
Print Tab(50); USING; "####.# uA"; IMINUSIN!
|
|
Print Tab(10); "Required value of I1 is";
|
|
Print Tab(50); USING; "####.# uA +/- ##.# uA"; IEXC!; IEXC! * IEXCTOL!
|
|
|
|
Call FAILSTATUS(I1STAT$, 9, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
'IF I1STAT$ = "FAIL" THEN CALL CONTINUE 'Pause to read note
|
|
|
|
Call LOADMUX(4, COFF%)
|
|
IEXC1$ = I1STAT$ + Str$(IMINUSIN!) + "1"
|
|
|
|
Call RESETTH 'Reset the test head
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function IEXC2$(IEXCSENSE!)
|
|
'This routine tests current source I2 (+IN lead)
|
|
'4-wire input modules do not use this current source.
|
|
'
|
|
IEXC! = SPECS.IEXC 'Excitation current uA
|
|
IEXCTOL! = 0.016 'Initial tolerance = +/-1.6%
|
|
RIN! = 100 'Fixed input resistance
|
|
|
|
Cls
|
|
TESTTITLE$ = "Excitation Current Source #2 Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% < 5 Or SNM% > 7 Then 'Check if resistance in
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Call CONTINUE
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait..."
|
|
End If
|
|
|
|
IEXCSENSE! = MEASRES!(IEXCSEN!, 2, "")
|
|
|
|
Call OHMSET(1E+30) 'Set input R = infinity
|
|
Call SETTEST(0) 'Route I2 through sense R
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
Call LOADMUX(1, CON%) 'Measure differential input
|
|
'voltage to check sense
|
|
'resistor matching
|
|
Call WRITEDVM(VODC$, 0.05)
|
|
DIFFIN! = Abs(READDVM(0.001))
|
|
If DIFFIN! > 10 Then 'Meter overrange, I2 is not working
|
|
IEXC! = 99
|
|
I2STAT$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
LOCATE 10, 10
|
|
Print "Current source I2 (+IN terminal) is not working."
|
|
Call CONTINUE
|
|
ElseIf DIFFIN! > IEXC! * RIN! * 1.1 Then 'Current source sense resistors
|
|
IEXC! = 99 'are out of matching tolerance
|
|
I2STAT$ = "FAIL" '10% tolerance
|
|
SOUND 1000, 0.5
|
|
LOCATE 10, 10
|
|
Print "Current source sense resistors are out of matching tolerance."
|
|
Print Tab(10); "Please notify engineering."
|
|
Call CONTINUE
|
|
End If
|
|
|
|
Call LOADMUX(1, COFF%)
|
|
|
|
If I2STAT$ <> "FAIL" Then
|
|
Call LOADMUX(4, CON%) 'check for initial value of
|
|
'I2 within spec
|
|
Call WRITEDVM(VODC$, IEXCSENSE! * IEXC! * 0.000001)
|
|
IPLUSIN! = READDVM(0.001) / IEXCSENSE! * 1000000! 'Excitation current (uA)
|
|
|
|
If Abs(IPLUSIN! - IEXC!) <= IEXC! * IEXCTOL! Then
|
|
I2STAT$ = "PASS"
|
|
Else
|
|
I2STAT$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
LOCATE 10, 10
|
|
Print "Current source I2 is out of tolerance."
|
|
Print Tab(10); "Check tantalum capacitor for reverse leakage."
|
|
Print Tab(10); "Check current source resistor, diode, transistor and amplifier."
|
|
End If
|
|
|
|
'LOCATE 10, 10
|
|
'PRINT "Status: "; I2STAT$;
|
|
'CALL FAILSTATUS (I2STAT$, 10, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 11, 10
|
|
Print Tab(10); "Measured value of I2 (+IN terminal) is";
|
|
Print Tab(50); USING; "####.# uA"; IPLUSIN!
|
|
Print Tab(10); "Required value of I2 is";
|
|
Print Tab(50); USING; "####.# uA +/- ##.# uA"; IEXC!; IEXC! * IEXCTOL!
|
|
|
|
Call FAILSTATUS(I2STAT$, 10, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
Call LOADMUX(4, COFF%)
|
|
|
|
End If
|
|
|
|
'IF I2STAT$ = "FAIL" THEN CALL CONTINUE 'Pause to read note
|
|
|
|
IEXC2$ = I2STAT$ + Str$(IPLUSIN!) + "1"
|
|
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function IMATCH$(I1$, I2$)
|
|
'Current sources must be matched to a specified tolerance to
|
|
'guarantee the lead resistance effect spec.
|
|
'This test is not applicable to 4-wire input modules
|
|
'
|
|
IEXC! = SPECS.IEXC 'Excitation current (uA)
|
|
IMATCHTOL! = SPECS.IMATCHTOL! / 100 'Convert to percent
|
|
|
|
'extract measured data (uA).
|
|
IPLUSIN! = Val(Mid$(I1$, 5, Len(I1$) - 5))
|
|
IMINUSIN! = Val(Mid$(I2$, 5, Len(I2$) - 5))
|
|
|
|
Cls
|
|
TESTTITLE$ = "Excitation Current Source Matching Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
DIFF! = IPLUSIN! - IMINUSIN!
|
|
If Abs(DIFF!) <= IMATCHTOL! * IEXC! Then
|
|
IMSTAT$ = "PASS"
|
|
Else
|
|
IMSTAT$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
LOCATE 10, 10
|
|
Print "Current source matching is out of tolerance."
|
|
Print Tab(10); "Check tantalum capacitors for reverse leakage."
|
|
Print Tab(10); "Check current source resistors for matching."
|
|
End If
|
|
|
|
'LOCATE 10, 10
|
|
'PRINT "Status: "; IMSTAT$;
|
|
'CALL FAILSTATUS (IMSTAT$, 10, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 11, 10
|
|
Print Tab(10); "Measured current source matching is";
|
|
Print Tab(50); USING; " +###.# uA"; DIFF!
|
|
Print Tab(10); "Required matching is";
|
|
Print Tab(50); USING; "+/-###.# uA"; IMATCHTOL! * IEXC!
|
|
|
|
Call FAILSTATUS(IMSTAT$, 10, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
IMATCH$ = IMSTAT$ + Str$(DIFF!) + "1"
|
|
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Sub INDIVID(SEL%, CAL%)
|
|
'Individual tests.
|
|
'
|
|
Dim TSIM!(102), OUTCALC!(102), OUTMEAS!(102), ERROROUT!(102), ACCSTAT$(102)
|
|
|
|
If SENSOROUT!(SPECS.MININ, 0) = 99! Then 'Check for valid sensor type
|
|
Print Tab(10); "Exiting INDIVID for invalid sensor type!."
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
Call CONTINUE
|
|
Exit Sub
|
|
End If
|
|
|
|
Call ENABLE(CON%) 'Enable output switch
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% = 11 Then
|
|
HALFBRIDGE% = 1 'Enable shunt input cap.
|
|
CB1VAL% = CB1VAL% And &HFB '1 1 1 1 1 0 1 1
|
|
Call SETTH(CB1VAL%, CB1%)
|
|
Else
|
|
HALFBRIDGE% = 0
|
|
End If
|
|
|
|
If Left$(SPECS.MODNAME, 12) = "SCM5B38-1146" Then
|
|
Call CASEINST 'Tell user to install a case over the unit
|
|
End If
|
|
|
|
Do
|
|
Select Case SEL%
|
|
Case 1
|
|
A$ = SUPPLYI$(0) 'power is off
|
|
Case 2
|
|
A$ = SUPPLYI$(1) 'power is off
|
|
Case 3
|
|
Cls
|
|
TESTTITLE$ = "Current Source Operation and Matching"
|
|
Call HEADERB(TESTTITLE$)
|
|
If SNM% = 5 Or SNM% = 7 Then
|
|
B$ = IEXC2$(IEXCSENSE!)
|
|
A$ = IEXC1$(IEXCSENSE!)
|
|
C$ = IMATCH$(A$, B$)
|
|
Call POWERON(0!) 'Set Vsupply to 0V
|
|
Call RESETTH 'Reset for standard operation
|
|
ElseIf SNM% = 6 Then
|
|
A$ = IEXC1$(IEXCSENSE!)
|
|
Call POWERON(0!) 'Set Vsupply to 0V
|
|
Call RESETTH 'Reset for standard operation
|
|
Else
|
|
LOCATE 10, 10
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Call CONTINUE
|
|
Exit Do
|
|
End If
|
|
Case 4
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = OUTSWITCH$
|
|
Case 5
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
Cls
|
|
LOCATE 10, 10
|
|
INPUT "Has the module been calibrated"; ASK$
|
|
If UCase$(ASK$) = "N" Then
|
|
Call CALSEQ(CAL%)
|
|
End If
|
|
A$ = CJCGAIN$
|
|
Case 6
|
|
CALCOUNT% = 0
|
|
Do 'Stay in loop until exit
|
|
If CALCOUNT% = 0 Then
|
|
SEL2% = 1 'Go to offset/gain cal at start
|
|
Else
|
|
SEL2% = CALMENU% 'Ask user what to do next
|
|
End If
|
|
Select Case SEL2% 'select off/gain cal, acc/lin or exit
|
|
Case 1 'offset/gain cal
|
|
Call CALSEQ(CAL%)
|
|
FIN$ = "N"
|
|
Call CONTINUE
|
|
Case 2
|
|
If SNM% >= 5 And SNM% <= 7 Then 'Check if resistance in
|
|
Call POWERON(0!) 'Turn off power
|
|
Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
|
|
End If
|
|
A$ = LINTEST$(ACC$, CONTRES!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
|
|
FIN$ = "N"
|
|
Call CONTINUE
|
|
Case 3 'Exit to individual menu
|
|
FIN$ = "Y"
|
|
End Select
|
|
CALCOUNT% = CALCOUNT% + 1
|
|
Loop While FIN$ <> "Y"
|
|
|
|
Case 7
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = EXCCAL$(0)
|
|
Case 8
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = EXCREG$
|
|
B$ = VOREG$
|
|
Case 9
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = EXCILIM$
|
|
Case 10
|
|
If SNM% >= 5 And SNM% <= 7 Then 'Check if resistance in
|
|
Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
|
|
End If
|
|
A$ = LINTEST$(ACC$, CONTRES!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
|
|
Case 11
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = LEADREFF$(TOTLRESPEC!)
|
|
Case 12
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = SUPPLYSEN$
|
|
Case 13
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = INPUTR$
|
|
Case 14
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = OPENIN$
|
|
Case 15
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
Call GENSET(GENAMPL!)
|
|
A$ = FREQRESP$(GENAMPL!)
|
|
Case 16
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = STEPRESP$
|
|
Case 17
|
|
Call POWERON(5!) 'Set Vsupply to 5.0V
|
|
A$ = OUTNOISE$
|
|
End Select
|
|
|
|
SELECTION% = SEL%
|
|
|
|
If SELECTION% <> 6 Then 'If not doing offset/gain cal
|
|
Call CONTINUE
|
|
Call POWERON(0!) 'Turns off module power
|
|
RESP$ = REPEAT$(SPECS.MODNAME)
|
|
Else 'For offset/gain cal
|
|
Call POWERON(0!) 'Turns off module power
|
|
RESP$ = "N"
|
|
End If
|
|
|
|
Loop While RESP$ <> "N"
|
|
|
|
If SNM% = 1 And (SPECS.MAXIN > 10 Or SPECS.MININ < -10 Or SPECS.OSCALIN < -10) Then
|
|
Print
|
|
Print Tab(5); "Insert the yellow connector into the meter +/-SENSE terminals."
|
|
Call CONTINUE
|
|
End If
|
|
|
|
If HALFBRIDGE% = 1 Then 'Disable shunt input cap.
|
|
CB1VAL% = CB1VAL% Or &H4 '0 0 0 0 0 1 0 0
|
|
Call SETTH(CB1VAL%, CB1%)
|
|
End If
|
|
|
|
If Mid$(SPECS.MODNAME, 10, 4) = "1442" Or Mid$(SPECS.MODNAME, 10, 4) = "1443" Then 'units with +EXC and -IN shorted
|
|
Call REMEXCPIN(0) 'Reconnect +EXC from the test interface board
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Function INPUTR$()
|
|
|
|
MAXIN! = SPECS.MAXIN '+f.s. input voltage (V)
|
|
MININ! = SPECS.MININ '-f.s. input voltage (V)
|
|
MAXOUT! = SPECS.MAXOUT
|
|
MINOUT! = SPECS.MINOUT
|
|
|
|
SPEC! = SPECS.INPUTRES 'Meg ohms
|
|
|
|
INRANGE! = MAXIN! - MININ!
|
|
ORANGE! = MAXOUT! - MINOUT!
|
|
|
|
Cls
|
|
TESTTITLE$ = "Input Resistance & Bias Current Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
If SENSORNUM% <> 1 Or MAXIN! > 10! Then 'Check for V in and |Vmax| <= 10V
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait."
|
|
End If
|
|
|
|
Call SETDAC(MAXIN!, 1, MAXINVAR!, 0) 'Sets DAC
|
|
|
|
' CALL LOADMUX(2, CON%) 'Measure Vout
|
|
' CALL WRITEDVM(VODC$, MAXOUT!)
|
|
' VO1! = READDVM!(.001)
|
|
|
|
CB0VAL% = CB0VAL% Or &H4 '0 0 0 0 0 1 0 0
|
|
Call SETTH(CB0VAL%, CB0%) 'Insert 5.1Mohm resistor
|
|
'in series with input.
|
|
|
|
Call LOADMUX(2, CON%) 'Turns on mux, reset with resistor insert
|
|
Call WRITEDVM(VODC$, MAXOUT!)
|
|
VO2! = READDVM!(0.001) 'Output voltage (V)
|
|
Call LOADMUX(2, COFF%)
|
|
|
|
' DELTAVO! = (VO2! - VO1!) * 1000! 'Output change (mV)
|
|
' MAXDELTA! = (MAXOUT! - VOUT!((SPEC! / (SPEC! + RSERIES!)) * MAXIN!)) * 1000!'max change (mV)
|
|
|
|
PEDOS! = VOUT!(0!)
|
|
GAIN! = ORANGE! / INRANGE!
|
|
RINMEAS! = Abs((VO2! - PEDOS!) * RSERIES! / (MAXIN! * GAIN! - VO2!) / 1000000!)
|
|
|
|
If RINMEAS! > 1000 Then RINMEAS! = 1000
|
|
|
|
If RINMEAS! >= SPEC! Then
|
|
INR$ = "PASS"
|
|
Else
|
|
INR$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
End If
|
|
|
|
'LOCATE 10, 10
|
|
'PRINT "Status: "; INR$;
|
|
'CALL FAILSTATUS (INR$, 10, 10, "Status: ") 'Print test status to screen
|
|
|
|
LOCATE 10, 10
|
|
Print Spc(20);
|
|
Print Tab(10); "Measured input resistance is";
|
|
Print Tab(50); USING; " #### Mohms"; RINMEAS!
|
|
Print Tab(10); "Required input resistance is";
|
|
Print Tab(50); USING; ">= #### Mohms"; SPEC!
|
|
|
|
Call FAILSTATUS(INR$, 10, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
INPUTR$ = INR$ + Str$(RINMEAS!) + "0"
|
|
|
|
Call RESETTH 'Reset the test head
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function LEADREFF$(TOTLRESPEC!)
|
|
|
|
'Test the effects of adding a 3.3 ohm series lead resistance in
|
|
'the +IN and -IN leads. Series resistance is not added in the +EXC
|
|
'line because this only produces a common mode shift.
|
|
'LRE is not tested for 4-wire input modules because 3.3 ohms would produce
|
|
'and insignificant effect and LRE rejection is inherent by design.
|
|
|
|
SPEC! = SPECS.LEADRERR 'deg. C/ohm or ohm/ohm
|
|
LOWOHM! = SENSOROUT!(SPECS.MININ, 0) 'Convert Tin to ohms in
|
|
HIGHOHM! = SENSOROUT!(SPECS.MAXIN, 0) 'Convert Tin to ohms in
|
|
MAXOUT! = SPECS.MAXOUT
|
|
IMATCHTOL! = SPECS.IMATCHTOL!
|
|
ORANGE! = SPECS.MAXOUT - SPECS.MINOUT
|
|
INRANGE! = SPECS.MAXIN - SPECS.MININ
|
|
|
|
Cls
|
|
TESTTITLE$ = "Lead Resistance Effects Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
LOCATE 10, 10
|
|
|
|
SNM% = SENSORNUM%
|
|
|
|
If SNM% <> 5 Or SNM% <> 7 Then 'Check if 3-wire resistance in
|
|
Print "This test is not performed on model "; SPECS.MODNAME
|
|
Exit Function
|
|
Else
|
|
Print "Testing, please wait..."
|
|
End If
|
|
|
|
GAIN! = ORANGE! / INRANGE! 'V/C OR V/OHM
|
|
RLEAD! = 3.3 '3.3 ohm series R
|
|
IEXCERR! = IMATCHTOL! * RLEAD! / (HIGHOHM! - LOWOHM!) 'Error from current source mismatch, % span
|
|
RLEADERR! = 0.05 * RLEAD! / (HIGHOHM! - LOWOHM!) 'Error from mismatch in 3.3 ohm resistors in test head
|
|
'Assumes +/-2.5% matching
|
|
TOTLRESPEC! = SPEC! + (IEXCERR! + RLEADERR!) * INRANGE! / RLEAD!
|
|
'C/OHM + % * C / OHM
|
|
|
|
Call OHMSET(HIGHOHM!) 'Set input R = plus f.s.
|
|
Call SETTEST(5) 'Move +EXC to RTD (relay
|
|
' contact R in each lead)
|
|
Call LOADMUX(2, CON%) 'Measure Vout
|
|
Call WRITEDVM(VODC$, MAXOUT!)
|
|
VOUTNOR! = READDVM(0.0001) 'Output voltage, no series R (V)
|
|
|
|
Call SETTEST(4) 'Insert series R in each lead
|
|
|
|
Call LOADMUX(2, CON%) 'Measure Vout
|
|
VOUTR! = READDVM(0.0001) 'Output voltage, with series R (V)
|
|
Call LOADMUX(2, COFF%)
|
|
LRE! = (VOUTR! - VOUTNOR!) / GAIN! / RLEAD!
|
|
|
|
If Abs(LRE!) <= TOTLRESPEC! Then
|
|
LRE$ = "PASS"
|
|
Else
|
|
LRE$ = "FAIL"
|
|
SOUND 1000, 0.5
|
|
Print
|
|
Print Tab(10); "Check the current source matching."
|
|
End If
|
|
|
|
If SNM% = 7 Then 'Choose units for output
|
|
IN$ = "ohm" 'Pot in
|
|
Else
|
|
IN$ = "C" 'RTD in
|
|
End If
|
|
|
|
LOCATE 10, 10
|
|
Print Spc(20);
|
|
Print Tab(10); "Measured lead resistance effect is";
|
|
PRINT TAB(50); USING " +##.## &/ohm"; LRE!; IN$
|
|
Print Tab(10); "Required lead resistance effect is";
|
|
PRINT TAB(50); USING "+/-##.## &/ohm"; TOTLRESPEC!; IN$
|
|
|
|
Call FAILSTATUS(LRE$, 10, 10, "Status: ", 30) 'Print test status to screen
|
|
|
|
LEADREFF$ = LRE$ + Str$(LRE!) + "2"
|
|
|
|
Call RESETTH 'Reset the test head
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Function LINTEST$(ACC$, CONTRES!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
|
|
'Accuracy/linearity test.
|
|
'
|
|
SENSOR$ = SPECS.SENTYPE
|
|
MININ! = SPECS.MININ
|
|
MAXIN! = SPECS.MAXIN
|
|
MINOUT! = SPECS.MINOUT
|
|
MAXOUT! = SPECS.MAXOUT
|
|
MAXLINERR! = SPECS.LINEAR '%
|
|
MAXACCERR! = SPECS.ACCURACY '%
|
|
BANDWIDTH! = SPECS.BANDWIDTH
|
|
LIN% = SPECS.LINEARIZED
|
|
|
|
CALOS! = SPECS.OSCALPT / 100 '%
|
|
INRANGE! = SENSOROUT!(SPECS.MAXIN!, 0) - SENSOROUT!(SPECS.MININ!, 0)
|
|
ORANGE! = MAXOUT! - MINOUT! 'Output range (V)
|
|
|
|
Cls
|
|
TESTTITLE$ = "Accuracy Test"
|
|
Call HEADERB(TESTTITLE$)
|
|
SNM% = SENSORNUM%
|
|
|
|
Print
|
|
Print Tab(21); "Calculated"; Tab(38); "Measured"
|
|
If SNM% >= 3 And SNM% <= 6 Then 'Temperature input modules
|
|
Print Tab(6); "Temp. (C)";
|
|
ElseIf SNM% = 2 Or SNM% = 9 Then 'Current input modules
|
|
Print Tab(6); "Iin (mA)";
|
|
INSCALE! = 1
|
|
ElseIf SNM% = 7 Then 'Resistance input modules
|
|
Print Tab(5); "Rin (ohms)";
|
|
Else
|
|
If MAXIN! >= 1 Then
|
|
Print Tab(7); "Vin (V)";
|
|
INSCALE! = 1
|
|
Else
|
|
Print Tab(6); "Vin (mV)";
|
|
INSCALE! = 1000
|
|
End If
|
|
End If
|
|
Print Tab(22); "Vout (V)"; Tab(39); "Vout (V)";
|
|
Print Tab(53); "Error (%)"; Tab(69); "Status"
|
|
Print Tab(5); "=========="; Tab(21); "=========="; Tab(37); "==========";
|
|
Print Tab(53); "========="; Tab(68); "========"
|
|
|
|
'Output format
|
|
'1 10 20 30 40 50 60 70 80
|
|
' | | | | | | | |
|
|
'Rin (ohms)
|
|
' Temp. (C)
|
|
' Iin (mA) Calculated Measured
|
|
' Vin (V) Vout (V) Vout (V) Error (%) Status
|
|
'========== ========== ========== ========= ========
|
|
' #####.## +##.### +##.### +###.###
|
|
' +####.## +##.### +##.### +###.###
|
|
' +###.### +##.### +##.### +###.### PASS
|
|
|
|
If PON% = 1 Then
|
|
LPRINT TAB(34); "ACCURACY TEST"
|
|
LPRINT
|
|
LPRINT TAB(21); "Calculated"; TAB(38); "Measured"
|
|
If SNM% >= 3 And SNM% <= 6 Then 'Temperature input modules
|
|
LPRINT TAB(6); "Temp. (C)";
|
|
ElseIf SNM% = 2 Or SNM% = 9 Then 'Current input modules
|
|
LPRINT TAB(6); "Iin (mA)";
|
|
ElseIf SNM% = 7 Then 'Resistance input modules
|
|
LPRINT TAB(5); "Rin (ohms)";
|
|
Else
|
|
If MAXIN! >= 1 Then
|
|
LPRINT TAB(7); "Vin (V)";
|
|
Else
|
|
LPRINT TAB(6); "Vin (mV)";
|
|
End If
|
|
End If
|
|
LPRINT TAB(22); "Vout (V)"; TAB(38); "Vout (V)*";
|
|
LPRINT TAB(53); "Error (%)"; TAB(69); "Status"
|
|
LPRINT TAB(5); "=========="; TAB(21); "=========="; TAB(37); "==========";
|
|
LPRINT TAB(53); "========="; TAB(68); "========"
|
|
End If
|
|
|
|
INC% = 0 'Array element
|
|
NUMPTS% = 5 'Number of points in test
|
|
'Optional statements for file output
|
|
If LOGDAT% > 0 Then
|
|
INPUT "Enter the number of points to be tested "; NUMPTS%
|
|
INPUT "Enter file name "; F$
|
|
F$ = "C:\QB45\JJM\" + F$
|
|
Open F$ For Output As #3
|
|
Write #3, (MAXIN! - MININ!)
|
|
Write #3, MININ!
|
|
Write #3, NUMPTS%
|
|
End If
|
|
|
|
FAILED% = 0
|
|
|
|
LINSTEP! = (MAXIN! - MININ!) / (NUMPTS% - 1) 'Step size
|
|
|
|
For MODIN! = MININ! To MAXIN! + LINSTEP! / 2 Step LINSTEP!
|
|
'LINSTEP!/2 ensures NUMPTS% test point
|
|
INC% = INC% + 1
|
|
LOOP1:
|
|
L% = L% + 1
|
|
If SNM% >= 5 And SNM% <= 7 Then 'Check if resistance in
|
|
RIN! = SENSOROUT!(MODIN!, 0) 'Calc. ohms
|
|
Call OHMSET(RIN! - CONTRES!) 'Set input
|
|
Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
MEASIN! = MEASRES!(RIN!, 3, "") + CONTRES! 'Measure simulated resistor
|
|
Call POWERON(5!) 'Set Vsupply = 5V
|
|
INPUTERR! = 100! * (MEASIN! - RIN!) / INRANGE!
|
|
Else
|
|
If INC% = 1 Then
|
|
Call POWERON(5!) 'Set Vsupply = 5V
|
|
If SNM% = 3 Then
|
|
PTCV! = PARASITICTCV!(VCJC!)
|
|
If VCJC! = 99! Then
|
|
Print Tab(10); "Error in LINTEST$ test:"
|
|
Print Tab(10); "Vcjc = 99 (error value)!"
|
|
BF$ = "FAIL" 'Set FAIL status.
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
LINTEST$ = BF$ 'Set function output to FAIL status.
|
|
Call FAILSTATUS(BF$, 18, 10, "Linearity status: ", 30) 'Print test status to screen
|
|
Exit Function
|
|
End If
|
|
Else
|
|
PTCV! = 0
|
|
End If
|
|
End If
|
|
VIN! = SENSOROUT!(MODIN!, PTCV!)
|
|
Call SETDAC(VIN!, 1, MAXINVAR!, 0) 'Sets input voltage
|
|
Call WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
|
|
Call LOADMUX(1, CON%)
|
|
Call LOADMUX(0, CON%) 'Mux erroneously set on Station 3.
|
|
'Sometimes CH4, sometimes CH8
|
|
Call LOADMUX(1, CON%) 'Measure Vout
|
|
Call WRITEDVM(VODC$, VIN!) 'Sets meter to read
|
|
MEASIN! = READDVM!(INRANGE! * 0.0001) '0.01% tolerance
|
|
While Abs(VIN!) > 10 And (Abs(VIN!) - Abs(MEASIN!)) > 1
|
|
'Power supply current limit tripped
|
|
SL$ = SETPOWER(VINADDR%, Abs(VIN!), FUNC$) 'Set Vin
|
|
MEASIN! = READDVM!(INRANGE! * 0.0002) '0.02% tolerance
|
|
Wend
|
|
Call LOADMUX(1, COFF%)
|
|
'Set input set/meas. error as % of input range. (measured minus set over the input range).
|
|
INPUTERR! = 100! * (MEASIN! - VIN!) / INRANGE!
|
|
End If
|
|
|
|
'Force into error value (for debug).
|
|
If FORCEACCLINFAIL% = 1 Then
|
|
INPUTERR! = 20! 'Error value.
|
|
End If
|
|
|
|
Call WRITEDVM("S1", 0)
|
|
|
|
TSIM!(INC%) = SENSORIN!(MEASIN!, PTCV!)
|
|
If (SNM% >= 3 And SNM% <= 6) And LIN% = 0 Then
|
|
OUTCALC!(INC%) = VOUT!(MEASIN! + PTCV!) 'Output not linear with input
|
|
Else 'temperature.
|
|
OUTCALC!(INC%) = VOUT!(TSIM!(INC%))
|
|
End If
|
|
|
|
Call LOADMUX(2, CON%)
|
|
Call LOADMUX(0, CON%) 'Mux erroneously set on Station 3.
|
|
'Sometimes CH4, sometimes CH8
|
|
Call LOADMUX(2, CON%) 'Measure Vout
|
|
|
|
If INC% = 1 And CALOS! > 0.03 Then
|
|
'Prevents meter from overranging for module that have a offset calibration point higher than 3%
|
|
Call WRITEDVM(VODC$, OUTCALC!(INC%) + CALOS! * ORANGE!)
|
|
Else
|
|
Call WRITEDVM(VODC$, OUTCALC!(INC%)) 'Sets meter to read output
|
|
End If
|
|
|
|
If BANDWIDTH! < 1 Then
|
|
P! = 5 '10
|
|
ElseIf MAXACCERR! <= 0.035 Then
|
|
P! = 2 '3
|
|
ElseIf SNM% >= 5 And SNM% <= 7 Then 'Check if resistance in
|
|
P! = 2 'Module settling after power on.
|
|
Else
|
|
P! = 0
|
|
End If
|
|
Call PAUSE(P!) 'Pause for filter settling
|
|
|
|
OUTMEAS!(INC%) = READDVM!(0.00005 * ORANGE!)
|
|
ERROROUT!(INC%) = (OUTMEAS!(INC%) - OUTCALC!(INC%)) / ORANGE! * 100! 'Error (%)
|
|
|
|
If Abs(VIN!) > 10 And Abs(ERROROUT!(INC%)) > 100 Then 'Power supply current limit tripped
|
|
SL$ = SETPOWER(VINADDR%, Abs(VIN!), FUNC$) 'Set Vin
|
|
OUTMEAS!(INC%) = READDVM!(0.00005 * ORANGE!)
|
|
ERROROUT!(INC%) = (OUTMEAS!(INC%) - OUTCALC!(INC%)) / ORANGE! * 100! 'Error (%)
|
|
End If
|
|
|
|
If LOGDAT% > 0 Then Write #3, ERROROUT!(INC%) / 100! * ORANGE! * 1000! ' Convert to mV.
|
|
Call LOADMUX(2, COFF%)
|
|
|
|
If Abs(VIN!) > 10 Then
|
|
SL$ = SETPOWER(VINADDR%, Abs(VIN!), LOOPOFF$) 'Disable power supply
|
|
End If
|
|
|
|
If L% = 1 And (Left$(SPECS.MODNAME, 12) = "SCM5B38-1298" Or Left$(SPECS.MODNAME, 10) = "SCM5B38-01") Then GoTo LOOP1
|
|
|
|
'Check for input error more than 10% of the expected input, in
|
|
'addition to the accuracy-step error (PWR 2014-11-04).
|
|
If (Abs(INPUTERR!) > 10!) Then
|
|
'Input error more than 10% of set value = FAIL
|
|
ACCSTAT$(INC%) = "FAIL"
|
|
FAILED% = FAILED% + 1
|
|
SOUND 2000, 0.5
|
|
ElseIf Abs(ERROROUT!(INC%)) <= MAXACCERR! Then
|
|
ACCSTAT$(INC%) = "PASS"
|
|
Else
|
|
ACCSTAT$(INC%) = "FAIL"
|
|
FAILED% = FAILED% + 1
|
|
SOUND 800, 0.5
|
|
End If
|
|
|
|
'Original code commented out below (PWR 2014-11-04)
|
|
'IF ABS(ERROROUT!(INC%)) <= MAXACCERR! THEN
|
|
' ACCSTAT$(INC%) = "PASS"
|
|
'ELSE
|
|
' ACCSTAT$(INC%) = "FAIL"
|
|
' FAILED% = FAILED% + 1
|
|
' SOUND 800, .5
|
|
'END IF
|
|
|
|
If SNM% >= 3 And SNM% <= 6 Then 'Temperature input modules
|
|
Print Tab(6); USING; "+####.## +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%); OUTMEAS!(INC%); ERROROUT!(INC%);
|
|
ElseIf SNM% = 7 Then 'Resistance input modules
|
|
Print Tab(6); USING; "#####.## +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%); OUTMEAS!(INC%); ERROROUT!(INC%);
|
|
Else 'Voltage or current input modules
|
|
Print Tab(6); USING; "+###.### +##.### +##.### +###.###"; TSIM!(INC%) * INSCALE!; OUTCALC!(INC%); OUTMEAS!(INC%); ERROROUT!(INC%);
|
|
End If
|
|
|
|
If (Left$(ACCSTAT$(INC%), 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(70); ACCSTAT$(INC%)
|
|
Color 11, 0 'Back to light cyan (blue) on black background.
|
|
|
|
If PON% = 1 Then
|
|
If SNM% >= 3 And SNM% <= 6 Then 'Temperature input modules
|
|
LPRINT TAB(6); USING "+####.## +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%); OUTMEAS!(INC%); ERROROUT!(INC%);
|
|
ElseIf SNM% = 7 Then 'Resistance input modules
|
|
LPRINT TAB(6); USING "#####.## +##.### +##.### +###.###"; TSIM!(INC%); OUTCALC!(INC%); OUTMEAS!(INC%); ERROROUT!(INC%);
|
|
Else 'Voltage or current input modules
|
|
LPRINT TAB(6); USING "+###.### +##.### +##.### +###.###"; TSIM!(INC%) * INSCALE!; OUTCALC!(INC%); OUTMEAS!(INC%); ERROROUT!(INC%);
|
|
End If
|
|
LPRINT TAB(70); ACCSTAT$(INC%)
|
|
End If
|
|
|
|
If Abs(ERROROUT!(INC%)) > Abs(ACCERR!) Then
|
|
ACCERR! = ERROROUT!(INC%)
|
|
End If
|
|
|
|
'Variables used to calculate the best fit line using linear regression.
|
|
SMODIN! = SMODIN! + TSIM!(INC%)
|
|
SSMODIN! = SSMODIN! + TSIM!(INC%) ^ 2
|
|
SERR! = SERR! + ERROROUT!(INC%)
|
|
SPROD! = SPROD! + TSIM!(INC%) * ERROROUT!(INC%)
|
|
If SNM% >= 5 And SNM% <= 7 Then Call POWERON(0)
|
|
Next
|
|
|
|
If LOGDAT% > 0 Then Close #3
|
|
|
|
If FAILED% = 0 Then
|
|
ACC$ = "PASS"
|
|
Else
|
|
Color 12, 0 'Test value text color to light red
|
|
Print
|
|
Print Tab(10); "Failure due to measured module input too far from set input.";
|
|
Color 11, 0 'Text color back to light cyan (blue)
|
|
ACC$ = "FAIL"
|
|
SOUND 800, 0.5
|
|
End If
|
|
|
|
SLOPE! = ((NUMPTS% * SPROD!) - (SMODIN! * SERR!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
|
|
OFFSET1! = ((SERR! * SSMODIN!) - (SMODIN! * SPROD!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
|
|
|
|
BFERR! = Abs(BESTFIT!(SLOPE!, OFFSET1!, TSIM!(), NUMPTS%, ERROROUT!()))
|
|
If Abs(BFERR!) <= MAXLINERR! Then
|
|
BF$ = "PASS"
|
|
Else
|
|
SOUND 600, 0.5
|
|
BF$ = "FAIL"
|
|
End If
|
|
|
|
Print
|
|
|
|
'PRINT TAB(10); "Accuracy status: "; ACC$
|
|
'CALL FAILSTATUS (ACC$, 10, -1, "Accuracy status: ") 'Print test status to screen
|
|
|
|
LOCATE 15, 10
|
|
Print Tab(10); "Measured accuracy error is";
|
|
Print Tab(50); USING; " +###.### %"; ACCERR!
|
|
Print Tab(10); "Maximum accuracy error is";
|
|
Print Tab(50); USING; "+/-##.### %"; MAXACCERR!
|
|
Print
|
|
|
|
Call FAILSTATUS(ACC$, 14, 10, "Accuracy status: ", 30) 'Print test status to screen
|
|
|
|
'PRINT TAB(10); "Linearity status: "; BF$
|
|
'CALL FAILSTATUS (BF$, 15, -1, "Linearity status: ") 'Print test status to screen
|
|
'CALL FAILSTATUS (BF$, 10, -1, "Linearity status: ") 'Print test status to screen
|
|
|
|
LOCATE 19, 10
|
|
Print Tab(10); "Measured best-fit linearity error is";
|
|
Print Tab(50); USING; "+/-###.### %"; BFERR!
|
|
Print Tab(10); "Maximum best-fit linearity error is";
|
|
Print Tab(50); USING; "+/- ##.### %"; MAXLINERR!
|
|
|
|
Call FAILSTATUS(BF$, 18, 10, "Linearity status: ", 30) 'Print test status to screen
|
|
|
|
ACC$ = ACC$ + Str$(Abs(ACCERR!)) + "3" 'Convert to % span
|
|
LINTEST$ = BF$ + Str$(Abs(BFERR!)) + "3" 'append # decimal places
|
|
|
|
Call RESETTH 'Reset the test head
|
|
If SNM% >= 5 And SNM% <= 7 Then Call POWERON(5)
|
|
Call PAUSE(0.2)
|
|
|
|
End Function
|
|
|
|
Sub LOGIT(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!)
|
|
|
|
N% = 15
|
|
Do
|
|
LASTCHAR$ = Mid$(SPECS.MODNAME, N%, 1)
|
|
N% = N% - 1
|
|
Loop While LASTCHAR$ = " "
|
|
|
|
If UCase$(LASTCHAR$) = "T" Or SPECS.MODNAME = "SCM5B31-1172 " Then
|
|
B% = 1
|
|
Else
|
|
A% = FAILS%(STATUS$())
|
|
B% = 0
|
|
End If
|
|
|
|
If A% = 0 Or B% = 1 Then
|
|
Open "C:\ATE\5BLOG\" + RTrim$(Mid$(SPECS.MODNAME, 6, 8)) + ".DAT" For Append As #4
|
|
|
|
Open "C:\ATE\LOGPATH.ADR" For Input As #7
|
|
Input #7, LogPath$
|
|
Close #7
|
|
Open LogPath$ + "\5BLOG\" + RTrim$(Mid$(SPECS.MODNAME, 6, 8)) + ".DAT" For Append As #8
|
|
|
|
NUMPTS% = 5
|
|
|
|
'builds a sequential file. 20 records required for 1 module
|
|
Write #4, SPECS.MODNAME
|
|
Write #8, SPECS.MODNAME
|
|
|
|
For INC% = 1 To NUMPTS%
|
|
Write #4, TSIM!(INC%), OUTCALC!(INC%), OUTMEAS!(INC%), ERROROUT!(INC%), ACCSTAT$(INC%)
|
|
Write #8, TSIM!(INC%), OUTCALC!(INC%), OUTMEAS!(INC%), ERROROUT!(INC%), ACCSTAT$(INC%)
|
|
Next
|
|
|
|
'"0" place holders are old LOWV! and HIGHV! step response specs.
|
|
Write #4, "0", "0", TOTLRESPEC!
|
|
Write #8, "0", "0", TOTLRESPEC!
|
|
|
|
For INC% = 0 To 19 Step 5
|
|
Write #4, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4), STATUS$(INC% + 5)
|
|
Write #8, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4), STATUS$(INC% + 5)
|
|
Next
|
|
|
|
Write #4, SN$, Date$
|
|
Write #8, SN$, Date$
|
|
|
|
Close #4
|
|
Close #8
|
|
|
|
End If
|
|
|
|
|
|
|
|
End Sub
|
|
|
|
'*******************************
|
|
Sub LOGMODFILES(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TOTLRESPEC!, TX%)
|
|
'Sub to write the data log, datasheet, and work order status files (and inform the
|
|
'operator of these operations)
|
|
'
|
|
Call WAITFORFINISH 'Pause until "F" key is pressed (so that final test results can be viewed)
|
|
|
|
KEY(10) OFF 'Deactivates F10 key
|
|
|
|
Cls
|
|
Print Tab(10); "Logging test results."
|
|
Call LOGIT(STATUS$(), SN$, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TOTLRESPEC!) 'Logs test data to disk
|
|
Call DATASHEETWRITE(SN$, STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$(), TSPEC$(), TX%)
|
|
Print Tab(10); "Writing status to work order status file."
|
|
Call WORKORDERLINE(FAILS%(STATUS$()), SN$)
|
|
|
|
KEY(10) ON 'Reactivates F10 key
|
|
|
|
Color 11, 0, 0 'Cyan on black background
|
|
Call INTERLUDE
|
|
|
|
Call DATASHEETPRINT(SN$, STATUS$())
|
|
|
|
End Sub
|
|
|
|
Sub MODULEOUTLINE()
|
|
|
|
'print a bottom view of the module showing potentiometer location
|
|
|
|
'SCM5Bxx-xx
|
|
'print module pins and potentiometers
|
|
LOCATE 4, 25
|
|
Print " x x x x x x x"
|
|
Print Tab(25); "x x x x x x x"
|
|
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
|
|
|
|
End Sub
|
|
|
|
Sub PASSTHRUTEST(STATUS$(), TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$())
|
|
'Runs tests for pass-through modules.
|
|
'
|
|
If SENSOROUT!(SPECS.MININ, 0) = 99! Then 'Check for valid sensor type
|
|
Print Tab(10); "Exiting PASSTHRUTEST for invalid sensor type!."
|
|
SOUND 1000, 0.5 'Beep to alert to failure.
|
|
Call CONTINUE
|
|
Exit Sub
|
|
End If
|
|
|
|
'FOR X = 1 TO 21 'Clear test result array
|
|
For X = 1 To MAXSTATUSINDEX 'Clear test result array
|
|
STATUS$(X) = ""
|
|
Next X
|
|
|
|
SNM% = SENSORNUM%
|
|
Call ENABLE(CON%) 'Enable output switch
|
|
|
|
MN$ = Left$(SPECS.MODNAME, 12)
|
|
If MN$ = "SCM5BPT-1367" Then
|
|
STATUS$(1) = SUPPLYI$(0) 'Supply current test
|
|
'Sets Vs to +5.0V
|
|
'No excitation load
|
|
If Left$(STATUS$(1), 4) = "FAIL" Then Exit Sub 'Exit on over current
|
|
'Power shut off
|
|
STATUS$(6) = OUTSWITCH$ 'Output switch test
|
|
STATUS$(15) = "PASS" 'Power Supply Sensitivity
|
|
STATUS$(20) = OUTNOISE$ 'Test Output Noise
|
|
ElseIf MN$ = "SCM5B-1369 " Then
|
|
STATUS$(1) = SUPPLYI$(0) 'Supply current test
|
|
'Sets Vs to +5.0V
|
|
'No excitation load
|
|
If Left$(STATUS$(1), 4) = "FAIL" Then Exit Sub 'Exit on over current
|
|
'Power shut off
|
|
STATUS$(6) = OUTSWITCH$ 'Output switch test
|
|
STATUS$(15) = SUPPLYSEN$ 'Power supply sensitivity
|
|
STATUS$(20) = OUTNOISE$ 'Test Output Noise
|
|
Else
|
|
STATUS$(1) = "PASS"
|
|
STATUS$(6) = "PASS"
|
|
STATUS$(15) = "PASS" 'Power Supply Sensitivity
|
|
STATUS$(20) = "PASS" 'Output Noise
|
|
End If
|
|
|
|
STATUS$(12) = LINTEST$(ACC$, CONTRES!, TSIM!(), OUTCALC!(), OUTMEAS!(), ERROROUT!(), ACCSTAT$()) 'Performs linearity and
|
|
'accuracy tests
|
|
STATUS$(13) = ACC$ 'Assigns results of accuracy test
|
|
|
|
If MN$ = "SCM5BPT-1367" Then
|
|
'OHM! = 300 '250 OHM is internal to the module and 1 Ohm for lead R. It's 0 Ohm on the testhead in series with CH2. MR 10/17/06
|
|
STATUS$(17) = PASS$ 'Can't test for diode clamp unless HV p.s. is used.
|
|
ElseIf MN$ = "SCM5BPT-1516" Then
|
|
OHM! = 250 + 1 '250 OHM is internal to the module and 1 Ohm for lead R. It's 0 Ohm on the testhead in series with CH2. MR 10/17/06
|
|
STATUS$(17) = OPENIN$ 'Tests for diode clamp
|
|
Else
|
|
STATUS$(17) = "PASS"
|
|
OHM! = 1 'It's 0 Ohm on the test-head.
|
|
End If
|
|
|
|
If MN$ <> "SCM5B-1369 " And MN$ <> "SCM5BPT-1367" Then
|
|
CB0VAL% = CB0VAL% Or &H10 '1 1 1 1 0 0 1 0
|
|
Call SETTH(CB0VAL%, CB0%) 'Short module inputs and open analog ground
|
|
|
|
Call PAUSE(0.2)
|
|
|
|
TE$ = "TE1005"
|
|
OUTRES! = MEASRES!(OHM!, 7, TE$)
|
|
|
|
If Abs(OUTRES! - OHM!) > 0.1 * OHM! And OHM! > 25 Then '10/17/06 MR
|
|
STATUS$(13) = "FAIL" + "999" + "2"
|
|
ElseIf Abs(OUTRES! - OHM!) > 25 And OHM! < 25 Then '10/17/06 MR
|
|
STATUS$(13) = "FAIL" + "999" + "2"
|
|
End If
|
|
End If
|
|
|
|
STATUS$(2) = "PASS"
|
|
STATUS$(3) = "PASS"
|
|
STATUS$(4) = "PASS"
|
|
STATUS$(5) = "PASS"
|
|
STATUS$(7) = "PASS"
|
|
STATUS$(8) = "PASS"
|
|
STATUS$(9) = "PASS"
|
|
STATUS$(10) = "PASS"
|
|
STATUS$(11) = "PASS"
|
|
'STATUS$(12) = "PASS" 'linearity test
|
|
STATUS$(14) = "PASS" 'lead resistance effects
|
|
STATUS$(16) = "PASS"
|
|
STATUS$(18) = "PASS" 'Frequency Response
|
|
STATUS$(19) = "PASS" 'Tests Step Response
|
|
|
|
Call RESETTH
|
|
Call POWERON(0!) 'Turns off module power
|
|
|
|
End Sub
|
|
|
|
Function PROGNAMEVAL$()
|
|
'Function to return the library source file version
|
|
PROGNAMEVAL$ = PROGNAME$
|
|
End Function
|
|
|
|
Function PROGVERVAL$()
|
|
'Function to return the library source file version
|
|
PROGVERVAL$ = VERSION$
|
|
End Function
|
|
|