IOCINFRAApp/Db/devKeithley6487.db
author Heinz Junkes <junkes@fhi-berlin.mpg.de>
Thu, 07 Mar 2019 09:23:26 +0100
changeset 0 77d8eafe2a07
child 1 f6e1a4c75073
permissions -rw-r--r--
Initial repo

##########################################################################
# Copyright (c) 2011 Lawrence Berkeley National Laboratory, Accelerator
# Technology Group, Engineering Division
# This code is distributed subject to a Software License Agreement found
# in file LICENSE that is included with this distribution.
##########################################################################

#
# Basic SCPI (IEEE488.2) commands
#
record(waveform, "$(P)$(R)IDN")
{
    field(DESC, "SCPI identification string")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getIDN(119) $(PORT) $(A)")
    field(PINI, "YES")
    field(FTVL, "CHAR")
    field(NELM, "120")
}
record(bo, "$(P)$(R)RST")
{
    field(DESC, "SCPI Reset")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto cmd(*RST) $(PORT) $(A)")
}
record(bo, "$(P)$(R)CLS")
{
    field(DESC, "SCPI Clear status")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto cmd(*CLS) $(PORT) $(A)")
}
record(bo, "$(P)$(R)TRG")
{
    field(DESC, "SCPI trigger")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto cmd(*TRG) $(PORT) $(A)")
}
record(longin, "$(P)$(R)GetSTB")
{
    field(DESC, "SCPI get status byte")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(*STB) $(PORT) $(A)")
}
record(longin, "$(P)$(R)GetESR")
{
    field(DESC, "SCPI get event status")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(*ESR) $(PORT) $(A)")
}
record(longout, "$(P)$(R)SetESE")
{
    field(DESC, "SCPI enable event status")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(*ESE) $(PORT) $(A)")
}
record(longin, "$(P)$(R)GetESE")
{
    field(DESC, "SCPI enabled event status")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(*ESE) $(PORT) $(A)")
}
record(longout, "$(P)$(R)SetSRE")
{
    field(DESC, "SCPI enable service requests")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(*SRE) $(PORT) $(A)")
}
record(longin, "$(P)$(R)GetSRE")
{
    field(DESC, "Enabled service requests")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(*SRE) $(PORT) $(A)")
}
record(longin, "$(P)$(R)GetOPC")
{
    field(DESC, "Output completion status")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(*OPC) $(PORT) $(A)")
}

#
# Unlock/Lock local controls
#
record(bo, "$(P)$(R)KLOCK")
{
    field(DESC, "Lock out all local controls")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(SYST:KLOCK) $(PORT) $(A)")
    field(ZNAM, "Unlocked")
    field(ONAM, "Locked")
    field(FLNK, "$(P)$(R)KLOCKRBV")
}
record(bi, "$(P)$(R)KLOCKRBV")
{
    field(DESC, "All local controls locked?")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(SYST:KLOCK) $(PORT) $(A)")
    field(ZNAM, "Unlocked")
    field(ONAM, "Locked")
    field(PINI, "YES")
}

#
# Reading
#
record(ai, "$(P)$(R)Measure")
{
    field(DESC, "Measure current")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto measureCurrent $(PORT) $(A)")
    field(EGU,  "A")
    field(PREC, "5")
}
record(waveform, "$(P)$(R)FetchWF")
{
    field(DESC, "Fetch buffered data")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto fetchBuffered $(PORT) $(A)")
    field(EGU,  "A")
    field(PREC, "5")
    field(FTVL, "FLOAT")
    field(NELM, "$(NELM=1000)")
}

