239 lines
6.1 KiB
Plaintext
239 lines
6.1 KiB
Plaintext
# EPICS Database for streamdevice specific to measurement channels
|
|
#
|
|
# Macros
|
|
# INSTR - Prefix
|
|
# NAME - the device name, e.g. EL737
|
|
# PORT - StreamGenerator Port
|
|
|
|
record(longout, "$(INSTR)$(NAME):FULL-RESET")
|
|
{
|
|
field(DESC, "Reset the DAQ")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) RESET")
|
|
}
|
|
|
|
################################################################################
|
|
# Status Variables
|
|
|
|
record(stringin, "$(INSTR)$(NAME):MsgTxt")
|
|
{
|
|
field(DESC, "Unexpected received response")
|
|
}
|
|
|
|
# We separate the RAW-STATUS and the STATUS PV so that the state can be updated
|
|
# in a sequence, that guarantees that we included the most recent time and
|
|
# counts before the status switches back to Idle.
|
|
# We do this via a sequenced update
|
|
#
|
|
# RAW-STATUS -> ELAPSED-SECONDS -> M* -> STATUS
|
|
record(mbbi, "$(INSTR)$(NAME):RAW-STATUS")
|
|
{
|
|
field(DESC, "DAQ Status")
|
|
field(DTYP, "asynInt32")
|
|
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) STATUS")
|
|
field(ZRVL, "0")
|
|
field(ZRST, "Idle")
|
|
field(ONVL, "1")
|
|
field(ONST, "Counting")
|
|
field(TWVL, "2")
|
|
field(TWST, "Low rate")
|
|
field(THVL, "3")
|
|
field(THST, "Paused")
|
|
# 4 should never happen, if it does it means the DAQ reports undocumented statusbits
|
|
field(FRVL, "4")
|
|
field(FRST, "INVALID")
|
|
# This is probably too fast. We could trigger things the same as sinqDAQ to ensure the db is update in the same order
|
|
# field(SCAN, "I/O Intr")
|
|
field(SCAN, ".1 second")
|
|
field(FLNK, "$(INSTR)$(NAME):READALL")
|
|
field(PINI, "YES")
|
|
}
|
|
|
|
record(fanout, "$(INSTR)$(NAME):READALL")
|
|
{
|
|
field(SELM, "All")
|
|
field(LNK0, "$(INSTR)$(NAME):ELAPSED-TIME")
|
|
field(LNK1, "$(INSTR)$(NAME):M1")
|
|
field(LNK2, "$(INSTR)$(NAME):M2")
|
|
field(LNK3, "$(INSTR)$(NAME):M3")
|
|
field(LNK4, "$(INSTR)$(NAME):M4")
|
|
field(LNK5, "$(INSTR)$(NAME):M5")
|
|
# Doesn't seemt o be a problem to have more in here :D
|
|
# field(LNK6, "$(INSTR)$(NAME):M5")
|
|
# field(LNK7, "$(INSTR)$(NAME):M6")
|
|
field(FLNK, "$(INSTR)$(NAME):STATUS")
|
|
}
|
|
|
|
record(mbbi, "$(INSTR)$(NAME):STATUS")
|
|
{
|
|
field(INP, "$(INSTR)$(NAME):RAW-STATUS NPP")
|
|
field(DESC, "DAQ Status")
|
|
field(ZRVL, "0")
|
|
field(ZRST, "Idle")
|
|
field(ONVL, "1")
|
|
field(ONST, "Counting")
|
|
field(TWVL, "2")
|
|
field(TWST, "Low rate")
|
|
field(THVL, "3")
|
|
field(THST, "Paused")
|
|
# 4 should never happen, if it does it means the DAQ reports undocumented statusbits
|
|
field(FRVL, "4")
|
|
field(FRST, "INVALID")
|
|
field(PINI, "YES")
|
|
}
|
|
|
|
record(longin, "$(INSTR)$(NAME):CHANNELS")
|
|
{
|
|
field(DESC, "Total Supported Channels")
|
|
field(VAL, $(CHANNELS))
|
|
field(DISP, 1)
|
|
}
|
|
|
|
# Trigger a change in status as clearing
|
|
record(bo, "$(INSTR)$(NAME):ETT")
|
|
{
|
|
field(DESC, "Trigger Clearing Status")
|
|
field(VAL, 1)
|
|
field(OUT, "$(INSTR)$(NAME):ETS PP")
|
|
}
|
|
|
|
# Trigger a change in status as value returned to 0
|
|
record(seq, "$(INSTR)$(NAME):ETO")
|
|
{
|
|
field(DESC, "Trigger Returned to 0 Status")
|
|
field(LNK0, "$(INSTR)$(NAME):ETS PP")
|
|
field(DO0, 0)
|
|
field(SELM, "Specified")
|
|
field(SELL, "$(INSTR)$(NAME):ELAPSED-TIME.VAL")
|
|
field(SCAN, ".1 second")
|
|
}
|
|
|
|
# Current Status of Channel, i.e. is it ready to count?
|
|
record(bi, "$(INSTR)$(NAME):ETS")
|
|
{
|
|
field(DESC, "Channel Status")
|
|
field(VAL, 0)
|
|
field(ZNAM, "OK")
|
|
field(ONAM, "CLEARING")
|
|
field(PINI, 1)
|
|
}
|
|
|
|
################################################################################
|
|
# Count Commands
|
|
|
|
record(longout,"$(INSTR)$(NAME):PRESET-COUNT")
|
|
{
|
|
field(DESC, "Count until preset reached")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) P_CNT")
|
|
field(VAL, 0)
|
|
}
|
|
|
|
record(longout,"$(INSTR)$(NAME):PRESET-TIME")
|
|
{
|
|
field(DESC, "Count for specified time")
|
|
field(EGU, "seconds")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) P_TIME")
|
|
field(VAL, 0)
|
|
}
|
|
|
|
record(bo,"$(INSTR)$(NAME):PAUSE")
|
|
{
|
|
field(DESC, "Pause the current count")
|
|
field(VAL, "0")
|
|
}
|
|
|
|
record(bo,"$(INSTR)$(NAME):CONTINUE")
|
|
{
|
|
field(DESC, "Continue with a count that was paused")
|
|
field(VAL, "0")
|
|
}
|
|
|
|
record(longout, "$(INSTR)$(NAME):STOP")
|
|
{
|
|
field(DESC, "Stop the current counting operation")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) STOP")
|
|
}
|
|
|
|
record(longout, "$(INSTR)$(NAME):MONITOR-CHANNEL")
|
|
{
|
|
field(DESC, "PRESET-COUNT Monitors this channel")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) MONITOR")
|
|
field(DRVL, "1") # Smallest Monitor Channel
|
|
field(DRVH, "$(CHANNELS)") # Largest Monitor Channel
|
|
}
|
|
|
|
record(longin, "$(INSTR)$(NAME):MONITOR-CHANNEL_RBV")
|
|
{
|
|
field(DESC, "PRESET-COUNT Monitors this channel")
|
|
field(DTYP, "asynInt32")
|
|
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) MONITOR")
|
|
field(SCAN, ".2 second")
|
|
field(PINI, "YES")
|
|
}
|
|
|
|
record(ao,"$(INSTR)$(NAME):THRESHOLD")
|
|
{
|
|
field(DESC, "Minimum rate for counting to proceed")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH")
|
|
field(VAL, "1") # Default Rate
|
|
field(DRVL, "1") # Minimum Rate
|
|
field(DRVH, "100000") # Maximum Rate
|
|
}
|
|
|
|
record(ai,"$(INSTR)$(NAME):THRESHOLD_RBV")
|
|
{
|
|
field(DESC, "Minimum rate for counting to proceed")
|
|
field(EGU, "cts/sec")
|
|
field(DTYP, "asynInt32")
|
|
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH")
|
|
field(SCAN, "I/O Intr")
|
|
field(PINI, "YES")
|
|
}
|
|
|
|
record(longout,"$(INSTR)$(NAME):THRESHOLD-MONITOR")
|
|
{
|
|
field(DESC, "Channel monitored for minimum rate")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH_CH")
|
|
field(VAL, "1") # Monitor
|
|
field(DRVL, "0") # Smallest Threshold Channel (0 is off)
|
|
field(DRVH, "$(CHANNELS)") # Largest Threshold Channel
|
|
}
|
|
|
|
record(longin,"$(INSTR)$(NAME):THRESHOLD-MONITOR_RBV")
|
|
{
|
|
field(DESC, "Channel monitored for minimum rate")
|
|
field(EGU, "CH")
|
|
field(DTYP, "asynInt32")
|
|
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) THRESH_CH")
|
|
field(SCAN, "I/O Intr")
|
|
field(PINI, "YES")
|
|
}
|
|
|
|
record(longout, "$(INSTR)$(NAME):CT")
|
|
{
|
|
field(DESC, "Clear the timer")
|
|
field(DTYP, "asynInt32")
|
|
field(OUT, "@asyn($(PORT),0,$(TIMEOUT=1)) C_TIME")
|
|
field(FLNK, "$(INSTR)$(NAME):ETT")
|
|
}
|
|
|
|
################################################################################
|
|
# Read all monitors values
|
|
|
|
record(ai, "$(INSTR)$(NAME):ELAPSED-TIME")
|
|
{
|
|
field(DESC, "DAQ Measured Time")
|
|
field(EGU, "sec")
|
|
field(DTYP, "asynFloat64")
|
|
field(INP, "@asyn($(PORT),0,$(TIMEOUT=1)) TIME")
|
|
# field(SCAN, "I/O Intr")
|
|
field(PINI, "YES")
|
|
# field(FLNK, "$(INSTR)$(NAME):ETO")
|
|
}
|