IOCINFRAApp/Db/devKeithley6487.db
changeset 0 77d8eafe2a07
child 1 f6e1a4c75073
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/devKeithley6487.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,721 @@
+##########################################################################
+# 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")
+}