#
# Zero-check
#
record(bo, "$(P)$(R)ZeroCheck")
{
    field(DESC, "Disable/Enable zero check (input clamp)")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(SYST:ZCH) $(PORT) $(A)")
    field(ZNAM, "Off")
    field(ONAM, "On")
    field(FLNK, "$(P)$(R)ZeroCheckRBV")
}
record(bi, "$(P)$(R)ZeroCheckRBV")
{
    field(DESC, "Disable/Enable zero check (input clamp)")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(SYST:ZCH) $(PORT) $(A)")
    field(ZNAM, "Off")
    field(ONAM, "On")
    field(PINI, "YES")
}

#
# Range
#
record(bo, "$(P)$(R)AutoRange")
{
    field(DESC, "Disable/Enable auto-range")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(RANG:AUTO) $(PORT) $(A)")
    field(ZNAM, "Fixed")
    field(ONAM, "Auto")
    field(FLNK, "$(P)$(R)AutoRangeRBV")
}
record(bi, "$(P)$(R)AutoRangeRBV")
{
    field(DESC, "Disable/Enable auto-range")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(RANG:AUTO) $(PORT) $(A)")
    field(ZNAM, "Fixed")
    field(ONAM, "Auto")
    field(PINI, "YES")
}
record(mbbo, "$(P)$(R)Range")
{
    field(DESC, "Full-scale range")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setRange $(PORT) $(A)")
    field(ZRVL, "9")
    field(ZRST, "2 nA")
    field(ONVL, "8")
    field(ONST, "20 nA")
    field(TWVL, "7")
    field(TWST, "200 nA")
    field(THVL, "6")
    field(THST, "2 uA")
    field(FRVL, "5")
    field(FRST, "20 uA")
    field(FVVL, "4")
    field(FVST, "200 uA")
    field(SXVL, "3")
    field(SXST, "2 mA")
    field(SVVL, "2")
    field(SVST, "20 mA")
    field(FLNK, "$(P)$(R)RangeRBV")
}
record(mbbi, "$(P)$(R)RangeRBV")
{
    field(DESC, "Full-scale range readback")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getRange $(PORT) $(A)")
    field(ZRVL, "9")
    field(ZRST, "2 nA")
    field(ONVL, "8")
    field(ONST, "20 nA")
    field(TWVL, "7")
    field(TWST, "200 nA")
    field(THVL, "6")
    field(THST, "2 uA")
    field(FRVL, "5")
    field(FRST, "20 uA")
    field(FVVL, "4")
    field(FVST, "200 uA")
    field(SXVL, "3")
    field(SXST, "2 mA")
    field(SVVL, "2")
    field(SVST, "20 mA")
    field(PINI, "YES")
}

#
# Filtering
#
record(ao, "$(P)$(R)IntegrationTime")
{
    field(DESC, "Reading integration time")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setF(NPLC) $(PORT) $(A)")
    field(EGU,  "Cycles")
    field(PREC, "2")
    field(LOPR, "0")
    field(HOPR, "60")
    field(DRVL, "0.01")
    field(DRVH, "60")
    field(FLNK, "$(P)$(R)IntegrationTimeRBV")
}
record(ai, "$(P)$(R)IntegrationTimeRBV")
{
    field(DESC, "Reading integration time")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getF(NPLC) $(PORT) $(A)")
    field(EGU,  "Cycles")
    field(PREC, "2")
    field(LOPR, "0")
    field(HOPR, "60")
    field(PINI, "YES")
}
record(longout, "$(P)$(R)FilterCount")
{
    field(DESC, "Number of samples in reading")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(AVER:COUN) $(PORT) $(A)")
    field(EGU,  "Samples")
    field(LOPR, "2")
    field(HOPR, "100")
    field(DRVL, "2")
    field(DRVH, "100")
    field(FLNK, "$(P)$(R)FilterCountRBV")
}
record(longin, "$(P)$(R)FilterCountRBV")
{
    field(DESC, "Number of samples in reading")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(AVER:COUN) $(PORT) $(A)")
    field(EGU,  "Samples")
    field(LOPR, "2")
    field(HOPR, "100")
    field(PINI, "YES")
}
record(bo, "$(P)$(R)FilterEnable")
{
    field(DESC, "Disable/Enable filter")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(AVER) $(PORT) $(A)")
    field(ZNAM, "Disable")
    field(ONAM, "Enable")
    field(FLNK, "$(P)$(R)FilterEnableRBV")
}
record(bi, "$(P)$(R)FilterEnableRBV")
{
    field(DESC, "Disable/Enable filter")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(AVER) $(PORT) $(A)")
    field(ZNAM, "Disable")
    field(ONAM, "Enable")
    field(PINI, "YES")
}
record(bo, "$(P)$(R)Damping")
{
    field(DESC, "Disable/Enable damping")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(DAMP) $(PORT) $(A)")
    field(ZNAM, "Disable")
    field(ONAM, "Enable")
    field(FLNK, "$(P)$(R)DampingRBV")
}
record(bi, "$(P)$(R)DampingRBV")
{
    field(DESC, "Disable/Enable damping")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(DAMP) $(PORT) $(A)")
    field(ZNAM, "Disable")
    field(ONAM, "Enable")
    field(PINI, "YES")
}

