Initial repo
authorHeinz Junkes <junkes@fhi-berlin.mpg.de>
Thu, 07 Mar 2019 09:23:26 +0100
changeset 0 77d8eafe2a07
child 1 f6e1a4c75073
Initial repo
IOCINFRAApp/Db/Bronkhorst.db
IOCINFRAApp/Db/Bronkhorst.substitution
IOCINFRAApp/Db/Keithley6485.db
IOCINFRAApp/Db/LakeShore331.db
IOCINFRAApp/Db/LakeShore331.proto
IOCINFRAApp/Db/Makefile
IOCINFRAApp/Db/SATECO_base.db
IOCINFRAApp/Db/SATECO_lakeshore.substitution
IOCINFRAApp/Db/SATECO_lakeshore331.db
IOCINFRAApp/Db/SATECO_lakeshore331.proto
IOCINFRAApp/Db/TPG26x.db
IOCINFRAApp/Db/TPG26x.proto
IOCINFRAApp/Db/XGS600.proto
IOCINFRAApp/Db/XGS600.substitutions
IOCINFRAApp/Db/XGS600_chan.db
IOCINFRAApp/Db/XGS600_unit.db
IOCINFRAApp/Db/asynRecord.db
IOCINFRAApp/Db/devBronkhorst.proto
IOCINFRAApp/Db/devKeithley6487.db
IOCINFRAApp/Db/devKeithley6487.proto
IOCINFRAApp/Db/ls331.proto
IOCINFRAApp/Makefile
IOCINFRAApp/src/IOCINFRAMain.cpp
IOCINFRAApp/src/Makefile
IOCINFRAApp/src/bronkhorstFloat.c
IOCINFRAApp/src/bronkhorstFloat.dbd
IOCINFRAApp/src/drvAsynKeithley648x.cpp
IOCINFRAApp/src/drvAsynKeithley648x.dbd
Makefile
bin/linux-x86_64/IOCINFRA
configure/CONFIG
configure/CONFIG_SITE
configure/Makefile
configure/RELEASE
configure/RULES
configure/RULES.ioc
configure/RULES_DIRS
configure/RULES_TOP
db/LS331.proto
db/LakeShore331.db
db/XGS600.proto
db/XGS600.substitutions
db/XGS600_chan.db
db/XGS600_unit.db
dbd/IOCINFRA.dbd
iocBoot/Makefile
iocBoot/iocIOCINFRA/Makefile
iocBoot/iocIOCINFRA/st.cmd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/Bronkhorst.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,1430 @@
+#################################################################################
+#
+################################################################################
+record(stringin, "$(IOC):$(NAME)-NAME")
+{
+	field(DESC, "Name of the device")
+	field(VAL, "$(NAME) Device")
+	field(PINI, "YES")
+}
+
+record(stringin, "$(IOC):$(NAME)-IDN")
+{
+	field(DESC, "Name of the device")
+	field(INP, "@devBronkhorst.proto identity $(PORT)")
+	field(PINI, "YES")
+}
+
+################################################################################
+################################################################################
+#INTEGER PARAMETERS
+################################################################################
+################################################################################
+################################################################################
+# Read; Measure will return a value between -23593 and 41942
+# Record $(IOC):$(NAME)-MEASURE recomputes this value to percentages. NOTE that percentage
+# can be larger than 100% (max value: 131.07%) and even negative for bipolar
+# ADC mode. (min value: -73.73%)
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-MEASURE_")
+{
+	field(DESC, "Read measure")
+	field(SCAN, "$(SCAN2)")
+	field(DTYP, "stream")
+	field(PREC, "3")
+	field(INP, "@devBronkhorst.proto readInt(01,20) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-MEASURE")
+}
+
+record(calc, "$(IOC):$(NAME)-GET-MEASURE")
+{
+	field(DESC, "Measure to percentage")
+	field(INPA, "$(IOC):$(NAME)-GET-MEASURE_")
+	field(EGU, "%")
+	field(PREC, "3")
+	field(CALC, "A*100/32000")
+	field(FLNK, "$(IOC):$(NAME)-COMM-STATUS")
+}
+
+
+################################################################################
+# Read; $(IOC):$(NAME)-GET-SETPOINT_ fetches the value from the device, 
+# $(IOC):$(NAME)-GET-SETPOINT recalculates the value to percentages.
+#
+# $(IOC):$(NAME)-GET-SETPOINT_ is scanned periodically, because setpoint value can be 
+# changed on ALARM or when the Counter reaches it's limit - this is configured
+# by the user
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-SETPOINT_")
+{
+	field(DESC, "Read setpoint in raw [0,32000]")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN2)")
+	field(INP, "@devBronkhorst.proto readInt(01,21) $(PORT)")
+	field(PREC, "1")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-SETPOINT")
+}
+
+record(calc, "$(IOC):$(NAME)-GET-SETPOINT")
+{
+	field(DESC, "Setpoint to percentage")
+	field(INPA, "$(IOC):$(NAME)-GET-SETPOINT_")
+	field(EGU, "%")
+	field(PREC, "1")
+	field(CALC, "A*100/32000")
+}
+
+################################################################################
+# Write; User writes the flow percentage to $(IOC):$(NAME)-SET-SETPOINT.
+# $(IOC):$(NAME)-SET-SETPOINT_ recalculates the percentage to interval [0, 32000] and 
+# writes the new setpoint to the device
+################################################################################
+record(ao, "$(IOC):$(NAME)-SET-SETPOINT")
+{
+	field(DESC, "Setpoint in percentage")
+	field(EGU, "%")
+	field(PREC, "1")
+	field(FLNK, "$(IOC):$(NAME)-SET-SETPOINT_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-SETPOINT_")
+{
+	field(DESC, "Write setpoint in raw [0,32000]")
+	field(INPA, "$(IOC):$(NAME)-SET-SETPOINT")
+	field(PREC, "1")
+	field(DTYP, "stream")
+	field(CALC, "A*32000/100")
+	field(OUT, "@devBronkhorst.proto writeInt(01,21) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-SETPOINT_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-SP-INIT_"){
+	field(INPA, "$(IOC):$(NAME)-SET-SETPOINT_")
+	field(CALC, "A*100/32000")
+	field(OUT, "$(IOC):$(NAME)-SET-SETPOINT")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-SET-SETPOINT")
+
+}
+
+################################################################################
+# Read/Write: Setpoint is ramped from 0% to 100% in slope*0.1 seconds
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-SETPOINT-SLOPE")
+{
+	field(DESC, "Read setpoint slope")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(PINI, "YES")
+	field(INP, "@devBronkhorst.proto readInt(01,22) $(PORT)")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-SETPOINT-SLOPE")
+{
+	field(DESC, "Write setpoint slope")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(OUT, "@devBronkhorst.proto writeInt(01,22) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-SETPOINT-SLOPE")
+}
+
+################################################################################
+# Read/Write: Get control mode from device. One of $(IOC):$(NAME)-CTRL-MODE-1/2_ will
+# be in illegal value state. The GUI screen will show the one which is not in 
+# illegal value state by checking the severity of the state
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-CTRL-MODE_")
+{
+	field(DESC,"")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(01,04) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-CTRL-MODE-1_")
+}
+
+record(mbbi, "$(IOC):$(NAME)-CTRL-MODE-1_")
+{
+	field(DESC, "Control modes 0-15")
+	field(DTYP, "Raw Soft Channel")
+	field(INP, "$(IOC):$(NAME)-GET-CTRL-MODE_")
+	field(UNSV, "MAJOR")
+	field(ZRVL, "0")
+	field(ZRST, "BUS/RS232")
+	field(ONVL, "1")
+	field(ONST, "Analog input")
+	field(TWVL, "2")
+	field(TWST, "FLOWBUS*FLOWBUS")
+	field(THVL, "3")
+	field(THST, "Close valve")
+	field(FRVL, "4")
+	field(FRST, "Controller idle")
+	field(FVVL, "5")
+	field(FVST, "Testmode")
+	field(SXVL, "6")
+	field(SXST, "Tuning mode")
+	field(SVVL, "7")
+	field(SVST, "Setpoint=100%")
+	field(EIVL, "8")
+	field(EIST, "Purge valve")
+	field(NIVL, "9")
+	field(NIST, "Calibration mode")
+	field(TEVL, "10")
+	field(TEST, "analogIn*FLOWBUS")
+	field(ELVL, "11")
+	field(ELST, "Keyboard||FLOWBUS")
+	field(TVVL, "12")
+	field(TVST, "Setpoint=0%")
+	field(TTVL, "13")
+	field(TTST, "FLOWBUS*analogIn")
+	field(FTVL, "14")
+	field(FTST, "Range select mode")
+	field(FFVL, "15")
+	field(FFST, "Manual start, auto end")
+	field(FLNK, "$(IOC):$(NAME)-CTRL-MODE-2_")
+}
+
+record(mbbi, "$(IOC):$(NAME)-CTRL-MODE-2_")
+{
+	field(DESC, "Control modes 0-15")
+	field(DTYP, "Raw Soft Channel")
+	field(INP, "$(IOC):$(NAME)-GET-CTRL-MODE_")
+	field(UNSV, "MAJOR")
+	field(ZRSV, "MAJOR")
+	field(ONVL, "16")
+	field(ONST, "Auto start, manual end")
+	field(TWVL, "17")
+	field(TWST, "Auto start/end")
+	field(THVL, "18")
+	field(THST, "RS232 setpoint")
+	field(FRVL, "19")
+	field(FRST, "RS232 broadcast")
+	field(FVVL, "20")
+	field(FVST, "Valve stearing")
+	field(SXVL, "21")
+	field(SXST, "Analog valve stearing")
+	field(SVVL, "22")
+	field(SVST, "Valve safe state")
+}
+
+################################################################################
+# Read/Write: Set control mode. GUI screen will contain strings representing
+# the values on the interval [0, 22]. These values correspond to states in mbbi 
+# records $(IOC):$(NAME)-CTRL-MODE-1,2_
+################################################################################
+record(ao, "$(IOC):$(NAME)-SET-CTRL-MODE")
+{
+	field(DESC,"Set the control mode")
+	field(DTYP, "stream")	
+	field(OUT, "@devBronkhorst.proto writeChar(01,04) $(PORT)")
+}
+
+
+################################################################################
+# Read/Write: Get/Set fluid number.
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-FLUID-NUM")
+{
+	field(DESC, "Read fluid number")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(PINI, "YES")
+	field(INP, "@devBronkhorst.proto readChar(01,10) $(PORT)")
+
+}
+
+record(ao, "$(IOC):$(NAME)-SET-FLUID-NUM")
+{
+	field(DESC, "Set fluid number")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(OUT, "@devBronkhorst.proto writeChar(01,10) $(PORT)")
+}
+
+################################################################################
+# Read: Read sensor type
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-SENSOR-TYPE")
+{
+	field(DESC,"Read sensor type")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")	
+	field(INP, "@devBronkhorst.proto readChar(01,0E) $(PORT)")
+	field(ZRVL, "0")
+	field(ONVL, "1")
+	field(TWVL, "2")
+	field(THVL, "3")
+	field(FRVL, "4")
+	field(FVVL, "128")
+	field(SXVL, "129")
+	field(SVVL, "130")
+	field(EIVL, "131")
+	field(NIVL, "132")
+	field(ZRST, "Pressure controller")
+	field(ONST, "Liquid volume controller")
+	field(TWST, "Liquid/gas controller")
+	field(THST, "Gas volume controller")
+	field(FRST, "Other controller")
+	field(FVST, "Pressure sensor")
+	field(SXST, "Liquid volume sensor")
+	field(SVST, "Liquid/gas mass sensor")
+	field(EIST, "Gas volume sensor")
+	field(NIST, "Other sensor")
+	field(PINI, "YES")
+}
+
+
+################################################################################
+# Read: Get readout unit
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-CAP-UNIT-IDX")
+{
+	field(DESC, "Capacity unit index")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(01,0F) $(PORT)")
+	field(ZRST, "ln/min")
+	field(ONST, "mln/h")
+	field(TWST, "mln/min")
+	field(THST, "ln/h")
+	field(FRST, "m3n/h")
+	field(FFST, "mls/min")
+	field(SXST, "mls/h")
+	field(SVST, "ls/min")
+	field(EIST, "ls/h")
+	field(NIST, "m3s/h")
+	field(PINI, "YES")
+}
+
+################################################################################
+# Read: Valve will go into the safe state if buss communication is lost and
+# control mode is in BUS/RS232 state or if initreset = 73 or if control mode
+# is 22.
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-VALVE-STATE")
+{
+	field(DESC, "Capacity unit index")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(72,1A) $(PORT)")
+	field(ZRST, "Deactivate")
+	field(ONST, "Activate")
+	field(TWST, "Close")
+	field(THST, "Open")
+	field(FRST, "Current position")
+	field(FFST, "Safe Value")
+	field(PINI, "YES")
+}
+
+record(mbbo, "$(IOC):$(NAME)-SET-VALVE-STATE")
+{
+	field(DESC, "Capacity unit index")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(OUT, "@devBronkhorst.proto writeChar(72,1A) $(PORT)")
+	field(ZRST, "Deactivate")
+	field(ONST, "Activate")
+	field(TWST, "Close")
+	field(THST, "Open")
+	field(FRST, "Current position")
+	field(FFST, "Safe Value")
+	field(FLNK, "$(IOC):$(NAME)-GET-VALVE-STATE")
+}
+
+################################################################################
+# Read: Alarm info. mbbiDirect record checks which flags are set and then 
+# starts (forward links) the process chain of bi records representing the value
+# of each alarm state. 
+################################################################################
+record(mbbiDirect, "$(IOC):$(NAME)-GET-ALARM-INFO")
+{
+	field(DESC, "Read alarm flags")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readChar(01,14) $(PORT)")
+	field(SCAN, "$(SCAN2)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-ERROR-MSG-NUM")
+}
+
+################################################################################
+# Read: Alarm mode
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-ALARM-MODE")
+{
+	field(DESC, "Read alarm mode")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readChar(61,03) $(PORT)")
+	field(SCAN, "$(SCAN1)")
+	field(ZRST, "Off")
+	field(ONST, "Absolute Limits")
+	field(TWST, "Setpoint Limits")
+	field(THST, "Power up")
+	field(PINI, "YES")
+}
+
+################################################################################
+# Write; Set Alarm mode
+################################################################################
+record(mbbo, "$(IOC):$(NAME)-SET-ALARM-MODE")
+{
+	field(DESC, "Set alarm mode")
+	field(DTYP, "stream")
+	field(OUT, "@devBronkhorst.proto writeChar(61,03) $(PORT)")
+	field(SCAN, "$(SCAN1)")
+	field(ZRST, "Off")
+	field(ONST, "Absolute Limits")
+	field(TWST, "Setpoint Limits")
+	field(THST, "Power up")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALARM-MODE")
+}
+################################################################################
+# Read-Write; Get/Set maximum alarm limit. User specifies percentage which is 
+# converted to interval [0, 32000]
+################################################################################
+record(calc, "$(IOC):$(NAME)-GET-ALM-MAX-LIM")
+{
+	field(DESC, "Get alarm maximum limit in %")
+	field(INPA, "$(IOC):$(NAME)-GET-ALM-MAX-LIM_")
+	field(SCAN, "$(SCAN1)")
+	field(PREC, "1")
+	field(CALC, "A*100/32000")
+	field(EGU, "%")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-ALM-MAX-LIM_")
+{
+	field(DESC, "Get alarm maximum limit in raw")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readInt(61,21) $(PORT)")
+	field(SCAN, "$(SCAN1)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-MAX-LIM")
+}
+
+record(ai, "$(IOC):$(NAME)-SET-ALM-MAX-LIM")
+{
+	field(DESC, "Set alarm maximum limit in %")
+	field(FLNK, "$(IOC):$(NAME)-SET-ALM-MAX-LIM_")
+	field(EGU, "%")
+	field(PREC, "1")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-ALM-MAX-LIM_")
+{
+	field(DESC, "Set alarm maximum limit in raw")
+	field(DTYP, "stream")
+	field(INPA, "$(IOC):$(NAME)-SET-ALM-MAX-LIM")
+	field(CALC, "A*32000/100")
+	field(OUT, "@devBronkhorst.proto writeInt(61,21) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-MAX-LIM_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-ALM-MAX-LIM-INIT_"){
+	field(INPA, "$(IOC):$(NAME)-SET-ALM-MAX-LIMT_")
+	field(CALC, "A*100/32000")
+	field(OUT, "$(IOC):$(NAME)-SET-ALM-MAX-LIM")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-SET-ALM-MAX-LIM")
+
+}
+
+################################################################################
+# Read-Write; Get/Set minimum alarm limit. User specifies percentage which is 
+# converted to interval [0, 32000]
+################################################################################
+record(calc, "$(IOC):$(NAME)-GET-ALM-MIN-LIM")
+{
+	field(DESC, "Get alarm minimum limit in %")
+	field(INPA, "$(IOC):$(NAME)-GET-ALM-MIN-LIM_")
+	field(SCAN, "$(SCAN1)")
+	field(PREC, "1")
+	field(CALC, "A*100/32000")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-ALM-MIN-LIM_")
+{
+	field(DESC, "Get alarm minimum limit in raw")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readInt(61,22) $(PORT)")
+	field(SCAN, "$(SCAN1)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-MIN-LIM")
+}
+
+record(ai, "$(IOC):$(NAME)-SET-ALM-MIN-LIM")
+{
+	field(DESC, "Set alarm minimum limit in %")
+	field(EGU, "%")
+	field(PREC, "1")
+	field(FLNK, "$(IOC):$(NAME)-SET-ALM-MIN-LIM_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-ALM-MIN-LIM_")
+{
+	field(DESC, "Set alarm minimum limit in raw")
+	field(DTYP, "stream")
+	field(INPA, "$(IOC):$(NAME)-SET-ALM-MIN-LIM")
+	field(CALC, "A*32000/100")
+	field(OUT, "@devBronkhorst.proto writeInt(61,22) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-MIN-LIM_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-ALM-MIN-LIM-INIT_"){
+	field(INPA, "$(IOC):$(NAME)-SET-ALM-MIN-LIMT_")
+	field(CALC, "A*100/32000")
+	field(OUT, "$(IOC):$(NAME)-SET-ALM-MIN-LIM")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-SET-ALM-MIN-LIM")
+
+}
+
+
+################################################################################
+# Read-Write; Get/Set alarm setpoint mode. If device goes into an alarm state,
+# a new setpoint (stored in the record $(IOC):$(NAME)-GET/SET-ALM-NEW-SP) will be set, 
+# but only if device ($(IOC):$(NAME)-GET/SET-ALM-SP-MODE) is in state 1.
+################################################################################
+record(bi, "$(IOC):$(NAME)-GET-ALM-SP-MODE")
+{
+	field(DESC, "Get alarm setpoint mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "NO")
+	field(ONAM, "YES")
+	field(PINI, "YES")
+	field(INP, "@devBronkhorst.proto readChar(61,05) $(PORT)")
+}
+
+record(bo, "$(IOC):$(NAME)-SET-ALM-SP-MODE")
+{
+	field(DESC, "Set alarm setpoint mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "NO")
+	field(ONAM, "YES")
+	field(OUT, "@devBronkhorst.proto writeChar(61,05) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-SP-MODE")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-ALM-NEW-SP_")
+{
+	field(DESC, "Read alarm setpoint")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readInt(61,26) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-NEW-SP")
+}
+
+record(calc, "$(IOC):$(NAME)-GET-ALM-NEW-SP")
+{
+	field(DESC, "Alarm setpoint to percentage")
+	field(INPA, "$(IOC):$(NAME)-GET-ALM-NEW-SP_")
+	field(EGU, "%")
+	field(PREC, "1")
+	field(CALC, "A*100/32000")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-ALM-NEW-SP")
+{
+	field(DESC, "Alarm setpoint in percentage")
+	field(EGU, "%")
+	field(PREC, "1")
+	field(FLNK, "$(IOC):$(NAME)-SET-ALM-NEW-SP_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-ALM-NEW-SP_")
+{
+	field(DESC, "Write alarm setpoint")
+	field(INPA, "$(IOC):$(NAME)-SET-ALM-NEW-SP")
+	field(DTYP, "stream")
+	field(CALC, "A*32000/100")
+	field(OUT, "@devBronkhorst.proto writeInt(61,26) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-NEW-SP_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-ALM-NEW-SP-INIT_"){
+	field(INPA, "$(IOC):$(NAME)-SET-ALM-NEW-SP_")
+	field(CALC, "A*100/32000")
+	field(OUT, "$(IOC):$(NAME)-SET-ALM-NEW-SP")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-SET-ALM-NEW-SP")
+
+}
+
+
+################################################################################
+# Read-Write; Alarm delay time seconds. Alarm action will be delayed when alarm
+# limit has been exceeded. Automatic reset will be delayed when sensor signal
+# reaches safe level again.
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-ALM-DELAY")
+{
+	field(DESC, "Get alarm delay")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(EGU, "s")
+	field(PINI, "YES")
+	field(INP, "@devBronkhorst.proto readChar(61,07) $(PORT)")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-ALM-DELAY")
+{
+	field(DESC, "Get alarm delay")
+	field(DTYP, "stream")
+	field(EGU, "s")
+	field(OUT, "@devBronkhorst.proto writeChar(61,07) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-ALM-DELAY")
+}
+
+################################################################################
+# Read-Write; Enable reset alarm for different reset triggers.
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-RESET-ALM-MODE")
+{
+	field(DESC, "Get reset alarm mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(61,09) $(PORT)")
+	field(ZRST, "OFF")
+	field(ONST, "Switch")
+	field(TWST, "External")
+	field(THST, "External,Switch")
+	field(FRST, "RS232")
+	field(FVST, "RS232,Switch")
+	field(SXST, "RS232,Ext")
+	field(SVST, "RS232,Ext,Switch")
+	field(EIST, "Auto")
+	field(NIST, "Auto,Switch")
+	field(TEST, "Auto,Ext")
+	field(ELST, "Auto,Ext,Switch")
+	field(TVST, "Auto,RS232")
+	field(TTST, "Auto,RS232,Switch")
+	field(FTST, "Auto,RS232,Ext")
+	field(FFST, "Auto,RS232,Ext,Switch")
+	#field(PINI, "YES")
+}
+
+record(mbboDirect, "$(IOC):$(NAME)-SET-RESET-ALM-MODE")
+{
+	field(DESC, "Set alarm reset mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(B0, "1")
+	field(B2, "1")
+	field(OUT, "@devBronkhorst.proto writeChar(61,09) $(PORT)")
+#	field(ZRST, "OFF")
+#	field(ONST, "Switch")
+#	field(TWST, "External")
+#	field(THST, "Switch,External")
+#	field(FRST, "RS232")
+#	field(FVST, "RS232,Switch")
+#	field(SXST, "RS232,Ext")
+#	field(SVST, "RS232,Ext,Switch")
+#	field(EIST, "Auto")
+#	field(NIST, "Auto,Switch")
+#	field(TEST, "Auto,Ext")
+#	field(ELST, "Auto,Ext,Switch")
+#	field(TVST, "Auto,RS232")
+#	field(TTST, "Auto,RS232,Switch")
+#	field(FTST, "Auto,RS232,Ext")
+#	field(FFST, "Auto,RS232,Ext,Switch")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-RESET-ALM-MODE")
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-SWITCH")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-ALM-MODE.B0")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-ALM-MODE")
+
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-EXT")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-ALM-MODE.B1")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-ALM-MODE")
+
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-RS232")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-ALM-MODE.B2")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-ALM-MODE")
+
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-AUTO")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-ALM-MODE.B3")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-ALM-MODE")
+
+}
+
+################################################################################
+# Read-Write; Counter mode.
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-CNT-MODE")
+{
+	field(DESC, "Get counter mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(68,08) $(PORT)")
+	field(ZRST, "Off")
+	field(ONST, "Continuous")
+	field(TWST, "To limit")
+	field(PINI, "YES")
+}
+
+record(mbbo, "$(IOC):$(NAME)-SET-CNT-MODE")
+{
+	field(DESC, "Set counter mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(OUT, "@devBronkhorst.proto writeChar(68,08) $(PORT)")
+	field(ZRST, "Off")
+	field(ONST, "Continuous")
+	field(TWST, "To limit")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-MODE")
+}
+
+################################################################################
+# Read-Write; Counter setpoint mode. 0 - No setpoint change when limit is 
+# reached. 1 - setpoint change when limit is reached
+################################################################################
+record(bi, "$(IOC):$(NAME)-GET-CNT-SP-MODE")
+{
+	field(DESC, "Get counter mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(68,05) $(PORT)")
+	field(ZNAM, "NO")
+	field(ONAM, "YES")
+	field(PINI, "YES")
+}
+
+record(bo, "$(IOC):$(NAME)-SET-CNT-SP-MODE")
+{
+	field(DESC, "Set counter mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(OUT, "@devBronkhorst.proto writeChar(68,05) $(PORT)")
+	field(ZNAM, "NO")
+	field(ONAM, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-SP-MODE")
+}
+
+################################################################################
+# Read-Write; Get/Set new counter setpoint which will apply f GET-CNT-SP-MODE is
+# YES when limit is reached.
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-CNT-NEW-SP_")
+{
+	field(DESC, "Read counter new setpoint")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readInt(68,26) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-NEW-SP")
+}
+
+record(calc, "$(IOC):$(NAME)-GET-CNT-NEW-SP")
+{
+	field(DESC, "Counter new setpoint to percentage")
+	field(INPA, "$(IOC):$(NAME)-GET-CNT-NEW-SP_")
+	field(EGU, "%")
+	field(PREC, "1")
+	field(CALC, "A*100/32000")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-CNT-NEW-SP")
+{
+	field(DESC, "Counter new setpoint in percentage")
+	field(EGU, "%")
+	field(PREC, "1")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT-NEW-SP_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-CNT-NEW-SP_")
+{
+	field(DESC, "Write counter new setpoint")
+	field(INPA, "$(IOC):$(NAME)-SET-CNT-NEW-SP")
+	field(DTYP, "stream")
+	field(CALC, "A*32000/100")
+	field(OUT, "@devBronkhorst.proto writeInt(68,26) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-NEW-SP_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-CNT-NEW-SP-INIT_"){
+	field(INPA, "$(IOC):$(NAME)-SET-CNT-NEW-SP_")
+	field(CALC, "A*100/32000")
+	field(OUT, "$(IOC):$(NAME)-SET-CNT-NEW-SP")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT-NEW-SP")
+
+}
+
+################################################################################
+# Read-Write; Counter unit
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-CNT-UNIT")
+{
+	field(DESC, "Read counter unit")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readChar(68,02) $(PORT)")
+	field(ZRST, "ln")
+	field(ONST, "mm3n")
+	field(TWST, "mln")
+	field(THST, "cm3n")
+	field(FRST, "uln")
+	field(FVST, "dm3n")
+	field(SXST, "m3n")
+	field(SVST, "uls")
+	field(EIST, "mm3s")
+	field(NIST, "mls")
+	field(TEST, "cm3s")
+	field(ELST, "ls")
+	field(TVST, "dm3s")
+	field(TTST, "m3s")
+#	field(PINI, "YES")
+}
+
+record(mbbo, "$(IOC):$(NAME)-SET-CNT-UNIT")
+{
+	field(DESC, "Read counter unit")
+	field(DTYP, "stream")
+	field(OUT, "@devBronkhorst.proto writeChar(68,02) $(PORT)")
+	field(VAL, "0")
+	field(ZRST, "ln")
+	field(ONST, "mm3n")
+	field(TWST, "mln")
+	field(THST, "cm3n")
+	field(FRST, "uln")
+	field(FVST, "dm3n")
+	field(SXST, "m3n")
+	field(SVST, "uls")
+	field(EIST, "mm3s")
+	field(NIST, "mls")
+	field(TEST, "cm3s")
+	field(ELST, "ls")
+	field(TVST, "dm3s")
+	field(TTST, "m3s")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-UNIT")
+}
+
+
+################################################################################
+# Read-Write; Enable reset counter for different reset triggers.
+################################################################################
+record(mbbi, "$(IOC):$(NAME)-GET-RESET-CNT-MODE")
+{
+	field(DESC, "Get reset alarm mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(68,09) $(PORT)")
+	field(ZRST, "OFF")
+	field(ONST, "Switch")
+	field(TWST, "External")
+	field(THST, "Switch,External")
+	field(FRST, "RS232")
+	field(FVST, "RS232,Switch")
+	field(SXST, "RS232,Ext")
+	field(SVST, "RS232,Ext,Switch")
+	field(EIST, "Auto")
+	field(NIST, "Auto,Switch")
+	field(TEST, "Auto,Ext")
+	field(ELST, "Auto,Ext,Switch")
+	field(TVST, "Auto,RS232")
+	field(TTST, "Auto,RS232,Switch")
+	field(FTST, "Auto,RS232,Ext")
+	field(FFST, "Auto,RS232,Ext,Switch")
+}
+
+record(mbboDirect, "$(IOC):$(NAME)-SET-RESET-CNT-MODE")
+{
+	field(DESC, "Set alarm reset mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(B0, "1")
+	field(B2, "1")
+	field(OUT, "@devBronkhorst.proto writeChar(68,09) $(PORT)")
+#	field(ZRST, "OFF")
+#	field(ONST, "Switch")
+#	field(TWST, "External")
+#	field(THST, "Switch,External")
+#	field(FRST, "RS232")
+#	field(FVST, "RS232,Switch")
+#	field(SXST, "RS232,Ext")
+#	field(SVST, "RS232,Ext,Switch")
+#	field(EIST, "Auto")
+#	field(NIST, "Auto,Switch")
+#	field(TEST, "Auto,Ext")
+#	field(ELST, "Auto,Ext;Switch")
+#	field(TVST, "Auto,RS232")
+#	field(TTST, "Auto,RS232,Switch")
+#	field(FTST, "Auto,RS232,Ext")
+#	field(FFST, "Auto,RS232,Ext,Switch")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-RESET-CNT-MODE")
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-CNT-SWITCH")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-CNT-MODE.B0")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-CNT-MODE")
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-CNT-EXT")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-CNT-MODE.B1")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-CNT-MODE")
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-CNT-RS232")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-CNT-MODE.B2")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-CNT-MODE")
+}
+
+record(bo, "$(IOC):$(NAME)-TOGGLE-RESET-CNT-AUTO")
+{
+	field(DESC, "")
+	field(OUT, "$(IOC):$(NAME)-SET-RESET-CNT-MODE.B3")
+	field(FLNK, "$(IOC):$(NAME)-SET-RESET-CNT-MODE")
+}
+################################################################################
+# Write. RESET
+################################################################################
+record(mbbo, "$(IOC):$(NAME)-RESET")
+{
+	field(DESC, "Set alarm reset mode")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(OUT, "@devBronkhorst.proto writeChar(73,08) $(PORT)")
+	field(ZRST, "NO RESET")
+	field(ONST, "Counter")
+	field(TWST, "Alarm")
+	field(THST, "Limit counter")
+	field(FRST, "Counter reset & OFF")
+	field(FVST, "Module")
+	field(SXST, "Alarm info error")
+	field(SVST, "Alarm info warning")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-MODE")
+
+}
+
+################################################################################
+################################################################################
+#FLOAT PARAMETERS
+################################################################################
+################################################################################
+################################################################################
+# Read; Counter value
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-CNT")
+{
+	field(DESC, "Read counter")
+	field(PREC, "3")
+}
+
+record(aSub, "$(IOC):$(NAME)-GET-CNT_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-GET-CNT__")
+	field(FTA, "LONG")
+	field(OUTA, "$(IOC):$(NAME)-GET-CNT")
+	field(FTVA, "FLOAT")
+	field(SNAM, "readFloat")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-CNT__")
+{
+	field(DESC, "Read counter as long")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readFloat(68,41) $(PORT)")
+	field(SCAN, "$(SCAN2)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT_")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-CNT")
+{
+	field(DESC, "Set counter")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT_")
+}
+
+record(aSub, "$(IOC):$(NAME)-SET-CNT_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-SET-CNT")
+	field(FTA, "FLOAT")
+	field(OUTA, "$(IOC):$(NAME)-SET-CNT__")
+	field(FTVA, "LONG")
+	field(SNAM, "writeFloat")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT__")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-CNT__")
+{
+	field(DESC, "Set counter as long")
+	field(DTYP, "stream")
+	field(OUT, "@devBronkhorst.proto writeFloat(68,41) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT__")
+}
+
+record(aSub, "$(IOC):$(NAME)-SET-CNT-INIT_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-SET-CNT__")
+	field(FTA, "LONG")
+	field(OUTA, "$(IOC):$(NAME)-SET-CNT")
+	field(FTVA, "FLOAT")
+	field(SNAM, "readFloat")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT")
+}
+
+
+################################################################################
+# Read; Counter limit
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-CNT-LIM")
+{
+	field(DESC, "Read counter limit")
+	field(PREC, "3")
+}
+
+record(aSub, "$(IOC):$(NAME)-GET-CNT-LIM_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-GET-CNT-LIM__")
+	field(FTA, "LONG")
+	field(OUTA, "$(IOC):$(NAME)-GET-CNT-LIM")
+	field(FTVA, "FLOAT")
+	field(SNAM, "readFloat")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-LIM")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-CNT-LIM__")
+{
+	field(DESC, "Read counter limit as long")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readFloat(68,43) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-LIM_")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-CNT-LIM")
+{
+	field(DESC, "Set counter limit")
+	field(PREC, "3")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT-LIM_")
+}
+
+record(aSub, "$(IOC):$(NAME)-SET-CNT-LIM_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-SET-CNT-LIM")
+	field(FTA, "FLOAT")
+	field(OUTA, "$(IOC):$(NAME)-SET-CNT-LIM__")
+	field(FTVA, "LONG")
+	field(SNAM, "writeFloat")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT-LIM__")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-CNT-LIM__")
+{
+	field(DESC, "Set counter limit as INPlong")
+	field(DTYP, "stream")
+	field(OUT, "@devBronkhorst.proto writeFloat(68,43) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-CNT-LIM__")
+}
+
+record(aSub, "$(IOC):$(NAME)-SET-CNT-LIM-INIT_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-SET-CNT-LIM__")
+	field(FTA, "LONG")
+	field(OUTA, "$(IOC):$(NAME)-SET-CNT-LIM")
+	field(FTVA, "FLOAT")
+	field(SNAM, "readFloat")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-SET-CNT-LIM")
+}
+
+################################################################################
+# Read/write PID parameters
+################################################################################
+record(ai, "$(IOC):$(NAME)-GET-P")
+{
+	field(DESC, "Read P")
+	field(PREC, "3")
+}
+
+record(aSub, "$(IOC):$(NAME)-GET-P_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-GET-P__")
+	field(FTA, "LONG")
+	field(OUTA, "$(IOC):$(NAME)-GET-P")
+	field(FTVA, "FLOAT")
+	field(SNAM, "readFloat")
+	field(FLNK, "$(IOC):$(NAME)-GET-P")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-P__")
+{
+	field(DESC, "Read P as long")
+	field(SCAN, "Passive")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readFloat(72,55) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-P_")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-P")
+{
+	field(DESC, "Set P")
+	field(PREC, "3")
+	field(FLNK, "$(IOC):$(NAME)-SET-P_")
+}
+
+record(aSub, "$(IOC):$(NAME)-SET-P_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-SET-P")
+	field(FTA, "FLOAT")
+	field(OUTA, "$(IOC):$(NAME)-SET-P__")
+	field(FTVA, "LONG")
+	field(SNAM, "writeFloat")
+	field(FLNK, "$(IOC):$(NAME)-SET-P__")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-P__")
+{
+	field(DESC, "Set P as INPlong")
+	field(DTYP, "stream")
+	field(OUT, "@devBronkhorst.proto writeFloat(72,55) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-P__")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-I")
+{
+	field(DESC, "Read I")
+	field(PREC, "3")
+}
+
+record(aSub, "$(IOC):$(NAME)-GET-I_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-GET-I__")
+	field(FTA, "LONG")
+	field(OUTA, "$(IOC):$(NAME)-GET-I")
+	field(FTVA, "FLOAT")
+	field(SNAM, "readFloat")
+	field(FLNK, "$(IOC):$(NAME)-GET-I")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-I__")
+{
+	field(DESC, "Read I as long")
+	field(SCAN, "Passive")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readFloat(72,56) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-I_")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-I")
+{
+	field(DESC, "Set I")
+	field(PREC, "3")
+	field(FLNK, "$(IOC):$(NAME)-SET-I_")
+}
+
+record(aSub, "$(IOC):$(NAME)-SET-I_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-SET-I")
+	field(FTA, "FLOAT")
+	field(OUTA, "$(IOC):$(NAME)-SET-I__")
+	field(FTVA, "LONG")
+	field(SNAM, "writeFloat")
+	field(FLNK, "$(IOC):$(NAME)-SET-I__")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-I__")
+{
+	field(DESC, "Set I as INPlong")
+	field(DTYP, "stream")
+	field(OUT, "@devBronkhorst.proto writeFloat(72,56) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-I__")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-D")
+{
+	field(DESC, "Read D")
+	field(PREC, "3")
+}
+
+record(aSub, "$(IOC):$(NAME)-GET-D_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-GET-D__")
+	field(FTA, "LONG")
+	field(OUTA, "$(IOC):$(NAME)-GET-D")
+	field(FTVA, "FLOAT")
+	field(SNAM, "readFloat")
+	field(FLNK, "$(IOC):$(NAME)-GET-D")
+}
+
+record(ai, "$(IOC):$(NAME)-GET-D__")
+{
+	field(DESC, "Read D as long")
+	field(SCAN, "Passive")
+	field(DTYP, "stream")
+	field(INP, "@devBronkhorst.proto readFloat(72,57) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-D_")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-D")
+{
+	field(DESC, "Set D")
+	field(PREC, "3")
+	field(FLNK, "$(IOC):$(NAME)-SET-D_")
+}
+
+record(aSub, "$(IOC):$(NAME)-SET-D_")
+{
+	field(DESC, "Interpret long as float")
+	field(INPA, "$(IOC):$(NAME)-SET-D")
+	field(FTA, "FLOAT")
+	field(OUTA, "$(IOC):$(NAME)-SET-D__")
+	field(FTVA, "LONG")
+	field(SNAM, "writeFloat")
+	field(FLNK, "$(IOC):$(NAME)-SET-D__")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-D__")
+{
+	field(DESC, "Set D as INPlong")
+	field(DTYP, "stream")
+	field(OUT, "@devBronkhorst.proto writeFloat(72,57) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-D__")
+}
+################################################################################
+################################################################################
+#STATUS PARAMETERS
+################################################################################
+################################################################################
+################################################################################
+# Read:Number of error messages. 0 - no error message, 1 - at least 1 error
+# message
+################################################################################
+record(bi, "$(IOC):$(NAME)-ERROR-MSG-NUM")
+{
+	field(DESC, "Number of error mesgs")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B0")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "No error")
+	field(ONAM, "Error")
+	field(FLNK, "$(IOC):$(NAME)-WARNING-MSG-NUM")
+}
+
+################################################################################
+# Read:Number of warning messages. 0 - no warning message, 1 - at least 1 
+# warning message
+################################################################################
+record(bi, "$(IOC):$(NAME)-WARNING-MSG-NUM")
+{
+	field(DESC, "Number of warning msgs")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B1")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "No warning")
+	field(ONAM, "Warning")
+	field(FLNK, "$(IOC):$(NAME)-MIN-ALARM")
+}
+
+################################################################################
+# Read:Number of minimum alarm messages for measured signal. 
+# 0 - no minimum alarm message, 
+# 1 - at least 1 minumum alarm message
+################################################################################
+record(bi, "$(IOC):$(NAME)-MIN-ALARM")
+{
+	field(DESC, "Number of min alarm msgs")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B2")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "No min alarm")
+	field(ONAM, "Min alarm")
+	field(FLNK, "$(IOC):$(NAME)-MAX-ALARM")
+}
+
+################################################################################
+# Read:Number of maximum alarm messages for measured signal. 
+# 0 - no maximum alarm message, 
+# 1 - at least 1 maximum alarm message
+################################################################################
+record(bi, "$(IOC):$(NAME)-MAX-ALARM")
+{
+	field(DESC, "Number of max alar msgs")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B3")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "No max alarm")
+	field(ONAM, "Max alarm")
+	field(FLNK, "$(IOC):$(NAME)-BATCH-CNT-ALARM")
+}
+
+################################################################################
+# Read: 0 - Batch counter has not reached it's limit
+#       1 - Batch counter has reached it's limit
+################################################################################
+record(bi, "$(IOC):$(NAME)-BATCH-CNT-ALARM")
+{
+	field(DESC, "Batch counter alarm")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B4")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "OK")
+	field(ONAM, "Limit")
+	field(FLNK, "$(IOC):$(NAME)-RESPONSE-ALARM")
+}
+
+################################################################################
+# Read: 0 - Response OK (setpoint-measure within limit)
+#       1 - Response alarm message: setpoint-measure is too high
+################################################################################
+record(bi, "$(IOC):$(NAME)-RESPONSE-ALARM")
+{
+	field(DESC, "Response alarm")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B5")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "OK")
+	field(ONAM, "SP to high")
+	field(FLNK, "$(IOC):$(NAME)-MASTER-OUT-ALARM")
+}
+
+################################################################################
+# Read: 0 - Master output signal OK (or unused)
+#       1 - Master output signal not received: check master instrument
+################################################################################
+record(bi, "$(IOC):$(NAME)-MASTER-OUT-ALARM")
+{
+	field(DESC, "Master output alarm")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B6")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "OK")
+	field(ONAM, "Not received")
+	field(FLNK, "$(IOC):$(NAME)-HARDWARE-ALARM")
+}
+
+################################################################################
+# Read: 0 - Hardware OK
+#       1 - Hardware error message: check your hardware
+################################################################################
+record(bi, "$(IOC):$(NAME)-HARDWARE-ALARM")
+{
+	field(DESC, "Response alarm")
+	field(INP, "$(IOC):$(NAME)-GET-ALARM-INFO.B7")
+	field(SCAN, "$(SCAN1)")
+	field(ZNAM, "OK")
+	field(ONAM, "Error")
+}
+
+
+################################################################################
+# Read: Check if communication is OK
+################################################################################
+record(calc, "$(IOC):$(NAME)-COMM-STATUS")
+{
+	field(DESC, "Communication status")
+	field(INPA, "$(IOC):$(NAME)-GET-MEASURE_.STAT")
+	field(CALC, "A>0")
+	field(FLNK, "$(IOC):$(NAME)-ALARM")
+}
+
+################################################################################
+# Read; Sum of communication and device errors. If either device or comm. is in
+# error, value is 1. LED on the main screen uses this to determine if everything
+# is ok.
+################################################################################
+record(calc, "$(IOC):$(NAME)-ALARM")
+{
+	field(DESC, "Communication status")
+	field(INPA, "$(IOC):$(NAME)-COMM-STATUS")
+	field(INPB, "$(IOC):$(NAME)-GET-ALARM-INFO.B0")
+	field(INPC, "$(IOC):$(NAME)-GET-ALARM-INFO.B1")
+	field(INPD, "$(IOC):$(NAME)-GET-ALARM-INFO.B2")
+	field(INPE, "$(IOC):$(NAME)-GET-ALARM-INFO.B3")
+	field(INPF, "$(IOC):$(NAME)-GET-ALARM-INFO.B5")
+	field(INPG, "$(IOC):$(NAME)-GET-ALARM-INFO.B6")
+	field(INPH, "$(IOC):$(NAME)-GET-ALARM-INFO.B7")
+	field(CALC, "(A+B+C+D+E+F+G+H)>0")
+}
+
+################################################################################
+# Lock/unlock secured parameters, e.g. PID parameters
+################################################################################
+
+record(ai, "$(IOC):$(NAME)-GET-INITRESET__")
+{
+	field(DESC, "Get locked/unlocked")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(INP, "@devBronkhorst.proto readChar(00,0A) $(PORT)")
+	field(PINI, "YES")
+	field(FLNK, "$(IOC):$(NAME)-GET-INITRESET_")
+}
+
+record(calcout, "$(IOC):$(NAME)-GET-INITRESET_"){
+	field(CALC, "(A=82)?0:(A=64)?1:2")
+	field(INPA, "$(IOC):$(NAME)-GET-INITRESET__")
+	field(OUT, "$(IOC):$(NAME)-GET-INITRESET")
+	field(FLNK, "$(IOC):$(NAME)-GET-INITRESET")
+}
+
+record(mbbo, "$(IOC):$(NAME)-GET-INITRESET")
+{	
+	field(DESC, "Locked/unlocked")	
+	field(ZRVL, "0")
+	field(ZRST, "Lock")
+	field(ONVL, "1")
+	field(ONST, "Unlock")
+	field(TWVL, "2")
+	field(TWST, "Unknown")
+}
+
+record(mbbo, "$(IOC):$(NAME)-SET-INITRESET")
+{
+	field(DESC, "Lock/unlock")
+	field(ZRVL, "0")
+	field(ZRST, "Lock")
+	field(ONVL, "1")
+	field(ONST, "Unlock")
+	field(OUT, "$(IOC):$(NAME)-SET-INITRESET_")
+	field(FLNK, "$(IOC):$(NAME)-SET-INITRESET_")
+}
+
+record(calcout, "$(IOC):$(NAME)-SET-INITRESET_"){
+	field(CALC, "(A=1)?64:82")
+	field(INPA, "$(IOC):$(NAME)-SET-INITRESET")
+	field(OUT, "$(IOC):$(NAME)-SET-INITRESET__")
+	field(FLNK, "$(IOC):$(NAME)-SET-INITRESET__")
+}
+
+record(ao, "$(IOC):$(NAME)-SET-INITRESET__")
+{
+	field(DESC, "Send Lock/unlock")
+	field(DTYP, "stream")
+	field(SCAN, "$(SCAN1)")
+	field(OUT, "@devBronkhorst.proto writeChar(00,0A) $(PORT)")
+	field(FLNK, "$(IOC):$(NAME)-GET-INITRESET__")
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/Bronkhorst.substitution	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,4 @@
+file "db/Bronkhorst.db"{
+  pattern{IOC,          NAME,    PORT,       SCAN1,   SCAN2}
+         {"trARPES:BHORST", "HEFLOW",  "MOXA_11",  "Passive", "1 second"}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/Keithley6485.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,500 @@
+## Instrument management related PVs
+
+record(bo, "$(P)$(CA)reset")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) RESET")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+    field(FLNK, "$(P)$(CA)refreshFanout1")
+}
+
+record( fanout, "$(P)$(CA)refresh")
+{
+    field(LNK1, "$(P)$(CA)refreshFanout1")
+}
+
+record( fanout, "$(P)$(CA)refreshFanout1")
+{
+    field(LNK1, "$(P)$(CA)rate")
+    field(LNK2, "$(P)$(CA)range")
+    field(LNK3, "$(P)$(CA)rangeAuto")
+    field(LNK4, "$(P)$(CA)rangeAutoUlimit")
+    field(LNK5, "$(P)$(CA)rangeAutoLlimit")
+    field(FLNK, "$(P)$(CA)refreshFanout2")
+}
+
+record( fanout, "$(P)$(CA)refreshFanout2")
+{
+    field(LNK1, "$(P)$(CA)zeroCheck")
+    field(LNK2, "$(P)$(CA)zeroCorrect")
+    field(FLNK, "$(P)$(CA)refreshFanout3")
+}
+
+record( fanout, "$(P)$(CA)refreshFanout3")
+{
+    field(LNK1, "$(P)$(CA)medianFilter")
+    field(LNK2, "$(P)$(CA)medianFilterRank")
+    field(LNK3, "$(P)$(CA)digitalFilter")
+    field(LNK4, "$(P)$(CA)digitalFilterCount")
+    field(LNK5, "$(P)$(CA)digitalFilterControl")
+#    field(FLNK, "$(P)$(CA)refreshFanout4")
+}
+
+record(ai, "$(P)$(CA)read")
+{
+    field(PINI, "YES")
+    field(SCAN, "2 second")
+    field(DTYP, "asynFloat64")
+#    field(DTYP, "asynOctetRead")
+#    field(INP,  "@asyn($(PORT))")
+    field(PREC, "5")
+    field(INP,  "@asyn($(PORT)) READ")
+    field(FLNK, "$(P)$(CA)readValFanout1")
+}
+
+record( fanout, "$(P)$(CA)readValFanout1")
+{
+    field(LNK1, "$(P)$(CA)readStatusOverflow")
+    field(LNK2, "$(P)$(CA)readStatusFilter")
+    field(LNK3, "$(P)$(CA)readStatusMath")
+    field(LNK4, "$(P)$(CA)readStatusNull")
+    field(LNK5, "$(P)$(CA)readStatusLimits")
+    field(FLNK, "$(P)$(CA)readValFanout2")
+}
+record( fanout, "$(P)$(CA)readValFanout2")
+{
+    field(LNK1, "$(P)$(CA)readStatusOvervoltage")
+    field(LNK2, "$(P)$(CA)readStatusZeroCheck")
+    field(LNK3, "$(P)$(CA)readStatusZeroCorrect")
+    field(LNK4, "$(P)$(CA)readStatusRaw")
+    field(LNK5, "$(P)$(CA)readTimestamp")
+}
+
+record(bi, "$(P)$(CA)readStatusOverflow")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_OVERFLOW")
+    field(ZNAM, "No")
+    field(ONAM, "Yes")
+}
+
+record(bi, "$(P)$(CA)readStatusFilter")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_FILTER")
+    field(ZNAM, "Disabled")
+    field(ONAM, "Enabled")
+}
+
+record(bi, "$(P)$(CA)readStatusMath")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_MATH")
+    field(ZNAM, "Disabled")
+    field(ONAM, "Enabled")
+}
+
+record(bi, "$(P)$(CA)readStatusNull")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_NULL")
+    field(ZNAM, "Disabled")
+    field(ONAM, "Enabled")
+}
+
+record(mbbi, "$(P)$(CA)readStatusLimits")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_LIMITS")
+    field(ZRVL, "0")
+    field(ZRST, "Passed")
+    field(ONVL, "1")
+    field(ONST, "Limit 1 Failed")
+    field(TWVL, "2")
+    field(TWST, "Limit 2 Failed")
+    field(THVL, "3")
+    field(THST, "Disabled")
+}
+
+record(bi, "$(P)$(CA)readStatusOvervoltage")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_OVERVOLTAGE")
+    field(ZNAM, "No")
+    field(ONAM, "Yes")
+}
+
+record(bi, "$(P)$(CA)readStatusZeroCheck")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_ZERO_CHECK")
+    field(ZNAM, "Disabled")
+    field(ONAM, "Enabled")
+}
+
+record(bi, "$(P)$(CA)readStatusZeroCorrect")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_ZERO_CORRECT")
+    field(ZNAM, "Disabled")
+    field(ONAM, "Enabled")
+}
+
+record(longin, "$(P)$(CA)readStatusRaw")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) STATUS_RAW")
+}
+
+record(longin, "$(P)$(CA)readTimestamp")
+{
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) TIMESTAMP")
+}
+
+
+
+record(stringin, "$(P)$(CA)model")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynOctetRead")
+    field(INP,  "@asyn($(PORT)) MODEL")
+}
+
+record(stringin, "$(P)$(CA)serial")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynOctetRead")
+    field(INP,  "@asyn($(PORT)) SERIAL")
+}
+
+record(stringin, "$(P)$(CA)digRev")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynOctetRead")
+    field(INP,  "@asyn($(PORT)) DIG_REV")
+}
+
+record(stringin, "$(P)$(CA)dispRev")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynOctetRead")
+    field(INP,  "@asyn($(PORT)) DISP_REV")
+}
+
+record(stringin, "$(P)$(CA)brdRev")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynOctetRead")
+    field(INP,  "@asyn($(PORT)) BRD_REV")
+}
+
+
+record(mbbo, "$(P)$(CA)rateSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) RATE")
+    field(ZRVL, "0")
+    field(ZRST, "Slow")
+    field(ONVL, "1")
+    field(ONST, "Medium")
+    field(TWVL, "2")
+    field(TWST, "Fast")
+    field(FLNK, "$(P)$(CA)rate")
+}
+
+record(mbbi, "$(P)$(CA)rate")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) RATE")
+    field(ZRVL, "0")
+    field(ZRST, "Slow")
+    field(ONVL, "1")
+    field(ONST, "Medium")
+    field(TWVL, "2")
+    field(TWST, "Fast")
+}
+
+
+record(mbbo, "$(P)$(CA)rangeSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) RANGE")
+    field(ZRVL, "0")
+    field(ZRST, "2nA")
+    field(ONVL, "1")
+    field(ONST, "20nA")
+    field(TWVL, "2")
+    field(TWST, "200nA")
+    field(THVL, "3")
+    field(THST, "2uA")
+    field(FRVL, "4")
+    field(FRST, "20uA")
+    field(FVVL, "5")
+    field(FVST, "200uA")
+    field(SXVL, "6")
+    field(SXST, "2mA")
+    field(SVVL, "7")
+    field(SVST, "20mA")
+    field(FLNK, "$(P)$(CA)range")
+}
+
+record(mbbi, "$(P)$(CA)range")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) RANGE")
+    field(ZRVL, "0")
+    field(ZRST, "2nA")
+    field(ONVL, "1")
+    field(ONST, "20nA")
+    field(TWVL, "2")
+    field(TWST, "200nA")
+    field(THVL, "3")
+    field(THST, "2uA")
+    field(FRVL, "4")
+    field(FRST, "20uA")
+    field(FVVL, "5")
+    field(FVST, "200uA")
+    field(SXVL, "6")
+    field(SXST, "2mA")
+    field(SVVL, "7")
+    field(SVST, "20mA")
+}
+
+record(bo, "$(P)$(CA)rangeAutoSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) RANGE_AUTO")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+    field(FLNK, "$(P)$(CA)rangeAuto")
+}
+
+record(bi, "$(P)$(CA)rangeAuto")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) RANGE_AUTO")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+}
+
+record(mbbo, "$(P)$(CA)rangeAutoUlimitSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) RANGE_AUTO_ULIMIT")
+    field(ZRVL, "0")
+    field(ZRST, "2nA")
+    field(ONVL, "1")
+    field(ONST, "20nA")
+    field(TWVL, "2")
+    field(TWST, "200nA")
+    field(THVL, "3")
+    field(THST, "2uA")
+    field(FRVL, "4")
+    field(FRST, "20uA")
+    field(FVVL, "5")
+    field(FVST, "200uA")
+    field(SXVL, "6")
+    field(SXST, "2mA")
+    field(SVVL, "7")
+    field(SVST, "20mA")
+    field(FLNK, "$(P)$(CA)rangeAutoUlimit")
+}
+
+record(mbbi, "$(P)$(CA)rangeAutoUlimit")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) RANGE_AUTO_ULIMIT")
+    field(ZRVL, "0")
+    field(ZRST, "2nA")
+    field(ONVL, "1")
+    field(ONST, "20nA")
+    field(TWVL, "2")
+    field(TWST, "200nA")
+    field(THVL, "3")
+    field(THST, "2uA")
+    field(FRVL, "4")
+    field(FRST, "20uA")
+    field(FVVL, "5")
+    field(FVST, "200uA")
+    field(SXVL, "6")
+    field(SXST, "2mA")
+    field(SVVL, "7")
+    field(SVST, "20mA")
+}
+
+record(mbbo, "$(P)$(CA)rangeAutoLlimitSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) RANGE_AUTO_LLIMIT")
+    field(ZRVL, "0")
+    field(ZRST, "2nA")
+    field(ONVL, "1")
+    field(ONST, "20nA")
+    field(TWVL, "2")
+    field(TWST, "200nA")
+    field(THVL, "3")
+    field(THST, "2uA")
+    field(FRVL, "4")
+    field(FRST, "20uA")
+    field(FVVL, "5")
+    field(FVST, "200uA")
+    field(SXVL, "6")
+    field(SXST, "2mA")
+    field(SVVL, "7")
+    field(SVST, "20mA")
+    field(FLNK, "$(P)$(CA)rangeAutoLlimit")
+}
+
+record(mbbi, "$(P)$(CA)rangeAutoLlimit")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) RANGE_AUTO_LLIMIT")
+    field(ZRVL, "0")
+    field(ZRST, "2nA")
+    field(ONVL, "1")
+    field(ONST, "20nA")
+    field(TWVL, "2")
+    field(TWST, "200nA")
+    field(THVL, "3")
+    field(THST, "2uA")
+    field(FRVL, "4")
+    field(FRST, "20uA")
+    field(FVVL, "5")
+    field(FVST, "200uA")
+    field(SXVL, "6")
+    field(SXST, "2mA")
+    field(SVVL, "7")
+    field(SVST, "20mA")
+}
+
+
+record(bo, "$(P)$(CA)zeroCheckSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) ZERO_CHECK")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+    field(FLNK, "$(P)$(CA)zeroCheck")
+}
+
+record(bi, "$(P)$(CA)zeroCheck")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) ZERO_CHECK")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+}
+
+record(bo, "$(P)$(CA)zeroCorrectSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) ZERO_CORRECT")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+    field(FLNK, "$(P)$(CA)zeroCorrect")
+}
+
+record(bi, "$(P)$(CA)zeroCorrect")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) ZERO_CORRECT")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+}
+
+record(bo, "$(P)$(CA)zeroCorrectAcquire")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) ZERO_CORRECT_ACQUIRE")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+}
+
+
+record(bo, "$(P)$(CA)medianFilterSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) MEDIAN_FILTER")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+    field(FLNK, "$(P)$(CA)medianFilter")
+}
+record(bi, "$(P)$(CA)medianFilter")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) MEDIAN_FILTER")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+}
+
+record(longout, "$(P)$(CA)medianFilterRankSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) MEDIAN_FILTER_RANK")
+    field(FLNK, "$(P)$(CA)medianFilterRank")
+}
+record(longin, "$(P)$(CA)medianFilterRank")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) MEDIAN_FILTER_RANK")
+}
+
+
+record(bo, "$(P)$(CA)digitalFilterSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) DIGITAL_FILTER")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+    field(FLNK, "$(P)$(CA)digitalFilter")
+}
+record(bi, "$(P)$(CA)digitalFilter")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) DIGITAL_FILTER")
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+}
+
+record(longout, "$(P)$(CA)digitalFilterCountSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) DIGITAL_FILTER_COUNT")
+    field(FLNK, "$(P)$(CA)digitalFilterCount")
+}
+record(longin, "$(P)$(CA)digitalFilterCount")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) DIGITAL_FILTER_COUNT")
+}
+
+record(bo, "$(P)$(CA)digitalFilterControlSet")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT)) DIGITAL_FILTER_CONTROL")
+    field(ZNAM, "Moving")
+    field(ONAM, "Repeat")
+    field(FLNK, "$(P)$(CA)digitalFilterControl")
+}
+record(bi, "$(P)$(CA)digitalFilterControl")
+{
+    field(PINI, "YES")
+    field(DTYP, "asynInt32")
+    field(INP,  "@asyn($(PORT)) DIGITAL_FILTER_CONTROL")
+    field(ZNAM, "Moving")
+    field(ONAM, "Repeat")
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/LakeShore331.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,1016 @@
+record(asyn,"$(P)LS336:$(Q):serial") {
+	field(PORT,"$(PORT)")
+}
+
+record(sseq,"$(P)LS336:$(Q):init") {
+	field(SCAN, "1 second")
+	field(LNK1,"$(P)LS336:$(Q):readAll.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):init.SCAN NPP NMS")
+	field(STR2,"Passive")
+	}
+
+record(sseq,"$(P)LS336:$(Q):read") {
+	field(LNK1,"$(P)LS336:$(Q):INA.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):IN2.PROC  CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):IN3.PROC  CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):IN4.PROC  CA NMS")
+	field(LNK5,"$(P)LS336:$(Q):HTR1.PROC  CA NMS")
+	field(LNK6,"$(P)LS336:$(Q):HTR2.PROC  CA NMS")
+	field(LNK7,"$(P)LS336:$(Q):AOUT3.PROC  CA NMS")
+	field(LNK8,"$(P)LS336:$(Q):AOUT4.PROC  CA NMS")
+	field(LNK9,"$(P)LS336:$(Q):ModeRI_RBV.PROC  CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+        field(WAIT5,"Wait")
+        field(WAIT6,"Wait")
+        field(WAIT7,"Wait")
+        field(WAIT8,"Wait")
+		field(WAIT9,"Wait")
+}
+
+record(sseq,"$(P)LS336:$(Q):readAll") {
+        field(DLY1,"1")
+	field(LNK1,"$(P)LS336:$(Q):readAllMode.PROC CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):readAllSetup.PROC CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):readAllPID.PROC CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):readAllSP.PROC CA NMS")
+	field(LNK5,"$(P)LS336:$(Q):readAllRange.PROC CA NMS")
+	field(LNK6,"$(P)LS336:$(Q):read.PROC CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+        field(WAIT5,"Wait")
+        field(WAIT6,"Wait")
+}
+
+record(sseq,"$(P)LS336:$(Q):readAllPID") {
+	field(LNK1,"$(P)LS336:$(Q):getPID1.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):getPID2.PROC  CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):getRamp1.PROC  CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):getRamp2.PROC  CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+}
+
+record(sseq,"$(P)LS336:$(Q):readAllMode") {
+	field(LNK1,"$(P)LS336:$(Q):getOutModeA.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):getOutMode2.PROC  CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):getOutMode3.PROC  CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):getOutMode4.PROC  CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+}
+
+record(sseq,"$(P)LS336:$(Q):readAllRange") {
+	field(LNK1,"$(P)LS336:$(Q):HTR1:Range_RBV.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):HTR2:Range_RBV.PROC  CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):AOUT3:Range_RBV.PROC  CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):AOUT4:Range_RBV.PROC  CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+}
+
+record(sseq,"$(P)LS336:$(Q):readAllSetup") {
+	field(LNK1,"$(P)LS336:$(Q):INA:getType.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):IN2:getType.PROC  CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):IN3:getType.PROC  CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):IN4:getType.PROC  CA NMS")
+	field(LNK5,"$(P)LS336:$(Q):INA:Name_RBV.PROC  CA NMS")
+	field(LNK6,"$(P)LS336:$(Q):IN2:Name_RBV.PROC  CA NMS")
+	field(LNK7,"$(P)LS336:$(Q):IN3:Name_RBV.PROC  CA NMS")
+	field(LNK8,"$(P)LS336:$(Q):IN4:Name_RBV.PROC  CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+        field(WAIT5,"Wait")
+        field(WAIT6,"Wait")
+        field(WAIT7,"Wait")
+        field(WAIT8,"Wait")
+}
+
+record(sseq,"$(P)LS336:$(Q):readAllSP") {
+	field(LNK1,"$(P)LS336:$(Q):OUTA:SP_RBV.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):OUT2:SP_RBV.PROC  CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):OUT3:SP_RBV.PROC  CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):OUT4:SP_RBV.PROC  CA NMS")
+	field(LNK5,"$(P)LS336:$(Q):OUTA:MOUT_RBV.PROC  CA NMS")
+	field(LNK6,"$(P)LS336:$(Q):OUT2:MOUT_RBV.PROC  CA NMS")
+	field(LNK7,"$(P)LS336:$(Q):OUT3:MOUT_RBV.PROC  CA NMS")
+	field(LNK8,"$(P)LS336:$(Q):OUT4:MOUT_RBV.PROC  CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+        field(WAIT5,"Wait")
+        field(WAIT6,"Wait")
+        field(WAIT7,"Wait")
+        field(WAIT8,"Wait")
+}
+
+record(sseq,"$(P)LS336:$(Q):readAllSelect") {
+	field(LNK1,"$(P)LS336:$(Q):OUTA:Select.PROC  CA NMS")
+	field(LNK2,"$(P)LS336:$(Q):OUT2:Select.PROC  CA NMS")
+	field(LNK3,"$(P)LS336:$(Q):OUT3:Select.PROC  CA NMS")
+	field(LNK4,"$(P)LS336:$(Q):OUT4:Select.PROC  CA NMS")
+        field(WAIT1,"Wait")
+        field(WAIT2,"Wait")
+        field(WAIT3,"Wait")
+        field(WAIT4,"Wait")
+}
+
+
+record(mbbo,"$(P)LS336:$(Q):OUTA:Cntrl") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+  	field(FLNK,"$(P)LS336:$(Q):setOutModeA.VAL PP MS")
+}
+record(mbbo,"$(P)LS336:$(Q):OUT2:Cntrl") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+  	field(FLNK,"$(P)LS336:$(Q):setOutMode2.VAL PP MS")
+}
+
+record(mbbo,"$(P)LS336:$(Q):OUT3:Cntrl") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+  	field(FLNK,"$(P)LS336:$(Q):setOutMode3.VAL PP MS")
+}
+record(mbbo,"$(P)LS336:$(Q):OUT4:Cntrl") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+  	field(FLNK,"$(P)LS336:$(Q):setOutMode4.VAL PP MS")
+}
+
+record(mbbo,"$(P)LS336:$(Q):OUTA:Mode") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"Off")
+	field(ONST,"Closed Loop")
+	field(TWST,"Zone")
+	field(THST,"Open Loop")
+  	field(FLNK,"$(P)LS336:$(Q):setOutModeA.VAL PP MS")
+}
+
+record(mbbo,"$(P)LS336:$(Q):OUT2:Mode") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"Off")
+	field(ONST,"Closed Loop")
+	field(TWST,"Zone")
+	field(THST,"Open Loop")
+  	field(FLNK,"$(P)LS336:$(Q):setOutMode2.VAL PP MS")
+}
+
+record(mbbo,"$(P)LS336:$(Q):OUT3:Mode") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"3")
+	field(TWVL,"4")
+	field(THVL,"5")
+	field(ZRST,"Off")
+	field(ONST,"Open Loop")
+	field(TWST,"Monitor Out")
+	field(THST,"Warmup Supply")
+  	field(FLNK,"$(P)LS336:$(Q):setOutMode3.VAL PP MS")
+}
+
+record(mbbo,"$(P)LS336:$(Q):OUT4:Mode") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"3")
+	field(TWVL,"4")
+	field(THVL,"5")
+	field(ZRST,"Off")
+	field(ONST,"Open Loop")
+	field(TWST,"Monitor Out")
+	field(THST,"Warmup Supply")
+  	field(FLNK,"$(P)LS336:$(Q):setOutMode4.VAL PP MS")
+}
+
+
+record(mbbi,"$(P)LS336:$(Q):OUTA:Cntrl_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+}
+record(mbbi,"$(P)LS336:$(Q):OUT2:Cntrl_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+}
+
+record(mbbi,"$(P)LS336:$(Q):OUT3:Cntrl_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+}
+record(mbbi,"$(P)LS336:$(Q):OUT4:Cntrl_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"-")
+	field(ONST,"A")
+	field(TWST,"B")
+	field(THST,"C")
+	field(FRST,"D")
+}
+
+record(mbbi,"$(P)LS336:$(Q):OUTA:Mode_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"Off")
+	field(ONST,"Closed Loop")
+	field(TWST,"Zone")
+	field(THST,"Open Loop")
+}
+
+record(mbbi,"$(P)LS336:$(Q):OUT2:Mode_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"Off")
+	field(ONST,"Closed Loop")
+	field(TWST,"Zone")
+	field(THST,"Open Loop")
+}
+
+record(mbbi,"$(P)LS336:$(Q):OUT3:Mode_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRST,"Off")
+	field(THST,"Open Loop")
+	field(FRST,"Monitor Out")
+	field(FVST,"Warmup Supply")
+}
+
+record(mbbi,"$(P)LS336:$(Q):OUT4:Mode_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZRST,"Off")
+	field(THST,"Open Loop")
+	field(FRST,"Monitor Out")
+	field(FVST,"Warmup Supply")
+}
+
+record(stringin,"$(P)LS336:$(Q):INA:getType") {
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInType(A,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record(mbbi,"$(P)LS336:$(Q):INA:Sensor_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"Disabled")
+	field(ONST,"Diode")
+	field(TWST,"Platium RTD")
+	field(THST,"NTC RTD")
+	field(FRST,"Thermocouple")
+}
+
+record(bi,"$(P)LS336:$(Q):INA:AutoRange_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(ai,"$(P)LS336:$(Q):INA:Range_RBV") {
+}
+
+record(bi,"$(P)LS336:$(Q):INA:Comp_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(mbbi,"$(P)LS336:$(Q):INA:Units_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"UNDF")
+	field(ONST,"K")
+	field(TWST,"C")
+	field(THST,"S")
+}
+
+record(mbbo,"$(P)LS336:$(Q):INA:Units") {
+        field(DTYP, "stream")
+        field(OUT, "@LakeShore331.proto setInType(A,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+	field(ZRVL,"1")
+	field(ONVL,"2")
+	field(TWVL,"3")
+	field(ZRST,"K")
+	field(ONST,"C")
+	field(TWST,"S")
+        field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record(stringin,"$(P)LS336:$(Q):IN2:getType") {
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInType(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record(mbbi,"$(P)LS336:$(Q):IN2:Sensor_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"Disabled")
+	field(ONST,"Diode")
+	field(TWST,"Platium RTD")
+	field(THST,"NTC RTD")
+	field(FRST,"Thermocouple")
+}
+
+record(bi,"$(P)LS336:$(Q):IN2:AutoRange_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(ai,"$(P)LS336:$(Q):IN2:Range_RBV") {
+}
+
+record(bi,"$(P)LS336:$(Q):IN2:Comp_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(mbbi,"$(P)LS336:$(Q):IN2:Units_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"UNDF")
+	field(ONST,"K")
+	field(TWST,"C")
+	field(THST,"S")
+}
+
+record(mbbo,"$(P)LS336:$(Q):IN2:Units") {
+        field(DTYP, "stream")
+        field(OUT, "@LakeShore331.proto setInType(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+	field(ZRVL,"1")
+	field(ONVL,"2")
+	field(TWVL,"3")
+	field(ZRST,"K")
+	field(ONST,"C")
+	field(TWST,"S")
+        field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+
+record(stringin,"$(P)LS336:$(Q):IN3:getType") {
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInType(3,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record(mbbi,"$(P)LS336:$(Q):IN3:Sensor_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"Disabled")
+	field(ONST,"Diode")
+	field(TWST,"Platium RTD")
+	field(THST,"NTC RTD")
+	field(FRST,"Thermocouple")
+}
+
+record(bi,"$(P)LS336:$(Q):IN3:AutoRange_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(ai,"$(P)LS336:$(Q):IN3:Range_RBV") {
+}
+
+record(bi,"$(P)LS336:$(Q):IN3:Comp_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(mbbi,"$(P)LS336:$(Q):IN3:Units_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"UNDF")
+	field(ONST,"K")
+	field(TWST,"C")
+	field(THST,"S")
+}
+
+record(mbbo,"$(P)LS336:$(Q):IN3:Units") {
+        field(DTYP, "stream")
+        field(OUT, "@LakeShore331.proto setInType(3,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+	field(ZRVL,"1")
+	field(ONVL,"2")
+	field(TWVL,"3")
+	field(ZRST,"K")
+	field(ONST,"C")
+	field(TWST,"S")
+        field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record(stringin,"$(P)LS336:$(Q):IN4:getType") {
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInType(4,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record(mbbi,"$(P)LS336:$(Q):IN4:Sensor_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(FRVL,"4")
+	field(ZRST,"Disabled")
+	field(ONST,"Diode")
+	field(TWST,"Platium RTD")
+	field(THST,"NTC RTD")
+	field(FRST,"Thermocouple")
+}
+
+record(bi,"$(P)LS336:$(Q):IN4:AutoRange_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(ai,"$(P)LS336:$(Q):IN4:Range_RBV") {
+}
+
+record(bi,"$(P)LS336:$(Q):IN4:Comp_RBV") {
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(mbbi,"$(P)LS336:$(Q):IN4:Units_RBV") {
+	field(ZRVL,"0")
+	field(ONVL,"1")
+	field(TWVL,"2")
+	field(THVL,"3")
+	field(ZRST,"UNDF")
+	field(ONST,"K")
+	field(TWST,"C")
+	field(THST,"S")
+}
+
+record(mbbo,"$(P)LS336:$(Q):IN4:Units") {
+        field(DTYP, "stream")
+        field(OUT, "@LakeShore331.proto setInType(4,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+	field(ZRVL,"1")
+	field(ONVL,"2")
+	field(TWVL,"3")
+	field(ZRST,"K")
+	field(ONST,"C")
+	field(TWST,"S")
+        field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record (stringin, "$(P)LS336:$(Q):INA:Name_RBV") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getInName(A,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record (stringin, "$(P)LS336:$(Q):IN2:Name_RBV") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getInName(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record (stringin, "$(P)LS336:$(Q):IN3:Name_RBV") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getInName(3,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record (stringin, "$(P)LS336:$(Q):IN4:Name_RBV") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getInName(4,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record(ai,"$(P)LS336:$(Q):INA") {
+	field(PREC, 4)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInput(A,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record(ai,"$(P)LS336:$(Q):IN2") {
+	field(PREC, 4)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInput(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record(ai,"$(P)LS336:$(Q):IN3") {
+	field(PREC, 4)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInput(3,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record(ai,"$(P)LS336:$(Q):IN4") {
+	field(PREC, 4)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getInput(4,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record(ai,"$(P)LS336:$(Q):HTR1") {
+	field(PREC, 1)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getHeater(1) $(PORT) $(ADDR)")
+}
+record(ai,"$(P)LS336:$(Q):HTR2") {
+	field(PREC, 1)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getHeater(2) $(PORT) $(ADDR)")
+}
+
+record(ai,"$(P)LS336:$(Q):AOUT3") {
+	field(PREC, 1)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getAOutput(3) $(PORT) $(ADDR)")
+}
+record(ai,"$(P)LS336:$(Q):AOUT4") {
+	field(PREC, 1)
+        field(DTYP, "stream")
+        field(INP, "@LakeShore331.proto getAOutput(4) $(PORT) $(ADDR)")
+}
+
+
+
+record(ai,"$(P)LS336:$(Q):P1_RBV") {
+	field(PREC,"1")
+}
+record(ai,"$(P)LS336:$(Q):P2_RBV") {
+	field(PREC,"1")
+}
+
+record(ai,"$(P)LS336:$(Q):I1_RBV") {
+	field(PREC,"1")
+}
+record(ai,"$(P)LS336:$(Q):I2_RBV") {
+	field(PREC,"1")
+}
+record(ai,"$(P)LS336:$(Q):D1_RBV") {
+	field(PREC,"0")
+}
+record(ai,"$(P)LS336:$(Q):D2_RBV") {
+	field(PREC,"0")
+}
+
+record(ao,"$(P)LS336:$(Q):P1") {
+	field(PREC,"1")
+        field(DRVL, "0.0")
+        field(DRVH, "1000.0")
+	field(FLNK, "$(P)LS336:$(Q):setPID1.VAL PP MS")
+}
+record(ao,"$(P)LS336:$(Q):P2") {
+	field(PREC,"1")
+        field(DRVL, "0.0")
+        field(DRVH, "1000.0")
+	field(FLNK, "$(P)LS336:$(Q):setPID2.VAL PP MS")
+}
+
+record(ao,"$(P)LS336:$(Q):I1") {
+	field(PREC,"1")
+        field(DRVL, "0.0")
+        field(DRVH, "1000.0")
+	field(FLNK, "$(P)LS336:$(Q):setPID1.VAL PP MS")
+}
+record(ao,"$(P)LS336:$(Q):I2") {
+	field(PREC,"1")
+        field(DRVL, "0.0")
+        field(DRVH, "1000.0")
+	field(FLNK, "$(P)LS336:$(Q):setPID2.VAL PP MS")
+}
+
+record(ao,"$(P)LS336:$(Q):D1") {
+	field(PREC,"0")
+        field(DRVL, "0")
+        field(DRVH, "200")
+	field (FLNK, "$(P)LS336:$(Q):setPID1.VAL PP MS")
+}
+record(ao,"$(P)LS336:$(Q):D2") {
+	field(PREC,"0")
+        field(DRVL, "0")
+        field(DRVH, "200")
+	field (FLNK, "$(P)LS336:$(Q):setPID2.VAL PP MS")
+}
+
+
+record(ai,"$(P)LS336:$(Q):RampR1_RBV") {
+	field(PREC,"1")
+}
+record(ai,"$(P)LS336:$(Q):RampR2_RBV") {
+	field(PREC,"1")
+}
+
+record(bi,"$(P)LS336:$(Q):OnRamp1_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(bi,"$(P)LS336:$(Q):OnRamp2_RBV") {
+	field(DTYP,"Soft Channel")
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+}
+
+record(bo,"$(P)LS336:$(Q):OnRamp1") {
+	field(DTYP,"Soft Channel")
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+  	field(FLNK,"$(P)LS336:$(Q):setRamp1.VAL PP MS")
+}
+
+record(bo,"$(P)LS336:$(Q):OnRamp2") {
+	field(DTYP,"Soft Channel")
+	field(ZNAM,"OFF")
+	field(ONAM,"ON")
+  	field(FLNK,"$(P)LS336:$(Q):setRamp2.VAL PP MS")
+}
+
+record(ao,"$(P)LS336:$(Q):RampR1") {
+	field(PREC,"1")
+        field (DRVL, "0.0")
+        field (DRVH, "100.0")
+  	field(FLNK,"$(P)LS336:$(Q):setRamp1.VAL PP MS")
+}
+record(ao,"$(P)LS336:$(Q):RampR2") {
+	field(PREC,"1")
+        field (DRVL, "0.0")
+        field (DRVH, "100.0")
+  	field(FLNK,"$(P)LS336:$(Q):setRamp2.VAL PP MS")
+}
+
+
+record (stringin, "$(P)LS336:$(Q):ID") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getID($(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record (ai, "$(P)LS336:$(Q):OUTA:SP_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (INP, "@LakeShore331.proto getSETP(A) $(PORT) $(ADDR)")
+}
+record (ai, "$(P)LS336:$(Q):OUT2:SP_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (INP, "@LakeShore331.proto getSETP(2) $(PORT) $(ADDR)")
+}
+record (ai, "$(P)LS336:$(Q):OUT3:SP_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (INP, "@LakeShore331.proto getSETP(3) $(PORT) $(ADDR)")
+}
+record (ai, "$(P)LS336:$(Q):OUT4:SP_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (INP, "@LakeShore331.proto getSETP(4) $(PORT) $(ADDR)")
+}
+
+record (ao, "$(P)LS336:$(Q):OUTA:SP") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (OUT, "@LakeShore331.proto setSETP(A) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):OUTA:SP_RBV.VAL  PP MS")
+}
+record (ao, "$(P)LS336:$(Q):OUT2:SP") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (OUT, "@LakeShore331.proto setSETP(2) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):OUT2:SP_RBV.VAL  PP MS")
+}
+record (ao, "$(P)LS336:$(Q):OUT3:SP") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (OUT, "@LakeShore331.proto setSETP(3) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):OUT3:SP_RBV.VAL  PP MS")
+}
+record (ao, "$(P)LS336:$(Q):OUT4:SP") {
+  field (DTYP, "stream")
+  field (PREC, "4")
+  field (OUT, "@LakeShore331.proto setSETP(4) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):OUT4:SP_RBV.VAL  PP MS")
+}
+
+record (ai, "$(P)LS336:$(Q):OUTA:MOUT_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (INP, "@LakeShore331.proto getMOUT(A) $(PORT) $(ADDR)")
+}
+record (ai, "$(P)LS336:$(Q):OUT2:MOUT_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (INP, "@LakeShore331.proto getMOUT(2) $(PORT) $(ADDR)")
+}
+record (ai, "$(P)LS336:$(Q):OUT3:MOUT_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (INP, "@LakeShore331.proto getMOUT(3) $(PORT) $(ADDR)")
+}
+record (ai, "$(P)LS336:$(Q):OUT4:MOUT_RBV") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (INP, "@LakeShore331.proto getMOUT(4) $(PORT) $(ADDR)")
+}
+
+record (ao, "$(P)LS336:$(Q):OUTA:MOUT") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (OUT, "@LakeShore331.proto setMOUT(A) $(PORT) $(ADDR)")
+  field (DRVL, "0.0")
+  field (DRVH, "100.0")
+  field (FLNK,"$(P)LS336:$(Q):OUTA:MOUT_RBV.VAL  PP MS")
+}
+record (ao, "$(P)LS336:$(Q):OUT2:MOUT") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (OUT, "@LakeShore331.proto setMOUT(2) $(PORT) $(ADDR)")
+  field (DRVL, "0.0")
+  field (DRVH, "100.0")
+  field (FLNK,"$(P)LS336:$(Q):OUT2:MOUT_RBV.VAL  PP MS")
+}
+record (ao, "$(P)LS336:$(Q):OUT3:MOUT") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (OUT, "@LakeShore331.proto setMOUT(3) $(PORT) $(ADDR)")
+  field (DRVL, "0.0")
+  field (DRVH, "100.0")
+  field (FLNK,"$(P)LS336:$(Q):OUT3:MOUT_RBV.VAL  PP MS")
+}
+record (ao, "$(P)LS336:$(Q):OUT4:MOUT") {
+  field (DTYP, "stream")
+  field (PREC, "2")
+  field (DRVL, "0.0")
+  field (DRVH, "100.0")
+  field (OUT, "@LakeShore331.proto setMOUT(4) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):OUT4:MOUT_RBV.VAL  PP MS")
+}
+
+
+record(mbbi,"$(P)LS336:$(Q):HTR1:Range_RBV") {
+  field(DTYP, "stream")
+  field(INP, "@LakeShore331.proto getRange(1) $(PORT) $(ADDR)")
+  field(ZRST,"OFF")
+  field(ONST,"LOW")
+  field(TWST,"MEDIUM")
+  field(THST,"HIGH")
+}
+
+record(mbbo,"$(P)LS336:$(Q):HTR1:Range") {
+  field(DTYP, "stream")
+  field(OUT, "@LakeShore331.proto setRange(1) $(PORT) $(ADDR)")
+  field(ZRVL,"0")
+  field(ONVL,"1")
+  field(TWVL,"2")
+  field(THVL,"3")
+  field(ZRST,"OFF")
+  field(ONST,"LOW")
+  field(TWST,"MEDIUM")
+  field(THST,"HIGH")
+  field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+
+record(mbbi,"$(P)LS336:$(Q):HTR2:Range_RBV") {
+  field(DTYP, "stream")
+  field(INP, "@LakeShore331.proto getRange(2) $(PORT) $(ADDR)")
+  field(ZRST,"OFF")
+  field(ONST,"LOW")
+  field(TWST,"MEDIUM")
+  field(THST,"HIGH")
+}
+
+record(mbbo,"$(P)LS336:$(Q):HTR2:Range") {
+  field(DTYP, "stream")
+  field(OUT, "@LakeShore331.proto setRange(2) $(PORT) $(ADDR)")
+  field(ZRVL,"0")
+  field(ONVL,"1")
+  field(TWVL,"2")
+  field(THVL,"3")
+  field(ZRST,"OFF")
+  field(ONST,"LOW")
+  field(TWST,"MEDIUM")
+  field(THST,"HIGH")
+  field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+
+record(mbbi,"$(P)LS336:$(Q):AOUT3:Range_RBV") {
+  field(DTYP, "stream")
+  field(INP, "@LakeShore331.proto getRange(3) $(PORT) $(ADDR)")
+  field(ZRST,"OFF")
+  field(ONST,"ON")
+}
+
+record(mbbo,"$(P)LS336:$(Q):AOUT3:Range") {
+  field(DTYP, "stream")
+  field(OUT, "@LakeShore331.proto setRange(3) $(PORT) $(ADDR)")
+  field(ZRVL,"0")
+  field(ONVL,"1")
+  field(ZRST,"OFF")
+  field(ONST,"ON")
+  field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record(mbbi,"$(P)LS336:$(Q):AOUT4:Range_RBV") {
+  field(DTYP, "stream")
+  field(INP, "@LakeShore331.proto getRange(4) $(PORT) $(ADDR)")
+  field(ZRST,"OFF")
+  field(ONST,"ON")
+}
+
+record(mbbo,"$(P)LS336:$(Q):AOUT4:Range") {
+  field(DTYP, "stream")
+  field(OUT, "@LakeShore331.proto setRange(4) $(PORT) $(ADDR)")
+  field(ZRVL,"0")
+  field(ONVL,"1")
+  field(ZRST,"OFF")
+  field(ONST,"ON")
+  field(FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record (stringin, "$(P)LS336:$(Q):getPID1") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getPID(1,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record (stringin, "$(P)LS336:$(Q):getPID2") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getPID(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+
+record (stringin, "$(P)LS336:$(Q):setPID1") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setPID(1,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK, "$(P)LS336:$(Q):getPID1.VAL PP MS")
+}
+
+record (stringin, "$(P)LS336:$(Q):setPID2") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setPID(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK, "$(P)LS336:$(Q):getPID2.VAL PP MS")
+}
+
+
+record (stringin, "$(P)LS336:$(Q):getRamp1") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getRamp(1,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record (stringin, "$(P)LS336:$(Q):getRamp2") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getRamp(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record (stringin, "$(P)LS336:$(Q):setRamp1") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setRamp(1,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK, "$(P)LS336:$(Q):getRamp1.VAL PP MS")
+}
+
+record (stringin, "$(P)LS336:$(Q):setRamp2") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setRamp(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK, "$(P)LS336:$(Q):getRamp2.VAL PP MS")
+}
+
+record (stringin, "$(P)LS336:$(Q):setOutModeA") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setOUTMODE(A,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record (stringin, "$(P)LS336:$(Q):setOutMode2") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setOUTMODE(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record (stringin, "$(P)LS336:$(Q):setOutMode3") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setOUTMODE(3,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record (stringin, "$(P)LS336:$(Q):setOutMode4") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto setOUTMODE(4,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+  field (FLNK,"$(P)LS336:$(Q):readAll")
+}
+
+record (stringin, "$(P)LS336:$(Q):getOutModeA") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getOUTMODE(A,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record (stringin, "$(P)LS336:$(Q):getOutMode2") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getOUTMODE(2,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record (stringin, "$(P)LS336:$(Q):getOutMode3") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getOUTMODE(3,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+record (stringin, "$(P)LS336:$(Q):getOutMode4") {
+  field (DTYP, "stream")
+  field (INP, "@LakeShore331.proto getOUTMODE(4,$(P)LS336:$(Q)) $(PORT) $(ADDR)")
+}
+
+record(mbbi,"$(P)LS336:$(Q):ModeRI_RBV") {
+  field(DTYP, "stream")
+  field(INP, "@LakeShore331.proto getMODE $(PORT) $(ADDR)")
+  field(ZRST,"Local")
+  field(ONST,"Remote")
+  field(TWST,"Rem/Lockout")
+}
+
+record(mbbo,"$(P)LS336:$(Q):ModeRI") {
+  field(DTYP, "stream")
+  field(OUT, "@LakeShore331.proto setMODE $(PORT) $(ADDR)")
+  field(ZRVL,"0")
+  field(ONVL,"1")
+  field(TWVL,"2")
+  field(ZRST,"Local")
+  field(ONST,"Remote")
+  field(TWST,"Rem/Lockout")
+  field(FLNK,"$(P)LS336:$(Q):ModeRI_RBV")
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/LakeShore331.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,154 @@
+# LakeShore 336 Series Streams Protocol File 
+#
+#####
+# Interface: ASCII (INET or GPIB)
+# Four Sensor Inputs/Outputs
+# Two PID Loops
+# Two Heater Outputs
+#
+# Commands:
+#       *IDN? 				- ID Query
+#          return: <string>
+#       INTYPE? <input>			- Input Type Parameter Query
+#          return: n,n,n,n,n <sensorType>,<autorange>,<range>,<compensation>,<units>
+#       HTR? <output>  			- Heater Output Query
+#          return: +nnn.n
+#       HTRSET? <output>		- Heater Setup Query
+#          return: n,n,+n.nnn,n <htrResistance>,<maxCurrent>,<maxUserCurrent>,<current/power>
+#       HTRST? <output>			- Heater Status Query
+#          return: n<error code>
+#       <C/K/S>RDG? <input>		- Celcius/Kevin/Sensor Input Reading Query
+#          return: +nnn.n		
+#       RDGST? <input>			- Input Reading Status Query
+#          return: n <status byte> 		
+#       SETP <output>,<value> 		- Control Setpoint Command
+#       SETP? <value>	  		- Control Setpoint Query
+#          return: +nnn.nnn
+#       RANGE <output>,<range> 		- Heater Range Command
+#       RANGE? <value>  		- Heater Range Query
+#          return: <0=Off, 1=Low(On), 2=Medium, 3=High
+#       PID <output>,<P>,<I>,<D>        - Control Loop Parameters Command
+#       PID? <output> 			- Control Loop Query
+#	    return: <nnn.n>,<nnn.n>,<nnn.n>
+#       RAMP <output>,<off(0)/on(1)>,<rate> - Control Setpoint Ramp Cmd
+#       RAMP? <output> 			    - Control Setpoint Ramp Query
+#	    return: <off(0)/on(1)>,<rate>
+#    
+
+ExtraInput = Ignore;
+ReplyTimeout = 100;
+OutTerminator = LF;
+InTerminator = CR LF;
+
+getID { 
+	out "*IDN?";
+        in "%s";
+	@init {out "*IDN?"; in "%s";}
+	}
+
+setSETP {
+	out "SETP \$1,%f";
+        wait 100;
+	}
+
+getSETP {
+	out "SETP? \$1";
+	in "%f";
+	@init {out "SETP? \$1"; in "%f";}
+	}
+
+
+setMOUT {
+	out "MOUT \$1,%f";
+        wait 100;
+	}
+
+getMOUT {
+	out "MOUT? \$1";
+	in "%f";
+	@init {out "MOUT? \$1"; in "%f";}
+	}
+
+
+setOUTMODE {
+	out "OUTMODE \$1,%(\$2:OUT\$1:Mode.RVAL)d,%(\$2:OUT\$1:Cntrl.VAL)d,0";
+        wait 100;
+	}
+
+
+getOUTMODE {
+	out "OUTMODE? \$1";
+        in "%(\$2:OUT\$1:Mode_RBV.VAL)d,%(\$2:OUT\$1:Cntrl_RBV.VAL)d,%*d";
+	}
+
+setMODE {
+	out "MODE %d";
+        wait 100;
+	}
+
+getMODE {
+	out "MODE?";
+        in "%d";
+	}
+
+setPID {
+	out "PID \$1,%(\$2:P\$1.VAL)f,%(\$2:I\$1.VAL)f,%(\$2:D\$1.VAL)f";
+        wait 100;
+	}
+
+getPID {
+        out "PID? \$1";
+        in "%(\$2:P\$1_RBV.VAL)f,%(\$2:I\$1_RBV.VAL)f,%(\$2:D\$1_RBV.VAL)f";
+	}
+
+setInType {
+        out "INTYPE %(\$2:OUT\$1:Cntrl_RBV.VAL)s,%(\$2:IN\$1:Sensor_RBV.VAL)d,%(\$2:IN\$1:AutoRange_RBV.VAL)d,%(\$2:IN\$1:Range_RBV.VAL)d,%(\$2:IN\$1:Comp_RBV.VAL)d,%(\$2:IN\$1:Units.RVAL)d";
+	}
+
+getInType {
+        out "INTYPE? %(\$2:OUT\$1:Cntrl_RBV.VAL)s";
+        in "%(\$2:IN\$1:Sensor_RBV.VAL)d,%(\$2:IN\$1:Comp_RBV.VAL)d";
+	}
+
+getInput {
+        out "%(\$2:IN\$1:Units_RBV.VAL)s","RDG? ","%(\$2:OUT\$1:Cntrl_RBV.VAL)s";
+        in "%f";
+	}
+
+getInName {
+        out "INNAME? %(\$2:OUT\$1:Cntrl_RBV.VAL)s";
+        in "%[_a-zA-Z0-9 -]";
+	}
+
+getHeater {
+        out "HTR? \$1";
+        in "%f";
+	}
+
+getRange {
+        out "RANGE? \$1";
+        in "%d";
+	}
+
+setRange {
+        out "RANGE \$1,%d";
+        wait 100;
+	}
+
+getAOutput {
+        out "AOUT? \$1";
+        in "%f";
+	}
+
+setRamp {
+	out "RAMP \$1,%(\$2:OnRamp\$1.VAL)d,%(\$2:RampR\$1.VAL)f";
+        wait 100;
+	}
+
+getRamp {
+        out "RAMP? \$1";
+        in "%(\$2:OnRamp\$1_RBV.VAL)d,%(\$2:RampR\$1_RBV.VAL)f";
+	}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/Makefile	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,31 @@
+TOP=../..
+include $(TOP)/configure/CONFIG
+#----------------------------------------
+#  ADD MACRO DEFINITIONS BELOW HERE
+
+# Install databases, templates & substitutions like this
+DB += XGS600_chan.db
+DB += XGS600.proto
+DB += XGS600.substitutions
+DB += XGS600_unit.db
+DB += TPG26x.db
+DB += TPG26x.proto
+DB += SATECO_lakeshore331.proto
+DB += SATECO_lakeshore.substitution
+DB += SATECO_base.db
+DB += SATECO_lakeshore331.db
+DB += Bronkhorst.db
+DB += Bronkhorst.substitution
+DB += devBronkhorst.proto
+DB += Keithley6485.db
+DB += devKeithley6487.db
+DB += devKeithley6487.proto
+DB += asynRecord.db
+
+# If <anyname>.db template is not named <anyname>*.template add
+# <anyname>_TEMPLATE = <templatename>
+
+include $(TOP)/configure/RULES
+#----------------------------------------
+#  ADD EXTRA GNUMAKE RULES BELOW HERE
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/SATECO_base.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,473 @@
+# $Source: /cvs/G/DRV/SATECO/SATECO_base.template,v $
+# $Date: 2008/10/28 14:01:25 $
+# $Revision: 1.20 $
+# $Author: wang_x1 $
+
+
+#  Required substitutions:
+#    NAME        - prefix, e.g. X99SA-ES1-CRYOJET:
+#    UNIT        - temperature unit
+#    PTCOLS      - StreamDevice protocol file
+#    PORT        - port name
+
+# The Alarm Status of this record is used to trigger WATCHDOG
+record(stringin, "$(NAME):VERSION")
+{
+    field(DESC, "control version")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_VERSION $(PORT)")
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+
+    field(FLNK, "$(NAME):ONESHOT")
+}
+
+##############################################
+# Controller Mode
+##############################################
+record(mbbi, "$(NAME):MODE_RBV")
+{
+    field(DESC, "control mode")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_MODE $(PORT)")
+    
+    field(ZRVL, "0")
+    field(ONVL, "1")
+
+    field(ZRST, "Local")
+    field(ONST, "Remote")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+record(mbbo, "$(NAME):MODE")
+{
+    field(DESC, "control mode")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_MODE $(PORT)")
+    
+    field(ZRVL, "0")
+    field(ONVL, "1")
+
+    field(ZRST, "Local")
+    field(ONST, "Remote")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+
+##############################################
+# Connection Status Monitor
+##############################################
+record(mbbo,    "$(NAME):CONN-STAT")
+{
+    field(DESC, "connection status")
+
+    field(ZRVL, "0")
+    field(ONVL, "1")
+    field(TWVL, "2")
+
+    field(ZRST, "Disconnected")
+    field(ONST, "Connected")
+    field(TWST, "Connecting") 
+
+    field(ZRSV, "MAJOR")
+    field(ONSV, "NO_ALARM")
+    field(TWSV, "MINOR")
+}
+record(bo,      "$(NAME):CONN")
+{
+    field(DESC, "turn on/off connection")
+
+    field(ZNAM, "Disconnect")
+    field(ONAM, "Connect")
+    field(ZSV,  "MAJOR")
+    field(OSV,  "NO_ALARM")
+   
+    field(OUT,  "$(NAME):CONN-DFAN.VAL PP")
+    field(FLNK, "$(NAME):CONN-CALC")
+}
+
+record(dfanout, "$(NAME):CONN-DFAN")
+{
+    field(DESC, "fanout connect action")
+    field(OMSL, "supervisory")
+
+    field(OUTA, "$(NAME):ASYNIO.ENBL")
+#    field(OUTB, "$(NAME):ENBLSCAN.VAL")
+    field(OUTC, "$(NAME):WATCHDOG.VAL PP")
+}
+
+record(calcout, "$(NAME):CONN-CALC")
+{
+    field(DESC, "connecting")
+    field(INPA, "$(NAME):CONN.VAL")
+    field(CALC, "A=1?2:0")
+    field(DOPT, "Use CALC")
+    field(OOPT, "Transition To Non-zero")
+    field(OUT,  "$(NAME):CONN-STAT.VAL PP MS")
+    field(SCAN, "Passive")
+}
+
+record(calcout, "$(NAME):ONESHOT")
+{
+    field(DESC, "watchdog trigger")
+    field(INPA, "$(NAME):VERSION.STAT")
+    field(CALC, "A=0?1:0")
+    field(OOPT, "When Non-zero")
+    field(OUT,  "$(NAME):WATCHDOG.VAL PP MS")
+    field(SCAN, "Passive")
+}
+
+record(bo, "$(NAME):ENBLSCAN")
+{
+    field(DESC, "enable/disable record scan")
+    field(DTYP, "Soft Channel")
+    field(SCAN, "Passive")
+
+    field(ZNAM, "Disable")
+    field(ONAM, "Enable")
+}
+
+record(bo, "$(NAME):WATCHDOG")
+{
+    field(DESC, "connection indicator")
+    field(DTYP, "Soft Channel")
+
+    field(HIGH, "15")
+    field(SCAN, "Passive")
+
+    field(OUT,  "$(NAME):CONN-STAT.VAL PP")
+
+    field(ZNAM, "Disconnected")
+    field(ONAM, "Connected")
+    field(ZSV,  "MAJOR")
+    field(OSV,  "NO_ALARM")
+}
+
+record(asyn, "$(NAME):ASYNIO")
+{
+    field(DESC, "asyn port")
+    field(PORT, "$(PORT)")
+}
+
+record(calcout, "$(NAME):TRIG-CONN")
+{   
+    field(DESC, "trigger scan")
+    field(INPA, "$(NAME):WATCHDOG.VAL CPP MS")
+    field(CALC, "A")
+    field(OUT,  "$(NAME):CONN.VAL PP MS")
+    field(OOPT, "Transition To Zero")
+}
+
+###########################################
+#   PID
+###########################################
+record(ao,      "$(NAME):P")
+{
+    field(DESC, "PID - proportion set-point")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_P($(NAME)) $(PORT)")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+    field(PREC, "1")
+}
+
+record(ai,      "$(NAME):P_RBV")
+{
+    field(DESC, "PID - proportion readback")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_P $(PORT)")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+    field(PREC, "1")
+}
+record(ao,      "$(NAME):I")
+{
+    field(DESC, "PID - integral set-point")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_I($(NAME)) $(PORT)")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+    field(PREC, "1")
+}
+
+record(ai,      "$(NAME):I_RBV")
+{
+    field(DESC, "PID - integral readback")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_I $(PORT)")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+    field(PREC, "1")
+}
+record(ao,      "$(NAME):D")
+{
+    field(DESC, "PID - derivative set-point")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_D($(NAME)) $(PORT)")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+    field(PREC, "1")
+}
+
+record(ai,      "$(NAME):D_RBV")
+{
+    field(DESC, "PID - derivative readback")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_D $(PORT)")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+    field(PREC, "1")
+}
+
+###########################################
+#   Heating Level
+###########################################
+record(ao,      "$(NAME):HT-LVL")
+{
+    field(DESC, "heater level set-point")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_HEAT-LEVEL $(PORT)")
+
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+
+    field(HOPR, "100")
+    field(LOPR, "0")
+    field(PREC, "1")
+    field(EGU,  "%")
+}
+
+record(ai,      "$(NAME):HT-LVL_RBV")
+{
+    field(DESC, "heater level readback")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_HEAT-LEVEL $(PORT)")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+
+    field(HOPR, "100")
+    field(LOPR, "0")
+    field(PREC, "1")
+    field(EGU,  "%")
+}
+
+###########################################
+#   Temperature
+###########################################
+
+record(ai, "$(NAME):TEMP_RBV")
+{
+    field(DESC, "temperature")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_TEMP $(PORT)")
+    field(FLNK, "$(NAME):TEMP-AVG")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+
+    field(PREC, "2")
+    field(EGU,  "$(UNIT)")
+}
+
+record(ao, "$(NAME):TEMP")
+{
+    field(DESC, "temperature")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_TEMP $(PORT)")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+
+    field(PREC, "2")
+    field(EGU,  "$(UNIT)")
+
+    field(FLNK, "$(NAME):GO-1 PP MS")
+}
+
+#!
+record(ai, "$(NAME):TEMP-SP")
+{
+    field(DESC, "temperature setpoint")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_TEMP-SP $(PORT)")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+
+    field(PREC, "2")
+    field(EGU,  "$(UNIT)")
+}
+
+###########################################
+#   busy record for temperature set-point
+###########################################
+record(calcout, "$(NAME):GO-1")
+{
+    field(DESC, "")
+    field(INPA, "$(NAME):TEMP.SIMM")
+    field(CALC, "A=1?0:1")
+
+    field(OUT,  "$(NAME):GO-2 PP MS")
+    field(OOPT, "When Non-zero")
+}
+
+record(bo,  "$(NAME):GO-2")
+{
+    field(DESC, "")
+    field(DTYP, "Soft Channel")
+    field(OMSL, "supervisory")
+    field(VAL,  "1")
+    field(OUT,  "$(NAME):BUSY.VAL PP MS")
+                                # update TEMP-STAT, not waiting for next readback
+    field(FLNK, "$(NAME):RNG-CALC")
+}
+
+record(busy,    "$(NAME):BUSY")
+{
+}
+
+###########################################
+#   Temperature Status Monitor
+###########################################
+
+record(longout, "$(NAME):SETTL-PRD")
+{
+    field(DESC, "settling time")
+    field(EGU,  "s")
+    field(VAL,  "120")
+    field(FLNK, "$(NAME):TEMP-AVG")
+}
+
+record(ao,      "$(NAME):TOLERANCE")
+{
+    field(DESC, "tolerance band width")
+    field(EGU,  "$(UNIT)")
+    field(VAL,  "1")
+    field(PREC, "2")
+}
+
+record(sub, "$(NAME):TEMP-AVG")
+{
+    field(DESC, "temperature average")
+    field(INPA, "$(NAME):SETTL-PRD.VAL")
+    field(INPB, "$(NAME):TEMP_RBV.VAL")
+    field(INPD, "0") # Continuous Mode
+    field(INAM, "initSubAve")
+    field(SNAM, "SubAve")
+    field(PREC, "2")
+    field(SCAN, "Passive")
+
+    field(FLNK, "$(NAME):RNG-CALC")
+}
+
+record(calcout, "$(NAME):RNG-CALC")
+{
+    field(DESC, "temperature status calc")
+    field(INPA, "$(NAME):TEMP-AVG.VAL")
+    field(INPB, "$(NAME):TEMP.VAL")
+    field(INPC, "$(NAME):TOLERANCE.VAL")
+    field(INPD, "$(NAME):TEMP_RBV.VAL")
+
+    field(CALC, "(ABS(A-B)<=C)&&(ABS(D-B)<=C)?0:1")
+    field(DOPT, "Use CALC")
+    field(OOPT, "When Zero")
+
+    field(OUT,  "$(NAME):BUSY.VAL PP MS")
+    field(FLNK, "$(NAME):TEMP-STAT.VAL PP MS")
+
+    field(SCAN, "Passive")
+}
+
+record(mbbo,    "$(NAME):TEMP-STAT")
+{
+    field(DESC, "temperature status")
+
+    field(DOL,  "$(NAME):RNG-CALC MS")
+    field(OMSL, "closed_loop")
+ 
+    field(ZRVL, "0")
+    field(ONVL, "1")
+
+    field(ZRST, "Inside Range")
+    field(ONST, "Out of Range")
+
+    field(ZRSV,  "NO_ALARM")
+    field(ONSV,  "MAJOR")
+
+    field(SCAN, "Passive")
+}
+###########################################
+#   For Debug Use
+###########################################
+record(stringout,    "$(NAME):QUERY")
+{
+    field(DESC, "debug - query")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) QUERY($(NAME):RECV.VAL) $(PORT)")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+record(stringout,    "$(NAME):RECV")
+{
+    field(DESC, "debug - received message")
+    field(DTYP, "Soft Channel")
+}
+
+###########################################
+#  retrieve temp set-point when connected
+###########################################
+record(calcout, "$(NAME):TRIG-STAT")
+{   
+    field(DESC, "trigger TRIG-SP")
+    field(INPA, "$(NAME):CONN-STAT.VAL CPP MS")
+    field(CALC, "A=1?1:0")
+    field(OUT,  "$(NAME):TEMP-SIMM1.VAL PP MS")
+    field(OOPT, "Transition To Non-zero")
+}
+record(bo,      "$(NAME):TEMP-SIMM1")
+{
+    field(DESC, "set TEMP in simulation")
+    field(OUT,  "$(NAME):TEMP.SIMM")
+    field(FLNK, "$(NAME):SEQ")
+}
+
+record(sseq,    "$(NAME):SEQ")
+{
+    field(SELM, "All")
+
+    field(WAIT1,"Wait")
+    field(DO1,  "1")
+    field(LNK1, "$(NAME):TEMP-SP.PROC CA")
+
+    field(DOL2,  "$(NAME):TEMP-SP.VAL")
+    field(LNK2,  "$(NAME):TEMP.VAL PP")
+ 
+    field(FLNK, "$(NAME):TEMP-SIMM2")
+}
+
+record(bo,      "$(NAME):TEMP-SIMM2")
+{
+    field(DESC, "reset TEMP out simulation")
+    field(DOL,  "0")
+    field(OUT,  "$(NAME):TEMP.SIMM")
+    field(OMSL, "closed_loop")
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/SATECO_lakeshore.substitution	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,15 @@
+#file lakeshore340.template { 
+#  {NAME = X11MA-ES3-LSCI
+#      BUS = 15
+#      QM   = "'"}
+#}
+file "db/SATECO_base.db" {
+ pattern
+  {  NAME, UNIT, PTCOLS, PORT }
+  { "trARPES:Carving", "K", "SATECO_lakeshore331.proto", "MOXA_2" }
+}
+file "db/SATECO_lakeshore331.db" {
+ pattern
+  {  NAME, PTCOLS, PORT }
+  { "trARPES:Carving", "SATECO_lakeshore331.proto", "MOXA_2" }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/SATECO_lakeshore331.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,251 @@
+# $Source: /cvs/G/DRV/SATECO/SATECO_lakeshore331.template,v $
+# $Date: 2013/06/18 11:22:01 $
+# $Revision: 1.7 $
+# $Author: wang_x1 $
+
+
+#  Required substitutions:
+#    NAME        - prefix, e.g. X99SA-ES1-CRYOJET:
+#    PTCOLS      - StreamDevice protocol file
+#    PORT        - port name
+
+##############################################
+# Controller Control Mode
+##############################################
+record(mbbi, "$(NAME):CMODE_RBV")
+{
+    field(DESC, "control loop mode")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_CONTROL-MODE $(PORT)")
+    
+    field(ZRVL, "0")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+    field(FRVL, "4")
+    field(FVVL, "5")
+
+    field(ZRST, "Manual PID")
+    field(ONST, "Zone")
+    field(TWST, "Open Loop")
+    field(THST, "Auto Tune PID")
+    field(FRST, "Auto Tune PI")
+    field(FVST, "Auto Tune P")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+record(mbbo, "$(NAME):CMODE")
+{
+    field(DESC, "control loop mode")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_CONTROL-MODE $(PORT)")
+    
+    field(ZRVL, "0")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+    field(FRVL, "4")
+    field(FVVL, "5")
+
+    field(ZRST, "Manual PID")
+    field(ONST, "Zone")
+    field(TWST, "Open Loop")
+    field(THST, "Auto Tune PID")
+    field(FRST, "Auto Tune PI")
+    field(FVST, "Auto Tune P")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+###########################################
+#   Heater Status
+###########################################
+record(mbbo,      "$(NAME):HT-RNG")
+{
+    field(DESC, "heater range set-point")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_HEAT-RANGE $(PORT)")
+
+    field(ZRVL, "0")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+
+    field(ZRST, "Off")
+    field(ONST, "Low")
+    field(TWST, "Med")
+    field(THST, "High")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+record(mbbi,      "$(NAME):HT-RNG_RBV")
+{
+    field(DESC, "heater range readback")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_HEAT-RANGE $(PORT)")
+
+    field(ZRVL, "0")
+    field(ONVL, "1")
+    field(TWVL, "2")
+    field(THVL, "3")
+
+    field(ZRST, "Off")
+    field(ONST, "Low")
+    field(TWST, "Med")
+    field(THST, "High")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+##############################################
+# Heater Status
+##############################################
+record(mbbi, "$(NAME):HT-STAT")
+{
+    field(DESC, "heater status")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_HEAT-STAT $(PORT)")
+
+    field(ZRVL, "0")
+    field(ONVL, "1")
+    field(TWVL, "2")
+
+    field(ZRST, "no error")
+    field(ONST, "open load")
+    field(TWST, "short circuit")
+
+    field(ZRSV, "NO_ALARM")
+    field(ONSV, "MAJOR")
+    field(TWSV, "MAJOR")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+##############################################
+# Manual Heat Power Output
+##############################################
+record(ai,  "$(NAME):MHP_RBV")
+{
+    field(DESC, "MHP readback")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_MHP $(PORT)")
+    
+    field(EGU,  "%")
+    field(PREC, "2")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+record(ao,  "$(NAME):MHP")
+{
+    field(DESC, "MHP set-point")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_MHP $(PORT)")
+
+    field(EGU,  "%")
+    field(PREC, "2")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+
+
+##############################################
+# Ramp Rate
+##############################################
+record(ao,  "$(NAME):RMP-RT")
+{
+    field(DESC, "ramp rate set-point")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_RAMP-RATE($(NAME)) $(PORT)")
+    
+    field(EGU,  "K/min")
+    field(PREC, "1")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+record(ai,  "$(NAME):RMP-RT_RBV")
+{
+    field(DESC, "ramp rate readback")
+
+    field(EGU,  "K/min")
+    field(PREC, "1")
+}
+
+##############################################
+# Ramp Mode
+##############################################
+record(bo,  "$(NAME):RMP-MD")
+{
+    field(DESC, "trun of/off ramp")
+    field(DTYP, "stream")
+    field(OUT,  "@$(PTCOLS) SET_RAMP-MODE($(NAME)) $(PORT)")
+
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+record(bi,  "$(NAME):RMP-MD_RBV")
+{
+    field(DESC, "ramp mode on/off")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_RAMP($(NAME)) $(PORT)")
+
+    field(ZNAM, "Off")
+    field(ONAM, "On")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+##############################################
+# Ramp Status
+##############################################
+record(bi,  "$(NAME):RMP-STAT")
+{
+    field(DESC, "ramp status")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_RAMP-STAT $(PORT)")
+
+    field(ZNAM, "Not ramping")
+    field(ONAM, "Setpoint is ramping")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
+##############################################
+# Input B
+##############################################
+record(ai,  "$(NAME):TEMP-B")
+{
+    field(DESC, "input B temperature")
+    field(DTYP, "stream")
+    field(INP,  "@$(PTCOLS) GET_TEMP-B $(PORT)")
+
+    field(EGU,  "K")
+    field(PREC, "2")
+
+    field(SCAN, "1 second")
+    field(DISV, "0")
+    field(SDIS, "$(NAME):WATCHDOG.VAL")
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/SATECO_lakeshore331.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,55 @@
+# $Source: /cvs/G/DRV/SATECO/cfg/SATECO_lakeshore331.ptcols,v $
+# $Date: 2012/12/06 10:32:25 $
+# $Revision: 1.9 $
+# $Author: wang_x1 $
+#----------------------------------------------
+InTerminator  = CR LF;
+OutTerminator = CR LF;
+ReplyTimeout  =  500;
+ReadTimeout   =  100;
+WriteTimeout  =  100;
+ExtraInput    = Ignore;
+
+GET_VERSION     { out "*IDN?";      in "%39c";      wait 50; }
+
+GET_MODE        { out "MODE?";      in "%{0|1|2}";  wait 50; }
+SET_MODE        { out "MODE %{0|1|2}";              wait 50; }
+
+GET_TEMP-SP     { out "SETP? 1";    in "%f";        wait 50; }
+GET_TEMP        { out "KRDG? A";    in "%f";        wait 50; }
+SET_TEMP        { out "SETP 1,%f";  wait 50; }
+
+GET_TEMP-B      { out "KRDG? B";    in "%f";        wait 50; }
+GET_TEMP-C      { out "KRDG? C";    in "%f";        wait 50; }
+GET_TEMP-D      { out "KRDG? D";    in "%f";        wait 50; }
+
+GET_HEAT-RANGE  { out "RANGE?";     in "%{0|1|2|3}";wait 50; }
+SET_HEAT-RANGE  { out "RANGE %{0|1|2|3}";           wait 50; }
+
+GET_HEAT-STAT   { out "HTRST?";     in "%{0|1|2}";  wait 50; }
+
+GET_MHP         { out "MOUT? 1";    in "%f";        wait 50; }
+SET_MHP         { out "MOUT 1, %f"; wait 50; }
+
+GET_HEAT-LEVEL  { out "HTR?";    in "%f";           wait 50; }
+SET_HEAT-LEVEL  {}
+
+GET_P { out "PID? 1";  in "%f,%*f,%*f";             wait 50;}
+SET_P { out "PID 1,%f,%(\$1:I_RBV.VAL)f,%(\$1:D_RBV.VAL)f"; wait 50;}
+
+GET_I { out "PID? 1";  in "%*f,%f,%*f";             wait 50;}
+SET_I { out "PID 1,%(\$1:P_RBV.VAL)f,%f,%(\$1:D_RBV.VAL)f"; wait 50; }
+
+GET_D { out "PID? 1";  in "%*f,%*f,%f";             wait 50;}
+SET_D { out "PID 1,%(\$1:P_RBV.VAL)f,%(\$1:I_RBV.VAL)f,%f"; wait 50;}
+
+GET_CONTROL-MODE { out "CMODE? 1"; in "%{1|2|3|4|5|6}"; wait 50; }
+SET_CONTROL-MODE { out "CMODE 1, %{1|2|3|4|5|6}";       wait 50; }
+
+GET_RAMP        { out "RAMP? 1";    in "%{0|1},%(\$1:RMP-RT_RBV.VAL)f"; wait 50; }
+GET_RAMP-STAT   { out "RAMPST? 1";  in "%{0|1}";                        wait 50; }
+SET_RAMP-RATE   { out "RAMP 1, %(\$1:RMP-MD_RBV.VAL)d, %f";             wait 50; }
+SET_RAMP-MODE   { out "RAMP 1, %d, %(\$1:RMP-RT_RBV.VAL)f";             wait 50; }
+
+QUERY {out "%s"; in "%(\$1)39c";}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/TPG26x.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,333 @@
+record(stringin, "$(P)Reset") {
+  field(DTYP, "stream")
+  field(INP, "@TPG26x.proto reset $(PORT)")
+  field(PINI,"YES")
+}
+
+record(bo, "$(P)DISABLE") 
+{
+    field(DESC, "Disable comms")
+    field(PINI, "YES")
+    field(VAL, "$(DISABLE=0)")
+    field(OMSL, "supervisory")
+    field(ZNAM, "COMMS ENABLED")
+    field(ONAM, "COMMS DISABLED")
+}
+
+# This record reads both pressure and errors
+record(ai,"$(P)1:RAW_PRES")
+{
+	field(DESC, "Pressure reading from gauge 1 no error")
+	field(SCAN, "1 second")
+	field(DTYP, "stream")
+	field(INP,  "@TPG26x.proto pres($(P),1:ERROR,2:ERROR,2:RAW_PRES) $(PORT)")
+	field(PINI, "YES")
+	field(PREC, "4")
+	field(SIML, "$(P)SIM")
+	field(SIOL, "$(P)SIM:1:PRESSURE")
+	field(SDIS, "$(P)DISABLE")
+	field(FLNK, "$(P)ACTIVITY")
+	field(VAL, 0)
+	info(archive, "VAL")
+}
+
+record(mbbi,"$(P)1:ERROR")
+{
+	field(DESC, "Error from the Gauge 1")
+	field(SCAN, "Passive")
+	field(ZRST, "No Error")
+	field(ZRSV, "NO_ALARM")
+	field(ZRVL, 0)
+	field(ONST, "Underrange")
+	field(ONSV, "MINOR")
+	field(ONVL, 1)
+	field(TWST, "Overrange")
+	field(TWSV, "MINOR")
+	field(TWVL, 2)
+	field(THST, "Sensor error")
+	field(THSV, "MAJOR")
+	field(THVL, 3)
+	field(FRST, "Sensor off")
+	field(FRSV, "MAJOR")
+	field(FRVL, 4)
+	field(FVST, "No Sensor")
+	field(FVSV, "MAJOR")
+	field(FVVL, 5)
+	field(SXST, "Identification Error")
+	field(SXSV, "MAJOR")
+	field(SXVL, 6)
+	field(UNSV, "MAJOR")
+	field(PINI, "YES")
+	field(VAL, 0)    
+	field(SIML, "$(P)SIM")
+	field(SIOL, "$(P)SIM:1:ERROR")
+	info(archive, "VAL")
+	info(INTEREST, "MEDIUM")
+}
+
+# This record is set from 1:RAW_PRES
+record(ai,"$(P)2:RAW_PRES")
+{
+	field(DESC, "Pressure reading from gauge 2 no error")
+	field(SCAN, "Passive")
+	field(PREC, "4")
+	field(SIML, "$(P)SIM")
+	field(SIOL, "$(P)SIM:2:PRESSURE")
+	field(PINI, "YES")
+	field(VAL, 0)
+	info(archive, "VAL")
+}
+
+# This record is set from 1:RAW_PRES
+record(mbbi,"$(P)2:ERROR")
+{
+	field(DESC, "Error from the Gauge 2")
+	field(SCAN, "Passive")
+	field(ZRST, "No Error")
+	field(ZRSV, "NO_ALARM")
+	field(ZRVL, 0)
+	field(ONST, "Underrange")
+	field(ONSV, "MINOR")
+	field(ONVL, 1)
+	field(TWST, "Overrange")
+	field(TWSV, "MINOR")
+	field(TWVL, 2)
+	field(THST, "Sensor error")
+	field(THSV, "MAJOR")
+	field(THVL, 3)
+	field(FRST, "Sensor off")
+	field(FRSV, "MAJOR")
+	field(FRVL, 4)
+	field(FVST, "No Sensor")
+	field(FVSV, "MAJOR")
+	field(FVVL, 5)
+	field(SXST, "Identification Error")
+	field(SXSV, "MAJOR")
+	field(SXVL, 6)
+	field(SVSV, "MAJOR")
+	field(SVVL, 7)
+	field(EISV, "MAJOR")
+	field(EIVL, 8)
+	field(NISV, "MAJOR")
+	field(NIVL, 9)
+	field(TESV, "MAJOR")
+	field(TEVL, 10)
+	field(ELSV, "MAJOR")
+	field(ELVL, 11)
+	field(TVSV, "MAJOR")
+	field(TVVL, 12)
+	field(TTSV, "MAJOR")
+	field(TTVL, 13)
+	field(FTSV, "MAJOR")
+	field(FTVL, 14)
+	field(FFSV, "MAJOR")
+	field(FFVL, 15)
+	field(PINI, "YES")
+	field(VAL, 0)
+	field(SIML, "$(P)SIM")
+	field(SIOL, "$(P)SIM:2:ERROR")
+	info(archive, "VAL")
+	info(INTEREST, "MEDIUM")
+}
+
+
+record(calcout,"$(P)1:CALC_PRES") {
+   field(DESC, "Pressure calculation gauge 1")
+   field(INPA, "$(P)1:RAW_PRES MS CP")
+   # For the error state reported
+   field(INPB, "$(P)1:ERROR MS CP")
+   
+   field(OUT, "$(P)1:PRESSURE MS PP")
+   
+   field(CALC, "A")
+}
+
+record(ai,"$(P)1:PRESSURE") {
+   field(DESC, "Pressure reading from gauge 1")
+   field(EGU, "") # set by units transfer
+   field(PREC, "4")
+   $(IFPRESSUR1) info(alarm, "TPG26x")
+   info(archive, "VAL")
+   info(INTEREST, "HIGH")
+}
+
+## PV hidden on graph when value set to 0, or is displayed
+## when the channel is on and the VAL field is uncommented (sets to 1)
+
+record(bo, "$(P)1:VISIBLE")
+{
+    field(SCAN, "Passive")
+    field(DTYP, "Soft Channel")
+    field(ZNAM, "NO")
+    field(ONAM, "YES")
+    field(PINI, "YES")
+    $(IFPRESSUR1) field(VAL, "1")
+}
+
+record(calcout,"$(P)2:CALC_PRES") {
+   field(DESC, "Pressure calculation gauge 2")
+   field(INPA, "$(P)2:RAW_PRES MS CP")
+   # For the error state reported
+   field(INPB, "$(P)2:ERROR MS CP")
+   # For the disconnect error (data is pushed into 1)
+   field(INPC, "$(P)1:RAW_PRES MS CP")
+   
+   field(OUT, "$(P)2:PRESSURE MS PP")
+   
+   field(CALC, "A")
+}
+
+record(ai,"$(P)2:PRESSURE") {
+   field(DESC, "Pressure reading from gauge 2")
+   field(EGU, "") # set by units transfer
+   field(PREC, "4")
+   $(IFPRESSUR2)  info(alarm, "TPG26x")
+   info(archive, "VAL")
+   info(INTEREST, "HIGH")
+}
+
+## PV hidden on graph when value set to 0, or is displayed
+## when the channel is on and the VAL field is uncommented (sets to 1)
+
+record(bo, "$(P)2:VISIBLE")
+{
+    field(SCAN, "Passive")
+    field(DTYP, "Soft Channel")
+    field(ZNAM, "NO")
+    field(ONAM, "YES")
+    field(PINI, "YES")
+    $(IFPRESSUR2) field(VAL, "1")
+}
+
+record(calc,"$(P)ACTIVITY") {
+   field(DESC, "Activity record")
+   field(INPA, "$(P)ACTIVITY")
+   field(CALC, "A!=0?0:1")
+   field(VAL, 0)
+   field(PINI, "YES")
+}
+
+record(stringout,"$(P)1:UNITS_TRANSFER") {
+    field(DESC, "Transfer the units to pressure 1")
+    field(DOL, "$(P)UNITS.VAL CP")
+    field(OMSL, "closed_loop")
+    field(OUT, "$(P)1:PRESSURE.EGU")
+}
+
+record(stringout,"$(P)2:UNITS_TRANSFER") {
+    field(DESC, "Transfer the units to pressure 2")
+    field(DOL, "$(P)UNITS.VAL CP")
+    field(OMSL, "closed_loop")
+    field(OUT, "$(P)2:PRESSURE.EGU")
+}
+
+record(mbbi, "$(P)UNITS") 
+{
+    field(DESC, "Units of pressure")
+    field(SCAN, "1 second")
+    field(DTYP, "stream")
+    field(INP,  "@TPG26x.proto getUnits $(PORT)")
+    field(ZRST, "mbar")
+    field(ONST, "Torr")
+    field(TWST, "Pa")
+    field(SIML, "$(P)SIM")
+    field(SIOL, "$(P)SIM:UNITS")
+    field(SDIS, "$(P)DISABLE")
+    info(archive, "VAL")
+    info(INTEREST, "HIGH")
+}
+
+record(mbbo, "$(P)UNITS:SP") 
+{
+    field(DTYP, "stream")
+    field(DESC, "Set the units of pressure")
+    field(OUT,  "@TPG26x.proto setUnits $(PORT)")
+    field(ZRST, "mbar")
+    field(ONST, "Torr")
+    field(TWST, "Pa")
+    field(SIML, "$(P)SIM")
+    field(SIOL, "$(P)SIM:UNITS:SP")
+    field(SDIS, "$(P)DISABLE")
+    info(archive, "VAL")
+}
+
+alias("$(P)UNITS", "$(P)UNITS:SP:RBV")
+
+
+
+## SIMULATION STUFF ##
+
+record(bo, "$(P)SIM") 
+{
+    field(SCAN, "Passive")
+    field(DTYP, "Soft Channel")
+    field(ZNAM, "NO")
+    field(ONAM, "YES")
+    field(VAL, "$(RECSIM=0)")
+}
+
+alias("$(P)SIM", "$(P)SIM:SP")
+
+record(mbbi, "$(P)SIM:UNITS") 
+{
+    field(SCAN, "Passive")
+    field(DTYP, "Soft Channel")
+    field(ZRST, "mbar")
+    field(ONST, "Torr")
+    field(TWST, "Pa")
+}
+
+alias("$(P)SIM:UNITS","$(P)SIM:UNITS:SP")
+
+alias("$(P)SIM:UNITS","$(P)SIM:UNITS:SP:RBV")
+
+record(ai,"$(P)SIM:1:PRESSURE")
+{
+    field(DESC, "Sim pressure from gauge 1 no error")
+    field(SCAN, "Passive")
+    field(DTYP, "Soft Channel")
+    field(PINI, "YES")
+    field(VAL, 0)
+}
+
+record(ai,"$(P)SIM:2:PRESSURE")
+{
+    field(DESC, "Sim pressure from gauge 2 no error")
+    field(SCAN, "Passive")
+    field(DTYP, "Soft Channel")
+    field(FLNK, "$(P)2:RAW_PRES")
+    field(PINI, "YES")
+    field(VAL, 0)
+}
+
+record(mbbi,"$(P)SIM:1:ERROR")
+{
+    field(DESC, "Simulated error from the Gauge 1")
+    field(SCAN, "Passive")
+    field(ZRST, "No Error")
+    field(ONST, "Underrange")
+    field(TWST, "Overrange")
+    field(THST, "Sensor error")
+    field(FRST, "Sensor off")
+    field(FVST, "No Sensor")
+    field(SXST, "Identification Error")
+    field(FLNK, "$(P)1:ERROR")
+    field(PINI, "YES")
+    field(VAL, 0)
+}
+
+record(mbbi,"$(P)SIM:2:ERROR")
+{
+    field(DESC, "Simulated error from the Gauge 2")
+    field(SCAN, "Passive")
+    field(ZRST, "No Error")
+    field(ONST, "Underrange")
+    field(TWST, "Overrange")
+    field(THST, "Sensor error")
+    field(FRST, "Sensor off")
+    field(FVST, "No Sensor")
+    field(SXST, "Identification Error")
+    field(PINI, "YES")
+    field(VAL, 0)
+    field(FLNK, "$(P)2:ERROR")
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/TPG26x.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,50 @@
+
+
+#How TPG26x comms work:
+#First send a command (e.g. ask for the pressure) then the device will return ACK.
+#Then send ENQ to get the actual values.
+
+#According to the streamdevice manual, once an "out" is sent access to the
+#device is exclusively locked until the WHOLE protocol is finished.
+#This should mean that we do not need to worry about commands interrupting each other
+
+LockTimeout = 2500;
+ReplyTimeout = 2000;
+ReadTimeout = 100;
+OutTerminator = CR;
+InTerminator = CR LF;
+
+# Reset communication 
+reset {
+    out "RES,1";
+    in ACK;
+	out ENQ;
+    in "%s";
+}
+
+# Get pressures (and errors) from both guages
+pres {
+    out "PRX";
+    in ACK;
+	out ENQ;
+    in "%(\$1\$2)d,%f,%(\$1\$3)d,%(\$1\$4)f";
+}
+
+# Get the current units
+getUnits {
+    out "UNI";
+	in ACK;
+	out ENQ;
+    in "%{0|1|2}";
+}
+
+# Set the current units
+setUnits {
+    #UNI,0 = mbar
+    #UNI,1 = Torr
+    #UNI,2 = Pa
+    out "UNI,%{0|1|2}";
+	in ACK;
+	out ENQ;
+    in "%{0|1|2}";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/XGS600.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,37 @@
+#----------------------------------------------------------------------
+#
+#  StreamDevice protocol file for a reading/setting selected elements
+#  from a Varian XGS-600 pressure gauge controller
+#
+#  2013-01-10  J.Priller  original version
+#
+#----------------------------------------------------------------------
+
+Terminator = CR;
+
+# getUnits(address)
+getUnits {
+  out "#\$113";
+  in ">%d";
+}
+
+# getPressure(address,chan)
+getPressure {
+  out "#\$102\$2";
+  in ">%g";
+}
+
+# send a raw command
+sendRawCommand {
+  out "%s";
+}
+
+# send a raw query (needs argument for PV to receive reply)
+sendRawQuery {
+  ExtraInput = Ignore;
+  out "%s";
+  in  "%(\$1)40c";
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/XGS600.substitutions	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,14 @@
+file "db/XGS600_unit.db" {
+  pattern
+  {  HWUNIT,               ADDR }
+  { "_trarpes_vac_xgs600_1", "00" }
+}
+
+file "db/XGS600_chan.db" {
+  pattern
+  { HWUNIT,                ADDR, CHAN, SYS,     DEV,  INST    }
+  { "_trarpes_vac_xgs600_1", "00", "I1", "trARPES:", "XGS600:", "PressureAC" }
+  { "_trarpes_vac_xgs600_1", "00", "I2", "trARPES:", "XGS600:", "PressureTC" }
+  { "_trarpes_vac_xgs600_1", "00", "I3", "trARPES:", "XGS600:", "PressureMETIS" }
+  { "_trarpes_vac_xgs600_1", "00", "I4", "trARPES:", "XGS600:", "PressureMBE" }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/XGS600_chan.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,29 @@
+#
+# database template for an XGS600 pressure sensor channel
+#
+# macros:
+#    SYS,DEV,INST : base name for this channel
+#    HWUNIT           : name of asyn port in drvAsynIPPortConfigure()
+#
+
+record(ai, "$(SYS)$(DEV)$(INST):P_RD")
+{
+  field(DESC, "Pressure reading")
+  field(DTYP, "stream")
+  field(SCAN, ".2 second")
+  field(PREC, "3")
+  field(EGU,  "??")
+  field(INP,  "@XGS600.proto getPressure($(ADDR),$(CHAN)) $(HWUNIT)")
+  field(ADEL, "1.0e-9")
+}
+
+record(scalcout, "_$(SYS)$(DEV)$(INST):units")
+{
+  field(DESC, "Units reading")
+  field(DTYP, "Soft Channel")
+  field(SCAN, "Passive")
+  field(CALC, "AA")
+  field(INAA, "_$(HWUNIT)_UNITS_SCALC.SVAL  CP NMS")
+  field(OOPT, "Every Time")
+  field(OUT,  "$(SYS)$(DEV)$(INST):P_RD.EGU  NPP NMS")
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/XGS600_unit.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,50 @@
+
+record(asyn, "_$(HWUNIT):sensor_asyn")
+{
+  field(PORT, "$(HWUNIT)")
+}
+
+record(longin, "_$(HWUNIT)_UNITS_IDX")
+{
+  field(DESC, "Units index number")
+  field(DTYP, "stream")
+  field(SCAN, "1 second")
+  field(INP,  "@XGS600.proto getUnits($(ADDR)) $(HWUNIT)")
+}
+
+record(scalcout, "_$(HWUNIT)_UNITS_SCALC")
+{
+  field(DESC, "Units string scalcout")
+  field(DTYP, "Soft Channel")
+  field(SCAN, "Passive")
+  field(CALC, "@@A")
+  field(INPA, "_$(HWUNIT)_UNITS_IDX  CP MS")
+  field(AA,   "Torr")
+  field(BB,   "mBar")
+  field(CC,   "Pascal")
+}
+
+record(stringout, "_$(HWUNIT)_RAW_CMD")
+{
+  field(DESC, "Raw command")
+  field(SCAN, "Passive")
+  field(DTYP, "stream")
+  field(OUT, "@XGS600.proto sendRawCommand $(HWUNIT)")
+}
+
+record(stringout, "_$(HWUNIT)_RAW_QUERY")
+{
+  field(DESC, "Raw query")
+  field(SCAN, "Passive")
+  field(DTYP, "stream")
+  field(OUT, "@XGS600.proto sendRawQuery(_$(HWUNIT)_RAW_REPLY.VAL) $(HWUNIT)")
+}
+
+record(stringin, "_$(HWUNIT)_RAW_REPLY")
+{
+  field(DESC, "Raw query reply")
+  field(SCAN, "Passive")
+  field(DTYP, "Soft Channel")
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/asynRecord.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,9 @@
+record(asyn,"$(P)$(R)")
+{
+    field(DTYP,"asynRecordDevice")
+    field(PORT,"$(PORT)")
+    field(ADDR,"$(ADDR)")
+    field(OMAX,"$(OMAX)")
+    field(IMAX,"$(IMAX)")
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/devBronkhorst.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,44 @@
+Terminator = CR LF;
+ReplyTimeout = 3000;
+LockTimeout = 3000;
+
+identity{
+	out ":0780040060006000";
+	in ":138002006000%26c00";
+}
+
+readChar{
+	out ":068004\$1\$2\$1\$2";
+	in ":058002\$1\$2%X";
+}
+
+writeChar{
+	out ":058002\$1\$2%02X";
+	@init{readChar;}
+}
+
+#SHOULD readInt also contain 0-padding?
+readInt{
+	out ":068004\$1\$2\$1\$2";
+	in ":068002\$1\$2%X";
+}
+
+writeInt{
+	out ":068002\$1\$2%04X";
+	@init{readInt;}
+}
+
+readFloat{
+	out ":068004\$1\$2\$1\$2";
+	in ":088002\$1\$2%X";
+}
+
+writeFloat{
+	out ":088002\$1\$2%08X";
+	@init{readFloat;}
+}
+
+debug{
+	out ":068004\$1\$2\$1\$2";
+	in "%39c";
+}
--- /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")
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/devKeithley6487.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,119 @@
+##########################################################################
+# 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.
+##########################################################################
+
+@writetimeout { disconnect; }
+@replytimeout { disconnect; }
+@readtimeout  { disconnect; }
+@mismatch     { disconnect; }
+
+ReplyTimeout = 1200;
+InTerminator = "\n";
+OutTerminator = "\n";
+
+getIDN {
+    out "*IDN?";
+    in "%\$1[^\r\n]";
+    ExtraInput = Ignore;
+}
+cmd {
+    out "\$1";
+}
+
+setD {
+    out "\$1 %d";
+    @init { out "\$1?"; in "%d"; }
+}
+getD {
+    out "\$1?";
+    in "%d";
+    ExtraInput = Ignore;
+}
+
+setF {
+    out "\$1 %f";
+    @init { out "\$1?"; in "%f"; }
+}
+getF {
+    out "\$1?";
+    in "%f";
+    ExtraInput = Ignore;
+}
+
+setRange {
+    out "RANG 2E-%d";
+    @init { out "RANG?"; in "%*[^E]E-%d"; }
+}
+getRange {
+    out "RANG?";
+    in "%*[^E]E-%d";
+    ExtraInput = Ignore;
+}
+
+setArmSource {
+    out "ARM:SOUR %{IMM|BUS|TIM|MAN|TLIN|NST|PST|BST}";
+    @init { out "ARM:SOUR?"; in "%{IMM|BUS|TIM|MAN|TLIN|NST|PST|BST}"; }
+}
+getArmSource {
+    out "ARM:SOUR?";
+    in "%{IMM|BUS|TIM|MAN|TLIN|NST|PST|BST}";
+    ExtraInput = Ignore;
+}
+setTriggerSource {
+    out "TRIG:SOUR %{IMM|TLIN}";
+    @init { out "TRIG:SOUR?"; in "%{IMM|TLIN}"; }
+}
+getTriggerSource {
+    out "TRIG:SOUR?";
+    in "%{IMM|TLIN}";
+    ExtraInput = Ignore;
+}
+cancel {
+    out "\030ABOR\r";
+    in "%*s";
+    ExtraInput = Ignore;
+}
+
+#
+# Measure current
+#
+measureCurrent {
+    ReplyTimeout = 5000;
+    out "READ?";
+    in "%f";
+    ExtraInput = Ignore;
+    @init { out "FORM:ELEM READ;CONF:CURR:DC"; }
+}
+fetchBuffered {
+    ReplyTimeout = 10000;
+    Separator = ",";
+    out "FETC?";
+    in "%f";
+    ExtraInput = Ignore;
+}
+
+#
+# Source
+#
+setIlimit {
+    out "SOUR:VOLT:ILIM 2.5E-%d";
+    @init { out "SOUR:VOLT:ILIM?"; in "2.5%*[^E]E-%d"; }
+}
+getIlimit {
+    out "SOUR:VOLT:ILIM?";
+    in "2.5%*[^E]E-%d";
+    ExtraInput = Ignore;
+}
+setSourceRange {
+    out "SOUR:VOLT:RANGE %d";
+    @init { out "SOUR:VOLT:RANGE?"; in "%{1.000000E+01|5.000000E+01|5.000000E+02}"; }
+}
+getSourceRange {
+    out "SOUR:VOLT:RANGE?";
+    in "%{1.000000E+01|5.000000E+01|5.000000E+02}";
+    ExtraInput = Ignore;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Db/ls331.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,319 @@
+##################################################
+#
+# Protocol File
+#
+# Protocol file for Lakeshore 336
+# Diamond Light Source, June 2010
+#
+# Oak Ridge National Lab, UT-Battelle, 2013-2015.
+# Add more commands.
+# 
+##################################################
+
+# check check Lakeshore 331
+
+##################################################
+# General Settings
+##################################################
+
+Terminator = "\r\n";
+ReplyTimeout = 1000;
+
+
+###################################################
+# Get functions
+###################################################
+
+# /// Read the device ID
+getID {
+   out "*IDN?";
+   in "LSCI,%s";
+}
+
+# /// Read the model number
+getMODEL {
+   in "LSCI,%8c,%*15c,%*s";
+}
+
+# /// Read the serial number
+getSERIAL {
+   in "LSCI,%*8c,%15c,%*s";
+}
+
+# /// Read the device firmware number
+getFIRMWARE {
+   in "LSCI,%*8c,%*15c,%s";
+}
+
+# /// Read the heater status for output 1 or 2
+getHTR {
+   out "HTR? \$1";
+   in "%f";
+}
+
+# /// Read the analog output for output 3 or 4
+getAOUT {
+   out "AOUT? \$1";
+   in "%f";
+}
+
+# /// Read the setpoint for outputs 1-4
+getSETP {
+   out "SETP? \$1";
+   in "%f";
+}
+
+# /// Read the temperature in kelvin for inputs 1-4
+getKRDG {
+   out "KRDG? \$1";
+   in "%f";
+}
+
+# /// Read the voltage input for inputs 1-4
+getSRDG {
+   out "SRDG? \$1";
+   in "%f";
+}
+
+# /// Read the range parameter (power range) for outputs 1-4
+getRANGE {
+   out "RANGE? \$1";
+   in "%d";
+}
+
+# /// Read the ramp value and status for outputs 1-4
+# /// The first parameter is the output number.
+# /// The second parameter is the ramp status record.
+getRAMP {
+   out "RAMP? \$1";
+   in "%(\$2)d,%f";
+}
+
+# /// Read the ramp status for outputs 1-4
+getRAMPSTATUS {
+   out "RAMP? \$1";
+   in "%d,%*f";
+}
+
+# /// Read the manual output value for outputs 1-4
+getMOUT {
+   out "MOUT? \$1";
+   in "%f";
+}
+
+# /// Read the PID params into 3 records using one write/read.
+# /// The first argument is the output number. The second and third are
+# /// the I and D records.
+getPID {
+   out "PID? \$1";
+   in "%f,%(\$2:\$3)f,%(\$2:\$4)f";
+}
+
+# /// Combine getOUTMODEMODE, getOUTMODEINPUT and getOUTMODEPE into one function.
+# /// The first argument is the output number.
+# /// The second argument is the PV prefix.
+# /// The third argument is the output mode intput record (suffix only).
+# /// The fourth argument is the output mode powerup enable record (suffix only).
+getOM {
+  out "OUTMODE? \$1";
+  in "%d,%(\$2:\$3)d,%(\$2:\$4)d";
+}
+
+# /// Read the output mode mode status for outputs 1-4
+# /// 0=Off
+# /// 1=Closed Loop PID
+# /// 2=Zone
+# /// 3=Open Loop
+# /// 4=Monitor Out
+# /// 5=Warm Up Supply
+getOUTMODEMODE {
+   out "OUTMODE? \$1";
+   in "%d,%*d,%*d";
+}
+
+# /// Read the output mode input for outputs 1-4
+# /// 0=None
+# /// 1=A
+# /// 2=B
+# /// 3=C
+# /// 4=D
+getOUTMODEINPUT {
+   out "OUTMODE? \$1";
+   in "%*d,%d,%*d";
+}
+
+# /// Read the output mode power up enable for outputs 1-4
+# /// 0=Off
+# /// 1=On
+getOUTMODEPE {
+   out "OUTMODE? \$1";
+   in "%*d,%*d,%d";
+}
+
+
+# /// Read the tuning status
+getTUNEST {
+   out "TUNEST?";
+   in "%s";
+}
+
+# /// Read the tuning status success param
+getTUNESTSUCCESS {
+   out "TUNEST?";
+   in "%*d,%*d,%d,%*d";
+}
+
+# /// Read the ZONE parameters (this is read into a waveform)
+getZONE {
+   out "ZONE? \$1,\$2";
+   separator=",";
+   in "%f";
+}
+
+# /// Read the input sensor name
+getINNAME {
+   out "INNAME? \$1";
+   in "%#s";
+}
+
+
+# /// Read the alarm status
+# /// The first param is the input number, the second is the alarm low record.
+getALARMST {
+   out "ALARMST? \$1";
+   in "%d,%(\$2)d"
+}
+
+# /// Read the alarm params. I put the ends of the PV names here
+# /// to make the initial record INP link short.
+getALARM {
+   out "ALARM? \$1";
+   in "%(\$2.A)d,%(\$2.B)f,%(\$2.C)f,%(\$2.D)f,%(\$2.E)d,%(\$2.F)d,%(\$2.G)d"
+}
+
+# /// Read the input reading status
+getRDGST {
+   out "RDGST? \$1";
+   in "%d"
+}
+
+# /// Read the heater status for outputs 1 or 2
+getHTRST {
+   out "HTRST? \$1";
+   in "%d"
+}
+
+# /// Read the input curve number
+getINCRV {
+   out "INCRV? \$1";
+   in "%d"
+}
+
+# /// Read the input curve header.
+# /// The first argument is the curve number record (also prefix for other record names).
+# /// The second argument is the curve name record (suffix only).
+# /// The third argument is the curve serial number record (suffix only).
+# /// The fourth argument is the curve data format record (suffix only).
+# /// The fifth argument is the curve temperature limit record (suffix only).
+# /// The sixth argument is the curve temperature coefficient record (suffix only).
+getCRVHDR {
+	out "CRVHDR? %(\$1:\$2)d";
+	in "%(\$1:\$3.AA)15c,%(\$1:\$3.BB)10c,%(\$1:\$3.A)d,%(\$1:\$3.B)f,%(\$1:\$3.C)d"
+}
+
+# /// Read the input type params. I put the ends of the PV names here
+# /// to make the initial record INP link short.
+getINTYPE {
+   out "INTYPE? \$1";
+   in "%(\$2.A)d,%(\$2.B)d,%(\$2.C)d,%(\$2.D)d,%(\$2.E)d"
+}
+
+
+#######################################################
+# Set functions
+#######################################################
+
+# /// Set the setpoint for outputs 1-4
+setSETP {
+   out "SETP \$1,%f";
+   @init { getSETP; }
+}
+
+# /// Set the range parameter for outputs 1-4
+setRANGE {
+   out "RANGE \$1,%d";
+   @init { getRANGE; }
+}
+
+# /// Set the ramp parameter for loops 1-2
+#Need to pass in the PV name for the getRAMPSTATUS protocol.
+setRAMP {
+   out "RAMP \$2,%(\$1.VAL)d,%f";
+   @init { out "RAMP? \$2"; in "%*d,%f"; }
+}
+
+# /// Set the ramp status for loops 1-2
+#Need to pass in the PV name for the getRAMP protocol.
+setRAMPSTATUS {
+   out "RAMP \$2,%d,%(\$1.VAL)f";
+   @init { out "RAMP? \$2"; in "%d,%*f"; }
+}
+
+# /// Set the manual output value for outputs 1-4
+setMOUT {
+   out "MOUT \$1,%f";
+   @init { getMOUT; }
+}
+
+# /// Set the PID P parameter for outputs 1-4
+setP {
+   out "PID \$1,%f,%(\$2:\$3)f,%(\$2:\$4)f";
+   @init { out "PID? \$1"; in "%f,%*f,%*f"; }
+}
+
+# /// Set the PID I parameter for outputs 1-4
+setI {
+   out "PID \$1,%(\$2:\$3)f,%f,%(\$2:\$4)f";
+   @init { out "PID? \$1"; in "%*f,%f,%*f"; }
+}
+
+# /// Set the PID D parameter for outputs 1-4
+setD {
+   out "PID \$1,%(\$2:\$3)f,%(\$2:\$4)f,%f";
+   @init { out "PID? \$1"; in "%*f,%*f,%f"; }
+}
+
+# /// Set the output mode [loop],[mode],[input],[power up enable]
+setOM {
+  out "OUTMODE \$1,%d,%(\$2:\$3)d,%(\$2:\$4)d";
+  @init { out "OUTMODE? \$1"; in "%d,%*d,%*d";}
+}
+
+# /// Set the output mode input [loop],[mode],[input],[power up enable]
+setOMI {
+  out "OUTMODE \$1,%(\$2:\$3)d,%d,%(\$2:\$4)d";
+  @init { out "OUTMODE? \$1"; in "%*d,%d,%*d";}
+}
+
+# /// Set the output mode power up enable [loop],[mode],[input],[power up enable]
+setOMP {
+  out "OUTMODE \$1,%(\$2:\$3)d,%(\$2:\$4)d,%d";
+  @init { out "OUTMODE? \$1"; in "%*d,%*d,%d";}
+}
+
+
+# /// Start the auto tune process.
+setATUNE {
+   out "ATUNE \$1,%(\$2.VAL)d";
+}
+
+# /// Set the ZONE parameters
+setZONE {
+  out "ZONE \$1,\$2,%(A)f,%(B)f,%(C)f,%(D)f,%(E)f,%(F)d,%(G)d,%(H)f";
+}
+
+# /// Set the input sensor name
+setINNAME {
+  out "INNAME \$1,\"%s\"";
+  @init { getINNAME; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/Makefile	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,8 @@
+TOP = ..
+include $(TOP)/configure/CONFIG
+DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *src*))
+DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Src*))
+DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *db*))
+DIRS := $(DIRS) $(filter-out $(DIRS), $(wildcard *Db*))
+include $(TOP)/configure/RULES_DIRS
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/src/IOCINFRAMain.cpp	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,23 @@
+/* IOCINFRAMain.cpp */
+/* Author:  Marty Kraimer Date:    17MAR2000 */
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "epicsExit.h"
+#include "epicsThread.h"
+#include "iocsh.h"
+
+int main(int argc,char *argv[])
+{
+    if(argc>=2) {    
+        iocsh(argv[1]);
+        epicsThreadSleep(.2);
+    }
+    iocsh(NULL);
+    epicsExit(0);
+    return(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/src/Makefile	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,57 @@
+TOP=../..
+
+include $(TOP)/configure/CONFIG
+#----------------------------------------
+#  ADD MACRO DEFINITIONS AFTER THIS LINE
+#=============================
+
+#=============================
+# Build the IOC application
+
+PROD_IOC = IOCINFRA
+# IOCINFRA.dbd will be created and installed
+DBD += IOCINFRA.dbd
+
+# IOCINFRA.dbd will be made up from these files:
+IOCINFRA_DBD += base.dbd
+
+# Include dbd files from all support applications:
+#IOCINFRA_DBD += xxx.dbd
+IOCINFRA_DBD += calc.dbd
+IOCINFRA_DBD += drvAsynIPPort.dbd
+IOCINFRA_DBD += asyn.dbd
+IOCINFRA_DBD += busySupport.dbd
+IOCINFRA_DBD += stream.dbd
+IOCINFRA_DBD += ip.dbd
+IOCINFRA_DBD += bronkhorstFloat.dbd
+IOCINFRA_DBD += drvAsynKeithley648x.dbd
+
+# Add all the support libraries needed by this IOC
+#IOCINFRA_LIBS += xxx
+IOCINFRA_LIBS += asyn 
+IOCINFRA_LIBS += stream 
+IOCINFRA_LIBS += busy 
+IOCINFRA_LIBS += calc 
+IOCINFRA_LIBS += ip 
+
+# IOCINFRA_registerRecordDeviceDriver.cpp derives from IOCINFRA.dbd
+IOCINFRA_SRCS += bronkhorstFloat.c 
+IOCINFRA_SRCS += drvAsynKeithley648x.cpp
+IOCINFRA_SRCS += IOCINFRA_registerRecordDeviceDriver.cpp
+
+# Build the main IOC entry point on workstation OSs.
+IOCINFRA_SRCS_DEFAULT += IOCINFRAMain.cpp
+IOCINFRA_SRCS_vxWorks += -nil-
+
+# Add support from base/src/vxWorks if needed
+#IOCINFRA_OBJS_vxWorks += $(EPICS_BASE_BIN)/vxComLibrary
+
+# Finally link to the EPICS Base libraries
+IOCINFRA_LIBS += $(EPICS_BASE_IOC_LIBS)
+
+#===========================
+
+include $(TOP)/configure/RULES
+#----------------------------------------
+#  ADD RULES AFTER THIS LINE
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/src/bronkhorstFloat.c	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,40 @@
+/*
+ * readFloat.c
+ *
+ *  Created on: Mar 20, 2014
+ *      Author: user
+ */
+
+#include <stdio.h>
+#include <aSubRecord.h>
+#include <registryFunction.h>
+#include <epicsExport.h>
+
+static int readFloat(aSubRecord *precord)
+{
+	/*
+	 * Long variable in precord->a field, needs to reinterpreted as a float
+	 * and stored to the output value field precord->vala
+	 */
+	*((float *)precord->vala) = *((float *)precord->a);
+
+	return 0;
+}
+
+static int writeFloat(aSubRecord *precord)
+{
+	/*
+	 * Float variable in precord->a field, needs to reinterpreted as a long
+	 * and stored to the output value field precord->vala
+	 */
+	*((long *)precord->vala) = *((long *)precord->a);
+
+	return 0;
+}
+
+
+epicsRegisterFunction(readFloat);
+epicsRegisterFunction(writeFloat);
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/src/bronkhorstFloat.dbd	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,2 @@
+function(readFloat)
+function(writeFloat)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/src/drvAsynKeithley648x.cpp	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,1339 @@
+/*
+ Description
+    This module provides support for a multiple device port driver. To
+    initialize the driver, the method drvAsynKeithley6485() is called from the
+    startup script with the following calling sequence.
+
+        drvAsynKeithley6485(myport,ioport,ioaddr)
+
+        Where:
+            myport - Keithley6485 Asyn interface port driver name (i.e. "EP0" )
+            ioport - Communication port driver name (i.e. "S0" )
+            ioaddr - Communication port device addr
+
+    The method dbior can be called from the IOC shell to display the current
+    status of the driver.
+*/
+
+
+/* System related include files */
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+/* EPICS system related include files */
+#include <iocsh.h>
+#include <epicsStdio.h>
+#include <cantProceed.h>
+#include <epicsString.h>
+#include <epicsExport.h>
+#include <errlog.h>
+
+/* EPICS synApps/Asyn related include files */
+#include <asynDriver.h>
+#include <asynDrvUser.h>
+#include <asynInt32.h>
+#include <asynFloat64.h>
+#include <asynOctet.h>
+#include <asynOctetSyncIO.h>
+#include <asynStandardInterfaces.h>
+
+/* Define symbolic constants */
+#define TIMEOUT         (5.0)
+#define BUFFER_SIZE     (100)
+
+
+typedef enum {Octet=1, Float64=2, Int32=3} Type;
+
+static const char *driver = "drvAsynKeithley648x";      /* String for asynPrint */
+
+
+/* Declare port driver structure */
+struct Port
+{
+  int devtype; // 1:6485, 2:6487
+  char* myport;
+  char* ioport;
+  int ioaddr;
+
+  int init; // really needed??
+
+  char model[BUFFER_SIZE+1], *serial, *dig_rev, *disp_rev, *brd_rev;
+
+  struct
+  {
+    int ioErrors;
+    int writeReads;
+    int writeOnlys;
+  } stats;
+
+  struct
+  {
+    double reading;
+    int timestamp;
+    union 
+    {
+      int raw;
+      struct 
+      {
+        unsigned int overflow             : 1;
+        unsigned int filter_enabled       : 1;
+        unsigned int math_enabled         : 1;
+        unsigned int null_enabled         : 1;
+        unsigned int limit_test           : 1;
+        unsigned int limit_result         : 2;
+        unsigned int overvoltage          : 1;
+        unsigned int padding              : 1;
+        unsigned int zero_check_enabled   : 1;
+        unsigned int zero_correct_enabled : 1;
+      } bits;
+    } status;
+    /* 
+       Bits:
+       0 (OFLO)   — Set to 1 if measurement performed while in over-range 
+                    (overflowed reading).
+       1 (Filter) — Set to 1 when measurement performed with the averaging 
+                    filter enabled.
+       2 (Math)   — Set to 1 when measurement performed with CALC1 enabled.
+       3 (Null)   — Set to 1 if null for CALC2 is enabled.
+       4 (Limits) — Set to 1 if a limit test (CALC2) is enabled.
+       5 & 6 (Limit Results) — Provides limit test results:
+                Bit 6    Bit 5   
+                  0        0      All limit tests passed
+                  0        1      CALC2:LIM1 test failed
+                  1        0      CALC2:LIM2 test failed
+       7 (Overvoltage)  — Set to 1 if measurement performed with an 
+                          overvoltage condition on the input.
+       9 (Zero Check)   — Set to 1 when zero check is enabled.
+      10 (Zero Correct) — Set to 1 when zero correct is enabled.
+    */
+    int eom;
+  } data;
+
+  /* Asyn info */
+  asynUser *pasynUser;
+  asynUser *pasynUserTrace;  /* asynUser for asynTrace on this port */
+  asynStandardInterfaces asynStdInterfaces;
+};
+
+
+struct Command
+{
+  const char *tag;
+  int dev;
+  int type;
+  int id;
+};
+
+
+/* Declare command structure */
+struct GenCommand
+{
+  asynStatus (*readFunc)(int which, Port *pport, void* data, Type Iface, 
+                         size_t *length, int *eom);
+  asynStatus (*writeFunc)(int which, Port *pport, void* data, Type Iface);
+};
+
+struct SimpleCommand
+{
+  int type;
+  const char *cmd_str;
+};
+
+/* Public interface forward references */
+int drvAsynKeithley648x(const char* myport,const char* ioport, int ioaddr);
+
+
+/* Forward references for asynCommon methods */
+static void report(void* ppvt,FILE* fp,int details);
+static asynStatus connect(void* ppvt,asynUser* pasynUser);
+static asynStatus disconnect(void* ppvt,asynUser* pasynUser);
+static asynCommon ifaceCommon = {report,connect,disconnect};
+
+/* Forward references for asynDrvUser methods */
+static asynStatus create(void* ppvt,asynUser* pasynUser,const char* drvInfo,
+                         const char** pptypeName,size_t* psize);
+static asynStatus destroy(void* ppvt,asynUser* pasynUser);
+static asynStatus gettype(void* ppvt,asynUser* pasynUser,
+                          const char** pptypeName,size_t* psize);
+static asynDrvUser ifaceDrvUser = {create,gettype,destroy};
+
+/* Forward references for asynFloat64 methods */
+static asynStatus readFloat64(void* ppvt,asynUser* pasynUser,
+                              epicsFloat64* value);
+static asynStatus writeFloat64(void* ppvt,asynUser* pasynUser,
+                               epicsFloat64 value);
+static asynFloat64 ifaceFloat64 = {writeFloat64, readFloat64};
+
+/* Forward references for asynInt32 methods */
+static asynStatus readInt32(void* ppvt,asynUser* pasynUser,epicsInt32* value);
+static asynStatus writeInt32(void* ppvt,asynUser* pasynUser,epicsInt32 value);
+static asynInt32 ifaceInt32 =  {writeInt32, readInt32};
+
+/* Forward references for asynOctet methods */
+static asynStatus flushOctet( void* ppvt, asynUser* pasynUser);
+static asynStatus writeOctet( void* ppvt, asynUser* pasynUser, const char *data,
+                              size_t numchars, size_t* nbytes);
+static asynStatus readOctet( void* ppvt, asynUser* pasynUser, char* data,
+                             size_t maxchars, size_t *nbytes, int *eom);
+static asynOctet ifaceOctet = { writeOctet, readOctet, flushOctet};
+
+
+/* Forward references for external asynOctet interface */
+static asynStatus writeOnly(Port* pport, const char* outBuf);
+static asynStatus writeRead(Port* pport, const char* outBuf, char* inpBuf,
+                            int inputSize, int *eomReason);
+
+
+static asynStatus readDummy(int which, Port *pport, void *data, Type Iface, 
+                            size_t *length, int *eom);
+static asynStatus writeDummy(int which, Port *pport, void* data, Type Iface);
+
+static asynStatus readSimpleData( int which, Port *pport, void *data, 
+                                  Type Iface, size_t *length, int *eom);
+static asynStatus writeSimpleData( int which, Port *pport, void *data, 
+                                   Type Iface);
+
+static asynStatus readCache(int which, Port *pport, void *data, 
+                            Type Iface, size_t *length, int *eom);
+
+static asynStatus readSensorReading(int which, Port *pport, void* data, 
+                                    Type Iface, size_t *length, int *eom);
+static asynStatus readRange(int which, Port *pport, void* data, 
+                            Type Iface, size_t *length, int *eom);
+static asynStatus writeRange(int which, Port *pport, void* data, Type Iface);
+static asynStatus readRate(int which, Port *pport, void* data, 
+                           Type Iface, size_t *length, int *eom);
+static asynStatus writeRate(int which, Port *pport, void* data, Type Iface);
+static asynStatus readVoltageSettings(int which, Port *pport, void* data, 
+                                            Type Iface, size_t *length, int *eom);
+static asynStatus writeVoltageSettings(int which, Port *pport, void* data, 
+                                              Type Iface);
+static asynStatus readCommon(int which, Port *pport, void* data, 
+                             Type Iface, size_t *length, int *eom);
+static asynStatus writeCommon(int which, Port *pport, void* data, Type Iface);
+
+
+
+
+// General commands that need special attention go here
+enum { VOID_CMD, READ_CMD, RANGE_CMD, RANGE_AUTO_ULIMIT_CMD, 
+       RANGE_AUTO_LLIMIT_CMD, RATE_CMD, DIGITAL_FILTER_CONTROL_CMD,
+       VOLTAGE_RANGE_CMD, VOLTAGE_CURRENT_LIMIT_CMD,      GEN_CMD_NUMBER };
+static GenCommand genCommandTable[GEN_CMD_NUMBER] = 
+  {
+    { readDummy,           writeDummy},     // VOID
+    { readSensorReading,   writeDummy},     // READ
+    { readRange,           writeRange},     // RANGE
+    { readRange,           writeRange},     // RANGE_AUTO_ULIMIT
+    { readRange,           writeRange},     // RANGE_AUTO_LLIMIT
+    { readRate,            writeRate},      // RATE
+    { readCommon,          writeCommon},    // DIGITAL_FILTER_CONTROL
+    { readVoltageSettings, writeVoltageSettings}, // VOLTAGE_RANGE_COMMAND
+    { readVoltageSettings, writeVoltageSettings}, // VOLTAGE_CURRENT_LIMIT_COMMAND
+  };
+
+// commands that are very simple-minded go here
+enum { RESET_CMD, RANGE_AUTO_CMD,
+       ZERO_CHECK_CMD, ZERO_CORRECT_CMD, ZERO_CORRECT_ACQUIRE_CMD, 
+       MEDIAN_FILTER_CMD, MEDIAN_FILTER_RANK_CMD, 
+       DIGITAL_FILTER_CMD, DIGITAL_FILTER_COUNT_CMD, 
+       VOLTAGE_CMD, VOLTAGE_STATE_CMD, VOLTAGE_10V_INTERLOCK_CMD, VOLTAGE_INTERLOCK_STATUS_CMD,
+       SIMPLE_CMD_NUMBER};
+
+enum { SIMPLE_TRIGGER=0, SIMPLE_OCTET=Octet, SIMPLE_FLOAT64=Float64, 
+       SIMPLE_INT32=Int32 };
+static SimpleCommand simpleCommandTable[SIMPLE_CMD_NUMBER] = 
+  {
+    { SIMPLE_TRIGGER, "*RST"},                // RESET DEVICE
+
+    { SIMPLE_INT32,   ":RANGE:AUTO"},         // RANGE_AUTO
+
+    { SIMPLE_INT32,   "SYST:ZCH"},            // ZERO CHECK
+    { SIMPLE_INT32,   "SYST:ZCOR"},           // ZERO CORRECT
+    { SIMPLE_TRIGGER, "SYST:ZCOR:ACQ"},       // ZERO CORRECT ACQUIRE
+
+    { SIMPLE_INT32,   "MED"},                 // MEDIAN FILTER
+    { SIMPLE_INT32,   "MED:RANK"},            // MEDIAN FILTER RANK
+
+    { SIMPLE_INT32,   "AVER"},                // DIGITAL FILTER
+    { SIMPLE_INT32,   "AVER:COUN"},           // DIGITAL FILTER COUNT
+
+    { SIMPLE_FLOAT64, "SOUR:VOLT"},           // VOLTAGE
+    { SIMPLE_INT32,   "SOUR:VOLT:STAT"},      // VOLTAGE STATE
+    { SIMPLE_INT32,   "SOUR:VOLT:INT"},       // VOLTAGE 10V INTERLOCK
+    { SIMPLE_INT32,   "SOUR:VOLT:INT:FAIL"},  // VOLTAGE INTERLOCK STATUS
+
+    // { SIMPLE_INT32,   "AVER:"},      // 
+    // { SIMPLE_INT32,   "AVER:"},      // 
+  };
+
+
+enum { TIMESTAMP_CMD, STATUS_RAW_CMD, STATUS_OVERFLOW_CMD, STATUS_FILTER_CMD, 
+       STATUS_MATH_CMD, STATUS_NULL_CMD, STATUS_LIMITS_CMD, 
+       STATUS_OVERVOLTAGE_CMD, STATUS_ZERO_CHECK_CMD, STATUS_ZERO_CORRECT_CMD,
+       MODEL_CMD, SERIAL_CMD, DIG_REV_CMD, DISP_REV_CMD, BRD_REV_CMD, 
+       CACHE_CMD_NUMBER };
+
+#define COMMAND_NUMBER (GEN_CMD_NUMBER + SIMPLE_CMD_NUMBER + CACHE_CMD_NUMBER)
+
+enum { CMD_GEN, CMD_SIMPLE, CMD_CACHE };
+enum { DEV_ALL, DEV_6485, DEV_6487};
+static Command commandTable[ COMMAND_NUMBER ] = 
+  {
+    { "VOID",                     DEV_ALL,  CMD_GEN,    VOID_CMD                     },
+    { "READ",                     DEV_ALL,  CMD_GEN,    READ_CMD                     },
+    { "RANGE",                    DEV_ALL,  CMD_GEN,    RANGE_CMD                    },
+    { "RANGE_AUTO_ULIMIT",        DEV_ALL,  CMD_GEN,    RANGE_AUTO_ULIMIT_CMD        },
+    { "RANGE_AUTO_LLIMIT",        DEV_ALL,  CMD_GEN,    RANGE_AUTO_LLIMIT_CMD        },
+    { "RATE",                     DEV_ALL,  CMD_GEN,    RATE_CMD                     },
+    { "DIGITAL_FILTER_CONTROL",   DEV_ALL,  CMD_GEN,    DIGITAL_FILTER_CONTROL_CMD   },
+    { "VOLTAGE_RANGE",            DEV_6487, CMD_GEN,    VOLTAGE_RANGE_CMD            },
+    { "VOLTAGE_CURRENT_LIMIT",    DEV_6487, CMD_GEN,    VOLTAGE_CURRENT_LIMIT_CMD    },
+    { "RESET",                    DEV_ALL,  CMD_SIMPLE, RESET_CMD                    },
+    { "RANGE_AUTO",               DEV_ALL,  CMD_SIMPLE, RANGE_AUTO_CMD               },
+    { "ZERO_CHECK",               DEV_ALL,  CMD_SIMPLE, ZERO_CHECK_CMD               },
+    { "ZERO_CORRECT",             DEV_ALL,  CMD_SIMPLE, ZERO_CORRECT_CMD             },
+    { "ZERO_CORRECT_ACQUIRE",     DEV_ALL,  CMD_SIMPLE, ZERO_CORRECT_ACQUIRE_CMD     },
+    { "MEDIAN_FILTER",            DEV_ALL,  CMD_SIMPLE, MEDIAN_FILTER_CMD            },
+    { "MEDIAN_FILTER_RANK",       DEV_ALL,  CMD_SIMPLE, MEDIAN_FILTER_RANK_CMD       },
+    { "DIGITAL_FILTER",           DEV_ALL,  CMD_SIMPLE, DIGITAL_FILTER_CMD           },
+    { "DIGITAL_FILTER_COUNT",     DEV_ALL,  CMD_SIMPLE, DIGITAL_FILTER_COUNT_CMD     },
+    { "VOLTAGE",                  DEV_6487, CMD_SIMPLE, VOLTAGE_CMD                  },
+    { "VOLTAGE_STATE",            DEV_6487, CMD_SIMPLE, VOLTAGE_STATE_CMD            },
+    { "VOLTAGE_TENV_INTERLOCK",   DEV_6487, CMD_SIMPLE, VOLTAGE_10V_INTERLOCK_CMD    },
+    { "VOLTAGE_INTERLOCK_STATUS", DEV_6487, CMD_SIMPLE, VOLTAGE_INTERLOCK_STATUS_CMD },
+    { "MODEL",                    DEV_ALL,  CMD_CACHE,  MODEL_CMD                    },
+    { "SERIAL",                   DEV_ALL,  CMD_CACHE,  SERIAL_CMD                   },
+    { "DIG_REV",                  DEV_ALL,  CMD_CACHE,  DIG_REV_CMD                  },
+    { "DISP_REV",                 DEV_ALL,  CMD_CACHE,  DISP_REV_CMD                 },
+    { "BRD_REV",                  DEV_ALL,  CMD_CACHE,  BRD_REV_CMD                  },
+    { "TIMESTAMP",                DEV_ALL,  CMD_CACHE,  TIMESTAMP_CMD                },
+    { "STATUS_RAW",               DEV_ALL,  CMD_CACHE,  STATUS_RAW_CMD               },
+    { "STATUS_OVERFLOW",          DEV_ALL,  CMD_CACHE,  STATUS_OVERFLOW_CMD          },
+    { "STATUS_FILTER",            DEV_ALL,  CMD_CACHE,  STATUS_FILTER_CMD            },
+    { "STATUS_MATH",              DEV_ALL,  CMD_CACHE,  STATUS_MATH_CMD              },
+    { "STATUS_NULL",              DEV_ALL,  CMD_CACHE,  STATUS_NULL_CMD              },
+    { "STATUS_LIMITS",            DEV_ALL,  CMD_CACHE,  STATUS_LIMITS_CMD            },
+    { "STATUS_OVERVOLTAGE",       DEV_ALL,  CMD_CACHE,  STATUS_OVERVOLTAGE_CMD       },
+    { "STATUS_ZERO_CHECK",        DEV_ALL,  CMD_CACHE,  STATUS_ZERO_CHECK_CMD        },
+    { "STATUS_ZERO_CORRECT",      DEV_ALL,  CMD_CACHE,  STATUS_ZERO_CORRECT_CMD      },
+  };
+
+
+
+/****************************************************************************
+ * Define public interface methods
+ ****************************************************************************/
+int drvAsynKeithley648x(const char *type, const char *myport,
+                        const char *ioport, int ioaddr)
+{
+  int status = asynSuccess;
+  Port* pport;
+  //  int i;
+  asynStandardInterfaces *pInterfaces;
+
+  char inpBuf[BUFFER_SIZE];
+  int eomReason;
+
+  pport = (Port*)callocMustSucceed(1,sizeof(Port),"drvAsynKeithley6485");
+  pport->myport = epicsStrDup(myport);
+  pport->ioport = epicsStrDup(ioport);
+  pport->ioaddr = ioaddr;
+
+  pport->devtype = DEV_ALL;
+  if( !strcmp("6485", type))
+    pport->devtype = DEV_6485;
+  if( !strcmp("6487", type))
+    pport->devtype = DEV_6487;
+  if(pport->devtype == DEV_ALL) // DEV_ALL is not a real device
+    {
+      errlogPrintf("%s::drvAsynKeithley6485 type has to be "
+                   "either \'6485\' or \'6487\'.\n", driver);
+      return asynError;
+    }
+
+
+  status = pasynOctetSyncIO->connect(ioport,ioaddr,&pport->pasynUser,NULL);
+  if (status != asynSuccess)
+    {
+      errlogPrintf("%s::drvAsynKeithley6485 port %s can't connect "
+                   "to asynCommon on Octet server %s address %d.\n",
+                   driver, myport, ioport, ioaddr);
+      return asynError;
+    }
+
+  /* Create asynUser for asynTrace */
+  pport->pasynUserTrace = pasynManager->createAsynUser(0, 0);
+  pport->pasynUserTrace->userPvt = pport;
+
+  status = pasynManager->registerPort(myport,ASYN_CANBLOCK,1,0,0);
+  if( status != asynSuccess) 
+    {
+      errlogPrintf("%s::drvAsynKeithley6485 port %s can't register port\n",
+                   driver, myport);
+      return asynError;
+    }
+
+  pInterfaces = &pport->asynStdInterfaces;
+    
+  /* Initialize interface pointers */
+  pInterfaces->common.pinterface    = (void *)&ifaceCommon;
+  pInterfaces->drvUser.pinterface   = (void *)&ifaceDrvUser;
+  pInterfaces->octet.pinterface     = (void *)&ifaceOctet;
+  pInterfaces->int32.pinterface     = (void *)&ifaceInt32;
+  pInterfaces->float64.pinterface   = (void *)&ifaceFloat64;
+
+  status = pasynStandardInterfacesBase->initialize(myport, pInterfaces,
+                                                   pport->pasynUserTrace, 
+                                                   pport);
+  if (status != asynSuccess) 
+    {
+      errlogPrintf("%s::drvAsynKeithley6485 port %s"
+                   " can't register standard interfaces: %s\n",
+                   driver, myport, pport->pasynUserTrace->errorMessage);
+      return asynError;
+    }
+
+#ifdef vxWorks
+  /* Send a sacrificial clear status to vxworks device (i.e. VME)*/
+  /* This fixes a problem with *IDN? call when starting from a cold boot */
+  /* with the SBS IP-Octal hardware. */
+  if( writeOnly(pport,"") )
+    {
+      errlogPrintf("%s::drvAsynKeithley6485 port %s failed to write\n",
+                   driver, myport);
+      return asynError;
+    }
+#endif
+
+  /* Reset device */
+  if( writeOnly(pport,"*CLS") )
+    {
+      errlogPrintf("%s::drvAsynKeithley6485 port %s failed to clear\n",
+                   driver, myport);
+      return asynError;
+    }
+  
+
+  /* Identification query */
+  if( writeRead(pport,"*IDN?",inpBuf,sizeof(inpBuf),&eomReason) )
+    {
+      errlogPrintf("%s::drvAsynKeithley6485 port %s failed to "
+                   "acquire identification\n", driver, myport);
+      return asynError;
+    }
+  strcpy(pport->model,inpBuf);
+  // char *model, *serial, *dig_rev, *disp_rev, *brd_rev;
+  pport->serial = strchr( pport->model, ',');
+  pport->serial = strchr( pport->serial + 1, ',');
+  *(pport->serial) = '\0';
+  pport->serial++;
+  pport->dig_rev = strchr( pport->serial, ',');
+  *(pport->dig_rev) = '\0';
+  pport->dig_rev++;
+  pport->disp_rev = strchr( pport->dig_rev, '/');
+  *(pport->disp_rev) = '\0';
+  pport->disp_rev++;
+  pport->brd_rev = strchr( pport->disp_rev, '/');
+  *(pport->brd_rev) = '\0';
+  pport->brd_rev++;
+  
+  /* Complete initialization */
+  pport->init=1;
+
+  pport->data.reading = 0.0;
+  pport->data.timestamp = 0;
+  pport->data.status.raw = 0;
+
+  return asynSuccess;
+}
+
+
+
+
+/****************************************************************************
+ * Define private read and write parameter methods
+ ****************************************************************************/
+
+static asynStatus readDummy(int which, Port *pport, void *data, Type Iface, 
+                            size_t *length, int *eom)
+{
+  return asynSuccess;
+}
+
+static asynStatus writeDummy(int which, Port *pport, void *data, Type Iface)
+{
+  return asynSuccess;
+}
+
+///
+
+static asynStatus readSimpleData( int which, Port *pport, void *data, 
+                                  Type Iface, size_t *length, int *eom)
+{
+  asynStatus status;
+  char outBuf[BUFFER_SIZE];
+  char inpBuf[BUFFER_SIZE];
+
+  int len;
+
+  // Trigger will automatically not work
+  if( simpleCommandTable[which].type != Iface)
+    return asynSuccess;
+
+  sprintf( outBuf, "%s?", simpleCommandTable[which].cmd_str);
+    
+  status = writeRead( pport, outBuf, inpBuf, BUFFER_SIZE, &pport->data.eom);
+  if( status != asynSuccess)
+    return status;
+
+  switch( Iface)
+    {
+    case Float64:
+      *((epicsFloat64 *) data) = atof(inpBuf);
+      break;
+    case Int32:
+      *((epicsInt32 *) data) = atoi(inpBuf);
+      break;
+    case Octet:
+      len = strlen( inpBuf);
+      if( len > 39)
+        inpBuf[39] = '\0';
+      strcpy( (char *) data, inpBuf);
+      break;
+    }
+
+  return asynSuccess;
+}
+
+static asynStatus writeSimpleData( int which, Port *pport, void *data, 
+                                    Type Iface)
+{
+  char outBuf[BUFFER_SIZE];
+  
+  if( simpleCommandTable[which].type == SIMPLE_TRIGGER )
+    sprintf( outBuf, "%s", simpleCommandTable[which].cmd_str);
+  else
+    {
+      if( simpleCommandTable[which].type != Iface )
+        return asynSuccess;
+      
+      switch( simpleCommandTable[which].type & Iface)
+        {
+        case Float64:
+          sprintf( outBuf, "%s %g", simpleCommandTable[which].cmd_str, 
+                   *((epicsFloat64*) data) );
+          break;
+        case Int32:
+          sprintf( outBuf, "%s %d", simpleCommandTable[which].cmd_str, 
+                   *((epicsInt32*) data) );
+          break;
+        case Octet:
+          sprintf( outBuf, "%s %s", simpleCommandTable[which].cmd_str, 
+                   ((char *) data) );
+          break;
+        }
+    }
+
+  return writeOnly( pport, outBuf);
+}
+
+////
+
+static asynStatus readCache(int which, Port *pport, void *data, 
+                            Type Iface, size_t *length, int *eom)
+{
+  char *char_cache = NULL;
+  int len;
+
+  switch( Iface)
+    {
+    case Octet:
+      switch(which)
+        {
+        case MODEL_CMD:
+          char_cache = pport->model;
+          break;
+        case SERIAL_CMD:
+          char_cache = pport->serial;
+          break;
+        case DIG_REV_CMD:
+          char_cache = pport->dig_rev;
+          break;
+        case DISP_REV_CMD:
+          char_cache = pport->disp_rev;
+          break;
+        case BRD_REV_CMD:
+          char_cache = pport->brd_rev;
+          break;
+        }
+      len = strlen(char_cache);
+      if( len < 40)
+        strcpy( (char *) data, char_cache);
+      else // just in case string will overflow the EPICS string size of 40
+        {
+          len = 39;
+          memcpy( (char *) data, char_cache, len);
+          ((char *) data)[len] = '\0';
+        }
+      *length = len;
+      *eom = 0;
+      break;
+    case Float64:
+    //   switch( which)
+    //     {
+    //     }
+      break;
+    case Int32:
+      switch( which)
+        {
+        case TIMESTAMP_CMD:
+          *(epicsInt32*)data = pport->data.timestamp;
+          break;  
+        case STATUS_RAW_CMD:
+          *(epicsInt32*) data = pport->data.status.raw;
+          break;
+        case STATUS_OVERFLOW_CMD:
+          *(epicsInt32*) data = pport->data.status.bits.overflow;
+          break;
+        case STATUS_FILTER_CMD:
+          *(epicsInt32*) data = pport->data.status.bits.filter_enabled;
+          break;
+        case STATUS_MATH_CMD:
+          *(epicsInt32*) data = pport->data.status.bits.math_enabled;
+          break;
+        case STATUS_NULL_CMD:
+          *(epicsInt32*) data = pport->data.status.bits.null_enabled;
+          break;
+        case STATUS_LIMITS_CMD:
+          if( pport->data.status.bits.limit_test)
+            *(epicsInt32*) data = pport->data.status.bits.limit_result;
+          else
+            *(epicsInt32*) data = 3;
+          break;
+        case STATUS_OVERVOLTAGE_CMD:
+          *(epicsInt32*) data = pport->data.status.bits.overvoltage;
+          break;
+        case STATUS_ZERO_CHECK_CMD:
+          *(epicsInt32*) data = pport->data.status.bits.zero_check_enabled;
+          break;
+        case STATUS_ZERO_CORRECT_CMD:
+          *(epicsInt32*) data = pport->data.status.bits.zero_correct_enabled;
+          break;
+        }
+      break;
+    }
+
+  return asynSuccess;
+}
+
+
+static asynStatus readSensorReading(int which, Port *pport, void *data, 
+                                    Type Iface, size_t *length, int *eom)
+{
+  asynStatus status;
+  char inpBuf[BUFFER_SIZE];
+
+  char *str, *token[3], *saveptr;
+  int pass;
+
+  status = writeRead( pport, "READ?", inpBuf, BUFFER_SIZE, &pport->data.eom);
+  if( status != asynSuccess)
+    return status;
+
+  str = inpBuf;
+  for( pass = 0; pass < 3; pass++, str = NULL)
+    {
+      token[pass] = epicsStrtok_r(str, ",", &saveptr);
+      if (token == NULL)
+        break;
+    }
+  if( pass != 3)
+    return asynError;
+
+  pport->data.reading = atof( token[0]);
+  pport->data.timestamp = (int) atof( token[1]);
+  pport->data.status.raw = (int) atof( token[2]);
+
+  switch( Iface )
+    {
+    case Octet:
+      // only print current value
+      *length = sprintf( (char *) data, "%s", token[0]);
+      *eom = pport->data.eom;
+      break;
+    case Float64:
+      *(epicsFloat64*)data = pport->data.reading;
+      break;
+    case Int32:
+      break;
+    }
+
+  return asynSuccess;
+}
+
+static asynStatus readRange(int which, Port *pport, void *data, 
+                            Type Iface, size_t *length, int *eom)
+{
+  asynStatus status;
+  char inpBuf[BUFFER_SIZE];
+
+  if( Iface == Octet)
+    return asynSuccess;
+
+  switch( which)
+    {
+    case RANGE_CMD:
+      status = writeRead( pport, ":RANGE?", inpBuf, BUFFER_SIZE, 
+                          &pport->data.eom);
+      break;
+    case RANGE_AUTO_ULIMIT_CMD:
+      status = writeRead( pport, ":RANGE:AUTO:ULIM?", inpBuf, BUFFER_SIZE, 
+                          &pport->data.eom);
+      break;
+    case RANGE_AUTO_LLIMIT_CMD:
+      status = writeRead( pport, ":RANGE:AUTO:LLIM?", inpBuf, BUFFER_SIZE, 
+                          &pport->data.eom);
+      break;
+    default:
+      return asynError;
+    }
+  if( status != asynSuccess)
+    return status;
+
+  if( Iface == Float64)
+    {
+      double val;
+
+      val = atof( inpBuf);
+      if( val == 0.0)
+        return asynError;
+
+      *(epicsFloat64*) data = val;
+    }
+  else if( Iface == Int32)
+    {
+      char *p;
+
+      p = strchr( inpBuf, 'E');
+      if(p == NULL)
+        return asynError;
+      p++;
+      *(epicsInt32*) data = 9 + atoi(p) ;
+    }
+
+  return asynSuccess;
+}
+
+
+static asynStatus writeRange( int which, Port *pport, void *data, Type Iface)
+{
+  char outBuf[BUFFER_SIZE];
+  int value;
+
+  if( Iface != Int32)
+    return asynSuccess;
+
+  value = *((epicsInt32*) data);
+  if( (value < 0) || (value > 7) )
+    return asynError;
+    
+  switch( which)
+    {
+    case RANGE_CMD:
+      sprintf( outBuf, ":RANGE 2.0e%d", -9 + value );
+      break;
+    case RANGE_AUTO_ULIMIT_CMD:
+      sprintf( outBuf, ":RANGE:AUTO:ULIM 2.0e%d", -9 + value );
+      break;
+    case RANGE_AUTO_LLIMIT_CMD:
+      sprintf( outBuf, ":RANGE:AUTO:LLIM 2.0e%d", -9 + value );
+      break;
+    default:
+      return asynError;
+    }
+
+  return writeOnly( pport, outBuf);
+}
+
+
+static asynStatus readRate(int which, Port *pport, void *data, 
+                           Type Iface, size_t *length, int *eom)
+{
+  asynStatus status;
+  char inpBuf[BUFFER_SIZE];
+
+  double val;
+  int rate;
+
+  if( Iface != Int32)
+    return asynSuccess;
+
+  status = writeRead( pport, ":NPLC?", inpBuf, BUFFER_SIZE, &pport->data.eom);
+  if( status != asynSuccess)
+    return status;
+
+  val = atof( inpBuf);
+  if( val > 1.0)
+    rate = 0; // SLOW
+  else if( val > 0.1)
+    rate = 1; // MEDIUM
+  else
+    rate = 2; // FAST
+  
+  *((epicsInt32*) data) = rate;
+
+  return asynSuccess;
+}
+
+
+static asynStatus writeRate( int which, Port *pport, void *data, Type Iface)
+{
+  char outBuf[BUFFER_SIZE];
+  int rate;
+  double val;
+
+  if( Iface != Int32)
+    return asynSuccess;
+
+  rate = *((epicsInt32*) data);
+  if( (rate < 0) || (rate > 2) )
+    return asynError;
+
+  switch( rate)
+    {
+    case 0:
+      val = 6.0;
+      break;
+    case 1:
+      val = 1.0;
+      break;
+    case 2:
+      val = 0.1;
+      break;
+    default:
+      val = 1.0;
+      break;
+    }
+
+  sprintf( outBuf, ":NPLC %g", val );
+  return writeOnly( pport, outBuf);
+}
+
+
+static asynStatus readVoltageSettings(int which, Port *pport, void *data, Type Iface, 
+                                      size_t *length, int *eom)
+{
+  asynStatus status;
+  char inpBuf[BUFFER_SIZE];
+
+  double val;
+
+  if(( which != VOLTAGE_RANGE_CMD) && ( which != VOLTAGE_CURRENT_LIMIT_CMD))
+    return asynError;
+  if( Iface == Octet)
+    return asynSuccess;
+
+  if( which == VOLTAGE_RANGE_CMD)
+    status = writeRead( pport, "SOUR:VOLT:RANGE?", inpBuf, BUFFER_SIZE, 
+                        &pport->data.eom);
+  else
+    status = writeRead( pport, "SOUR:VOLT:ILIM?", inpBuf, BUFFER_SIZE, 
+                        &pport->data.eom);
+  if( status != asynSuccess)
+    return status;
+
+  val = atof( inpBuf);
+  if( val == 0.0)
+    return asynError;
+
+  if( Iface == Float64)
+    {
+      *((epicsFloat64*) data) = val;
+    }
+  else if( Iface == Int32)
+    {
+      if( which == VOLTAGE_RANGE_CMD)
+        {
+          if( val == 10.0)
+            *((epicsInt32*) data) = 0;
+          else if( val == 50.0)
+            *((epicsInt32*) data) = 1;
+          else if( val == 500.0)
+            *((epicsInt32*) data) = 2;
+        }
+      else
+        {
+          if( val == 2.5e-5)
+            *((epicsInt32*) data) = 0;
+          else if( val == 2.5e-4)
+            *((epicsInt32*) data) = 1;
+          else if( val == 2.5e-3)
+            *((epicsInt32*) data) = 2;
+          else if( val == 2.5e-2)
+            *((epicsInt32*) data) = 3;
+        }
+    }
+
+  return asynSuccess;
+}
+
+
+static asynStatus writeVoltageSettings( int which, Port *pport, void *data, Type Iface)
+{
+  char outBuf[BUFFER_SIZE];
+  int value;
+
+  if(( which != VOLTAGE_RANGE_CMD) && ( which != VOLTAGE_CURRENT_LIMIT_CMD))
+    return asynError;
+  if( Iface != Int32)
+    return asynSuccess;
+
+  value = *((epicsInt32*) data);
+  if( which == VOLTAGE_RANGE_CMD) 
+    {
+      if( (value < 0) || (value > 2) )
+        return asynError;
+
+      if( value == 0)
+        value = 10;
+      else if( value == 1)
+        value = 50;
+      else 
+        value = 500;
+   
+      sprintf( outBuf, "SOUR:VOLT:RANGE %d", value );
+    }
+  else
+    {
+      if( (value < 0) || (value > 3) )
+        return asynError;
+
+      sprintf( outBuf, "SOUR:VOLT:ILIM 2.5e%d", value - 5 );
+    }
+
+  return writeOnly( pport, outBuf);
+}
+
+
+static asynStatus readCommon(int which, Port *pport, void *data, 
+                             Type Iface, size_t *length, int *eom)
+{
+  asynStatus status;
+  char inpBuf[BUFFER_SIZE];
+
+  int val = 0;
+
+  if( Iface != Int32)
+    return asynSuccess;
+
+  switch(which)
+    {
+    case DIGITAL_FILTER_CONTROL_CMD:
+      status = writeRead( pport, "AVER:TCON?", inpBuf, BUFFER_SIZE, 
+                          &pport->data.eom);
+
+      if( status != asynSuccess)
+        return status;
+      if( !strcmp( "MOV", inpBuf) )
+        val = 0;
+      else if( !strcmp( "REP", inpBuf) )
+        val = 1;
+      else
+        return asynError;
+      break;
+    }
+  
+  *((epicsInt32*) data) = val;
+
+  return asynSuccess;
+}
+
+
+static asynStatus writeCommon( int which, Port *pport, void *data, Type Iface)
+{
+  char outBuf[BUFFER_SIZE];
+  int val;
+
+  if( Iface != Int32)
+    return asynSuccess;
+
+  val = *((epicsInt32*) data);
+  switch( which)
+    {
+    case DIGITAL_FILTER_CONTROL_CMD:
+      if( !val)
+        sprintf( outBuf, "AVER:TCON MOV" );
+      else if(val == 1)
+        sprintf( outBuf, "AVER:TCON REP" );
+      else
+        return asynError;
+      break;
+    }
+
+  return writeOnly( pport, outBuf);
+}
+
+
+/****************************************************************************
+ * Define private interface asynCommon methods
+ ****************************************************************************/
+static void report(void* ppvt,FILE* fp,int details)
+{
+  //  int i;
+  Port* pport = (Port*)ppvt;
+
+  fprintf( fp, "Keithley648x port: %s\n", pport->myport);
+  if( details)
+    {
+      fprintf( fp, "    server:     %s\n", pport->ioport);
+      fprintf( fp, "    address:    %d\n", pport->ioaddr);
+      fprintf( fp, "    ioErrors:   %d\n", pport->stats.ioErrors);
+      fprintf( fp, "    writeReads: %d\n", pport->stats.writeReads);
+      fprintf( fp, "    writeOnlys: %d\n", pport->stats.writeOnlys);
+      fprintf( fp, "    support %s initialized\n",(pport->init)?"IS":"IS NOT");
+    }
+
+}
+
+static asynStatus connect(void* ppvt,asynUser* pasynUser)
+{
+  pasynManager->exceptionConnect(pasynUser);
+  return asynSuccess;
+}
+
+static asynStatus disconnect(void* ppvt,asynUser* pasynUser)
+{
+  pasynManager->exceptionDisconnect(pasynUser);
+  return asynSuccess;
+}
+
+
+/****************************************************************************
+ * Define private interface asynDrvUser methods
+ ****************************************************************************/
+static asynStatus create(void* ppvt, asynUser *pasynUser, const char *drvInfo, 
+                         const char **pptypeName, size_t *psize)
+{
+  Port* pport=(Port*)ppvt;
+  
+  int i;
+  
+  for(i = 0; i < COMMAND_NUMBER; i++) 
+    if( !epicsStrCaseCmp( drvInfo, commandTable[i].tag) ) 
+      {
+        if( (commandTable[i].dev != DEV_ALL) && 
+            (commandTable[i].dev != pport->devtype) )
+          {
+            errlogPrintf("%s::create port %s failed as tag %s is for different "
+                         "device\n", driver, pport->myport, drvInfo);
+            pasynUser->reason = 0;
+            return asynError;
+          }
+        pasynUser->reason = i;
+        break;
+      }
+  if( i == COMMAND_NUMBER ) 
+    {
+      errlogPrintf("%s::create port %s failed to find tag %s\n",
+                   driver, pport->myport, drvInfo);
+      pasynUser->reason = 0;
+      return asynError;
+    }
+  
+  return asynSuccess;
+}
+
+static asynStatus gettype(void* ppvt,asynUser* pasynUser,
+                          const char** pptypeName,size_t* psize)
+{
+  if( pptypeName ) 
+    *pptypeName = NULL;
+  if( psize ) 
+    *psize = 0;
+
+  return asynSuccess;
+}
+
+static asynStatus destroy(void* ppvt,asynUser* pasynUser)
+{
+  return asynSuccess;
+}
+
+
+/****************************************************************************
+ * Define private interface asynFloat64 methods
+ ****************************************************************************/
+static asynStatus writeFloat64(void* ppvt,asynUser* pasynUser,
+                               epicsFloat64 value)
+{
+  Port* pport=(Port*)ppvt;
+  int which = pasynUser->reason;
+
+  int id;
+  id = commandTable[which].id;
+
+  if( pport->init == 0) 
+    return asynError;
+
+   switch( commandTable[which].type )
+    {
+    case CMD_GEN:
+      return genCommandTable[id].writeFunc(id, pport, &value, Float64);
+      break;
+    case CMD_SIMPLE:
+      return writeSimpleData( id, pport, &value, Float64);
+      break;
+    }
+
+  return asynSuccess;
+}
+
+static asynStatus readFloat64(void* ppvt,asynUser* pasynUser,
+                              epicsFloat64* value)
+{
+  Port* pport=(Port*)ppvt;
+  int which = pasynUser->reason;
+
+  int id;
+  id = commandTable[which].id;
+
+  if( pport->init == 0) 
+    return asynError;
+
+  switch( commandTable[which].type )
+    {
+    case CMD_GEN:
+      return genCommandTable[id].readFunc(id, pport, value, Float64, 
+                                          NULL, NULL);
+      break;
+    case CMD_SIMPLE:
+      return readSimpleData( id, pport, value, Float64, NULL, NULL);
+      break;
+    case CMD_CACHE:
+      return readCache(id, pport, value, Float64, NULL, NULL);
+      break;
+    }
+
+  return asynSuccess;
+}
+
+
+/****************************************************************************
+ * Define private interface asynInt32 methods
+ ****************************************************************************/
+static asynStatus writeInt32(void *ppvt, asynUser *pasynUser, epicsInt32 value)
+{
+  Port* pport=(Port*)ppvt;
+  int which = pasynUser->reason;
+
+  int id;
+  id = commandTable[which].id;
+
+  if( pport->init == 0) 
+    return asynError;
+
+  switch( commandTable[which].type )
+    {
+    case CMD_GEN:
+      return genCommandTable[id].writeFunc(id, pport, &value, Int32);
+      break;
+    case CMD_SIMPLE:
+      return writeSimpleData( id, pport, (void *) &value, Int32);
+      break;
+    }
+  
+  return asynSuccess;
+}
+
+static asynStatus readInt32(void *ppvt, asynUser *pasynUser, epicsInt32 *value)
+{
+  Port* pport=(Port*)ppvt;
+  int which = pasynUser->reason;
+
+  int id;
+  id = commandTable[which].id;
+
+  if( pport->init == 0) 
+    return asynError;
+
+  switch( commandTable[which].type )
+    {
+    case CMD_GEN:
+      return genCommandTable[id].readFunc(id, pport, value, Int32, 
+                                          NULL, NULL);
+      break;
+    case CMD_SIMPLE:
+      return readSimpleData( id, pport, value, Int32, NULL, NULL);
+      break;
+    case CMD_CACHE:
+      return readCache(id, pport, value, Int32, NULL, NULL);
+      break;
+    }
+
+  return asynSuccess;
+}
+
+
+/****************************************************************************
+ * Define private interface asynOctet methods
+ ****************************************************************************/
+static asynStatus flushOctet(void *ppvt, asynUser* pasynUser)
+{
+  return asynSuccess;
+}
+
+static asynStatus writeOctet(void *ppvt, asynUser *pasynUser, const char *data,
+                             size_t numchars, size_t *nbytes)
+{
+  Port* pport=(Port*)ppvt;
+  int which = pasynUser->reason;
+
+  int id;
+  id = commandTable[which].id;
+
+  if( pport->init == 0) 
+    return asynError;
+
+  switch( commandTable[which].type )
+    {
+    case CMD_GEN:
+      *nbytes=strlen(data);
+      return genCommandTable[id].writeFunc(id, pport, (void *) data, Octet);
+      break;
+    case CMD_SIMPLE:
+      *nbytes=strlen(data);
+      return writeSimpleData( id, pport, &data, Octet);
+      break;
+    }
+  
+  return asynSuccess;
+}
+
+static asynStatus readOctet(void* ppvt, asynUser* pasynUser, char* data,
+                            size_t maxchars,size_t* nbytes,int* eom)
+{
+  Port* pport=(Port*)ppvt;
+  int which = pasynUser->reason;
+
+  int id;
+  id = commandTable[which].id;
+
+  if( pport->init == 0) 
+    return asynError;
+
+  switch( commandTable[which].type )
+    {
+    case CMD_GEN:
+      return genCommandTable[id].readFunc(id, pport, (void *) data, Octet, 
+                                          nbytes, eom);
+      break;
+    case CMD_SIMPLE:
+      return readSimpleData( id, pport, data, Octet, nbytes, eom);
+      break;
+    case CMD_CACHE:
+      return readCache(id, pport, (void *) data, Octet, nbytes, eom);
+      break;
+    }
+
+  return asynSuccess;
+}
+
+
+/****************************************************************************
+ * Define private Keithley648x external interface asynOctet methods
+ ****************************************************************************/
+static asynStatus writeOnly(Port *pport, const char *outBuf)
+{
+  asynStatus status;
+  size_t nActual, nRequested;
+
+  nRequested=strlen(outBuf);
+  status = 
+    pasynOctetSyncIO->write(pport->pasynUser,outBuf,nRequested,TIMEOUT,&nActual);
+  if( nActual!=nRequested ) 
+    status = asynError;
+
+  if( status!=asynSuccess )
+    {
+      pport->stats.ioErrors++;
+      asynPrint(pport->pasynUserTrace,ASYN_TRACE_ERROR, 
+                "%s writeOnly: error %d wrote \"%s\"\n",
+                pport->myport,status,outBuf);
+    }
+  else
+    pport->stats.writeOnlys++;
+
+  asynPrint(pport->pasynUserTrace, ASYN_TRACEIO_FILTER,
+            "%s writeOnly: wrote \"%s\"\n",
+            pport->myport,outBuf);
+
+  return status;
+}
+
+static asynStatus writeRead(Port *pport, const char *outBuf, char *inpBuf,
+                            int inputSize, int *eomReason)
+{
+  asynStatus status;
+  size_t nWrite, nRead, nWriteRequested;
+
+  nWriteRequested=strlen(outBuf);
+  status = pasynOctetSyncIO->writeRead(pport->pasynUser,outBuf,
+                                       nWriteRequested,inpBuf,inputSize-1,
+                                       TIMEOUT,&nWrite,&nRead,eomReason);
+  if( nWrite!=nWriteRequested ) 
+    status = asynError;
+
+  if( status!=asynSuccess )
+    {
+      pport->stats.ioErrors++;
+      asynPrint(pport->pasynUserTrace,ASYN_TRACE_ERROR,
+                "%s writeRead: error %d wrote \"%s\"\n",
+                pport->myport,status,outBuf);
+    }
+  else
+    {
+      inpBuf[nRead]='\0';
+      pport->stats.writeReads++;
+    }
+
+  asynPrint(pport->pasynUserTrace,ASYN_TRACEIO_FILTER,
+            "%s writeRead: wrote \"%s\" read \"%s\"\n",
+            pport->myport,outBuf,inpBuf);
+  
+  return status;
+}
+
+
+/****************************************************************************
+ * Register public methods
+ ****************************************************************************/
+ 
+/* Initialization method definitions */
+static const iocshArg arg0 = {"type",iocshArgString};
+static const iocshArg arg1 = {"myport",iocshArgString};
+static const iocshArg arg2 = {"ioport",iocshArgString};
+static const iocshArg arg3 = {"ioaddr",iocshArgInt};
+static const iocshArg* args[]= {&arg0,&arg1,&arg2,&arg3};
+static const iocshFuncDef drvAsynKeithley648xFuncDef = 
+  {"drvAsynKeithley648x",4,args};
+static void drvAsynKeithley648xCallFunc(const iocshArgBuf* args)
+{
+  drvAsynKeithley648x(args[0].sval,args[1].sval,args[2].sval,args[3].ival);
+}
+
+/* Registration method */
+static void drvAsynKeithley648xRegister(void)
+{
+  static int firstTime = 1;
+
+  if( firstTime )
+    {
+      firstTime = 0;
+      iocshRegister( &drvAsynKeithley648xFuncDef,drvAsynKeithley648xCallFunc );
+    }
+}
+epicsExportRegistrar( drvAsynKeithley648xRegister );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/IOCINFRAApp/src/drvAsynKeithley648x.dbd	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,2 @@
+# Keithley 6485/6487 picoammeter
+registrar(drvAsynKeithley648xRegister)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,35 @@
+# Makefile at top of application tree
+TOP = .
+include $(TOP)/configure/CONFIG
+
+# Directories to build, any order
+DIRS += configure
+DIRS += $(wildcard *Sup)
+DIRS += $(wildcard *App)
+DIRS += $(wildcard *Top)
+DIRS += $(wildcard iocBoot)
+
+# The build order is controlled by these dependency rules:
+
+# All dirs except configure depend on configure
+$(foreach dir, $(filter-out configure, $(DIRS)), \
+    $(eval $(dir)_DEPEND_DIRS += configure))
+
+# Any *App dirs depend on all *Sup dirs
+$(foreach dir, $(filter %App, $(DIRS)), \
+    $(eval $(dir)_DEPEND_DIRS += $(filter %Sup, $(DIRS))))
+
+# Any *Top dirs depend on all *Sup and *App dirs
+$(foreach dir, $(filter %Top, $(DIRS)), \
+    $(eval $(dir)_DEPEND_DIRS += $(filter %Sup %App, $(DIRS))))
+
+# iocBoot depends on all *App dirs
+iocBoot_DEPEND_DIRS += $(filter %App,$(DIRS))
+
+# Add any additional dependency rules here:
+
+include $(TOP)/configure/RULES_TOP
+
+all:
+	cp -rf iocBoot /epics/iocs/sys/infra
+	chmod a+x /epics/iocs/sys/infra/iocBoot/iocIOCINFRA/st.cmd
Binary file bin/linux-x86_64/IOCINFRA has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/CONFIG	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,29 @@
+# CONFIG - Load build configuration data
+#
+# Do not make changes to this file!
+
+# Allow user to override where the build rules come from
+RULES = $(EPICS_BASE)
+
+# RELEASE files point to other application tops
+include $(TOP)/configure/RELEASE
+-include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).Common
+ifdef T_A
+-include $(TOP)/configure/RELEASE.Common.$(T_A)
+-include $(TOP)/configure/RELEASE.$(EPICS_HOST_ARCH).$(T_A)
+endif
+
+CONFIG = $(RULES)/configure
+include $(CONFIG)/CONFIG
+
+# Override the Base definition:
+INSTALL_LOCATION = $(TOP)
+
+# CONFIG_SITE files contain other build configuration settings
+include $(TOP)/configure/CONFIG_SITE
+-include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).Common
+ifdef T_A
+ -include $(TOP)/configure/CONFIG_SITE.Common.$(T_A)
+ -include $(TOP)/configure/CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/CONFIG_SITE	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,43 @@
+# CONFIG_SITE
+
+# Make any application-specific changes to the EPICS build
+#   configuration variables in this file.
+#
+# Host/target specific settings can be specified in files named
+#   CONFIG_SITE.$(EPICS_HOST_ARCH).Common
+#   CONFIG_SITE.Common.$(T_A)
+#   CONFIG_SITE.$(EPICS_HOST_ARCH).$(T_A)
+
+# CHECK_RELEASE controls the consistency checking of the support
+#   applications pointed to by the RELEASE* files.
+# Normally CHECK_RELEASE should be set to YES.
+# Set CHECK_RELEASE to NO to disable checking completely.
+# Set CHECK_RELEASE to WARN to perform consistency checking but
+#   continue building even if conflicts are found.
+CHECK_RELEASE = YES
+
+# Set this when you only want to compile this application
+#   for a subset of the cross-compiled target architectures
+#   that Base is built for.
+#CROSS_COMPILER_TARGET_ARCHS = vxWorks-ppc32
+
+# To install files into a location other than $(TOP) define
+#   INSTALL_LOCATION here.
+INSTALL_LOCATION=/epics/iocs/sys/infra
+
+# Set this when the IOC and build host use different paths
+#   to the install location. This may be needed to boot from
+#   a Microsoft FTP server say, or on some NFS configurations.
+#IOCS_APPL_TOP = </IOC's/absolute/path/to/install/top>
+
+# For application debugging purposes, override the HOST_OPT and/
+#   or CROSS_OPT settings from base/configure/CONFIG_SITE
+#HOST_OPT = NO
+#CROSS_OPT = NO
+
+# These allow developers to override the CONFIG_SITE variable
+# settings without having to modify the configure/CONFIG_SITE
+# file itself.
+-include $(TOP)/../CONFIG_SITE.local
+-include $(TOP)/configure/CONFIG_SITE.local
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/Makefile	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,8 @@
+TOP=..
+
+include $(TOP)/configure/CONFIG
+
+TARGETS = $(CONFIG_TARGETS)
+CONFIGS += $(subst ../,,$(wildcard $(CONFIG_INSTALLS)))
+
+include $(TOP)/configure/RULES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/RELEASE	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,49 @@
+# RELEASE - Location of external support modules
+#
+# IF YOU CHANGE ANY PATHS in this file or make API changes to
+# any modules it refers to, you should do a "make rebuild" in
+# this application's top level directory.
+#
+# The EPICS build process does not check dependencies against
+# any files from outside the application, so it is safest to
+# rebuild it completely if any modules it depends on change.
+#
+# Host- or target-specific settings can be given in files named
+#  RELEASE.$(EPICS_HOST_ARCH).Common
+#  RELEASE.Common.$(T_A)
+#  RELEASE.$(EPICS_HOST_ARCH).$(T_A)
+#
+# This file is parsed by both GNUmake and an EPICS Perl script,
+# so it may ONLY contain definititions of paths to other support
+# modules, variable definitions that are used in module paths,
+# and include statements that pull in other RELEASE files.
+# Variables may be used before their values have been set.
+# Build variables that are NOT used in paths should be set in
+# the CONFIG_SITE file.
+
+# Variables and paths to dependent modules:
+#MODULES = /path/to/modules
+#MYMODULE = $(MODULES)/my-module
+SUPPORT=/opt/epics/SUPPORT
+#SSCAN=$(SUPPORT)/sscan
+CALC=$(SUPPORT)/calc
+BUSY=$(SUPPORT)/busy
+ASYN=$(SUPPORT)/asyn
+STREAM=$(SUPPORT)/stream
+IP=$(SUPPORT)/ip
+
+# If using the sequencer, point SNCSEQ at its top directory:
+SNCSEQ = $(SUPPORT)/seq-2.2.6
+
+# EPICS_BASE should appear last so earlier modules can override stuff:
+EPICS_BASE = /opt/epics/BASE/epics-base
+
+# Set RULES here if you want to use build rules from somewhere
+# other than EPICS_BASE:
+#RULES = $(MODULES)/build-rules
+
+# These lines allow developers to override these RELEASE settings
+# without having to modify this file directly.
+-include $(TOP)/../RELEASE.local
+-include $(TOP)/../RELEASE.$(EPICS_HOST_ARCH).local
+-include $(TOP)/configure/RELEASE.local
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/RULES	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,6 @@
+# RULES
+
+include $(CONFIG)/RULES
+
+# Library should be rebuilt because LIBOBJS may have changed.
+$(LIBNAME): ../Makefile
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/RULES.ioc	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,2 @@
+#RULES.ioc
+include $(CONFIG)/RULES.ioc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/RULES_DIRS	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,2 @@
+#RULES_DIRS
+include $(CONFIG)/RULES_DIRS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configure/RULES_TOP	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,3 @@
+#RULES_TOP
+include $(CONFIG)/RULES_TOP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/LS331.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,319 @@
+##################################################
+#
+# Protocol File
+#
+# Protocol file for Lakeshore 336
+# Diamond Light Source, June 2010
+#
+# Oak Ridge National Lab, UT-Battelle, 2013-2015.
+# Add more commands.
+# 
+##################################################
+
+# check check Lakeshore 331
+
+##################################################
+# General Settings
+##################################################
+
+Terminator = "\r\n";
+ReplyTimeout = 1000;
+
+
+###################################################
+# Get functions
+###################################################
+
+# /// Read the device ID
+getID {
+   out "*IDN?";
+   in "LSCI,%s";
+}
+
+# /// Read the model number
+getMODEL {
+   in "LSCI,%8c,%*15c,%*s";
+}
+
+# /// Read the serial number
+getSERIAL {
+   in "LSCI,%*8c,%15c,%*s";
+}
+
+# /// Read the device firmware number
+getFIRMWARE {
+   in "LSCI,%*8c,%*15c,%s";
+}
+
+# /// Read the heater status for output 1 or 2
+getHTR {
+   out "HTR? \$1";
+   in "%f";
+}
+
+# /// Read the analog output for output 3 or 4
+getAOUT {
+   out "AOUT? \$1";
+   in "%f";
+}
+
+# /// Read the setpoint for outputs 1-4
+getSETP {
+   out "SETP? \$1";
+   in "%f";
+}
+
+# /// Read the temperature in kelvin for inputs 1-4
+getKRDG {
+   out "KRDG? \$1";
+   in "%f";
+}
+
+# /// Read the voltage input for inputs 1-4
+getSRDG {
+   out "SRDG? \$1";
+   in "%f";
+}
+
+# /// Read the range parameter (power range) for outputs 1-4
+getRANGE {
+   out "RANGE? \$1";
+   in "%d";
+}
+
+# /// Read the ramp value and status for outputs 1-4
+# /// The first parameter is the output number.
+# /// The second parameter is the ramp status record.
+getRAMP {
+   out "RAMP? \$1";
+   in "%(\$2)d,%f";
+}
+
+# /// Read the ramp status for outputs 1-4
+getRAMPSTATUS {
+   out "RAMP? \$1";
+   in "%d,%*f";
+}
+
+# /// Read the manual output value for outputs 1-4
+getMOUT {
+   out "MOUT? \$1";
+   in "%f";
+}
+
+# /// Read the PID params into 3 records using one write/read.
+# /// The first argument is the output number. The second and third are
+# /// the I and D records.
+getPID {
+   out "PID? \$1";
+   in "%f,%(\$2:\$3)f,%(\$2:\$4)f";
+}
+
+# /// Combine getOUTMODEMODE, getOUTMODEINPUT and getOUTMODEPE into one function.
+# /// The first argument is the output number.
+# /// The second argument is the PV prefix.
+# /// The third argument is the output mode intput record (suffix only).
+# /// The fourth argument is the output mode powerup enable record (suffix only).
+getOM {
+  out "OUTMODE? \$1";
+  in "%d,%(\$2:\$3)d,%(\$2:\$4)d";
+}
+
+# /// Read the output mode mode status for outputs 1-4
+# /// 0=Off
+# /// 1=Closed Loop PID
+# /// 2=Zone
+# /// 3=Open Loop
+# /// 4=Monitor Out
+# /// 5=Warm Up Supply
+getOUTMODEMODE {
+   out "OUTMODE? \$1";
+   in "%d,%*d,%*d";
+}
+
+# /// Read the output mode input for outputs 1-4
+# /// 0=None
+# /// 1=A
+# /// 2=B
+# /// 3=C
+# /// 4=D
+getOUTMODEINPUT {
+   out "OUTMODE? \$1";
+   in "%*d,%d,%*d";
+}
+
+# /// Read the output mode power up enable for outputs 1-4
+# /// 0=Off
+# /// 1=On
+getOUTMODEPE {
+   out "OUTMODE? \$1";
+   in "%*d,%*d,%d";
+}
+
+
+# /// Read the tuning status
+getTUNEST {
+   out "TUNEST?";
+   in "%s";
+}
+
+# /// Read the tuning status success param
+getTUNESTSUCCESS {
+   out "TUNEST?";
+   in "%*d,%*d,%d,%*d";
+}
+
+# /// Read the ZONE parameters (this is read into a waveform)
+getZONE {
+   out "ZONE? \$1,\$2";
+   separator=",";
+   in "%f";
+}
+
+# /// Read the input sensor name
+getINNAME {
+   out "INNAME? \$1";
+   in "%#s";
+}
+
+
+# /// Read the alarm status
+# /// The first param is the input number, the second is the alarm low record.
+getALARMST {
+   out "ALARMST? \$1";
+   in "%d,%(\$2)d"
+}
+
+# /// Read the alarm params. I put the ends of the PV names here
+# /// to make the initial record INP link short.
+getALARM {
+   out "ALARM? \$1";
+   in "%(\$2.A)d,%(\$2.B)f,%(\$2.C)f,%(\$2.D)f,%(\$2.E)d,%(\$2.F)d,%(\$2.G)d"
+}
+
+# /// Read the input reading status
+getRDGST {
+   out "RDGST? \$1";
+   in "%d"
+}
+
+# /// Read the heater status for outputs 1 or 2
+getHTRST {
+   out "HTRST? \$1";
+   in "%d"
+}
+
+# /// Read the input curve number
+getINCRV {
+   out "INCRV? \$1";
+   in "%d"
+}
+
+# /// Read the input curve header.
+# /// The first argument is the curve number record (also prefix for other record names).
+# /// The second argument is the curve name record (suffix only).
+# /// The third argument is the curve serial number record (suffix only).
+# /// The fourth argument is the curve data format record (suffix only).
+# /// The fifth argument is the curve temperature limit record (suffix only).
+# /// The sixth argument is the curve temperature coefficient record (suffix only).
+getCRVHDR {
+	out "CRVHDR? %(\$1:\$2)d";
+	in "%(\$1:\$3.AA)15c,%(\$1:\$3.BB)10c,%(\$1:\$3.A)d,%(\$1:\$3.B)f,%(\$1:\$3.C)d"
+}
+
+# /// Read the input type params. I put the ends of the PV names here
+# /// to make the initial record INP link short.
+getINTYPE {
+   out "INTYPE? \$1";
+   in "%(\$2.A)d,%(\$2.B)d,%(\$2.C)d,%(\$2.D)d,%(\$2.E)d"
+}
+
+
+#######################################################
+# Set functions
+#######################################################
+
+# /// Set the setpoint for outputs 1-4
+setSETP {
+   out "SETP \$1,%f";
+   @init { getSETP; }
+}
+
+# /// Set the range parameter for outputs 1-4
+setRANGE {
+   out "RANGE \$1,%d";
+   @init { getRANGE; }
+}
+
+# /// Set the ramp parameter for loops 1-2
+#Need to pass in the PV name for the getRAMPSTATUS protocol.
+setRAMP {
+   out "RAMP \$2,%(\$1.VAL)d,%f";
+   @init { out "RAMP? \$2"; in "%*d,%f"; }
+}
+
+# /// Set the ramp status for loops 1-2
+#Need to pass in the PV name for the getRAMP protocol.
+setRAMPSTATUS {
+   out "RAMP \$2,%d,%(\$1.VAL)f";
+   @init { out "RAMP? \$2"; in "%d,%*f"; }
+}
+
+# /// Set the manual output value for outputs 1-4
+setMOUT {
+   out "MOUT \$1,%f";
+   @init { getMOUT; }
+}
+
+# /// Set the PID P parameter for outputs 1-4
+setP {
+   out "PID \$1,%f,%(\$2:\$3)f,%(\$2:\$4)f";
+   @init { out "PID? \$1"; in "%f,%*f,%*f"; }
+}
+
+# /// Set the PID I parameter for outputs 1-4
+setI {
+   out "PID \$1,%(\$2:\$3)f,%f,%(\$2:\$4)f";
+   @init { out "PID? \$1"; in "%*f,%f,%*f"; }
+}
+
+# /// Set the PID D parameter for outputs 1-4
+setD {
+   out "PID \$1,%(\$2:\$3)f,%(\$2:\$4)f,%f";
+   @init { out "PID? \$1"; in "%*f,%*f,%f"; }
+}
+
+# /// Set the output mode [loop],[mode],[input],[power up enable]
+setOM {
+  out "OUTMODE \$1,%d,%(\$2:\$3)d,%(\$2:\$4)d";
+  @init { out "OUTMODE? \$1"; in "%d,%*d,%*d";}
+}
+
+# /// Set the output mode input [loop],[mode],[input],[power up enable]
+setOMI {
+  out "OUTMODE \$1,%(\$2:\$3)d,%d,%(\$2:\$4)d";
+  @init { out "OUTMODE? \$1"; in "%*d,%d,%*d";}
+}
+
+# /// Set the output mode power up enable [loop],[mode],[input],[power up enable]
+setOMP {
+  out "OUTMODE \$1,%(\$2:\$3)d,%(\$2:\$4)d,%d";
+  @init { out "OUTMODE? \$1"; in "%*d,%*d,%d";}
+}
+
+
+# /// Start the auto tune process.
+setATUNE {
+   out "ATUNE \$1,%(\$2.VAL)d";
+}
+
+# /// Set the ZONE parameters
+setZONE {
+  out "ZONE \$1,\$2,%(A)f,%(B)f,%(C)f,%(D)f,%(E)f,%(F)d,%(G)d,%(H)f";
+}
+
+# /// Set the input sensor name
+setINNAME {
+  out "INNAME \$1,\"%s\"";
+  @init { getINNAME; }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/LakeShore331.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,487 @@
+record (stringin, "$(P)LS331:$(Q):IDN") {
+  field(DTYP, "stream")
+  field(INP, "@LK331.proto getIDN $(PORT)")
+}
+
+record(stringin, "$(P)LS331:$(Q):serial") {
+  field(DTYP, "stream")
+  field(INP, "@LK331.proto getSERIAL $(PORT)")
+}
+
+record(stringin, "$(P)LS331:$(Q):model") {
+  field(DTYP, "stream")
+  field(INP, "@LK331.proto getSERIAL $(PORT)")
+}
+
+
+grecord(dfanout,"$(P)LS331:$(Q):Init") {
+	field(SCAN,"1 second")
+	field(OUTA,"$(P)LS331:$(Q):Input_sel.PROC  PP NMS")
+	field(OUTB,"$(P)LS331:$(Q):Units_sel.PROC  PP NMS")
+	field(OUTC,"$(P)LS331:$(Q):HeatRg.PROC  PP NMS")
+	field(OUTD,"$(P)LS331:$(Q):Gain_set.PROC  PP NMS")
+	field(OUTE,"$(P)LS331:$(Q):Rset_set.PROC  PP NMS")
+	field(OUTF,"$(P)LS331:$(Q):Rate_set.PROC  PP NMS")
+	field(OUTG,"$(P)LS331:$(Q):RampR_set.PROC  PP NMS")
+	field(OUTH,"$(P)LS331:$(Q):InitB.PROC  PP NMS")
+}
+
+grecord(dfanout,"$(P)LS331:$(Q):InitB") {
+	field(SCAN,"Passive")
+	field(OUTA,"$(P)LS331:$(Q):Ramp_on.PROC  PP NMS")
+	field(OUTB,"$(P)LS331:$(Q):wr_SP.PROC  PP NMS")
+	field(OUTC,"$(P)LS331:$(Q):read.PROC  PP NMS")
+	field(OUTD,"$(P)LS331:$(Q):readPID.PROC  PP NMS")
+	field(OUTE,"$(P)LS331:$(Q):Init.SCAN CA NMS")
+}
+
+record(ao, "$(P)LS331:$(Q):Rset_set") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):setRset.VAL  PP MS")
+  field(PREC, "0")
+}
+
+record(ao, "$(P)LS331:$(Q):Rate_set") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):setRate.VAL  PP MS")
+  field(PREC, "0")
+}
+
+record(ao, "$(P)LS331:$(Q):RampR_set") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):setRamp.VAL  PP MS")
+  field(PREC, "1")
+}
+
+record(ao, "$(P)LS331:$(Q):wr_SP") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):SP_scalc.VAL  PP MS")
+  field(PREC, "3")
+}
+
+record(ao, "$(P)LS331:$(Q):Gain_set") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):setGain.VAL  PP MS")
+  field(PREC, "0")
+}
+
+record(mbbi, "$(P)LS331:$(Q):Rg_rdbk") {
+  field(DTYP, "Soft Channel")
+  field(INP, "$(P)LS331:$(Q):Range.VAL  NPP MS")
+  field(ZRST, "OFF")
+  field(ONST, "100 mA")
+  field(TWST, "300 mA")
+  field(THST, "1 A")
+}
+
+record(mbbi, "$(P)LS331:$(Q):Ramp_state") {
+  field(DTYP, "Soft Channel")
+  field(INP, "$(P)LS331:$(Q):Ramp_scalc.VAL  NPP MS")
+  field(ZRST, "OFF")
+  field(ONST, "ON")
+}
+
+record(mbbo, "$(P)LS331:$(Q):Input_sel") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):SetCtl.VAL  NPP MS")
+  field(ZRVL, "0")
+  field(ONVL, "1")
+  field(TWVL, "0")
+  field(THVL, "0")
+  field(ZRST, "A")
+  field(ONST, "B")
+}
+
+record(mbbo, "$(P)LS331:$(Q):Units_sel") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):SetCtl.VAL  NPP MS")
+  field(ZRVL, "1")
+  field(ONVL, "2")
+  field(TWVL, "0")
+  field(THVL, "0")
+  field(ZRST, "K")
+  field(ONST, "C")
+}
+
+record(mbbo, "$(P)LS331:$(Q):HeatRg") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):SetHeat.VAL  PP MS")
+  field(ZRVL, "0")
+  field(ONVL, "1")
+  field(TWVL, "2")
+  field(THVL, "3")
+  field(FRVL, "0")
+  field(FVVL, "0")
+  field(ZRST, "OFF")
+  field(ONST, "100 mA")
+  field(TWST, "300 mA")
+  field(THST, "1 A")
+}
+
+record(mbbo, "$(P)LS331:$(Q):Ramp_on") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "$(P)LS331:$(Q):setRamp.PROC  PP MS")
+  field(ZRVL, "0")
+  field(ONVL, "1")
+  field(TWVL, "0")
+  field(THVL, "0")
+  field(ZRST, "OFF")
+  field(ONST, "ON")
+}
+
+record(seq, "$(P)LS331:$(Q):readPID") {
+  field(PREC, "1")
+  field(DLY1, ".05")
+  field(LNK1, "$(P)LS331:$(Q):rd_Gain.PROC  PP MS")
+  field(DLY2, ".05")
+  field(LNK2, "$(P)LS331:$(Q):rd_Rset.PROC  PP MS")
+  field(DLY3, ".05")
+  field(LNK3, "$(P)LS331:$(Q):rd_Rate.PROC  PP MS")
+  field(DLY4, ".05")
+  field(LNK4, "$(P)LS331:$(Q):rd_Ramp.PROC  PP MS")
+}
+
+record(seq, "$(P)LS331:$(Q):read") {
+  field(PREC, "1")
+  field(DLY1, ".05")
+  field(LNK1, "$(P)LS331:$(Q):readCtl.PROC  PP MS")
+  field(DLY2, ".05")
+  field(LNK2, "$(P)LS331:$(Q):rd_rdat_scalc.PROC  PP MS")
+  field(DLY3, ".05")
+  field(LNK3, "$(P)LS331:$(Q):rd_SplA_scalc.PROC  PP MS")
+  field(DLY4, ".05")
+  field(LNK4, "$(P)LS331:$(Q):rd_SplB_scalc.PROC  PP MS")
+  field(DLY5, ".05")
+  field(LNK5, "$(P)LS331:$(Q):rd_Heater.PROC  PP MS")
+  field(DLY6, ".05")
+  field(LNK6, "$(P)LS331:$(Q):readSP.PROC  PP MS")
+}
+
+record(stringout, "$(P)LS331:$(Q):rd_Rset") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "0")
+  field(VAL, "RSET?")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Rset.AOUT  PP MS")
+}
+
+record(stringout, "$(P)LS331:$(Q):rd_Rate") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "0")
+  field(VAL, "RATE?")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Rate.AOUT  PP MS")
+}
+
+record(stringout, "$(P)LS331:$(Q):rd_Ramp") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "0")
+  field(VAL, "RAMP?")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Ramp.AOUT  PP MS")
+}
+
+record(stringout, "$(P)LS331:$(Q):readSP") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "0")
+  field(VAL, "SETP?")
+  field(OUT, "$(P)LS331:$(Q):rd_SP.AOUT  PP MS")
+}
+
+record(stringout, "$(P)LS331:$(Q):rd_Gain") {
+  field(DTYP, "Soft Channel")
+  field(FLNK, "0")
+  field(VAL, "GAIN?")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Gain.AOUT  PP MS")
+}
+
+record(asyn, "$(P)LS331:$(Q):wr_rd_Rset") {
+  field(FLNK, "$(P)LS331:$(Q):I.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):wr_rd_Rate") {
+  field(FLNK, "$(P)LS331:$(Q):D.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):wr_rd_Gain") {
+  field(FLNK, "$(P)LS331:$(Q):P.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):rd_Ctl") {
+  field(FLNK, "$(P)LS331:$(Q):Control.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):rd_CtlParms") {
+  field(FLNK, "$(P)LS331:$(Q):CtlInput.PROC  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):rd_Heater") {
+  field(FLNK, "$(P)LS331:$(Q):Heater.VAL  PP MS")
+  field(PORT, "$(PORT)")
+  field(AOUT, "HTR?")
+}
+
+record(asyn, "$(P)LS331:$(Q):write_SP") {
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):rd_SP") {
+  field(FLNK, "$(P)LS331:$(Q):SP.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):rd_Spl_a") {
+  field(FLNK, "$(P)LS331:$(Q):SampleA.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):rd_Spl_b") {
+  field(FLNK, "$(P)LS331:$(Q):SampleB.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):wr_rd_Htr") {
+  field(FLNK, "$(P)LS331:$(Q):Range.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(asyn, "$(P)LS331:$(Q):wr_rd_Ramp") {
+  field(FLNK, "$(P)LS331:$(Q):Ramp_scalc.VAL  PP MS")
+  field(PORT, "$(PORT)")
+}
+
+record(scalcout, "$(P)LS331:$(Q):setRset") {
+  field(DESC, "Format string for PID input")
+  field(CALC, "$P('RSET %d;RSET?',A)")
+  field(INPA, "$(P)LS331:$(Q):Rset_set.VAL  NPP MS")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Rset.AOUT  PP MS")
+  field(PREC, "1")
+}
+
+record(scalcout, "$(P)LS331:$(Q):setRate") {
+  field(DESC, "Format string for PID input")
+  field(CALC, "$P('RATE %d;RATE?',A)")
+  field(INPA, "$(P)LS331:$(Q):Rate_set.VAL  NPP MS")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Rate.AOUT  PP MS")
+  field(PREC, "1")
+}
+
+record(scalcout, "$(P)LS331:$(Q):setGain") {
+  field(DESC, "Format string for PID input")
+  field(CALC, "$P('GAIN %d;GAIN?',A)")
+  field(INPA, "$(P)LS331:$(Q):Gain_set.VAL  NPP MS")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Gain.AOUT  PP MS")
+  field(PREC, "1")
+}
+
+record(scalcout, "$(P)LS331:$(Q):Ramp_scalc") {
+  field(FLNK, "$(P)LS331:$(Q):RampR.PROC  PP MS")
+  field(CALC, "INT(AA)")
+  field(INAA, "$(P)LS331:$(Q):wr_rd_Ramp.AINP  NPP MS")
+  field(PREC, "1")
+}
+record(scalcout, "$(P)LS331:$(Q):RampR") {
+  field(FLNK, "$(P)LS331:$(Q):Ramp_state.PROC  PP MS")
+  field(CALC, "SSCANF(AA,'%s')[2,10]")
+  field(INAA, "$(P)LS331:$(Q):wr_rd_Ramp.AINP  NPP MS")
+  field(PREC, "1")
+}
+
+record(scalcout, "$(P)LS331:$(Q):P") {
+  field(CALC, "INT(AA)")
+  field(INAA, "$(P)LS331:$(Q):wr_rd_Gain.AINP  NPP MS")
+  field(PREC, "0")
+}
+
+record(scalcout, "$(P)LS331:$(Q):I") {
+  field(CALC, "INT(AA)")
+  field(INAA, "$(P)LS331:$(Q):wr_rd_Rset.AINP  NPP MS")
+  field(PREC, "0")
+}
+
+record(scalcout, "$(P)LS331:$(Q):D") {
+  field(CALC, "INT(AA)")
+  field(INAA, "$(P)LS331:$(Q):wr_rd_Rate.AINP  NPP MS")
+  field(PREC, "0")
+}
+
+record(scalcout, "$(P)LS331:$(Q):Control") {
+  field(DESC, "Format string for Ctl query")
+  field(CALC, "DBL(AA)")
+  field(INAA, "$(P)LS331:$(Q):rd_Ctl.AINP  NPP MS")
+  field(INEE, "0")
+  field(PREC, "3")
+}
+
+record(scalcout, "$(P)LS331:$(Q):Heater") {
+  field(DESC, "Format string for Ctl query")
+  field(CALC, "DBL(AA)")
+  field(INAA, "$(P)LS331:$(Q):rd_Heater.AINP  NPP MS")
+  field(INEE, "0")
+  field(PREC, "0")
+}
+
+record(scalcout, "$(P)LS331:$(Q):Range") {
+  field(DESC, "Format string for Ctl query")
+  field(FLNK, "$(P)LS331:$(Q):Rg_rdbk.PROC  PP MS")
+  field(CALC, "INT(AA)")
+  field(INAA, "$(P)LS331:$(Q):wr_rd_Htr.AINP  NPP MS")
+  field(INEE, "0")
+  field(PREC, "2")
+}
+
+record(scalcout, "$(P)LS331:$(Q):SP") {
+  field(DESC, "Format string for Ctl query")
+  field(CALC, "DBL(AA)")
+  field(INAA, "$(P)LS331:$(Q):rd_SP.AINP  NPP MS")
+  field(INEE, "0")
+  field(PREC, "3")
+}
+
+record(scalcout, "$(P)LS331:$(Q):SP_scalc") {
+  field(DESC, "Format string for Ctl query")
+  field(FLNK, "$(P)LS331:$(Q):readSP.PROC  PP MS")
+  field(CALC, "$P('SETP 1,%6.3f',A)")
+  field(INPA, "$(P)LS331:$(Q):wr_SP.VAL  NPP MS")
+  field(INEE, "0")
+  field(OUT, "$(P)LS331:$(Q):write_SP.AOUT  PP MS")
+  field(PREC, "3")
+}
+
+record(scalcout, "$(P)LS331:$(Q):SampleA") {
+  field(DESC, "Convt str fror SplA query")
+  field(CALC, "DBL(AA)")
+  field(INAA, "$(P)LS331:$(Q):rd_Spl_a.AINP  PP MS")
+  field(INEE, "0")
+  field(PREC, "3")
+}
+
+record(scalcout, "$(P)LS331:$(Q):SampleB") {
+  field(DESC, "Convrt str from SplB query")
+  field(CALC, "DBL(AA)")
+  field(INAA, "$(P)LS331:$(Q):rd_Spl_b.AINP  PP MS")
+  field(INEE, "0")
+  field(PREC, "3")
+}
+
+record(scalcout, "$(P)LS331:$(Q):CtlInput") {
+  field(DESC, "Parse string for Ctl Input")
+  field(FLNK, "$(P)LS331:$(Q):CtlUnits.PROC  PP MS")
+  field(CALC, "SSCANF(AA,'%s')[0,0]")
+  field(INAA, "$(P)LS331:$(Q):rd_CtlParms.AINP  NPP MS")
+  field(PREC, "1")
+  field(AA, "A")
+}
+
+record(scalcout, "$(P)LS331:$(Q):CtlUnits") {
+  field(DESC, "Parse string for Ctl Unit")
+  field(FLNK, "$(P)LS331:$(Q):CtlUnits_str.PROC  PP MS")
+  field(CALC, "INT(SSCANF(AA,'%s')[2,2])")
+  field(INAA, "$(P)LS331:$(Q):rd_CtlParms.AINP  NPP MS")
+  field(PREC, "1")
+  field(AA, "A,2")
+}
+
+record(scalcout, "$(P)LS331:$(Q):CtlUnits_str") {
+  field(DESC, "Make Ctl Input string")
+  field(CALC, "A=1?BB:CC")
+  field(INPA, "$(P)LS331:$(Q):CtlUnits.VAL  NPP MS")
+  field(PREC, "1")
+  field(A, "1")
+  field(BB, "K")
+  field(CC, "C")
+}
+
+record(scalcout, "$(P)LS331:$(Q):SetCtl") {
+  field(DESC, "Format string for Ctl Set")
+  field(FLNK, "$(P)LS331:$(Q):read.PROC  PP MS")
+  field(CALC, "AA+(B?FF:EE)+','+STR(C)[0,0]+DD")
+  field(INAA, "")
+  field(INBB, "$(P)LS331:$(Q):Input_sel.VAL  PP MS")
+  field(INPB, "$(P)LS331:$(Q):Input_sel.VAL  PP MS")
+  field(INPC, "$(P)LS331:$(Q):Units_sel.RVAL  PP MS")
+  field(INDD, "")
+  field(OUT, "$(P)LS331:$(Q):rd_CtlParms.AOUT  PP MS")
+  field(PREC, "1")
+  field(AA, "CSET 1,")
+  field(BB, "A")
+  field(B, "0")
+  field(C, "1")
+  field(DD, ",0,1;CSET?")
+  field(EE, "A")
+  field(FF, "B")
+}
+
+record(scalcout, "$(P)LS331:$(Q):readCtl") {
+  field(DESC, "Format string for Ctl query")
+  field(CALC, "AA")
+  field(INAA, "0")
+  field(OUT, "$(P)LS331:$(Q):rd_CtlParms.AOUT  PP MS")
+  field(PREC, "1")
+  field(AA, "CSET?")
+}
+
+record(scalcout, "$(P)LS331:$(Q):SetHeat") {
+  field(CALC, "AA+BB+CC")
+  field(INAA, "0")
+  field(INBB, "$(P)LS331:$(Q):HeatRg.RVAL  NPP MS")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Htr.AOUT  PP MS")
+  field(PREC, "1")
+  field(AA, "RANGE ")
+  field(BB, "0")
+  field(CC, ";RANGE?")
+}
+
+record(scalcout, "$(P)LS331:$(Q):rd_SplA_scalc") {
+  field(DESC, "Format str for A query")
+  field(CALC, "AA+BB")
+  field(INAA, "$(P)LS331:$(Q):CtlUnits_str.SVAL  PP MS")
+  field(INBB, "0")
+  field(OUT, "$(P)LS331:$(Q):rd_Spl_a.AOUT  PP MS")
+  field(PREC, "1")
+  field(AA, "K")
+  field(BB, "RDG? A")
+}
+
+record(scalcout, "$(P)LS331:$(Q):rd_SplB_scalc") {
+  field(DESC, "Format str for B query")
+  field(CALC, "AA+BB")
+  field(INAA, "$(P)LS331:$(Q):CtlUnits_str.SVAL  PP MS")
+  field(INBB, "0")
+  field(OUT, "$(P)LS331:$(Q):rd_Spl_b.AOUT  PP MS")
+  field(PREC, "1")
+  field(AA, "K")
+  field(BB, "RDG? B")
+}
+
+record(scalcout, "$(P)LS331:$(Q):rd_rdat_scalc") {
+  field(DESC, "Format str for rd query")
+  field(CALC, "A=2?EE+BB+CC:DD+BB+CC")
+  field(INPA, "$(P)LS331:$(Q):CtlUnits.VAL  NPP MS")
+  field(INBB, "0")
+  field(INCC, "$(P)LS331:$(Q):CtlInput.SVAL  NPP MS")
+  field(INDD, "0")
+  field(INEE, "0")
+  field(OUT, "$(P)LS331:$(Q):rd_Ctl.AOUT  PP MS")
+  field(PREC, "1")
+  field(A, "1")
+  field(BB, "RDG? ")
+  field(DD, "K")
+  field(EE, "C")
+}
+
+record(scalcout, "$(P)LS331:$(Q):setRamp") {
+  field(DESC, "Format string for PID input")
+  field(CALC, "AA+$P('%d',A)+','+$P('%5.1f',B)+BB")
+  field(INPA, "$(P)LS331:$(Q):Ramp_on.RVAL  NPP MS")
+  field(INPB, "$(P)LS331:$(Q):RampR_set.VAL  NPP MS")
+  field(OUT, "$(P)LS331:$(Q):wr_rd_Ramp.AOUT  PP MS")
+  field(PREC, "1")
+  field(AA, "RAMP 1,")
+  field(BB, ";RAMP?")
+  field(CC, "0")
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/XGS600.proto	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,37 @@
+#----------------------------------------------------------------------
+#
+#  StreamDevice protocol file for a reading/setting selected elements
+#  from a Varian XGS-600 pressure gauge controller
+#
+#  2013-01-10  J.Priller  original version
+#
+#----------------------------------------------------------------------
+
+Terminator = CR;
+
+# getUnits(address)
+getUnits {
+  out "#\$113";
+  in ">%d";
+}
+
+# getPressure(address,chan)
+getPressure {
+  out "#\$102\$2";
+  in ">%g";
+}
+
+# send a raw command
+sendRawCommand {
+  out "%s";
+}
+
+# send a raw query (needs argument for PV to receive reply)
+sendRawQuery {
+  ExtraInput = Ignore;
+  out "%s";
+  in  "%(\$1)40c";
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/XGS600.substitutions	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,14 @@
+file "db/XGS600_unit.db" {
+  pattern
+  {  HWUNIT,               ADDR }
+  { "_trarpes_vac_xgs600_1", "00" }
+}
+
+file "db/XGS600_chan.db" {
+  pattern
+  { HWUNIT,                ADDR, CHAN, SYS,     DEV,  INST    }
+  { "_trarpes_vac_xgs600_1", "00", "I1", "trARPES:", "XGS600:", "PressureAC" }
+  { "_trarpes_vac_xgs600_1", "00", "I2", "trARPES:", "XGS600:", "PressureTC" }
+  { "_trarpes_vac_xgs600_1", "00", "I3", "trARPES:", "XGS600:", "PressureMETIS" }
+  { "_trarpes_vac_xgs600_1", "00", "I4", "trARPES:", "XGS600:", "PressureMBE" }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/XGS600_chan.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,29 @@
+#
+# database template for an XGS600 pressure sensor channel
+#
+# macros:
+#    SYS,DEV,INST : base name for this channel
+#    HWUNIT           : name of asyn port in drvAsynIPPortConfigure()
+#
+
+record(ai, "$(SYS)$(DEV)$(INST):P_RD")
+{
+  field(DESC, "Pressure reading")
+  field(DTYP, "stream")
+  field(SCAN, ".2 second")
+  field(PREC, "3")
+  field(EGU,  "??")
+  field(INP,  "@XGS600.proto getPressure($(ADDR),$(CHAN)) $(HWUNIT)")
+  field(ADEL, "1.0e-9")
+}
+
+record(scalcout, "_$(SYS)$(DEV)$(INST):units")
+{
+  field(DESC, "Units reading")
+  field(DTYP, "Soft Channel")
+  field(SCAN, "Passive")
+  field(CALC, "AA")
+  field(INAA, "_$(HWUNIT)_UNITS_SCALC.SVAL  CP NMS")
+  field(OOPT, "Every Time")
+  field(OUT,  "$(SYS)$(DEV)$(INST):P_RD.EGU  NPP NMS")
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/db/XGS600_unit.db	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,50 @@
+
+record(asyn, "_$(HWUNIT):sensor_asyn")
+{
+  field(PORT, "$(HWUNIT)")
+}
+
+record(longin, "_$(HWUNIT)_UNITS_IDX")
+{
+  field(DESC, "Units index number")
+  field(DTYP, "stream")
+  field(SCAN, "1 second")
+  field(INP,  "@XGS600.proto getUnits($(ADDR)) $(HWUNIT)")
+}
+
+record(scalcout, "_$(HWUNIT)_UNITS_SCALC")
+{
+  field(DESC, "Units string scalcout")
+  field(DTYP, "Soft Channel")
+  field(SCAN, "Passive")
+  field(CALC, "@@A")
+  field(INPA, "_$(HWUNIT)_UNITS_IDX  CP MS")
+  field(AA,   "Torr")
+  field(BB,   "mBar")
+  field(CC,   "Pascal")
+}
+
+record(stringout, "_$(HWUNIT)_RAW_CMD")
+{
+  field(DESC, "Raw command")
+  field(SCAN, "Passive")
+  field(DTYP, "stream")
+  field(OUT, "@XGS600.proto sendRawCommand $(HWUNIT)")
+}
+
+record(stringout, "_$(HWUNIT)_RAW_QUERY")
+{
+  field(DESC, "Raw query")
+  field(SCAN, "Passive")
+  field(DTYP, "stream")
+  field(OUT, "@XGS600.proto sendRawQuery(_$(HWUNIT)_RAW_REPLY.VAL) $(HWUNIT)")
+}
+
+record(stringin, "_$(HWUNIT)_RAW_REPLY")
+{
+  field(DESC, "Raw query reply")
+  field(SCAN, "Passive")
+  field(DTYP, "Soft Channel")
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dbd/IOCINFRA.dbd	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,23917 @@
+menu(aoOIF) {
+    choice(aoOIF_Full, "Full")
+    choice(aoOIF_Incremental, "Incremental")
+}
+menu(acalcoutINAP) {
+    choice(acalcoutINAP_No, "No PROC on Change")
+    choice(acalcoutINAP_Yes, "PROC on Change")
+}
+menu(acalcoutOOPT) {
+    choice(acalcoutOOPT_Every_Time, "Every Time")
+    choice(acalcoutOOPT_On_Change, "On Change")
+    choice(acalcoutOOPT_When_Zero, "When Zero")
+    choice(acalcoutOOPT_When_Non_zero, "When Non-zero")
+    choice(acalcoutOOPT_Transition_To_Zero, "Transition To Zero")
+    choice(acalcoutOOPT_Transition_To_Non_zero, "Transition To Non-zero")
+    choice(acalcoutOOPT_Never, "Never")
+}
+menu(menuSimm) {
+    choice(menuSimmNO, "NO")
+    choice(menuSimmYES, "YES")
+    choice(menuSimmRAW, "RAW")
+}
+menu(menuAlarmSevr) {
+    choice(menuAlarmSevrNO_ALARM, "NO_ALARM")
+    choice(menuAlarmSevrMINOR, "MINOR")
+    choice(menuAlarmSevrMAJOR, "MAJOR")
+    choice(menuAlarmSevrINVALID, "INVALID")
+}
+menu(menuConvert) {
+    choice(menuConvertNO_CONVERSION, "NO CONVERSION")
+    choice(menuConvertSLOPE, "SLOPE")
+    choice(menuConvertLINEAR, "LINEAR")
+    choice(menuConverttypeKdegF, "typeKdegF")
+    choice(menuConverttypeKdegC, "typeKdegC")
+    choice(menuConverttypeJdegF, "typeJdegF")
+    choice(menuConverttypeJdegC, "typeJdegC")
+    choice(menuConverttypeEdegF, "typeEdegF(ixe only)")
+    choice(menuConverttypeEdegC, "typeEdegC(ixe only)")
+    choice(menuConverttypeTdegF, "typeTdegF")
+    choice(menuConverttypeTdegC, "typeTdegC")
+    choice(menuConverttypeRdegF, "typeRdegF")
+    choice(menuConverttypeRdegC, "typeRdegC")
+    choice(menuConverttypeSdegF, "typeSdegF")
+    choice(menuConverttypeSdegC, "typeSdegC")
+}
+menu(scalcoutOOPT) {
+    choice(scalcoutOOPT_Every_Time, "Every Time")
+    choice(scalcoutOOPT_On_Change, "On Change")
+    choice(scalcoutOOPT_When_Zero, "When Zero")
+    choice(scalcoutOOPT_When_Non_zero, "When Non-zero")
+    choice(scalcoutOOPT_Transition_To_Zero, "Transition To Zero")
+    choice(scalcoutOOPT_Transition_To_Non_zero, "Transition To Non-zero")
+    choice(scalcoutOOPT_Never, "Never")
+}
+menu(ipDRTO) {
+    choice(ipDRTO_unknown, "Unknown")
+    choice(ipDRTO_No, "No")
+    choice(ipDRTO_Yes, "Yes")
+}
+menu(calcoutOOPT) {
+    choice(calcoutOOPT_Every_Time, "Every Time")
+    choice(calcoutOOPT_On_Change, "On Change")
+    choice(calcoutOOPT_When_Zero, "When Zero")
+    choice(calcoutOOPT_When_Non_zero, "When Non-zero")
+    choice(calcoutOOPT_Transition_To_Zero, "Transition To Zero")
+    choice(calcoutOOPT_Transition_To_Non_zero, "Transition To Non-zero")
+}
+menu(sseqLNKV) {
+    choice(sseqLNKV_EXT_NC, "Ext PV NC")
+    choice(sseqLNKV_EXT, "Ext PV OK")
+    choice(sseqLNKV_LOC, "Local PV")
+    choice(sseqLNKV_CON, "Constant")
+}
+menu(aSubEFLG) {
+    choice(aSubEFLG_NEVER, "NEVER")
+    choice(aSubEFLG_ON_CHANGE, "ON CHANGE")
+    choice(aSubEFLG_ALWAYS, "ALWAYS")
+}
+menu(sseqSELM) {
+    choice(sseqSELM_All, "All")
+    choice(sseqSELM_Specified, "Specified")
+    choice(sseqSELM_Mask, "Mask")
+}
+menu(asynFMT) {
+    choice(asynFMT_ASCII, "ASCII")
+    choice(asynFMT_Hybrid, "Hybrid")
+    choice(asynFMT_Binary, "Binary")
+}
+menu(serialFCTL) {
+    choice(serialFCTL_unknown, "Unknown")
+    choice(serialFCTL_None, "None")
+    choice(serialFCTL_Hardware, "Hardware")
+}
+menu(acalcoutDOPT) {
+    choice(acalcoutDOPT_Use_VAL, "Use CALC")
+    choice(acalcoutDOPT_Use_OVAL, "Use OCAL")
+}
+menu(gpibUCMD) {
+    choice(gpibUCMD_None, "None")
+    choice(gpibUCMD_Device_Clear__DCL_, "Device Clear (DCL)")
+    choice(gpibUCMD_Local_Lockout__LL0_, "Local Lockout (LL0)")
+    choice(gpibUCMD_Serial_Poll_Disable__SPD_, "Serial Poll Disable (SPD)")
+    choice(gpibUCMD_Serial_Poll_Enable__SPE_, "Serial Poll Enable (SPE)")
+    choice(gpibUCMD_Unlisten__UNL_, "Unlisten (UNL)")
+    choice(gpibUCMD_Untalk__UNT_, "Untalk (UNT)")
+}
+menu(asynENABLE) {
+    choice(asynENABLE_Disable, "Disable")
+    choice(asynENABLE_Enable, "Enable")
+}
+menu(menuPriority) {
+    choice(menuPriorityLOW, "LOW")
+    choice(menuPriorityMEDIUM, "MEDIUM")
+    choice(menuPriorityHIGH, "HIGH")
+}
+menu(menuYesNo) {
+    choice(menuYesNoNO, "NO")
+    choice(menuYesNoYES, "YES")
+}
+menu(calcoutDOPT) {
+    choice(calcoutDOPT_Use_VAL, "Use CALC")
+    choice(calcoutDOPT_Use_OVAL, "Use OCAL")
+}
+menu(swaitINAP) {
+    choice(swaitINAP_No, "No")
+    choice(swaitINAP_Yes, "Yes")
+}
+menu(asynAUTOCONNECT) {
+    choice(asynAUTOCONNECT_noAutoConnect, "noAutoConnect")
+    choice(asynAUTOCONNECT_autoConnect, "autoConnect")
+}
+menu(acalcoutSIZE) {
+    choice(acalcoutSIZE_NELM, "NELM")
+    choice(acalcoutSIZE_NUSE, "NUSE")
+}
+menu(aaoPOST) {
+    choice(aaoPOST_Always, "Always")
+    choice(aaoPOST_OnChange, "On Change")
+}
+menu(menuPost) {
+    choice(menuPost_OnChange, "On Change")
+    choice(menuPost_Always, "Always")
+}
+menu(serialDBIT) {
+    choice(serialDBIT_unknown, "Unknown")
+    choice(serialDBIT_5, "5")
+    choice(serialDBIT_6, "6")
+    choice(serialDBIT_7, "7")
+    choice(serialDBIT_8, "8")
+}
+menu(scalcoutINAP) {
+    choice(scalcoutINAP_No, "No PROC on Change")
+    choice(scalcoutINAP_Yes, "PROC on Change")
+}
+menu(selSELM) {
+    choice(selSELM_Specified, "Specified")
+    choice(selSELM_High_Signal, "High Signal")
+    choice(selSELM_Low_Signal, "Low Signal")
+    choice(selSELM_Median_Signal, "Median Signal")
+}
+menu(seqSELM) {
+    choice(seqSELM_All, "All")
+    choice(seqSELM_Specified, "Specified")
+    choice(seqSELM_Mask, "Mask")
+}
+menu(sseqWAIT) {
+    choice(sseqWAIT_NoWait, "NoWait")
+    choice(sseqWAIT_Wait, "Wait")
+    choice(sseqWAIT_Wait1, "After1")
+    choice(sseqWAIT_Wait2, "After2")
+    choice(sseqWAIT_Wait3, "After3")
+    choice(sseqWAIT_Wait4, "After4")
+    choice(sseqWAIT_Wait5, "After5")
+    choice(sseqWAIT_Wait6, "After6")
+    choice(sseqWAIT_Wait7, "After7")
+    choice(sseqWAIT_Wait8, "After8")
+    choice(sseqWAIT_Wait9, "After9")
+    choice(sseqWAIT_Wait10, "AfterA")
+}
+menu(compressALG) {
+    choice(compressALG_N_to_1_Low_Value, "N to 1 Low Value")
+    choice(compressALG_N_to_1_High_Value, "N to 1 High Value")
+    choice(compressALG_N_to_1_Average, "N to 1 Average")
+    choice(compressALG_Average, "Average")
+    choice(compressALG_Circular_Buffer, "Circular Buffer")
+    choice(compressALG_N_to_1_Median, "N to 1 Median")
+}
+menu(menuPini) {
+    choice(menuPiniNO, "NO")
+    choice(menuPiniYES, "YES")
+    choice(menuPiniRUN, "RUN")
+    choice(menuPiniRUNNING, "RUNNING")
+    choice(menuPiniPAUSE, "PAUSE")
+    choice(menuPiniPAUSED, "PAUSED")
+}
+menu(serialMCTL) {
+    choice(serialMCTL_unknown, "Unknown")
+    choice(serialMCTL_CLOCAL, "CLOCAL")
+    choice(serialMCTL_Yes, "YES")
+}
+menu(menuAlarmStat) {
+    choice(menuAlarmStatNO_ALARM, "NO_ALARM")
+    choice(menuAlarmStatREAD, "READ")
+    choice(menuAlarmStatWRITE, "WRITE")
+    choice(menuAlarmStatHIHI, "HIHI")
+    choice(menuAlarmStatHIGH, "HIGH")
+    choice(menuAlarmStatLOLO, "LOLO")
+    choice(menuAlarmStatLOW, "LOW")
+    choice(menuAlarmStatSTATE, "STATE")
+    choice(menuAlarmStatCOS, "COS")
+    choice(menuAlarmStatCOMM, "COMM")
+    choice(menuAlarmStatTIMEOUT, "TIMEOUT")
+    choice(menuAlarmStatHWLIMIT, "HWLIMIT")
+    choice(menuAlarmStatCALC, "CALC")
+    choice(menuAlarmStatSCAN, "SCAN")
+    choice(menuAlarmStatLINK, "LINK")
+    choice(menuAlarmStatSOFT, "SOFT")
+    choice(menuAlarmStatBAD_SUB, "BAD_SUB")
+    choice(menuAlarmStatUDF, "UDF")
+    choice(menuAlarmStatDISABLE, "DISABLE")
+    choice(menuAlarmStatSIMM, "SIMM")
+    choice(menuAlarmStatREAD_ACCESS, "READ_ACCESS")
+    choice(menuAlarmStatWRITE_ACCESS, "WRITE_ACCESS")
+}
+menu(aSubLFLG) {
+    choice(aSubLFLG_IGNORE, "IGNORE")
+    choice(aSubLFLG_READ, "READ")
+}
+menu(histogramCMD) {
+    choice(histogramCMD_Read, "Read")
+    choice(histogramCMD_Clear, "Clear")
+    choice(histogramCMD_Start, "Start")
+    choice(histogramCMD_Stop, "Stop")
+}
+menu(bufferingALG) {
+    choice(bufferingALG_FIFO, "FIFO Buffer")
+    choice(bufferingALG_LIFO, "LIFO Buffer")
+}
+menu(aaiPOST) {
+    choice(aaiPOST_Always, "Always")
+    choice(aaiPOST_OnChange, "On Change")
+}
+menu(swaitDOPT) {
+    choice(swaitDOPT_Use_VAL, "Use VAL")
+    choice(swaitDOPT_Use_DOL, "Use DOL")
+}
+menu(menuFtype) {
+    choice(menuFtypeSTRING, "STRING")
+    choice(menuFtypeCHAR, "CHAR")
+    choice(menuFtypeUCHAR, "UCHAR")
+    choice(menuFtypeSHORT, "SHORT")
+    choice(menuFtypeUSHORT, "USHORT")
+    choice(menuFtypeLONG, "LONG")
+    choice(menuFtypeULONG, "ULONG")
+    choice(menuFtypeINT64, "INT64")
+    choice(menuFtypeUINT64, "UINT64")
+    choice(menuFtypeFLOAT, "FLOAT")
+    choice(menuFtypeDOUBLE, "DOUBLE")
+    choice(menuFtypeENUM, "ENUM")
+}
+menu(calcoutINAV) {
+    choice(calcoutINAV_EXT_NC, "Ext PV NC")
+    choice(calcoutINAV_EXT, "Ext PV OK")
+    choice(calcoutINAV_LOC, "Local PV")
+    choice(calcoutINAV_CON, "Constant")
+}
+menu(scalcoutINAV) {
+    choice(scalcoutINAV_EXT_NC, "Ext PV NC")
+    choice(scalcoutINAV_EXT, "Ext PV OK")
+    choice(scalcoutINAV_LOC, "Local PV")
+    choice(scalcoutINAV_CON, "Constant")
+}
+menu(asynINTERFACE) {
+    choice(asynINTERFACE_OCTET, "asynOctet")
+    choice(asynINTERFACE_INT32, "asynInt32")
+    choice(asynINTERFACE_UINT32, "asynUInt32Digital")
+    choice(asynINTERFACE_FLOAT64, "asynFloat64")
+}
+menu(transformCOPT) {
+    choice(transformCOPT_CONDITIONAL, "Conditional")
+    choice(transformCOPT_ALWAYS, "Always")
+}
+menu(asynCONNECT) {
+    choice(asynCONNECT_Disconnect, "Disconnect")
+    choice(asynCONNECT_Connect, "Connect")
+}
+menu(stringinPOST) {
+    choice(stringinPOST_OnChange, "On Change")
+    choice(stringinPOST_Always, "Always")
+}
+menu(menuOmsl) {
+    choice(menuOmslsupervisory, "supervisory")
+    choice(menuOmslclosed_loop, "closed_loop")
+}
+menu(menuScan) {
+    choice(menuScanPassive, "Passive")
+    choice(menuScanEvent, "Event")
+    choice(menuScanI_O_Intr, "I/O Intr")
+    choice(menuScan10_second, "10 second")
+    choice(menuScan5_second, "5 second")
+    choice(menuScan2_second, "2 second")
+    choice(menuScan1_second, "1 second")
+    choice(menuScan_5_second, ".5 second")
+    choice(menuScan_2_second, ".2 second")
+    choice(menuScan_1_second, ".1 second")
+}
+menu(transformIVLA) {
+    choice(transformIVLA_IGNORE, "Ignore error")
+    choice(transformIVLA_DO_NOTHING, "Do Nothing")
+}
+menu(transformIAV) {
+    choice(transformIAV_EXT_NC, "Ext PV NC")
+    choice(transformIAV_EXT, "Ext PV OK")
+    choice(transformIAV_LOC, "Local PV")
+    choice(transformIAV_CON, "Constant")
+}
+menu(waveformPOST) {
+    choice(waveformPOST_Always, "Always")
+    choice(waveformPOST_OnChange, "On Change")
+}
+menu(serialIX) {
+    choice(serialIX_unknown, "Unknown")
+    choice(serialIX_No, "No")
+    choice(serialIX_Yes, "Yes")
+}
+menu(swaitINAV) {
+    choice(swaitINAV_PV_OK, "PV OK")
+    choice(swaitINAV_PV_BAD, "PV BAD")
+    choice(swaitINAV_No_PV, "No PV")
+}
+menu(swaitOOPT) {
+    choice(swaitOOPT_Every_Time, "Every Time")
+    choice(swaitOOPT_On_Change, "On Change")
+    choice(swaitOOPT_When_Zero, "When Zero")
+    choice(swaitOOPT_When_Non_zero, "When Non-zero")
+    choice(swaitOOPT_Transition_To_Zero, "Transition To Zero")
+    choice(swaitOOPT_Transition_To_Non_zero, "Transition To Non-zero")
+    choice(swaitOOPT_Never, "Never")
+}
+menu(scalcoutDOPT) {
+    choice(scalcoutDOPT_Use_VAL, "Use CALC")
+    choice(scalcoutDOPT_Use_OVAL, "Use OCAL")
+}
+menu(gpibACMD) {
+    choice(gpibACMD_None, "None")
+    choice(gpibACMD_Group_Execute_Trig___GET_, "Group Execute Trig. (GET)")
+    choice(gpibACMD_Go_To_Local__GTL_, "Go To Local (GTL)")
+    choice(gpibACMD_Selected_Dev__Clear__SDC_, "Selected Dev. Clear (SDC)")
+    choice(gpibACMD_Take_Control__TCT_, "Take Control (TCT)")
+    choice(gpibACMD_Serial_Poll, "Serial Poll")
+}
+menu(dfanoutSELM) {
+    choice(dfanoutSELM_All, "All")
+    choice(dfanoutSELM_Specified, "Specified")
+    choice(dfanoutSELM_Mask, "Mask")
+}
+menu(asynTRACE) {
+    choice(asynTRACE_Off, "Off")
+    choice(asynTRACE_On, "On")
+}
+menu(acalcoutINAV) {
+    choice(acalcoutINAV_EXT_NC, "Ext PV NC")
+    choice(acalcoutINAV_EXT, "Ext PV OK")
+    choice(acalcoutINAV_LOC, "Local PV")
+    choice(acalcoutINAV_CON, "Constant")
+}
+menu(asynTMOD) {
+    choice(asynTMOD_Write_Read, "Write/Read")
+    choice(asynTMOD_Write, "Write")
+    choice(asynTMOD_Read, "Read")
+    choice(asynTMOD_Flush, "Flush")
+    choice(asynTMOD_NoIO, "NoI/O")
+}
+menu(scalcoutWAIT) {
+    choice(scalcoutWAIT_NoWait, "NoWait")
+    choice(scalcoutWAIT_Wait, "Wait")
+}
+menu(menuIvoa) {
+    choice(menuIvoaContinue_normally, "Continue normally")
+    choice(menuIvoaDon_t_drive_outputs, "Don't drive outputs")
+    choice(menuIvoaSet_output_to_IVOV, "Set output to IVOV")
+}
+menu(stringoutPOST) {
+    choice(stringoutPOST_OnChange, "On Change")
+    choice(stringoutPOST_Always, "Always")
+}
+menu(serialSBIT) {
+    choice(serialSBIT_unknown, "Unknown")
+    choice(serialSBIT_1, "1")
+    choice(serialSBIT_2, "2")
+}
+menu(acalcoutWAIT) {
+    choice(acalcoutWAIT_NoWait, "NoWait")
+    choice(acalcoutWAIT_Wait, "Wait")
+}
+menu(fanoutSELM) {
+    choice(fanoutSELM_All, "All")
+    choice(fanoutSELM_Specified, "Specified")
+    choice(fanoutSELM_Mask, "Mask")
+}
+menu(serialPRTY) {
+    choice(serialPRTY_unknown, "Unknown")
+    choice(serialPRTY_None, "None")
+    choice(serialPRTY_Even, "Even")
+    choice(serialPRTY_Odd, "Odd")
+}
+menu(serialBAUD) {
+    choice(serialBAUD_unknown, "Unknown")
+    choice(serialBAUD_300, "300")
+    choice(serialBAUD_600, "600")
+    choice(serialBAUD_1200, "1200")
+    choice(serialBAUD_2400, "2400")
+    choice(serialBAUD_4800, "4800")
+    choice(serialBAUD_9600, "9600")
+    choice(serialBAUD_19200, "19200")
+    choice(serialBAUD_38400, "38400")
+    choice(serialBAUD_57600, "57600")
+    choice(serialBAUD_115200, "115200")
+    choice(serialBAUD_230400, "230400")
+    choice(serialBAUD_460800, "460800")
+    choice(serialBAUD_576000, "576000")
+    choice(serialBAUD_921600, "921600")
+    choice(serialBAUD_1152000, "1152000")
+}
+menu(asynEOMREASON) {
+    choice(asynEOMREASONNone, "None")
+    choice(asynEOMREASONCNT, "Count")
+    choice(asynEOMREASONEOS, "Eos")
+    choice(asynEOMREASONCNTEOS, "Count Eos")
+    choice(asynEOMREASONEND, "End")
+    choice(asynEOMREASONCNTEND, "Count End")
+    choice(asynEOMREASONEOSEND, "Eos End")
+    choice(asynEOMREASONCNTEOSEND, "Count Eos End")
+}
+recordtype(int64in) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        prompt("Scan Mechanism")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        prompt("Alarm Ack Transient")
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_INT64) {
+        asl(ASL0)
+        prompt("Current value")
+        promptgroup("40 - Input")
+        pp(TRUE)
+    }
+    field(INP, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input Specification")
+    }
+    field(EGU, DBF_STRING) {
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Units name")
+        size(16)
+    }
+    field(HOPR, DBF_INT64) {
+        prompt("High Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_INT64) {
+        prompt("Low Operating Range")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(HIHI, DBF_INT64) {
+        prompt("Hihi Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(LOLO, DBF_INT64) {
+        prompt("Lolo Alarm Limit")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        pp(TRUE)
+    }
+    field(HIGH, DBF_INT64) {
+        prompt("High Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(LOW, DBF_INT64) {
+        prompt("Low Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(HHSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("Hihi Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LLSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Lolo Severity")
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        prompt("High Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Low Severity")
+        interest(1)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(HYST, DBF_INT64) {
+        prompt("Alarm Deadband")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(AFTC, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Filter Time Constant")
+    }
+    field(AFVL, DBF_DOUBLE) {
+        prompt("Alarm Filter Value")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(ADEL, DBF_INT64) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_INT64) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Monitor Deadband")
+    }
+    field(LALM, DBF_INT64) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ALST, DBF_INT64) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Archived")
+    }
+    field(MLST, DBF_INT64) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Val Monitored")
+    }
+    field(SIOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Input Link")
+    }
+    field(SVAL, DBF_INT64) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        prompt("Simulation Mode")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(SIMS, DBF_MENU) {
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Severity")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        special(SPC_NOMOD)
+        interest(4)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Async Delay")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        prompt("Sim. Mode Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("CALLBACK            *simpvt")
+    }
+}
+device(int64in, CONSTANT, devI64inSoft, "Soft Channel")
+device(int64in, CONSTANT, devI64inSoftCallback, "Async Soft Channel")
+recordtype(sseq) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        interest(3)
+        prompt("Force Processing")
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        menu(menuYesNo)
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(UDF, DBF_UCHAR) {
+        initial("1")
+        pp(TRUE)
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_LONG) {
+        pp(TRUE)
+        asl(ASL0)
+        prompt("Used to trigger")
+    }
+    field(SELM, DBF_MENU) {
+        menu(sseqSELM)
+        prompt("Select Mechanism")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(SELN, DBF_USHORT) {
+        initial("1")
+        prompt("Link Selection")
+        interest(1)
+    }
+    field(SELL, DBF_INLINK) {
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Link Selection Loc")
+    }
+    field(PREC, DBF_SHORT) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Display Precision")
+    }
+    field(DLY1, DBF_DOUBLE) {
+        prompt("Delay 1")
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(1)
+    }
+    field(DOL1, DBF_INLINK) {
+        prompt("Input link1")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+    }
+    field(DO1, DBF_DOUBLE) {
+        prompt("Constant input 1")
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(LNK1, DBF_OUTLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output (1)")
+        prompt("Output Link 1")
+    }
+    field(STR1, DBF_STRING) {
+        interest(4)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        prompt("String value 1")
+        size(40)
+    }
+    field(DT1, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DOL link type")
+    }
+    field(LT1, DBF_SHORT) {
+        prompt("LNK link type")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(WAIT1, DBF_MENU) {
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(1)
+        prompt("Wait for completion?")
+        menu(sseqWAIT)
+    }
+    field(WERR1, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(WTG1, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(IX1, DBF_SHORT) {
+        initial("0")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(DOL1V, DBF_MENU) {
+        menu(sseqLNKV)
+        prompt("DOL LINK Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(LNK1V, DBF_MENU) {
+        menu(sseqLNKV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("LNK LINK Status")
+        initial("1")
+    }
+    field(DLY2, DBF_DOUBLE) {
+        prompt("Delay 2")
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(1)
+    }
+    field(DOL2, DBF_INLINK) {
+        prompt("Input link 2")
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(DO2, DBF_DOUBLE) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output (1)")
+        prompt("Constant input 2")
+    }
+    field(LNK2, DBF_OUTLINK) {
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Output Link 2")
+    }
+    field(STR2, DBF_STRING) {
+        size(40)
+        prompt("String value 2")
+        interest(4)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+    }
+    field(DT2, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DOL link type")
+    }
+    field(LT2, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("LNK link type")
+    }
+    field(WAIT2, DBF_MENU) {
+        menu(sseqWAIT)
+        prompt("Wait for completion?")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+    }
+    field(WERR2, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(WTG2, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(IX2, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(2)
+        initial("1")
+    }
+    field(DOL2V, DBF_MENU) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("DOL LINK Status")
+        menu(sseqLNKV)
+    }
+    field(LNK2V, DBF_MENU) {
+        initial("1")
+        menu(sseqLNKV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("LNK LINK Status")
+    }
+    field(DLY3, DBF_DOUBLE) {
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(1)
+        prompt("Delay 3")
+    }
+    field(DOL3, DBF_INLINK) {
+        prompt("Input link 3")
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(DO3, DBF_DOUBLE) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output (1)")
+        prompt("Constant input 3")
+    }
+    field(LNK3, DBF_OUTLINK) {
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Output Link 3")
+    }
+    field(STR3, DBF_STRING) {
+        size(40)
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(4)
+        prompt("String value 3")
+    }
+    field(DT3, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DOL link type")
+    }
+    field(LT3, DBF_SHORT) {
+        prompt("LNK link type")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(WAIT3, DBF_MENU) {
+        menu(sseqWAIT)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(1)
+        prompt("Wait for completion?")
+    }
+    field(WERR3, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(WTG3, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(IX3, DBF_SHORT) {
+        initial("2")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(DOL3V, DBF_MENU) {
+        menu(sseqLNKV)
+        prompt("DOL LINK Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(LNK3V, DBF_MENU) {
+        initial("1")
+        menu(sseqLNKV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("LNK LINK Status")
+    }
+    field(DLY4, DBF_DOUBLE) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("52 - Output (2)")
+        prompt("Delay 4")
+    }
+    field(DOL4, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("52 - Output (2)")
+        prompt("Input link 4")
+    }
+    field(DO4, DBF_DOUBLE) {
+        prompt("Constant input 4")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output (1)")
+    }
+    field(LNK4, DBF_OUTLINK) {
+        prompt("Output Link 4")
+        promptgroup("52 - Output (2)")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(STR4, DBF_STRING) {
+        size(40)
+        prompt("String value 4")
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(4)
+    }
+    field(DT4, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DOL link type")
+    }
+    field(LT4, DBF_SHORT) {
+        prompt("LNK link type")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(WAIT4, DBF_MENU) {
+        prompt("Wait for completion?")
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(1)
+        menu(sseqWAIT)
+    }
+    field(WERR4, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(WTG4, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(IX4, DBF_SHORT) {
+        initial("3")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(DOL4V, DBF_MENU) {
+        initial("1")
+        menu(sseqLNKV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("DOL LINK Status")
+    }
+    field(LNK4V, DBF_MENU) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("LNK LINK Status")
+        menu(sseqLNKV)
+    }
+    field(DLY5, DBF_DOUBLE) {
+        promptgroup("52 - Output (2)")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Delay 5")
+    }
+    field(DOL5, DBF_INLINK) {
+        special(SPC_MOD)
+        promptgroup("52 - Output (2)")
+        interest(1)
+        prompt("Input link 5")
+    }
+    field(DO5, DBF_DOUBLE) {
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Constant input 5")
+    }
+    field(LNK5, DBF_OUTLINK) {
+        prompt("Output Link 5")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("52 - Output (2)")
+    }
+    field(STR5, DBF_STRING) {
+        interest(4)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        prompt("String value 5")
+        size(40)
+    }
+    field(DT5, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DOL link type")
+    }
+    field(LT5, DBF_SHORT) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("LNK link type")
+    }
+    field(WAIT5, DBF_MENU) {
+        prompt("Wait for completion?")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        menu(sseqWAIT)
+    }
+    field(WERR5, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(WTG5, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(IX5, DBF_SHORT) {
+        interest(2)
+        special(SPC_NOMOD)
+        initial("4")
+    }
+    field(DOL5V, DBF_MENU) {
+        initial("1")
+        menu(sseqLNKV)
+        prompt("DOL LINK Status")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(LNK5V, DBF_MENU) {
+        menu(sseqLNKV)
+        prompt("LNK LINK Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(DLY6, DBF_DOUBLE) {
+        prompt("Delay 6")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("52 - Output (2)")
+    }
+    field(DOL6, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("52 - Output (2)")
+        prompt("Input link 6")
+    }
+    field(DO6, DBF_DOUBLE) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        prompt("Constant input 6")
+    }
+    field(LNK6, DBF_OUTLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("52 - Output (2)")
+        prompt("Output Link 6")
+    }
+    field(STR6, DBF_STRING) {
+        size(40)
+        special(SPC_MOD)
+        interest(4)
+        promptgroup("51 - Output (1)")
+        prompt("String value 6")
+    }
+    field(DT6, DBF_SHORT) {
+        prompt("DOL link type")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LT6, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("LNK link type")
+    }
+    field(WAIT6, DBF_MENU) {
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(1)
+        prompt("Wait for completion?")
+        menu(sseqWAIT)
+    }
+    field(WERR6, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(WTG6, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(IX6, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(2)
+        initial("5")
+    }
+    field(DOL6V, DBF_MENU) {
+        initial("1")
+        prompt("DOL LINK Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(sseqLNKV)
+    }
+    field(LNK6V, DBF_MENU) {
+        initial("1")
+        menu(sseqLNKV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("LNK LINK Status")
+    }
+    field(DLY7, DBF_DOUBLE) {
+        prompt("Delay 7")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("53 - Output (3)")
+    }
+    field(DOL7, DBF_INLINK) {
+        prompt("Input link 7")
+        special(SPC_MOD)
+        promptgroup("53 - Output (3)")
+        interest(1)
+    }
+    field(DO7, DBF_DOUBLE) {
+        prompt("Constant input 7")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output (1)")
+    }
+    field(LNK7, DBF_OUTLINK) {
+        promptgroup("53 - Output (3)")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Output Link 7")
+    }
+    field(STR7, DBF_STRING) {
+        prompt("String value 7")
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(4)
+        size(40)
+    }
+    field(DT7, DBF_SHORT) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DOL link type")
+    }
+    field(LT7, DBF_SHORT) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("LNK link type")
+    }
+    field(WAIT7, DBF_MENU) {
+        prompt("Wait for completion?")
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+        menu(sseqWAIT)
+    }
+    field(WERR7, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(WTG7, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(IX7, DBF_SHORT) {
+        initial("6")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(DOL7V, DBF_MENU) {
+        menu(sseqLNKV)
+        prompt("DOL LINK Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(LNK7V, DBF_MENU) {
+        prompt("LNK LINK Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(sseqLNKV)
+        initial("1")
+    }
+    field(DLY8, DBF_DOUBLE) {
+        prompt("Delay 8")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("53 - Output (3)")
+    }
+    field(DOL8, DBF_INLINK) {
+        special(SPC_MOD)
+        promptgroup("53 - Output (3)")
+        interest(1)
+        prompt("Input link 8")
+    }
+    field(DO8, DBF_DOUBLE) {
+        prompt("Constant input 8")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+    }
+    field(LNK8, DBF_OUTLINK) {
+        prompt("Output Link 8")
+        special(SPC_MOD)
+        promptgroup("53 - Output (3)")
+        interest(1)
+    }
+    field(STR8, DBF_STRING) {
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        interest(4)
+        prompt("String value 8")
+        size(40)
+    }
+    field(DT8, DBF_SHORT) {
+        prompt("DOL link type")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LT8, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("LNK link type")
+    }
+    field(WAIT8, DBF_MENU) {
+        menu(sseqWAIT)
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Wait for completion?")
+    }
+    field(WERR8, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(WTG8, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(IX8, DBF_SHORT) {
+        interest(2)
+        special(SPC_NOMOD)
+        initial("7")
+    }
+    field(DOL8V, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("DOL LINK Status")
+        menu(sseqLNKV)
+        initial("1")
+    }
+    field(LNK8V, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("LNK LINK Status")
+        menu(sseqLNKV)
+    }
+    field(DLY9, DBF_DOUBLE) {
+        prompt("Delay 9")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("53 - Output (3)")
+    }
+    field(DOL9, DBF_INLINK) {
+        special(SPC_MOD)
+        promptgroup("53 - Output (3)")
+        interest(1)
+        prompt("Input link 9")
+    }
+    field(DO9, DBF_DOUBLE) {
+        prompt("Constant input 9")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+    }
+    field(LNK9, DBF_OUTLINK) {
+        promptgroup("53 - Output (3)")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Output Link 9")
+    }
+    field(STR9, DBF_STRING) {
+        promptgroup("51 - Output (1)")
+        special(SPC_MOD)
+        interest(4)
+        prompt("String value 9")
+        size(40)
+    }
+    field(DT9, DBF_SHORT) {
+        prompt("DOL link type")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LT9, DBF_SHORT) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("LNK link type")
+    }
+    field(WAIT9, DBF_MENU) {
+        menu(sseqWAIT)
+        prompt("Wait for completion?")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+    }
+    field(WERR9, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(WTG9, DBF_SHORT) {
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(IX9, DBF_SHORT) {
+        initial("8")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(DOL9V, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("DOL LINK Status")
+        menu(sseqLNKV)
+        initial("1")
+    }
+    field(LNK9V, DBF_MENU) {
+        menu(sseqLNKV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("LNK LINK Status")
+        initial("1")
+    }
+    field(DLYA, DBF_DOUBLE) {
+        prompt("Delay 10")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("53 - Output (3)")
+    }
+    field(DOLA, DBF_INLINK) {
+        prompt("Input link 10")
+        promptgroup("53 - Output (3)")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(DOA, DBF_DOUBLE) {
+        prompt("Constant input 10")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output (1)")
+    }
+    field(LNKA, DBF_OUTLINK) {
+        prompt("Output Link 10")
+        special(SPC_MOD)
+        promptgroup("53 - Output (3)")
+        interest(1)
+    }
+    field(STRA, DBF_STRING) {
+        interest(4)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+        prompt("String value A")
+        size(40)
+    }
+    field(DTA, DBF_SHORT) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DOL link type")
+    }
+    field(LTA, DBF_SHORT) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("LNK link type")
+    }
+    field(WAITA, DBF_MENU) {
+        menu(sseqWAIT)
+        prompt("Wait for completion?")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output (1)")
+    }
+    field(WERRA, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(WTGA, DBF_SHORT) {
+        interest(1)
+    }
+    field(IXA, DBF_SHORT) {
+        interest(2)
+        initial("9")
+    }
+    field(DOLAV, DBF_MENU) {
+        menu(sseqLNKV)
+        prompt("DOL LINK Status")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(LNKAV, DBF_MENU) {
+        prompt("LNK LINK Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(sseqLNKV)
+        initial("1")
+    }
+    field(ABORT, DBF_SHORT) {
+        interest(1)
+        special(SPC_MOD)
+        prompt("Abort sequence")
+    }
+    field(ABORTING, DBF_SHORT) {
+        special(SPC_MOD)
+        interest(1)
+        prompt("Aborting")
+    }
+    field(BUSY, DBF_SHORT) {
+        prompt("Sequence active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+}
+recordtype(sel) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKT, DBF_MENU) {
+        menu(menuYesNo)
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        prompt("Address of RSET")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_DOUBLE) {
+        asl(ASL0)
+        prompt("Result")
+        promptgroup("40 - Input")
+        special(SPC_NOMOD)
+    }
+    field(SELM, DBF_MENU) {
+        promptgroup("30 - Action")
+        prompt("Select Mechanism")
+        menu(selSELM)
+    }
+    field(SELN, DBF_USHORT) {
+        prompt("Index value")
+    }
+    field(PREC, DBF_SHORT) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Display Precision")
+    }
+    field(NVL, DBF_INLINK) {
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Index Value Location")
+    }
+    field(INPA, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Input A-F")
+        prompt("Input A")
+    }
+    field(INPB, DBF_INLINK) {
+        prompt("Input B")
+        interest(1)
+        promptgroup("41 - Input A-F")
+    }
+    field(INPC, DBF_INLINK) {
+        prompt("Input C")
+        promptgroup("41 - Input A-F")
+        interest(1)
+    }
+    field(INPD, DBF_INLINK) {
+        prompt("Input D")
+        interest(1)
+        promptgroup("41 - Input A-F")
+    }
+    field(INPE, DBF_INLINK) {
+        promptgroup("41 - Input A-F")
+        interest(1)
+        prompt("Input E")
+    }
+    field(INPF, DBF_INLINK) {
+        promptgroup("41 - Input A-F")
+        interest(1)
+        prompt("Input F")
+    }
+    field(INPG, DBF_INLINK) {
+        promptgroup("42 - Input G-L")
+        interest(1)
+        prompt("Input G")
+    }
+    field(INPH, DBF_INLINK) {
+        promptgroup("42 - Input G-L")
+        interest(1)
+        prompt("Input H")
+    }
+    field(INPI, DBF_INLINK) {
+        prompt("Input I")
+        promptgroup("42 - Input G-L")
+        interest(1)
+    }
+    field(INPJ, DBF_INLINK) {
+        prompt("Input J")
+        interest(1)
+        promptgroup("42 - Input G-L")
+    }
+    field(INPK, DBF_INLINK) {
+        prompt("Input K")
+        interest(1)
+        promptgroup("42 - Input G-L")
+    }
+    field(INPL, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Input G-L")
+        prompt("Input L")
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        prompt("Engineering Units")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Rng")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Low Operating Range")
+    }
+    field(HIHI, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Hihi Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(LOLO, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("Lolo Alarm Limit")
+    }
+    field(HIGH, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("High Alarm Limit")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+    }
+    field(LOW, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Low Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(HHSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Hihi Severity")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        pp(TRUE)
+    }
+    field(LLSV, DBF_MENU) {
+        prompt("Lolo Severity")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("High Severity")
+    }
+    field(LSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("Low Severity")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(HYST, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Alarm Deadband")
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        prompt("Monitor Deadband")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(A, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input A")
+    }
+    field(B, DBF_DOUBLE) {
+        prompt("Value of Input B")
+        pp(TRUE)
+    }
+    field(C, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input C")
+    }
+    field(D, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input D")
+    }
+    field(E, DBF_DOUBLE) {
+        prompt("Value of Input E")
+        pp(TRUE)
+    }
+    field(F, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input F")
+    }
+    field(G, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input G")
+    }
+    field(H, DBF_DOUBLE) {
+        prompt("Value of Input H")
+        pp(TRUE)
+    }
+    field(I, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input I")
+    }
+    field(J, DBF_DOUBLE) {
+        prompt("Value of Input J")
+        pp(TRUE)
+    }
+    field(K, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input K")
+    }
+    field(L, DBF_DOUBLE) {
+        prompt("Value of Input L")
+        pp(TRUE)
+    }
+    field(LA, DBF_DOUBLE) {
+        prompt("Prev Value of A")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LB, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of B")
+    }
+    field(LC, DBF_DOUBLE) {
+        prompt("Prev Value of C")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LD, DBF_DOUBLE) {
+        prompt("Prev Value of D")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LE, DBF_DOUBLE) {
+        prompt("Prev Value of E")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LF, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of F")
+    }
+    field(LG, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of G")
+    }
+    field(LH, DBF_DOUBLE) {
+        prompt("Prev Value of H")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LI, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of I")
+    }
+    field(LJ, DBF_DOUBLE) {
+        prompt("Prev Value of J")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LK, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of K")
+    }
+    field(LL, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of L")
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(ALST, DBF_DOUBLE) {
+        prompt("Last Value Archived")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(MLST, DBF_DOUBLE) {
+        prompt("Last Val Monitored")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(NLST, DBF_USHORT) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Index Monitored")
+    }
+}
+recordtype(scalcout) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+    }
+    field(SCAN, DBF_MENU) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        menu(menuYesNo)
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(UDF, DBF_UCHAR) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VERS, DBF_DOUBLE) {
+        prompt("Code Version")
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(RPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Record Private")
+        extra("void *rpvt")
+        size(4)
+    }
+    field(VAL, DBF_DOUBLE) {
+        asl(ASL0)
+        prompt("Result")
+    }
+    field(SVAL, DBF_STRING) {
+        prompt("String result")
+        asl(ASL0)
+        size(40)
+    }
+    field(PVAL, DBF_DOUBLE) {
+        prompt("Previous Value")
+    }
+    field(PSVL, DBF_STRING) {
+        prompt("Previous string result")
+        special(SPC_NOMOD)
+        size(40)
+    }
+    field(CALC, DBF_STRING) {
+        prompt("Calculation")
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        pp(TRUE)
+        size(80)
+    }
+    field(CLCV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Valid")
+    }
+    field(INPA, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Input A")
+    }
+    field(INPB, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input B")
+    }
+    field(INPC, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input C")
+    }
+    field(INPD, DBF_INLINK) {
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("Input D")
+    }
+    field(INPE, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Input E")
+    }
+    field(INPF, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Input F")
+    }
+    field(INPG, DBF_INLINK) {
+        prompt("Input G")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(INPH, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input H")
+    }
+    field(INPI, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input I")
+    }
+    field(INPJ, DBF_INLINK) {
+        prompt("Input J")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPK, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Input K")
+    }
+    field(INPL, DBF_INLINK) {
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("Input L")
+    }
+    field(INAA, DBF_INLINK) {
+        prompt("String input AA")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INBB, DBF_INLINK) {
+        prompt("String input BB")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INCC, DBF_INLINK) {
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+        prompt("String input CC")
+    }
+    field(INDD, DBF_INLINK) {
+        prompt("String input DD")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(INEE, DBF_INLINK) {
+        prompt("String input EE")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(INFF, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("String input FF")
+    }
+    field(INGG, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("String input GG")
+    }
+    field(INHH, DBF_INLINK) {
+        prompt("String input HH")
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+    }
+    field(INII, DBF_INLINK) {
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+        prompt("String input II")
+    }
+    field(INJJ, DBF_INLINK) {
+        prompt("String input JJ")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INKK, DBF_INLINK) {
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+        prompt("String input KK")
+    }
+    field(INLL, DBF_INLINK) {
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("String input LL")
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Link")
+        promptgroup("50 - Output")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INAV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        prompt("INPA PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(INBV, DBF_MENU) {
+        menu(scalcoutINAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPB PV Status")
+        initial("1")
+    }
+    field(INCV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPC PV Status")
+    }
+    field(INDV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPD PV Status")
+    }
+    field(INEV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPE PV Status")
+        menu(scalcoutINAV)
+        initial("1")
+    }
+    field(INFV, DBF_MENU) {
+        prompt("INPF PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(scalcoutINAV)
+        initial("1")
+    }
+    field(INGV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPG PV Status")
+        menu(scalcoutINAV)
+    }
+    field(INHV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        prompt("INPH PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(INIV, DBF_MENU) {
+        initial("1")
+        prompt("INPI PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(scalcoutINAV)
+    }
+    field(INJV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPJ PV Status")
+    }
+    field(INKV, DBF_MENU) {
+        initial("1")
+        prompt("INPK PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(scalcoutINAV)
+    }
+    field(INLV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        prompt("INPL PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(IAAV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        prompt("INAA PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(IBBV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INBB PV Status")
+        menu(scalcoutINAV)
+        initial("1")
+    }
+    field(ICCV, DBF_MENU) {
+        initial("1")
+        prompt("INCC PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(scalcoutINAV)
+    }
+    field(IDDV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INDD PV Status")
+        menu(scalcoutINAV)
+        initial("1")
+    }
+    field(IEEV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INEE PV Status")
+        menu(scalcoutINAV)
+        initial("1")
+    }
+    field(IFFV, DBF_MENU) {
+        initial("1")
+        menu(scalcoutINAV)
+        prompt("INFF PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(IGGV, DBF_MENU) {
+        initial("1")
+        prompt("INGG PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(scalcoutINAV)
+    }
+    field(IHHV, DBF_MENU) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INHH PV Status")
+        menu(scalcoutINAV)
+    }
+    field(IIIV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INII PV Status")
+        menu(scalcoutINAV)
+        initial("1")
+    }
+    field(IJJV, DBF_MENU) {
+        menu(scalcoutINAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INJJ PV Status")
+        initial("1")
+    }
+    field(IKKV, DBF_MENU) {
+        menu(scalcoutINAV)
+        prompt("INKK PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(ILLV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INLL PV Status")
+        menu(scalcoutINAV)
+        initial("1")
+    }
+    field(OUTV, DBF_MENU) {
+        menu(scalcoutINAV)
+        prompt("OUT PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(OOPT, DBF_MENU) {
+        prompt("Output Execute Opt")
+        interest(1)
+        promptgroup("30 - Action")
+        menu(scalcoutOOPT)
+    }
+    field(ODLY, DBF_DOUBLE) {
+        prompt("Output Execute Delay")
+        promptgroup("70 - Alarm")
+        interest(1)
+        asl(ASL0)
+    }
+    field(WAIT, DBF_MENU) {
+        menu(scalcoutWAIT)
+        interest(1)
+        prompt("Wait for completion?")
+    }
+    field(DLYA, DBF_USHORT) {
+        special(SPC_NOMOD)
+        prompt("Output Delay Active")
+        asl(ASL0)
+    }
+    field(DOPT, DBF_MENU) {
+        menu(scalcoutDOPT)
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Output Data Opt")
+    }
+    field(OCAL, DBF_STRING) {
+        prompt("Output Calculation")
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        size(80)
+        pp(TRUE)
+    }
+    field(OCLV, DBF_LONG) {
+        prompt("OCAL Valid")
+        interest(1)
+    }
+    field(OEVT, DBF_USHORT) {
+        asl(ASL0)
+        promptgroup("30 - Action")
+        prompt("Event To Issue")
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID output action")
+        promptgroup("50 - Output")
+        interest(2)
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_DOUBLE) {
+        interest(2)
+        promptgroup("50 - Output")
+        prompt("INVALID output value")
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Units Name")
+        promptgroup("80 - Display")
+        interest(1)
+        size(16)
+    }
+    field(PREC, DBF_SHORT) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Display Precision")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Rng")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prompt("Low Operating Range")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(HIHI, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Hihi Alarm Limit")
+        pp(TRUE)
+    }
+    field(LOLO, DBF_DOUBLE) {
+        prompt("Lolo Alarm Limit")
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(HIGH, DBF_DOUBLE) {
+        prompt("High Alarm Limit")
+        interest(1)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(LOW, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Alarm Limit")
+    }
+    field(HHSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("Hihi Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LLSV, DBF_MENU) {
+        prompt("Lolo Severity")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        prompt("High Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Severity")
+        pp(TRUE)
+    }
+    field(HYST, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Deadband")
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Monitor Deadband")
+    }
+    field(A, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input A")
+        pp(TRUE)
+    }
+    field(B, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input B")
+        pp(TRUE)
+    }
+    field(C, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input C")
+        pp(TRUE)
+    }
+    field(D, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input D")
+        promptgroup("10 - Common")
+    }
+    field(E, DBF_DOUBLE) {
+        prompt("Value of Input E")
+        promptgroup("10 - Common")
+        pp(TRUE)
+    }
+    field(F, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input F")
+        pp(TRUE)
+    }
+    field(G, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input G")
+        pp(TRUE)
+    }
+    field(H, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input H")
+        pp(TRUE)
+    }
+    field(I, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input I")
+        promptgroup("10 - Common")
+    }
+    field(J, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input J")
+        pp(TRUE)
+    }
+    field(K, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        prompt("Value of Input K")
+        pp(TRUE)
+    }
+    field(L, DBF_DOUBLE) {
+        prompt("Value of Input L")
+        promptgroup("10 - Common")
+        pp(TRUE)
+    }
+    field(STRS, DBF_NOACCESS) {
+        extra("char **strs")
+        size(4)
+        interest(4)
+        prompt("Array of string pointers")
+    }
+    field(AA, DBF_STRING) {
+        prompt("Value of string input AA")
+        interest(4)
+        promptgroup("10 - Common")
+        pp(TRUE)
+        size(40)
+    }
+    field(BB, DBF_STRING) {
+        promptgroup("10 - Common")
+        interest(4)
+        prompt("Value of string input BB")
+        size(40)
+        pp(TRUE)
+    }
+    field(CC, DBF_STRING) {
+        pp(TRUE)
+        size(40)
+        prompt("Value of string input CC")
+        interest(4)
+        promptgroup("10 - Common")
+    }
+    field(DD, DBF_STRING) {
+        pp(TRUE)
+        size(40)
+        prompt("Value of string input DD")
+        promptgroup("10 - Common")
+        interest(4)
+    }
+    field(EE, DBF_STRING) {
+        prompt("Value of string input EE")
+        promptgroup("10 - Common")
+        interest(4)
+        pp(TRUE)
+        size(40)
+    }
+    field(FF, DBF_STRING) {
+        prompt("Value of string input FF")
+        promptgroup("10 - Common")
+        interest(4)
+        pp(TRUE)
+        size(40)
+    }
+    field(GG, DBF_STRING) {
+        size(40)
+        pp(TRUE)
+        interest(4)
+        promptgroup("10 - Common")
+        prompt("Value of string input GG")
+    }
+    field(HH, DBF_STRING) {
+        interest(4)
+        promptgroup("10 - Common")
+        prompt("Value of string input HH")
+        size(40)
+        pp(TRUE)
+    }
+    field(II, DBF_STRING) {
+        promptgroup("10 - Common")
+        interest(4)
+        prompt("Value of string input II")
+        size(40)
+        pp(TRUE)
+    }
+    field(JJ, DBF_STRING) {
+        pp(TRUE)
+        size(40)
+        promptgroup("10 - Common")
+        interest(4)
+        prompt("Value of string input JJ")
+    }
+    field(KK, DBF_STRING) {
+        prompt("Value of string input KK")
+        interest(4)
+        promptgroup("10 - Common")
+        size(40)
+        pp(TRUE)
+    }
+    field(LL, DBF_STRING) {
+        promptgroup("10 - Common")
+        interest(4)
+        prompt("Value of string input LL")
+        size(40)
+        pp(TRUE)
+    }
+    field(PAA, DBF_NOACCESS) {
+        size(4)
+        extra("char *paa")
+        prompt("Prev Value of AA")
+        interest(4)
+        special(SPC_DBADDR)
+    }
+    field(PBB, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        interest(4)
+        prompt("Prev Value of BB")
+        extra("char *pbb")
+        size(4)
+    }
+    field(PCC, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_DBADDR)
+        prompt("Prev Value of CC")
+        extra("char *pcc")
+        size(4)
+    }
+    field(PDD, DBF_NOACCESS) {
+        extra("char *pdd")
+        size(4)
+        special(SPC_DBADDR)
+        interest(4)
+        prompt("Prev Value of DD")
+    }
+    field(PEE, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_DBADDR)
+        prompt("Prev Value of EE")
+        extra("char *pee")
+        size(4)
+    }
+    field(PFF, DBF_NOACCESS) {
+        size(4)
+        extra("char *pff")
+        prompt("Prev Value of FF")
+        interest(4)
+        special(SPC_DBADDR)
+    }
+    field(PGG, DBF_NOACCESS) {
+        extra("char *pgg")
+        size(4)
+        special(SPC_DBADDR)
+        interest(4)
+        prompt("Prev Value of GG")
+    }
+    field(PHH, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_DBADDR)
+        prompt("Prev Value of HH")
+        extra("char *phh")
+        size(4)
+    }
+    field(PII, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        interest(4)
+        prompt("Prev Value of II")
+        extra("char *pii")
+        size(4)
+    }
+    field(PJJ, DBF_NOACCESS) {
+        prompt("Prev Value of JJ")
+        interest(4)
+        special(SPC_DBADDR)
+        size(4)
+        extra("char *pjj")
+    }
+    field(PKK, DBF_NOACCESS) {
+        extra("char *pkk")
+        size(4)
+        special(SPC_DBADDR)
+        interest(4)
+        prompt("Prev Value of KK")
+    }
+    field(PLL, DBF_NOACCESS) {
+        size(4)
+        extra("char *pll")
+        prompt("Prev Value of LL")
+        interest(4)
+        special(SPC_DBADDR)
+    }
+    field(OVAL, DBF_DOUBLE) {
+        prompt("Output Value")
+        asl(ASL0)
+    }
+    field(OSV, DBF_STRING) {
+        prompt("Output string value")
+        asl(ASL0)
+        size(40)
+    }
+    field(POSV, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Previous output string value")
+        size(40)
+    }
+    field(PA, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of A")
+    }
+    field(PB, DBF_DOUBLE) {
+        prompt("Prev Value of B")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(PC, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of C")
+    }
+    field(PD, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of D")
+    }
+    field(PE, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of E")
+    }
+    field(PF, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of F")
+    }
+    field(PG, DBF_DOUBLE) {
+        prompt("Prev Value of G")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PH, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of H")
+    }
+    field(PI, DBF_DOUBLE) {
+        prompt("Prev Value of I")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(PJ, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of J")
+    }
+    field(PK, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of K")
+    }
+    field(PL, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of L")
+    }
+    field(POVL, DBF_DOUBLE) {
+        prompt("Prev Value of OVAL")
+        asl(ASL0)
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(ALST, DBF_DOUBLE) {
+        prompt("Last Value Archived")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(MLST, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Val Monitored")
+    }
+    field(RPCL, DBF_NOACCESS) {
+        prompt("Postfix Calc")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("unsigned char rpcl[282]")
+    }
+    field(ORPC, DBF_NOACCESS) {
+        extra("unsigned char orpc[282]")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Postfix OCalc")
+    }
+}
+device(scalcout, CONSTANT, devsCalcoutSoft, "Soft Channel")
+device(scalcout, INST_IO, devscalcoutStream, "stream")
+recordtype(acalcout) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKT, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Forward Process Link")
+    }
+    field(VERS, DBF_DOUBLE) {
+        initial("1")
+        special(SPC_NOMOD)
+        prompt("Code Version")
+    }
+    field(RPVT, DBF_NOACCESS) {
+        size(4)
+        extra("void *rpvt")
+        prompt("Record Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(VAL, DBF_DOUBLE) {
+        asl(ASL0)
+        prompt("Result")
+    }
+    field(AVAL, DBF_NOACCESS) {
+        pp(TRUE)
+        extra("double *aval")
+        asl(ASL0)
+        prompt("Array Value")
+        special(SPC_DBADDR)
+    }
+    field(NELM, DBF_ULONG) {
+        prompt("Number of Elements")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("30 - Action")
+        initial("1")
+    }
+    field(NUSE, DBF_ULONG) {
+        pp(TRUE)
+        initial("0")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("# elem's in use")
+    }
+    field(PVAL, DBF_DOUBLE) {
+        prompt("Previous Value")
+    }
+    field(PAVL, DBF_NOACCESS) {
+        prompt("Prev. Array Value")
+        asl(ASL0)
+        extra("double *pavl")
+        pp(TRUE)
+    }
+    field(CALC, DBF_STRING) {
+        pp(TRUE)
+        size(80)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("Calculation")
+    }
+    field(CLCV, DBF_LONG) {
+        prompt("CALC Valid")
+        interest(1)
+    }
+    field(INPA, DBF_INLINK) {
+        prompt("Input A")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPB, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input B")
+    }
+    field(INPC, DBF_INLINK) {
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("Input C")
+    }
+    field(INPD, DBF_INLINK) {
+        prompt("Input D")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPE, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Input E")
+    }
+    field(INPF, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input F")
+    }
+    field(INPG, DBF_INLINK) {
+        prompt("Input G")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(INPH, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input H")
+    }
+    field(INPI, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input I")
+    }
+    field(INPJ, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Input J")
+    }
+    field(INPK, DBF_INLINK) {
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input K")
+    }
+    field(INPL, DBF_INLINK) {
+        prompt("Input L")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INAA, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Array input AA")
+    }
+    field(INBB, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Array input BB")
+    }
+    field(INCC, DBF_INLINK) {
+        prompt("Array input CC")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(INDD, DBF_INLINK) {
+        prompt("Array input DD")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INEE, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Array input EE")
+    }
+    field(INFF, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        prompt("Array input FF")
+    }
+    field(INGG, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Array input GG")
+    }
+    field(INHH, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Array input HH")
+    }
+    field(INII, DBF_INLINK) {
+        prompt("Array input II")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(INJJ, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Array input JJ")
+    }
+    field(INKK, DBF_INLINK) {
+        prompt("Array input KK")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(INLL, DBF_INLINK) {
+        prompt("Array input LL")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Link")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("50 - Output")
+    }
+    field(INAV, DBF_MENU) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPA PV Status")
+        menu(acalcoutINAV)
+    }
+    field(INBV, DBF_MENU) {
+        menu(acalcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPB PV Status")
+        initial("1")
+    }
+    field(INCV, DBF_MENU) {
+        initial("1")
+        prompt("INPC PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(acalcoutINAV)
+    }
+    field(INDV, DBF_MENU) {
+        menu(acalcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPD PV Status")
+        initial("1")
+    }
+    field(INEV, DBF_MENU) {
+        initial("1")
+        menu(acalcoutINAV)
+        prompt("INPE PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(INFV, DBF_MENU) {
+        initial("1")
+        menu(acalcoutINAV)
+        prompt("INPF PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(INGV, DBF_MENU) {
+        menu(acalcoutINAV)
+        prompt("INPG PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(INHV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPH PV Status")
+        menu(acalcoutINAV)
+        initial("1")
+    }
+    field(INIV, DBF_MENU) {
+        initial("1")
+        menu(acalcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPI PV Status")
+    }
+    field(INJV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPJ PV Status")
+        menu(acalcoutINAV)
+    }
+    field(INKV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPK PV Status")
+        menu(acalcoutINAV)
+    }
+    field(INLV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPL PV Status")
+        menu(acalcoutINAV)
+        initial("1")
+    }
+    field(IAAV, DBF_MENU) {
+        menu(acalcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INAA PV Status")
+        initial("1")
+    }
+    field(IBBV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INBB PV Status")
+        menu(acalcoutINAV)
+        initial("1")
+    }
+    field(ICCV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INCC PV Status")
+        menu(acalcoutINAV)
+    }
+    field(IDDV, DBF_MENU) {
+        initial("1")
+        prompt("INDD PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(acalcoutINAV)
+    }
+    field(IEEV, DBF_MENU) {
+        menu(acalcoutINAV)
+        prompt("INEE PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(IFFV, DBF_MENU) {
+        initial("1")
+        prompt("INFF PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(acalcoutINAV)
+    }
+    field(IGGV, DBF_MENU) {
+        menu(acalcoutINAV)
+        prompt("INGG PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(IHHV, DBF_MENU) {
+        initial("1")
+        prompt("INHH PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(acalcoutINAV)
+    }
+    field(IIIV, DBF_MENU) {
+        initial("1")
+        menu(acalcoutINAV)
+        prompt("INII PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(IJJV, DBF_MENU) {
+        initial("1")
+        prompt("INJJ PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(acalcoutINAV)
+    }
+    field(IKKV, DBF_MENU) {
+        menu(acalcoutINAV)
+        prompt("INKK PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(ILLV, DBF_MENU) {
+        initial("1")
+        menu(acalcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INLL PV Status")
+    }
+    field(OUTV, DBF_MENU) {
+        menu(acalcoutINAV)
+        prompt("OUT PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(OOPT, DBF_MENU) {
+        prompt("Output Execute Opt")
+        interest(1)
+        promptgroup("30 - Action")
+        menu(acalcoutOOPT)
+    }
+    field(ODLY, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Output Execute Delay")
+        asl(ASL0)
+    }
+    field(WAIT, DBF_MENU) {
+        interest(1)
+        prompt("Wait for completion?")
+        menu(acalcoutWAIT)
+    }
+    field(DLYA, DBF_USHORT) {
+        asl(ASL0)
+        special(SPC_NOMOD)
+        prompt("Output Delay Active")
+    }
+    field(DOPT, DBF_MENU) {
+        menu(acalcoutDOPT)
+        prompt("Output Data Opt")
+        promptgroup("30 - Action")
+        interest(1)
+    }
+    field(OCAL, DBF_STRING) {
+        pp(TRUE)
+        size(80)
+        prompt("Output Calculation")
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+    }
+    field(OCLV, DBF_LONG) {
+        prompt("OCAL Valid")
+        interest(1)
+    }
+    field(OEVT, DBF_USHORT) {
+        promptgroup("30 - Action")
+        prompt("Event To Issue")
+        asl(ASL0)
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID output action")
+        interest(2)
+        promptgroup("50 - Output")
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_DOUBLE) {
+        promptgroup("50 - Output")
+        interest(2)
+        prompt("INVALID output value")
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Units Name")
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Rng")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(LOPR, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Low Operating Range")
+    }
+    field(HIHI, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Hihi Alarm Limit")
+    }
+    field(LOLO, DBF_DOUBLE) {
+        prompt("Lolo Alarm Limit")
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(HIGH, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("High Alarm Limit")
+        pp(TRUE)
+    }
+    field(LOW, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Alarm Limit")
+    }
+    field(HHSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Hihi Severity")
+        pp(TRUE)
+    }
+    field(LLSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Lolo Severity")
+        interest(1)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("High Severity")
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Severity")
+        pp(TRUE)
+    }
+    field(HYST, DBF_DOUBLE) {
+        prompt("Alarm Deadband")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Monitor Deadband")
+    }
+    field(A, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input A")
+    }
+    field(B, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input B")
+    }
+    field(C, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input C")
+    }
+    field(D, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input D")
+    }
+    field(E, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input E")
+    }
+    field(F, DBF_DOUBLE) {
+        prompt("Value of Input F")
+        pp(TRUE)
+    }
+    field(G, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input G")
+    }
+    field(H, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input H")
+    }
+    field(I, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input I")
+    }
+    field(J, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input J")
+    }
+    field(K, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input K")
+    }
+    field(L, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input L")
+    }
+    field(AA, DBF_NOACCESS) {
+        pp(TRUE)
+        extra("double *aa")
+        prompt("Value of array input")
+        special(SPC_DBADDR)
+        asl(ASL0)
+    }
+    field(BB, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+        asl(ASL0)
+        extra("double *bb")
+        pp(TRUE)
+    }
+    field(CC, DBF_NOACCESS) {
+        extra("double *cc")
+        pp(TRUE)
+        asl(ASL0)
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+    }
+    field(DD, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+        asl(ASL0)
+        extra("double *dd")
+        pp(TRUE)
+    }
+    field(EE, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+        asl(ASL0)
+        extra("double *ee")
+        pp(TRUE)
+    }
+    field(FF, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Value of array input")
+        special(SPC_DBADDR)
+        pp(TRUE)
+        extra("double *ff")
+    }
+    field(GG, DBF_NOACCESS) {
+        prompt("Value of array input")
+        special(SPC_DBADDR)
+        asl(ASL0)
+        pp(TRUE)
+        extra("double *gg")
+    }
+    field(HH, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Value of array input")
+        special(SPC_DBADDR)
+        pp(TRUE)
+        extra("double *hh")
+    }
+    field(II, DBF_NOACCESS) {
+        asl(ASL0)
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+        extra("double *ii")
+        pp(TRUE)
+    }
+    field(JJ, DBF_NOACCESS) {
+        extra("double *jj")
+        pp(TRUE)
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+        asl(ASL0)
+    }
+    field(KK, DBF_NOACCESS) {
+        extra("double *kk")
+        pp(TRUE)
+        asl(ASL0)
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+    }
+    field(LL, DBF_NOACCESS) {
+        asl(ASL0)
+        special(SPC_DBADDR)
+        prompt("Value of array input")
+        extra("double *ll")
+        pp(TRUE)
+    }
+    field(PAA, DBF_NOACCESS) {
+        extra("double *paa")
+        prompt("Prev Val of array input")
+        asl(ASL0)
+    }
+    field(NEWM, DBF_ULONG) {
+        prompt("new array value mask")
+        special(SPC_NOMOD)
+        asl(ASL0)
+    }
+    field(OVAL, DBF_DOUBLE) {
+        prompt("Output Value")
+        asl(ASL0)
+    }
+    field(OAV, DBF_NOACCESS) {
+        pp(TRUE)
+        extra("double *oav")
+        asl(ASL0)
+        prompt("Output array value")
+        special(SPC_DBADDR)
+    }
+    field(POAV, DBF_NOACCESS) {
+        prompt("Output array value")
+        asl(ASL0)
+        pp(TRUE)
+        extra("double *poav")
+    }
+    field(PA, DBF_DOUBLE) {
+        prompt("Prev Value of A")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PB, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of B")
+    }
+    field(PC, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of C")
+    }
+    field(PD, DBF_DOUBLE) {
+        prompt("Prev Value of D")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PE, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of E")
+    }
+    field(PF, DBF_DOUBLE) {
+        prompt("Prev Value of F")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PG, DBF_DOUBLE) {
+        prompt("Prev Value of G")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PH, DBF_DOUBLE) {
+        prompt("Prev Value of H")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PI, DBF_DOUBLE) {
+        prompt("Prev Value of I")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(PJ, DBF_DOUBLE) {
+        prompt("Prev Value of J")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PK, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of K")
+    }
+    field(PL, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of L")
+    }
+    field(POVL, DBF_DOUBLE) {
+        asl(ASL0)
+        prompt("Prev Value of OVAL")
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ALST, DBF_DOUBLE) {
+        prompt("Last Value Archived")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(MLST, DBF_DOUBLE) {
+        prompt("Last Val Monitored")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(RPCL, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Reverse Polish Calc")
+        extra("unsigned char rpcl[282]")
+    }
+    field(ORPC, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Reverse Polish OCalc")
+        extra("unsigned char orpc[282]")
+    }
+    field(CACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Calc active")
+    }
+    field(CSTAT, DBF_LONG) {
+        prompt("Calc status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(AMASK, DBF_ULONG) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Array mod")
+    }
+    field(SIZE, DBF_MENU) {
+        menu(acalcoutSIZE)
+        interest(1)
+        prompt("Array size reported to clients")
+    }
+    field(AMEM, DBF_LONG) {
+        prompt("Allocated array memory")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PMEM, DBF_LONG) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Prev array memory")
+    }
+}
+device(acalcout, CONSTANT, devaCalcoutSoft, "Soft Channel")
+recordtype(stringout) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Force Processing")
+        interest(3)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        prompt("Alarm Ack Transient")
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(VAL, DBF_STRING) {
+        pp(TRUE)
+        size(40)
+        asl(ASL0)
+        promptgroup("50 - Output")
+        prompt("Current Value")
+    }
+    field(OVAL, DBF_STRING) {
+        size(40)
+        prompt("Previous Value")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(DOL, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Desired Output Loc")
+    }
+    field(OMSL, DBF_MENU) {
+        prompt("Output Mode Select")
+        interest(1)
+        promptgroup("50 - Output")
+        menu(menuOmsl)
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Specification")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(MPST, DBF_MENU) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Post Value Monitors")
+        menu(stringoutPOST)
+    }
+    field(APST, DBF_MENU) {
+        menu(stringoutPOST)
+        prompt("Post Archive Monitors")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(SIOL, DBF_OUTLINK) {
+        prompt("Simulation Output Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        interest(1)
+        special(SPC_MOD)
+        prompt("Simulation Mode")
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        special(SPC_NOMOD)
+        interest(4)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+    }
+    field(SDLY, DBF_DOUBLE) {
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Async Delay")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        prompt("Sim. Mode Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("CALLBACK            *simpvt")
+    }
+    field(IVOA, DBF_MENU) {
+        interest(2)
+        promptgroup("50 - Output")
+        prompt("INVALID output action")
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_STRING) {
+        promptgroup("50 - Output")
+        interest(2)
+        prompt("INVALID output value")
+        size(40)
+    }
+}
+device(stringout, CONSTANT, devSoSoft, "Soft Channel")
+device(stringout, CONSTANT, devSoSoftCallback, "Async Soft Channel")
+device(stringout, INST_IO, devSoStdio, "stdio")
+device(stringout, INST_IO, asynSoOctetWrite, "asynOctetWrite")
+device(stringout, INST_IO, devstringoutStream, "stream")
+device(stringout, INST_IO, devSoStrParm, "asyn so stringParm")
+device(stringout, INST_IO, devSoEurotherm, "asyn so Eurotherm")
+device(stringout, INST_IO, devSoMPC, "asyn MPC")
+recordtype(stringin) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        prompt("Alarm Ack Transient")
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_STRING) {
+        asl(ASL0)
+        promptgroup("40 - Input")
+        prompt("Current Value")
+        pp(TRUE)
+        size(40)
+    }
+    field(OVAL, DBF_STRING) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Previous Value")
+        size(40)
+    }
+    field(INP, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input Specification")
+    }
+    field(MPST, DBF_MENU) {
+        menu(stringinPOST)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Post Value Monitors")
+    }
+    field(APST, DBF_MENU) {
+        menu(stringinPOST)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Post Archive Monitors")
+    }
+    field(SIOL, DBF_INLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Input Link")
+    }
+    field(SVAL, DBF_STRING) {
+        prompt("Simulation Value")
+        pp(TRUE)
+        size(40)
+    }
+    field(SIML, DBF_INLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Link")
+    }
+    field(SIMM, DBF_MENU) {
+        interest(1)
+        special(SPC_MOD)
+        prompt("Simulation Mode")
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Simulation Mode Severity")
+        promptgroup("90 - Simulate")
+        interest(2)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        menu(menuSimm)
+        prompt("Prev. Simulation Mode")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+    }
+    field(SDLY, DBF_DOUBLE) {
+        prompt("Sim. Mode Async Delay")
+        promptgroup("90 - Simulate")
+        interest(2)
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        prompt("Sim. Mode Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("CALLBACK            *simpvt")
+    }
+}
+device(stringin, CONSTANT, devSiSoft, "Soft Channel")
+device(stringin, CONSTANT, devSiSoftCallback, "Async Soft Channel")
+device(stringin, INST_IO, devTimestampSI, "Soft Timestamp")
+device(stringin, INST_IO, devSiGeneralTime, "General Time")
+device(stringin, INST_IO, devSiEnviron, "getenv")
+device(stringin, INST_IO, asynSiOctetCmdResponse, "asynOctetCmdResponse")
+device(stringin, INST_IO, asynSiOctetWriteRead, "asynOctetWriteRead")
+device(stringin, INST_IO, asynSiOctetRead, "asynOctetRead")
+device(stringin, INST_IO, devstringinStream, "stream")
+device(stringin, INST_IO, devSiStrParm, "asyn si stringParm")
+device(stringin, INST_IO, devSiMPC, "asyn MPC")
+device(stringin, GPIB_IO, devSiGP307Gpib, "Vg307 GPIB Instrument")
+device(stringin, INST_IO, devSiTPG261, "asyn TPG261")
+recordtype(calc) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "postfix.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PHAS, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Event Name")
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        prompt("Alarm Ack Transient")
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_DOUBLE) {
+        asl(ASL0)
+        prompt("Result")
+        promptgroup("50 - Output")
+    }
+    field(CALC, DBF_STRING) {
+        pp(TRUE)
+        initial("0")
+        size(80)
+        prompt("Calculation")
+        promptgroup("30 - Action")
+        special(SPC_CALC)
+    }
+    field(INPA, DBF_INLINK) {
+        promptgroup("41 - Input A-F")
+        interest(1)
+        prompt("Input A")
+    }
+    field(INPB, DBF_INLINK) {
+        promptgroup("41 - Input A-F")
+        interest(1)
+        prompt("Input B")
+    }
+    field(INPC, DBF_INLINK) {
+        promptgroup("41 - Input A-F")
+        interest(1)
+        prompt("Input C")
+    }
+    field(INPD, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Input A-F")
+        prompt("Input D")
+    }
+    field(INPE, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Input A-F")
+        prompt("Input E")
+    }
+    field(INPF, DBF_INLINK) {
+        prompt("Input F")
+        interest(1)
+        promptgroup("41 - Input A-F")
+    }
+    field(INPG, DBF_INLINK) {
+        promptgroup("42 - Input G-L")
+        interest(1)
+        prompt("Input G")
+    }
+    field(INPH, DBF_INLINK) {
+        prompt("Input H")
+        interest(1)
+        promptgroup("42 - Input G-L")
+    }
+    field(INPI, DBF_INLINK) {
+        prompt("Input I")
+        interest(1)
+        promptgroup("42 - Input G-L")
+    }
+    field(INPJ, DBF_INLINK) {
+        prompt("Input J")
+        promptgroup("42 - Input G-L")
+        interest(1)
+    }
+    field(INPK, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Input G-L")
+        prompt("Input K")
+    }
+    field(INPL, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Input G-L")
+        prompt("Input L")
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Engineering Units")
+    }
+    field(PREC, DBF_SHORT) {
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Display Precision")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Rng")
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Low Operating Range")
+    }
+    field(HIHI, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Hihi Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(LOLO, DBF_DOUBLE) {
+        prompt("Lolo Alarm Limit")
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(HIGH, DBF_DOUBLE) {
+        prompt("High Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(LOW, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Low Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(HHSV, DBF_MENU) {
+        prompt("Hihi Severity")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(LLSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("Lolo Severity")
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(HSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("High Severity")
+        menu(menuAlarmSevr)
+    }
+    field(LSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Low Severity")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(AFTC, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Alarm Filter Time Constant")
+    }
+    field(AFVL, DBF_DOUBLE) {
+        prompt("Alarm Filter Value")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(HYST, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Alarm Deadband")
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        prompt("Monitor Deadband")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(A, DBF_DOUBLE) {
+        prompt("Value of Input A")
+        pp(TRUE)
+    }
+    field(B, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input B")
+    }
+    field(C, DBF_DOUBLE) {
+        prompt("Value of Input C")
+        pp(TRUE)
+    }
+    field(D, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input D")
+    }
+    field(E, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input E")
+    }
+    field(F, DBF_DOUBLE) {
+        prompt("Value of Input F")
+        pp(TRUE)
+    }
+    field(G, DBF_DOUBLE) {
+        prompt("Value of Input G")
+        pp(TRUE)
+    }
+    field(H, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input H")
+    }
+    field(I, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input I")
+    }
+    field(J, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input J")
+    }
+    field(K, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input K")
+    }
+    field(L, DBF_DOUBLE) {
+        prompt("Value of Input L")
+        pp(TRUE)
+    }
+    field(LA, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of A")
+    }
+    field(LB, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of B")
+    }
+    field(LC, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of C")
+    }
+    field(LD, DBF_DOUBLE) {
+        prompt("Prev Value of D")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LE, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of E")
+    }
+    field(LF, DBF_DOUBLE) {
+        prompt("Prev Value of F")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LG, DBF_DOUBLE) {
+        prompt("Prev Value of G")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LH, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of H")
+    }
+    field(LI, DBF_DOUBLE) {
+        prompt("Prev Value of I")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LJ, DBF_DOUBLE) {
+        prompt("Prev Value of J")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LK, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of K")
+    }
+    field(LL, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of L")
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ALST, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Archived")
+    }
+    field(MLST, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Val Monitored")
+    }
+    field(RPCL, DBF_NOACCESS) {
+        extra("char	rpcl[INFIX_TO_POSTFIX_SIZE(80)]")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Reverse Polish Calc")
+    }
+}
+recordtype(calcout) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "dbScan.h"
+    %#include "postfix.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+    }
+    field(SCAN, DBF_MENU) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        interest(3)
+        prompt("Force Processing")
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPN, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(RPVT, DBF_NOACCESS) {
+        prompt("Record Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct rpvtStruct *rpvt")
+    }
+    field(VAL, DBF_DOUBLE) {
+        asl(ASL0)
+        promptgroup("50 - Output")
+        prompt("Result")
+    }
+    field(PVAL, DBF_DOUBLE) {
+        prompt("Previous Value")
+    }
+    field(CALC, DBF_STRING) {
+        prompt("Calculation")
+        promptgroup("30 - Action")
+        special(SPC_CALC)
+        size(80)
+        initial("0")
+        pp(TRUE)
+    }
+    field(CLCV, DBF_LONG) {
+        prompt("CALC Valid")
+        interest(1)
+    }
+    field(INPA, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("41 - Input A-F")
+        prompt("Input A")
+    }
+    field(INPB, DBF_INLINK) {
+        prompt("Input B")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("41 - Input A-F")
+    }
+    field(INPC, DBF_INLINK) {
+        prompt("Input C")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("41 - Input A-F")
+    }
+    field(INPD, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("41 - Input A-F")
+        prompt("Input D")
+    }
+    field(INPE, DBF_INLINK) {
+        promptgroup("41 - Input A-F")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input E")
+    }
+    field(INPF, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Input A-F")
+        special(SPC_MOD)
+        prompt("Input F")
+    }
+    field(INPG, DBF_INLINK) {
+        promptgroup("42 - Input G-L")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input G")
+    }
+    field(INPH, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("42 - Input G-L")
+        prompt("Input H")
+    }
+    field(INPI, DBF_INLINK) {
+        prompt("Input I")
+        promptgroup("42 - Input G-L")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPJ, DBF_INLINK) {
+        prompt("Input J")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("42 - Input G-L")
+    }
+    field(INPK, DBF_INLINK) {
+        prompt("Input K")
+        promptgroup("42 - Input G-L")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPL, DBF_INLINK) {
+        prompt("Input L")
+        interest(1)
+        promptgroup("42 - Input G-L")
+        special(SPC_MOD)
+    }
+    field(OUT, DBF_OUTLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("50 - Output")
+        prompt("Output Specification")
+    }
+    field(INAV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPA PV Status")
+        menu(calcoutINAV)
+        initial("1")
+    }
+    field(INBV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPB PV Status")
+        menu(calcoutINAV)
+    }
+    field(INCV, DBF_MENU) {
+        menu(calcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPC PV Status")
+        initial("1")
+    }
+    field(INDV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPD PV Status")
+        menu(calcoutINAV)
+        initial("1")
+    }
+    field(INEV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPE PV Status")
+        menu(calcoutINAV)
+    }
+    field(INFV, DBF_MENU) {
+        menu(calcoutINAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPF PV Status")
+        initial("1")
+    }
+    field(INGV, DBF_MENU) {
+        menu(calcoutINAV)
+        prompt("INPG PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        initial("1")
+    }
+    field(INHV, DBF_MENU) {
+        prompt("INPH PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(calcoutINAV)
+        initial("1")
+    }
+    field(INIV, DBF_MENU) {
+        initial("1")
+        menu(calcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPI PV Status")
+    }
+    field(INJV, DBF_MENU) {
+        prompt("INPJ PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(calcoutINAV)
+        initial("1")
+    }
+    field(INKV, DBF_MENU) {
+        menu(calcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPK PV Status")
+        initial("1")
+    }
+    field(INLV, DBF_MENU) {
+        initial("1")
+        prompt("INPL PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(calcoutINAV)
+    }
+    field(OUTV, DBF_MENU) {
+        menu(calcoutINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("OUT PV Status")
+    }
+    field(OOPT, DBF_MENU) {
+        menu(calcoutOOPT)
+        prompt("Output Execute Opt")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(ODLY, DBF_DOUBLE) {
+        asl(ASL0)
+        prompt("Output Execute Delay")
+        interest(1)
+        promptgroup("50 - Output")
+    }
+    field(DLYA, DBF_USHORT) {
+        asl(ASL0)
+        prompt("Output Delay Active")
+        special(SPC_NOMOD)
+    }
+    field(DOPT, DBF_MENU) {
+        prompt("Output Data Opt")
+        promptgroup("30 - Action")
+        interest(1)
+        menu(calcoutDOPT)
+    }
+    field(OCAL, DBF_STRING) {
+        prompt("Output Calculation")
+        promptgroup("30 - Action")
+        special(SPC_CALC)
+        initial("0")
+        size(80)
+        pp(TRUE)
+    }
+    field(OCLV, DBF_LONG) {
+        interest(1)
+        prompt("OCAL Valid")
+    }
+    field(OEVT, DBF_STRING) {
+        size(40)
+        prompt("Event To Issue")
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        asl(ASL0)
+    }
+    field(EPVT, DBF_NOACCESS) {
+        prompt("Event private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("EVENTPVT epvt")
+    }
+    field(IVOA, DBF_MENU) {
+        menu(menuIvoa)
+        promptgroup("50 - Output")
+        interest(2)
+        prompt("INVALID output action")
+    }
+    field(IVOV, DBF_DOUBLE) {
+        prompt("INVALID output value")
+        interest(2)
+        promptgroup("50 - Output")
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+        prompt("Engineering Units")
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Rng")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prompt("Low Operating Range")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(HIHI, DBF_DOUBLE) {
+        prompt("Hihi Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(LOLO, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Lolo Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(HIGH, DBF_DOUBLE) {
+        pp(TRUE)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("High Alarm Limit")
+    }
+    field(LOW, DBF_DOUBLE) {
+        pp(TRUE)
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Low Alarm Limit")
+    }
+    field(HHSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Hihi Severity")
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(LLSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("Lolo Severity")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(HSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("High Severity")
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        pp(TRUE)
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Low Severity")
+        menu(menuAlarmSevr)
+    }
+    field(HYST, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Deadband")
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Monitor Deadband")
+    }
+    field(A, DBF_DOUBLE) {
+        prompt("Value of Input A")
+        pp(TRUE)
+    }
+    field(B, DBF_DOUBLE) {
+        prompt("Value of Input B")
+        pp(TRUE)
+    }
+    field(C, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input C")
+    }
+    field(D, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input D")
+    }
+    field(E, DBF_DOUBLE) {
+        prompt("Value of Input E")
+        pp(TRUE)
+    }
+    field(F, DBF_DOUBLE) {
+        prompt("Value of Input F")
+        pp(TRUE)
+    }
+    field(G, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input G")
+    }
+    field(H, DBF_DOUBLE) {
+        prompt("Value of Input H")
+        pp(TRUE)
+    }
+    field(I, DBF_DOUBLE) {
+        prompt("Value of Input I")
+        pp(TRUE)
+    }
+    field(J, DBF_DOUBLE) {
+        prompt("Value of Input J")
+        pp(TRUE)
+    }
+    field(K, DBF_DOUBLE) {
+        prompt("Value of Input K")
+        pp(TRUE)
+    }
+    field(L, DBF_DOUBLE) {
+        prompt("Value of Input L")
+        pp(TRUE)
+    }
+    field(OVAL, DBF_DOUBLE) {
+        prompt("Output Value")
+        asl(ASL0)
+    }
+    field(LA, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of A")
+    }
+    field(LB, DBF_DOUBLE) {
+        prompt("Prev Value of B")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LC, DBF_DOUBLE) {
+        prompt("Prev Value of C")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LD, DBF_DOUBLE) {
+        prompt("Prev Value of D")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LE, DBF_DOUBLE) {
+        prompt("Prev Value of E")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LF, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of F")
+    }
+    field(LG, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of G")
+    }
+    field(LH, DBF_DOUBLE) {
+        prompt("Prev Value of H")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LI, DBF_DOUBLE) {
+        prompt("Prev Value of I")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LJ, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of J")
+    }
+    field(LK, DBF_DOUBLE) {
+        prompt("Prev Value of K")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LL, DBF_DOUBLE) {
+        prompt("Prev Value of L")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(POVL, DBF_DOUBLE) {
+        prompt("Prev Value of OVAL")
+        asl(ASL0)
+    }
+    field(LALM, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Alarmed")
+    }
+    field(ALST, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Value Archived")
+    }
+    field(MLST, DBF_DOUBLE) {
+        prompt("Last Val Monitored")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(RPCL, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Reverse Polish Calc")
+        extra("char	rpcl[INFIX_TO_POSTFIX_SIZE(80)]")
+    }
+    field(ORPC, DBF_NOACCESS) {
+        extra("char	orpc[INFIX_TO_POSTFIX_SIZE(80)]")
+        prompt("Reverse Polish OCalc")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+}
+device(calcout, CONSTANT, devCalcoutSoft, "Soft Channel")
+device(calcout, CONSTANT, devCalcoutSoftCallback, "Async Soft Channel")
+device(calcout, INST_IO, devcalcoutStream, "stream")
+recordtype(histogram) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PHAS, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        interest(3)
+        prompt("Force Processing")
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        prompt("Alarm Ack Transient")
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(VAL, DBF_NOACCESS) {
+        extra("void *	val")
+        asl(ASL0)
+        special(SPC_DBADDR)
+        prompt("Value")
+    }
+    field(NELM, DBF_USHORT) {
+        prompt("Num of Array Elements")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("30 - Action")
+        initial("1")
+    }
+    field(CSTA, DBF_SHORT) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Collection Status")
+    }
+    field(CMD, DBF_MENU) {
+        prompt("Collection Control")
+        interest(1)
+        special(SPC_CALC)
+        menu(histogramCMD)
+        asl(ASL0)
+    }
+    field(ULIM, DBF_DOUBLE) {
+        interest(1)
+        prop(YES)
+        special(SPC_RESET)
+        promptgroup("30 - Action")
+        prompt("Upper Signal Limit")
+    }
+    field(LLIM, DBF_DOUBLE) {
+        prompt("Lower Signal Limit ")
+        prop(YES)
+        interest(1)
+        special(SPC_RESET)
+        promptgroup("30 - Action")
+    }
+    field(WDTH, DBF_DOUBLE) {
+        prompt("Element Width")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(SGNL, DBF_DOUBLE) {
+        special(SPC_MOD)
+        prompt("Signal Value")
+    }
+    field(PREC, DBF_SHORT) {
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+        prompt("Display Precision")
+    }
+    field(SVL, DBF_INLINK) {
+        prompt("Signal Value Location")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(BPTR, DBF_NOACCESS) {
+        extra("epicsUInt32 *bptr")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Buffer Pointer")
+    }
+    field(WDOG, DBF_NOACCESS) {
+        extra("void *  wdog")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Watchdog callback")
+    }
+    field(MDEL, DBF_SHORT) {
+        prompt("Monitor Count Deadband")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(MCNT, DBF_SHORT) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Counts Since Monitor")
+    }
+    field(SDEL, DBF_DOUBLE) {
+        prompt("Monitor Seconds Dband")
+        special(SPC_RESET)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(SIOL, DBF_INLINK) {
+        prompt("Simulation Input Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SVAL, DBF_DOUBLE) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMM, DBF_MENU) {
+        prompt("Simulation Mode")
+        interest(1)
+        special(SPC_MOD)
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        prompt("Sim. Mode Scan")
+        promptgroup("90 - Simulate")
+        interest(1)
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Sim. Mode Async Delay")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Sim. Mode Private")
+    }
+    field(HOPR, DBF_ULONG) {
+        prompt("High Operating Range")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_ULONG) {
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        prompt("Low Operating Range")
+    }
+}
+device(histogram, CONSTANT, devHistogramSoft, "Soft Channel")
+recordtype(mbbiDirect) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(MLOK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(NSEV, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        prompt("Alarm Ack Transient")
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_LONG) {
+        pp(TRUE)
+        prompt("Current Value")
+        promptgroup("40 - Input")
+        asl(ASL0)
+    }
+    field(NOBT, DBF_SHORT) {
+        interest(1)
+        promptgroup("40 - Input")
+        special(SPC_NOMOD)
+        prompt("Number of Bits")
+    }
+    field(INP, DBF_INLINK) {
+        prompt("Input Specification")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(RVAL, DBF_ULONG) {
+        pp(TRUE)
+        prompt("Raw Value")
+    }
+    field(ORAW, DBF_ULONG) {
+        prompt("Prev Raw Value")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(MASK, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Hardware Mask")
+    }
+    field(MLST, DBF_LONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Monitored")
+    }
+    field(SHFT, DBF_USHORT) {
+        prompt("Shift")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(SIOL, DBF_INLINK) {
+        prompt("Simulation Input Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SVAL, DBF_LONG) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        prompt("Simulation Mode")
+        special(SPC_MOD)
+        interest(1)
+        menu(menuSimm)
+    }
+    field(SIMS, DBF_MENU) {
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Severity")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        menu(menuScan)
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        prompt("Sim. Mode Async Delay")
+        interest(2)
+        promptgroup("90 - Simulate")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Sim. Mode Private")
+    }
+    field(B0, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 0")
+    }
+    field(B1, DBF_UCHAR) {
+        prompt("Bit 1")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B2, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 2")
+    }
+    field(B3, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 3")
+        interest(1)
+    }
+    field(B4, DBF_UCHAR) {
+        prompt("Bit 4")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B5, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 5")
+        interest(1)
+    }
+    field(B6, DBF_UCHAR) {
+        interest(1)
+        prompt("Bit 6")
+        pp(TRUE)
+    }
+    field(B7, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 7")
+    }
+    field(B8, DBF_UCHAR) {
+        interest(1)
+        prompt("Bit 8")
+        pp(TRUE)
+    }
+    field(B9, DBF_UCHAR) {
+        prompt("Bit 9")
+        interest(1)
+        pp(TRUE)
+    }
+    field(BA, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 10")
+    }
+    field(BB, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 11")
+    }
+    field(BC, DBF_UCHAR) {
+        prompt("Bit 12")
+        interest(1)
+        pp(TRUE)
+    }
+    field(BD, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 13")
+        interest(1)
+    }
+    field(BE, DBF_UCHAR) {
+        interest(1)
+        prompt("Bit 14")
+        pp(TRUE)
+    }
+    field(BF, DBF_UCHAR) {
+        prompt("Bit 15")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B10, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 16")
+    }
+    field(B11, DBF_UCHAR) {
+        prompt("Bit 17")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B12, DBF_UCHAR) {
+        prompt("Bit 18")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B13, DBF_UCHAR) {
+        prompt("Bit 19")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B14, DBF_UCHAR) {
+        interest(1)
+        prompt("Bit 20")
+        pp(TRUE)
+    }
+    field(B15, DBF_UCHAR) {
+        prompt("Bit 21")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B16, DBF_UCHAR) {
+        interest(1)
+        prompt("Bit 22")
+        pp(TRUE)
+    }
+    field(B17, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 23")
+    }
+    field(B18, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 24")
+    }
+    field(B19, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 25")
+    }
+    field(B1A, DBF_UCHAR) {
+        prompt("Bit 26")
+        interest(1)
+        pp(TRUE)
+    }
+    field(B1B, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 27")
+    }
+    field(B1C, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 28")
+        interest(1)
+    }
+    field(B1D, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 29")
+        interest(1)
+    }
+    field(B1E, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 30")
+        interest(1)
+    }
+    field(B1F, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        prompt("Bit 31")
+    }
+}
+device(mbbiDirect, CONSTANT, devMbbiDirectSoft, "Soft Channel")
+device(mbbiDirect, CONSTANT, devMbbiDirectSoftRaw, "Raw Soft Channel")
+device(mbbiDirect, CONSTANT, devMbbiDirectSoftCallback, "Async Soft Channel")
+device(mbbiDirect, INST_IO, asynMbbiDirectUInt32Digital, "asynUInt32Digital")
+device(mbbiDirect, INST_IO, devmbbiDirectStream, "stream")
+recordtype(event) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "dbScan.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        prompt("Scan Mechanism")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+    }
+    field(PHAS, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+    }
+    field(DISS, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(UDFS, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        prompt("Time")
+        special(SPC_NOMOD)
+        interest(2)
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(VAL, DBF_STRING) {
+        size(40)
+        asl(ASL0)
+        promptgroup("40 - Input")
+        special(SPC_MOD)
+        prompt("Event Name To Post")
+    }
+    field(EPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Event private")
+        extra("EVENTPVT epvt")
+    }
+    field(INP, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input Specification")
+    }
+    field(SIOL, DBF_INLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Input Link")
+    }
+    field(SVAL, DBF_STRING) {
+        size(40)
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Mode Link")
+    }
+    field(SIMM, DBF_MENU) {
+        special(SPC_MOD)
+        interest(1)
+        prompt("Simulation Mode")
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Simulation Mode Severity")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        special(SPC_NOMOD)
+        interest(4)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Async Delay")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        prompt("Sim. Mode Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+}
+device(event, CONSTANT, devEventSoft, "Soft Channel")
+recordtype(subArray) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(DISV, DBF_SHORT) {
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        interest(3)
+        prompt("Force Processing")
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("New Alarm Status")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        menu(menuYesNo)
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LCNT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_NOACCESS) {
+        prompt("Value")
+        special(SPC_DBADDR)
+        asl(ASL0)
+        pp(TRUE)
+        extra("void *		val")
+    }
+    field(PREC, DBF_SHORT) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Display Precision")
+    }
+    field(FTVL, DBF_MENU) {
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Field Type of Value")
+        menu(menuFtype)
+    }
+    field(INP, DBF_INLINK) {
+        prompt("Input Specification")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Engineering Units")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Range")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prompt("Low Operating Range")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(MALM, DBF_ULONG) {
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Maximum Elements")
+        initial("1")
+    }
+    field(NELM, DBF_ULONG) {
+        promptgroup("30 - Action")
+        prompt("Number of Elements")
+        initial("1")
+        pp(TRUE)
+    }
+    field(INDX, DBF_ULONG) {
+        promptgroup("30 - Action")
+        prompt("Substring Index")
+        pp(TRUE)
+    }
+    field(BUSY, DBF_SHORT) {
+        special(SPC_NOMOD)
+        prompt("Busy Indicator")
+    }
+    field(NORD, DBF_LONG) {
+        special(SPC_NOMOD)
+        prompt("Number elements read")
+    }
+    field(BPTR, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Buffer Pointer")
+        extra("void *		bptr")
+    }
+}
+device(subArray, CONSTANT, devSASoft, "Soft Channel")
+recordtype(lsi) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "devSup.h"
+    %
+    %/* Declare Device Support Entry Table */
+    %typedef struct lsidset {
+    %    long number;
+    %    DEVSUPFUN report;
+    %    DEVSUPFUN init;
+    %    DEVSUPFUN init_record;
+    %    DEVSUPFUN get_ioint_info;
+    %    DEVSUPFUN read_string;
+    %} lsidset;
+    %
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        interest(3)
+        prompt("Force Processing")
+    }
+    field(STAT, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("New Alarm Status")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPN, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Current Value")
+        special(SPC_DBADDR)
+        pp(TRUE)
+        extra("char *val")
+    }
+    field(OVAL, DBF_NOACCESS) {
+        extra("char *oval")
+        special(SPC_DBADDR)
+        interest(3)
+        prompt("Old Value")
+    }
+    field(SIZV, DBF_USHORT) {
+        initial("41")
+        prompt("Size of buffers")
+        promptgroup("40 - Input")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(LEN, DBF_ULONG) {
+        prompt("Length of VAL")
+        special(SPC_NOMOD)
+    }
+    field(OLEN, DBF_ULONG) {
+        prompt("Length of OVAL")
+        special(SPC_NOMOD)
+    }
+    field(INP, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input Specification")
+    }
+    field(MPST, DBF_MENU) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Post Value Monitors")
+        menu(menuPost)
+    }
+    field(APST, DBF_MENU) {
+        menu(menuPost)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Post Archive Monitors")
+    }
+    field(SIML, DBF_INLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Link")
+    }
+    field(SIMM, DBF_MENU) {
+        prompt("Simulation Mode")
+        interest(1)
+        special(SPC_MOD)
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Severity")
+        menu(menuAlarmSevr)
+    }
+    field(SIOL, DBF_INLINK) {
+        prompt("Simulation Input Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        menu(menuSimm)
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Prev. Simulation Mode")
+    }
+    field(SSCN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        prompt("Sim. Mode Async Delay")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Sim. Mode Private")
+    }
+}
+device(lsi, CONSTANT, devLsiSoft, "Soft Channel")
+device(lsi, INST_IO, devLsiEnviron, "getenv")
+recordtype(bo) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(PHAS, DBF_SHORT) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        interest(3)
+        prompt("Force Processing")
+    }
+    field(STAT, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        prompt("Alarm Ack Transient")
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(UDF, DBF_UCHAR) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_ENUM) {
+        asl(ASL0)
+        prompt("Current Value")
+        promptgroup("50 - Output")
+        pp(TRUE)
+    }
+    field(OMSL, DBF_MENU) {
+        interest(1)
+        promptgroup("50 - Output")
+        prompt("Output Mode Select")
+        menu(menuOmsl)
+    }
+    field(DOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Desired Output Loc")
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Specification")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(HIGH, DBF_DOUBLE) {
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Seconds to Hold High")
+    }
+    field(ZNAM, DBF_STRING) {
+        size(26)
+        pp(TRUE)
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Zero Name")
+    }
+    field(ONAM, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        prompt("One Name")
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+    }
+    field(RVAL, DBF_ULONG) {
+        pp(TRUE)
+        prompt("Raw Value")
+    }
+    field(ORAW, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("prev Raw Value")
+    }
+    field(MASK, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Hardware Mask")
+    }
+    field(RPVT, DBF_NOACCESS) {
+        extra("void *  rpvt")
+        prompt("Record Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(WDPT, DBF_NOACCESS) {
+        extra("void *	wdpt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Watch Dog Timer ID")
+    }
+    field(ZSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Zero Error Severity")
+    }
+    field(OSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("One Error Severity")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(COSV, DBF_MENU) {
+        prompt("Change of State Sevr")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(RBV, DBF_ULONG) {
+        prompt("Readback Value")
+        special(SPC_NOMOD)
+    }
+    field(ORBV, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Readback Value")
+    }
+    field(MLST, DBF_USHORT) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Monitored")
+    }
+    field(LALM, DBF_USHORT) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Value Alarmed")
+    }
+    field(SIOL, DBF_OUTLINK) {
+        prompt("Simulation Output Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIML, DBF_INLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Mode Link")
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        special(SPC_MOD)
+        interest(1)
+        prompt("Simulation Mode")
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Simulation Mode Severity")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        prompt("Sim. Mode Async Delay")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Sim. Mode Private")
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID outpt action")
+        promptgroup("50 - Output")
+        interest(2)
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_USHORT) {
+        prompt("INVALID output value")
+        promptgroup("50 - Output")
+        interest(2)
+    }
+}
+device(bo, CONSTANT, devBoSoft, "Soft Channel")
+device(bo, CONSTANT, devBoSoftRaw, "Raw Soft Channel")
+device(bo, CONSTANT, devBoSoftCallback, "Async Soft Channel")
+device(bo, INST_IO, devBoGeneralTime, "General Time")
+device(bo, INST_IO, devBoDbState, "Db State")
+device(bo, INST_IO, asynBoInt32, "asynInt32")
+device(bo, INST_IO, asynBoUInt32Digital, "asynUInt32Digital")
+device(bo, INST_IO, devboStream, "stream")
+device(bo, INST_IO, devBoStrParm, "asyn bo stringParm")
+device(bo, INST_IO, devBoMPC, "asyn MPC")
+device(bo, GPIB_IO, devBoGP307Gpib, "Vg307 GPIB Instrument")
+device(bo, BBGPIB_IO, devBoAX301, "PZT Bug")
+device(bo, INST_IO, devBoTPG261, "asyn TPG261")
+recordtype(permissive) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(LABL, DBF_STRING) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Button Label")
+        pp(TRUE)
+        size(20)
+    }
+    field(VAL, DBF_USHORT) {
+        promptgroup("40 - Input")
+        prompt("Status")
+        asl(ASL0)
+        pp(TRUE)
+    }
+    field(OVAL, DBF_USHORT) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Old Status")
+    }
+    field(WFLG, DBF_USHORT) {
+        pp(TRUE)
+        prompt("Wait Flag")
+    }
+    field(OFLG, DBF_USHORT) {
+        prompt("Old Flag")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+}
+recordtype(state) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        prompt("Alarm Ack Transient")
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_STRING) {
+        asl(ASL0)
+        prompt("Value")
+        promptgroup("40 - Input")
+        pp(TRUE)
+        size(20)
+    }
+    field(OVAL, DBF_STRING) {
+        size(20)
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value")
+    }
+}
+recordtype(longin) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        prompt("Alarm Ack Transient")
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PRIO, DBF_MENU) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(VAL, DBF_LONG) {
+        prompt("Current value")
+        promptgroup("40 - Input")
+        asl(ASL0)
+        pp(TRUE)
+    }
+    field(INP, DBF_INLINK) {
+        prompt("Input Specification")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Engineering Units")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        size(16)
+    }
+    field(HOPR, DBF_LONG) {
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("High Operating Range")
+    }
+    field(LOPR, DBF_LONG) {
+        prompt("Low Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(HIHI, DBF_LONG) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("Hihi Alarm Limit")
+    }
+    field(LOLO, DBF_LONG) {
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Lolo Alarm Limit")
+        pp(TRUE)
+    }
+    field(HIGH, DBF_LONG) {
+        pp(TRUE)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("High Alarm Limit")
+    }
+    field(LOW, DBF_LONG) {
+        pp(TRUE)
+        prompt("Low Alarm Limit")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+    }
+    field(HHSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("Hihi Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LLSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Lolo Severity")
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("High Severity")
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Severity")
+    }
+    field(HYST, DBF_LONG) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Deadband")
+    }
+    field(AFTC, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Filter Time Constant")
+    }
+    field(AFVL, DBF_DOUBLE) {
+        prompt("Alarm Filter Value")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ADEL, DBF_LONG) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Archive Deadband")
+    }
+    field(MDEL, DBF_LONG) {
+        prompt("Monitor Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(LALM, DBF_LONG) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ALST, DBF_LONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Value Archived")
+    }
+    field(MLST, DBF_LONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Val Monitored")
+    }
+    field(SIOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Input Link")
+    }
+    field(SVAL, DBF_LONG) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        prompt("Simulation Mode")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(SIMS, DBF_MENU) {
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Severity")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        special(SPC_NOMOD)
+        interest(4)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Sim. Mode Async Delay")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        prompt("Sim. Mode Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+}
+device(longin, CONSTANT, devLiSoft, "Soft Channel")
+device(longin, CONSTANT, devLiSoftCallback, "Async Soft Channel")
+device(longin, INST_IO, devLiGeneralTime, "General Time")
+device(longin, INST_IO, asynLiInt32, "asynInt32")
+device(longin, INST_IO, asynLiUInt32Digital, "asynUInt32Digital")
+device(longin, INST_IO, devlonginStream, "stream")
+device(longin, INST_IO, devLiStrParm, "asyn li stringParm")
+recordtype(waveform) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(ACKT, DBF_MENU) {
+        menu(menuYesNo)
+        prompt("Alarm Ack Transient")
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_NOACCESS) {
+        asl(ASL0)
+        special(SPC_DBADDR)
+        prompt("Value")
+        extra("void *		val")
+        pp(TRUE)
+    }
+    field(RARM, DBF_SHORT) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Rearm the waveform")
+    }
+    field(PREC, DBF_SHORT) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Display Precision")
+    }
+    field(INP, DBF_INLINK) {
+        prompt("Input Specification")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Engineering Units")
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        size(16)
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Low Operating Range")
+    }
+    field(NELM, DBF_ULONG) {
+        initial("1")
+        prompt("Number of Elements")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("30 - Action")
+    }
+    field(FTVL, DBF_MENU) {
+        prompt("Field Type of Value")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(menuFtype)
+    }
+    field(BUSY, DBF_SHORT) {
+        special(SPC_NOMOD)
+        prompt("Busy Indicator")
+    }
+    field(NORD, DBF_ULONG) {
+        prompt("Number elements read")
+        special(SPC_NOMOD)
+    }
+    field(BPTR, DBF_NOACCESS) {
+        extra("void *		bptr")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Buffer Pointer")
+    }
+    field(SIOL, DBF_INLINK) {
+        prompt("Simulation Input Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        interest(1)
+        special(SPC_MOD)
+        prompt("Simulation Mode")
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Simulation Mode Severity")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        interest(4)
+        special(SPC_NOMOD)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        menu(menuScan)
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        prompt("Sim. Mode Async Delay")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        prompt("Sim. Mode Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("CALLBACK            *simpvt")
+    }
+    field(MPST, DBF_MENU) {
+        prompt("Post Value Monitors")
+        promptgroup("80 - Display")
+        interest(1)
+        menu(waveformPOST)
+    }
+    field(APST, DBF_MENU) {
+        prompt("Post Archive Monitors")
+        promptgroup("80 - Display")
+        interest(1)
+        menu(waveformPOST)
+    }
+    field(HASH, DBF_ULONG) {
+        prompt("Hash of OnChange data.")
+        interest(3)
+    }
+}
+device(waveform, CONSTANT, devWfSoft, "Soft Channel")
+device(waveform, INST_IO, asynWfOctetCmdResponse, "asynOctetCmdResponse")
+device(waveform, INST_IO, asynWfOctetWriteRead, "asynOctetWriteRead")
+device(waveform, INST_IO, asynWfOctetRead, "asynOctetRead")
+device(waveform, INST_IO, asynWfOctetWrite, "asynOctetWrite")
+device(waveform, INST_IO, asynWfOctetWriteBinary, "asynOctetWriteBinary")
+device(waveform, INST_IO, asynInt8ArrayWfIn, "asynInt8ArrayIn")
+device(waveform, INST_IO, asynInt8ArrayWfOut, "asynInt8ArrayOut")
+device(waveform, INST_IO, asynInt16ArrayWfIn, "asynInt16ArrayIn")
+device(waveform, INST_IO, asynInt16ArrayWfOut, "asynInt16ArrayOut")
+device(waveform, INST_IO, asynInt32ArrayWfIn, "asynInt32ArrayIn")
+device(waveform, INST_IO, asynInt32ArrayWfOut, "asynInt32ArrayOut")
+device(waveform, INST_IO, asynInt32TimeSeries, "asynInt32TimeSeries")
+device(waveform, INST_IO, asynFloat32ArrayWfIn, "asynFloat32ArrayIn")
+device(waveform, INST_IO, asynFloat32ArrayWfOut, "asynFloat32ArrayOut")
+device(waveform, INST_IO, asynFloat64ArrayWfIn, "asynFloat64ArrayIn")
+device(waveform, INST_IO, asynFloat64ArrayWfOut, "asynFloat64ArrayOut")
+device(waveform, INST_IO, asynFloat64TimeSeries, "asynFloat64TimeSeries")
+device(waveform, INST_IO, devwaveformStream, "stream")
+recordtype(int64out) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        prompt("Scan Mechanism")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Process at iocInit")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("New Alarm Status")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        prompt("Alarm Ack Severity")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        prompt("Alarm Ack Transient")
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        initial("1")
+        pp(TRUE)
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_INT64) {
+        promptgroup("50 - Output")
+        prompt("Desired Output")
+        asl(ASL0)
+        pp(TRUE)
+    }
+    field(OUT, DBF_OUTLINK) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Specification")
+    }
+    field(DOL, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Desired Output Loc")
+    }
+    field(OMSL, DBF_MENU) {
+        menu(menuOmsl)
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Mode Select")
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Units name")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        size(16)
+    }
+    field(DRVH, DBF_INT64) {
+        pp(TRUE)
+        interest(1)
+        prop(YES)
+        promptgroup("30 - Action")
+        prompt("Drive High Limit")
+    }
+    field(DRVL, DBF_INT64) {
+        prompt("Drive Low Limit")
+        promptgroup("30 - Action")
+        prop(YES)
+        interest(1)
+        pp(TRUE)
+    }
+    field(HOPR, DBF_INT64) {
+        prompt("High Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_INT64) {
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+        prompt("Low Operating Range")
+    }
+    field(HIHI, DBF_INT64) {
+        pp(TRUE)
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("Hihi Alarm Limit")
+    }
+    field(LOLO, DBF_INT64) {
+        prompt("Lolo Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(HIGH, DBF_INT64) {
+        prompt("High Alarm Limit")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        pp(TRUE)
+    }
+    field(LOW, DBF_INT64) {
+        pp(TRUE)
+        prompt("Low Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(HHSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Hihi Severity")
+        menu(menuAlarmSevr)
+    }
+    field(LLSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Lolo Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("High Severity")
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Severity")
+        menu(menuAlarmSevr)
+    }
+    field(HYST, DBF_INT64) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Alarm Deadband")
+    }
+    field(ADEL, DBF_INT64) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_INT64) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Monitor Deadband")
+    }
+    field(LALM, DBF_INT64) {
+        prompt("Last Value Alarmed")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(ALST, DBF_INT64) {
+        prompt("Last Value Archived")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(MLST, DBF_INT64) {
+        prompt("Last Val Monitored")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(SIOL, DBF_OUTLINK) {
+        prompt("Simulation Output Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIML, DBF_INLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Link")
+    }
+    field(SIMM, DBF_MENU) {
+        prompt("Simulation Mode")
+        special(SPC_MOD)
+        interest(1)
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Sim. Mode Async Delay")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        prompt("Sim. Mode Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID output action")
+        promptgroup("50 - Output")
+        interest(2)
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_INT64) {
+        prompt("INVALID output value")
+        interest(2)
+        promptgroup("50 - Output")
+    }
+}
+device(int64out, CONSTANT, devI64outSoft, "Soft Channel")
+device(int64out, CONSTANT, devI64outSoftCallback, "Async Soft Channel")
+recordtype(aSub) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %struct aSubRecord;
+    field(NAME, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Record Name")
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(NSEV, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Device Private")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(VAL, DBF_LONG) {
+        prompt("Subr. return value")
+        asl(ASL0)
+    }
+    field(OVAL, DBF_LONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Old return value")
+    }
+    field(INAM, DBF_STRING) {
+        size(41)
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Initialize Subr. Name")
+    }
+    field(LFLG, DBF_MENU) {
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Subr. Input Enable")
+        menu(aSubLFLG)
+    }
+    field(SUBL, DBF_INLINK) {
+        prompt("Subroutine Name Link")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("30 - Action")
+    }
+    field(SNAM, DBF_STRING) {
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("Process Subr. Name")
+        size(41)
+    }
+    field(ONAM, DBF_STRING) {
+        promptgroup("30 - Action")
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Old Subr. Name")
+        size(41)
+    }
+    field(SADR, DBF_NOACCESS) {
+        extra("long (*sadr)(struct aSubRecord *)")
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Subroutine Address")
+    }
+    field(CADR, DBF_NOACCESS) {
+        prompt("Subroutine Cleanup Address")
+        special(SPC_NOMOD)
+        interest(2)
+        extra("void (*cadr)(struct aSubRecord *)")
+    }
+    field(BRSV, DBF_MENU) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Bad Return Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(PREC, DBF_SHORT) {
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+        prompt("Display Precision")
+    }
+    field(EFLG, DBF_MENU) {
+        prompt("Output Event Flag")
+        interest(1)
+        promptgroup("50 - Output")
+        menu(aSubEFLG)
+        initial("1")
+    }
+    field(INPA, DBF_INLINK) {
+        promptgroup("41 - Input A-G")
+        interest(1)
+        prompt("Input Link A")
+    }
+    field(INPB, DBF_INLINK) {
+        prompt("Input Link B")
+        promptgroup("41 - Input A-G")
+        interest(1)
+    }
+    field(INPC, DBF_INLINK) {
+        prompt("Input Link C")
+        interest(1)
+        promptgroup("41 - Input A-G")
+    }
+    field(INPD, DBF_INLINK) {
+        prompt("Input Link D")
+        interest(1)
+        promptgroup("41 - Input A-G")
+    }
+    field(INPE, DBF_INLINK) {
+        promptgroup("41 - Input A-G")
+        interest(1)
+        prompt("Input Link E")
+    }
+    field(INPF, DBF_INLINK) {
+        prompt("Input Link F")
+        promptgroup("41 - Input A-G")
+        interest(1)
+    }
+    field(INPG, DBF_INLINK) {
+        promptgroup("41 - Input A-G")
+        interest(1)
+        prompt("Input Link G")
+    }
+    field(INPH, DBF_INLINK) {
+        prompt("Input Link H")
+        promptgroup("42 - Input H-N")
+        interest(1)
+    }
+    field(INPI, DBF_INLINK) {
+        prompt("Input Link I")
+        interest(1)
+        promptgroup("42 - Input H-N")
+    }
+    field(INPJ, DBF_INLINK) {
+        promptgroup("42 - Input H-N")
+        interest(1)
+        prompt("Input Link J")
+    }
+    field(INPK, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Input H-N")
+        prompt("Input Link K")
+    }
+    field(INPL, DBF_INLINK) {
+        prompt("Input Link L")
+        promptgroup("42 - Input H-N")
+        interest(1)
+    }
+    field(INPM, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Input H-N")
+        prompt("Input Link M")
+    }
+    field(INPN, DBF_INLINK) {
+        prompt("Input Link N")
+        interest(1)
+        promptgroup("42 - Input H-N")
+    }
+    field(INPO, DBF_INLINK) {
+        promptgroup("43 - Input O-U")
+        interest(1)
+        prompt("Input Link O")
+    }
+    field(INPP, DBF_INLINK) {
+        prompt("Input Link P")
+        interest(1)
+        promptgroup("43 - Input O-U")
+    }
+    field(INPQ, DBF_INLINK) {
+        prompt("Input Link Q")
+        promptgroup("43 - Input O-U")
+        interest(1)
+    }
+    field(INPR, DBF_INLINK) {
+        promptgroup("43 - Input O-U")
+        interest(1)
+        prompt("Input Link R")
+    }
+    field(INPS, DBF_INLINK) {
+        interest(1)
+        promptgroup("43 - Input O-U")
+        prompt("Input Link S")
+    }
+    field(INPT, DBF_INLINK) {
+        promptgroup("43 - Input O-U")
+        interest(1)
+        prompt("Input Link T")
+    }
+    field(INPU, DBF_INLINK) {
+        prompt("Input Link U")
+        promptgroup("43 - Input O-U")
+        interest(1)
+    }
+    field(A, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Input value A")
+        special(SPC_DBADDR)
+        interest(2)
+        extra("void *a")
+    }
+    field(B, DBF_NOACCESS) {
+        extra("void *b")
+        prompt("Input value B")
+        special(SPC_DBADDR)
+        interest(2)
+        asl(ASL0)
+    }
+    field(C, DBF_NOACCESS) {
+        extra("void *c")
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Input value C")
+        asl(ASL0)
+    }
+    field(D, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Input value D")
+        extra("void *d")
+    }
+    field(E, DBF_NOACCESS) {
+        extra("void *e")
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Input value E")
+    }
+    field(F, DBF_NOACCESS) {
+        prompt("Input value F")
+        special(SPC_DBADDR)
+        interest(2)
+        asl(ASL0)
+        extra("void *f")
+    }
+    field(G, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Input value G")
+        extra("void *g")
+    }
+    field(H, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Input value H")
+        extra("void *h")
+    }
+    field(I, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Input value I")
+        asl(ASL0)
+        extra("void *i")
+    }
+    field(J, DBF_NOACCESS) {
+        prompt("Input value J")
+        special(SPC_DBADDR)
+        interest(2)
+        asl(ASL0)
+        extra("void *j")
+    }
+    field(K, DBF_NOACCESS) {
+        prompt("Input value K")
+        special(SPC_DBADDR)
+        interest(2)
+        asl(ASL0)
+        extra("void *k")
+    }
+    field(L, DBF_NOACCESS) {
+        extra("void *l")
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Input value L")
+    }
+    field(M, DBF_NOACCESS) {
+        prompt("Input value M")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+        extra("void *m")
+    }
+    field(N, DBF_NOACCESS) {
+        extra("void *n")
+        asl(ASL0)
+        prompt("Input value N")
+        special(SPC_DBADDR)
+        interest(2)
+    }
+    field(O, DBF_NOACCESS) {
+        extra("void *o")
+        asl(ASL0)
+        prompt("Input value O")
+        special(SPC_DBADDR)
+        interest(2)
+    }
+    field(P, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Input value P")
+        asl(ASL0)
+        extra("void *p")
+    }
+    field(Q, DBF_NOACCESS) {
+        extra("void *q")
+        prompt("Input value Q")
+        special(SPC_DBADDR)
+        interest(2)
+        asl(ASL0)
+    }
+    field(R, DBF_NOACCESS) {
+        extra("void *r")
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Input value R")
+        asl(ASL0)
+    }
+    field(S, DBF_NOACCESS) {
+        extra("void *s")
+        prompt("Input value S")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+    }
+    field(T, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Input value T")
+        extra("void *t")
+    }
+    field(U, DBF_NOACCESS) {
+        extra("void *u")
+        asl(ASL0)
+        prompt("Input value U")
+        interest(2)
+        special(SPC_DBADDR)
+    }
+    field(FTA, DBF_MENU) {
+        menu(menuFtype)
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("41 - Input A-G")
+        prompt("Type of A")
+        initial("DOUBLE")
+    }
+    field(FTB, DBF_MENU) {
+        prompt("Type of B")
+        interest(1)
+        promptgroup("41 - Input A-G")
+        special(SPC_NOMOD)
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTC, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("41 - Input A-G")
+        prompt("Type of C")
+    }
+    field(FTD, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of D")
+        interest(1)
+        promptgroup("41 - Input A-G")
+        special(SPC_NOMOD)
+    }
+    field(FTE, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("41 - Input A-G")
+        prompt("Type of E")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTF, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of F")
+        interest(1)
+        promptgroup("41 - Input A-G")
+        special(SPC_NOMOD)
+    }
+    field(FTG, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of G")
+        promptgroup("41 - Input A-G")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(menuFtype)
+    }
+    field(FTH, DBF_MENU) {
+        menu(menuFtype)
+        prompt("Type of H")
+        promptgroup("42 - Input H-N")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("DOUBLE")
+    }
+    field(FTI, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of I")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("42 - Input H-N")
+        menu(menuFtype)
+    }
+    field(FTJ, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of J")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("42 - Input H-N")
+        menu(menuFtype)
+    }
+    field(FTK, DBF_MENU) {
+        prompt("Type of K")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("42 - Input H-N")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTL, DBF_MENU) {
+        prompt("Type of L")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("42 - Input H-N")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTM, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of M")
+        promptgroup("42 - Input H-N")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(menuFtype)
+    }
+    field(FTN, DBF_MENU) {
+        menu(menuFtype)
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("42 - Input H-N")
+        prompt("Type of N")
+        initial("DOUBLE")
+    }
+    field(FTO, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of O")
+        interest(1)
+        promptgroup("43 - Input O-U")
+        special(SPC_NOMOD)
+    }
+    field(FTP, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of P")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("43 - Input O-U")
+    }
+    field(FTQ, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of Q")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("43 - Input O-U")
+        menu(menuFtype)
+    }
+    field(FTR, DBF_MENU) {
+        menu(menuFtype)
+        prompt("Type of R")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("43 - Input O-U")
+        initial("DOUBLE")
+    }
+    field(FTS, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        promptgroup("43 - Input O-U")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Type of S")
+    }
+    field(FTT, DBF_MENU) {
+        prompt("Type of T")
+        promptgroup("43 - Input O-U")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTU, DBF_MENU) {
+        interest(1)
+        promptgroup("43 - Input O-U")
+        special(SPC_NOMOD)
+        prompt("Type of U")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(NOA, DBF_ULONG) {
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("41 - Input A-G")
+        prompt("Max. elements in A")
+        initial("1")
+    }
+    field(NOB, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("41 - Input A-G")
+        prompt("Max. elements in B")
+    }
+    field(NOC, DBF_ULONG) {
+        prompt("Max. elements in C")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("41 - Input A-G")
+        initial("1")
+    }
+    field(NOD, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in D")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("41 - Input A-G")
+    }
+    field(NOE, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        promptgroup("41 - Input A-G")
+        special(SPC_NOMOD)
+        prompt("Max. elements in E")
+    }
+    field(NOF, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("41 - Input A-G")
+        prompt("Max. elements in F")
+    }
+    field(NOG, DBF_ULONG) {
+        prompt("Max. elements in G")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("41 - Input A-G")
+        initial("1")
+    }
+    field(NOH, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("42 - Input H-N")
+        prompt("Max. elements in H")
+    }
+    field(NOI, DBF_ULONG) {
+        interest(1)
+        promptgroup("42 - Input H-N")
+        special(SPC_NOMOD)
+        prompt("Max. elements in I")
+        initial("1")
+    }
+    field(NOJ, DBF_ULONG) {
+        prompt("Max. elements in J")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("42 - Input H-N")
+        initial("1")
+    }
+    field(NOK, DBF_ULONG) {
+        prompt("Max. elements in K")
+        promptgroup("42 - Input H-N")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NOL, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("42 - Input H-N")
+        prompt("Max. elements in L")
+        initial("1")
+    }
+    field(NOM, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in M")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("42 - Input H-N")
+    }
+    field(NON, DBF_ULONG) {
+        prompt("Max. elements in N")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("42 - Input H-N")
+        initial("1")
+    }
+    field(NOO, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in O")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("43 - Input O-U")
+    }
+    field(NOP, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in P")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("43 - Input O-U")
+    }
+    field(NOQ, DBF_ULONG) {
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("43 - Input O-U")
+        prompt("Max. elements in Q")
+        initial("1")
+    }
+    field(NOR, DBF_ULONG) {
+        promptgroup("43 - Input O-U")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Max. elements in R")
+        initial("1")
+    }
+    field(NOS, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("43 - Input O-U")
+        prompt("Max. elements in S")
+    }
+    field(NOT, DBF_ULONG) {
+        prompt("Max. elements in T")
+        promptgroup("43 - Input O-U")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NOU, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        promptgroup("43 - Input O-U")
+        special(SPC_NOMOD)
+        prompt("Max. elements in U")
+    }
+    field(NEA, DBF_ULONG) {
+        initial("1")
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in A")
+    }
+    field(NEB, DBF_ULONG) {
+        prompt("Num. elements in B")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEC, DBF_ULONG) {
+        prompt("Num. elements in C")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NED, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in D")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(NEE, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Num. elements in E")
+        initial("1")
+    }
+    field(NEF, DBF_ULONG) {
+        prompt("Num. elements in F")
+        interest(3)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NEG, DBF_ULONG) {
+        prompt("Num. elements in G")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEH, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Num. elements in H")
+        initial("1")
+    }
+    field(NEI, DBF_ULONG) {
+        prompt("Num. elements in I")
+        interest(3)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NEJ, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in J")
+        initial("1")
+    }
+    field(NEK, DBF_ULONG) {
+        prompt("Num. elements in K")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEL, DBF_ULONG) {
+        prompt("Num. elements in L")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEM, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in M")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(NEN, DBF_ULONG) {
+        prompt("Num. elements in N")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEO, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in O")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(NEP, DBF_ULONG) {
+        prompt("Num. elements in P")
+        interest(3)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NEQ, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in Q")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(NER, DBF_ULONG) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Num. elements in R")
+    }
+    field(NES, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Num. elements in S")
+        initial("1")
+    }
+    field(NET, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in T")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(NEU, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in U")
+        initial("1")
+    }
+    field(OUTA, DBF_OUTLINK) {
+        prompt("Output Link A")
+        interest(1)
+        promptgroup("51 - Output A-G")
+    }
+    field(OUTB, DBF_OUTLINK) {
+        promptgroup("51 - Output A-G")
+        interest(1)
+        prompt("Output Link B")
+    }
+    field(OUTC, DBF_OUTLINK) {
+        prompt("Output Link C")
+        interest(1)
+        promptgroup("51 - Output A-G")
+    }
+    field(OUTD, DBF_OUTLINK) {
+        prompt("Output Link D")
+        interest(1)
+        promptgroup("51 - Output A-G")
+    }
+    field(OUTE, DBF_OUTLINK) {
+        prompt("Output Link E")
+        promptgroup("51 - Output A-G")
+        interest(1)
+    }
+    field(OUTF, DBF_OUTLINK) {
+        prompt("Output Link F")
+        interest(1)
+        promptgroup("51 - Output A-G")
+    }
+    field(OUTG, DBF_OUTLINK) {
+        prompt("Output Link G")
+        promptgroup("51 - Output A-G")
+        interest(1)
+    }
+    field(OUTH, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("52 - Output H-N")
+        prompt("Output Link H")
+    }
+    field(OUTI, DBF_OUTLINK) {
+        prompt("Output Link I")
+        interest(1)
+        promptgroup("52 - Output H-N")
+    }
+    field(OUTJ, DBF_OUTLINK) {
+        prompt("Output Link J")
+        interest(1)
+        promptgroup("52 - Output H-N")
+    }
+    field(OUTK, DBF_OUTLINK) {
+        prompt("Output Link K")
+        promptgroup("52 - Output H-N")
+        interest(1)
+    }
+    field(OUTL, DBF_OUTLINK) {
+        prompt("Output Link L")
+        promptgroup("52 - Output H-N")
+        interest(1)
+    }
+    field(OUTM, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("52 - Output H-N")
+        prompt("Output Link M")
+    }
+    field(OUTN, DBF_OUTLINK) {
+        prompt("Output Link N")
+        interest(1)
+        promptgroup("52 - Output H-N")
+    }
+    field(OUTO, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("53 - Output O-U")
+        prompt("Output Link O")
+    }
+    field(OUTP, DBF_OUTLINK) {
+        prompt("Output Link P")
+        promptgroup("53 - Output O-U")
+        interest(1)
+    }
+    field(OUTQ, DBF_OUTLINK) {
+        prompt("Output Link Q")
+        interest(1)
+        promptgroup("53 - Output O-U")
+    }
+    field(OUTR, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("53 - Output O-U")
+        prompt("Output Link R")
+    }
+    field(OUTS, DBF_OUTLINK) {
+        promptgroup("53 - Output O-U")
+        interest(1)
+        prompt("Output Link S")
+    }
+    field(OUTT, DBF_OUTLINK) {
+        prompt("Output Link T")
+        promptgroup("53 - Output O-U")
+        interest(1)
+    }
+    field(OUTU, DBF_OUTLINK) {
+        prompt("Output Link U")
+        interest(1)
+        promptgroup("53 - Output O-U")
+    }
+    field(VALA, DBF_NOACCESS) {
+        extra("void *vala")
+        prompt("Output value A")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+    }
+    field(VALB, DBF_NOACCESS) {
+        extra("void *valb")
+        asl(ASL0)
+        prompt("Output value B")
+        interest(2)
+        special(SPC_DBADDR)
+    }
+    field(VALC, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Output value C")
+        extra("void *valc")
+    }
+    field(VALD, DBF_NOACCESS) {
+        extra("void *vald")
+        asl(ASL0)
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Output value D")
+    }
+    field(VALE, DBF_NOACCESS) {
+        extra("void *vale")
+        asl(ASL0)
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Output value E")
+    }
+    field(VALF, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Output value F")
+        asl(ASL0)
+        extra("void *valf")
+    }
+    field(VALG, DBF_NOACCESS) {
+        extra("void *valg")
+        prompt("Output value G")
+        special(SPC_DBADDR)
+        interest(2)
+        asl(ASL0)
+    }
+    field(VALH, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Output value H")
+        extra("void *valh")
+    }
+    field(VALI, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Output value I")
+        asl(ASL0)
+        extra("void *vali")
+    }
+    field(VALJ, DBF_NOACCESS) {
+        extra("void *valj")
+        prompt("Output value J")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+    }
+    field(VALK, DBF_NOACCESS) {
+        prompt("Output value K")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+        extra("void *valk")
+    }
+    field(VALL, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Output value L")
+        asl(ASL0)
+        extra("void *vall")
+    }
+    field(VALM, DBF_NOACCESS) {
+        prompt("Output value M")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+        extra("void *valm")
+    }
+    field(VALN, DBF_NOACCESS) {
+        prompt("Output value N")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+        extra("void *valn")
+    }
+    field(VALO, DBF_NOACCESS) {
+        extra("void *valo")
+        asl(ASL0)
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Output value O")
+    }
+    field(VALP, DBF_NOACCESS) {
+        extra("void *valp")
+        asl(ASL0)
+        prompt("Output value P")
+        special(SPC_DBADDR)
+        interest(2)
+    }
+    field(VALQ, DBF_NOACCESS) {
+        extra("void *valq")
+        prompt("Output value Q")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+    }
+    field(VALR, DBF_NOACCESS) {
+        extra("void *valr")
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Output value R")
+        asl(ASL0)
+    }
+    field(VALS, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        interest(2)
+        prompt("Output value S")
+        asl(ASL0)
+        extra("void *vals")
+    }
+    field(VALT, DBF_NOACCESS) {
+        prompt("Output value T")
+        interest(2)
+        special(SPC_DBADDR)
+        asl(ASL0)
+        extra("void *valt")
+    }
+    field(VALU, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_DBADDR)
+        prompt("Output value U")
+        asl(ASL0)
+        extra("void *valu")
+    }
+    field(OVLA, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Old Output A")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void *ovla")
+    }
+    field(OVLB, DBF_NOACCESS) {
+        extra("void *ovlb")
+        asl(ASL0)
+        prompt("Old Output B")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(OVLC, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Old Output C")
+        asl(ASL0)
+        extra("void *ovlc")
+    }
+    field(OVLD, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Old Output D")
+        asl(ASL0)
+        extra("void *ovld")
+    }
+    field(OVLE, DBF_NOACCESS) {
+        extra("void *ovle")
+        asl(ASL0)
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Old Output E")
+    }
+    field(OVLF, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Old Output F")
+        asl(ASL0)
+        extra("void *ovlf")
+    }
+    field(OVLG, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Old Output G")
+        extra("void *ovlg")
+    }
+    field(OVLH, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Old Output H")
+        asl(ASL0)
+        extra("void *ovlh")
+    }
+    field(OVLI, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Old Output I")
+        extra("void *ovli")
+    }
+    field(OVLJ, DBF_NOACCESS) {
+        prompt("Old Output J")
+        interest(4)
+        special(SPC_NOMOD)
+        asl(ASL0)
+        extra("void *ovlj")
+    }
+    field(OVLK, DBF_NOACCESS) {
+        extra("void *ovlk")
+        asl(ASL0)
+        prompt("Old Output K")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(OVLL, DBF_NOACCESS) {
+        prompt("Old Output L")
+        special(SPC_NOMOD)
+        interest(4)
+        asl(ASL0)
+        extra("void *ovll")
+    }
+    field(OVLM, DBF_NOACCESS) {
+        extra("void *ovlm")
+        prompt("Old Output M")
+        interest(4)
+        special(SPC_NOMOD)
+        asl(ASL0)
+    }
+    field(OVLN, DBF_NOACCESS) {
+        extra("void *ovln")
+        prompt("Old Output N")
+        interest(4)
+        special(SPC_NOMOD)
+        asl(ASL0)
+    }
+    field(OVLO, DBF_NOACCESS) {
+        extra("void *ovlo")
+        asl(ASL0)
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Old Output O")
+    }
+    field(OVLP, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Old Output P")
+        asl(ASL0)
+        extra("void *ovlp")
+    }
+    field(OVLQ, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Old Output Q")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void *ovlq")
+    }
+    field(OVLR, DBF_NOACCESS) {
+        extra("void *ovlr")
+        asl(ASL0)
+        prompt("Old Output R")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(OVLS, DBF_NOACCESS) {
+        extra("void *ovls")
+        prompt("Old Output S")
+        special(SPC_NOMOD)
+        interest(4)
+        asl(ASL0)
+    }
+    field(OVLT, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Old Output T")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("void *ovlt")
+    }
+    field(OVLU, DBF_NOACCESS) {
+        asl(ASL0)
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Old Output U")
+        extra("void *ovlu")
+    }
+    field(FTVA, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("51 - Output A-G")
+        prompt("Type of VALA")
+    }
+    field(FTVB, DBF_MENU) {
+        menu(menuFtype)
+        prompt("Type of VALB")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("51 - Output A-G")
+        initial("DOUBLE")
+    }
+    field(FTVC, DBF_MENU) {
+        promptgroup("51 - Output A-G")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Type of VALC")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTVD, DBF_MENU) {
+        prompt("Type of VALD")
+        promptgroup("51 - Output A-G")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTVE, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of VALE")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("51 - Output A-G")
+        menu(menuFtype)
+    }
+    field(FTVF, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        interest(1)
+        promptgroup("51 - Output A-G")
+        special(SPC_NOMOD)
+        prompt("Type of VALF")
+    }
+    field(FTVG, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of VALG")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("51 - Output A-G")
+    }
+    field(FTVH, DBF_MENU) {
+        promptgroup("52 - Output H-N")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Type of VALH")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTVI, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("52 - Output H-N")
+        prompt("Type of VALI")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTVJ, DBF_MENU) {
+        promptgroup("52 - Output H-N")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Type of VALJ")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTVK, DBF_MENU) {
+        interest(1)
+        promptgroup("52 - Output H-N")
+        special(SPC_NOMOD)
+        prompt("Type of VALK")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(FTVL, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of VALL")
+        promptgroup("52 - Output H-N")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(FTVM, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of VALM")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("52 - Output H-N")
+    }
+    field(FTVN, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of VALN")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("52 - Output H-N")
+        menu(menuFtype)
+    }
+    field(FTVO, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        prompt("Type of VALO")
+        promptgroup("53 - Output O-U")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(FTVP, DBF_MENU) {
+        menu(menuFtype)
+        prompt("Type of VALP")
+        interest(1)
+        promptgroup("53 - Output O-U")
+        special(SPC_NOMOD)
+        initial("DOUBLE")
+    }
+    field(FTVQ, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("53 - Output O-U")
+        prompt("Type of VALQ")
+    }
+    field(FTVR, DBF_MENU) {
+        initial("DOUBLE")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("53 - Output O-U")
+        prompt("Type of VALR")
+        menu(menuFtype)
+    }
+    field(FTVS, DBF_MENU) {
+        initial("DOUBLE")
+        menu(menuFtype)
+        interest(1)
+        promptgroup("53 - Output O-U")
+        special(SPC_NOMOD)
+        prompt("Type of VALS")
+    }
+    field(FTVT, DBF_MENU) {
+        initial("DOUBLE")
+        prompt("Type of VALT")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("53 - Output O-U")
+        menu(menuFtype)
+    }
+    field(FTVU, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("53 - Output O-U")
+        prompt("Type of VALU")
+        menu(menuFtype)
+        initial("DOUBLE")
+    }
+    field(NOVA, DBF_ULONG) {
+        initial("1")
+        promptgroup("51 - Output A-G")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Max. elements in VALA")
+    }
+    field(NOVB, DBF_ULONG) {
+        prompt("Max. elements in VALB")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("51 - Output A-G")
+        initial("1")
+    }
+    field(NOVC, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in VALC")
+        promptgroup("51 - Output A-G")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(NOVD, DBF_ULONG) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("51 - Output A-G")
+        prompt("Max. elements in VALD")
+    }
+    field(NOVE, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("51 - Output A-G")
+        prompt("Max. elements in VALE")
+    }
+    field(NOVF, DBF_ULONG) {
+        promptgroup("51 - Output A-G")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Max. elements in VALF")
+        initial("1")
+    }
+    field(NOVG, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("51 - Output A-G")
+        prompt("Max. elements in VALG")
+        initial("1")
+    }
+    field(NOVH, DBF_ULONG) {
+        prompt("Max. elements in VAlH")
+        interest(1)
+        promptgroup("52 - Output H-N")
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NOVI, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("52 - Output H-N")
+        prompt("Max. elements in VALI")
+    }
+    field(NOVJ, DBF_ULONG) {
+        initial("1")
+        promptgroup("52 - Output H-N")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Max. elements in VALJ")
+    }
+    field(NOVK, DBF_ULONG) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("52 - Output H-N")
+        prompt("Max. elements in VALK")
+    }
+    field(NOVL, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in VALL")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("52 - Output H-N")
+    }
+    field(NOVM, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in VALM")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("52 - Output H-N")
+    }
+    field(NOVN, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        promptgroup("52 - Output H-N")
+        special(SPC_NOMOD)
+        prompt("Max. elements in VALN")
+    }
+    field(NOVO, DBF_ULONG) {
+        interest(1)
+        promptgroup("53 - Output O-U")
+        special(SPC_NOMOD)
+        prompt("Max. elements in VALO")
+        initial("1")
+    }
+    field(NOVP, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in VALP")
+        promptgroup("53 - Output O-U")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(NOVQ, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        promptgroup("53 - Output O-U")
+        special(SPC_NOMOD)
+        prompt("Max. elements in VALQ")
+    }
+    field(NOVR, DBF_ULONG) {
+        prompt("Max. elements in VALR")
+        promptgroup("53 - Output O-U")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NOVS, DBF_ULONG) {
+        initial("1")
+        prompt("Max. elements in VALS")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("53 - Output O-U")
+    }
+    field(NOVT, DBF_ULONG) {
+        prompt("Max. elements in VALT")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("53 - Output O-U")
+        initial("1")
+    }
+    field(NOVU, DBF_ULONG) {
+        prompt("Max. elements in VALU")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("53 - Output O-U")
+        initial("1")
+    }
+    field(NEVA, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALA")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(NEVB, DBF_ULONG) {
+        initial("1")
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in VALB")
+    }
+    field(NEVC, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALC")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(NEVD, DBF_ULONG) {
+        prompt("Num. elements in VALD")
+        interest(3)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NEVE, DBF_ULONG) {
+        prompt("Num. elements in VALE")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEVF, DBF_ULONG) {
+        prompt("Num. elements in VALF")
+        interest(3)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(NEVG, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALG")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(NEVH, DBF_ULONG) {
+        prompt("Num. elements in VAlH")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEVI, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALI")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(NEVJ, DBF_ULONG) {
+        prompt("Num. elements in VALJ")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEVK, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALK")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(NEVL, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in VALL")
+        initial("1")
+    }
+    field(NEVM, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in VALM")
+        initial("1")
+    }
+    field(NEVN, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALN")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(NEVO, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Num. elements in VALO")
+        initial("1")
+    }
+    field(NEVP, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALP")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(NEVQ, DBF_ULONG) {
+        initial("1")
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in VALQ")
+    }
+    field(NEVR, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in VALR")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(NEVS, DBF_ULONG) {
+        prompt("Num. elements in VALS")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(NEVT, DBF_ULONG) {
+        initial("1")
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Num. elements in VALT")
+    }
+    field(NEVU, DBF_ULONG) {
+        prompt("Num. elements in VALU")
+        special(SPC_NOMOD)
+        interest(3)
+        initial("1")
+    }
+    field(ONVA, DBF_ULONG) {
+        prompt("Num. elements in OVLA")
+        special(SPC_NOMOD)
+        interest(4)
+        initial("1")
+    }
+    field(ONVB, DBF_ULONG) {
+        prompt("Num. elements in OVLB")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVC, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Num. elements in OVLC")
+        initial("1")
+    }
+    field(ONVD, DBF_ULONG) {
+        prompt("Num. elements in OVLD")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVE, DBF_ULONG) {
+        initial("1")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Num. elements in OVLE")
+    }
+    field(ONVF, DBF_ULONG) {
+        prompt("Num. elements in OVLF")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVG, DBF_ULONG) {
+        prompt("Num. elements in OVLG")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVH, DBF_ULONG) {
+        prompt("Num. elements in VAlH")
+        special(SPC_NOMOD)
+        interest(4)
+        initial("1")
+    }
+    field(ONVI, DBF_ULONG) {
+        prompt("Num. elements in OVLI")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVJ, DBF_ULONG) {
+        initial("1")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Num. elements in OVLJ")
+    }
+    field(ONVK, DBF_ULONG) {
+        prompt("Num. elements in OVLK")
+        special(SPC_NOMOD)
+        interest(4)
+        initial("1")
+    }
+    field(ONVL, DBF_ULONG) {
+        initial("1")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Num. elements in OVLL")
+    }
+    field(ONVM, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Num. elements in OVLM")
+        initial("1")
+    }
+    field(ONVN, DBF_ULONG) {
+        prompt("Num. elements in OVLN")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVO, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Num. elements in OVLO")
+        initial("1")
+    }
+    field(ONVP, DBF_ULONG) {
+        prompt("Num. elements in OVLP")
+        special(SPC_NOMOD)
+        interest(4)
+        initial("1")
+    }
+    field(ONVQ, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Num. elements in OVLQ")
+        initial("1")
+    }
+    field(ONVR, DBF_ULONG) {
+        initial("1")
+        prompt("Num. elements in OVLR")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(ONVS, DBF_ULONG) {
+        prompt("Num. elements in OVLS")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVT, DBF_ULONG) {
+        prompt("Num. elements in OVLT")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(ONVU, DBF_ULONG) {
+        prompt("Num. elements in OVLU")
+        interest(4)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+}
+recordtype(seq) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Record Name")
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        prompt("Alarm Ack Transient")
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_LONG) {
+        pp(TRUE)
+        prompt("Used to trigger")
+        asl(ASL0)
+    }
+    field(SELM, DBF_MENU) {
+        prompt("Select Mechanism")
+        promptgroup("30 - Action")
+        interest(1)
+        menu(seqSELM)
+    }
+    field(SELN, DBF_USHORT) {
+        initial("1")
+        interest(1)
+        prompt("Link Selection")
+    }
+    field(SELL, DBF_INLINK) {
+        prompt("Link Selection Loc")
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(OFFS, DBF_SHORT) {
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Offset for Specified")
+        initial("0")
+    }
+    field(SHFT, DBF_SHORT) {
+        initial("-1")
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Shift for Mask mode")
+    }
+    field(OLDN, DBF_USHORT) {
+        interest(4)
+        prompt("Old Selection")
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(DLY0, DBF_DOUBLE) {
+        prompt("Delay 0")
+        promptgroup("41 - Link 0-7")
+        interest(1)
+    }
+    field(DOL0, DBF_INLINK) {
+        prompt("Input link 0")
+        interest(1)
+        promptgroup("41 - Link 0-7")
+    }
+    field(DO0, DBF_DOUBLE) {
+        interest(1)
+        prompt("Value 0")
+    }
+    field(LNK0, DBF_OUTLINK) {
+        prompt("Output Link 0")
+        promptgroup("41 - Link 0-7")
+        interest(1)
+    }
+    field(DLY1, DBF_DOUBLE) {
+        promptgroup("41 - Link 0-7")
+        interest(1)
+        prompt("Delay 1")
+    }
+    field(DOL1, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Link 0-7")
+        prompt("Input link1")
+    }
+    field(DO1, DBF_DOUBLE) {
+        prompt("Value 1")
+        interest(1)
+    }
+    field(LNK1, DBF_OUTLINK) {
+        prompt("Output Link 1")
+        interest(1)
+        promptgroup("41 - Link 0-7")
+    }
+    field(DLY2, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("41 - Link 0-7")
+        prompt("Delay 2")
+    }
+    field(DOL2, DBF_INLINK) {
+        promptgroup("41 - Link 0-7")
+        interest(1)
+        prompt("Input link 2")
+    }
+    field(DO2, DBF_DOUBLE) {
+        prompt("Value 2")
+        interest(1)
+    }
+    field(LNK2, DBF_OUTLINK) {
+        promptgroup("41 - Link 0-7")
+        interest(1)
+        prompt("Output Link 2")
+    }
+    field(DLY3, DBF_DOUBLE) {
+        promptgroup("41 - Link 0-7")
+        interest(1)
+        prompt("Delay 3")
+    }
+    field(DOL3, DBF_INLINK) {
+        prompt("Input link 3")
+        promptgroup("41 - Link 0-7")
+        interest(1)
+    }
+    field(DO3, DBF_DOUBLE) {
+        interest(1)
+        prompt("Value 3")
+    }
+    field(LNK3, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("41 - Link 0-7")
+        prompt("Output Link 3")
+    }
+    field(DLY4, DBF_DOUBLE) {
+        prompt("Delay 4")
+        promptgroup("41 - Link 0-7")
+        interest(1)
+    }
+    field(DOL4, DBF_INLINK) {
+        prompt("Input link 4")
+        interest(1)
+        promptgroup("41 - Link 0-7")
+    }
+    field(DO4, DBF_DOUBLE) {
+        interest(1)
+        prompt("Value 4")
+    }
+    field(LNK4, DBF_OUTLINK) {
+        prompt("Output Link 4")
+        interest(1)
+        promptgroup("41 - Link 0-7")
+    }
+    field(DLY5, DBF_DOUBLE) {
+        prompt("Delay 5")
+        interest(1)
+        promptgroup("41 - Link 0-7")
+    }
+    field(DOL5, DBF_INLINK) {
+        prompt("Input link 5")
+        interest(1)
+        promptgroup("41 - Link 0-7")
+    }
+    field(DO5, DBF_DOUBLE) {
+        prompt("Value 5")
+        interest(1)
+    }
+    field(LNK5, DBF_OUTLINK) {
+        prompt("Output Link 5")
+        promptgroup("41 - Link 0-7")
+        interest(1)
+    }
+    field(DLY6, DBF_DOUBLE) {
+        promptgroup("41 - Link 0-7")
+        interest(1)
+        prompt("Delay 6")
+    }
+    field(DOL6, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Link 0-7")
+        prompt("Input link 6")
+    }
+    field(DO6, DBF_DOUBLE) {
+        prompt("Value 6")
+        interest(1)
+    }
+    field(LNK6, DBF_OUTLINK) {
+        promptgroup("41 - Link 0-7")
+        interest(1)
+        prompt("Output Link 6")
+    }
+    field(DLY7, DBF_DOUBLE) {
+        prompt("Delay 7")
+        promptgroup("41 - Link 0-7")
+        interest(1)
+    }
+    field(DOL7, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Link 0-7")
+        prompt("Input link 7")
+    }
+    field(DO7, DBF_DOUBLE) {
+        interest(1)
+        prompt("Value 7")
+    }
+    field(LNK7, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("41 - Link 0-7")
+        prompt("Output Link 7")
+    }
+    field(DLY8, DBF_DOUBLE) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Delay 8")
+    }
+    field(DOL8, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Link 8-F")
+        prompt("Input link 8")
+    }
+    field(DO8, DBF_DOUBLE) {
+        interest(1)
+        prompt("Value 8")
+    }
+    field(LNK8, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("42 - Link 8-F")
+        prompt("Output Link 8")
+    }
+    field(DLY9, DBF_DOUBLE) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Delay 9")
+    }
+    field(DOL9, DBF_INLINK) {
+        prompt("Input link 9")
+        promptgroup("42 - Link 8-F")
+        interest(1)
+    }
+    field(DO9, DBF_DOUBLE) {
+        prompt("Value 9")
+        interest(1)
+    }
+    field(LNK9, DBF_OUTLINK) {
+        prompt("Output Link 9")
+        promptgroup("42 - Link 8-F")
+        interest(1)
+    }
+    field(DLYA, DBF_DOUBLE) {
+        prompt("Delay 10")
+        interest(1)
+        promptgroup("42 - Link 8-F")
+    }
+    field(DOLA, DBF_INLINK) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Input link 10")
+    }
+    field(DOA, DBF_DOUBLE) {
+        prompt("Value 10")
+        interest(1)
+    }
+    field(LNKA, DBF_OUTLINK) {
+        prompt("Output Link 10")
+        interest(1)
+        promptgroup("42 - Link 8-F")
+    }
+    field(DLYB, DBF_DOUBLE) {
+        prompt("Delay 11")
+        interest(1)
+        promptgroup("42 - Link 8-F")
+    }
+    field(DOLB, DBF_INLINK) {
+        prompt("Input link 11")
+        interest(1)
+        promptgroup("42 - Link 8-F")
+    }
+    field(DOB, DBF_DOUBLE) {
+        interest(1)
+        prompt("Value 11")
+    }
+    field(LNKB, DBF_OUTLINK) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Output Link 11")
+    }
+    field(DLYC, DBF_DOUBLE) {
+        prompt("Delay 12")
+        interest(1)
+        promptgroup("42 - Link 8-F")
+    }
+    field(DOLC, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Link 8-F")
+        prompt("Input link 12")
+    }
+    field(DOC, DBF_DOUBLE) {
+        prompt("Value 12")
+        interest(1)
+    }
+    field(LNKC, DBF_OUTLINK) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Output Link 12")
+    }
+    field(DLYD, DBF_DOUBLE) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Delay 13")
+    }
+    field(DOLD, DBF_INLINK) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Input link 13")
+    }
+    field(DOD, DBF_DOUBLE) {
+        prompt("Value 13")
+        interest(1)
+    }
+    field(LNKD, DBF_OUTLINK) {
+        prompt("Output Link 13")
+        promptgroup("42 - Link 8-F")
+        interest(1)
+    }
+    field(DLYE, DBF_DOUBLE) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Delay 14")
+    }
+    field(DOLE, DBF_INLINK) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Input link 14")
+    }
+    field(DOE, DBF_DOUBLE) {
+        prompt("Value 14")
+        interest(1)
+    }
+    field(LNKE, DBF_OUTLINK) {
+        prompt("Output Link 14")
+        interest(1)
+        promptgroup("42 - Link 8-F")
+    }
+    field(DLYF, DBF_DOUBLE) {
+        prompt("Delay 15")
+        promptgroup("42 - Link 8-F")
+        interest(1)
+    }
+    field(DOLF, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Link 8-F")
+        prompt("Input link 15")
+    }
+    field(DOF, DBF_DOUBLE) {
+        interest(1)
+        prompt("Value 15")
+    }
+    field(LNKF, DBF_OUTLINK) {
+        promptgroup("42 - Link 8-F")
+        interest(1)
+        prompt("Output Link 15")
+    }
+}
+recordtype(aai) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        prompt("Alarm Ack Transient")
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(TIME, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(VAL, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        prompt("Value")
+        asl(ASL0)
+        extra("void *		val")
+        pp(TRUE)
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(INP, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input Specification")
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Engineering Units")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        size(16)
+    }
+    field(HOPR, DBF_DOUBLE) {
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+        prompt("High Operating Range")
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Low Operating Range")
+    }
+    field(NELM, DBF_ULONG) {
+        initial("1")
+        prompt("Number of Elements")
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(FTVL, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Field Type of Value")
+        menu(menuFtype)
+    }
+    field(NORD, DBF_ULONG) {
+        prompt("Number elements read")
+        special(SPC_NOMOD)
+    }
+    field(BPTR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Buffer Pointer")
+        extra("void *		bptr")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        prompt("Simulation Mode")
+        interest(1)
+        special(SPC_MOD)
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        prompt("Simulation Mode Severity")
+        promptgroup("90 - Simulate")
+        interest(2)
+        menu(menuAlarmSevr)
+    }
+    field(SIOL, DBF_INLINK) {
+        prompt("Simulation Input Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Sim. Mode Scan")
+        interest(1)
+        promptgroup("90 - Simulate")
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Async Delay")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        prompt("Sim. Mode Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("CALLBACK            *simpvt")
+    }
+    field(MPST, DBF_MENU) {
+        prompt("Post Value Monitors")
+        interest(1)
+        promptgroup("80 - Display")
+        menu(aaiPOST)
+    }
+    field(APST, DBF_MENU) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Post Archive Monitors")
+        menu(aaiPOST)
+    }
+    field(HASH, DBF_ULONG) {
+        prompt("Hash of OnChange data.")
+        interest(3)
+    }
+}
+device(aai, CONSTANT, devAaiSoft, "Soft Channel")
+device(aai, INST_IO, devaaiStream, "stream")
+recordtype(mbbo) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        prompt("Alarm Ack Transient")
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+    }
+    field(RDES, DBF_NOACCESS) {
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_ENUM) {
+        pp(TRUE)
+        promptgroup("50 - Output")
+        special(SPC_DBADDR)
+        prompt("Desired Value")
+        asl(ASL0)
+    }
+    field(DOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Desired Output Loc")
+    }
+    field(OMSL, DBF_MENU) {
+        menu(menuOmsl)
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Mode Select")
+    }
+    field(NOBT, DBF_USHORT) {
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("50 - Output")
+        prompt("Number of Bits")
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Specification")
+        interest(1)
+        promptgroup("50 - Output")
+    }
+    field(ZRVL, DBF_ULONG) {
+        prompt("Zero Value")
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        special(SPC_MOD)
+        pp(TRUE)
+        base(HEX)
+    }
+    field(ONVL, DBF_ULONG) {
+        prompt("One Value")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output 0-7")
+        base(HEX)
+        pp(TRUE)
+    }
+    field(TWVL, DBF_ULONG) {
+        prompt("Two Value")
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        special(SPC_MOD)
+        pp(TRUE)
+        base(HEX)
+    }
+    field(THVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        prompt("Three Value")
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        special(SPC_MOD)
+    }
+    field(FRVL, DBF_ULONG) {
+        pp(TRUE)
+        base(HEX)
+        prompt("Four Value")
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(FVVL, DBF_ULONG) {
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        special(SPC_MOD)
+        prompt("Five Value")
+        pp(TRUE)
+        base(HEX)
+    }
+    field(SXVL, DBF_ULONG) {
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Six Value")
+        pp(TRUE)
+        base(HEX)
+    }
+    field(SVVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        prompt("Seven Value")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output 0-7")
+    }
+    field(EIVL, DBF_ULONG) {
+        prompt("Eight Value")
+        promptgroup("52 - Output 8-15")
+        interest(1)
+        special(SPC_MOD)
+        base(HEX)
+        pp(TRUE)
+    }
+    field(NIVL, DBF_ULONG) {
+        pp(TRUE)
+        base(HEX)
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("52 - Output 8-15")
+        prompt("Nine Value")
+    }
+    field(TEVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        prompt("Ten Value")
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+    }
+    field(ELVL, DBF_ULONG) {
+        pp(TRUE)
+        base(HEX)
+        prompt("Eleven Value")
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+    }
+    field(TVVL, DBF_ULONG) {
+        prompt("Twelve Value")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        pp(TRUE)
+        base(HEX)
+    }
+    field(TTVL, DBF_ULONG) {
+        prompt("Thirteen Value")
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+        pp(TRUE)
+        base(HEX)
+    }
+    field(FTVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        prompt("Fourteen Value")
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+    }
+    field(FFVL, DBF_ULONG) {
+        pp(TRUE)
+        base(HEX)
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+        prompt("Fifteen Value")
+    }
+    field(ZRST, DBF_STRING) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        prompt("Zero String")
+        pp(TRUE)
+        size(26)
+    }
+    field(ONST, DBF_STRING) {
+        prompt("One String")
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        special(SPC_MOD)
+        size(26)
+        pp(TRUE)
+    }
+    field(TWST, DBF_STRING) {
+        size(26)
+        pp(TRUE)
+        promptgroup("81 - Display 0-7")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Two String")
+    }
+    field(THST, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        special(SPC_MOD)
+        prompt("Three String")
+    }
+    field(FRST, DBF_STRING) {
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        special(SPC_MOD)
+        prompt("Four String")
+        pp(TRUE)
+        size(26)
+    }
+    field(FVST, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        prompt("Five String")
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        special(SPC_MOD)
+    }
+    field(SXST, DBF_STRING) {
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        special(SPC_MOD)
+        prompt("Six String")
+        size(26)
+        pp(TRUE)
+    }
+    field(SVST, DBF_STRING) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        prompt("Seven String")
+        pp(TRUE)
+        size(26)
+    }
+    field(EIST, DBF_STRING) {
+        prompt("Eight String")
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        special(SPC_MOD)
+        size(26)
+        pp(TRUE)
+    }
+    field(NIST, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        promptgroup("82 - Display 8-15")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Nine String")
+    }
+    field(TEST, DBF_STRING) {
+        size(26)
+        pp(TRUE)
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("82 - Display 8-15")
+        prompt("Ten String")
+    }
+    field(ELST, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        prompt("Eleven String")
+    }
+    field(TVST, DBF_STRING) {
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        special(SPC_MOD)
+        prompt("Twelve String")
+        pp(TRUE)
+        size(26)
+    }
+    field(TTST, DBF_STRING) {
+        prompt("Thirteen String")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        size(26)
+        pp(TRUE)
+    }
+    field(FTST, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        special(SPC_MOD)
+        prompt("Fourteen String")
+    }
+    field(FFST, DBF_STRING) {
+        prompt("Fifteen String")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        size(26)
+        pp(TRUE)
+    }
+    field(ZRSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("71 - Alarm 0-7")
+        prompt("State Zero Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ONSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        prompt("State One Severity")
+    }
+    field(TWSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("State Two Severity")
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+    }
+    field(THSV, DBF_MENU) {
+        prompt("State Three Severity")
+        interest(1)
+        promptgroup("71 - Alarm 0-7")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(FRSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        prompt("State Four Severity")
+    }
+    field(FVSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("State Five Severity")
+        interest(1)
+        promptgroup("71 - Alarm 0-7")
+        menu(menuAlarmSevr)
+    }
+    field(SXSV, DBF_MENU) {
+        pp(TRUE)
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        prompt("State Six Severity")
+        menu(menuAlarmSevr)
+    }
+    field(SVSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("71 - Alarm 0-7")
+        prompt("State Seven Severity")
+    }
+    field(EISV, DBF_MENU) {
+        promptgroup("72 - Alarm 8-15")
+        interest(1)
+        prompt("State Eight Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(NISV, DBF_MENU) {
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        prompt("State Nine Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(TESV, DBF_MENU) {
+        prompt("State Ten Severity")
+        promptgroup("72 - Alarm 8-15")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(ELSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        prompt("State Eleven Severity")
+        menu(menuAlarmSevr)
+    }
+    field(TVSV, DBF_MENU) {
+        prompt("State Twelve Severity")
+        promptgroup("72 - Alarm 8-15")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(TTSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        prompt("State Thirteen Sevr")
+        menu(menuAlarmSevr)
+    }
+    field(FTSV, DBF_MENU) {
+        prompt("State Fourteen Sevr")
+        promptgroup("72 - Alarm 8-15")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(FFSV, DBF_MENU) {
+        prompt("State Fifteen Sevr")
+        promptgroup("72 - Alarm 8-15")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(UNSV, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Unknown State Sevr")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(COSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Change of State Sevr")
+    }
+    field(RVAL, DBF_ULONG) {
+        pp(TRUE)
+        prompt("Raw Value")
+    }
+    field(ORAW, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Raw Value")
+    }
+    field(RBV, DBF_ULONG) {
+        special(SPC_NOMOD)
+        prompt("Readback Value")
+    }
+    field(ORBV, DBF_ULONG) {
+        prompt("Prev Readback Value")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(MASK, DBF_ULONG) {
+        prompt("Hardware Mask")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(MLST, DBF_USHORT) {
+        prompt("Last Value Monitored")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LALM, DBF_USHORT) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(SDEF, DBF_SHORT) {
+        prompt("States Defined")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(SHFT, DBF_USHORT) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Shift")
+    }
+    field(SIOL, DBF_OUTLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Output Link")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        interest(1)
+        special(SPC_MOD)
+        prompt("Simulation Mode")
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Simulation Mode Severity")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        special(SPC_NOMOD)
+        interest(4)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        menu(menuScan)
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Sim. Mode Scan")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        prompt("Sim. Mode Async Delay")
+        interest(2)
+        promptgroup("90 - Simulate")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Sim. Mode Private")
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID outpt action")
+        promptgroup("50 - Output")
+        interest(2)
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_USHORT) {
+        interest(2)
+        promptgroup("50 - Output")
+        prompt("INVALID output value")
+    }
+}
+device(mbbo, CONSTANT, devMbboSoft, "Soft Channel")
+device(mbbo, CONSTANT, devMbboSoftRaw, "Raw Soft Channel")
+device(mbbo, CONSTANT, devMbboSoftCallback, "Async Soft Channel")
+device(mbbo, INST_IO, asynMbboInt32, "asynInt32")
+device(mbbo, INST_IO, asynMbboUInt32Digital, "asynUInt32Digital")
+device(mbbo, INST_IO, devmbboStream, "stream")
+device(mbbo, INST_IO, devMbboMPC, "asyn MPC")
+device(mbbo, INST_IO, devMbboTPG261, "asyn TPG261")
+recordtype(printf) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "devSup.h"
+    %
+    %/* Declare Device Support Entry Table */
+    %typedef struct printfdset {
+    %    long number;
+    %    DEVSUPFUN report;
+    %    DEVSUPFUN init;
+    %    DEVSUPFUN init_record;
+    %    DEVSUPFUN get_ioint_info;
+    %    DEVSUPFUN write_string;
+    %} printfdset;
+    %
+    %/* Number of INPx fields defined */
+    %#define PRINTF_NLINKS 10
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PHAS, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKS, DBF_MENU) {
+        prompt("Alarm Ack Severity")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(ASP, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_NOACCESS) {
+        asl(ASL0)
+        special(SPC_DBADDR)
+        prompt("Result")
+        extra("char *val")
+        pp(TRUE)
+    }
+    field(SIZV, DBF_USHORT) {
+        initial("41")
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_NOMOD)
+        prompt("Size of VAL buffer")
+    }
+    field(LEN, DBF_ULONG) {
+        special(SPC_NOMOD)
+        prompt("Length of VAL")
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Specification")
+        interest(1)
+        promptgroup("50 - Output")
+    }
+    field(FMT, DBF_STRING) {
+        pp(TRUE)
+        size(81)
+        promptgroup("30 - Action")
+        prompt("Format String")
+    }
+    field(IVLS, DBF_STRING) {
+        initial("LNK")
+        size(16)
+        prompt("Invalid Link String")
+        promptgroup("30 - Action")
+    }
+    field(INP0, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input 0")
+    }
+    field(INP1, DBF_INLINK) {
+        prompt("Input 1")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(INP2, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input 2")
+    }
+    field(INP3, DBF_INLINK) {
+        prompt("Input 3")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(INP4, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input 4")
+    }
+    field(INP5, DBF_INLINK) {
+        prompt("Input 5")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(INP6, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input 6")
+    }
+    field(INP7, DBF_INLINK) {
+        prompt("Input 7")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(INP8, DBF_INLINK) {
+        prompt("Input 8")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(INP9, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input 9")
+    }
+}
+device(printf, CONSTANT, devPrintfSoft, "Soft Channel")
+device(printf, CONSTANT, devPrintfSoftCallback, "Async Soft Channel")
+device(printf, INST_IO, devPrintfStdio, "stdio")
+recordtype(ao) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Record Name")
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Force Processing")
+        interest(3)
+    }
+    field(STAT, DBF_MENU) {
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_DOUBLE) {
+        pp(TRUE)
+        asl(ASL0)
+        prompt("Desired Output")
+        promptgroup("50 - Output")
+    }
+    field(OVAL, DBF_DOUBLE) {
+        prompt("Output Value")
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Specification")
+        interest(1)
+        promptgroup("50 - Output")
+    }
+    field(OROC, DBF_DOUBLE) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Rate of Change")
+    }
+    field(DOL, DBF_INLINK) {
+        prompt("Desired Output Loc")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(OMSL, DBF_MENU) {
+        prompt("Output Mode Select")
+        promptgroup("50 - Output")
+        interest(1)
+        menu(menuOmsl)
+    }
+    field(OIF, DBF_MENU) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Out Full/Incremental")
+        menu(aoOIF)
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+    }
+    field(LINR, DBF_MENU) {
+        pp(TRUE)
+        promptgroup("60 - Convert")
+        interest(1)
+        special(SPC_LINCONV)
+        prompt("Linearization")
+        menu(menuConvert)
+    }
+    field(EGUF, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Eng Units Full")
+        special(SPC_LINCONV)
+        interest(1)
+        promptgroup("60 - Convert")
+    }
+    field(EGUL, DBF_DOUBLE) {
+        prompt("Eng Units Low")
+        interest(1)
+        special(SPC_LINCONV)
+        promptgroup("60 - Convert")
+        pp(TRUE)
+    }
+    field(EGU, DBF_STRING) {
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        prompt("Engineering Units")
+        size(16)
+    }
+    field(ROFF, DBF_ULONG) {
+        pp(TRUE)
+        interest(2)
+        prompt("Raw Offset")
+    }
+    field(EOFF, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("60 - Convert")
+        interest(2)
+        prompt("EGU to Raw Offset")
+    }
+    field(ESLO, DBF_DOUBLE) {
+        initial("1")
+        pp(TRUE)
+        prompt("EGU to Raw Slope")
+        interest(2)
+        promptgroup("60 - Convert")
+    }
+    field(DRVH, DBF_DOUBLE) {
+        prompt("Drive High Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("30 - Action")
+        pp(TRUE)
+    }
+    field(DRVL, DBF_DOUBLE) {
+        pp(TRUE)
+        prop(YES)
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Drive Low Limit")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("High Operating Range")
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prompt("Low Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(AOFF, DBF_DOUBLE) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("60 - Convert")
+        prompt("Adjustment Offset")
+    }
+    field(ASLO, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("60 - Convert")
+        prompt("Adjustment Slope")
+        pp(TRUE)
+    }
+    field(HIHI, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Hihi Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LOLO, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Lolo Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(HIGH, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("High Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LOW, DBF_DOUBLE) {
+        pp(TRUE)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Alarm Limit")
+    }
+    field(HHSV, DBF_MENU) {
+        prompt("Hihi Severity")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(LLSV, DBF_MENU) {
+        prompt("Lolo Severity")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("High Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Severity")
+    }
+    field(HYST, DBF_DOUBLE) {
+        prompt("Alarm Deadband")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(MDEL, DBF_DOUBLE) {
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Monitor Deadband")
+    }
+    field(RVAL, DBF_LONG) {
+        prompt("Current Raw Value")
+        pp(TRUE)
+    }
+    field(ORAW, DBF_LONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Previous Raw Value")
+    }
+    field(RBV, DBF_LONG) {
+        prompt("Readback Value")
+        special(SPC_NOMOD)
+    }
+    field(ORBV, DBF_LONG) {
+        prompt("Prev Readback Value")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(PVAL, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Previous value")
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ALST, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Archived")
+    }
+    field(MLST, DBF_DOUBLE) {
+        prompt("Last Val Monitored")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(PBRK, DBF_NOACCESS) {
+        extra("void *   pbrk")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Ptrto brkTable")
+    }
+    field(INIT, DBF_SHORT) {
+        prompt("Initialized?")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LBRK, DBF_SHORT) {
+        prompt("LastBreak Point")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(SIOL, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Output Link")
+    }
+    field(SIML, DBF_INLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Link")
+    }
+    field(SIMM, DBF_MENU) {
+        prompt("Simulation Mode")
+        interest(1)
+        special(SPC_MOD)
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        prompt("Sim. Mode Async Delay")
+        interest(2)
+        promptgroup("90 - Simulate")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        prompt("Sim. Mode Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("CALLBACK            *simpvt")
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID output action")
+        promptgroup("50 - Output")
+        interest(2)
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_DOUBLE) {
+        promptgroup("50 - Output")
+        interest(2)
+        prompt("INVALID output value")
+    }
+    field(OMOD, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        prompt("Was OVAL modified?")
+    }
+}
+device(ao, CONSTANT, devAoSoft, "Soft Channel")
+device(ao, CONSTANT, devAoSoftRaw, "Raw Soft Channel")
+device(ao, CONSTANT, devAoSoftCallback, "Async Soft Channel")
+device(ao, INST_IO, asynAoInt32, "asynInt32")
+device(ao, INST_IO, asynAoFloat64, "asynFloat64")
+device(ao, INST_IO, devaoStream, "stream")
+device(ao, INST_IO, devAoStrParm, "asyn ao stringParm")
+device(ao, INST_IO, devAoEurotherm, "asyn ao Eurotherm")
+device(ao, INST_IO, devAoMPC, "asyn MPC")
+device(ao, BBGPIB_IO, devAoAX301, "PZT Bug")
+device(ao, INST_IO, devAoTPG261, "asyn TPG261")
+recordtype(asyn) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        prompt("Access Security Group")
+    }
+    field(SCAN, DBF_MENU) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(PHAS, DBF_SHORT) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_LONG) {
+        asl(ASL0)
+        interest(4)
+        prompt("Value field (unused)")
+    }
+    field(PORT, DBF_STRING) {
+        prompt("asyn port")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("40 - Input")
+        size(40)
+        initial("")
+    }
+    field(ADDR, DBF_LONG) {
+        promptgroup("40 - Input")
+        interest(1)
+        special(SPC_MOD)
+        prompt("asyn address")
+        initial("0")
+    }
+    field(PCNCT, DBF_MENU) {
+        menu(asynCONNECT)
+        prompt("Port Connect/Disconnect")
+        interest(2)
+        special(SPC_MOD)
+    }
+    field(DRVINFO, DBF_STRING) {
+        promptgroup("40 - Input")
+        interest(2)
+        special(SPC_MOD)
+        prompt("Driver info string")
+        size(40)
+        initial("")
+    }
+    field(REASON, DBF_LONG) {
+        prompt("asynUser->reason")
+        interest(2)
+        special(SPC_MOD)
+    }
+    field(TMOD, DBF_MENU) {
+        prompt("Transaction mode")
+        interest(1)
+        promptgroup("40 - Input")
+        menu(asynTMOD)
+    }
+    field(TMOT, DBF_DOUBLE) {
+        initial("1.0")
+        prompt("Timeout (sec)")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(IFACE, DBF_MENU) {
+        menu(asynINTERFACE)
+        prompt("Interface")
+        special(SPC_MOD)
+        interest(2)
+        promptgroup("40 - Input")
+    }
+    field(OCTETIV, DBF_LONG) {
+        interest(2)
+        prompt("asynOctet is valid")
+    }
+    field(OPTIONIV, DBF_LONG) {
+        interest(2)
+        prompt("asynOption is valid")
+    }
+    field(GPIBIV, DBF_LONG) {
+        prompt("asynGPIB is valid")
+        interest(2)
+    }
+    field(I32IV, DBF_LONG) {
+        interest(2)
+        prompt("asynInt32 is valid")
+    }
+    field(UI32IV, DBF_LONG) {
+        interest(2)
+        prompt("asynUInt32Digital is valid")
+    }
+    field(F64IV, DBF_LONG) {
+        prompt("asynFloat64 is valid")
+        interest(2)
+    }
+    field(AOUT, DBF_STRING) {
+        size(40)
+        pp(TRUE)
+        interest(1)
+        promptgroup("50 - Output")
+        prompt("Output (command) string")
+    }
+    field(OEOS, DBF_STRING) {
+        promptgroup("50 - Output")
+        special(SPC_MOD)
+        interest(1)
+        prompt("Output delimiter")
+        size(40)
+    }
+    field(BOUT, DBF_CHAR) {
+        prompt("Output binary data")
+        interest(1)
+        special(SPC_DBADDR)
+        pp(TRUE)
+    }
+    field(OPTR, DBF_NOACCESS) {
+        extra("void *optr")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Output buffer pointer")
+    }
+    field(OMAX, DBF_LONG) {
+        initial("80")
+        prompt("Max. size of output array")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("50 - Output")
+    }
+    field(NOWT, DBF_LONG) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Number of bytes to write")
+        initial("80")
+    }
+    field(NAWT, DBF_LONG) {
+        interest(1)
+        prompt("Number of bytes actually written")
+    }
+    field(OFMT, DBF_MENU) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output format")
+        menu(asynFMT)
+    }
+    field(AINP, DBF_STRING) {
+        prompt("Input (response) string")
+        special(SPC_NOMOD)
+        interest(1)
+        size(40)
+    }
+    field(TINP, DBF_STRING) {
+        prompt("Translated input string")
+        special(SPC_NOMOD)
+        interest(1)
+        asl(ASL0)
+        size(40)
+    }
+    field(IEOS, DBF_STRING) {
+        prompt("Input Delimiter")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("40 - Input")
+        size(40)
+    }
+    field(BINP, DBF_CHAR) {
+        special(SPC_DBADDR)
+        prompt("Input binary data")
+        asl(ASL0)
+    }
+    field(IPTR, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Input buffer pointer")
+        extra("void *iptr")
+        size(4)
+    }
+    field(IMAX, DBF_LONG) {
+        initial("80")
+        prompt("Max. size of input array")
+        interest(1)
+        promptgroup("40 - Input")
+        special(SPC_NOMOD)
+    }
+    field(NRRD, DBF_LONG) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Number of bytes to read")
+    }
+    field(NORD, DBF_LONG) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Number of bytes read")
+    }
+    field(IFMT, DBF_MENU) {
+        menu(asynFMT)
+        prompt("Input format")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(EOMR, DBF_MENU) {
+        menu(asynEOMREASON)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("EOM reason")
+    }
+    field(I32INP, DBF_LONG) {
+        prompt("asynInt32 input")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(I32OUT, DBF_LONG) {
+        pp(TRUE)
+        prompt("asynInt32 output")
+        promptgroup("50 - Output")
+        interest(2)
+    }
+    field(UI32INP, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("asynUInt32Digital input")
+    }
+    field(UI32OUT, DBF_ULONG) {
+        interest(2)
+        promptgroup("50 - Output")
+        prompt("asynUInt32Digital output")
+        pp(TRUE)
+    }
+    field(UI32MASK, DBF_ULONG) {
+        initial("0xffffffff")
+        prompt("asynUInt32Digital mask")
+        interest(2)
+        promptgroup("50 - Output")
+        special(SPC_MOD)
+    }
+    field(F64INP, DBF_DOUBLE) {
+        prompt("asynFloat64 input")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(F64OUT, DBF_DOUBLE) {
+        promptgroup("50 - Output")
+        interest(2)
+        prompt("asynFloat64 output")
+        pp(TRUE)
+    }
+    field(BAUD, DBF_MENU) {
+        menu(serialBAUD)
+        prompt("Baud rate")
+        promptgroup("40 - Input")
+        special(SPC_MOD)
+        interest(2)
+    }
+    field(LBAUD, DBF_LONG) {
+        special(SPC_MOD)
+        promptgroup("40 - Input")
+        interest(2)
+        prompt("Baud rate")
+    }
+    field(PRTY, DBF_MENU) {
+        menu(serialPRTY)
+        special(SPC_MOD)
+        promptgroup("40 - Input")
+        interest(2)
+        prompt("Parity")
+    }
+    field(DBIT, DBF_MENU) {
+        special(SPC_MOD)
+        promptgroup("40 - Input")
+        interest(2)
+        prompt("Data bits")
+        menu(serialDBIT)
+    }
+    field(SBIT, DBF_MENU) {
+        interest(2)
+        special(SPC_MOD)
+        promptgroup("40 - Input")
+        prompt("Stop bits")
+        menu(serialSBIT)
+    }
+    field(MCTL, DBF_MENU) {
+        interest(2)
+        special(SPC_MOD)
+        promptgroup("40 - Input")
+        prompt("Modem control")
+        menu(serialMCTL)
+    }
+    field(FCTL, DBF_MENU) {
+        prompt("Flow control")
+        special(SPC_MOD)
+        interest(2)
+        promptgroup("40 - Input")
+        menu(serialFCTL)
+    }
+    field(IXON, DBF_MENU) {
+        menu(serialIX)
+        promptgroup("40 - Input")
+        special(SPC_MOD)
+        interest(2)
+        prompt("Output XON/XOFF")
+    }
+    field(IXOFF, DBF_MENU) {
+        interest(2)
+        special(SPC_MOD)
+        promptgroup("40 - Input")
+        prompt("Input XON/XOFF")
+        menu(serialIX)
+    }
+    field(IXANY, DBF_MENU) {
+        menu(serialIX)
+        special(SPC_MOD)
+        interest(2)
+        promptgroup("40 - Input")
+        prompt("XON=any character")
+    }
+    field(HOSTINFO, DBF_STRING) {
+        prompt("host info")
+        promptgroup("40 - Input")
+        interest(1)
+        special(SPC_MOD)
+        initial("")
+        size(40)
+    }
+    field(DRTO, DBF_MENU) {
+        menu(ipDRTO)
+        promptgroup("40 - Input")
+        special(SPC_MOD)
+        interest(2)
+        prompt("Disconnect on timeout")
+    }
+    field(UCMD, DBF_MENU) {
+        pp(TRUE)
+        interest(2)
+        promptgroup("50 - Output")
+        prompt("Universal command")
+        menu(gpibUCMD)
+    }
+    field(ACMD, DBF_MENU) {
+        menu(gpibACMD)
+        prompt("Addressed command")
+        promptgroup("50 - Output")
+        interest(2)
+        pp(TRUE)
+    }
+    field(SPR, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Serial poll response")
+    }
+    field(TMSK, DBF_LONG) {
+        prompt("Trace mask")
+        interest(1)
+        promptgroup("80 - Display")
+        special(SPC_MOD)
+    }
+    field(TB0, DBF_MENU) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("80 - Display")
+        prompt("Trace error")
+        menu(asynTRACE)
+    }
+    field(TB1, DBF_MENU) {
+        menu(asynTRACE)
+        prompt("Trace IO device")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(TB2, DBF_MENU) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Trace IO filter")
+        menu(asynTRACE)
+    }
+    field(TB3, DBF_MENU) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Trace IO driver")
+        menu(asynTRACE)
+    }
+    field(TB4, DBF_MENU) {
+        menu(asynTRACE)
+        prompt("Trace flow")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("80 - Display")
+    }
+    field(TB5, DBF_MENU) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("80 - Display")
+        prompt("Trace warning")
+        menu(asynTRACE)
+    }
+    field(TIOM, DBF_LONG) {
+        prompt("Trace I/O mask")
+        promptgroup("80 - Display")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(TIB0, DBF_MENU) {
+        menu(asynTRACE)
+        prompt("Trace IO ASCII")
+        promptgroup("80 - Display")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(TIB1, DBF_MENU) {
+        menu(asynTRACE)
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Trace IO escape")
+    }
+    field(TIB2, DBF_MENU) {
+        interest(1)
+        promptgroup("80 - Display")
+        special(SPC_MOD)
+        prompt("Trace IO hex")
+        menu(asynTRACE)
+    }
+    field(TINM, DBF_LONG) {
+        prompt("Trace Info mask")
+        interest(1)
+        promptgroup("80 - Display")
+        special(SPC_MOD)
+    }
+    field(TINB0, DBF_MENU) {
+        menu(asynTRACE)
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Trace Info Time")
+    }
+    field(TINB1, DBF_MENU) {
+        prompt("Trace Info Port")
+        promptgroup("80 - Display")
+        interest(1)
+        special(SPC_MOD)
+        menu(asynTRACE)
+    }
+    field(TINB2, DBF_MENU) {
+        menu(asynTRACE)
+        prompt("Trace Info Source")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("80 - Display")
+    }
+    field(TINB3, DBF_MENU) {
+        menu(asynTRACE)
+        prompt("Trace Info Thread")
+        promptgroup("80 - Display")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(TSIZ, DBF_LONG) {
+        prompt("Trace IO truncate size")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("80 - Display")
+    }
+    field(TFIL, DBF_STRING) {
+        prompt("Trace IO file")
+        interest(1)
+        promptgroup("80 - Display")
+        special(SPC_MOD)
+        size(40)
+    }
+    field(AUCT, DBF_MENU) {
+        menu(asynAUTOCONNECT)
+        prompt("Autoconnect")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(CNCT, DBF_MENU) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Connect/Disconnect")
+        menu(asynCONNECT)
+    }
+    field(ENBL, DBF_MENU) {
+        menu(asynENABLE)
+        interest(1)
+        promptgroup("40 - Input")
+        special(SPC_MOD)
+        prompt("Enable/Disable")
+    }
+    field(ERRS, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_DBADDR)
+        prompt("Error string")
+        extra("char *errs")
+    }
+    field(AQR, DBF_UCHAR) {
+        interest(4)
+        special(SPC_MOD)
+        prompt("Abort queueRequest")
+    }
+}
+device(asyn, INST_IO, asynRecordDevice, "asynRecordDevice")
+recordtype(aao) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Record Name")
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        prompt("Scan Mechanism")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Process at iocInit")
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        prompt("Alarm Ack Transient")
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+        pp(TRUE)
+        initial("1")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+    }
+    field(TIME, DBF_NOACCESS) {
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Value")
+        special(SPC_DBADDR)
+        pp(TRUE)
+        extra("void *		val")
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+    }
+    field(OUT, DBF_OUTLINK) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Specification")
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        prompt("Engineering Units")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Range")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Low Operating Range")
+    }
+    field(NELM, DBF_ULONG) {
+        initial("1")
+        prompt("Number of Elements")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("30 - Action")
+    }
+    field(FTVL, DBF_MENU) {
+        prompt("Field Type of Value")
+        interest(1)
+        special(SPC_NOMOD)
+        promptgroup("30 - Action")
+        menu(menuFtype)
+    }
+    field(NORD, DBF_ULONG) {
+        special(SPC_NOMOD)
+        prompt("Number elements read")
+    }
+    field(BPTR, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Buffer Pointer")
+        extra("void *		bptr")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMM, DBF_MENU) {
+        prompt("Simulation Mode")
+        special(SPC_MOD)
+        interest(1)
+        menu(menuYesNo)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Mode Severity")
+    }
+    field(SIOL, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Output Link")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        prompt("Sim. Mode Async Delay")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        prompt("Sim. Mode Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(MPST, DBF_MENU) {
+        menu(aaoPOST)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Post Value Monitors")
+    }
+    field(APST, DBF_MENU) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Post Archive Monitors")
+        menu(aaoPOST)
+    }
+    field(HASH, DBF_ULONG) {
+        interest(3)
+        prompt("Hash of OnChange data.")
+    }
+}
+device(aao, CONSTANT, devAaoSoft, "Soft Channel")
+device(aao, INST_IO, devaaoStream, "stream")
+recordtype(bi) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Event Name")
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        interest(1)
+        special(SPC_NOMOD)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        initial("1")
+        pp(TRUE)
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(TIME, DBF_NOACCESS) {
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(INP, DBF_INLINK) {
+        prompt("Input Specification")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(VAL, DBF_ENUM) {
+        asl(ASL0)
+        prompt("Current Value")
+        promptgroup("40 - Input")
+        pp(TRUE)
+    }
+    field(ZSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("Zero Error Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(OSV, DBF_MENU) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("One Error Severity")
+        menu(menuAlarmSevr)
+    }
+    field(COSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Change of State Svr")
+    }
+    field(ZNAM, DBF_STRING) {
+        prompt("Zero Name")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        pp(TRUE)
+        size(26)
+    }
+    field(ONAM, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("One Name")
+    }
+    field(RVAL, DBF_ULONG) {
+        pp(TRUE)
+        prompt("Raw Value")
+    }
+    field(ORAW, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("prev Raw Value")
+    }
+    field(MASK, DBF_ULONG) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Hardware Mask")
+    }
+    field(LALM, DBF_USHORT) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Alarmed")
+    }
+    field(MLST, DBF_USHORT) {
+        prompt("Last Value Monitored")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(SIOL, DBF_INLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Input Link")
+    }
+    field(SVAL, DBF_ULONG) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Mode Link")
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuSimm)
+        prompt("Simulation Mode")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        interest(4)
+        special(SPC_NOMOD)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        prompt("Sim. Mode Scan")
+        promptgroup("90 - Simulate")
+        interest(1)
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Sim. Mode Async Delay")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Sim. Mode Private")
+        extra("CALLBACK            *simpvt")
+    }
+}
+device(bi, CONSTANT, devBiSoft, "Soft Channel")
+device(bi, CONSTANT, devBiSoftRaw, "Raw Soft Channel")
+device(bi, CONSTANT, devBiSoftCallback, "Async Soft Channel")
+device(bi, INST_IO, devBiDbState, "Db State")
+device(bi, INST_IO, asynBiInt32, "asynInt32")
+device(bi, INST_IO, asynBiUInt32Digital, "asynUInt32Digital")
+device(bi, INST_IO, devbiStream, "stream")
+device(bi, INST_IO, devBiStrParm, "asyn bi stringParm")
+device(bi, INST_IO, devBiMPC, "asyn MPC")
+device(bi, GPIB_IO, devBiGP307Gpib, "Vg307 GPIB Instrument")
+device(bi, INST_IO, devBiTelevac, "asyn Televac")
+device(bi, INST_IO, devBiTPG261, "asyn TPG261")
+recordtype(sub) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %struct subRecord;
+    %typedef long (*SUBFUNCPTR)(struct subRecord *);
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Force Processing")
+        interest(3)
+    }
+    field(STAT, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        prompt("Alarm Ack Transient")
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RDES, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Result")
+        asl(ASL0)
+    }
+    field(INAM, DBF_STRING) {
+        size(40)
+        special(SPC_NOMOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Init Routine Name")
+    }
+    field(SNAM, DBF_STRING) {
+        size(40)
+        prompt("Subroutine Name")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+    }
+    field(SADR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Subroutine Address")
+        extra("SUBFUNCPTR sadr")
+    }
+    field(INPA, DBF_INLINK) {
+        prompt("Input A")
+        promptgroup("41 - Input A-F")
+        interest(1)
+    }
+    field(INPB, DBF_INLINK) {
+        prompt("Input B")
+        promptgroup("41 - Input A-F")
+        interest(1)
+    }
+    field(INPC, DBF_INLINK) {
+        promptgroup("41 - Input A-F")
+        interest(1)
+        prompt("Input C")
+    }
+    field(INPD, DBF_INLINK) {
+        interest(1)
+        promptgroup("41 - Input A-F")
+        prompt("Input D")
+    }
+    field(INPE, DBF_INLINK) {
+        prompt("Input E")
+        promptgroup("41 - Input A-F")
+        interest(1)
+    }
+    field(INPF, DBF_INLINK) {
+        prompt("Input F")
+        promptgroup("41 - Input A-F")
+        interest(1)
+    }
+    field(INPG, DBF_INLINK) {
+        prompt("Input G")
+        promptgroup("42 - Input G-L")
+        interest(1)
+    }
+    field(INPH, DBF_INLINK) {
+        prompt("Input H")
+        interest(1)
+        promptgroup("42 - Input G-L")
+    }
+    field(INPI, DBF_INLINK) {
+        promptgroup("42 - Input G-L")
+        interest(1)
+        prompt("Input I")
+    }
+    field(INPJ, DBF_INLINK) {
+        prompt("Input J")
+        interest(1)
+        promptgroup("42 - Input G-L")
+    }
+    field(INPK, DBF_INLINK) {
+        interest(1)
+        promptgroup("42 - Input G-L")
+        prompt("Input K")
+    }
+    field(INPL, DBF_INLINK) {
+        promptgroup("42 - Input G-L")
+        interest(1)
+        prompt("Input L")
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Engineering Units")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        size(16)
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Range")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prompt("Low Operating Range")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(HIHI, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("Hihi Alarm Limit")
+        pp(TRUE)
+    }
+    field(LOLO, DBF_DOUBLE) {
+        pp(TRUE)
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("Lolo Alarm Limit")
+    }
+    field(HIGH, DBF_DOUBLE) {
+        prompt("High Alarm Limit")
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(LOW, DBF_DOUBLE) {
+        prompt("Low Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(BRSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("Bad Return Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(HHSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Hihi Severity")
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(LLSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("Lolo Severity")
+        pp(TRUE)
+    }
+    field(HSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("High Severity")
+    }
+    field(LSV, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("Low Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(HYST, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Alarm Deadband")
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        prompt("Monitor Deadband")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(A, DBF_DOUBLE) {
+        prompt("Value of Input A")
+        pp(TRUE)
+    }
+    field(B, DBF_DOUBLE) {
+        prompt("Value of Input B")
+        pp(TRUE)
+    }
+    field(C, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input C")
+    }
+    field(D, DBF_DOUBLE) {
+        prompt("Value of Input D")
+        pp(TRUE)
+    }
+    field(E, DBF_DOUBLE) {
+        prompt("Value of Input E")
+        pp(TRUE)
+    }
+    field(F, DBF_DOUBLE) {
+        prompt("Value of Input F")
+        pp(TRUE)
+    }
+    field(G, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input G")
+    }
+    field(H, DBF_DOUBLE) {
+        prompt("Value of Input H")
+        pp(TRUE)
+    }
+    field(I, DBF_DOUBLE) {
+        prompt("Value of Input I")
+        pp(TRUE)
+    }
+    field(J, DBF_DOUBLE) {
+        prompt("Value of Input J")
+        pp(TRUE)
+    }
+    field(K, DBF_DOUBLE) {
+        prompt("Value of Input K")
+        pp(TRUE)
+    }
+    field(L, DBF_DOUBLE) {
+        prompt("Value of Input L")
+        pp(TRUE)
+    }
+    field(LA, DBF_DOUBLE) {
+        prompt("Prev Value of A")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LB, DBF_DOUBLE) {
+        prompt("Prev Value of B")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LC, DBF_DOUBLE) {
+        prompt("Prev Value of C")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LD, DBF_DOUBLE) {
+        prompt("Prev Value of D")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LE, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of E")
+    }
+    field(LF, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of F")
+    }
+    field(LG, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of G")
+    }
+    field(LH, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of H")
+    }
+    field(LI, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of I")
+    }
+    field(LJ, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of J")
+    }
+    field(LK, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of K")
+    }
+    field(LL, DBF_DOUBLE) {
+        prompt("Prev Value of L")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ALST, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Archived")
+    }
+    field(MLST, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Monitored")
+    }
+}
+recordtype(transform) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Record Name")
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        prompt("Alarm Ack Transient")
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPN, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VERS, DBF_FLOAT) {
+        special(SPC_NOMOD)
+        prompt("Code Version")
+        initial("1")
+    }
+    field(RPVT, DBF_NOACCESS) {
+        size(4)
+        extra("void *         rpvt")
+        prompt("Record Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(IVLA, DBF_MENU) {
+        initial("0")
+        menu(transformIVLA)
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Invalid link action")
+    }
+    field(COPT, DBF_MENU) {
+        prompt("Calc option")
+        promptgroup("10 - Common")
+        interest(1)
+        menu(transformCOPT)
+        initial("Conditional")
+    }
+    field(VAL, DBF_DOUBLE) {
+        prompt("Result")
+    }
+    field(CLCA, DBF_STRING) {
+        size(120)
+        prompt("Calculation A")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(CLCB, DBF_STRING) {
+        size(120)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Calculation B")
+    }
+    field(CLCC, DBF_STRING) {
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Calculation C")
+        size(120)
+    }
+    field(CLCD, DBF_STRING) {
+        prompt("Calculation D")
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        size(120)
+    }
+    field(CLCE, DBF_STRING) {
+        prompt("Calculation E")
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        size(120)
+    }
+    field(CLCF, DBF_STRING) {
+        prompt("Calculation F")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        size(120)
+    }
+    field(CLCG, DBF_STRING) {
+        prompt("Calculation G")
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        size(120)
+    }
+    field(CLCH, DBF_STRING) {
+        size(120)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Calculation H")
+    }
+    field(CLCI, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Calculation I")
+        size(120)
+    }
+    field(CLCJ, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Calculation J")
+        size(120)
+    }
+    field(CLCK, DBF_STRING) {
+        size(120)
+        prompt("Calculation K")
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+    }
+    field(CLCL, DBF_STRING) {
+        size(120)
+        prompt("Calculation L")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(CLCM, DBF_STRING) {
+        prompt("Calculation M")
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        size(120)
+    }
+    field(CLCN, DBF_STRING) {
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Calculation N")
+        size(120)
+    }
+    field(CLCO, DBF_STRING) {
+        size(120)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Calculation O")
+    }
+    field(CLCP, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Calculation P")
+        size(120)
+    }
+    field(CAV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Invalid")
+    }
+    field(CBV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Invalid")
+    }
+    field(CCV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Invalid")
+    }
+    field(CDV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CEV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CFV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CGV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CHV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Invalid")
+    }
+    field(CIV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CJV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CKV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CLV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Invalid")
+    }
+    field(CMV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(CNV, DBF_LONG) {
+        prompt("CALC Invalid")
+        interest(1)
+    }
+    field(COV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Invalid")
+    }
+    field(CPV, DBF_LONG) {
+        interest(1)
+        prompt("CALC Invalid")
+    }
+    field(INPA, DBF_INLINK) {
+        prompt("Input A")
+        interest(1)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(INPB, DBF_INLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input B")
+    }
+    field(INPC, DBF_INLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input C")
+    }
+    field(INPD, DBF_INLINK) {
+        prompt("Input D")
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPE, DBF_INLINK) {
+        interest(1)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Input E")
+    }
+    field(INPF, DBF_INLINK) {
+        prompt("Input F")
+        interest(1)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(INPG, DBF_INLINK) {
+        prompt("Input G")
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPH, DBF_INLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Input H")
+    }
+    field(INPI, DBF_INLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input I")
+    }
+    field(INPJ, DBF_INLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Input J")
+    }
+    field(INPK, DBF_INLINK) {
+        prompt("Input K")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+    }
+    field(INPL, DBF_INLINK) {
+        prompt("Input L")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+    }
+    field(INPM, DBF_INLINK) {
+        interest(1)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Input M")
+    }
+    field(INPN, DBF_INLINK) {
+        prompt("Input N")
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INPO, DBF_INLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input O")
+    }
+    field(INPP, DBF_INLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Input P")
+    }
+    field(OUTA, DBF_OUTLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Output A")
+    }
+    field(OUTB, DBF_OUTLINK) {
+        prompt("Output B")
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(OUTC, DBF_OUTLINK) {
+        prompt("Output C")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(OUTD, DBF_OUTLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Output D")
+    }
+    field(OUTE, DBF_OUTLINK) {
+        prompt("Output E")
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(OUTF, DBF_OUTLINK) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Output F")
+    }
+    field(OUTG, DBF_OUTLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Output G")
+    }
+    field(OUTH, DBF_OUTLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Output H")
+    }
+    field(OUTI, DBF_OUTLINK) {
+        prompt("Output I")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(OUTJ, DBF_OUTLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Output J")
+    }
+    field(OUTK, DBF_OUTLINK) {
+        prompt("Output K")
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(OUTL, DBF_OUTLINK) {
+        prompt("Output L")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+    }
+    field(OUTM, DBF_OUTLINK) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Output M")
+    }
+    field(OUTN, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Output N")
+    }
+    field(OUTO, DBF_OUTLINK) {
+        prompt("Output O")
+        interest(1)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(OUTP, DBF_OUTLINK) {
+        promptgroup("10 - Common")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Output P")
+    }
+    field(EGU, DBF_STRING) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Units Name")
+        size(16)
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(A, DBF_DOUBLE) {
+        pp(TRUE)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Value of A")
+    }
+    field(B, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of B")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(C, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Value of C")
+    }
+    field(D, DBF_DOUBLE) {
+        prompt("Value of D")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+    field(E, DBF_DOUBLE) {
+        prompt("Value of E")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+    field(F, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Value of F")
+    }
+    field(G, DBF_DOUBLE) {
+        pp(TRUE)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Value of G")
+    }
+    field(H, DBF_DOUBLE) {
+        pp(TRUE)
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Value of H")
+    }
+    field(I, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of I")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(J, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Value of J")
+        pp(TRUE)
+    }
+    field(K, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Value of K")
+    }
+    field(L, DBF_DOUBLE) {
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        prompt("Value of L")
+        pp(TRUE)
+    }
+    field(M, DBF_DOUBLE) {
+        special(SPC_MOD)
+        promptgroup("10 - Common")
+        prompt("Value of M")
+        pp(TRUE)
+    }
+    field(N, DBF_DOUBLE) {
+        prompt("Value of N")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+    field(O, DBF_DOUBLE) {
+        prompt("Value of O")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+    field(P, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of P")
+        promptgroup("10 - Common")
+        special(SPC_MOD)
+    }
+    field(LA, DBF_DOUBLE) {
+        prompt("Prev Value of A")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LB, DBF_DOUBLE) {
+        prompt("Prev Value of B")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LC, DBF_DOUBLE) {
+        prompt("Prev Value of C")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LD, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of D")
+    }
+    field(LE, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of E")
+    }
+    field(LF, DBF_DOUBLE) {
+        prompt("Prev Value of F")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LG, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of G")
+    }
+    field(LH, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of H")
+    }
+    field(LI, DBF_DOUBLE) {
+        prompt("Prev Value of I")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(LJ, DBF_DOUBLE) {
+        prompt("Prev Value of J")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(LK, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of K")
+    }
+    field(LL, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of L")
+    }
+    field(LM, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of M")
+    }
+    field(LN, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Prev Value of N")
+    }
+    field(LO, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Value of O")
+    }
+    field(LP, DBF_DOUBLE) {
+        prompt("Prev Value of P")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(RPCA, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Postfix Calc A")
+        extra("unsigned char rpca[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCB, DBF_NOACCESS) {
+        extra("unsigned char rpcb[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+        prompt("Postfix Calc B")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RPCC, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Postfix Calc C")
+        extra("unsigned char rpcc[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCD, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Postfix Calc D")
+        extra("unsigned char rpcd[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCE, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Postfix Calc E")
+        extra("unsigned char rpce[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCF, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Postfix Calc F")
+        extra("unsigned char rpcf[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCG, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Postfix Calc G")
+        extra("unsigned char rpcg[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCH, DBF_NOACCESS) {
+        prompt("Postfix Calc H")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("unsigned char rpch[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCI, DBF_NOACCESS) {
+        prompt("Postfix Calc I")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("unsigned char rpci[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCJ, DBF_NOACCESS) {
+        prompt("Postfix Calc J")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("unsigned char rpcj[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCK, DBF_NOACCESS) {
+        extra("unsigned char rpck[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+        prompt("Postfix Calc K")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RPCL, DBF_NOACCESS) {
+        extra("unsigned char rpcl[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+        prompt("Postfix Calc L")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RPCM, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Postfix Calc M")
+        extra("unsigned char rpcm[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(RPCN, DBF_NOACCESS) {
+        extra("unsigned char rpcn[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+        prompt("Postfix Calc N")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RPCO, DBF_NOACCESS) {
+        extra("unsigned char rpco[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Postfix Calc O")
+    }
+    field(RPCP, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Postfix Calc P")
+        extra("unsigned char rpcp[SCALC_INFIX_TO_POSTFIX_SIZE(120)]")
+    }
+    field(CMTA, DBF_STRING) {
+        prompt("Comment A")
+        promptgroup("10 - Common")
+        size(39)
+    }
+    field(CMTB, DBF_STRING) {
+        size(39)
+        prompt("Comment B")
+        promptgroup("10 - Common")
+    }
+    field(CMTC, DBF_STRING) {
+        size(39)
+        prompt("Comment C")
+        promptgroup("10 - Common")
+    }
+    field(CMTD, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Comment D")
+        size(39)
+    }
+    field(CMTE, DBF_STRING) {
+        prompt("Comment E")
+        promptgroup("10 - Common")
+        size(39)
+    }
+    field(CMTF, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Comment F")
+        size(39)
+    }
+    field(CMTG, DBF_STRING) {
+        size(39)
+        prompt("Comment G")
+        promptgroup("10 - Common")
+    }
+    field(CMTH, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Comment H")
+        size(39)
+    }
+    field(CMTI, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Comment I")
+        size(39)
+    }
+    field(CMTJ, DBF_STRING) {
+        size(39)
+        prompt("Comment J")
+        promptgroup("10 - Common")
+    }
+    field(CMTK, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Comment K")
+        size(39)
+    }
+    field(CMTL, DBF_STRING) {
+        size(39)
+        prompt("Comment L")
+        promptgroup("10 - Common")
+    }
+    field(CMTM, DBF_STRING) {
+        size(39)
+        prompt("Comment M")
+        promptgroup("10 - Common")
+    }
+    field(CMTN, DBF_STRING) {
+        size(39)
+        prompt("Comment N")
+        promptgroup("10 - Common")
+    }
+    field(CMTO, DBF_STRING) {
+        size(39)
+        prompt("Comment O")
+        promptgroup("10 - Common")
+    }
+    field(CMTP, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Comment P")
+        size(39)
+    }
+    field(MAP, DBF_SHORT) {
+        prompt("Input bitmap")
+        interest(3)
+        promptgroup("10 - Common")
+    }
+    field(IAV, DBF_MENU) {
+        menu(transformIAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Input link valid")
+        initial("1")
+    }
+    field(IBV, DBF_MENU) {
+        initial("1")
+        menu(transformIAV)
+        prompt("Input link valid")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ICV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Input link valid")
+        menu(transformIAV)
+    }
+    field(IDV, DBF_MENU) {
+        menu(transformIAV)
+        prompt("Input link valid")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(IEV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Input link valid")
+        menu(transformIAV)
+        initial("1")
+    }
+    field(IFV, DBF_MENU) {
+        initial("1")
+        menu(transformIAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Input link valid")
+    }
+    field(IGV, DBF_MENU) {
+        menu(transformIAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Input link valid")
+        initial("1")
+    }
+    field(IHV, DBF_MENU) {
+        initial("1")
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Input link valid")
+        menu(transformIAV)
+    }
+    field(IIV, DBF_MENU) {
+        menu(transformIAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Input link valid")
+        initial("1")
+    }
+    field(IJV, DBF_MENU) {
+        menu(transformIAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Input link valid")
+        initial("1")
+    }
+    field(IKV, DBF_MENU) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Input link valid")
+        menu(transformIAV)
+    }
+    field(ILV, DBF_MENU) {
+        initial("1")
+        prompt("Input link valid")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(transformIAV)
+    }
+    field(IMV, DBF_MENU) {
+        initial("1")
+        menu(transformIAV)
+        prompt("Input link valid")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(INV, DBF_MENU) {
+        initial("1")
+        prompt("Input link valid")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(transformIAV)
+    }
+    field(IOV, DBF_MENU) {
+        menu(transformIAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Input link valid")
+        initial("1")
+    }
+    field(IPV, DBF_MENU) {
+        initial("1")
+        prompt("Input link valid")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(transformIAV)
+    }
+    field(OAV, DBF_MENU) {
+        initial("1")
+        menu(transformIAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+    }
+    field(OBV, DBF_MENU) {
+        menu(transformIAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+        initial("1")
+    }
+    field(OCV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+        menu(transformIAV)
+        initial("1")
+    }
+    field(ODV, DBF_MENU) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+        menu(transformIAV)
+    }
+    field(OEV, DBF_MENU) {
+        initial("1")
+        menu(transformIAV)
+        prompt("Output link valid")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(OFV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Output link valid")
+        menu(transformIAV)
+        initial("1")
+    }
+    field(OGV, DBF_MENU) {
+        menu(transformIAV)
+        prompt("Output link valid")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(OHV, DBF_MENU) {
+        initial("1")
+        menu(transformIAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+    }
+    field(OIV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+        menu(transformIAV)
+        initial("1")
+    }
+    field(OJV, DBF_MENU) {
+        prompt("Output link valid")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(transformIAV)
+        initial("1")
+    }
+    field(OKV, DBF_MENU) {
+        menu(transformIAV)
+        prompt("Output link valid")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(OLV, DBF_MENU) {
+        initial("1")
+        prompt("Output link valid")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(transformIAV)
+    }
+    field(OMV, DBF_MENU) {
+        initial("1")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+        menu(transformIAV)
+    }
+    field(ONV, DBF_MENU) {
+        initial("1")
+        prompt("Output link valid")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(transformIAV)
+    }
+    field(OOV, DBF_MENU) {
+        initial("1")
+        menu(transformIAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Output link valid")
+    }
+    field(OPV, DBF_MENU) {
+        prompt("Output link valid")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(transformIAV)
+        initial("1")
+    }
+}
+recordtype(mbbi) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(EVNT, DBF_STRING) {
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Status")
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotifyRecord")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Device Private")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(UDF, DBF_UCHAR) {
+        initial("1")
+        pp(TRUE)
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_ENUM) {
+        pp(TRUE)
+        prompt("Current Value")
+        promptgroup("40 - Input")
+        asl(ASL0)
+    }
+    field(NOBT, DBF_USHORT) {
+        promptgroup("40 - Input")
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Number of Bits")
+    }
+    field(INP, DBF_INLINK) {
+        promptgroup("40 - Input")
+        interest(1)
+        prompt("Input Specification")
+    }
+    field(ZRVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        interest(1)
+        promptgroup("41 - Input 0-7")
+        special(SPC_MOD)
+        prompt("Zero Value")
+    }
+    field(ONVL, DBF_ULONG) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("41 - Input 0-7")
+        prompt("One Value")
+        base(HEX)
+        pp(TRUE)
+    }
+    field(TWVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        promptgroup("41 - Input 0-7")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Two Value")
+    }
+    field(THVL, DBF_ULONG) {
+        prompt("Three Value")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("41 - Input 0-7")
+        base(HEX)
+        pp(TRUE)
+    }
+    field(FRVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("41 - Input 0-7")
+        prompt("Four Value")
+    }
+    field(FVVL, DBF_ULONG) {
+        pp(TRUE)
+        base(HEX)
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("41 - Input 0-7")
+        prompt("Five Value")
+    }
+    field(SXVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        interest(1)
+        promptgroup("41 - Input 0-7")
+        special(SPC_MOD)
+        prompt("Six Value")
+    }
+    field(SVVL, DBF_ULONG) {
+        prompt("Seven Value")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("41 - Input 0-7")
+        pp(TRUE)
+        base(HEX)
+    }
+    field(EIVL, DBF_ULONG) {
+        prompt("Eight Value")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("42 - Input 8-15")
+        pp(TRUE)
+        base(HEX)
+    }
+    field(NIVL, DBF_ULONG) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("42 - Input 8-15")
+        prompt("Nine Value")
+        pp(TRUE)
+        base(HEX)
+    }
+    field(TEVL, DBF_ULONG) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("42 - Input 8-15")
+        prompt("Ten Value")
+        base(HEX)
+        pp(TRUE)
+    }
+    field(ELVL, DBF_ULONG) {
+        pp(TRUE)
+        base(HEX)
+        prompt("Eleven Value")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("42 - Input 8-15")
+    }
+    field(TVVL, DBF_ULONG) {
+        prompt("Twelve Value")
+        interest(1)
+        promptgroup("42 - Input 8-15")
+        special(SPC_MOD)
+        base(HEX)
+        pp(TRUE)
+    }
+    field(TTVL, DBF_ULONG) {
+        pp(TRUE)
+        base(HEX)
+        prompt("Thirteen Value")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("42 - Input 8-15")
+    }
+    field(FTVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("42 - Input 8-15")
+        prompt("Fourteen Value")
+    }
+    field(FFVL, DBF_ULONG) {
+        base(HEX)
+        pp(TRUE)
+        prompt("Fifteen Value")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("42 - Input 8-15")
+    }
+    field(ZRST, DBF_STRING) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("81 - Display 0-7")
+        prompt("Zero String")
+        pp(TRUE)
+        size(26)
+    }
+    field(ONST, DBF_STRING) {
+        promptgroup("81 - Display 0-7")
+        interest(1)
+        special(SPC_MOD)
+        prompt("One String")
+        pp(TRUE)
+        size(26)
+    }
+    field(TWST, DBF_STRING) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        prompt("Two String")
+        size(26)
+        pp(TRUE)
+    }
+    field(THST, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("81 - Display 0-7")
+        prompt("Three String")
+    }
+    field(FRST, DBF_STRING) {
+        prompt("Four String")
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        special(SPC_MOD)
+        size(26)
+        pp(TRUE)
+    }
+    field(FVST, DBF_STRING) {
+        pp(TRUE)
+        size(26)
+        prompt("Five String")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("81 - Display 0-7")
+    }
+    field(SXST, DBF_STRING) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("81 - Display 0-7")
+        prompt("Six String")
+        size(26)
+        pp(TRUE)
+    }
+    field(SVST, DBF_STRING) {
+        prompt("Seven String")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("81 - Display 0-7")
+        pp(TRUE)
+        size(26)
+    }
+    field(EIST, DBF_STRING) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        prompt("Eight String")
+        pp(TRUE)
+        size(26)
+    }
+    field(NIST, DBF_STRING) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        prompt("Nine String")
+        size(26)
+        pp(TRUE)
+    }
+    field(TEST, DBF_STRING) {
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        special(SPC_MOD)
+        prompt("Ten String")
+        pp(TRUE)
+        size(26)
+    }
+    field(ELST, DBF_STRING) {
+        size(26)
+        pp(TRUE)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        special(SPC_MOD)
+        prompt("Eleven String")
+    }
+    field(TVST, DBF_STRING) {
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        special(SPC_MOD)
+        prompt("Twelve String")
+        pp(TRUE)
+        size(26)
+    }
+    field(TTST, DBF_STRING) {
+        size(26)
+        pp(TRUE)
+        prompt("Thirteen String")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+    }
+    field(FTST, DBF_STRING) {
+        size(26)
+        pp(TRUE)
+        promptgroup("82 - Display 8-15")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Fourteen String")
+    }
+    field(FFST, DBF_STRING) {
+        prompt("Fifteen String")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("82 - Display 8-15")
+        pp(TRUE)
+        size(26)
+    }
+    field(ZRSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("71 - Alarm 0-7")
+        prompt("State Zero Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ONSV, DBF_MENU) {
+        prompt("State One Severity")
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(TWSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("State Two Severity")
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(THSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("State Three Severity")
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(FRSV, DBF_MENU) {
+        pp(TRUE)
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        prompt("State Four Severity")
+        menu(menuAlarmSevr)
+    }
+    field(FVSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        promptgroup("71 - Alarm 0-7")
+        interest(1)
+        prompt("State Five Severity")
+    }
+    field(SXSV, DBF_MENU) {
+        interest(1)
+        promptgroup("71 - Alarm 0-7")
+        prompt("State Six Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(SVSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("71 - Alarm 0-7")
+        prompt("State Seven Severity")
+    }
+    field(EISV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("State Eight Severity")
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        pp(TRUE)
+    }
+    field(NISV, DBF_MENU) {
+        prompt("State Nine Severity")
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(TESV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        prompt("State Ten Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ELSV, DBF_MENU) {
+        pp(TRUE)
+        promptgroup("72 - Alarm 8-15")
+        interest(1)
+        prompt("State Eleven Severity")
+        menu(menuAlarmSevr)
+    }
+    field(TVSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("State Twelve Severity")
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+    }
+    field(TTSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        prompt("State Thirteen Sevr")
+    }
+    field(FTSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        prompt("State Fourteen Sevr")
+        menu(menuAlarmSevr)
+    }
+    field(FFSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("State Fifteen Severity")
+        interest(1)
+        promptgroup("72 - Alarm 8-15")
+        menu(menuAlarmSevr)
+    }
+    field(AFTC, DBF_DOUBLE) {
+        prompt("Alarm Filter Time Constant")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(AFVL, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Alarm Filter Value")
+    }
+    field(UNSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Unknown State Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(COSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("Change of State Svr")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(RVAL, DBF_ULONG) {
+        prompt("Raw Value")
+        pp(TRUE)
+    }
+    field(ORAW, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Raw Value")
+    }
+    field(MASK, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Hardware Mask")
+    }
+    field(MLST, DBF_USHORT) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Value Monitored")
+    }
+    field(LALM, DBF_USHORT) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Value Alarmed")
+    }
+    field(SDEF, DBF_SHORT) {
+        prompt("States Defined")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(SHFT, DBF_USHORT) {
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Shift")
+    }
+    field(SIOL, DBF_INLINK) {
+        prompt("Simulation Input Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SVAL, DBF_ULONG) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        interest(1)
+        promptgroup("90 - Simulate")
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuSimm)
+        interest(1)
+        special(SPC_MOD)
+        prompt("Simulation Mode")
+    }
+    field(SIMS, DBF_MENU) {
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Scan")
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Sim. Mode Async Delay")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        prompt("Sim. Mode Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("CALLBACK            *simpvt")
+    }
+}
+device(mbbi, CONSTANT, devMbbiSoft, "Soft Channel")
+device(mbbi, CONSTANT, devMbbiSoftRaw, "Raw Soft Channel")
+device(mbbi, CONSTANT, devMbbiSoftCallback, "Async Soft Channel")
+device(mbbi, INST_IO, asynMbbiInt32, "asynInt32")
+device(mbbi, INST_IO, asynMbbiUInt32Digital, "asynUInt32Digital")
+device(mbbi, INST_IO, devmbbiStream, "stream")
+device(mbbi, INST_IO, devMbbiTPG261, "asyn TPG261")
+recordtype(swait) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        special(SPC_NOMOD)
+        prompt("Record Name")
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        prompt("Backwards link tracking")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        interest(3)
+        prompt("Force Processing")
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        menu(menuYesNo)
+        prompt("Alarm Ack Transient")
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VERS, DBF_FLOAT) {
+        initial("1")
+        special(SPC_NOMOD)
+        prompt("Code Version")
+    }
+    field(HOPR, DBF_FLOAT) {
+        asl(ASL0)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("High Operating Range")
+    }
+    field(LOPR, DBF_FLOAT) {
+        promptgroup("41 - Bits (1)")
+        interest(1)
+        prompt("Low Operating Range")
+        asl(ASL0)
+    }
+    field(INIT, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Initialized?")
+    }
+    field(CBST, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Pointer to cbStruct")
+        extra("void *         cbst")
+        size(4)
+    }
+    field(INAN, DBF_STRING) {
+        size(40)
+        asl(ASL0)
+        prompt("INPA PV Name")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(INBN, DBF_STRING) {
+        asl(ASL0)
+        prompt("INPB PV Name")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+        size(40)
+    }
+    field(INCN, DBF_STRING) {
+        size(40)
+        prompt("INPC PV Name")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        asl(ASL0)
+    }
+    field(INDN, DBF_STRING) {
+        prompt("INPD PV Name")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        asl(ASL0)
+        size(40)
+    }
+    field(INEN, DBF_STRING) {
+        prompt("INPE PV Name")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        asl(ASL0)
+        size(40)
+    }
+    field(INFN, DBF_STRING) {
+        size(40)
+        asl(ASL0)
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPF PV Name")
+    }
+    field(INGN, DBF_STRING) {
+        size(40)
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("INPG PV Name")
+        asl(ASL0)
+    }
+    field(INHN, DBF_STRING) {
+        prompt("INPH PV Name")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+        asl(ASL0)
+        size(40)
+    }
+    field(ININ, DBF_STRING) {
+        asl(ASL0)
+        prompt("INPI PV Name")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        size(40)
+    }
+    field(INJN, DBF_STRING) {
+        size(40)
+        asl(ASL0)
+        prompt("INPJ PV Name")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(INKN, DBF_STRING) {
+        size(40)
+        asl(ASL0)
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_MOD)
+        prompt("INPK PV Name")
+    }
+    field(INLN, DBF_STRING) {
+        size(40)
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPL PV Name")
+        asl(ASL0)
+    }
+    field(DOLN, DBF_STRING) {
+        asl(ASL0)
+        prompt("DOL  PV Name")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_MOD)
+        size(40)
+    }
+    field(OUTN, DBF_STRING) {
+        size(40)
+        prompt("OUT  PV Name")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("30 - Action")
+        asl(ASL0)
+    }
+    field(INAV, DBF_MENU) {
+        menu(swaitINAV)
+        prompt("INPA PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(INBV, DBF_MENU) {
+        menu(swaitINAV)
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("INPB PV Status")
+    }
+    field(INCV, DBF_MENU) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPC PV Status")
+        menu(swaitINAV)
+    }
+    field(INDV, DBF_MENU) {
+        prompt("INPD PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(swaitINAV)
+    }
+    field(INEV, DBF_MENU) {
+        menu(swaitINAV)
+        prompt("INPE PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(INFV, DBF_MENU) {
+        prompt("INPF PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(swaitINAV)
+    }
+    field(INGV, DBF_MENU) {
+        prompt("INPG PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(swaitINAV)
+    }
+    field(INHV, DBF_MENU) {
+        prompt("INPH PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(swaitINAV)
+    }
+    field(INIV, DBF_MENU) {
+        menu(swaitINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("INPI PV Status")
+    }
+    field(INJV, DBF_MENU) {
+        prompt("INPJ PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(swaitINAV)
+    }
+    field(INKV, DBF_MENU) {
+        menu(swaitINAV)
+        prompt("INPK PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(INLV, DBF_MENU) {
+        prompt("INPL PV Status")
+        special(SPC_NOMOD)
+        interest(1)
+        menu(swaitINAV)
+    }
+    field(DOLV, DBF_MENU) {
+        prompt("DOL  PV Status")
+        interest(1)
+        special(SPC_NOMOD)
+        menu(swaitINAV)
+    }
+    field(OUTV, DBF_MENU) {
+        menu(swaitINAV)
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("OUT  PV Status")
+    }
+    field(A, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input A")
+    }
+    field(B, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input B")
+    }
+    field(C, DBF_DOUBLE) {
+        prompt("Value of Input C")
+        pp(TRUE)
+    }
+    field(D, DBF_DOUBLE) {
+        prompt("Value of Input D")
+        pp(TRUE)
+    }
+    field(E, DBF_DOUBLE) {
+        prompt("Value of Input E")
+        pp(TRUE)
+    }
+    field(F, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input F")
+    }
+    field(G, DBF_DOUBLE) {
+        prompt("Value of Input G")
+        pp(TRUE)
+    }
+    field(H, DBF_DOUBLE) {
+        prompt("Value of Input H")
+        pp(TRUE)
+    }
+    field(I, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input I")
+    }
+    field(J, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input J")
+    }
+    field(K, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input K")
+    }
+    field(L, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Value of Input L")
+    }
+    field(LA, DBF_DOUBLE) {
+        prompt("Last Val of Input A")
+    }
+    field(LB, DBF_DOUBLE) {
+        prompt("Last Val of Input B")
+    }
+    field(LC, DBF_DOUBLE) {
+        prompt("Last Val of Input C")
+    }
+    field(LD, DBF_DOUBLE) {
+        prompt("Last Val of Input D")
+    }
+    field(LE, DBF_DOUBLE) {
+        prompt("Last Val of Input E")
+    }
+    field(LF, DBF_DOUBLE) {
+        prompt("Last Val of Input F")
+    }
+    field(LG, DBF_DOUBLE) {
+        prompt("Last Val of Input G")
+    }
+    field(LH, DBF_DOUBLE) {
+        prompt("Last Val of Input H")
+    }
+    field(LI, DBF_DOUBLE) {
+        prompt("Last Val of Input I")
+    }
+    field(LJ, DBF_DOUBLE) {
+        prompt("Last Val of Input J")
+    }
+    field(LK, DBF_DOUBLE) {
+        prompt("Last Val of Input K")
+    }
+    field(LL, DBF_DOUBLE) {
+        prompt("Last Val of Input L")
+    }
+    field(INAP, DBF_MENU) {
+        initial("Yes")
+        menu(swaitINAP)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPA causes I/O INTR")
+    }
+    field(INBP, DBF_MENU) {
+        menu(swaitINAP)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPB causes I/O INTR")
+        initial("Yes")
+    }
+    field(INCP, DBF_MENU) {
+        prompt("INPC causes I/O INTR")
+        promptgroup("30 - Action")
+        interest(1)
+        menu(swaitINAP)
+        initial("Yes")
+    }
+    field(INDP, DBF_MENU) {
+        initial("Yes")
+        prompt("INPD causes I/O INTR")
+        promptgroup("30 - Action")
+        interest(1)
+        menu(swaitINAP)
+    }
+    field(INEP, DBF_MENU) {
+        initial("Yes")
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPE causes I/O INTR")
+        menu(swaitINAP)
+    }
+    field(INFP, DBF_MENU) {
+        menu(swaitINAP)
+        prompt("INPF causes I/O INTR")
+        promptgroup("30 - Action")
+        interest(1)
+        initial("Yes")
+    }
+    field(INGP, DBF_MENU) {
+        initial("Yes")
+        menu(swaitINAP)
+        prompt("INPG causes I/O INTR")
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(INHP, DBF_MENU) {
+        menu(swaitINAP)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPH causes I/O INTR")
+        initial("Yes")
+    }
+    field(INIP, DBF_MENU) {
+        initial("Yes")
+        menu(swaitINAP)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPI causes I/O INTR")
+    }
+    field(INJP, DBF_MENU) {
+        initial("Yes")
+        prompt("INPJ causes I/O INTR")
+        promptgroup("30 - Action")
+        interest(1)
+        menu(swaitINAP)
+    }
+    field(INKP, DBF_MENU) {
+        prompt("INPK causes I/O INTR")
+        promptgroup("30 - Action")
+        interest(1)
+        menu(swaitINAP)
+        initial("Yes")
+    }
+    field(INLP, DBF_MENU) {
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("INPL causes I/O INTR")
+        menu(swaitINAP)
+        initial("Yes")
+    }
+    field(CALC, DBF_STRING) {
+        initial("0")
+        size(36)
+        promptgroup("30 - Action")
+        special(SPC_CALC)
+        prompt("Calculation")
+        asl(ASL0)
+    }
+    field(RPCL, DBF_NOACCESS) {
+        extra("char    rpcl[184]")
+        size(184)
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Reverse Polish Calc")
+    }
+    field(CLCV, DBF_LONG) {
+        prompt("CALC Valid")
+        interest(1)
+    }
+    field(VAL, DBF_DOUBLE) {
+        prompt("Value Field")
+    }
+    field(OVAL, DBF_DOUBLE) {
+        prompt("Old Value")
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(OOPT, DBF_MENU) {
+        menu(swaitOOPT)
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Output Execute Opt")
+    }
+    field(ODLY, DBF_FLOAT) {
+        prompt("Output Execute Delay")
+        promptgroup("70 - Alarm")
+        interest(1)
+        asl(ASL0)
+    }
+    field(DOPT, DBF_MENU) {
+        menu(swaitDOPT)
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Output Data Option")
+    }
+    field(DOLD, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Desired Output Data")
+        asl(ASL0)
+    }
+    field(OEVT, DBF_USHORT) {
+        prompt("Event To Issue")
+        promptgroup("30 - Action")
+        asl(ASL0)
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Monitor Deadband")
+    }
+    field(ALST, DBF_DOUBLE) {
+        prompt("Last Value Archived")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(MLST, DBF_DOUBLE) {
+        prompt("Last Val Monitored")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(SIOL, DBF_INLINK) {
+        prompt("Sim Input Specifctn")
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(SVAL, DBF_DOUBLE) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Sim Mode Location")
+        promptgroup("30 - Action")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        interest(1)
+        prompt("Simulation Mode")
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Sim mode Alarm Svrty")
+        interest(2)
+        promptgroup("40 - Input")
+    }
+}
+device(swait, CONSTANT, devSWaitIoEvent, "Soft Channel")
+recordtype(ai) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Process at iocInit")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        prompt("Monitor lock")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        menu(menuAlarmStat)
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(NSEV, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        interest(2)
+        promptgroup("70 - Alarm")
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DSET, DBF_NOACCESS) {
+        prompt("DSET address")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("40 - Input")
+        prompt("Current EGU Value")
+        asl(ASL0)
+    }
+    field(INP, DBF_INLINK) {
+        prompt("Input Specification")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        interest(1)
+        prop(YES)
+        promptgroup("80 - Display")
+    }
+    field(LINR, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        special(SPC_LINCONV)
+        promptgroup("60 - Convert")
+        prompt("Linearization")
+        menu(menuConvert)
+    }
+    field(EGUF, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Engineer Units Full")
+        interest(1)
+        special(SPC_LINCONV)
+        promptgroup("60 - Convert")
+    }
+    field(EGUL, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("60 - Convert")
+        special(SPC_LINCONV)
+        prompt("Engineer Units Low")
+        pp(TRUE)
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Engineering Units")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        prompt("High Operating Range")
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prompt("Low Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(AOFF, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("60 - Convert")
+        prompt("Adjustment Offset")
+        pp(TRUE)
+    }
+    field(ASLO, DBF_DOUBLE) {
+        pp(TRUE)
+        initial("1")
+        prompt("Adjustment Slope")
+        interest(1)
+        promptgroup("60 - Convert")
+    }
+    field(SMOO, DBF_DOUBLE) {
+        prompt("Smoothing")
+        interest(1)
+        promptgroup("60 - Convert")
+    }
+    field(HIHI, DBF_DOUBLE) {
+        pp(TRUE)
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("Hihi Alarm Limit")
+    }
+    field(LOLO, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("Lolo Alarm Limit")
+    }
+    field(HIGH, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("High Alarm Limit")
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+    }
+    field(LOW, DBF_DOUBLE) {
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Low Alarm Limit")
+        pp(TRUE)
+    }
+    field(HHSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("Hihi Severity")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(LLSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("Lolo Severity")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(HSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("High Severity")
+    }
+    field(LSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("Low Severity")
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(HYST, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Deadband")
+    }
+    field(AFTC, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Filter Time Constant")
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        prompt("Monitor Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(AFVL, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Alarm Filter Value")
+    }
+    field(ALST, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Archived")
+    }
+    field(MLST, DBF_DOUBLE) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Val Monitored")
+    }
+    field(ESLO, DBF_DOUBLE) {
+        prompt("Raw to EGU Slope")
+        promptgroup("60 - Convert")
+        interest(2)
+        initial("1")
+        pp(TRUE)
+    }
+    field(EOFF, DBF_DOUBLE) {
+        promptgroup("60 - Convert")
+        interest(2)
+        prompt("Raw to EGU Offset")
+        pp(TRUE)
+    }
+    field(ROFF, DBF_ULONG) {
+        prompt("Raw Offset")
+        interest(2)
+        pp(TRUE)
+    }
+    field(PBRK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Ptrto brkTable")
+        extra("void *   pbrk")
+    }
+    field(INIT, DBF_SHORT) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Initialized?")
+    }
+    field(LBRK, DBF_SHORT) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("LastBreak Point")
+    }
+    field(RVAL, DBF_LONG) {
+        pp(TRUE)
+        prompt("Current Raw Value")
+    }
+    field(ORAW, DBF_LONG) {
+        prompt("Previous Raw Value")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(SIOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Input Link")
+    }
+    field(SVAL, DBF_DOUBLE) {
+        prompt("Simulation Value")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuSimm)
+        prompt("Simulation Mode")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Simulation Mode Severity")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        menu(menuSimm)
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        prompt("Sim. Mode Scan")
+        promptgroup("90 - Simulate")
+        interest(1)
+        menu(menuScan)
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        interest(2)
+        promptgroup("90 - Simulate")
+        prompt("Sim. Mode Async Delay")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Sim. Mode Private")
+    }
+}
+device(ai, CONSTANT, devAiSoft, "Soft Channel")
+device(ai, CONSTANT, devAiSoftRaw, "Raw Soft Channel")
+device(ai, CONSTANT, devAiSoftCallback, "Async Soft Channel")
+device(ai, INST_IO, devTimestampAI, "Soft Timestamp")
+device(ai, INST_IO, devAiGeneralTime, "General Time")
+device(ai, INST_IO, asynAiInt32, "asynInt32")
+device(ai, INST_IO, asynAiInt32Average, "asynInt32Average")
+device(ai, INST_IO, asynAiFloat64, "asynFloat64")
+device(ai, INST_IO, asynAiFloat64Average, "asynFloat64Average")
+device(ai, INST_IO, devaiStream, "stream")
+device(ai, INST_IO, devAiStrParm, "asyn ai stringParm")
+device(ai, INST_IO, devAiHeidND261, "asyn ai HeidND261")
+device(ai, INST_IO, devAiMKS, "HPS SensaVac 937")
+device(ai, INST_IO, devAiMPC, "asyn MPC")
+device(ai, GPIB_IO, devAiGP307Gpib, "Vg307 GPIB Instrument")
+device(ai, BBGPIB_IO, devAiAX301, "PZT Bug")
+device(ai, INST_IO, devAiTelevac, "asyn Televac")
+device(ai, INST_IO, devAiTPG261, "asyn TPG261")
+recordtype(dfanout) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+    }
+    field(SCAN, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+    }
+    field(DISS, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Disable Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(ASP, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        prompt("Scheduling Priority")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        interest(1)
+        promptgroup("70 - Alarm")
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_DOUBLE) {
+        pp(TRUE)
+        asl(ASL0)
+        promptgroup("40 - Input")
+        prompt("Desired Output")
+    }
+    field(SELM, DBF_MENU) {
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Select Mechanism")
+        menu(dfanoutSELM)
+    }
+    field(SELN, DBF_USHORT) {
+        prompt("Link Selection")
+        interest(1)
+        initial("1")
+    }
+    field(SELL, DBF_INLINK) {
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Link Selection Loc")
+    }
+    field(OUTA, DBF_OUTLINK) {
+        prompt("Output Spec A")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(OUTB, DBF_OUTLINK) {
+        prompt("Output Spec B")
+        interest(1)
+        promptgroup("50 - Output")
+    }
+    field(OUTC, DBF_OUTLINK) {
+        prompt("Output Spec C")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(OUTD, DBF_OUTLINK) {
+        prompt("Output Spec D")
+        interest(1)
+        promptgroup("50 - Output")
+    }
+    field(OUTE, DBF_OUTLINK) {
+        prompt("Output Spec E")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(OUTF, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("50 - Output")
+        prompt("Output Spec F")
+    }
+    field(OUTG, DBF_OUTLINK) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Spec G")
+    }
+    field(OUTH, DBF_OUTLINK) {
+        prompt("Output Spec H")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(DOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Desired Output Loc")
+    }
+    field(OMSL, DBF_MENU) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Mode Select")
+        menu(menuOmsl)
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Engineering Units")
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        size(16)
+    }
+    field(PREC, DBF_SHORT) {
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        prompt("Display Precision")
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Low Operating Range")
+    }
+    field(HIHI, DBF_DOUBLE) {
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("Hihi Alarm Limit")
+        pp(TRUE)
+    }
+    field(LOLO, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Lolo Alarm Limit")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(HIGH, DBF_DOUBLE) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("High Alarm Limit")
+    }
+    field(LOW, DBF_DOUBLE) {
+        pp(TRUE)
+        prompt("Low Alarm Limit")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+    }
+    field(HHSV, DBF_MENU) {
+        pp(TRUE)
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("Hihi Severity")
+        menu(menuAlarmSevr)
+    }
+    field(LLSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("Lolo Severity")
+        prop(YES)
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(HSV, DBF_MENU) {
+        pp(TRUE)
+        prompt("High Severity")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        menu(menuAlarmSevr)
+    }
+    field(LSV, DBF_MENU) {
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("Low Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(HYST, DBF_DOUBLE) {
+        prompt("Alarm Deadband")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(ADEL, DBF_DOUBLE) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_DOUBLE) {
+        prompt("Monitor Deadband")
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(LALM, DBF_DOUBLE) {
+        prompt("Last Value Alarmed")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(ALST, DBF_DOUBLE) {
+        prompt("Last Value Archived")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(MLST, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Last Val Monitored")
+    }
+}
+recordtype(compress) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        special(SPC_AS)
+        promptgroup("10 - Common")
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Process at iocInit")
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(EVNT, DBF_STRING) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        promptgroup("10 - Common")
+        interest(1)
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor lock")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Force Processing")
+        interest(3)
+    }
+    field(STAT, DBF_MENU) {
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        prompt("Record active")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(PUTF, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("dbPutField process")
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPN, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct scan_element *spvt")
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Lock Set")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(UDFS, DBF_MENU) {
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+        extra("epicsTimeStamp      time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_NOACCESS) {
+        extra("void *		val")
+        pp(TRUE)
+        special(SPC_DBADDR)
+        prompt("Value")
+        asl(ASL0)
+    }
+    field(INP, DBF_INLINK) {
+        prompt("Input Specification")
+        promptgroup("40 - Input")
+        interest(1)
+    }
+    field(RES, DBF_SHORT) {
+        prompt("Reset")
+        interest(3)
+        special(SPC_RESET)
+        asl(ASL0)
+    }
+    field(ALG, DBF_MENU) {
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_RESET)
+        prompt("Compression Algorithm")
+        menu(compressALG)
+    }
+    field(BALG, DBF_MENU) {
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_RESET)
+        prompt("Buffering Algorithm")
+        menu(bufferingALG)
+    }
+    field(NSAM, DBF_ULONG) {
+        prompt("Number of Values")
+        promptgroup("30 - Action")
+        interest(1)
+        special(SPC_NOMOD)
+        initial("1")
+    }
+    field(N, DBF_ULONG) {
+        initial("1")
+        interest(1)
+        promptgroup("30 - Action")
+        special(SPC_RESET)
+        prompt("N to 1 Compression")
+    }
+    field(IHIL, DBF_DOUBLE) {
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Init High Interest Lim")
+    }
+    field(ILIL, DBF_DOUBLE) {
+        prompt("Init Low Interest Lim")
+        promptgroup("30 - Action")
+        interest(1)
+    }
+    field(HOPR, DBF_DOUBLE) {
+        prompt("High Operating Range")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(LOPR, DBF_DOUBLE) {
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Low Operating Range")
+    }
+    field(PREC, DBF_SHORT) {
+        prompt("Display Precision")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(EGU, DBF_STRING) {
+        size(16)
+        promptgroup("80 - Display")
+        prop(YES)
+        interest(1)
+        prompt("Engineering Units")
+    }
+    field(OFF, DBF_ULONG) {
+        special(SPC_NOMOD)
+        prompt("Offset")
+    }
+    field(NUSE, DBF_ULONG) {
+        prompt("Number Used")
+        special(SPC_NOMOD)
+    }
+    field(OUSE, DBF_ULONG) {
+        special(SPC_NOMOD)
+        prompt("Old Number Used")
+    }
+    field(BPTR, DBF_NOACCESS) {
+        prompt("Buffer Pointer")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("double		*bptr")
+    }
+    field(SPTR, DBF_NOACCESS) {
+        prompt("Summing Buffer Ptr")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("double		*sptr")
+    }
+    field(WPTR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Working Buffer Ptr")
+        extra("double		*wptr")
+    }
+    field(INPN, DBF_LONG) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Number of elements in Working Buffer")
+    }
+    field(CVB, DBF_DOUBLE) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Compress Value Buffer")
+    }
+    field(INX, DBF_ULONG) {
+        prompt("Compressed Array Inx")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+}
+recordtype(fanout) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    field(NAME, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Record Name")
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+        menu(menuScan)
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        prompt("Disable Value")
+        promptgroup("20 - Scan")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        extra("ELLLIST             mlis")
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        prompt("Force Processing")
+        interest(3)
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+        initial("UDF")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        prompt("Disable Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        menu(menuAlarmSevr)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        prompt("Access Security Pvt")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PPN, DBF_NOACCESS) {
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        prompt("pprocessNotifyRecord")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        extra("void                *dpvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Device Private")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Lock Set")
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        prompt("Scheduling Priority")
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        menu(menuPriority)
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        extra("char                bkpt")
+        prompt("Break Point")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(UDF, DBF_UCHAR) {
+        initial("1")
+        pp(TRUE)
+        prompt("Undefined")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        interest(1)
+        promptgroup("70 - Alarm")
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_LONG) {
+        pp(TRUE)
+        asl(ASL0)
+        prompt("Used to trigger")
+    }
+    field(SELM, DBF_MENU) {
+        prompt("Select Mechanism")
+        promptgroup("30 - Action")
+        interest(1)
+        menu(fanoutSELM)
+    }
+    field(SELN, DBF_USHORT) {
+        interest(1)
+        prompt("Link Selection")
+        initial("1")
+    }
+    field(SELL, DBF_INLINK) {
+        interest(1)
+        promptgroup("30 - Action")
+        prompt("Link Selection Loc")
+    }
+    field(OFFS, DBF_SHORT) {
+        initial("0")
+        prompt("Offset for Specified")
+        interest(1)
+        promptgroup("30 - Action")
+    }
+    field(SHFT, DBF_SHORT) {
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Shift for Mask mode")
+        initial("-1")
+    }
+    field(LNK0, DBF_FWDLINK) {
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        prompt("Forward Link 0")
+    }
+    field(LNK1, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        prompt("Forward Link 1")
+    }
+    field(LNK2, DBF_FWDLINK) {
+        prompt("Forward Link 2")
+        interest(1)
+        promptgroup("51 - Output 0-7")
+    }
+    field(LNK3, DBF_FWDLINK) {
+        prompt("Forward Link 3")
+        interest(1)
+        promptgroup("51 - Output 0-7")
+    }
+    field(LNK4, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        prompt("Forward Link 4")
+    }
+    field(LNK5, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        prompt("Forward Link 5")
+    }
+    field(LNK6, DBF_FWDLINK) {
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        prompt("Forward Link 6")
+    }
+    field(LNK7, DBF_FWDLINK) {
+        prompt("Forward Link 7")
+        promptgroup("51 - Output 0-7")
+        interest(1)
+    }
+    field(LNK8, DBF_FWDLINK) {
+        promptgroup("52 - Output 8-F")
+        interest(1)
+        prompt("Forward Link 8")
+    }
+    field(LNK9, DBF_FWDLINK) {
+        prompt("Forward Link 9")
+        promptgroup("52 - Output 8-F")
+        interest(1)
+    }
+    field(LNKA, DBF_FWDLINK) {
+        promptgroup("52 - Output 8-F")
+        interest(1)
+        prompt("Forward Link 10")
+    }
+    field(LNKB, DBF_FWDLINK) {
+        promptgroup("52 - Output 8-F")
+        interest(1)
+        prompt("Forward Link 11")
+    }
+    field(LNKC, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("52 - Output 8-F")
+        prompt("Forward Link 12")
+    }
+    field(LNKD, DBF_FWDLINK) {
+        interest(1)
+        promptgroup("52 - Output 8-F")
+        prompt("Forward Link 13")
+    }
+    field(LNKE, DBF_FWDLINK) {
+        promptgroup("52 - Output 8-F")
+        interest(1)
+        prompt("Forward Link 14")
+    }
+    field(LNKF, DBF_FWDLINK) {
+        promptgroup("52 - Output 8-F")
+        interest(1)
+        prompt("Forward Link 15")
+    }
+}
+recordtype(longout) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        special(SPC_NOMOD)
+        prompt("Record Name")
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+        size(41)
+    }
+    field(ASG, DBF_STRING) {
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        prompt("Access Security Group")
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(PHAS, DBF_SHORT) {
+        prompt("Scan Phase")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(EVNT, DBF_STRING) {
+        prompt("Event Name")
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Link")
+    }
+    field(DTYP, DBF_DEVICE) {
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Device Type")
+    }
+    field(DISV, DBF_SHORT) {
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+        initial("1")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Monitor lock")
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Monitor List")
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Force Processing")
+        interest(3)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        prompt("New Alarm Status")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Severity")
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        special(SPC_NOMOD)
+        interest(2)
+    }
+    field(PACT, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        prompt("Reprocess ")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(ASP, DBF_NOACCESS) {
+        prompt("Access Security Pvt")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(RSET, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Address of RSET")
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("DSET address")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of dbRecordType")
+    }
+    field(LSET, DBF_NOACCESS) {
+        prompt("Lock Set")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct lockRecord   *lset")
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        initial("1")
+        pp(TRUE)
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(UDFS, DBF_MENU) {
+        initial("INVALID")
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_LONG) {
+        pp(TRUE)
+        prompt("Desired Output")
+        promptgroup("50 - Output")
+        asl(ASL0)
+    }
+    field(OUT, DBF_OUTLINK) {
+        prompt("Output Specification")
+        interest(1)
+        promptgroup("50 - Output")
+    }
+    field(DOL, DBF_INLINK) {
+        prompt("Desired Output Loc")
+        interest(1)
+        promptgroup("40 - Input")
+    }
+    field(OMSL, DBF_MENU) {
+        prompt("Output Mode Select")
+        interest(1)
+        promptgroup("50 - Output")
+        menu(menuOmsl)
+    }
+    field(EGU, DBF_STRING) {
+        prompt("Engineering Units")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+        size(16)
+    }
+    field(DRVH, DBF_LONG) {
+        pp(TRUE)
+        prop(YES)
+        promptgroup("30 - Action")
+        interest(1)
+        prompt("Drive High Limit")
+    }
+    field(DRVL, DBF_LONG) {
+        pp(TRUE)
+        promptgroup("30 - Action")
+        prop(YES)
+        interest(1)
+        prompt("Drive Low Limit")
+    }
+    field(HOPR, DBF_LONG) {
+        prompt("High Operating Range")
+        prop(YES)
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(LOPR, DBF_LONG) {
+        prompt("Low Operating Range")
+        prop(YES)
+        promptgroup("80 - Display")
+        interest(1)
+    }
+    field(HIHI, DBF_LONG) {
+        interest(1)
+        prop(YES)
+        promptgroup("70 - Alarm")
+        prompt("Hihi Alarm Limit")
+        pp(TRUE)
+    }
+    field(LOLO, DBF_LONG) {
+        pp(TRUE)
+        prompt("Lolo Alarm Limit")
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+    }
+    field(HIGH, DBF_LONG) {
+        prompt("High Alarm Limit")
+        prop(YES)
+        interest(1)
+        promptgroup("70 - Alarm")
+        pp(TRUE)
+    }
+    field(LOW, DBF_LONG) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        prop(YES)
+        interest(1)
+        prompt("Low Alarm Limit")
+    }
+    field(HHSV, DBF_MENU) {
+        pp(TRUE)
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Hihi Severity")
+        menu(menuAlarmSevr)
+    }
+    field(LLSV, DBF_MENU) {
+        pp(TRUE)
+        menu(menuAlarmSevr)
+        prompt("Lolo Severity")
+        interest(1)
+        promptgroup("70 - Alarm")
+    }
+    field(HSV, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("High Severity")
+        promptgroup("70 - Alarm")
+        interest(1)
+        pp(TRUE)
+    }
+    field(LSV, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Low Severity")
+        menu(menuAlarmSevr)
+        pp(TRUE)
+    }
+    field(HYST, DBF_LONG) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Alarm Deadband")
+    }
+    field(ADEL, DBF_LONG) {
+        prompt("Archive Deadband")
+        interest(1)
+        promptgroup("80 - Display")
+    }
+    field(MDEL, DBF_LONG) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Monitor Deadband")
+    }
+    field(LALM, DBF_LONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Alarmed")
+    }
+    field(ALST, DBF_LONG) {
+        prompt("Last Value Archived")
+        special(SPC_NOMOD)
+        interest(3)
+    }
+    field(MLST, DBF_LONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Val Monitored")
+    }
+    field(SIOL, DBF_OUTLINK) {
+        interest(1)
+        promptgroup("90 - Simulate")
+        prompt("Simulation Output Link")
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        prompt("Simulation Mode")
+        special(SPC_MOD)
+        interest(1)
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+    }
+    field(OLDSIMM, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        prompt("Sim. Mode Scan")
+        promptgroup("90 - Simulate")
+        interest(1)
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        prompt("Sim. Mode Async Delay")
+        promptgroup("90 - Simulate")
+        interest(2)
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        prompt("Sim. Mode Private")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID output action")
+        promptgroup("50 - Output")
+        interest(2)
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_LONG) {
+        interest(2)
+        promptgroup("50 - Output")
+        prompt("INVALID output value")
+    }
+}
+device(longout, CONSTANT, devLoSoft, "Soft Channel")
+device(longout, CONSTANT, devLoSoftCallback, "Async Soft Channel")
+device(longout, INST_IO, asynLoInt32, "asynInt32")
+device(longout, INST_IO, asynLoUInt32Digital, "asynUInt32Digital")
+device(longout, INST_IO, devlongoutStream, "stream")
+device(longout, INST_IO, devLoStrParm, "asyn lo stringParm")
+device(longout, BBGPIB_IO, devLoAX301, "PZT Bug")
+recordtype(lso) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "devSup.h"
+    %
+    %/* Declare Device Support Entry Table */
+    %typedef struct lsodset {
+    %    long number;
+    %    DEVSUPFUN report;
+    %    DEVSUPFUN init;
+    %    DEVSUPFUN init_record;
+    %    DEVSUPFUN get_ioint_info;
+    %    DEVSUPFUN write_string;
+    %} lsodset;
+    %
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        prompt("Record Name")
+        special(SPC_NOMOD)
+        size(61)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        prompt("Descriptor")
+        promptgroup("10 - Common")
+    }
+    field(ASG, DBF_STRING) {
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+        size(29)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+        prompt("Scan Mechanism")
+    }
+    field(PINI, DBF_MENU) {
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+        menu(menuPini)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        size(40)
+        prompt("Event Name")
+        promptgroup("20 - Scan")
+        interest(1)
+        special(SPC_SCAN)
+    }
+    field(TSE, DBF_SHORT) {
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Time Stamp Event")
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        promptgroup("10 - Common")
+        interest(1)
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Scanning Disable")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        extra("epicsMutexId        mlok")
+        prompt("Monitor lock")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        extra("ELLLIST             bklnk")
+        prompt("Backwards link tracking")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        menu(menuAlarmStat)
+        prompt("Alarm Status")
+        special(SPC_NOMOD)
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        special(SPC_NOMOD)
+        prompt("Alarm Severity")
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("New Alarm Severity")
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        prompt("Alarm Ack Severity")
+        interest(2)
+        special(SPC_NOMOD)
+        menu(menuAlarmSevr)
+    }
+    field(ACKT, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Transient")
+        menu(menuYesNo)
+        initial("YES")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LCNT, DBF_UCHAR) {
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Lock Count")
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        extra("struct asgMember    *asp")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Access Security Pvt")
+    }
+    field(PPN, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("pprocessNotify")
+        extra("struct processNotify *ppn")
+    }
+    field(PPNR, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("pprocessNotifyRecord")
+        extra("struct processNotifyRecord *ppnr")
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        prompt("Scan Private")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(RSET, DBF_NOACCESS) {
+        prompt("Address of RSET")
+        interest(4)
+        special(SPC_NOMOD)
+        extra("struct typed_rset   *rset")
+    }
+    field(DSET, DBF_NOACCESS) {
+        prompt("DSET address")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct dset         *dset")
+    }
+    field(DPVT, DBF_NOACCESS) {
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Device Private")
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        extra("struct dbRecordType *rdes")
+        prompt("Address of dbRecordType")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        pp(TRUE)
+        initial("1")
+        interest(1)
+        promptgroup("10 - Common")
+        prompt("Undefined")
+    }
+    field(UDFS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Undefined Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("Time")
+    }
+    field(FLNK, DBF_FWDLINK) {
+        prompt("Forward Process Link")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(VAL, DBF_NOACCESS) {
+        asl(ASL0)
+        prompt("Current Value")
+        special(SPC_DBADDR)
+        pp(TRUE)
+        extra("char *val")
+    }
+    field(OVAL, DBF_NOACCESS) {
+        special(SPC_DBADDR)
+        interest(3)
+        prompt("Previous Value")
+        extra("char *oval")
+    }
+    field(SIZV, DBF_USHORT) {
+        prompt("Size of buffers")
+        interest(1)
+        promptgroup("50 - Output")
+        special(SPC_NOMOD)
+        initial("41")
+    }
+    field(LEN, DBF_ULONG) {
+        prompt("Length of VAL")
+        special(SPC_NOMOD)
+    }
+    field(OLEN, DBF_ULONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Length of OVAL")
+    }
+    field(DOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Desired Output Link")
+    }
+    field(IVOA, DBF_MENU) {
+        menu(menuIvoa)
+        prompt("INVALID Output Action")
+        interest(2)
+        promptgroup("50 - Output")
+    }
+    field(IVOV, DBF_STRING) {
+        size(40)
+        prompt("INVALID Output Value")
+        interest(2)
+        promptgroup("50 - Output")
+    }
+    field(OMSL, DBF_MENU) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Mode Select")
+        menu(menuOmsl)
+    }
+    field(OUT, DBF_OUTLINK) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Specification")
+    }
+    field(MPST, DBF_MENU) {
+        menu(menuPost)
+        promptgroup("80 - Display")
+        interest(1)
+        prompt("Post Value Monitors")
+    }
+    field(APST, DBF_MENU) {
+        interest(1)
+        promptgroup("80 - Display")
+        prompt("Post Archive Monitors")
+        menu(menuPost)
+    }
+    field(SIML, DBF_INLINK) {
+        promptgroup("90 - Simulate")
+        interest(1)
+        prompt("Simulation Mode link")
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        special(SPC_MOD)
+        interest(1)
+        prompt("Simulation Mode")
+    }
+    field(SIMS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Simulation Mode Severity")
+    }
+    field(SIOL, DBF_OUTLINK) {
+        prompt("Simulation Output Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        prompt("Prev. Simulation Mode")
+        interest(4)
+        special(SPC_NOMOD)
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        prompt("Sim. Mode Scan")
+        promptgroup("90 - Simulate")
+        interest(1)
+        menu(menuScan)
+        initial("65535")
+    }
+    field(SDLY, DBF_DOUBLE) {
+        initial("-1.0")
+        prompt("Sim. Mode Async Delay")
+        promptgroup("90 - Simulate")
+        interest(2)
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Sim. Mode Private")
+        extra("CALLBACK            *simpvt")
+    }
+}
+device(lso, CONSTANT, devLsoSoft, "Soft Channel")
+device(lso, CONSTANT, devLsoSoftCallback, "Async Soft Channel")
+device(lso, INST_IO, devLsoStdio, "stdio")
+recordtype(mbboDirect) {
+    %#include "epicsTypes.h"
+    %#include "link.h"
+    %#include "epicsMutex.h"
+    %#include "ellLib.h"
+    %#include "epicsTime.h"
+    %#include "callback.h"
+    field(NAME, DBF_STRING) {
+        size(61)
+        prompt("Record Name")
+        special(SPC_NOMOD)
+    }
+    field(DESC, DBF_STRING) {
+        size(41)
+        promptgroup("10 - Common")
+        prompt("Descriptor")
+    }
+    field(ASG, DBF_STRING) {
+        size(29)
+        prompt("Access Security Group")
+        promptgroup("10 - Common")
+        special(SPC_AS)
+    }
+    field(SCAN, DBF_MENU) {
+        menu(menuScan)
+        prompt("Scan Mechanism")
+        interest(1)
+        promptgroup("20 - Scan")
+        special(SPC_SCAN)
+    }
+    field(PINI, DBF_MENU) {
+        menu(menuPini)
+        prompt("Process at iocInit")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(PHAS, DBF_SHORT) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Scan Phase")
+    }
+    field(EVNT, DBF_STRING) {
+        interest(1)
+        special(SPC_SCAN)
+        promptgroup("20 - Scan")
+        prompt("Event Name")
+        size(40)
+    }
+    field(TSE, DBF_SHORT) {
+        prompt("Time Stamp Event")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(TSEL, DBF_INLINK) {
+        prompt("Time Stamp Link")
+        promptgroup("20 - Scan")
+        interest(1)
+    }
+    field(DTYP, DBF_DEVICE) {
+        prompt("Device Type")
+        interest(1)
+        promptgroup("10 - Common")
+    }
+    field(DISV, DBF_SHORT) {
+        initial("1")
+        promptgroup("20 - Scan")
+        prompt("Disable Value")
+    }
+    field(DISA, DBF_SHORT) {
+        prompt("Disable")
+    }
+    field(SDIS, DBF_INLINK) {
+        prompt("Scanning Disable")
+        interest(1)
+        promptgroup("20 - Scan")
+    }
+    field(MLOK, DBF_NOACCESS) {
+        prompt("Monitor lock")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("epicsMutexId        mlok")
+    }
+    field(MLIS, DBF_NOACCESS) {
+        prompt("Monitor List")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("ELLLIST             mlis")
+    }
+    field(BKLNK, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Backwards link tracking")
+        extra("ELLLIST             bklnk")
+    }
+    field(DISP, DBF_UCHAR) {
+        prompt("Disable putField")
+    }
+    field(PROC, DBF_UCHAR) {
+        interest(3)
+        prompt("Force Processing")
+        pp(TRUE)
+    }
+    field(STAT, DBF_MENU) {
+        initial("UDF")
+        special(SPC_NOMOD)
+        prompt("Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(SEVR, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Alarm Severity")
+        special(SPC_NOMOD)
+    }
+    field(NSTA, DBF_MENU) {
+        special(SPC_NOMOD)
+        interest(2)
+        prompt("New Alarm Status")
+        menu(menuAlarmStat)
+    }
+    field(NSEV, DBF_MENU) {
+        prompt("New Alarm Severity")
+        special(SPC_NOMOD)
+        interest(2)
+        menu(menuAlarmSevr)
+    }
+    field(ACKS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        interest(2)
+        special(SPC_NOMOD)
+        prompt("Alarm Ack Severity")
+    }
+    field(ACKT, DBF_MENU) {
+        initial("YES")
+        menu(menuYesNo)
+        interest(2)
+        special(SPC_NOMOD)
+        promptgroup("70 - Alarm")
+        prompt("Alarm Ack Transient")
+    }
+    field(DISS, DBF_MENU) {
+        menu(menuAlarmSevr)
+        prompt("Disable Alarm Sevrty")
+        promptgroup("70 - Alarm")
+        interest(1)
+    }
+    field(LCNT, DBF_UCHAR) {
+        prompt("Lock Count")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(PACT, DBF_UCHAR) {
+        special(SPC_NOMOD)
+        interest(1)
+        prompt("Record active")
+    }
+    field(PUTF, DBF_UCHAR) {
+        prompt("dbPutField process")
+        special(SPC_NOMOD)
+        interest(1)
+    }
+    field(RPRO, DBF_UCHAR) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Reprocess ")
+    }
+    field(ASP, DBF_NOACCESS) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Access Security Pvt")
+        extra("struct asgMember    *asp")
+    }
+    field(PPN, DBF_NOACCESS) {
+        extra("struct processNotify *ppn")
+        prompt("pprocessNotify")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(PPNR, DBF_NOACCESS) {
+        extra("struct processNotifyRecord *ppnr")
+        prompt("pprocessNotifyRecord")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(SPVT, DBF_NOACCESS) {
+        extra("struct scan_element *spvt")
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Scan Private")
+    }
+    field(RSET, DBF_NOACCESS) {
+        extra("struct typed_rset   *rset")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Address of RSET")
+    }
+    field(DSET, DBF_NOACCESS) {
+        extra("struct dset         *dset")
+        prompt("DSET address")
+        special(SPC_NOMOD)
+        interest(4)
+    }
+    field(DPVT, DBF_NOACCESS) {
+        prompt("Device Private")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("void                *dpvt")
+    }
+    field(RDES, DBF_NOACCESS) {
+        prompt("Address of dbRecordType")
+        special(SPC_NOMOD)
+        interest(4)
+        extra("struct dbRecordType *rdes")
+    }
+    field(LSET, DBF_NOACCESS) {
+        extra("struct lockRecord   *lset")
+        prompt("Lock Set")
+        interest(4)
+        special(SPC_NOMOD)
+    }
+    field(PRIO, DBF_MENU) {
+        menu(menuPriority)
+        special(SPC_SCAN)
+        interest(1)
+        promptgroup("20 - Scan")
+        prompt("Scheduling Priority")
+    }
+    field(TPRO, DBF_UCHAR) {
+        prompt("Trace Processing")
+    }
+    field(BKPT, DBF_NOACCESS) {
+        interest(1)
+        special(SPC_NOMOD)
+        prompt("Break Point")
+        extra("char                bkpt")
+    }
+    field(UDF, DBF_UCHAR) {
+        prompt("Undefined")
+        promptgroup("10 - Common")
+        interest(1)
+        initial("1")
+        pp(TRUE)
+    }
+    field(UDFS, DBF_MENU) {
+        promptgroup("70 - Alarm")
+        interest(1)
+        prompt("Undefined Alarm Sevrty")
+        menu(menuAlarmSevr)
+        initial("INVALID")
+    }
+    field(TIME, DBF_NOACCESS) {
+        extra("epicsTimeStamp      time")
+        prompt("Time")
+        interest(2)
+        special(SPC_NOMOD)
+    }
+    field(FLNK, DBF_FWDLINK) {
+        promptgroup("20 - Scan")
+        interest(1)
+        prompt("Forward Process Link")
+    }
+    field(VAL, DBF_LONG) {
+        asl(ASL0)
+        promptgroup("50 - Output")
+        prompt("Word")
+        pp(TRUE)
+    }
+    field(OMSL, DBF_MENU) {
+        pp(TRUE)
+        prompt("Output Mode Select")
+        special(SPC_RESET)
+        interest(1)
+        promptgroup("50 - Output")
+        menu(menuOmsl)
+    }
+    field(NOBT, DBF_SHORT) {
+        interest(1)
+        promptgroup("50 - Output")
+        special(SPC_NOMOD)
+        prompt("Number of Bits")
+    }
+    field(DOL, DBF_INLINK) {
+        interest(1)
+        promptgroup("40 - Input")
+        prompt("Desired Output Loc")
+    }
+    field(OUT, DBF_OUTLINK) {
+        promptgroup("50 - Output")
+        interest(1)
+        prompt("Output Specification")
+    }
+    field(RVAL, DBF_ULONG) {
+        pp(TRUE)
+        special(SPC_NOMOD)
+        prompt("Raw Value")
+    }
+    field(ORAW, DBF_ULONG) {
+        prompt("Prev Raw Value")
+        interest(3)
+        special(SPC_NOMOD)
+    }
+    field(RBV, DBF_ULONG) {
+        special(SPC_NOMOD)
+        prompt("Readback Value")
+    }
+    field(ORBV, DBF_ULONG) {
+        interest(3)
+        special(SPC_NOMOD)
+        prompt("Prev Readback Value")
+    }
+    field(MASK, DBF_ULONG) {
+        prompt("Hardware Mask")
+        interest(1)
+        special(SPC_NOMOD)
+    }
+    field(MLST, DBF_LONG) {
+        special(SPC_NOMOD)
+        interest(3)
+        prompt("Last Value Monitored")
+    }
+    field(SHFT, DBF_USHORT) {
+        prompt("Shift")
+        promptgroup("50 - Output")
+        interest(1)
+    }
+    field(SIOL, DBF_OUTLINK) {
+        prompt("Simulation Output Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIML, DBF_INLINK) {
+        prompt("Simulation Mode Link")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SIMM, DBF_MENU) {
+        menu(menuYesNo)
+        interest(1)
+        special(SPC_MOD)
+        prompt("Simulation Mode")
+    }
+    field(SIMS, DBF_MENU) {
+        prompt("Simulation Mode Severity")
+        interest(2)
+        promptgroup("90 - Simulate")
+        menu(menuAlarmSevr)
+    }
+    field(OLDSIMM, DBF_MENU) {
+        interest(4)
+        special(SPC_NOMOD)
+        prompt("Prev. Simulation Mode")
+        menu(menuSimm)
+    }
+    field(SSCN, DBF_MENU) {
+        initial("65535")
+        menu(menuScan)
+        prompt("Sim. Mode Scan")
+        promptgroup("90 - Simulate")
+        interest(1)
+    }
+    field(SDLY, DBF_DOUBLE) {
+        promptgroup("90 - Simulate")
+        interest(2)
+        prompt("Sim. Mode Async Delay")
+        initial("-1.0")
+    }
+    field(SIMPVT, DBF_NOACCESS) {
+        extra("CALLBACK            *simpvt")
+        special(SPC_NOMOD)
+        interest(4)
+        prompt("Sim. Mode Private")
+    }
+    field(IVOA, DBF_MENU) {
+        prompt("INVALID outpt action")
+        interest(2)
+        promptgroup("50 - Output")
+        menu(menuIvoa)
+    }
+    field(IVOV, DBF_LONG) {
+        prompt("INVALID output value")
+        promptgroup("50 - Output")
+        interest(2)
+    }
+    field(B0, DBF_UCHAR) {
+        pp(TRUE)
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Bit 0")
+    }
+    field(B1, DBF_UCHAR) {
+        prompt("Bit 1")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        pp(TRUE)
+    }
+    field(B2, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 2")
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(B3, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 3")
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        special(SPC_MOD)
+    }
+    field(B4, DBF_UCHAR) {
+        prompt("Bit 4")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("51 - Output 0-7")
+        pp(TRUE)
+    }
+    field(B5, DBF_UCHAR) {
+        prompt("Bit 5")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        pp(TRUE)
+    }
+    field(B6, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("51 - Output 0-7")
+        special(SPC_MOD)
+        prompt("Bit 6")
+    }
+    field(B7, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 7")
+        promptgroup("51 - Output 0-7")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(B8, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 8")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("52 - Output 8-15")
+    }
+    field(B9, DBF_UCHAR) {
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+        prompt("Bit 9")
+        pp(TRUE)
+    }
+    field(BA, DBF_UCHAR) {
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        prompt("Bit 10")
+        pp(TRUE)
+    }
+    field(BB, DBF_UCHAR) {
+        prompt("Bit 11")
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+    field(BC, DBF_UCHAR) {
+        pp(TRUE)
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        prompt("Bit 12")
+    }
+    field(BD, DBF_UCHAR) {
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+        prompt("Bit 13")
+        pp(TRUE)
+    }
+    field(BE, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 14")
+        promptgroup("52 - Output 8-15")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(BF, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 15")
+        interest(1)
+        promptgroup("52 - Output 8-15")
+        special(SPC_MOD)
+    }
+    field(B10, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 16")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("53 - Output 16-23")
+    }
+    field(B11, DBF_UCHAR) {
+        prompt("Bit 17")
+        interest(1)
+        promptgroup("53 - Output 16-23")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+    field(B12, DBF_UCHAR) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("53 - Output 16-23")
+        prompt("Bit 18")
+        pp(TRUE)
+    }
+    field(B13, DBF_UCHAR) {
+        interest(1)
+        promptgroup("53 - Output 16-23")
+        special(SPC_MOD)
+        prompt("Bit 19")
+        pp(TRUE)
+    }
+    field(B14, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 20")
+        interest(1)
+        promptgroup("53 - Output 16-23")
+        special(SPC_MOD)
+    }
+    field(B15, DBF_UCHAR) {
+        promptgroup("53 - Output 16-23")
+        interest(1)
+        special(SPC_MOD)
+        prompt("Bit 21")
+        pp(TRUE)
+    }
+    field(B16, DBF_UCHAR) {
+        prompt("Bit 22")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("53 - Output 16-23")
+        pp(TRUE)
+    }
+    field(B17, DBF_UCHAR) {
+        prompt("Bit 23")
+        interest(1)
+        promptgroup("53 - Output 16-23")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+    field(B18, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 24")
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("54 - Output 24-31")
+    }
+    field(B19, DBF_UCHAR) {
+        interest(1)
+        promptgroup("54 - Output 24-31")
+        special(SPC_MOD)
+        prompt("Bit 25")
+        pp(TRUE)
+    }
+    field(B1A, DBF_UCHAR) {
+        interest(1)
+        special(SPC_MOD)
+        promptgroup("54 - Output 24-31")
+        prompt("Bit 26")
+        pp(TRUE)
+    }
+    field(B1B, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 27")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("54 - Output 24-31")
+    }
+    field(B1C, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 28")
+        special(SPC_MOD)
+        interest(1)
+        promptgroup("54 - Output 24-31")
+    }
+    field(B1D, DBF_UCHAR) {
+        pp(TRUE)
+        prompt("Bit 29")
+        promptgroup("54 - Output 24-31")
+        interest(1)
+        special(SPC_MOD)
+    }
+    field(B1E, DBF_UCHAR) {
+        pp(TRUE)
+        interest(1)
+        promptgroup("54 - Output 24-31")
+        special(SPC_MOD)
+        prompt("Bit 30")
+    }
+    field(B1F, DBF_UCHAR) {
+        prompt("Bit 31")
+        interest(1)
+        promptgroup("54 - Output 24-31")
+        special(SPC_MOD)
+        pp(TRUE)
+    }
+}
+device(mbboDirect, CONSTANT, devMbboDirectSoft, "Soft Channel")
+device(mbboDirect, CONSTANT, devMbboDirectSoftRaw, "Raw Soft Channel")
+device(mbboDirect, CONSTANT, devMbboDirectSoftCallback, "Async Soft Channel")
+device(mbboDirect, INST_IO, asynMbboDirectUInt32Digital, "asynUInt32Digital")
+device(mbboDirect, INST_IO, devmbboDirectStream, "stream")
+driver(drvAsyn)
+driver(stream)
+link(calc, lnkCalcIf)
+link(const, lnkConstIf)
+registrar(arrInitialize)
+registrar(arrayTestRegister)
+registrar(syncInitialize)
+registrar(asynInterposeEosRegister)
+registrar(asynRegister)
+registrar(Keithley65xxEMRegistrar)
+registrar(Keithley2kDMM_mf40Registrar)
+registrar(aCalcMonitorMemRegister)
+registrar(drvAsynIPPortRegisterCommands)
+registrar(subAveRegister)
+registrar(rsrvRegistrar)
+registrar(tsInitialize)
+registrar(acalcTotalAllocatedMemoryRegister)
+registrar(dbndInitialize)
+registrar(Keithley2kDMMRegistrar)
+registrar(editSseqRegistrar)
+registrar(asynInterposeFlushRegister)
+registrar(drvAsynIPServerPortRegisterCommands)
+registrar(asSub)
+registrar(streamRegistrar)
+registrar(interpRegister)
+variable(sCalcStackHW, int)
+variable(dbRecordsOnceOnly, int)
+variable(dbQuietMacroWarnings, int)
+variable(streamDebug, int)
+variable(sseqRecDebug, int)
+variable(transformRecordDebug, int)
+variable(aCalcMonitorMem_debug, int)
+variable(dbTemplateMaxVars, int)
+variable(callbackParallelThreadsDefault, int)
+variable(aCalcoutRecordDebug, int)
+variable(sCalcPerformDebug, int)
+variable(atExitDebug, int)
+variable(interpDebug, int)
+variable(CASDEBUG, int)
+variable(dbBptNotMonotonic, int)
+variable(sCalcoutRecordDebug, int)
+variable(aCalcLoopMax, int)
+variable(sCalcPostfixDebug, int)
+variable(calcoutODLYprecision, int)
+variable(sCalcStackLW, int)
+variable(devsCalcoutSoftDebug, int)
+variable(aCalcPerformDebug, int)
+variable(sCalcLoopMax, int)
+variable(calcoutODLYlimit, double)
+variable(histogramSDELprecision, int)
+variable(seqDLYlimit, double)
+variable(arrayTestDebug, int)
+variable(aCalcPostfixDebug, int)
+variable(debugSubAve, int)
+variable(boHIGHprecision, int)
+variable(boHIGHlimit, double)
+variable(asCaDebug, int)
+variable(dbRecordsAbcSorted, int)
+variable(dbThreadRealtimeLock, int)
+variable(swaitRecordDebug, int)
+variable(aCalcAsyncThreshold, int)
+variable(seqDLYprecision, int)
+variable(dbConvertStrict, int)
+variable(devaCalcoutSoftDebug, int)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iocBoot/Makefile	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,6 @@
+TOP = ..
+include $(TOP)/configure/CONFIG
+DIRS += $(wildcard *ioc*)
+DIRS += $(wildcard as*)
+include $(CONFIG)/RULES_DIRS
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iocBoot/iocIOCINFRA/Makefile	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,5 @@
+TOP = ../..
+include $(TOP)/configure/CONFIG
+ARCH = $(EPICS_HOST_ARCH)
+TARGETS = envPaths
+include $(TOP)/configure/RULES.ioc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iocBoot/iocIOCINFRA/st.cmd	Thu Mar 07 09:23:26 2019 +0100
@@ -0,0 +1,91 @@
+#!../../bin/linux-x86_64/IOCINFRA
+
+#- You may have to change IOCINFRA to something else
+#- everywhere it appears in this file
+
+epicsEnvSet("ARCH","linux-x86_64")
+epicsEnvSet("IOC","IOCINFRA")
+epicsEnvSet("TOP","/epics/iocs/sys/infra")
+
+#iocStat stuff on softIOCs
+epicsEnvSet("ENGINEER","Heinz")
+epicsEnvSet("LOCATION","trARPES")
+epicsEnvSet("STARTUP","${TOP}")
+epicsEnvSet("ST_CMD","st.cmd")
+
+#not fully understood :-(
+epicsEnvSet ("EPICS_CAS_INTF_ADDR_LIST","172.24.192.27")
+
+< envPaths
+epicsEnvSet "STREAM_PROTOCOL_PATH" "$(TOP)/db"
+
+#used by autosave
+epicsEnvSet ("LOG_DIR", "/epics/iocs/log")
+
+cd "${TOP}"
+epicsEnvSet "XGS-600" "_trarpes_vac_xgs600_1"
+
+## Register all support components
+dbLoadDatabase "dbd/IOCINFRA.dbd"
+IOCINFRA_registerRecordDeviceDriver pdbbase
+
+## Load record instances
+#dbLoadRecords("db/xxx.db","user=epics")
+
+# Configure asyn communication port, first
+drvAsynIPPortConfigure(${XGS-600}, "172.24.192.29:4001", 0, 0, 0 )
+dbLoadTemplate("db/XGS600.substitutions")
+
+drvAsynIPPortConfigure("MOXA_2", "172.24.192.29:4002", 0, 0, 0)
+#asynSetTraceIOMask("MOXA_2", -1, 0x2)
+#asynSetTraceMask("MOXA_2", -1, 0x9)
+dbLoadTemplate("db/SATECO_lakeshore.substitution")
+
+drvAsynIPPortConfigure("MOXA_3", "172.24.192.29:4003", 0, 0, 0)
+#asynSetTraceIOMask("MOXA_3", 0, 0x5)
+#asynSetTraceMask("MOXA_3", 0, 0xB)
+dbLoadRecords("db/TPG26x.db", "P=trARPES:PIC_PRE:, IFPRESSUR1=, IFPRESSUR2=, PORT=MOXA_3")
+
+#drvAsynIPPortConfigure("MOXA_4", "172.24.192.29:4004", 0, 0, 0)
+#asynSetTraceIOMask("MOXA_4", 0, 0x2)
+#asynSetTraceMask("MOXA_4", 0, 0x9)
+#dbLoadRecords "db/devKeithley6487.db", "P=trARPES:, R=Sample:, PORT=MOXA_4, A=-1,NELM=1000")
+#dbLoadRecords("db/Keithley6485.db", "P=trARPES:, CA=Sample:, PORT=KeithleyIO")
+
+drvAsynIPPortConfigure("MOXA_4", "172.24.192.29:4004", 0, 0, 0)
+asynOctetSetInputEos("MOXA_4",0,"\n")
+asynOctetSetOutputEos("MOXA_4",0,"\n")
+drvAsynKeithley648x("6485", "Keithley6485", "MOXA_4",0)
+#asynSetTraceIOMask("MOXA_4", 0, 0x2)
+#asynSetTraceMask("MOXA_4", 0, 0x9)
+dbLoadRecords("db/Keithley6485.db", "P=trARPES:, CA=Sample:, PORT=Keithley6485")
+
+
+drvAsynIPPortConfigure("MOXA_5", "172.24.192.29:4005", 0, 0, 0)
+dbLoadRecords("db/TPG26x.db", "P=trARPES:LL:, IFPRESSUR1=, IFPRESSUR2=#, PORT=MOXA_5")
+
+drvAsynIPPortConfigure("MOXA_9", "172.24.192.29:4009", 0, 0, 0)
+dbLoadRecords("db/TPG26x.db", "P=trARPES:HHG:, IFPRESSUR1=, IFPRESSUR2=#, PORT=MOXA_9")
+
+drvAsynIPPortConfigure("MOXA_11", "172.24.192.29:4011", 0, 0, 0)
+#asynSetTraceIOMask("MOXA_11", -1, 0x2)
+#asynSetTraceMask("MOXA_11", -1, 0x9)
+dbLoadTemplate("db/Bronkhorst.substitution")
+
+dbLoadRecords "db/asynRecord.db", "P=trARPES,R=asyn,PORT=MOXA_4,ADDR=-1,OMAX=0,IMAX=0")
+
+cd "${TOP}/iocBoot/${IOC}"
+iocInit
+
+################################################# Create autosave monitor sets
+
+create_monitor_set("${IOC}_0.req", 5, "P=${IOC}:")
+create_monitor_set("${IOC}_1.req", 30, "P=${IOC}:")
+
+## Report Installed and Configured I/O-Hardware Information
+dbior 0 1 > ${LOG_DIR}/Database/${IOC}.dbior
+dbhcr     > ${LOG_DIR}/Database/${IOC}.dbhcr
+dbl       > ${LOG_DIR}/Database/${IOC}.dbl
+
+## Start any sequence programs
+#seq sncxxx,"user=epics"