Files
Mike Swanson 45083f4735 Add SCMVAS/SCMHVAS datasheet pipeline extension (Dataforth)
Extends the Test Datasheet Pipeline on AD2:C:\Shares\testdatadb to
generate web-published datasheets for the SCMVAS-Mxxx (obsolete) and
SCMHVAS-Mxxxx (replacement) High Voltage Input Module product lines.
Both are tested either with the existing TESTHV3 software (production
VASLOG .DAT logs) or in Engineering with plain .txt output.

Key changes on AD2 (all deployed 2026-04-12 with dated backups):

- parsers/spec-reader.js: getSpecs() returns a `{_family:'SCMVAS',
  _noSpecs:true}` sentinel for SCMVAS/SCMHVAS/VAS-M/HVAS-M model prefixes
  so the export pipeline does not silently skip them for missing specs.
- templates/datasheet-exact.js: new Accuracy-only template branch
  (generateSCMVASDatasheet + helpers) that mirrors the existing shipped
  format byte-for-byte. Extraction regex covers both QuickBASIC STR$()
  output formats: scientific-with-trailing-status-digit (98.4% of
  records) and plain-decimal (1.6% of records above QB's threshold).
- parsers/vaslog-engtxt.js (new): parses the Engineering-Tested .txt
  files in TS-3R\LOGS\VASLOG\VASLOG - Engineering Tested\. Filename SN
  regex strips optional trailing 14-digit timestamp; in-file "SN:"
  header is the authoritative source when the filename is malformed.
- database/import.js: LOG_TYPES grows a VASLOG_ENG entry with
  subfolder + recursive flags. Pre-existing 7 log types keep their
  implicit recursive=true behaviour (config.recursive !== false).
  importFiles() routes VASLOG_ENG paths before the generic loop so a
  VASLOG - Engineering Tested/*.txt path does not mis-dispatch to the
  multiline parser.
- database/export-datasheets.js: VASLOG_ENG records are written
  verbatim via fs.copyFileSync(source_file, For_Web/<SN>.TXT) for true
  byte-level pass-through, with a graceful raw_data fallback when the
  source file is no longer on disk.

Deploy outcome:
- 27,503 SCMVAS/SCMHVAS datasheets rendered (27,065 from scientific +
  438 from plain-decimal PASS lines, post-patch rerun)
- 434 Engineering-Tested .txt files pass-through-copied to For_Web
- 0 errors across both batches

Repo layout added here:
- scmvas-hvas-research/: discovery artifacts (source .BAS, hvin.dat,
  sample .DAT + .txt, binary-format notes, IMPLEMENTATION_PLAN.md)
- implementation/: staged final code + deploy helpers + local test
  harness + per-step verification scripts
- backups/pre-deploy-20260412/: independent local snapshot of the 4
  AD2 files replaced, pulled byte-for-byte before deploy

All helper scripts fetch the AD2 password at runtime from the SOPS
vault (clients/dataforth/ad2.sops.yaml). None of the committed files
contain the plaintext credential. Known vault-entry hygiene issue
(stale shell-escape backslash before the `!`) is documented in the
fetcher comments and stripped at read-time; flagged separately for
cleanup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 07:36:45 -07:00

732 lines
25 KiB
QBasic

'Database Modification Program for DSCA33
'DIN rail signal conditioning modules
'
'AUTHOR: John Lehman
'DATE: 08/30/99
'
' REVISION RECORD
'DATE APPR DESCRIPTION
'---- ---- -----------
'08/30/99 JL Create, start from DBDSC4.BAS
'10/30/06 JL Added suggested P.S. voltage levels of 19-29V.
DECLARE FUNCTION CHANGE (SPEC!)
DECLARE FUNCTION CHANGE2 (SPEC!, SCALE!)
DECLARE FUNCTION MENU1% ()
DECLARE FUNCTION MENU3% () 'Gets the module family
DECLARE FUNCTION REPEAT$ ()
DECLARE FUNCTION STRINGVAL% (A$)
DECLARE SUB MODDATA (SEL%)
DECLARE SUB GETSPECS (SEL%)
DECLARE SUB ENTDATA ()
DECLARE SUB SAVEDATA (SEL%)
DECLARE SUB SORTALL ()
DECLARE SUB SORTDB (ENDFLAG%)
'Database Record defintion for the specifications
TYPE DBASE
MODNAME AS STRING * 13 'DSCA33-XXXX or SCM5B33-XXXX
INTYPE AS STRING * 3 ''V' OR 'A'
MININ AS SINGLE 'Minus F.S. input (V or I)
MAXIN AS SINGLE 'Plus F.S. input (V or I)
OUTSIGTYPE AS STRING * 7 ''VOLTAGE' or 'CURRENT'
MINOUT AS SINGLE 'Minus F.S. output (V or I)
MAXOUT AS SINGLE 'Plus F.S. output (V or I)
WAVESHPCAL AS STRING * 8 ''SINE', 'SQUARE', 'TRIANGLE', 'ARBxxxxx'
FINCAL AS SINGLE 'Calibration Frequency input (Hz)
FINMIN AS SINGLE 'Minimum Std. Frequency input (Hz)
FINMAX AS SINGLE 'Highest Std. Frequency input (Hz)
FINEXTMIN AS SINGLE 'Minimum Extd. Frequency input (Hz)
FINEXTMAX AS SINGLE 'Highest Extd. Frequency input (Hz)
INPROTECT AS SINGLE 'Rated input Protection (V or I)
IOUTLIM AS SINGLE 'Current output limit (mA)
VOUTLIM AS SINGLE 'Voltage output limit (V)
OUTRES AS SINGLE 'Output resistance
OUTNOISE AS SINGLE 'Output noise/ripple 100kHz BW (rms)
OSCALIN AS SINGLE 'Module input for offset calibration
GNCALIN AS SINGLE 'Module input for gain calibration
OSCALPT AS SINGLE 'Offset cal point (%span)
GNCALPT AS SINGLE 'Gain cal point (%span)
CALTOL AS SINGLE 'Calibration tolerance (%span)
ADJ AS SINGLE 'User Adjustability Range (%span)
LINEAR AS SINGLE 'Linearity (% span) at sine input and FINCAL
ACCSINCAL AS SINGLE 'Sine accuracy (%span) at CALFIN
ACCSINSTD AS SINGLE 'Sine accuracy (%span) from FINMIN to FIMMAX
ACCSINEXT AS SINGLE 'Sine accuracy (%span) from FINEXTMIN to FINEXTMAX
ACCCF12 AS SINGLE 'C.F. = 1 TO 2 accuracy (%span) at FINCAL
ACCCF23 AS SINGLE 'C.F. = 2 TO 3 accuracy (%span) at FINCAL
ACCCF34 AS SINGLE 'C.F. = 3 TO 4 accuracy (%span) at FINCAL
ACCCF45 AS SINGLE 'C.F. = 4 TO 5 accuracy (%span) at FINCAL
CMR AS SINGLE 'Common Mode Rejection (dB)
STEPTIME AS SINGLE 'Test time for step response
STEPPERC AS SINGLE '% F.S. @ STEPTIME
STEPTOL AS SINGLE 'STEPPERC measurement tolerance
LOOPVMIN AS SINGLE 'Output Loop Voltage min (V)
LOOPVNOM AS SINGLE 'Output Loop Voltage nom (V)
LOOPVMAX AS SINGLE 'Output Loop Voltage max (V)
MAXLOADR AS SINGLE 'Maximum load resistance (ohms)
MINVS AS SINGLE 'Lowest supply voltage (V)
NOMVS AS SINGLE 'Nominal supply voltage (V)
MAXVS AS SINGLE 'Highest supply voltage (V)
ISMIN AS SINGLE 'Minimum suuply current (mA)
ISMAX AS SINGLE 'Supply current, full load (mA)
PSS AS SINGLE 'Power supply sensitivity (ppm/% or %/% Delta Vs)
END TYPE
TYPE DBASE2
RECNUM AS INTEGER
MODNAME AS STRING * 13
END TYPE
'define common variables
COMMON SHARED /SAMPLE/ SPECS AS DBASE, SORTDATA1 AS DBASE2, SORTDATA2 AS DBASE
DO
SELECT CASE MENU1%
CASE 1
CALL ENTDATA
IF LEFT$(SPECS.MODNAME, 4) <> " " THEN
CALL SAVEDATA(0)
END IF
CASE 2
CALL GETSPECS(SEL%)
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL MODDATA(SEL%)
CALL SAVEDATA(0)
END IF
CASE 3
CALL GETSPECS(SEL%)
IF LEFT$(SPECS.MODNAME, 4) <> "EXIT" THEN
CALL MODDATA(SEL%)
CALL SAVEDATA(SEL%)
END IF
CASE 4
CALL SORTALL
CASE 5
END
END SELECT
LOOP WHILE REPEAT$ <> "N"
FUNCTION CHANGE (SPEC!)
Y% = CSRLIN
X% = POS(0)
LOCATE Y%, X% + 1
INPUT A$
IF A$ <> "" THEN
CHANGE = VAL(A$)
ELSE
CHANGE = SPEC!
END IF
END FUNCTION
FUNCTION CHANGE2 (SPEC!, SCALE!)
Y% = CSRLIN
X% = POS(0)
LOCATE Y%, X% + 1
INPUT A$
IF A$ <> "" THEN
CHANGE2 = VAL(A$) / SCALE!
ELSE
CHANGE2 = SPEC!
END IF
END FUNCTION
SUB ENTDATA
'for specs which are not input for all models, default value is zero.
CLS
INPUT "SCM5B, SCM8B or DSCA Model Number (SCM5Bxx-xx, SCM8Bxx-xx or DSCAxx-xx, blank to exit) "; MN$
IF LEFT$(MN$, 1) = " " THEN
EXIT SUB
ELSE 'Check if model already exists
OPEN "T:\ENGR\ATE\ATE\HVU\HVDATA\HVIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
NR% = LOF(1) / LEN(SPECS)
FOR N = 1 TO NR%
GET #1, N, SPECS
IF SPECS.MODNAME = MN$ THEN
BEEP
PRINT "This model already exists in the database."
PRINT "Press any key to continue."
DO
LOOP WHILE INKEY$ = ""
CLOSE #1
EXIT SUB
END IF
NEXT N
CLOSE #1
SPECS.MODNAME = UCASE$(MN$)
END IF
PRINT "Valid Sensor Types:"
PRINT TAB(5); "V (millivolt or volt source)"
' PRINT TAB(5); "A (milliamp or amp source)"
DO
INPUT "Sensor Type "; SPECS.INTYPE
LOOP WHILE LEFT$(UCASE$(SPECS.INTYPE), 1) <> "V" AND LEFT$(UCASE$(SPECS.INTYPE), 1) <> "A"
INPUT "Minus F.S. Input (V, A) "; SPECS.MININ
INPUT "Plus F.S. Input (V, A) "; SPECS.MAXIN
DO
INPUT "Output signal type ('VOLTAGE' or 'CURRENT')"; SPECS.OUTSIGTYPE
SPECS.OUTSIGTYPE$ = UCASE$(SPECS.OUTSIGTYPE)
LOOP WHILE SPECS.OUTSIGTYPE <> "VOLTAGE" AND SPECS.OUTSIGTYPE <> "CURRENT"
IF SPECS.OUTSIGTYPE = "CURRENT" THEN
UNIT$ = "mA"
SCALE! = 1000!
ELSE
UNIT$ = "V"
SCALE! = 1!
END IF
PRINT "Minus F.S. Output ("; UNIT$; ") ";
INPUT SPECS.MINOUT
SPECS.MINOUT = SPECS.MINOUT / SCALE! 'Convert to V or A
PRINT "Plus F.S. Output ("; UNIT$; ") ";
INPUT SPECS.MAXOUT
SPECS.MAXOUT = SPECS.MAXOUT / SCALE! 'Convert to V or A
' DO
' INPUT "Calibration Signal Waveshape (SINE, SQUARE, TRIANGLE, RAMP) = "; SPECS.WAVESHPCAL
' SPECS.WAVESHPCAL = UCASE$(SPECS.WAVESHPCAL)
'LOOP WHILE SPECS.WAVESHPCAL <> "SINE " AND SPECS.WAVESHPCAL <> "SQUARE " AND SPECS.WAVESHPCAL <> "TRIANGLE" AND SPECS.WAVESHPCAL <> "RAMP "
' INPUT "Calibration Signal Frequency (Hz, 60Hz standard) "; SPECS.FINCAL
' INPUT "Mininum Standard Input Frequency (Hz) "; SPECS.FINMIN
' INPUT "Maximum Standard Input Frequency (Hz) "; SPECS.FINMAX
' INPUT "Mininum Extended Input Frequency (Hz) "; SPECS.FINEXTMIN
' INPUT "Maximum Extended Input Frequency (Hz) "; SPECS.FINEXTMAX
'INPUT "Input Protection Rating, Max (V, A) "; SPECS.INPROTECT
'IF SPECS.OUTSIGTYPE = "CURRENT" THEN
' INPUT "Current Output Limit (mA) "; SPECS.IOUTLIM
'ELSE
' INPUT "Voltage Output Limit (V) "; SPECS.VOUTLIM
'END IF
'IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
' INPUT "Output Resistance (Ohms) "; SPECS.OUTRES
'END IF
INPUT "Output noise/ripple (% span rms) "; SPECS.OUTNOISE
INPUT "Input for OFFSET calibration (V, A) "; SPECS.OSCALIN
INPUT "Input for GAIN calibration (V, A) "; SPECS.GNCALIN
INPUT "Offset Calibration Point (+/- % of span) "; SPECS.OSCALPT
INPUT "Gain Calibration Point (+/- % of span) "; SPECS.GNCALPT
INPUT "Offset and Gain Calibration Tolerance (+/- % of Span) "; SPECS.CALTOL
INPUT "Offset/Gain User Adjustability (+/- % of Span) "; SPECS.ADJ
INPUT "Nonlinearity (+/- % of span) "; SPECS.LINEAR
'PRINT USING "Accuracy z (+/- % of span) "; SPECS.FINCAL
INPUT "Accuracy (+/- % of span) "; SPECS.ACCSINCAL
' PRINT USING "Accuracy w/ Sine Input @ #####Hz to #####Hz (+/- % of span) "; SPECS.FINMIN; SPECS.FINMAX
' INPUT SPECS.ACCSINSTD
' PRINT USING "Accuracy w/ Sine Input @ #####Hz to #####Hz (+/- % of span) "; SPECS.FINEXTMIN; SPECS.FINEXTMAX
' INPUT SPECS.ACCSINEXT
' PRINT USING "Accuracy w/ Crest Factor 1 to 2 @ #####Hz (+/- % of span) "; SPECS.FINCAL
'INPUT SPECS.ACCCF12
'PRINT USING "Accuracy w/ Crest Factor 2 to 3 @ #####Hz (+/- % of span) "; SPECS.FINCAL
' INPUT SPECS.ACCCF23
' PRINT USING "Accuracy w/ Crest Factor 3 to 4 @ #####Hz (+/- % of span) "; SPECS.FINCAL
' INPUT SPECS.ACCCF34
' PRINT USING "Accuracy w/ Crest Factor 4 to 5 @ #####Hz (+/- % of span) "; SPECS.FINCAL
' INPUT SPECS.ACCCF45
' INPUT "Common Mode Rejection (dB) "; SPECS.CMR
INPUT "Step Response Test Delay (s, 0.1 typ.)"; SPECS.STEPTIME
PRINT "Nominal Response at #.### s (% span)"; SPECS.STEPTIME;
' INPUT SPECS.STEPPERC
' INPUT "Step Response Tolerance (%) "; SPECS.STEPTOL
IF SPECS.OUTSIGTYPE = "CURRENT" THEN
INPUT "Maximum Load Resistance (Ohms) "; SPECS.MAXLOADR
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
INPUT "Minimum Output Loop Voltage (V) "; SPECS.LOOPVMIN
INPUT "Nominal Output Loop Voltage (V) "; SPECS.LOOPVNOM
INPUT "Maximum Output Loop Voltage (V) "; SPECS.LOOPVMAX
END IF
END IF
INPUT "Minimum Supply Voltage (V) [5B/8B- 4.75V, DSCA- 19V]"; SPECS.MINVS
INPUT "Nominal Supply Voltage (V) [5B/8B- 5V, DSCA- 24V]"; SPECS.NOMVS
INPUT "Maximum Supply Voltage (V) [5B/8B- 5.25V, DSCA- 29V]"; SPECS.MAXVS
INPUT "Minimum Supply Current (mA) "; SPECS.ISMIN
INPUT "Maximum Supply Current (mA) "; SPECS.ISMAX
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
UNIT$ = "ppm / %"
ELSEIF LEFT$(SPECS.MODNAME, 2) = "8B" THEN
UNIT$ = "ppm / %"
ELSE
UNIT$ = "% / %"
END IF
PRINT "Power Supply Sensitivity ("; UNIT$; ") ";
INPUT SPECS.PSS
END SUB
SUB GETSPECS (SEL%)
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 "T:\ENGR\ATE\HVU\HVDATA\HVSORT.DAT" FOR RANDOM AS #2 LEN = LEN(SORTDATA1)
DO
I% = I% + 1
GET #2, I%, SORTDATA1
IF SORTDATA1.RECNUM <> -1 THEN NUMRECORD! = NUMRECORD! + 1
LOOP WHILE SORTDATA1.RECNUM <> -1
SCRNCTR% = 40 'display center
NUMCHAR% = 19 '13 char + 4 char for # + 2 spaces
NUMLINES! = 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!
PRINT "Enter Selection ";
INPUT SEL%
LOOP WHILE SEL% < 1 OR SEL% > I%
IF SEL% = I% THEN
SPECS.MODNAME = "EXIT"
ELSE
OPEN "T:\ENGR\ATE\HVU\HVDATA\HVIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
GET #1, POINTER%(SEL%), SPECS
CLOSE #1
END IF
SEL% = POINTER%(SEL%) 'pass back to main code for use in SAVEDATA
END SUB
FUNCTION MENU1%
CLS
LOCATE 5
PRINT TAB(18); "SCM5Bxx, SCM8Bxx & DSCAxx DATABASE MODIFICATION PROGRAM"
PRINT
PRINT TAB(17); "1.) Add New Module, Clean Start"
PRINT TAB(17); "2.) Add New Module, Start With Existing Module"
PRINT TAB(17); "3.) Modify Existing Module"
PRINT TAB(17); "4.) Sort Database"
PRINT TAB(17); "5.) Exit Program"
PRINT
PRINT TAB(17); "Enter your selection";
DO
A$ = INKEY$
LOOP WHILE VAL(A$) < 1 OR VAL(A$) > 5
MENU1% = VAL(A$)
END FUNCTION
FUNCTION MENU3%
CLS
LOCATE 3, 26
PRINT "Module Family Selection Menu"
PRINT TAB(26); "---------------------------"
PRINT
PRINT TAB(34); "1.) SCM5Bxx-xx"
PRINT TAB(34); "2.) DSCAxx-xx"
PRINT TAB(34); "3.) 8Bxx-xx"
PRINT TAB(34); "4.) Exit"
DO
I$ = INKEY$
LOOP WHILE VAL(I$) < 1 OR VAL(I$) > 4
MENU3% = VAL(I$)
END FUNCTION
SUB MODDATA (SEL%)
CLS
PRINT "Model Number: "; SPECS.MODNAME;
INPUT MN$
IF MN$ <> "" THEN
'Check if model already exists
OPEN "T:\ENGR\ATE\HVU\HVDATA\HVIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
NR% = LOF(1) / LEN(SPECS)
FOR N% = 1 TO NR%
GET #1, N%, SPECS
IF SPECS.MODNAME = MN$ THEN
BEEP
PRINT "This model already exists in the database."
PRINT "Press any key to continue."
DO
LOOP WHILE INKEY$ = ""
CLOSE #1
EXIT SUB
END IF
NEXT
GET #1, SEL%, SPECS
SPECS.MODNAME = MN$
CLOSE #1
END IF
PRINT "Sensor Type: "; SPECS.INTYPE;
INPUT A$
IF A$ <> "" THEN
SPECS.INTYPE = A$
END IF
PRINT USING "Minus F.S. Input = +###.### (V, A)"; SPECS.MININ;
SPECS.MININ = CHANGE(SPECS.MININ)
PRINT USING "Plus F.S. Input = +###.### (V, A)"; SPECS.MAXIN;
SPECS.MAXIN = CHANGE(SPECS.MAXIN)
DO
PRINT "Output signal type = "; SPECS.OUTSIGTYPE;
INPUT A$
IF A$ <> "" THEN SPECS.OUTSIGTYPE = UCASE$(A$)
LOOP WHILE SPECS.OUTSIGTYPE <> "VOLTAGE" AND SPECS.OUTSIGTYPE <> "CURRENT"
IF SPECS.OUTSIGTYPE = "CURRENT" THEN
UNIT$ = "mA"
SCALE! = 1000!
ELSE
UNIT$ = "V"
SCALE! = 1!
END IF
PRINT USING "Minus F.S. Output = +#####.## &"; SPECS.MINOUT * SCALE!; UNIT$;
SPECS.MINOUT = CHANGE2(SPECS.MINOUT, SCALE!)
PRINT USING "Plus F.S. Output = +#####.## &"; SPECS.MAXOUT * SCALE!; UNIT$;
SPECS.MAXOUT = CHANGE2(SPECS.MAXOUT, SCALE!)
' DO
' PRINT "Calibration Signal Waveshape (SINE, SQUARE, TRIANGLE, RAMP) = "; SPECS.WAVESHPCAL
' INPUT A$
' IF A$ <> "" THEN SPECS.WAVESHPCAL = UCASE$(A$)
'LOOP WHILE SPECS.WAVESHPCAL <> "SINE " AND SPECS.WAVESHPCAL <> "SQUARE " AND SPECS.WAVESHPCAL <> "TRIANGLE" AND SPECS.WAVESHPCAL <> "RAMP "
' PRINT USING "Calibration Signal Frequency = ###### Hz"; SPECS.FINCAL;
' SPECS.FINCAL = CHANGE(SPECS.FINCAL)
' PRINT USING "Mininum Standard Input Frequency = ##### Hz"; SPECS.FINMIN;
' SPECS.FINMIN = CHANGE(SPECS.FINMIN)
' PRINT USING "Maximum Standard Input Frequency = ##### Hz"; SPECS.FINMAX;
' SPECS.FINMAX = CHANGE(SPECS.FINMAX)
' PRINT USING "Mininum Extended Input Frequency = ##### Hz"; SPECS.FINEXTMIN;
' SPECS.FINEXTMIN = CHANGE(SPECS.FINEXTMIN)
' PRINT USING "Maximum Extended Input Frequency = ###### Hz"; SPECS.FINEXTMAX;
' SPECS.FINEXTMAX = CHANGE(SPECS.FINEXTMAX)
' PRINT USING "Input Protection Rating, Max = #### (V or A)"; SPECS.INPROTECT;
' SPECS.INPROTECT = CHANGE(SPECS.INPROTECT)
' IF SPECS.OUTSIGTYPE = "CURRENT" THEN
' PRINT USING "Current Output Limit = ##.# mA"; SPECS.IOUTLIM;
' SPECS.IOUTLIM = CHANGE(SPECS.IOUTLIM)
'ELSE
' PRINT USING "Voltage Output Limit = ##.# V"; SPECS.VOUTLIM;
' SPECS.VOUTLIM = CHANGE(SPECS.VOUTLIM)
'END IF
'IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
' PRINT USING "Output Resistance = ### Ohms"; SPECS.OUTRES;
' SPECS.OUTRES = CHANGE(SPECS.OUTRES)
'END IF
PRINT USING "Output Noise = #.### % span rms"; SPECS.OUTNOISE;
SPECS.OUTNOISE = CHANGE(SPECS.OUTNOISE)
PRINT USING "Input for OFFSET calibration = +###.### (V, A)"; SPECS.OSCALIN;
SPECS.OSCALIN = CHANGE(SPECS.OSCALIN)
PRINT USING "Input for GAIN calibration = +###.### (V, A)"; SPECS.GNCALIN;
SPECS.GNCALIN = CHANGE(SPECS.GNCALIN)
PRINT
PRINT "Offset and gain may be calibrated at a point other than -f.s. out"
PRINT "or +f.s. out."
PRINT USING "Offset Calibration Point = +#.### % of span"; SPECS.OSCALPT;
SPECS.OSCALPT = CHANGE(SPECS.OSCALPT)
PRINT USING "Gain Calibration Point = +#.### % of span"; SPECS.GNCALPT;
SPECS.GNCALPT = CHANGE(SPECS.GNCALPT)
PRINT USING "Offset and Gain Calibration Tolerance = +/- #.### % of span"; SPECS.CALTOL;
SPECS.CALTOL = CHANGE(SPECS.CALTOL)
PRINT USING "Offset/Gain User Adjustability = +/- ##.# % of span"; SPECS.ADJ;
SPECS.ADJ = CHANGE(SPECS.ADJ)
PRINT USING "Nonlinearity = +/- #.### % of span"; SPECS.LINEAR;
SPECS.LINEAR = CHANGE(SPECS.LINEAR)
PRINT USING "Accuracy = +/- #.### % of span"; SPECS.ACCSINCAL;
SPECS.ACCSINCAL = CHANGE(SPECS.ACCSINCAL)
' PRINT USING "Addt'l Error w/ Sine Input @ ##### Hz to ##### Hz = +/- #.### % of span"; SPECS.FINMIN; SPECS.FINMAX; SPECS.ACCSINSTD;
' SPECS.ACCSINSTD = CHANGE(SPECS.ACCSINSTD)
' PRINT USING "Addt'l Error w/ Sine Input @ ##### Hz to ##### Hz = +/- #.### % of span"; SPECS.FINEXTMIN; SPECS.FINEXTMAX; SPECS.ACCSINEXT;
' SPECS.ACCSINEXT = CHANGE(SPECS.ACCSINEXT)
' PRINT USING "Addt'l Error w/ Crest Factor 1 to 2 @ ##### Hz = +/- #.### % of span"; SPECS.FINCAL; SPECS.ACCCF12;
' SPECS.ACCCF12 = CHANGE(SPECS.ACCCF12)
' PRINT USING "Addt'l Error w/ Crest Factor 2 to 3 @ ##### Hz = +/- #.### % of span"; SPECS.FINCAL; SPECS.ACCCF23;
' SPECS.ACCCF23 = CHANGE(SPECS.ACCCF23)
' PRINT USING "Addt'l Error w/ Crest Factor 3 to 4 @ ##### Hz = +/- #.### % of span"; SPECS.FINCAL; SPECS.ACCCF34;
' SPECS.ACCCF34 = CHANGE(SPECS.ACCCF34)
' PRINT USING "Addt'l Error w/ Crest Factor 4 to 5 @ ##### Hz = +/- #.### % of span"; SPECS.FINCAL; SPECS.ACCCF45;
' SPECS.ACCCF45 = CHANGE(SPECS.ACCCF45)
' PRINT USING "Common Mode Rejection = ### dB"; SPECS.CMR;
' SPECS.CMR = CHANGE(SPECS.CMR)
PRINT USING "Step Response Test Delay = #.###### s"; SPECS.STEPTIME;
SPECS.STEPTIME = CHANGE(SPECS.STEPTIME)
' PRINT USING "Nominal Response at #.### s = ###.# % span"; SPECS.STEPTIME; SPECS.STEPPERC;
'SPECS.STEPPERC = CHANGE(SPECS.STEPPERC)
'PRINT USING "Step Response Tolerance = +/- ##.# % "; SPECS.STEPTOL;
'SPECS.STEPTOL = CHANGE(SPECS.STEPTOL)
IF SPECS.OUTSIGTYPE = "CURRENT" THEN
PRINT USING "Maximum Load Resistance = ##### Ohms"; SPECS.MAXLOADR;
SPECS.MAXLOADR = CHANGE(SPECS.MAXLOADR)
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
PRINT USING "Minimum Output Loop Voltage = ##.# V"; SPECS.LOOPVMIN;
SPECS.LOOPVMIN = CHANGE(SPECS.LOOPVMIN)
PRINT USING "Nominal Output Loop Voltage = ##.# V"; SPECS.LOOPVNOM;
SPECS.LOOPVNOM = CHANGE(SPECS.LOOPVNOM)
PRINT USING "Maximum Output Loop Voltage = ##.# V"; SPECS.LOOPVMAX;
SPECS.LOOPVMAX = CHANGE(SPECS.LOOPVMAX)
END IF
END IF
PRINT USING "Minimum Supply Voltage = ##.## V"; SPECS.MINVS;
SPECS.MINVS = CHANGE(SPECS.MINVS)
PRINT USING "Nominal Supply Voltage = ##.## V"; SPECS.NOMVS;
SPECS.MINVS = CHANGE(SPECS.MINVS)
PRINT USING "Maximum Supply Voltage = ##.## V"; SPECS.MAXVS;
SPECS.MAXVS = CHANGE(SPECS.MAXVS)
PRINT USING "Minimum Supply Current = ### mA"; SPECS.ISMIN;
SPECS.ISMIN = CHANGE(SPECS.ISMIN)
PRINT USING "Maximum Supply Current = ### mA"; SPECS.ISMAX;
SPECS.ISMAX = CHANGE(SPECS.ISMAX)
IF LEFT$(SPECS.MODNAME, 5) = "SCM5B" THEN
PRINT USING "Power Supply Sensitivity = #### ppm / %"; SPECS.PSS;
ELSEIF LEFT$(SPECS.MODNAME, 2) = "8B" THEN
PRINT USING "Power Supply Sensitivity = #### ppm / %"; SPECS.PSS;
ELSE
PRINT USING "Power Supply Sensitivity = #.#### % / %"; SPECS.PSS;
END IF
SPECS.PSS = CHANGE(SPECS.PSS)
END SUB
FUNCTION REPEAT$
CLS
LOCATE 10, 10
PRINT "Do you want to enter or modify another module ?";
DO
A$ = INKEY$
LOOP WHILE A$ = ""
REPEAT$ = A$
END FUNCTION
SUB SAVEDATA (SEL%)
CLS
LOCATE 10, 15
PRINT "Saving record in file HVIN.DAT"
T = TIMER
DO
LOOP WHILE (TIMER - T) < 1
OPEN "T:\ENGR\ATE\HVU\HVDATA\HVIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
IF SEL% = 0 THEN
NR% = LOF(1) / LEN(SPECS)
SEL% = NR% + 1
END IF
PUT #1, SEL%, SPECS
CLOSE #1
END SUB
SUB SORTALL
'This sub does a bubble sort of the model numbers in the database
'records FOR ALL MODELS
CONST FALSE = 0, TRUE = NOT FALSE
OPEN "T:\ENGR\ATE\HVU\HVDATA\HVIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
NUMRECORD% = LOF(1) / LEN(SPECS)
PRINT
PRINT TAB(10); "Sorting database, please wait."
'Sort according to string value
DO
Swaps% = FALSE
FOR I% = 1 TO NUMRECORD%
GET #1, I%, SPECS
A% = STRINGVAL%(SPECS.MODNAME)
GET #1, I% + 1, SORTDATA2
B% = STRINGVAL%(SORTDATA2.MODNAME)
'Do sort...
IF A% > B% THEN
PUT #1, I%, SORTDATA2
PUT #1, (I% + 1), SPECS
Swaps% = I%
END IF
NEXT I%
LOOP WHILE Swaps%
CLOSE #1
END SUB
SUB SORTDB (ENDFLAG%)
'This sub does a bubble sort of the model numbers in the database
'records FOR A SELECTED MODEL FAMILY
'CONST FALSE = 0, TRUE = NOT FALSE
'Create a file containing just the model numbers of all of the
'records in the database for the model family selected
OPEN "T:\ENGR\ATE\HVU\HVDATA\HVSORT.DAT" FOR RANDOM AS #2 LEN = LEN(SORTDATA1)
OPEN "T:\ENGR\ATE\HVU\HVDATA\HVIN.DAT" FOR RANDOM AS #1 LEN = LEN(SPECS)
NUMRECORD% = LOF(1) / LEN(SPECS)
SELFAM% = MENU3%
IF SELFAM% = 4 THEN
ENDFLAG% = 1
CLOSE #1
CLOSE #2
CLOSE #3
EXIT SUB 'exit selected from MENU3%
END IF
N% = 0
FOR I% = 1 TO NUMRECORD%
GET #1, I%, SPECS
MN$ = SPECS.MODNAME
SORTDATA1.MODNAME = MN$
SORTDATA1.RECNUM = I%
SELECT CASE SELFAM% 'Pick models in selected family
CASE 1
'SPECS.MODNAME = "SCM5Bxx-xxxx "
IF LEFT$(MN$, 3) = "SCM" THEN
PUT #2, , SORTDATA1 'write record # and model number
N% = N% + 1 'found a record
END IF
CASE 2
'SPECS.MODNAME = "DSCAxx-xxxx "
IF LEFT$(MN$, 3) = "DSC" THEN
PUT #2, , SORTDATA1 'write record # and model number
N% = N% + 1 'found a record
END IF
CASE 3
'SPECS.MODNAME = "8Bxx-xxxx "
IF LEFT$(MN$, 2) = "8B" THEN
PUT #2, , SORTDATA1 'write record # and model number
N% = N% + 1 'found a record
END IF
END SELECT
NEXT
SORTDATA1.MODNAME = "99999999-9999" 'always sorted to last value.
SORTDATA1.RECNUM = -1 'flag indicating end of new data (over writes old)
PUT #2, , SORTDATA1
CLOSE #1
CLOSE #2
CLOSE #3
END SUB
FUNCTION STRINGVAL% (A$)
'Calculate and return the value of the characters in A$
'which follow the hyphen
T% = LEN(A$)
DO
L% = L% + 1
LOOP UNTIL MID$(A$, L%, 1) = "-" OR L% = T%
STRINGVAL% = VAL(RIGHT$(A$, T% - L%))
END FUNCTION