#
# Triggering
#
record(mbbo, "$(P)$(R)ArmSource")
{
    field(DESC, "Arm source")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setArmSource $(PORT) $(A)")
    field(ZRVL, "0")
    field(ZRST, "Immediate")
    field(ONVL, "1")
    field(ONST, "GPIB/Serial")
    field(TWVL, "2")
    field(TWST, "Timer")
    field(THVL, "3")
    field(THST, "Manual")
    field(FRVL, "4")
    field(FRST, "Trigger Link")
    field(FVVL, "5")
    field(FVST, "SOT falling")
    field(SXVL, "6")
    field(SXST, "SOT rising")
    field(SVVL, "7")
    field(SVST, "SOT transition")
    field(FLNK, "$(P)$(R)ArmSourceRBV")
}
record(mbbi, "$(P)$(R)ArmSourceRBV")
{
    field(DESC, "Arm source readback")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getArmSource $(PORT) $(A)")
    field(ZRVL, "0")
    field(ZRST, "Immediate")
    field(ONVL, "1")
    field(ONST, "GPIB/Serial")
    field(TWVL, "2")
    field(TWST, "Timer")
    field(THVL, "3")
    field(THST, "Manual")
    field(FRVL, "4")
    field(FRST, "Trigger Link")
    field(FVVL, "5")
    field(FVST, "SOT falling")
    field(SXVL, "6")
    field(SXST, "SOT rising")
    field(SVVL, "7")
    field(SVST, "SOT transition")
    field(PINI, "YES")
}
record(mbbo, "$(P)$(R)ArmLine")
{
    field(DESC, "TLINK arm line")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(ARM:ILIN) $(PORT) $(A)")
    field(ONVL, "1")
    field(ONST, " TLink 1")
    field(TWVL, "2")
    field(TWST, " TLink 2")
    field(THVL, "3")
    field(THST, " TLink 3")
    field(FRVL, "4")
    field(FRST, " TLink 4")
    field(FVVL, "5")
    field(FVST, " TLink 5")
    field(SXVL, "6")
    field(SXST, " TLink 6")
    field(FLNK, "$(P)$(R)ArmLineRBV")
}
record(mbbi, "$(P)$(R)ArmLineRBV")
{
    field(DESC, "TLINK arm line")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(ARM:ILIN) $(PORT) $(A)")
    field(ONVL, "1")
    field(ONST, " TLink 1")
    field(TWVL, "2")
    field(TWST, " TLink 2")
    field(THVL, "3")
    field(THST, " TLink 3")
    field(FRVL, "4")
    field(FRST, " TLink 4")
    field(FVVL, "5")
    field(FVST, " TLink 5")
    field(SXVL, "6")
    field(SXST, " TLink 6")
    field(PINI, "YES")
}
record(ao, "$(P)$(R)ArmTimerInterval")
{
    field(DESC, "Arm timer interval")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setF(ARM:TIM) $(PORT) $(A)")
    field(EGU,  "s")
    field(PREC, "5")
    field(LOPR, "0")
    field(HOPR, "1e5")
    field(DRVL, "0.001")
    field(DRVH, "99999.999")
    field(FLNK, "$(P)$(R)ArmTimerIntervalRBV")
}
record(ai, "$(P)$(R)ArmTimerIntervalRBV")
{
    field(DESC, "Arm timer interval")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getF(ARM:TIM) $(PORT) $(A)")
    field(EGU,  "s")
    field(PREC, "5")
    field(LOPR, "0")
    field(HOPR, "1e5")
    field(PINI, "YES")
}
record(longout, "$(P)$(R)ArmCount")
{
    field(DESC, "Arm count")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(ARM:COUN) $(PORT) $(A)")
    field(LOPR, "1")
    field(HOPR, "2048")
    field(DRVL, "1")
    field(DRVH, "2048")
    field(FLNK, "$(P)$(R)ArmCountRBV")
}
record(longin, "$(P)$(R)ArmCountRBV")
{
    field(DESC, "Arm count")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(ARM:COUN) $(PORT) $(A)")
    field(LOPR, "1")
    field(HOPR, "2048")
    field(PINI, "YES")
}
record(mbbo, "$(P)$(R)TriggerSource")
{
    field(DESC, "Trigger source")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setTriggerSource $(PORT) $(A)")
    field(ZRVL, "0")
    field(ZRST, "Immediate")
    field(ONVL, "1")
    field(ONST, "Trigger Link")
    field(FLNK, "$(P)$(R)TriggerSourceRBV")
}
record(mbbi, "$(P)$(R)TriggerSourceRBV")
{
    field(DESC, "Trigger source readback")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getTriggerSource $(PORT) $(A)")
    field(ZRVL, "0")
    field(ZRST, "Immediate")
    field(ONVL, "1")
    field(ONST, "Trigger Link")
    field(PINI, "YES")
}
record(mbbo, "$(P)$(R)TriggerLine")
{
    field(DESC, "TLINK trigger line")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(TRIG:ILIN) $(PORT) $(A)")
    field(ONVL, "1")
    field(ONST, " TLink 1")
    field(TWVL, "2")
    field(TWST, " TLink 2")
    field(THVL, "3")
    field(THST, " TLink 3")
    field(FRVL, "4")
    field(FRST, " TLink 4")
    field(FVVL, "5")
    field(FVST, " TLink 5")
    field(SXVL, "6")
    field(SXST, " TLink 6")
    field(FLNK, "$(P)$(R)TriggerLineRBV")
}
record(mbbi, "$(P)$(R)TriggerLineRBV")
{
    field(DESC, "TLINK trigger line")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(TRIG:ILIN) $(PORT) $(A)")
    field(ONVL, "1")
    field(ONST, " TLink 1")
    field(TWVL, "2")
    field(TWST, " TLink 2")
    field(THVL, "3")
    field(THST, " TLink 3")
    field(FRVL, "4")
    field(FRST, " TLink 4")
    field(FVVL, "5")
    field(FVST, " TLink 5")
    field(SXVL, "6")
    field(SXST, " TLink 6")
    field(PINI, "YES")
}
record(ao, "$(P)$(R)TriggerDelay")
{
    field(DESC, "Trigger Delay")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setF(TRIG:DEL) $(PORT) $(A)")
    field(EGU,  "s")
    field(PREC, "5")
    field(LOPR, "0")
    field(HOPR, "1000")
    field(DRVL, "0")
    field(DRVH, "999.9998")
    field(FLNK, "$(P)$(R)TriggerDelayRBV")
}
record(ai, "$(P)$(R)TriggerDelayRBV")
{
    field(DESC, "Trigger Delay")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getF(TRIG:DEL) $(PORT) $(A)")
    field(EGU,  "s")
    field(PREC, "5")
    field(LOPR, "0")
    field(HOPR, "1000")
    field(PINI, "YES")
}
record(bo, "$(P)$(R)TriggerDelayAuto")
{
    field(DESC, "Disable/Enable trigger autodelay")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(TRIG:DEL:AUTO) $(PORT) $(A)")
    field(ZNAM, "Fixed")
    field(ONAM, "Auto")
    field(FLNK, "$(P)$(R)TriggerDelayAutoRBV")
}
record(bi, "$(P)$(R)TriggerDelayAutoRBV")
{
    field(DESC, "Disable/Enable trigger autodelay")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(TRIG:DEL:AUTO) $(PORT) $(A)")
    field(ZNAM, "Fixed")
    field(ONAM, "Auto")
    field(PINI, "YES")
}
record(longout, "$(P)$(R)TriggerCount")
{
    field(DESC, "Trigger count")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(TRIG:COUN) $(PORT) $(A)")
    field(LOPR, "1")
    field(HOPR, "2048")
    field(DRVL, "1")
    field(DRVH, "2048")
    field(FLNK, "$(P)$(R)TriggerCountRBV")
}
record(longin, "$(P)$(R)TriggerCountRBV")
{
    field(DESC, "Trigger count")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(TRIG:COUN) $(PORT) $(A)")
    field(LOPR, "1")
    field(HOPR, "2048")
    field(PINI, "YES")
}
record(bo, "$(P)$(R)Start")
{
    field(DESC, "SCPI Reset")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto cmd(INIT) $(PORT) $(A)")
}
record(bo, "$(P)$(R)Cancel")
{
    field(DESC, "Cancel trigger sequence")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto cancel $(PORT) $(A)")
}

