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

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

3474 lines
137 KiB
QBasic

'Automated Test Software for DSCTx-xx Voltage,
'Current, TC and RTD input models.
'AUTHOR: John Lehman
'DATE: 4/9/98
'USES LIBRARY = LIBATED.BAS
' REVISION RECORD
'DATE APPR DESCRIPTION
'---- ---- -----------
'4/9/98 JL Converted from TESTDIN1.BAS
'8/25/98 JL Fix printing of high voltage message.
'8/27/98 JL Fix MINLOOPV setting of Vin for MAXIN! >= 10V.
'09/17/98 JL Add enough logged data to disk to fully reconstruct a data sheet.
'11/11/98 JL Added GAINCALINT subroutine for transmitters with interactive adjustments.
'03/05/99 JL Added system configuration notes on screen.
'04/07/99 JL Test step response from OSCALIN to +f.s. instead of -f.s. to +f.s.
'08/03/99 JL Added RDAC performance check upon startup. Changed input
' display in LINTEST for mV input transmitters.
'09/16/99 JL Increased IEXC tolerance from 1.6% to 2.0%.
'11/02/99 JL Use TE10302 for input to calibrate on-board CJC.
'03/05/00 JL Voltage input for underrange = 50% span (increased from 25%)
'05/12/00 JL Correct step reponse limits in report.
'06/29/00 JL Remove underrange for current input models.
'01/23/01 JL Add note for DSCT CJC connection.
'02/27/01 CG Updated for usage of all the DSCT models. Converted from TST2SCT1.BAS
'04/30/01 CG Updated for better user interface. Converted from TST3SCT1.BAS
'06/08/01 CG Added the CHAIN command as the software exits to link the program to the FAMILY MENU (menu7b.exe) program.
'06/14/01 CG Add option menu when running finals. Add CHANGEDN and REPEAT2
'08/09/01 CG Fixed excitation current test for the -34 and -36 units. SCT1P units
' where being test as DSCT units and viceversa.
'08/14/01 CG For the resistance input units, added a command to turn off the power to the module
' before the input resistor is set and added an additional one to set the power
' to 24V afterwards. The commands where added to the GAINCAL, OFFSETCAL, OFFSETERR
' and LINTEST subroutines.
'08/22/01 CG Changed the under range input resistance for the RTD test to be fixed at the
' minimum possible value of 8ohm.
'08/27/01 JL Disable KEPCO power supply for |OSCALIN| > 10V.
'09/10/01 CG Exchanged the definitions of the TE1037 mux channels to match the 5b and DSCA software.
' Now channel 6 is used for the sense lines of the contact resistance and
' channel 7 is used for the sense lines of the output current sense resistor.
'09/14/01 CG Added an IF statement in the MEASRES routine to change the sense mux channel depending on what test
' test head is being used (resistance input or voltage input).
' Additionally enabled the F9 key such that when pushed it returns the user to the
' test select menu.
'09/18/01 CG Updated the SENSORIEXC routine to turn on the supply voltage to the module
' in order to measure the excitation current
'10/17/01 CG Swapped the excitation current test order (#2 and then #1) on the SCT34, 36 individual test
'01/15/02 CG Added a the condition to calibrate the CJC when running finals on the DSCT units
' Changed the linearizer data file location to the E: drive and changed its format to only
' contain the error on mV for the DSCT units.
'01/30/02 CG Added a 2 second pause after measuring the input resistance to the module to prevent
' the modules input to be open if power is applied. On measure resistance routine, changed the
' DMM setup from resistance to voltage to prevent voltage excitation on the input terminals
' while reset the test head to normal setup.
'02/05/02 CG On the test report, corrected the exc current units (uA). Also displayed the test limit
' (5% for DSCT's and 2% for SCT's) for the excitation current. Corrected the parameter name
' such that the DSCT display minus and plus fs of the exc current and the SCT display source #1 and #2.
'03/01/02 JL Re-init DVM after 'T' in cal.
'04/18/02 CG Corrected the range setting on the step response routine when measuring the first point on bipolar
' input units. Added the ONESHOTTEST call (comented) on the main code to calibrate the S/H.
'07/09/02 CG Corrected frequency generator settings for resistance input units. Limited the offset calibration
' verification to two loops only.
'07/12/02 CG Corrected the max amplitude setting limit for resistance input modules.
'08/01/02 CG Created a condition not to exceed the input current limit from 31.5mA. the limit was based from the
' 250ohm resistor inside the test head, 50ohms sense resistors inside the module and the 16ohms max resistance
' from the polyswitch.
'04/28/03 CG Changed the HEADERA, FOOTER, REPORT and LINTEST routines to make datasheet format more
' consistent through all the test codes.
'05/05/03 CG Added a set of wires to channel 4 such that a more precise measurement can be done when
' calibrating the SCMVAS modules. Changed the adapter plate (TE1094) to accomodate the new connector.
'05/15/03 CG In the MEASRES routine opened the mux channels before changing from test 3 to test 2. Before the excitation
' voltage from the DMM was being inputed to the module causing a drift error. Changed the location of the
' pauses for the resistance input units to after the 24V are applied.Changed was made in the
' OFFSETCAL, OFFSETERR, GAINCAL and LINTEST routines. Added selection menu after caibration.
'07/19/03 CG Correct SCMVAS-MPT testing such that potentiometer calibration is done.
'01/29/04 CG Removed the SCT1P items in the test code. VAS specific test head was added to the code (TE1120). This
' test head was modified to provide a means to test 8B units. The changed required the DAC output channel
' to be moved from channel 3 to channel 8. After this change the test head requires the TE1004 mux to test
' VAS modules. Also a separate address file (VAS.ADR) had to be created.
'02/06/04 CG Replaced TE1036 and TE1035 references for TE1088 and TE1089 respectively. Conditionals where made for old
' SCT1P test head references.
'07/12/04 CG Corrected MENU3 condition to reload the correct test equipment addressing depending on the module to be
' tested (i.e. resistance or voltage models).
'09/22/04 CG Changed SCMVAS test section of the code to work with the TE1164 test head.
' On the GAINCAL routine added conditional to check for the expected input voltage for
' modules with an input voltage bigger than 10V. Correct the DSCT log file names so that the complete model
' number is used for storing the data (DSCT32-01 data was being logged under 2-01 and not 32-01). Added another
' conditional in the LOGIT routine to log in a separate directory the SCMVAS data.
'09/23/04 CG Added a loop in the VAS test to remeasure the output until it is within the accuracy specification
' before taking the final measurment. NOticed that the output of the Kepco drifts over time.
'01/26/05 CG On the INITTH changed the test head verification from a fixed value to the one read from the address file.
'03/08/05 CG Changed the INITTH conditions to fix the TE1088 and TE1164 to an ID of "0" and the TE1089 to "1".
'06/02/05 CG On the LOOPSENS routine, added a command to turn off the power supply after measuring the output at max Vloop.
' When changing the loop voltage from the max limit to 24V, the meter would occasionally trip.
'07/10/06 JL Reinstate functional test.
'12/07/06 JL Replaced LIBATE with LIBATEB. See LIBATEB for details.
'07/11/07 JL Added ONESHOTTEST as hidden option in Individual Test menu.
' Restructured INITTH to eliminate failure message for V or RTD test head not connected.
'08/13/07 MR Changed VERR from 0.5V to 1.0V, in GAINCAL and GAINERR subroutines.
'11/09/07 TSO Changed max loop supply test voltage from 100V to 60V, per catalog spec
'11/30/07 TSO Updated code to work with new KEPCO ABC125 Power Supply
'03/18/08 TSO Added the function call GETPSID in GETSPECS after the user is instructed to connect a
' high-Voltage Power Supply. This enables the user to connect a power supply if it asks for one.
'04/02/08 TSO Added conditional inside GAINCAL and GAINERR functions that will turn off the high-voltage
' Supply if TE$ = "TE1164" and turn off 24V Power Supply in all other cases.
'09/23/09 TSO Reinstated the LED observation keypress verification in GAINCAL
'12/11/09 TSO Added a second storage location to log files on Server T: drive
'03/28/11 TSO Added a High Voltage Power Supply check algorithm in SCMVAS block
' Created a conditional that bypasses LED observation test for
' SCMVAS modules inside GAINCAL
'11/19/11 MR Changed INITOL for OS and GN in functional test to 12%.
' Replaced CALSPAN with ORANGE for ERRORPERC calculation.
'06/18/12 MR Added TCDUTCONNECT and TCDUTDISCONNECT Subroutines
'06/22/12 TSO Changed offsetcal point to +0.02% and gaincal point to -0.02% on DSCT30-03
' Removed ERRFACT! = 2 in OFFSETERR! by commenting it out
'07/10/12 TSO Changed ERRFACT! to 1 in TST5SCT1 and TST5SCT2 declarations
' and reinstated it in OFFSETERR!
'6/13/19 MF modified display on VAS modules to show Kepco communication.
'7/24/24 BF Made the test print out SCMHVAS instead of SCMVAS
'08/21/24 BF Converted the test to say SCMHVAS and use SCMHVAS entries from the database.
DECLARE SUB CALDAC (TE$)
DECLARE SUB CALTEST (CAL%)
DECLARE SUB CHANGEDN (SN$) 'Allow user to change dash number
DECLARE SUB COMPTEST (STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Complete set of tests
DECLARE SUB CONTINUE ()
DECLARE SUB FOOTER (STATUS$()) 'Sends footer to printer if all tests passed
DECLARE SUB FUNCTEST (CAL%) 'Routines for functional test
DECLARE SUB GENSET (GENAMPL!) 'Displays message to set signal generator
DECLARE SUB GETADD (FILENAME$) 'Gets parallel port/Mux/Testhead address
DECLARE SUB GETSN (SN$) 'Gets serial number
DECLARE SUB GETSPECS () 'Gets transmitter type and specifications
DECLARE SUB GETSPECS2 () 'Gets SCMVAS module data
DECLARE SUB HEADERA (SN$) 'Prints test sheet header
DECLARE SUB HEADERB (TESTTITLE$) 'Prints test screen header
DECLARE SUB INDIVID (SEL%) 'Performs the tests individually
DECLARE SUB INIT488 (DEVADDR%)
DECLARE SUB INITTH (TH1$, TH2$) 'Initializes the Test Heads
DECLARE SUB INITPS (ADDR%, OVERI!, OVERV!)
DECLARE SUB LOADMUX (CH%, CHON%)
DECLARE SUB LOGIT (STATUS$(), SN$, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Logs test results to disk
DECLARE SUB MODOUTLINE ()
DECLARE SUB NOTES () 'Notes on ATE operation
DECLARE SUB OHMSET (OHM!)
DECLARE SUB ONESHOTTEST () 'Tests one-shot pulse width
DECLARE SUB PAUSE (TIME!)
DECLARE SUB REPORT (STATUS$(), TSPEC$()) 'Prints test data on screen
DECLARE SUB RESETTH () 'Reset test head to known condition
DECLARE SUB RTDTHCAL () 'Check test head operation
DECLARE SUB SETDAC (VOLTAGE!, CH%, VSENATTEN!)
DECLARE SUB SETDACFAST (VOLTAGE!)
DECLARE SUB SETTEST (TEST%)
DECLARE SUB SETTH (DOUT%, CB%)
DECLARE SUB SETTHFAST (DOUT%, CB%)
DECLARE SUB TSPECS (TSPEC$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Creates a string array of test specifications
DECLARE SUB SORTDB (ENDFLAG%)
DECLARE SUB WRITEDVM (FUNC$, VALUE!)
DECLARE SUB TCDUTCONNECT ()
DECLARE SUB TCDUTDISCONNECT ()
DECLARE FUNCTION BESTFIT! (SLOPE!, OFFSETS!, TSIM!(), NUMPTS%, ERRO!())
'Library fn. Calculates besfit line and max error
DECLARE FUNCTION CALMENU% ()
DECLARE FUNCTION CJCCAL$ () 'Calibrate ambient temp sensor
DECLARE FUNCTION FAILS% (STATUS$()) 'Tests for failed tests
DECLARE FUNCTION FREQRESP$ (GENAMPL!) 'Performs Frequency response Test
DECLARE FUNCTION GAINCAL$ (CAL%, CONTRES!, PFSMEAS!, INTERACT!, DELTAOS!) 'Performs Gain Calibration
DECLARE FUNCTION GAINCALINT$ (CAL%)
DECLARE FUNCTION GAINERR! (CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!)
DECLARE FUNCTION GENATTENR! () 'Calculate fn gen attenuator
DECLARE FUNCTION GETTHID% () 'Library fn. Get test head id #
DECLARE FUNCTION GETPSID% ()
DECLARE FUNCTION IEXC1$ (IEXCSENSE!) 'Measure excitation I source #1
DECLARE FUNCTION IEXC2$ (IEXCSENSE!) 'Measure excitation I source #2
DECLARE FUNCTION IMATCH$ (I1$, I2$) 'Check current source matching
DECLARE FUNCTION INPUTR$ () 'Performs Input Resistance Test
DECLARE FUNCTION Iout! (SENOUT!) 'Calculates transmitter output for a given input
DECLARE FUNCTION KEYBDIN$ () 'Library fn. Get keyboard input
DECLARE FUNCTION LEADREFF$ (TOTLRESPEC!) 'Measure lead resistance effects
DECLARE FUNCTION LINTEST$ (ACC$, CONTRES!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$()) 'Performs Accuracy and Linearity Tests
DECLARE FUNCTION LOOPVSEN$ () 'Performs Power Supply Sensitivity
DECLARE FUNCTION MEASRES! (OHM!, RESNUM%, TE$) 'Measure loop current sense resistor
DECLARE FUNCTION MENU0% () 'Choose model family to test
DECLARE FUNCTION MENU1% () 'Gets the Test Group selection
DECLARE FUNCTION MENU2% () 'Gets the individual test #
DECLARE FUNCTION MENU3% () 'Gets the transmitter family
DECLARE FUNCTION MINLOOPV$ () 'check operation at min loop V
DECLARE FUNCTION MAXLOOPV$ () 'check operation at max loop V
DECLARE FUNCTION OFFSETCAL$ (CAL%, CONTRES!) 'Performs Offset Calibration
DECLARE FUNCTION OFFSETERR! (CAL%, CONTRES!)
DECLARE FUNCTION OPENTC$ () 'Measure open thermocouple response
DECLARE FUNCTION OUTNOISE$ () 'Performs Output Noise Test
DECLARE FUNCTION OVERRANGE$ () 'Measure over-range current
DECLARE FUNCTION PARASITICTCV! (VCJC!) 'Measure VCJC and calculate PTC
DECLARE FUNCTION POWERIO$ (ADDR%, CMD$) 'Library fn. Kepco DPS power supply I/O
DECLARE FUNCTION READDVM! (TOL!) 'Library fn. Reads Fluke meter to TOL!
DECLARE FUNCTION READGPIB$ (ADDR%, CMD$)
DECLARE FUNCTION REPEAT$ (N$) 'Ask if you would like to repeat test
DECLARE FUNCTION REPEAT2$ (N$, SN$) 'Menu function runned during finals only
DECLARE FUNCTION RTDOHMS! (TEMP!, SENTYPE$) 'Library fn. Convert RTD in temp to ohms
DECLARE FUNCTION RTDTEMP! (OHMS!, SENTYPE$) 'Library fn. Convert RTD ohms to temp
DECLARE FUNCTION SENSORIEXC$ (PERCFS%) 'Measures the resistor input exc. current
DECLARE FUNCTION SENSORIN! (PVIN!, PTCV!) 'Calculates sensor input
DECLARE FUNCTION SENSORNUM% () 'Assign a number to each sensor type
DECLARE FUNCTION SENSOROUT! (PVIN!, PTCV!) 'Calculates transmitter input
DECLARE FUNCTION SETAC! (ONOFF%, GENAMPL!) 'Sets AC in Off or On
DECLARE FUNCTION SETATTEN% (VOLTAGE!) 'Library fn. Sets test head R/2R ladder
DECLARE FUNCTION SETCURRENTIN! (MODIN!) 'Set input current source
DECLARE FUNCTION SETPOWER$ (ADDR%, VSUPPLY!, FUNC$) 'Library fn. Sets supply voltage
DECLARE FUNCTION STEPRESP$ () 'Performs Step Response Test
DECLARE FUNCTION STRINGVAL% (A$) 'Library fn.
DECLARE FUNCTION SUPPLYI$ (EXCL%) 'Measure transmitter supply current
DECLARE FUNCTION TCTEMP! (TCV!, SENTYPE$) 'Library fn. Convert TC volts to deg. C
DECLARE FUNCTION TCVOLTS! (TEMP!, TCTYPE$) 'Library fn. Convert TC in temp to V
DECLARE FUNCTION UNDERRANGE$ () 'Measure under-range current
DECLARE FUNCTION UPSN$ (SN$) 'Increments dash# of serial#
'Database Record defintion for the specifications
TYPE DBASE
MODNAME AS STRING * 14 'SCT1P47X-XXXX, DSCT47X-XXXX
SENTYPE AS STRING * 7 'mV, V, mA, xTC, xxRTDxW
MININ AS SINGLE
MAXIN AS SINGLE
IEXCMFS AS SINGLE
IEXCPFS AS SINGLE
RCONV AS SINGLE
MINOUT AS SINGLE
MAXOUT AS SINGLE
OSCALPT AS SINGLE
GNCALPT AS SINGLE
LINEAR AS SINGLE
ACCURACY AS SINGLE
TESTFREQ AS INTEGER
ATTEN AS INTEGER
ATTENTOL AS INTEGER
STEPRMIN AS SINGLE
STEPRMAX AS SINGLE
OUTNOISE AS SINGLE
INPUTRES AS SINGLE
IOPENTC AS SINGLE
LEADRERR AS SINGLE
LINEARIZED AS INTEGER '1 = linearized, 0 = non-linearized
OSCALIN AS SINGLE 'input for offset calibration
GNCALIN AS SINGLE 'input for gain calibration
BANDWIDTH AS SINGLE 'filter -3dB point
IMATCHTOL AS SINGLE 'current source matching tolerance
CALTOL AS SINGLE 'Calibration tolerance
VSEN AS SINGLE 'Loop voltage sensitivity
END TYPE
TYPE DBASE2
RECNUM AS INTEGER
MODNAME AS STRING * 14
END TYPE
'$INCLUDE: 'QB.BI2'
'define common variables
COMMON SHARED /SAMPLE/ SPECS AS DBASE, SORTDATA1 AS DBASE2, SORTDATA2 AS DBASE2
COMMON SHARED /SAMPLE/ PON%, RSENSE!, SN$, LOGDAT%, IINSEN.MEAS!
COMMON SHARED CB0VAL%, CB1VAL%, CB2VAL%, CB3VAL%
COMMON SHARED MAINMAX!, MAINMIN!, VERNMAX!, VERNMIN!
COMMON SHARED BADDRS%, LPTADDR%, MUXADDR%, THADDR%, PSADDR%, VINADDR%
COMMON SHARED PSPORT%, DVMADDR%, GENADDR%
COMMON SHARED DPSPSADDR%, DPSVINADDR%, ABCPSADDR%, ABCVINADDR%
COMMON SHARED PSMODEL$, VINMODEL$
COMMON SHARED TH$
COMMON SHARED /PRTSCR/ inreg AS RegType, outreg AS RegType
'assign constants to Fluke meter commands
CONST OHM4$ = "F4", OHM2$ = "F3", VODC$ = "F1", VOAC$ = "F2", MADC$ = "F5"
'assign constants to test head variables
CONST CB0% = 0, CB1% = 1, CB2% = 2, CB3% = 3 'control bank addresses
CONST CON% = 1, COFF% = 0 'channel 'on' defined as '1'
'off' defined as '0'
'assign constants to Kepco DPS power
'supply commands
CONST VOLT$ = "STV=", LOOPON$ = "SOP=ON", LOOPOFF$ = "SOP=OFF"
CONST CURRENT$ = "RTC", ISTAT$ = "RCS"
CONST OVERV! = 115 'Power supply over voltage limit
CONST PSILIMIT! = 500 'Power supply current limit
CONST VINOVERV! = 125
CONST VINILIMIT! = 32 'High voltage input current limit
'assign constants to Kepco DPS power
'supply commands
'assign specifications which are constant for all transmitters
CONST IINSEN! = 250 'Input current source sense resistor, 250ohm
CONST ICL! = .05 'Max. loop current (over current limit)
CONST LPSEN! = 250 'Loop current sense resistor, 250 ohm
CONST IEXCSEN! = 2500 'Iexc sense resistor, 2.5Kohm
CONST IUR1! = .0015 'Min under-range current (A)
CONST IUR2! = .0038 'Max under-range current (A)
CONST RSERIES! = 5100000! '5.1M ohm, test head series input R
CONST RFNGN! = 6800 'Function generator attenuator series R, 6.8Kohm
CONST ERRFACT! = 1'2 changed 7/10/12 TSO 'Max error in offset allowed (factor)
DIM STATUS(17) AS STRING, TSPEC(17) AS STRING
DIM TSIM!(102), IOUTCALC!(102), IOUTMEAS!(102), ERRORPERC!(102), ACCSTAT$(102)
' Variable intialization
BADDRS% = &H250 'Base address of PC4311 '488 controller
CB0VAL% = &HFF 'Set all lines off
CB1VAL% = &HFF
CB2VAL% = &HFF
CB3VAL% = &HFF
'PSPORT% = 1 'initialize port address
'TE1088 configuration:
'(all control lines are active low)
'Use Relay/Mux TE1013 (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 transmitter inputs to analog ground
' 3 0 = Short transmitter inputs
' 2 0 = Short out 5.1Mohm series input R
' 1 1 = DAC input to transmitter, 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
' 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)
' 1 Vsupply control MSB
' 0 LSB Vsupply control LSB
'
' 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
'
' 3 7 MSB High Voltage Input; 0 = V- to +IN, V+ to -IN, 1 = NC
' 6 High Voltage Input; 0 = V+ to +IN, V- to -IN, 1 = NC
' 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, Disconnect Rsense from loop, 1 = Rsense connected to loop
' 2 0 = LED3
' 1 0 = LED2
' 0 LSB 0 = LED1
'TE1013 Relay/Mux channel assignments (for TE1088 only)
'Mux Channel Assignment
'----------- ----------
' 1 Vin (R/2R ladder output)
' 2 Iout sense resistor
' 3 DAC output
' 4 Test head CJC sensor / DUT CJC sensor, multiplexed through relay Kxx
' 5 Sample/Hold output
' 6 Sense lines for Iout sense resistor, 4-wire ohms
' 7 Input current source conversion resistor, source lines
' 8 Input current source conversion resistor, sense lines
'TE1035 & TE1089 (pcb1128 Rev A + pcb1129 Rev A daughter card)
'(all control lines are active low)
'Use Relay/Mux TE1037 (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
' 2 0 = LED3
' 1 0 = LED2
' 0 LSB 0 = LED1
'
' 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
'TE1037 Relay/Mux channel assignments (for TE1089 only)
'Address = 3
'Mux Channel Assignment
'----------- ----------
' 1 DUT +/-IN terminals
' 2 Iout sense resistor
' 3 Function Generator input to test head
' 4 Iexc sense resistor
' 5 Sample/Hold output
' 6 Contact resistance sense lines, 4-wire ohms
' 7 Sense lines for Iout sense resistor, 4-wire ohms
' 8 DUT Rin sense lines, 4-wire ohms
'TE1164 (pcb1044 Rev B.) configuration:
'(no control lines are used)
'Use Relay/Mux TE1004 (see below)
'
'
'TE1004 Relay/Mux channel assignments (for TE1164 only)
'Address = 1
'Mux Channel Assignment
'----------- ----------
' 1 Vin (Kepco output)
' 2 Vout (VAS output)
' 3 not used
' 4 not used
' 5 not used
' 6 not used
' 7 not used
' 8 not used
'****************** MAIN PROGRAM************************************
KEY(10) ON 'Activates F10 key
ON KEY(10) GOSUB FINISH 'Traps for F10 key Exits if pressed
DO
SEL0% = MENU0%
SELECT CASE SEL0%
'*************************** DSCT Test Block *********************************
CASE 1
TH1$ = "TE1088" 'Assign test head #, defines channel
'used for DAC input.
MU1$ = "TE1013" 'Assign test head #, defines channel
'used for DAC input.
TH2$ = "TE1089" 'Assign test head #, defines channel
'used for DAC input.
MU2$ = "TE1037" 'Assign test head #, defines channel
'used for DAC input.
CLS
LOCATE 3, 25
COLOR 14, 0, 0
PRINT "DSCT TEST SYSTEM CONFIGURATION"
LOCATE 5
COLOR 15, 0, 0
PRINT TAB(10); "To test DSCT30-xx, 31-xx, 32-xx, 37x-xx, 47x-xx use"
PRINT
PRINT TAB(10); "Test Head "; TH1$; ""
PRINT TAB(10); "Relay Mux "; MU1$; ""
PRINT TAB(10); "Multimeter FLUKE 8842A"
LOCATE 13
PRINT TAB(10); "To test DSCT34-xx, 36-xx, use"
PRINT
PRINT TAB(10); "Test Head "; TH2$; ""
PRINT TAB(10); "Relay Mux "; MU2$; ""
PRINT TAB(10); "Multimeter FLUKE 8842A"
CALL CONTINUE
CALL INITTH(TH1$, TH2$)
'CALL ONESHOTTEST
LOGDAT% = -1 'Log linearity test data OFF
START:
KEY(9) ON 'Activates F9 key
ON KEY(9) GOSUB START 'Traps for F9 key returns to the main menu if pressed
'TSO - During development of the ABC KEPCO integration, I noticed that LOOPOFF$
'was already commanded from INITTH (and GETPSID). The DPS KEPCO locked-up if
'sent LOOPOFF$ command string more than once in succession
'SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Turn off loop power
CALL WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Turn off loop power
END IF
DO 'Main program loop
SN$ = "" 'Reset serial number
SEL1% = MENU1% 'Gets the # of the sub program
SELECT CASE SEL1% 'Branches to the specific Tests
'**************** Functional Test ***********************************
CASE 1
PON% = 0 'Sets printer flag ON
CAL% = 2 'don't calibrate o.s & gain
CALL GETSPECS 'Gets transmitter test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL FUNCTEST(CAL%)
END IF
'*********************** Pre-Burn In Complete Test (NO printout) ******************************
CASE 2
PON% = -1 'Print Flag <0 Printer OFF
CAL% = 0 'Calibrate o.s. & gain.
CALL GETSPECS 'Gets transmitter test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL GENSET(GENAMPL!) 'Displays message to set signal gen.
DO 'Complete test loop start
ITERATION% = 1 'Sets # of times to repeat offset/gain cal
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Performs complete set of tests
CALL TSPECS(TSPEC$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Sets up a string with the test specifications
CALL REPORT(STATUS$(), TSPEC$()) 'Prints data to screen
CALL CONTINUE 'Waits for a key press
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N" 'End of Complete Test loop
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
END IF
END IF
'**************** Post-Burn In Complete Test (with printout) ***********************************
CASE 3
PON% = 1 'Sets printer flag ON
CAL% = 0 'calibrate o.s & gain
CALL GETSPECS 'Gets transmitter test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL GENSET(GENAMPL!) 'Displays message to set signal generator
CALL GETSN(SN$) 'Gets transmitter serial #
DO 'Start of Test loop
ITERATION% = 1 'Sets # of times to repeat offset/gain cal
CALL HEADERA(SN$) 'Prints data sheet header on printer
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Performs complete set of tests
CALL TSPECS(TSPEC$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Creates a string of test parameters
WIDTH , 43 'Change screen lines to 43
CALL REPORT(STATUS$(), TSPEC$()) 'Displays test results
CALL FOOTER(STATUS$()) 'Prints footer if no fails
'CALL INTERRUPT(5, inreg, outreg) 'Prints test data
LPRINT CHR$(12) 'Send form feed to printer
CALL LOGIT(STATUS$(), SN$, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Logs test data to disk
CALL CONTINUE 'Waits for key press
WIDTH , 25 'Change screen lines to 25
LOOP WHILE REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
END IF
END IF
'**************** Sealed Module Retest (Print Results, No Adjustments) ***********************************
CASE 4
PON% = 1 'Sets printer flag ON
CAL% = 1 'don't calibrate o.s & gain
CALL GETSPECS 'Gets transmitter test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL GENSET(GENAMPL!) 'Displays message to set signal generator
CALL GETSN(SN$) 'Gets transmitter serial #
DO 'Start of Test loop
ITERATION% = 1 'Sets # of times to repeat offset/gain cal
CALL HEADERA(SN$) 'Prints data sheet header on printer
CALL COMPTEST(STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Performs complete set of tests
CALL TSPECS(TSPEC$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Creates a string of test parameters
WIDTH , 43 'Change screen lines to 43
CALL REPORT(STATUS$(), TSPEC$()) 'Displays test results
CALL FOOTER(STATUS$()) 'Prints footer if no fails
'CALL INTERRUPT(5, inreg, outreg) 'Prints test data
LPRINT CHR$(12) 'Send form feed to printer
CALL LOGIT(STATUS$(), SN$, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Logs test data to disk
CALL CONTINUE 'Waits for key press
WIDTH , 25 'Change screen lines to 25
LOOP WHILE REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
END IF
END IF
'***********************Individual Test Routines******************************
CASE 5
PON% = -1 'Print Flag <0 Printer OFF
DO 'Start of loop
SEL% = MENU2% 'Gets # of test
IF SEL% <> 19 THEN 'Checks for exit
IF SEL% = 16 THEN
CALL NOTES 'Print ATE notes
ELSEIF SEL% = 17 THEN 'Checks for printer toggle
PON% = -PON% 'Toggles printer status
ELSEIF SEL% = 18 THEN
LOGDAT% = -LOGDAT%
ELSEIF SEL% = 20 THEN
CALL ONESHOTTEST
ELSE
CALL GETSPECS 'Gets transmitter specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL INDIVID(SEL%) 'Performs individual test
END IF
END IF
END IF
LOOP UNTIL SEL% = 19 'End of loop
'******************* Offset/Gain Excitation Calibration ***************************
CASE 6
PON% = -1 'Print Flag <0 Printer OFF
CAL% = 0 'calibrate module
CALL GETSPECS 'Gets transmitter test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
IF SNM% = 3 THEN CALL TCDUTCONNECT
CALL CALTEST(CAL%)
IF SNM% = 3 THEN CALL TCDUTDISCONNECT
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
'*************************** SCMVAS Test Block *********************************
CASE 2
TH1$ = "TE1164" 'Assign test head #, defines channel
'used for DAC input.
MU1$ = "TE1004" 'Assign test head #, defines channel
'used for DAC input.
CLS
LOCATE 3, 25
COLOR 14, 0, 0
PRINT "SCMHVAS TEST SYSTEM CONFIGURATION"
LOCATE 5
COLOR 15, 0, 0
PRINT TAB(10); "To test SCMHVAS-Mxxx use"
PRINT
PRINT TAB(10); "Test Head "; TH1$; ""
PRINT TAB(10); "Relay Mux "; MU1$; ""
PRINT TAB(10); "Multimeter FLUKE 8842A"
CALL CONTINUE
CALL INITTH(TH1$, "")
VINADDR% = 0
COUNT = 0
WHILE COUNT <> 1!' THEN
PSID% = GETPSID%
'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 Power Supply's GPIB address to 6 from the front"
PRINT TAB(5); "panel by pressing: Menu, Menu, 06, ENTER, RESET."
LOCATE 19, 7: PRINT "Connect test cables from power supply to test head"
'END IF
COUNT = COUNT + 1
CALL CONTINUE
WEND
IF VINADDR% <> 2 AND VINADDR% <> 6 THEN
LOCATE 20, 7: PRINT "Fail to Communicate to Kepco"
END
END IF
'CALL ONESHOTTEST
LOGDAT% = -1 'Log linearity test data OFF
SN$ = "" 'Reset serial number
CALL GETSPECS 'Gets attenuator module test specs
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL GETSN(SN$) 'Get serial #
DO
FOR X = 1 TO 16 'Clear test result array
STATUS$(X) = ""
NEXT X
CLS
TESTTITLE$ = "Module Installation"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
PRINT ; "Install the module on the test head adapter TE1094."
PRINT
PRINT TAB(10); "Plug the assembly into the test head input connector."
CALL CONTINUE
IF LEFT$(SPECS.MODNAME, 10) <> "SCMHVAS-MPT" THEN
CAL% = 0 'Calibrate attenuation
ELSE
CAL% = 1 'Pass-thru. Do not calibrate attenuation
END IF
ITER% = 0
DO
ITER% = ITER% + 1
A$ = GAINCAL$(CAL%, 0, 0, 1, 0)
IF CAL% = 0 THEN
CALERR! = GAINERR!(1, 0, 0, 1, 0)
ELSE
CALERR! = 0
END IF
IF ABS(CALERR!) >= SPECS.CALTOL AND ITER% < 3 THEN
RECAL$ = "Y"
PRINT TAB(10); ""
PRINT TAB(10); "Calibration error is bigger than allowed."
PRINT TAB(10); "Software will loop back for recalibration.";
PAUSE (1)
ELSEIF ABS(CALERR!) >= SPECS.CALTOL AND ITER% >= 3 THEN
RECAL$ = "N"
PRINT TAB(10); ""
PRINT TAB(10); "Maximum limit of iterations reached."
PRINT TAB(10); "Continuing with final test.";
PAUSE (1)
ELSE
RECAL$ = "N"
END IF
LOOP WHILE RECAL$ = "Y"
IF LEFT$(A$, 4) <> "FAIL" THEN 'Module passed, now test in case
CLS
TESTTITLE$ = "Module Installation"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
PRINT "Remove the module under test from the test head."
PRINT
PRINT TAB(10); "Install the module in its plastic case and snap on the header."
PRINT
PRINT TAB(10); "Re-install the module on the test head adapter (TE1094)."
PRINT
PRINT TAB(10); "Plug the assembly back into the test head input connector."
CALL CONTINUE
CAL% = 1 'Measure attenuation, don't calibrate
PON% = 1 'Sets printer flag ON
STATUS$(9) = GAINCAL$(CAL%, 0, 0, 1, 0)
CALL HEADERA(SN$) 'Prints data sheet header on printer
CALL TSPECS(TSPEC$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Creates a string of test parameters
CALL REPORT(STATUS$(), TSPEC$()) 'Displays test results
CALL FOOTER(STATUS$()) 'Prints footer if no fails
'CALL INTERRUPT(5, inreg, outreg) 'Prints test data
LPRINT CHR$(12) 'Send form feed to printer
CALL LOGIT(STATUS$(), SN$, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!) 'Logs test data to disk
CALL CONTINUE 'Waits for key press
END IF
LOOP WHILE REPEAT2$(SPECS.MODNAME, SN$) <> "N" 'End of test loop
END IF
'*************************** Exit Program *********************************
CASE 3 'PROGRAM END
GOTO START
END SELECT
LOOP
FINISH:
IF SEL0% <> 0 THEN
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Turn off loop power
SL$ = SETPOWER$(PSADDR%, 999!, "LOC") 'Return to local mode
SL$ = SETPOWER$(PSADDR%, 999!, "ZER") 'Clear the error queue
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) AND TH$ <> "TE1164" THEN
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Turn off loop power
SL$ = SETPOWER$(VINADDR%, 999!, "LOC") 'Return to local mode
SL$ = SETPOWER$(VINADDR%, 999!, "ZER") 'Clear the error queue
END IF
END IF
CHAIN "C:\ATE\MENUX"
END 'End of program
MAINMENU:
CHAIN "C:\ATE\MENUX"
END
'SUB HEADERA (SN$)
' LPRINT TAB(32); "TEST DATA SHEET"
' FOR X = 1 TO 80
' LPRINT "~";
' NEXT
' LPRINT
' IF LEFT$(SPECS.MODNAME, 6) = "SCMVAS" THEN
' LPRINT TAB(5); "Module Type: "; SPECS.MODNAME
' ELSE
' LPRINT TAB(5); "Transmitter Type: "; SPECS.MODNAME
' END IF
' LPRINT
' LPRINT TAB(5); "Serial Number: "; SN$
' LPRINT
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 CALTEST (CAL%)
IF SETPOWER$(PSADDR%, 24!, FUNC$) = "FAIL" THEN 'Set loop V to 24V
EXIT SUB 'Do not proceed if over-
'current is detected
END IF
SNM% = SENSORNUM%
IF SENSOROUT!(SPECS.MININ, 0) = 99! THEN 'Check for valid sensor type
EXIT SUB
ELSEIF SNM% = 2 THEN 'Check if current input
IINSEN.MEAS! = MEASRES!(IINSEN!, 5, "") 'Measure current source sense R
END IF
DO
IF SNM% = 3 AND LEFT$(SPECS.MODNAME, 4) = "DSCT" THEN
A$ = CJCCAL$ 'Ambient temp sensor cal.
ELSEIF SNM% = 3 AND PON% < 0 AND LEFT$(SPECS.MODNAME, 4) = "SCT1" THEN
A$ = CJCCAL$ 'Ambient temp sensor cal.
END IF 'Pre-encap only.
ITERATION% = 0
DO
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
END IF
A$ = OFFSETCAL$(CAL%, CONTRES!) 'Offset calibration
A$ = GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, DELTAOS!) 'Gain calibration
OFFERR! = OFFSETERR!(CAL%, CONTRES!)
ITERATION% = ITERATION% + 1
LOOP WHILE ABS(OFFERR!) >= ERRFACT * SPECS.CALTOL AND ITERATION% < 2
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
CALL RESETTH 'Reset test head
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N"
END SUB
FUNCTION CJCCAL$
'Calibrate the D.U.T. ambient temperature sensor.
'This test can be performed only on unencapsulated units.
MODNAME$ = SPECS.MODNAME
TERROR! = .1 'Temp sensor error (mV)
'+/-0.1mV = +/-0.04 deg. C
CLS
TESTTITLE$ = "Ambient Temperature Sensor Calibration"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
IF SENSORNUM% <> 3 THEN
PRINT "This test is performed on un-encapsulated, thermocouple"
PRINT TAB(10); "input transmitters only (except Type B)."
CALL CONTINUE
EXIT FUNCTION
ELSE
CALL MODOUTLINE
LOCATE 4, 30
PRINT "x x"
LOCATE 7, 31
PRINT CHR$(24); " "; CHR$(24)
PRINT TAB(30); "P1 CJC POTENTIOMETER"
END IF
PRINT TAB(10); "Make sure that test box TE10302 is connected and is turned on."
PRINT
PRINT TAB(10); "The adjustment potentiometer is located on the left side of the"
PRINT TAB(10); "module under test above the brass terminal blocks."
CALL CONTINUE
CLS
TESTTITLE$ = "Ambient Temperature Sensor Calibration"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
PRINT "Testing, please wait...";
PRINT SPC(40); : PRINT
PRINT SPC(66); : PRINT
PRINT SPC(30); : PRINT
PRINT SPC(70);
DO
TIME1! = TIMER 'Start timer
CALL LOADMUX(4, CON%) 'Measure TE10302 CJC sensor output
CALL WRITEDVM(VODC$, .5) 'Vcjc(25C) = 0.5100V
THVCJC! = READDVM(.001)
CALL LOADMUX(4, COFF%)
IF ABS(THVCJC! - .51) > .05 THEN '+/- 25C error for malfunction
SOUND 1000, .5 'This means 0C <= Ta <= 50C
PRINT
PRINT TAB(10); "TE10302 temperature sensor malfunction."
PRINT TAB(10); USING "Vcjc = #.### V"; THVCJC!
CALL CONTINUE
CALL LOADMUX(4, COFF%)
EXIT FUNCTION
END IF
CB1VAL% = CB1VAL% AND &HFB '1 1 1 1 1 0 1 1
CALL SETTH(CB1VAL%, CB1%) 'Measure DUT CJC sensor output
CALL LOADMUX(4, CON%)
'Reset when SETTH executed
LOCATE 10, 10
PRINT "Temperature Sensor Error ="
DO
DUTVCJC! = READDVM(.001)
IF ABS(DUTVCJC! - .51) > .05 THEN '+/- 25C error for malfunction
SOUND 1000, .5 'This means 0C <= Ta <= 50C
PRINT
PRINT TAB(10); "Transmitter temperature sensor malfunction."
PRINT TAB(10); USING "Vcjc = #.### V"; DUTVCJC!
CB1VAL% = CB1VAL% OR &H4 '0 0 0 0 0 1 0 0
CALL SETTH(CB1VAL%, CB1%) 'Reset to TE10302 CJC sensor output
CALL LOADMUX(4, COFF%)
CJCCAL$ = "FAIL"
EXIT FUNCTION
ELSE
CJCCAL$ = "PASS"
END IF
ERRORV! = (DUTVCJC! - THVCJC!) * 1000 'Error in mV
'Error in C = ERRORV!/-2.5
LOCATE 10, 37
PRINT USING "+###.# mV"; ERRORV!
PRINT TAB(37); USING "+##.# C"; ERRORV! / -2.5
LOCATE 15, 10
IF ABS(ERRORV!) < TERROR! THEN
SOUND 600, .5
PRINT "Stop turning temp. sensor potentiometer "
CONREADS% = CONREADS% + 1
ELSEIF ERRORV! < 0 THEN
PRINT "Turn temp. sensor potentiometer clockwise "
CONREADS% = 0
ELSE
PRINT "Turn temp. sensor 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("*", MINOUT!)
CALL CONTINUE
LOCATE 20, 10
PRINT SPC(22);
ELSEIF UCASE$(A$) = "C" THEN
CONREADS% = 5
END IF
TOTTIME! = TIMER - TIME1! 're-measure cjc voltage
'once every 20s
CALL PAUSE(.2) 'Slow loop down
LOOP WHILE CONREADS% < 5 AND TOTTIME! < 20!
CB1VAL% = CB1VAL% OR &H4 '0 0 0 0 0 1 0 0
CALL SETTH(CB1VAL%, CB1%) 'Measure TE10302 CJC sensor output
CALL LOADMUX(4, COFF%)
LOOP WHILE CONREADS% < 5
PRINT TAB(10); "Remove the CJC connector from the transmitter."
CALL CONTINUE
'CALL PAUSE(1!)
END FUNCTION
SUB COMPTEST (STATUS$(), ITERATION%, CAL%, GENAMPL!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!)
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24V
SNM% = SENSORNUM%
IF SENSOROUT!(SPECS.MININ, 0) = 99! THEN 'Check for valid sensor type
EXIT SUB
ELSEIF SNM% = 2 THEN 'Check if current input
IINSEN.MEAS! = MEASRES!(IINSEN!, 5, "") 'Measure current source sense R
ELSEIF SNM% = 3 THEN
CALL TCDUTCONNECT
END IF
FOR X = 1 TO 16 'Clear test result array
STATUS$(X) = ""
NEXT X
IF SNM% <> 2 AND SNM% <> 7 THEN
STATUS$(1) = UNDERRANGE$ 'Under-range test
ELSE
STATUS$(1) = "PASS" 'Pot in can't be under-ranged
END IF
STATUS$(2) = OVERRANGE$ 'Over-range test
STATUS$(3) = MINLOOPV$ 'Minimum loop voltage test
STATUS$(4) = MAXLOOPV$ 'Maximum loop voltage test
IF SNM% = 3 AND LEFT$(SPECS.MODNAME, 4) = "DSCT" THEN
A$ = CJCCAL$ 'Ambient temp sensor cal.
ELSEIF SNM% = 3 AND PON% < 0 AND LEFT$(SPECS.MODNAME, 4) = "SCT1" THEN
A$ = CJCCAL$ 'Ambient temp sensor cal.
END IF 'Pre-encap only.
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
IF (SNM% = 5 AND LEFT$(SPECS.MODNAME, 4) <> "DSCT") OR (SNM% = 7 AND LEFT$(SPECS.MODNAME, 4) <> "DSCT") THEN
STATUS$(6) = IEXC2$(IEXCSENSE!)
STATUS$(5) = IEXC1$(IEXCSENSE!)
STATUS$(7) = IMATCH$(STATUS$(5), STATUS$(6))
ELSEIF (SNM% = 5 AND LEFT$(SPECS.MODNAME, 4) <> "SCT1") OR (SNM% = 7 AND LEFT$(SPECS.MODNAME, 4) <> "SCT1") THEN
STATUS$(5) = SENSORIEXC$(0) 'min f.s. exc current
STATUS$(6) = SENSORIEXC$(1) 'max f.s. exc current
STATUS$(7) = "PASS"
ELSE
STATUS$(5) = IEXC1$(IEXCSENSE!)
STATUS$(6) = "PASS"
STATUS$(7) = "PASS"
END IF
ELSE
STATUS$(5) = "PASS"
STATUS$(6) = "PASS"
STATUS$(7) = "PASS"
END IF
ITERATION% = 0
DO
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
END IF
A$ = OFFSETCAL$(CAL%, CONTRES!) 'Offset calibration
A$ = GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, DELTAOS!) 'Gain calibration
IF CAL% = 0 THEN
OFFERR! = OFFSETERR!(CAL%, CONTRES!)
ELSE
OFFERR! = 0
END IF
ITERATION% = ITERATION% + 1
LOOP WHILE ABS(OFFERR!) >= ERRFACT * SPECS.CALTOL AND ITERATION% < 2
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
END IF
STATUS$(8) = LINTEST$(ACC$, CONTRES!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$()) 'Performs linearity and
'accuracy tests
STATUS$(9) = ACC$ 'Assigns results of accuracy test
'IF SNM% = 5 OR SNM% = 7 THEN 'Check if 3-wire resistance in
' STATUS$(10) = LEADREFF$(TOTLRESPEC!)
'ELSE
' STATUS$(10) = "PASS"
'END IF
STATUS$(11) = LOOPVSEN$ 'Loop supply sensitivity
' IF SNM% = 1 AND SPECS.MAXIN < 10! THEN 'Check for V in
' 'and Vmax <= 10V
' STATUS$(12) = INPUTR$ 'Input resistance / bias
' ELSE
STATUS$(12) = "PASS"
' END IF
IF SNM% = 3 OR SNM% = 4 THEN 'Check for TC in
STATUS$(13) = OPENTC$ 'Open thermocouple response
ELSE
STATUS$(13) = "PASS"
END IF
STATUS$(14) = FREQRESP$(GENAMPL!) 'Tests Frequency Response
IF SPECS.STEPRMIN < 97 AND SENSOROUT!(SPECS.MAXIN, 0) < 25! AND (SNM% < 5 OR SNM% > 7) AND SNM% <> 2 THEN
'Resistance input test head has too much delay
'Current source not set up for SETTHFAST
'Check for b.w. > approx 10Hz
STATUS$(15) = STEPRESP$ 'Tests Step Response
ELSE
STATUS$(15) = "PASS"
END IF
STATUS$(16) = OUTNOISE$ 'Test Output Noise
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
IF SNM% = 3 THEN CALL TCDUTDISCONNECT
END SUB
FUNCTION FAILS% (STATUS$())
FAILS% = 0
FOR X = 1 TO 16
IF LEFT$(STATUS$(X), 1) = "F" THEN 'Tests for failed tests
FAILS% = 1
END IF
NEXT
END FUNCTION
SUB FOOTER (STATUS$())
'NEED TO REVISE IN ORDER TO CHAGE CHECKLIST FOR VAS MODULES
IF FAILS%(STATUS$()) <> 1 THEN
IF LEFT$(SPECS.MODNAME, 7) = "SCMHVAS" THEN
PRINT
PRINT
ELSE
PRINT TAB(5); "240VAC Withstand"; TAB(71); "PASS"
PRINT TAB(5); "Hi-Pot"; TAB(71); "PASS"
END IF
PRINT TAB(5);
FOR X = 5 TO 75
PRINT "_";
NEXT
PRINT
PRINT TAB(35); "Check List"
PRINT
PRINT TAB(5); "Tested by: _______________"; TAB(45); "QC: _______________"
PRINT
PRINT TAB(5); "It is hereby certified that the above product is in conformance with"
PRINT TAB(5); "all requirements to the extent specified. This product is not"
PRINT TAB(5); "authorized or warranted for use in life support devices and/or systems."
PRINT
PRINT TAB(5); "* NIST traceable calibration certificates support Measured Value data."
PRINT TAB(5); " Calibration services are available through ANSI/NCSL Z540-1 and"
PRINT TAB(5); " ISO Guide 25 Certified Metrology Labs."
'Send to printer
IF PON% = 1 THEN
IF LEFT$(SPECS.MODNAME, 7) = "SCMHVAS" THEN
LPRINT
LPRINT
ELSE
LPRINT TAB(5); "240VAC Withstand"; TAB(71); "PASS"
LPRINT TAB(5); "Hi-Pot"; TAB(71); "PASS"
END IF
LPRINT TAB(5);
FOR X = 5 TO 75
LPRINT "_";
NEXT
LPRINT
LPRINT TAB(35); "Check List"
LPRINT
LPRINT TAB(5); "Tested by: _______________"; TAB(45); "QC: _______________"
LPRINT
LPRINT TAB(5); "It is hereby certified that the above product is in conformance with"
LPRINT TAB(5); "all requirements to the extent specified. This product is not"
LPRINT TAB(5); "authorized or warranted for use in life support devices and/or systems."
LPRINT
LPRINT TAB(5); "* NIST traceable calibration certificates support Measured Value data."
LPRINT TAB(5); " Calibration services are available through ANSI/NCSL Z540-1 and"
LPRINT TAB(5); " ISO Guide 25 Certified Metrology Labs."
END IF
END IF
END SUB
FUNCTION FREQRESP$ (GENAMPL!)
MININ! = SENSOROUT!(SPECS.MININ, 0) 'Determine min in
MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'Determine max in
IEXCMFS! = SPECS.IEXCMFS / 1000000! 'Convert to A
INRANGE! = MAXIN! - MININ!
ORANGE! = (SPECS.MAXOUT - SPECS.MINOUT) / 1000! 'Convert to A
SPEC! = SPECS.ATTEN
SPECTOL! = SPECS.ATTENTOL
SNM% = SENSORNUM%
CLS
TESTTITLE$ = "Frequency Response Test"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
PRINT "Testing, please wait."
IF SNM% >= 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!
XFERFN! = ORANGE! / (INRANGE! * IEXCMFS!) 'Gain in V/V
ELSEIF SNM% = 2 THEN 'mA in
THATTEN! = IINSEN.MEAS!
XFERFN! = ORANGE! / (INRANGE! / 1000!) 'V/mA
ELSE
IF ABS(MAXIN!) > 10 THEN MAXIN! = 10
THATTEN! = SETATTEN%(MAXIN!) 'Set test head attenuator
XFERFN! = ORANGE! / INRANGE! 'Gain in V/V
END IF
VOUTMEAS! = READDVM!(.001) 'Reads Meter
VAC! = SETAC!(CON%, GENAMPL!) 'Turns on AC input
CALL LOADMUX(2, CON%) 'Turns on mux
CALL WRITEDVM(VOAC$, 2000!) 'Sets up Meter (Autorange)
VOUTMEAS! = READDVM!(.0001) 'Reads Meter
IF VOUTMEAS! > .0002 THEN
VOUTMEAS! = SQR(VOUTMEAS! ^ 2 - .0002 ^ 2) 'Account for meter zero-input error
END IF 'See output noise test for details
IOUTMEAS! = VOUTMEAS! / RSENSE! 'Reads Meter
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.
ATTEN! = -20 * (LOG(IOUTMEAS! / (VAC! / THATTEN! * XFERFN!)) / LOG(10))
IF ABS(ATTEN! - SPEC!) <= SPECTOL! THEN
ATTEN$ = "PASS"
ELSE
ATTEN$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 10, 10
PRINT "Status: "; ATTEN$;
PRINT SPC(20);
PRINT TAB(10); USING "Attenuation at ##### Hz is"; SPECS.TESTFREQ%;
PRINT TAB(50); USING "###.# dB"; ATTEN!
PRINT TAB(10); "Required attenuation is";
PRINT TAB(50); USING "###.# +/- ##.# dB"; SPEC!; SPECTOL!
FREQRESP$ = ATTEN$ + STR$(ATTEN!) + "1"
VAC! = SETAC(COFF%, GENAMPL!) 'Turns off AC input
CALL PAUSE(1!)
END FUNCTION
SUB FUNCTEST (CAL%)
'Sequence of tests to determine if main transmitter circuits are functional
MAXOUT! = SPECS.MAXOUT
IF SETPOWER$(PSADDR%, 24!, FUNC$) = "FAIL" THEN 'Set loop V to 24V
EXIT SUB 'Do not proceed if over-
'current is detected
END IF
SNM% = SENSORNUM%
IF SENSOROUT!(SPECS.MININ, 0) = 99! THEN 'Check for valid sensor type
EXIT SUB
ELSEIF SNM% = 2 THEN 'Check if current input
IINSEN.MEAS! = IINSEN! 'Assign current source sense R
ELSEIF SNM% = 3 THEN
CALL TCDUTCONNECT
END IF
DO
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
CONFLAG% = 0
FOR FTEST% = 1 TO 3
SELECT CASE FTEST%
CASE 1
IF SNM% <> 2 AND SNM% <> 7 THEN
IF LEFT$(UNDERRANGE$, 4) = "FAIL" THEN 'Under-range check
CALL CONTINUE
CONFLAG% = 1 'Sets exit flag
END IF
END IF
IF LEFT$(OVERRANGE$, 4) = "FAIL" THEN 'Over-range check
CALL CONTINUE
CONFLAG% = 1 'Sets exit flag
END IF
CASE 2
IF LEFT$(MINLOOPV$, 4) = "FAIL" THEN 'Operation @ min loop V
CALL CONTINUE
CONFLAG% = 1
END IF
IF LEFT$(MAXLOOPV$, 4) = "FAIL" THEN 'Operation @ max loop V
CALL CONTINUE
CONFLAG% = 1
END IF
CASE 3
CONTRES! = 0
IF LEFT$(OFFSETCAL$(CAL%, CONTRES!), 4) = "FAIL" THEN
' CALL CONTINUE 'Checks for offset error < 12% span
CONFLAG% = 1
END IF
IF LEFT$(GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!), 4) = "FAIL" THEN
' CALL CONTINUE 'Checks for Gain error < 12% span
CONFLAG% = 1
END IF
END SELECT
IF CONFLAG% <> 0 THEN EXIT FOR
NEXT
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
IF SNM% = 3 THEN CALL TCDUTDISCONNECT
LOOP WHILE REPEAT$(SPECS.MODNAME) <> "N" 'Repeat for another transmitter
CALL RESETTH 'Reset the test head
END SUB
FUNCTION GAINCAL$ (CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!)
'Calibrate module gain
'Inputs; calibration flag
' CAL% 0 = calibrate module; high accuracy input, loop until calibrated,
' narrow error tolerance, AMPL! = 0, use SPECS.GNCALIN for DUT input
' 1 = measure once and exit, high accuracy input,
' narrow error tolerance, use AMPL! for DUT input.
' 2 = functional test; coarse input setting, wide error tolerance,
' measure once and exit, AMPL! = 0, use SPECS.GNCALIN for DUT input
'
' measured contact resistance (used for resistance in only)
SENSOR$ = SPECS.SENTYPE
MINOUT! = SPECS.MINOUT
MAXOUT! = SPECS.MAXOUT
INITTOL! = 12 'Uncalibrated offset tolerance
ACCTOL! = SPECS.ACCURACY 'Final calibration tolerance
CALTOL! = SPECS.CALTOL 'Calibration tolerance (% span)
OSCALIN! = SPECS.OSCALIN 'transmitter input for offset calibration
GNCALIN! = SPECS.GNCALIN 'transmitter input for gain calibration
BANDWIDTH! = SPECS.BANDWIDTH
LIN% = SPECS.LINEARIZED
CALGN! = SPECS.GNCALPT / 100! 'Convert from %
ORANGE! = (MAXOUT! - MINOUT!) / 1000 'Output range (A)
SNM% = SENSORNUM%
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN
CALSPAN! = Iout!(SENSOROUT!(GNCALIN!, 0)) - Iout!(SENSOROUT!(OSCALIN!, 0)) 'Adjustment range is +/- x% of +f.s.
'Output not linear w/ input
ELSE 'temperature.
CALSPAN! = Iout!(GNCALIN!) - Iout!(OSCALIN!) 'Adjustment range is +/- x% of +f.s.
END IF
CLS
TESTTITLE$ = "Gain Calibration"
CALL HEADERB(TESTTITLE$)
CALL MODOUTLINE
LOCATE 7
PRINT TAB(44); CHR$(24);
PRINT TAB(35); "GAIN POTENTIOMETER";
IF CAL% = 2 THEN
GERROR! = INITTOL! 'tolerance for func. test (%)
TOL! = .0001 'Measurement tolerance, 1 pass test
ELSEIF CAL% = 1 THEN
GERROR! = ACCTOL! 'tolerance for cal check
TOL! = .0001 'Measurement tolerance, 1 pass test
ELSE
GERROR! = CALTOL! 'Gain 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!) 'Set +f.s. input
END IF
IF LEFT$(SPECS.MODNAME, 7) <> "SCMHVAS" THEN
LOCATE 19, 10
PRINT "Observe that the LED between the potentiometers is ON."
BEEP ': BEEP: BEEP
LOCATE 20, 5
PRINT "After you have verified the LED is ON, you may press any key to continue."
CALL CONTINUE
END IF
DO
TIME1! = TIMER 'Start timer
LOCATE 10, 10
PRINT TAB(10); "Measuring input. Please wait..."
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in
IF CAL% = 0 THEN CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
MAXINMEAS! = MEASRES!(MAXIN!, 3, "") + CONTRES! 'Measure simulated resistor
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
PAUSE (2)
ELSE
IF SNM% = 3 THEN
PTCV! = PARASITICTCV!(VCJC!)
IF VCJC! = 99! THEN EXIT FUNCTION
END IF
MAXIN! = SENSOROUT!(GNCALIN!, PTCV!) 'Calc. maxin volts
IF SNM% = 2 THEN
MAXINMEAS! = SETCURRENTIN!(MAXIN!)
ELSE
CALL SETDAC(MAXIN!, 1, 0) 'Sets DAC
IF CAL% = 0 OR MAXIN! > 10! THEN 'Always measure high voltage
'input to get exact setting
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CALL LOADMUX(1, CON%)
CALL WRITEDVM(VODC$, MAXIN!) 'Sets meter to read
MAXINMEAS! = READDVM!(MAXIN! * .0002) '0.02% tolerance
CALL LOADMUX(1, COFF%)
VERR! = MAXINMEAS! - MAXIN!
IF ABS(VERR!) > 1! THEN '1.0 V tolerance
BEEP
PRINT TAB(10); "Input voltage out of range"
PRINT TAB(10); "Error = "; VERR!; "V"
PRINT TAB(10); "Check all the test head connections."
PRINT TAB(10); "Notify engineering if problem persists."
CONTINUE
STOP
END IF
ELSE
MAXINMEAS! = MAXIN!
END IF
END IF
END IF
CALL WRITEDVM("S1", 0) 'Medium reading rate
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN 'Output not linear w/ input
'temperature.
IOUTCALC! = Iout!(MAXINMEAS! + PTCV!) + CALGN! * ORANGE!
ELSE
IOUTCALC! = (Iout!(SENSORIN!(MAXINMEAS!, PTCV!)) + CALGN! * ORANGE!)
END IF
CALL LOADMUX(2, CON%) 'Measure output
CALL WRITEDVM(VODC$, (IOUTCALC! + CALSPAN! * INITTOL / 100!) * RSENSE!) 'Scale meter
CALL PAUSE(2!) 'Wait for output to settle.
LOCATE 10, 10
PRINT "Gain Error = ";
PRINT SPC(20);
L% = 0
DO
L% = L% + 1
ERRORPERC! = (READDVM!(TOL!) / RSENSE! - IOUTCALC!) / ORANGE! * 100!'Error (%)
LOCATE 10, 24
PRINT USING "+###.### %"; ERRORPERC!
LOCATE 15, 10
IF CAL% > 0 THEN
CONREADS% = 5
ELSEIF ABS(ERRORPERC!) < GERROR! THEN
SOUND 400, .5
PRINT "Stop turning gain potentiometer "
CONREADS% = CONREADS% + 1
ELSEIF ERRORPERC! < 0 THEN
PRINT "Turn gain potentiometer clockwise "
CONREADS% = 0
ELSE
PRINT "Turn gain potentiometer counter-clockwise"
CONREADS% = 0
END IF
LOCATE 20, 10
A$ = INKEY$
IF UCASE$(A$) = "T" THEN
PRINT TAB(10); "Trouble Shooting Mode"
CALL WRITEDVM("*", IOUTCALC! * RSENSE!)
CALL CONTINUE
CALL WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
LOCATE 20, 10
PRINT SPC(22);
ELSEIF UCASE$(A$) = "C" THEN
CONREADS% = 5
END IF
're-measure input
'once every 40 cycles
CALL PAUSE(.2) 'Slow down loop
LOOP WHILE CONREADS% < 5 AND L% < 150
CALL LOADMUX(2, COFF%) 'Measure output
'IF CAL% = 0 OR MAXIN! > 10! THEN
'CALL WRITEDVM("S1", 0) 'Medium reading rate
'END IF
LOOP WHILE CONREADS% < 5
IF ABS(ERRORPERC!) <= GERROR! THEN
GN$ = "PASS"
ELSE
GN$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 15, 10
PRINT "Status: "; GN$;
PRINT SPC(30);
PRINT TAB(10); "Gain calibration error is";
PRINT TAB(50); USING " +###.### %"; ERRORPERC!
PRINT TAB(10); "Max. gain calibration error is";
PRINT TAB(50); USING "+/-###.### %"; GERROR!
GAINCAL$ = GN$ + STR$(ERRORPERC!) + "3"
IF TH$ = "TE1164" THEN
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Disable High Voltage
ELSE
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
END IF
CALL RESETTH 'Reset test head
CALL PAUSE(1!)
END FUNCTION
FUNCTION GAINCALINT$ (CAL%)
SENSOR$ = SPECS.SENTYPE
MINOUT! = SPECS.MINOUT
MAXOUT! = SPECS.MAXOUT
CALTOL! = SPECS.CALTOL 'Calibration tolerance (% span)
GNCALIN! = SPECS.GNCALIN 'transmitter input for gain calibration
OSCALIN! = SPECS.OSCALIN 'transmitter input for offset calibration
CALGN! = SPECS.GNCALPT / 100! 'Convert from %
CALOS! = SPECS.OSCALPT / 100! 'Convert from %
LIN% = SPECS.LINEARIZED
ORANGE! = (MAXOUT! - MINOUT!) / 1000 'Output range (A)
SNM% = SENSORNUM%
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN
CALSPAN! = Iout!(SENSOROUT!(GNCALIN!, 0)) - Iout!(SENSOROUT!(OSCALIN!, 0)) 'Adjustment range is +/- x% of +f.s.
'Output not linear w/ input
ELSE 'temperature.
CALSPAN! = Iout!(GNCALIN!) - Iout!(OSCALIN!) 'Adjustment range is +/- x% of +f.s.
END IF
CLS
TESTTITLE$ = "Gain Calibration"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
PRINT "Please wait..."
GERROR! = CALTOL! 'Gain calibration tolerance (%)
TOL! = .0001
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
DO
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in
IF CAL% = 0 THEN CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
MAXINMEAS! = MEASRES!(MAXIN!, 3, "") + CONTRES! 'Measure simulated resistor
ELSE
IF SNM% = 3 THEN
PTCV! = PARASITICTCV!(VCJC!)
IF VCJC! = 99! THEN EXIT FUNCTION
END IF
MAXIN! = SENSOROUT!(GNCALIN!, PTCV!) 'Calc. maxin volts
IF SNM% = 2 THEN
MAXINMEAS! = SETCURRENTIN!(MAXIN!)
ELSE
CALL SETDAC(MAXIN!, 1, 0) 'Sets DAC
IF CAL% = 0 OR MAXIN! > 10! THEN 'Always measure high voltage
'input to get exact setting
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CALL LOADMUX(1, CON%)
CALL WRITEDVM(VODC$, MAXIN!) 'Sets meter to read
MAXINMEAS! = READDVM!(MAXIN! * .0002) '0.02% tolerance
CALL LOADMUX(1, COFF%)
ELSE
MAXINMEAS! = MAXIN!
END IF
END IF
END IF
CALL WRITEDVM("S1", 0) 'Medium reading rate
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN
IOUTCALC! = Iout!(MAXINMEAS! + PTCV!) + CALGN! * ORANGE!
'Output not linear w/ input
ELSE 'temperature.
IOUTCALC! = Iout!(SENSORIN!(MAXINMEAS!, PTCV!)) + CALGN! * ORANGE!
END IF
CALL LOADMUX(2, CON%) 'Measure Iout
CALL WRITEDVM(VODC$, IOUTCALC! * RSENSE!)
CALL PAUSE(5!) 'Wait for output to settle.
ERRORPERC1! = (READDVM!(TOL!) / RSENSE! - IOUTCALC!) / ORANGE! * 100!'Error (%)
LOCATE 10, 10
PRINT USING "PLUS FULL SCALE ERROR = +###.### %"; ERRORPERC1!
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in
IF CAL% = 0 THEN CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
MININMEAS! = MEASRES!(MININ!, 3, "") + CONTRES! 'Measure simulated resistor
ELSE
IF SNM% = 3 THEN
PTCV! = PARASITICTCV!(VCJC!)
IF VCJC! = 99! THEN EXIT FUNCTION
END IF
MININ! = SENSOROUT!(OSCALIN!, PTCV!) 'Calc. minin volts, meas. vcjc
IF SNM% = 2 THEN
MININMEAS! = SETCURRENTIN!(MININ!)
ELSE
CALL SETDAC(MININ!, 1, 0) 'Sets DAC
IF CAL% = 0 OR MAXIN! > 10! THEN 'Always measure high voltage
'input to get exact reading
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CALL LOADMUX(1, CON%)
CALL WRITEDVM(VODC$, MININ!) 'Sets meter to read
MININMEAS! = READDVM!(MININ! * .0002) '0.02% tolerance
CALL LOADMUX(1, COFF%)
ELSE
MININMEAS! = MININ!
END IF
END IF
END IF
CALL WRITEDVM("S1", 0) 'Medium reading rate
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN
IOUTCALC! = Iout!(MININMEAS! + PTCV!) + CALOS! * ORANGE!
'Output not linear w/ input
ELSE 'temperature.
IOUTCALC! = Iout!(SENSORIN!(MININMEAS!, PTCV!)) + CALOS! * ORANGE!
END IF
CALL LOADMUX(2, CON%) 'Measure Vsense
CALL WRITEDVM(VODC$, (IOUTCALC! + CALSPAN! * INITTOL / 100!) * RSENSE!) 'Scale meter
CALL PAUSE(5!) 'Wait for output to settle.
ERRORPERC2! = (READDVM!(TOL!) / RSENSE! - IOUTCALC!) / ORANGE! * 100!'Error (%)
PRINT TAB(10); USING "MINUS FULL SCALE ERROR = +###.### %"; ERRORPERC2!
LOCATE 13, 10
ERRORPERC3! = ERRORPERC1! - ERRORPERC2!
IF ABS(ERRORPERC3!) > GERROR! THEN
CONREADS% = 0
IF ERRORPERC3! < 0 THEN
PRINT "Turn GAIN potentiometer CLOCKWISE "
ELSE
PRINT "Turn GAIN potentiometer COUNTER-CLOCKWISE"
END IF
ELSE
CONREADS% = CONREADS% + 1
SOUND 400, .5
PRINT "STOP turning potentiometer";
PRINT SPC(20); : PRINT
END IF
A$ = INKEY$
IF UCASE$(A$) = "T" THEN
PRINT TAB(10); "Trouble Shooting Mode"
CALL WRITEDVM("*", IOUTCALC! * RSENSE!)
CALL CONTINUE
LOCATE 20, 10
PRINT SPC(22);
ELSEIF UCASE$(A$) = "C" THEN
CONREADS% = 3
END IF
LOOP WHILE CONREADS% < 3
IF ABS(ERRORPERC3!) < GERROR! THEN
GN$ = "PASS"
ELSE
GN$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 15, 10
PRINT "Status: "; GN$;
PRINT SPC(30);
PRINT TAB(10); "Gain calibration error is";
PRINT TAB(50); USING " +###.### %"; ERRORUA3!
PRINT TAB(10); "Max.gain calibration error is";
PRINT TAB(50); USING "+/-###.### %"; GERROR!
PRINT SPC(70);
GAINCALINT$ = GN$ + STR$(ERRORPERC3!)
CALL RESETTH 'Reset test head
CALL PAUSE(1!)
END FUNCTION
FUNCTION GAINERR! (CAL%, CONTRES!, PFSMEAS!, INTERACT!, OSERR2!)
'Measure the module gain error
'Inputs; calibration flag
' CAL% 0 = calibrate module; high accuracy input, loop until calibrated,
' narrow error tolerance, AMPL! = 0, use SPECS.GNCALIN for DUT input
' 1 = measure once and exit, high accuracy input,
' narrow error tolerance, use AMPL! for DUT input.
' 2 = functional test; coarse input setting, wide error tolerance,
' measure once and exit, AMPL! = 0, use SPECS.GNCALIN for DUT input
'
' measured contact resistance (used for resistance in only)
SENSOR$ = SPECS.SENTYPE
MINOUT! = SPECS.MINOUT
MAXOUT! = SPECS.MAXOUT
INITTOL! = 12 'Uncalibrated offset tolerance
ACCTOL! = SPECS.ACCURACY 'Final calibration tolerance
CALTOL! = SPECS.CALTOL 'Calibration tolerance (% span)
OSCALIN! = SPECS.OSCALIN 'transmitter input for offset calibration
GNCALIN! = SPECS.GNCALIN 'transmitter input for gain calibration
BANDWIDTH! = SPECS.BANDWIDTH
LIN% = SPECS.LINEARIZED
CALGN! = SPECS.GNCALPT / 100! 'Convert from %
ORANGE! = (MAXOUT! - MINOUT!) / 1000 'Output range (A)
SNM% = SENSORNUM%
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN
CALSPAN! = Iout!(SENSOROUT!(GNCALIN!, 0)) - Iout!(SENSOROUT!(OSCALIN!, 0)) 'Adjustment range is +/- x% of +f.s.
'Output not linear w/ input
ELSE 'temperature.
CALSPAN! = Iout!(GNCALIN!) - Iout!(OSCALIN!) 'Adjustment range is +/- x% of +f.s.
END IF
CLS
TESTTITLE$ = "Gain Calibration Verification"
CALL HEADERB(TESTTITLE$)
GERROR! = CALTOL! 'tolerance for cal check
TOL! = .0001 'Measurement tolerance, 1 pass test
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in
MAXIN! = SENSOROUT!(GNCALIN!, 0) 'Calc. +f.s. ohms
CALL OHMSET(MAXIN!) 'Set +f.s. input
END IF
LOCATE 10, 10
PRINT TAB(10); "Measuring input. Please wait..."
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if RTD in
IF CAL% = 0 THEN CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
MAXINMEAS! = MEASRES!(MAXIN!, 3, "") + CONTRES! 'Measure simulated resistor
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
PAUSE (2)
ELSE
IF SNM% = 3 THEN
PTCV! = PARASITICTCV!(VCJC!)
IF VCJC! = 99! THEN EXIT FUNCTION
END IF
MAXIN! = SENSOROUT!(GNCALIN!, PTCV!) 'Calc. maxin volts
IF SNM% = 2 THEN
MAXINMEAS! = SETCURRENTIN!(MAXIN!)
ELSE
CALL SETDAC(MAXIN!, 1, 0) 'Sets DAC
IF CAL% = 0 OR MAXIN! > 10! THEN 'Always measure high voltage
'input to get exact setting
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CALL LOADMUX(1, CON%)
CALL WRITEDVM(VODC$, MAXIN!) 'Sets meter to read
MAXINMEAS! = READDVM!(MAXIN! * .0002) '0.02% tolerance
CALL LOADMUX(1, COFF%)
VERR! = MAXINMEAS! - MAXIN!
IF ABS(VERR!) > 1! THEN '1.0 V tolerance
BEEP
PRINT TAB(10); "Input voltage out of range"
PRINT TAB(10); "Error = "; VERR!; "V"
PRINT TAB(10); "Check all the test head connections."
PRINT TAB(10); "Notify engineering if problem persists."
CONTINUE
STOP
END IF
ELSE
MAXINMEAS! = MAXIN!
END IF
END IF
END IF
CALL WRITEDVM("S1", 0) 'Medium reading rate
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN 'Output not linear w/ input
'temperature.
IOUTCALC! = Iout!(MAXINMEAS! + PTCV!) + CALGN! * ORANGE!
ELSE
IOUTCALC! = (Iout!(SENSORIN!(MAXINMEAS!, PTCV!)) + CALGN! * ORANGE!)
END IF
CALL LOADMUX(2, CON%) 'Measure output
CALL WRITEDVM(VODC$, (IOUTCALC! + CALSPAN! * INITTOL / 100!) * RSENSE!) 'Scale meter
CALL PAUSE(2!) 'Wait for output to settle.
LOCATE 10, 10
PRINT "Gain Error = ";
PRINT SPC(20);
ERRORPERC! = (READDVM!(TOL!) / RSENSE! - IOUTCALC!) / ORANGE! * 100!'Error (%)
LOCATE 10, 24
PRINT USING "+###.### %"; ERRORPERC!
LOCATE 15, 10
CONREADS% = 5
LOCATE 20, 10
A$ = INKEY$
IF UCASE$(A$) = "T" THEN
PRINT TAB(10); "Trouble Shooting Mode"
CALL WRITEDVM("*", IOUTCALC! * RSENSE!)
CALL CONTINUE
CALL WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
LOCATE 20, 10
PRINT SPC(22);
ELSEIF UCASE$(A$) = "C" THEN
CONREADS% = 5
END IF
CALL LOADMUX(2, COFF%) 'Measure output
IF ABS(ERRORPERC!) <= GERROR! THEN
GN$ = "PASS"
ELSE
GN$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 15, 10
PRINT "Status: "; GN$;
PRINT SPC(30);
PRINT TAB(10); "Gain calibration error is";
PRINT TAB(50); USING " +###.### %"; ERRORPERC!
PRINT TAB(10); "Max. gain calibration error is";
PRINT TAB(50); USING "+/-###.### %"; GERROR!
GAINERR! = ERRORPERC!
IF TH$ = "TE1164" THEN
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Disable High Voltage
ELSE
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
END IF
CALL RESETTH 'Reset test head
END FUNCTION
FUNCTION GENATTENR!
'This routine is used for RTD or pot. input transmitters only.
'It determines the simulated RTD input to the transmitter 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
IEXCMFS! = SPECS.IEXCMFS / 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! = IEXCMFS!
B! = IEXCMFS! * (RFNGN! - RMID!) - VOS
C! = -1 * RFNGN! * IEXCMFS! * 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%
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
IEXC! = SPECS.IEXCMFS / 1000000! 'Convert to A
R! = GENATTENR! 'Find attenuator shunt R
GENAMPL! = (IEXC! * INRANGE! * (RFNGN! + R!)) / R! * .9
IF GENAMPL! > 10 THEN GENAMPL! = 10 'HP33120A limit. Max amplitude
'is 2x offset.
GENOS! = -5 'Offset
ELSEIF SNM% = 2 THEN
GENAMPL! = 5 '32-01, 32-02; Iin max = 5/(250+20) = 18.5mA, Iin min = 0mA
GENOS! = 2.5 'Offset
ELSE
ORANGE! = SPECS.MAXOUT! - SPECS.MINOUT!
'Set amplitude for > 5mV p-p signal out
UNATTENOUT! = 10 ^ (ATTEN! / 20) * .005
GENAMPL! = UNATTENOUT! / ORANGE! * INRANGE! * .9
'Convert to round numbers
'for ease of use
IF GENAMPL! < 5 THEN
GENAMPL! = 5
ELSE
GENAMPL! = 10
END IF
GATTEN! = INRANGE! / GENAMPL! 'Attenuator gain
GENOS! = (MININ! + INRANGE! / 2!) / GATTEN!
END IF
IF GENAMPL! < .5 * ABS(GENOS!) THEN GENAMPL! = .5 * ABS(GENOS!)
IF GENAMPL! > 20 - 2 * ABS(GENOS!) THEN GENAMPL! = 20 - 2 * ABS(GENOS!)
CLS
LOCATE 5, 10
PRINT "Set the function generator as follows:"
LOCATE 10, 27
PRINT "Function Generator Settings"
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
'PS1ADDR$ = Power Supply #1 address (module power)
'PS2ADDR$ = Power Supply #2 address (high voltage input to dut)
'PSPORTADDR$ = Power Supply serial port address
'DVM$ = DVM address
OPEN "C:\ATE\ADDR\" + FILENAME$ FOR RANDOM AS #3 LEN = 19
FIELD #3, 3 AS LPT$, 2 AS MUX$, 2 AS TESTHEAD$, 2 AS DPSPSADDR$, 2 AS DPSVINADDR$, 2 AS PSPORTADDR$, 2 AS DVM$, 2 AS ABCPSADDR$, 2 AS ABCVINADDR$
GET #3
LPTADDR% = VAL(LPT$)
MUXADDR% = VAL(MUX$)
THADDR% = VAL(TESTHEAD$)
DPSPSADDR% = VAL(DPSPSADDR$)
DPSVINADDR% = VAL(DPSVINADDR$)
PSPORT% = VAL(PSPORTADDR$)
DVMADDR% = VAL(DVM$)
ABCPSADDR% = VAL(ABCPSADDR$)
ABCVINADDR% = VAL(ABCVINADDR$)
CLOSE #3
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.
' PSADDR% = 2
'****** Obtain Identification string from KEPCO DPS 125.
PRINT TAB(20); "KEPCO DPS125 Power Supply: ";
DPSPS$ = POWERIO$(DPSPSADDR%, "ID")
'****** Assign corresponding address obtained from address file dependent
'****** on if the Power supply is DPS125 or ABC125.
IF DPSPS$ = "KEPCO DPS 125-0.5M" THEN
PSADDR% = DPSPSADDR% 'this value should = 2
PRINT TAB(55); "Yes!"
PSMODEL$ = "DPS125"
CALL INITPS(DPSPSADDR%, PSILIMIT!, OVERV!)
DPSPSFLAG! = 1!
ELSE
PRINT TAB(55); "Not present"
DPSPSFLAG! = 0!
PSADDR% = 0!
END IF
'****** 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 DPSPSFLAG! = 0! AND DPSVINFLAG! = 0! THEN
PSMODEL$ = "ABC125"
PRINT TAB(20); "KEPCO ABC-125 Power Supply: ";
ABCPS$ = READGPIB$(ABCPSADDR%, "*IDN?")
IF LEFT$(ABCPS$, 14) = "KEPCO,ABC-1251" THEN
PSADDR% = ABCPSADDR%
CALL INITPS(ABCPSADDR%, PSILIMIT!, OVERV!)
PRINT TAB(55); "Yes!"
ELSE
PRINT TAB(55); "Not present"
END IF
PRINT TAB(20); "KEPCO ABC-125 High-Voltage Input: ";
ABCVIN$ = READGPIB$(ABCVINADDR%, "*IDN?")
IF LEFT$(ABCVIN$, 14) = "KEPCO,ABC-1251" THEN
VINADDR% = ABCVINADDR%
CALL INITPS(ABCVINADDR%, VINILIMIT!, VINOVERV!)
PRINT TAB(55); "Yes!"
PRINT
ELSE
PRINT TAB(55); "Not present"
PRINT
END IF
END IF
IF PSADDR% = 0! AND VINADDR% = 0! THEN
PRINT TAB(15); ">>>>>>>> No Power Supplies are connected <<<<<<<<"
CALL CONTINUE
END IF
GETPSID% = 99 'This has yet to be utilized. At this time there is
'no requirement to pass anthing back to function call
END FUNCTION
SUB GETSN (SN$)
CLS
TESTTITLE$ = "Serial Number Entry"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
INPUT "Enter Work Order number "; WO$
LOCATE , 10
INPUT "Starting dash number (Press 'Enter' for 1) "; DS$
IF DS$ = "" THEN DS$ = "1"
SN$ = WO$ + "-" + DS$
END SUB
SUB GETSPECS
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); "--------------------"
PRINT
YINIT% = CSRLIN 'Initialize starting rows
OPEN "C:\ATE\SCTDATA\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% = 20 '14 char + 4 char for # + 2 spaces
NUMLINES! = 19 '# of lines for model display below header
NUMCOLUMNS! = 1 + INT(NUMRECORD! / NUMLINES!)
'Model # length = 20 characters max
'-> 3 columns max per screen
'3 columns x 26 char = 78 spaces
I% = 1
FOR C% = 0 TO NUMCOLUMNS! - 1
Y% = YINIT%
TB% = SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + NUMCHAR% * C%
DO
GET #2, I%, SORTDATA1
IF SORTDATA1.RECNUM <> -1 THEN
POINTER%(I%) = SORTDATA1.RECNUM
LOCATE Y%, TB%
PRINT USING "##.) &"; I%; SORTDATA1.MODNAME
I% = I% + 1
Y% = Y% + 1
END IF
LOOP WHILE SORTDATA1.RECNUM <> -1 AND Y% - YINIT% < NUMLINES!
NEXT C%
LOCATE Y%, TB%
PRINT USING "##.) Exit"; I%
CLOSE #2
DO
LOCATE 23, SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + 1
PRINT "Enter Selection ";
INPUT SEL%
LOOP WHILE SEL% < 1 OR SEL% > I%
IF SEL% = I% THEN
SPECS.MODNAME = "EXIT"
ELSE
OPEN "C:\ATE\SCTDATA\SCTMAIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
GET #1, POINTER%(SEL%), SPECS
CLOSE #1
IF TH$ <> "TE1164" THEN
RSENSE! = MEASRES!(LPSEN!, 1, TH$) 'Measure loop sense resistor (check test head conn.)
IF SENSORNUM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -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."
PRINT
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
ELSE
RSENSE! = 1000 'Loop sense resistor. Use as a scale factor
END IF
END IF
END SUB
SUB GETSPECS2
DIM POINTER%(1000)
'Create a file containing just the model numbers of all of the
'records in the database for the model family selected
OPEN "C:\ATE\SCTDATA\DBSORT2.DAT" FOR RANDOM AS #2 LEN = LEN(SORTDATA1)
OPEN "C:\ATE\SCTDATA\SCTMAIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
NUMRECORD% = LOF(1) / LEN(SPECS)
N% = 0
FOR I% = 1 TO NUMRECORD%
GET #1, I%, SPECS
SORTDATA1.MODNAME = SPECS.MODNAME
SORTDATA1.RECNUM = I%
'SPECS.MODNAME = "SCMVAS-MXXX
IF LEFT$(SPECS.MODNAME, 7) = "SCMHVAS" THEN
PUT #2, , SORTDATA1 'write record # and model number
N% = N% + 1 'found a record
END IF
NEXT
SORTDATA1.MODNAME = "999999999-9999" 'always sorted to last value.
SORTDATA1.RECNUM = -1 'flag indicating end of new data (over writes old)
PUT #2, , SORTDATA1
CLOSE #1
CLOSE #2
CLS
LOCATE , 30
PRINT "Model Selection Menu"
PRINT TAB(30); "--------------------"
PRINT
YINIT% = CSRLIN 'Initialize starting rows
I% = 0
OPEN "C:\ATE\SCTDATA\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% = 20 '14 char + 4 char for # + 2 spaces
NUMLINES! = 19 '# of lines for model display below header
NUMCOLUMNS! = 1 + INT(NUMRECORD! / NUMLINES!)
'Model # length = 20 characters max
'-> 3 columns max per screen
'3 columns x 26 char = 78 spaces
I% = 1
FOR C% = 0 TO NUMCOLUMNS! - 1
Y% = YINIT%
TB% = SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + NUMCHAR% * C%
DO
GET #2, I%, SORTDATA1
IF SORTDATA1.RECNUM <> -1 THEN
POINTER%(I%) = SORTDATA1.RECNUM
LOCATE Y%, TB%
PRINT USING "##.) &"; I%; SORTDATA1.MODNAME
I% = I% + 1
Y% = Y% + 1
END IF
LOOP WHILE SORTDATA1.RECNUM <> -1 AND Y% - YINIT% < NUMLINES!
NEXT C%
LOCATE Y%, TB%
PRINT USING "##.) Exit"; I%
CLOSE #2
DO
LOCATE 23, SCRNCTR% - NUMCHAR% / 2 * NUMCOLUMNS! + 1
PRINT "Enter Selection ";
INPUT SEL%
LOOP WHILE SEL% < 1 OR SEL% > I%
IF SEL% = I% THEN
SPECS.MODNAME = "EXIT"
ELSE
OPEN "C:\ATE\SCTDATA\SCTMAIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
GET #1, POINTER%(SEL%), SPECS
CLOSE #1
RSENSE! = 1000 'Loop sense resistor. Use as a scale factor
'since IOUT calculates output in amps.
END IF
FILENAME$ = "KSCTVIN.ADR" 'Parallel port, mux & test head addresses
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
END SUB
SUB HEADERA (SN$)
LPRINT TAB(5); "DATAFORTH CORPORATION"; TAB(51); "Phone: (520) 741-1404"
LPRINT TAB(5); "3331 E. Hemisphere Loop"; TAB(51); "Fax: (520) 741-0762"
LPRINT TAB(5); "Tucson, AZ 85706 USA"; TAB(51); "email: info@dataforth.com"
LPRINT
LPRINT TAB(33); "TEST DATA SHEET"
LPRINT TAB(5);
FOR X = 5 TO 75
LPRINT "~";
NEXT
LOCATE 8
LPRINT TAB(5); "Date: "; DATE$
LPRINT TAB(5); "Model: "; SPECS.MODNAME
LPRINT TAB(5); "SN: "; TAB(12); SN$
LPRINT
END SUB
SUB HEADERB (TESTTITLE$)
'print test title, model under test, and sn at top of screen
TITLEN = LEN(TESTTITLE$) + LEN(SPECS.MODNAME)
PRINT TAB(40 - TITLEN / 2); SPECS.MODNAME; " "; TESTTITLE$;
IF SN$ <> "" THEN
PRINT TAB(66); "SN: "; SN$ 'print sn if available
ELSE
PRINT
END IF
LOCATE , 40 - TITLEN / 2
FOR L = 1 TO TITLEN + 1 'underline test title
PRINT "-";
NEXT
PRINT
END SUB
SUB HVPSMSG
CLS
LOCATE , 32
PRINT "Test Head Setup"
PRINT TAB(31); "-----------------"
PRINT
LOCATE 10, 10
PRINT TAB(10); "Connect a KEPCO DPS125 or KEPCO ABC125 High Voltage programmable"
PRINT TAB(10); "power supply to the test head Vin banana jack inputs."
PRINT
PRINT TAB(10); "If using KEPCO DPS125: set selector switches to address 2."
PRINT
PRINT TAB(5); "The newer KEPCO ABC 125 Power Supply's GPIB address is set to 6"
PRINT TAB(5); "from the front panel by pressing: Menu, Menu, 06, ENTER, RESET."
PRINT
CALL CONTINUE
END SUB
FUNCTION IEXC1$ (IEXCSENSE!)
'This routine tests current source I1 (-IN lead)
'4-wire input transmitters use this current source.
IEXCMFS! = SPECS.IEXCMFS 'Excitation current (uA)
IEXCTOL! = .02 'Initial tolerance = +/-2.0%
'Changed from +/-1.6% 09/16/99
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$, IEXCSEN! * IEXCMFS! * .000001)
IMINUSIN! = READDVM(.001) / IEXCSENSE! * 1000000! 'Excitation current (uA)
ELSE '4-wire input
'Above test for 3-wire transmitters will
'saturate 4-wire transmitters at the + rail
CONTRES! = 0 'Output is close enough w/o 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!
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop voltage to 24V
CALL LOADMUX(1, CON%) 'Measure input voltage
CALL WRITEDVM(VODC$, MAXIN! * IEXCMFS!)
MEASVIN! = READDVM(MAXIN! * IEXCMFS! * .0005) '.05% tolerance
IMINUSIN! = MEASVIN! / MAXINMEAS! * 1000000! '(uA)
END IF
IF IMINUSIN! < 25 THEN 'Check if I1 is working
IEXCMFS! = 99
I1STAT$ = "FAIL"
SOUND 1000, .5
LOCATE 10, 10
PRINT "Current source I1 (-IN terminal) is not working."
CALL CONTINUE
ELSEIF ABS(IMINUSIN! - IEXCMFS!) > IEXCMFS! * IEXCTOL! THEN
I1STAT$ = "FAIL"
SOUND 1000, .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."
ELSE
I1STAT$ = "PASS"
END IF
LOCATE 15, 10
PRINT "Status: "; I1STAT$;
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"; IEXCMFS!; IEXCMFS! * IEXCTOL!
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(1!)
END FUNCTION
FUNCTION IEXC2$ (IEXCSENSE!)
'This routine tests current source I2 (+IN lead)
'4-wire input transmitters DO NOT use this current source.
IEXCMFS! = SPECS.IEXCMFS 'Excitation current (uA)
IEXCTOL! = .02 'Initial tolerance = +/-2.0%
'Changed from +/-1.6% 09/16/99
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, "") 'Measure excitation current source
'sense resistor
CALL OHMSET(1E+30) 'Set input R = infinity
CALL SETTEST(0) 'Route I2 through sense R
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop voltage to 24V
CALL LOADMUX(1, CON%) 'Measure differential input
'voltage to check sense
'resistor matching
CALL WRITEDVM(VODC$, .05)
DIFFIN! = ABS(READDVM(.001))
IF DIFFIN! > 10 THEN 'Meter overrange, I2 is not working
IEXCMFS! = 99
I2STAT$ = "FAIL"
SOUND 1000, .5
LOCATE 10, 10
PRINT "Current source I2 (+IN terminal) is not working."
CALL CONTINUE
ELSEIF DIFFIN! > IEXCMFS! * RIN! * 1.1 THEN 'Current source sense resistors
IEXCMFS! = 99 'are out of matching tolerance
I2STAT$ = "FAIL" '10% tolerance
SOUND 1000, .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$, IEXCSEN! * IEXCMFS! * .000001)
IPLUSIN! = READDVM(.001) / IEXCSENSE! * 1000000! 'Excitation current (uA)
IF ABS(IPLUSIN! - IEXCMFS!) <= IEXCMFS! * IEXCTOL! THEN
I2STAT$ = "PASS"
ELSE
I2STAT$ = "FAIL"
SOUND 1000, .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 15, 10
PRINT "Status: "; I2STAT$;
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"; IEXCMFS!; IEXCMFS! * IEXCTOL!
CALL LOADMUX(4, COFF%)
END IF
IF I2STAT$ = "FAIL" THEN CALL CONTINUE 'Pause to read note
IEXC2$ = I2STAT$ + STR$(IPLUSIN!) + "1"
CALL PAUSE(1!)
END FUNCTION
FUNCTION IMATCH$ (I1$, I2$)
'Current sources must be matched to a specified tolerance to
'guarantee the lead resistance effect spec.
'Not applicable to 4-wire input transmitters
IEXCMFS! = SPECS.IEXCMFS 'Excitation current (uA)
IMATCHTOL! = SPECS.IMATCHTOL! '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!) / IEXCMFS!
IF ABS(DIFF!) <= IMATCHTOL! THEN
IMSTAT$ = "PASS"
ELSE
IMSTAT$ = "FAIL"
SOUND 1000, .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 15, 10
PRINT "Status: "; IMSTAT$;
PRINT TAB(10); "Measured current source matching is";
PRINT TAB(50); USING "+###.## %"; DIFF!
PRINT TAB(10); "Required matching is";
PRINT TAB(50); USING "+/-#.## %"; IMATCHTOL!
IMATCH$ = IMSTAT$ + STR$(DIFF!) + "2"
CALL RESETTH 'Reset test head
CALL PAUSE(1!)
END FUNCTION
SUB INDIVID (SEL%)
DIM TSIM!(102), IOUTCALC!(102), IOUTMEAS!(102), ERRORPERC!(102), ACCSTAT$(102)
SNM% = SENSORNUM%
IF SENSOROUT!(SPECS.MININ, 0) = 99! THEN 'Check for valid sensor type
EXIT SUB
ELSEIF SNM% = 2 THEN 'Check if current input
IINSEN.MEAS! = MEASRES!(IINSEN!, 5, "") 'Measure current source sense R
ELSEIF SNM% = 3 THEN
CALL TCDUTCONNECT
END IF
DO
SELECT CASE SEL%
CASE 1
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = UNDERRANGE$
CASE 2
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = OVERRANGE$
CASE 3
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = MINLOOPV$
CASE 4
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = MAXLOOPV$
CASE 5
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = CJCCAL$
CASE 6
IF (SNM% = 5 AND LEFT$(SPECS.MODNAME, 4) <> "DSCT") OR (SNM% = 7 AND LEFT$(SPECS.MODNAME, 4) <> "DSCT") THEN
B$ = IEXC2$(IEXCSENSE!)
A$ = IEXC1$(IEXCSENSE!)
C$ = IMATCH$(A$, B$)
ELSEIF (SNM% = 5 AND LEFT$(SPECS.MODNAME, 4) <> "SCT1") OR (SNM% = 7 AND LEFT$(SPECS.MODNAME, 4) <> "SCT1") THEN
A$ = SENSORIEXC$(0) 'min f.s. exc current
B$ = SENSORIEXC$(1) 'max f.s. exc current
C$ = "PASS"
ELSE
A$ = IEXC1$(IEXCSENSE!)
B$ = "PASS"
C$ = "PASS"
END IF
' IF SNM% = 5 OR SNM% = 7 THEN
' B$ = IEXC2$(IEXCSENSE!)
' A$ = IEXC1$(IEXCSENSE!)
' C$ = IMATCH$(A$, B$)
' ELSEIF SNM% = 6 THEN
' A$ = IEXC2$(IEXCSENSE!)
' END IF
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable loop power
CALL RESETTH
CASE 7
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% 'Changes S/N information as selected
CASE 1 'offsel/gain cal
ITERATION% = 0
DO
'Check if resistance in
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
END IF
A$ = OFFSETCAL$(CAL%, CONTRES!) 'Offset calibration
A$ = GAINCAL$(CAL%, CONTRES!, PFSMEAS!, INTERACT!, DELTAOS!) 'Gain calibration
OFFERR! = OFFSETERR!(CAL%, CONTRES!)
ITERATION% = ITERATION% + 1
LOOP WHILE ABS(OFFERR!) >= ERRFACT * SPECS.CALTOL AND ITERATION% < 2
FIN$ = "N"
CONTINUE
CASE 2 'Linearity and accuracy test
IF SNM% >= 5 AND SNM% <= 7 THEN
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
END IF
A$ = LINTEST$(ACC$, CONTRES!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$())
FIN$ = "N"
CONTINUE
CASE 3 'Exit to individual menu
FIN$ = "Y"
END SELECT
CALCOUNT% = CALCOUNT% + 1
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
LOOP WHILE FIN$ <> "Y"
CASE 8
IF SNM% >= 5 AND SNM% <= 7 THEN
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CONTRES! = MEASRES!(1!, 4, "") 'Measure contact resistance
END IF
A$ = LINTEST$(ACC$, CONTRES!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$())
CASE 9
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = LEADREFF$(TOTLRESPEC!)
CASE 10
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = LOOPVSEN$
CASE 11
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = INPUTR$
CASE 12
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = OPENTC$
CASE 13
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
CALL GENSET(GENAMPL!)
A$ = FREQRESP$(GENAMPL!)
CASE 14
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = STEPRESP$
CASE 15
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
A$ = OUTNOISE$
CASE 16
CALL ONESHOTTEST
END SELECT
SELECTION% = SEL%
IF SELECTION% <> 7 THEN 'If not doing offset/gain cal
CALL CONTINUE
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
RESP$ = REPEAT$(SPECS.MODNAME)
ELSE 'For offset/gain cal
RESP$ = "N"
END IF
LOOP WHILE RESP$ <> "N"
IF SNM% = 1 AND (SPECS.MAXIN > 10 OR SPECS.MININ < -10) THEN
PRINT
PRINT TAB(5); "Insert the yellow connector into the meter +/-SENSE terminals."
CALL CONTINUE
ELSEIF SNM% = 3 THEN
CALL TCDUTDISCONNECT
END IF
END SUB
SUB INITTH (TH1$, TH2$)
CLS
IF TH1$ = "TE1088" THEN
FILENAME$ = "KSCTVIN.ADR" 'Parallel port, mux & test head addresses
ELSE
FILENAME$ = "KVAS.ADR" 'Parallel port, mux & test head addresses
END IF
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
LOCATE 5, 20
PRINT "Initializing test system. Please wait."
CALL INIT488(DVMADDR%) 'Initialize the GPIB interface
PRINT TAB(20); "Initializing power supply..."
PSID% = GETPSID% 'Determine and initiate communication with Power supply
PRINT
PRINT TAB(20); "Initializing DVM..."
CALL WRITEDVM("*T2S1", 0) 'Initialize Fluke meter
PRINT TAB(20); "Initializing relay mux..."
CALL LOADMUX(0, CON%) 'Resets all mux's, independent of mux address
IF TH1$ = "TE1088" THEN
THID% = GETTHID% 'Get test head ID #
IF THID% = 6 THEN
PRINT TAB(20); "Initializing test head "; TH1$; "..."
CBVAL% = &HFF
FOR BANK% = 0 TO 3 'open all relays
CALL SETTH(CBVAL%, BANK%)
CALL PAUSE(.05)
NEXT
PRINT TAB(20); "Initializing DAC..."
CALL CALDAC(TH1$) 'Calibrate DAC
IF TH1$ = "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, 0) 'Clear attenuator, short tx inputs
TH$ = TH1$
ELSE
F% = F% + 1
END IF
ELSE 'VAS test head case
THID% = GETTHID% 'Get test head ID #
IF THID% = 0 THEN
PRINT TAB(20); "Initializing test head "; TH1$; "..."
TH$ = TH1$
ELSE
F% = 2
END IF
END IF
IF TH2$ <> "" THEN
FILENAME$ = "KSCTRIN.ADR" 'Parallel port, mux & test head addresses
CALL GETADD(FILENAME$) 'Gets the Parallel port, Mux and Testhead address
'CALL INITPS(PSADDR%, PSILIMIT!, OVERV!) 'Initialize the Kepco DPS power supply
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
THID% = GETTHID% 'Get test head ID #
IF THID% = 1 THEN
' PRINT
PRINT TAB(20); "Initializing test head "; TH2$; "..."
OPEN "C:\ATE\SCTDATA\TE1035DT.DAT" FOR INPUT AS #5
INPUT #5, DT$
CLOSE #5
IF DT$ <> DATE$ THEN
CALL RTDTHCAL
OPEN "C:\ATE\SCTDATA\TE1035DT.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
TH$ = TH2$
ELSE
F% = F% + 1
END IF
END IF
IF F% = 2 THEN STOP 'No test heads connected
END SUB
FUNCTION INPUTR$
MAXIN! = SPECS.MAXIN '+f.s. input voltage (V)
MININ! = SPECS.MININ '-f.s. input voltage (V)
MINOUT! = SPECS.MINOUT / 1000 'Convert to A
MAXOUT! = SPECS.MAXOUT / 1000
SPEC! = SPECS.INPUTRES 'Meg ohms
INRANGE! = MAXIN! - MININ!
ORANGE! = MAXOUT! - MINOUT!
CLS
TESTTITLE$ = "Input Resistance & Bias Current Test"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
SNM% = SENSORNUM%
IF SNM% <> 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, 0)
' CALL LOADMUX(2, CON%) 'Measure Vsense
' CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!)
' IO1! = READDVM!(.001) / RSENSE! 'Loop current (A)
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 w/ resistor insert
CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!)
IO2! = READDVM!(.001) / RSENSE! 'Loop current (A)
CALL LOADMUX(2, COFF%)
' DELTAIO! = (IO2! - IO1!) 'Output change (A)
' MAXDELTA! = (MAXOUT! - IOUT!((SPEC! / (SPEC! + RSERIES!)) * MAXIN!)) * 1000!'max change (mA)
PEDOS! = Iout!(0!)
GAIN! = ORANGE! / INRANGE!
RINMEAS! = ABS((IO2! - PEDOS!) * RSERIES! / (MAXIN! * GAIN! - IO2!) / 1000000!)
IF RINMEAS! > 1000 THEN RINMEAS! = 1000
IF RINMEAS! >= SPEC! THEN
INR$ = "PASS"
ELSE
INR$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 10, 10
PRINT "Status: "; INR$;
PRINT SPC(20);
PRINT TAB(10); "Measured input resistance is";
PRINT TAB(50); USING " #### Mohms"; RINMEAS!
PRINT TAB(10); "Required input resistance is";
PRINT TAB(50); USING ">= #### Mohms"; SPEC!
INPUTR$ = INR$ + STR$(RINMEAS!) + "0"
CALL RESETTH 'Reset the test head
CALL PAUSE(1!)
END FUNCTION
FUNCTION Iout! (SENOUT!)
'Calculates the transmitter output for a given input (sensor output)
MINOUT! = SPECS.MINOUT / 1000 'Convert to A
MAXOUT! = SPECS.MAXOUT / 1000
LIN% = SPECS.LINEARIZED
SNM% = SENSORNUM%
'Check for TC or RTD input.
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN
MININ! = SENSOROUT!(SPECS.MININ, 0) 'Output not linear with
MAXIN! = SENSOROUT!(SPECS.MAXIN, 0) 'input temperature.
ELSE
MININ! = SPECS.MININ
MAXIN! = SPECS.MAXIN
END IF
ORANGE! = MAXOUT! - MINOUT! 'Output range (A)
INRANGE! = MAXIN! - MININ! 'Input range
XFERFN! = ORANGE! / INRANGE!
YINT! = MINOUT! - MININ! * XFERFN! 'Y-intercept
Iout! = XFERFN! * SENOUT! + YINT! 'Output voltage (V)
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.
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 / 1000!
IMATCHTOL! = SPECS.IMATCHTOL!
ORANGE! = (SPECS.MAXOUT - SPECS.MINOUT)
INRANGE! = (SPECS.MAXIN - SPECS.MININ) * SPECS.IEXCMFS
SNM% = SENSORNUM%
CLS
TESTTITLE$ = "Lead Resistance Effects 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
EXIT FUNCTION
ELSE
PRINT "Testing, please wait..."
END IF
GAIN! = ORANGE! / INRANGE! 'A/C OR A/OHM
RLEAD! = 3.3 '3.3 ohm series R
SPEC! = SPECS.LEADRERR 'deg. C/ohm or ohm/ohm
IEXCERR! = IMATCHTOL! * RLEAD! / (HIGHOHM! - LOWOHM!) 'Error from current source mis-match, % span
RLEADERR! = .1 * RLEAD! / (HIGHOHM! - LOWOHM!) 'Error from mis-match in 3.3 ohm resistors in test head
'Assumes +/-5% matching
TOTLRESPEC! = SPEC! + (IEXCERR! + RLEADERR!) * INRANGE! / RLEAD!
'Refer to output
'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 Vsense
CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!)
ILOOPNOR! = READDVM(.001) / RSENSE! 'Loop current, no series R (A)
CALL SETTEST(4) 'Insert series R in each lead
CALL LOADMUX(2, CON%) 'Measure Vsense
ILOOPR! = READDVM(.001) / RSENSE! 'Loop current, w/ series R (A)
CALL LOADMUX(2, COFF%)
LRE! = (ILOOPR! - ILOOPNOR!) / GAIN! / RLEAD!
IF ABS(LRE!) <= TOTLRESPEC! THEN
LRE$ = "PASS"
ELSE
LRE$ = "FAIL"
SOUND 1000, .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 "Status: "; LRE$;
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$
LEADREFF$ = LRE$ + STR$(LRE!) + "2"
CALL RESETTH 'Reset test head
CALL PAUSE(1!)
END FUNCTION
FUNCTION LINTEST$ (ACC$, CONTRES!, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$())
SENSOR$ = SPECS.SENTYPE
MININ! = SPECS.MININ
MAXIN! = SPECS.MAXIN
MINOUT! = SPECS.MINOUT / 1000! 'Convert to A
MAXOUT! = SPECS.MAXOUT / 1000!
MAXLINERR! = SPECS.LINEAR ' %
MAXACCERR! = SPECS.ACCURACY
BANDWIDTH! = SPECS.BANDWIDTH
LIN% = SPECS.LINEARIZED
ORANGE! = MAXOUT! - MINOUT! 'Output range (A)
CLS
TESTTITLE$ = "Accuracy Test"
CALL HEADERB(TESTTITLE$)
SNM% = SENSORNUM%
PRINT
PRINT TAB(23); "Calculated"; TAB(37); "Measured"
IF SNM% >= 3 AND SNM% <= 6 THEN 'Temperature input transmitters
PRINT TAB(10); "Temp. (C)";
ELSEIF SNM% = 2 THEN 'Current input transmitters
PRINT TAB(10); "Iin (mA)";
VINSCALE! = 1
ELSEIF SNM% = 7 THEN 'Resistance input transmitters
PRINT TAB(9); "Rin (ohms)";
ELSE
IF MAXIN! >= 1 THEN
PRINT TAB(11); "Vin (V)";
VINSCALE! = 1
ELSE
PRINT TAB(11); "Vin (mV)";
VINSCALE! = 1000
END IF
END IF
PRINT TAB(24); "Iout (mA)"; TAB(37); "Iout (mA)*";
PRINT TAB(51); "Error (%)"; TAB(65); "Status"
PRINT TAB(9); "----------"; TAB(23); "----------"; TAB(37); "----------";
PRINT TAB(51); "----------"; TAB(64); "--------"
'9 23 37 51 64
'Rin (ohms)
' Temp. (C)
' Iin (mA)
' Vin (V) Iout (mA) Iout (mA)* Error (%) Status
'---------- ---------- ---------- --------- --------
' #####.##
' +####.##
'+###.### +##.### +##.### +###.### &&&&
IF PON% = 1 THEN
LPRINT TAB(34); "ACCURACY TEST"
LPRINT
LPRINT TAB(23); "Calculated"; TAB(37); "Measured"
IF SNM% >= 3 AND SNM% <= 6 THEN 'Temperature input transmitters
LPRINT TAB(10); "Temp. (C)";
ELSEIF SNM% = 2 THEN 'Current input transmitters
LPRINT TAB(10); "Iin (mA)";
ELSEIF SNM% = 7 THEN 'Resistance input transmitters
LPRINT TAB(9); "Rin (ohms)";
ELSE
IF MAXIN! >= 1 THEN
LPRINT TAB(11); "Vin (V)";
ELSE
LPRINT TAB(11); "Vin (mV)";
END IF
END IF
LPRINT TAB(24); "Iout (mA)"; TAB(37); "Iout (mA)*";
LPRINT TAB(51); "Error (%)"; TAB(65); "Status"
LPRINT TAB(9); "----------"; TAB(23); "----------"; TAB(37); "----------";
LPRINT TAB(51); "----------"; TAB(64); "--------"
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$ = "E:\ENGR\DESIGN\LINDESN\DSCT\" + F$
F$ = "C:\QB45\JJM\" + F$
OPEN F$ FOR OUTPUT AS #3
WRITE #3, (MAXIN! - MININ!)
WRITE #3, MININ!
WRITE #3, NUMPTS%
END IF
FAILED% = 0
LINSTEP! = (MAXIN! - MININ!) / (NUMPTS% - 1)
'LINSTEP!/2 ensures NUMPTS% test point
FOR MODIN! = MININ! TO MAXIN! + LINSTEP! / 2 STEP LINSTEP!
INC% = INC% + 1
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
RIN! = SENSOROUT!(MODIN!, 0) 'Calc. ohms
CALL OHMSET(RIN!) 'Set input
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply
MEASIN! = MEASRES!(RIN!, 3, "") + CONTRES! 'Measure simulated resistor
' IF INC% = 1 THEN
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
PAUSE (2)
' END IF
ELSE
IF INC% = 1 THEN
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set Vsupply to 24.0V
END IF
IF SNM% = 3 THEN
PTCV! = PARASITICTCV!(VCJC!)
IF VCJC! = 99! THEN EXIT FUNCTION
END IF
IF SNM% = 2 THEN
MEASIN! = SETCURRENTIN!(MODIN!)
ELSE
VIN! = SENSOROUT!(MODIN!, PTCV!)
CALL SETDAC(VIN!, 1, 0) 'Sets input voltage
CALL WRITEDVM("S0", 0) 'Slow reading rate for max accuracy
CALL WRITEDVM(VODC$, VIN!) 'Sets meter to read
CALL LOADMUX(1, CON%)
CALL PAUSE(2!)
MEASIN! = READDVM!(VIN! * .0002) '0.02% tolerance
WHILE ABS(VIN!) > 10 AND ABS(VIN!) - ABS(MEASIN!) > 1
'Power supply current limit tripped
SL$ = SETPOWER$(VINADDR%, ABS(VIN!), FUNC$) 'Set Vin
'CALL PAUSE(2!)
MEASIN! = READDVM!(VIN! * .0002) '0.02% tolerance
WEND
CALL LOADMUX(1, COFF%)
END IF
END IF
CALL WRITEDVM("S1", 0) 'Medium reading rate
TSIM!(INC%) = SENSORIN!(MEASIN!, PTCV!)
IF (SNM% >= 3 AND SNM% <= 6) AND LIN% = 0 THEN
IOUTCALC!(INC%) = Iout!(MEASIN! + PTCV!) 'Output not linear w/ input
ELSE 'temperature.
IOUTCALC!(INC%) = Iout!(TSIM!(INC%))
END IF
CALL LOADMUX(2, CON%)
CALL WRITEDVM(VODC$, IOUTCALC!(INC%) * RSENSE!) 'Sets meter to read output
IF BANDWIDTH! < 10 THEN
CALL PAUSE(1!) 'Pause 1s for filter settling
END IF
IOUTMEAS!(INC%) = READDVM!(.0001) / RSENSE! 'Measured iout (A)
ERRORPERC!(INC%) = (IOUTMEAS!(INC%) - IOUTCALC!(INC%)) / ORANGE! * 100! 'Error (*)
IF LOGDAT% > 0 THEN
IF LEFT$(SPECS.MODNAME, 4) = "SCT1" THEN
WRITE #3, TSIM!(INC%), ERRORPERC!(INC%) / 100! * ORANGE! * RSENSE! * 1.2 / (.016 * RSENSE!) * 1000!'(mV out of a 0-1.2V span)
ELSE
WRITE #3, ERRORPERC!(INC%) / 100! * ORANGE! * RSENSE! * 2.5 / (.016 * RSENSE!) * 1000!'(mV out of a 0-2.5V span)
' WRITE #3, TSIM!(INC%), ERRORPERC!(INC%) / 100! * ORANGE! * RSENSE! * 2.5 / (.016 * RSENSE!) * 1000!'(mV out of a 0-2.5V span)
END IF
END IF
CALL LOADMUX(2, COFF%)
IF ABS(VIN!) > 10 THEN
SL$ = SETPOWER$(VINADDR%, 999!, LOOPOFF$) 'Disable power supply
END IF
IF ABS(ERRORPERC!(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 transmitters
PRINT TAB(10); USING "+####.## +##.### +##.### +###.###"; TSIM!(INC%); IOUTCALC!(INC%) * 1000; IOUTMEAS!(INC%) * 1000; ERRORPERC!(INC%);
ELSEIF SNM% = 7 THEN 'Resistance input transmitters
PRINT TAB(10); USING "#####.## +##.### +##.### +###.###"; TSIM!(INC%); IOUTCALC!(INC%) * 1000; IOUTMEAS!(INC%) * 1000; ERRORPERC!(INC%);
ELSE 'Voltage or current input transmitters
PRINT TAB(9); USING "+###.### +##.### +##.### +###.###"; TSIM!(INC%) * VINSCALE!; IOUTCALC!(INC%) * 1000; IOUTMEAS!(INC%) * 1000; ERRORPERC!(INC%);
END IF
PRINT TAB(66); ACCSTAT$(INC%)
IF PON% = 1 THEN
IF SNM% >= 3 AND SNM% <= 6 THEN 'Temperature input transmitters
LPRINT TAB(10); USING "+####.## +##.### +##.### +###.###"; TSIM!(INC%); IOUTCALC!(INC%) * 1000; IOUTMEAS!(INC%) * 1000; ERRORPERC!(INC%);
ELSEIF SNM% = 7 THEN 'Resistance input transmitters
LPRINT TAB(10); USING "#####.## +##.### +##.### +###.###"; TSIM!(INC%); IOUTCALC!(INC%) * 1000; IOUTMEAS!(INC%) * 1000; ERRORPERC!(INC%);
ELSE 'Voltage or current input transmitters
LPRINT TAB(9); USING "+###.### +##.### +##.### +###.###"; TSIM!(INC%) * VINSCALE!; IOUTCALC!(INC%) * 1000; IOUTMEAS!(INC%) * 1000; ERRORPERC!(INC%);
END IF
LPRINT TAB(66); ACCSTAT$(INC%)
END IF
IF ABS(ERRORPERC!(INC%)) > ABS(ACCERR!) THEN
ACCERR! = ERRORPERC!(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! + ERRORPERC!(INC%)
SPROD! = SPROD! + TSIM!(INC%) * ERRORPERC!(INC%)
NEXT
IF LOGDAT% > 0 THEN CLOSE #3
IF FAILED% = 0 THEN
ACC$ = "PASS"
ELSE
ACC$ = "FAIL"
SOUND 800, .5
END IF
SLOPE! = ((NUMPTS% * SPROD!) - (SMODIN! * SERR!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
OFFSET1! = ((SERR! * SSMODIN!) - (SMODIN! * SPROD!)) / ((NUMPTS% * SSMODIN!) - (SMODIN! ^ 2))
BFERR! = ABS(BESTFIT!(SLOPE!, OFFSET1!, TSIM!(), NUMPTS%, ERRORPERC!()))
IF ABS(BFERR!) <= MAXLINERR! THEN
BF$ = "PASS"
ELSE
BF$ = "FAIL"
SOUND 600, .5
END IF
PRINT
PRINT TAB(10); "Accuracy status: "; ACC$
PRINT TAB(10); "Measured accuracy error is";
PRINT TAB(50); USING " +###.### %"; ACCERR!
PRINT TAB(10); "Maximum accuracy error is";
PRINT TAB(50); USING "+/-###.### %"; MAXACCERR!
PRINT
PRINT TAB(10); "Linearity status: "; BF$
PRINT TAB(10); "Measured best-fit linearity error is";
PRINT TAB(50); USING "+/-###.### %"; BFERR!
PRINT TAB(10); "Maximum best-fit linearity error is";
PRINT TAB(50); USING "+/-###.### %"; MAXLINERR!
ACC$ = ACC$ + STR$(ABS(ACCERR!)) + "3" '% span
LINTEST$ = BF$ + STR$(ABS(BFERR!)) + "3" 'append # decimal places
CALL RESETTH 'Reset test head
CALL PAUSE(1!)
END FUNCTION
SUB LOGIT (STATUS$(), SN$, TSIM!(), IOUTCALC!(), IOUTMEAS!(), ERRORPERC!(), ACCSTAT$(), LOWMA!, HIGHMA!, TOTLRESPEC!)
IF FAILS%(STATUS$()) = 0 THEN
OPEN "C:\ATE\LOGPATH.ADR" FOR INPUT AS #7
INPUT #7, LOGPATH$
CLOSE #7
IF LEFT$(SPECS.MODNAME, 3) = "SCM" THEN
OPEN "C:\ATE\VASLOG\" + RTRIM$(MID$(SPECS.MODNAME, 4, 8)) + ".DAT" FOR APPEND AS #4
OPEN LOGPATH$ + "\VASLOG\" + RTRIM$(MID$(SPECS.MODNAME, 4, 8)) + ".DAT" FOR APPEND AS #8
ELSE
OPEN "C:\ATE\SCTLOG\" + RTRIM$(MID$(SPECS.MODNAME, 5, 8)) + ".DAT" FOR APPEND AS #4
OPEN LOGPATH$ + "\SCTLOG\" + RTRIM$(MID$(SPECS.MODNAME, 5, 8)) + ".DAT" FOR APPEND AS #8
END IF
NUMPTS% = 5
'builds a sequential file. 16 records required for 1 module
WRITE #4, SPECS.MODNAME
WRITE #8, SPECS.MODNAME
FOR INC% = 1 TO NUMPTS%
WRITE #4, TSIM!(INC%), IOUTCALC!(INC%), IOUTMEAS!(INC%), ERRORPERC!(INC%), ACCSTAT$(INC%)
WRITE #8, TSIM!(INC%), IOUTCALC!(INC%), IOUTMEAS!(INC%), ERRORPERC!(INC%), ACCSTAT$(INC%)
NEXT
WRITE #4, TOTLRESPEC!
WRITE #8, TOTLRESPEC!
FOR INC% = 0 TO 15 STEP 4
WRITE #4, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4)
WRITE #8, STATUS$(INC% + 1), STATUS$(INC% + 2), STATUS$(INC% + 3), STATUS$(INC% + 4)
NEXT
WRITE #4, SN$, DATE$
WRITE #8, SN$, DATE$
CLOSE #4
CLOSE #8
END IF
END SUB
FUNCTION LOOPVSEN$
MINOUT! = SPECS.MINOUT / 1000!
MAXOUT! = SPECS.MAXOUT / 1000! 'Convert to A
VSEN! = SPECS.VSEN! '% / V
VS1! = 20 'Power supply voltage #1, .5V resolution
VS2! = 90 'Power supply voltage #2, .5V resolution
ORANGE! = MAXOUT! - MINOUT!
CLS
TESTTITLE$ = "Loop Voltage Sensitivity Test"
CALL HEADERB(TESTTITLE$)
LOCATE 10, 10
PRINT "Testing, please wait."
SNM% = SENSORNUM%
IF SNM% = 3 THEN
PTCV! = PARASITICTCV!(VCJC!)
IF VCJC! = 99! THEN EXIT FUNCTION
END IF
MAXIN! = SENSOROUT!(SPECS.MAXIN, PTCV!) 'Calc. maxin
MININ! = SENSOROUT!(SPECS.MININ, PTCV!) 'Calc. minin
IF SNM% >= 5 AND SNM% <= 7 THEN 'Check if resistance in
CALL OHMSET(MAXIN!) 'Set Rin for +f.s input
ELSE
IF SNM% = 2 THEN
A! = SETCURRENTIN!(MAXIN!)
ELSE
CALL SETDAC(MAXIN!, 1, 0)
END IF
END IF
SL$ = SETPOWER$(PSADDR%, VS1!, FUNC$) 'Set low supply voltage
CALL LOADMUX(2, CON%) 'Measure Vsense
CALL WRITEDVM(VODC$, MAXOUT! * RSENSE!) 'Set up Meter
ILOOP1! = READDVM(.0001) / RSENSE! 'Loop current (A)
CALL LOADMUX(2, COFF%) 'Turn off CH#2
SL$ = SETPOWER$(PSADDR%, VS2!, FUNC$) 'Set high supply voltage
CALL LOADMUX(2, CON%) 'Measure Vsense
ILOOP2! = READDVM(.0001) / RSENSE! 'Loop current (A)
CALL LOADMUX(2, COFF%) 'Turn off CH#2
DELTAIO! = (ILOOP2! - ILOOP1!) / ORANGE! * 100! / (VS2! - VS1!)'Change in output (%/V)
SL$ = SETPOWER$(PSADDR%, 999!, LOOPOFF$) 'Disable power supply to avoid current spikes
PAUSE (.1)
SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Reset Vloop
' IF SETPOWER$(PSADDR%, 999!, ISTAT$) = "RCS=01" THEN 'Check for over-current
' SL$ = SETPOWER$(PSADDR%, 24!, FUNC$) 'Set loop V to 24.0V
' END IF
IF ABS(DELTAIO!) <= VSEN! THEN
LPVSTAT$ = "PASS"
ELSE
LPVSTAT$ = "FAIL"
SOUND 1000, .5
END IF
LOCATE 10, 10
PRINT "Status: "; LPVSTAT$;
PRINT SPC(20);
PRINT TAB(10); "Measured change in loop current is";
PRINT TAB(55); USING "###.#### %/V"; DELTAIO!
PRINT TAB(10); "Required change in loop current is";
PRINT TAB(55); USING "< #.#### %/V"; VSEN!
'Express meas. in % / V
LOOPVSEN$ = LPVSTAT$ + STR$(DELTAIO!) + "4"
CALL RESETTH 'Reset test head
CALL PAUSE(1!)
END FUNCTION
SUB TCDUTCONNECT
'Connect TE10302-2 to the DUT
CLS
PRINT TAB(29); "Connect CJC Box to DUT"
PRINT TAB(29); "----------------------"
CALL MODOUTLINE
LOCATE 4, 30
PRINT "x x"
LOCATE 7, 31
PRINT CHR$(24); " "
PRINT TAB(30); "P1"
LOCATE 10, 4
PRINT "Plug the CJC connector (blue and purple wires) into the P1 header on the"
PRINT TAB(4); "module. The purple lead goes on the pin closest to the brass blocks."
PRINT
PRINT TAB(4); "Grasp the TE10302 temperature sensor by the plastic base and insert"
PRINT TAB(4); "it into the empty hole in the back of the module brass terminal blocks."
CALL CONTINUE
END SUB
SUB TCDUTDISCONNECT
'Disconnect TE10302-2 from the DUT
CLS
PRINT TAB(27); "Disconnect CJC Box to DUT"
PRINT TAB(27); "-------------------------"
CALL MODOUTLINE
LOCATE 4, 30
PRINT "x x"
LOCATE 7, 31
PRINT CHR$(24); " "
PRINT TAB(30); "P1"
LOCATE 10, 4
PRINT "Remove the CJC connector and temperature sensor from the DUT."
CALL CONTINUE
END SUB