#
# The MEASure? command resets a bunch of trigger settings.
# This sequence record will restore them.
#
record(seq, "$(P)$(R)RestoreTriggerSettings")
{
    field(DESC, "Restore trigger settings after MEASure?")
    field(LNK1, "$(P)$(R)ArmSource.PROC")
    field(LNK2, "$(P)$(R)ArmCount.PROC")
    field(LNK3, "$(P)$(R)TriggerSource.PROC")
    field(LNK6, "$(P)$(R)TriggerCount.PROC")
    field(LNK5, "$(P)$(R)TriggerDelayAuto.PROC")
    field(LNK4, "$(P)$(R)TriggerDelay.PROC")
}
record(seq, "$(P)$(R)ReadTriggerSettings")
{
    field(DESC, "Read back trigger settings")
    field(LNK1, "$(P)$(R)ArmSourceRBV.PROC")
    field(LNK2, "$(P)$(R)ArmLineRBV.PROC")
    field(LNK3, "$(P)$(R)ArmTimerIntervalRBV.PROC")
    field(LNK4, "$(P)$(R)ArmCountRBV.PROC")
    field(LNK5, "$(P)$(R)TriggerSourceRBV.PROC")
    field(LNK6, "$(P)$(R)TriggerLineRBV.PROC")
    field(LNK7, "$(P)$(R)TriggerDelayRBV.PROC")
    field(LNK8, "$(P)$(R)TriggerDelayAutoRBV.PROC")
    field(LNK9, "$(P)$(R)TriggerCountRBV.PROC")
}

#
# Voltage source
#
record(bo, "$(P)$(R)SourceEnable")
{
    field(DESC, "Disable/Enable voltage source")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(SOUR:VOLT:STAT) $(PORT) $(A)")
    field(ZNAM, "Off")
    field(ONAM, "On")
    field(FLNK, "$(P)$(R)SourceEnableRBV")
}
record(bi, "$(P)$(R)SourceEnableRBV")
{
    field(DESC, "Voltage source enabled?")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(SOUR:VOLT:STAT) $(PORT) $(A)")
    field(ZNAM, "Off")
    field(ONAM, "On")
    field(PINI, "YES")
}
record(bo, "$(P)$(R)SourceInterlock")
{
    field(DESC, "Disable/Enable interlock")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setD(SOUR:VOLT:INT) $(PORT) $(A)")
    field(ZNAM, "Disable")
    field(ONAM, "Enable")
    field(FLNK, "$(P)$(R)SourceInterlockRBV")
}
record(bi, "$(P)$(R)SourceInterlockRBV")
{
    field(DESC, "Interlock status")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getD(SOUR:VOLT:INT) $(PORT) $(A)")
    field(ONAM, "Good")
    field(ZNAM, "Broken")
    field(PINI, "YES")
}
record(mbbo, "$(P)$(R)SourceRange")
{
    field(DESC, "Full-scale range")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setSourceRange $(PORT) $(A)")
    field(ZRVL, "10")
    field(ZRST, "10 V")
    field(ONVL, "50")
    field(ONST, "50 V")
    field(TWVL, "500")
    field(TWST, "500 V")
    field(FLNK, "$(P)$(R)SourceRangeRBV")
}
record(mbbi, "$(P)$(R)SourceRangeRBV")
{
    field(DESC, "Full-scale range readback")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getSourceRange $(PORT) $(A)")
    field(ZRVL, "0")
    field(ZRST, "10 V")
    field(ONVL, "1")
    field(ONST, "50 V")
    field(TWVL, "2")
    field(TWST, "500 V")
}
record(mbbo, "$(P)$(R)SourceIlimit")
{
    field(DESC, "Source current limit")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setIlimit $(PORT) $(A)")
    field(ZRVL, "5")
    field(ZRST, "25 uA")
    field(ONVL, "4")
    field(ONST, "250 uA")
    field(TWVL, "3")
    field(TWST, "2.5 mA")
    field(THVL, "2")
    field(THST, "25 mA")
    field(FLNK, "$(P)$(R)SourceIlimitRBV")
}
record(mbbi, "$(P)$(R)SourceIlimitRBV")
{
    field(DESC, "Source current limit")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getIlimit $(PORT) $(A)")
    field(ZRVL, "5")
    field(ZRST, "25 uA")
    field(ONVL, "4")
    field(ONST, "250 uA")
    field(TWVL, "3")
    field(TWST, "2.5 mA")
    field(THVL, "2")
    field(THST, "25 mA")
    field(PINI, "YES")
}
record(ao, "$(P)$(R)SourceVoltage")
{
    field(DESC, "Source voltage setpoint")
    field(DTYP, "stream")
    field(OUT,  "@devKeithley6487.proto setF(SOUR:VOLT) $(PORT) $(A)")
    field(EGU,  "V")
    field(PREC, "5")
    field(LOPR, "-505")
    field(HOPR, "505")
    field(DRVL, "-505")
    field(DRVH, "505")
    field(FLNK, "$(P)$(R)SourceVoltageRBV")
}
record(ai, "$(P)$(R)SourceVoltageRBV")
{
    field(DESC, "Source voltage readback")
    field(DTYP, "stream")
    field(INP,  "@devKeithley6487.proto getF(SOUR:VOLT) $(PORT) $(A)")
    field(EGU,  "V")
    field(PREC, "5")
    field(LOPR, "-505")
    field(HOPR, "505")
    field(PINI, "YES")
}
record(seq, "$(P)$(R)SourceReadSettings")
{
    field(DESC, "Read back source settings")
    field(LNK1, "$(P)$(R)SourceVoltageRBV.PROC")
    field(LNK2, "$(P)$(R)SourceEnableRBV.PROC")
    field(LNK3, "$(P)$(R)SourceInterlockRBV.PROC")
    field(LNK4, "$(P)$(R)SourceIlimitRBV.PROC")
    field(LNK5, "$(P)$(R)SourceRangeRBV.PROC")
}